Поиск с интеллектуальным подсчетом скоб (Elisp) - PullRequest
1 голос
/ 29 июня 2009

У меня есть следующая функция, которая удаляет команду LaTeX, окружающую текущую позицию курсора:

(defun remove-tex-cmd ()
  (interactive)
  (save-excursion
    (let (cur-point beg-point end-point)
      (setq cur-point (point))
      (catch 'notexcmd
        (if (not (re-search-backward "\\.*?{" nil t)) ; now the point is at the {
            (throw 'notexcmd nil))
        (search-backward "\\" nil t)
        (setq beg-point (point))
        (re-search-forward "}")
        (setq end-point (point))
        (if (> end-point cur-point)
            (kill-region beg-point end-point))
        (throw 'notexcmd nil)))
    (if 'notexcmd
        (message "no tex command at point"))))

Работает хорошо, за исключением следующей ситуации, потому что просто соответствует следующему закрытию }:

\test{a<cursor here>sdf ${bla}+1$}

результаты в

+1$}

Я мог бы, конечно, сосчитать открывающие и закрывающие скобки. Однако, поскольку эта проблема возникает часто, мне интересно, существует ли какая-то более интеллектуальная функция поиска или я упускаю совершенно другую точку?

1 Ответ

2 голосов
/ 29 июня 2009

Использовать операции на основе списка или пола:

(defun remove-tex-cmd ()
  (interactive)
  (backward-up-list 1)
  (backward-sexp 1)
  (kill-sexp 2))

Чтобы обработать ошибку сканирования при отсутствии скобок:

(defun remove-tex-cmd ()
  (interactive)
  (condition-case nil
      (progn
        (backward-up-list 1)
        (backward-sexp 1)
        (kill-sexp 2))
    (scan-error (message "Outside parentheses."))))
...