Подтвердить что ты не робот

Как вы можете сразу изменить два соответствующих разделителя Emacs?

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

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

(This is in parentheses)

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

\left( This is in parentheses \right)

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

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

4b9b3361

Ответ 1

Оцените команду ниже в 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 указывает, что я хочу "команду", поэтому его можно выполнить с помощью M-x. Чтобы избежать перевода курсора в странное место после выполнения, я завершаю логику в save-excursion. Точка возвращается к открытому паре с помощью backward-list и удерживается в начальном и конечном положениях парно-совпадающей области. Наконец, начиная с конца и работая назад, я заменяю строки. Вместо замены назад, а не вперед я избегаю недействительности end-point, прежде чем он понадобится.

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

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

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