如何使用Emacs一次修改两个匹配的分隔符?

时间:2011-12-16 18:44:19

标签: emacs elisp tex

虽然这个问题与Emacs(也许是Auctex)中的LaTeX格式有关,但我相信这可以应用于Emacs中有关括号,括号和括号等分隔符的更一般情况。

我希望能够使用Emacs(和elisp)执行以下操作,并且不知道从哪里开始。说我有:

(This is in parentheses)

在Emacs中有一些键绑定,我希望Emacs能够找到匹配的分隔符到我的光标(我知道Emacs可以做的事情,因为它可以在各种模式下突出显示匹配的分隔符)并且能够将它们都改为

\left( This is in parentheses \right)

我希望与之合作的分隔符为:(...)[...]\lvert ... \rvert\langle ... \rangle\{ ... \}。我需要做什么才能完成这项任务?

欢迎使用更常用的方法来处理匹配的分隔符。

1 个答案:

答案 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命令,因此可能与最佳做法不一致。对于那里的所有大师,我愿意接受建设性的批评。