Как вы можете изменить два подходящих разделителя одновременно с Emacs? - PullRequest
12 голосов
/ 16 декабря 2011

Хотя этот вопрос касается форматирования LaTeX в Emacs (и, возможно, Auctex), я считаю, что его можно применить к более общим ситуациям в Emacs, касающимся разделителей, таких как скобки, скобки и фигурные скобки.

Я надеюсь, что смогу сделать следующее с Emacs (и elisp), и не знаю, с чего начать. Скажи, что у меня есть:

(This is in parentheses)

С помощью некоторого связывания клавиш в Emacs я хочу, чтобы Emacs находил соответствующий разделитель в зависимости от того, какой из них находится у моего курсора (что я знаю, что Emacs может делать, поскольку он может выделять совпадающие разделители в различных режимах), и я могу изменить их оба

\left( This is in parentheses \right)

Разделителями, с которыми я хотел бы работать, являются: (...), [...], \lvert ... \rvert, \langle ... \rangle, \{ ... \}. Какой elisp мне понадобится для выполнения этой задачи?

Приветствуются более общие способы обработки соответствующих разделителей.

1 Ответ

8 голосов
/ 17 декабря 2011

Оцените команду ниже в Emacs.После перезагрузки вы можете поставить точку (текстовый курсор) сразу после закрытия парен.Затем выполните M-x replace-matching-parens, чтобы заменить закрывающий ) на \right) и соответствующий начальный индекс ( на \left(.

(defun replace-matching-parens ()
  (interactive)
  (save-excursion
    (let ((end-point (point)))
      (backward-list)
      (let ((start-point (point)))
        (goto-char end-point)
        (re-search-backward ")" nil t)
        (replace-match " \\\\right)" nil nil)

        (goto-char start-point)
        (re-search-forward "(" nil t)
        (replace-match "\\\\left( " nil nil)))))

Бит interactive указывает, что я хочу командуmsgstr ", поэтому его можно выполнить с помощью M-x.Чтобы курсор не оказался в незнакомом месте после выполнения, я оборачиваю логику в save-excursion.Точка переходит обратно к открывающему парену, используя backward-list, и удерживает начальную и конечную позиции области, подобранной пареном.Наконец, начиная с конца и работая в обратном направлении, я заменяю струны.При замене назад, а не вперед, я избегаю аннулирования end-point до того, как оно мне понадобится.

Обобщение этого для обработки различных типов разделителей не должно быть слишком плохим.backward-list должен работать с любой парой строк, которые emacs распознает как аналоги ( и ).Чтобы добавить дополнительные пары строк в виде скобок, ознакомьтесь с set-syntax-table в этой статье Соответствие скобок .

Используйте global-set-key для установки привязки ключа к replace-matching-parens.

Справедливое предупреждение : replace-matching-parens - первая реализованная мной команда elisp, поэтому она может не соответствовать рекомендациям.Для всех гуру я открыт для конструктивной критики.

...