虽然这个问题与Emacs(也许是Auctex)中的LaTeX格式有关,但我相信这可以应用于Emacs中有关括号,括号和括号等分隔符的更一般情况。
我希望能够使用Emacs(和elisp)执行以下操作,并且不知道从哪里开始。说我有:
(This is in parentheses)
在Emacs中有一些键绑定,我希望Emacs能够找到匹配的分隔符到我的光标(我知道Emacs可以做的事情,因为它可以在各种模式下突出显示匹配的分隔符)并且能够将它们都改为
\left( This is in parentheses \right)
我希望与之合作的分隔符为:(...)
,[...]
,\lvert ... \rvert
,\langle ... \rangle
,\{ ... \}
。我需要做什么才能完成这项任务?
欢迎使用更常用的方法来处理匹配的分隔符。
答案 0 :(得分:8)
在Emacs中评估以下命令。重新加载后,您可以在关闭后立即放置点(文本光标)。然后执行M-x replace-matching-parens
将结束)
替换为\right)
,将匹配的开始paren (
替换为\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会识别为(
和)
的类似物。要添加更多类似括号的字符串对,请查看此Parenthesis Matching文章中的set-syntax-table
。
使用global-set-key
设置与replace-matching-parens
绑定的密钥。
公平警告:replace-matching-parens
是我实施的第一个elisp命令,因此可能与最佳做法不一致。对于那里的所有大师,我愿意接受建设性的批评。