虽然这个问题涉及Emacs(也许是Auctex)中LaTeX的格式,但我相信这可以应用于Emacs中有关括号,括号和括号等分隔符的更一般情况.
我希望能够使用Emacs(和elisp)执行以下操作,并且不知道从哪里开始.说我有:
(This is in parentheses)
Run Code Online (Sandbox Code Playgroud)
通过Emacs中的一些键绑定,我希望Emacs能够找到匹配的分隔符到我的光标(我知道Emacs可以做的事情,因为它可以在各种模式下突出显示匹配的分隔符),并且能够将它们都改为
\left( This is in parentheses \right)
Run Code Online (Sandbox Code Playgroud)
我想这跟工作的分隔符是:(...),[...],\lvert ... \rvert,\langle ... \rangle,\{ ... \}.我需要做什么才能完成这项任务?
欢迎使用更一般的方法来处理匹配的分隔符.
在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)))))
Run Code Online (Sandbox Code Playgroud)
该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命令,因此可能与最佳实践不一致.对于那里的所有大师,我愿意接受建设性的批评.