Emacs 有一个 Vim 模拟器模式,称为邪恶的。此模式具有搜索替换功能,其功能与突出显示区域并在其上运行 sed 基本相同。此功能的妙处在于,它会在执行命令之前实时显示您正在进行的更改的预览,这对于构建使用正则表达式的搜索替换命令非常有用。
我很弱,不想重新训练我的肌肉记忆来使用 Vim 键。有没有办法在普通 Emacs 中实现这种带有预览的类似 sed 的搜索和替换功能?
答案1
Emacsreplace-regexp
允许你使用正则表达式进行搜索和替换。我不知道有任何工具可以交互地预览替换,但有几种工具可以让你以交互方式构建用于搜索和替换的正则表达式:
Emacs 自带了re-builder
。M-x re-builder
它将打开一个小缓冲区,您可以在其中构建正则表达式。它将突出显示当前缓冲区中的所有匹配项,每个组都以独特的颜色显示。这里是一个很好的总结。
然后是重建者+它允许您使用您构建的正则表达式调用替换命令。但替换不是交互式的。
我知道的最后一个工具是正则表达式工具它为您提供了包含文本、正则表达式和匹配组的三缓冲区视图。
按照您的描述,这些工具并没有提供 Evil 的所有功能,但它们涵盖了我认为使用正则表达式搜索和替换最困难的部分。
如果您只想在缓冲区的某个区域上运行它,您可以使用它C-x n n
来缩小到选定区域(标记和点之间)或C-x n p
缩小到当前页面。然后C-x n w
再扩大到整个缓冲区。
答案2
看一眼安祖,这是在提出这个问题几个月后推出的。它可以在查询替换和查询替换正则表达式形式中执行文本的交互式突出显示和替换。
在我的 .emacs 中,我以前邪恶用户的身份使用 anzu 等效函数覆盖了默认的替换函数:
(global-set-key (kbd "M-%") 'anzu-query-replace)
(global-set-key (kbd "C-M-%") 'anzu-query-replace-regexp)
答案3
它与 sed 并不完全相同,但C-M-%for允许您输入要搜索的正则表达式和替换文本。界面与更知名的orquery-replace-regexp
相同,后者搜索纯文本字符串。M-%query-replace
您不能将搜索和替换限制在与特定模式匹配的行上,但您可以解决这个问题。例如,/foo/s/bar/baz/
可以通过搜索\(foo.*\)bar
和替换来模拟 sed 表达式\1baz
(假设这bar
总是出现foo
在任何感兴趣的行之后)。