2011-12-16 5 views
12

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

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

(This is in parentheses) 

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

\left(This is in parentheses \right) 

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

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

+1

+1 Хорошая идея! Такая вещь всегда была бы полезна ... –

+0

Просьба уточнить, откуда появилась модификация? Является ли изменение всегда вопросом добавления «\ left» и «\ right» к разделителям? –

+0

Модификация исходит от LaTeX с тех пор, как '\ left' и' \ right' делают эти разделители масштабными до размера текста/математики, содержащихся в них (иногда я недостаточно осведомлен, чтобы понять, что они мне понадобятся). И да, модификация будет связана с добавлением '\ left' и' \ right' к разделителям. Однако, если есть способы сделать для них другие вещи (например, скобки или скобки для скобок), это тоже было бы неплохо. – qgp07

ответ

8

Оцените команду ниже в 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 в этой статье Parenthesis Matching.

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

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

+0

Это именно то, что я хотел! Работает как шарм. – qgp07

+0

Рад это слышать!Спасибо, что дал мне хороший вызов. –