在 vim 中执行非正则表达式搜索/替换

在 vim 中进行搜索/替换时,我几乎从来不需要使用正则表达式,因此不断地转义所有内容是一件痛苦的事情。有没有办法让它默认不使用正则表达式,或者有没有其他命令来实现这一点?

例如,如果我想用 &lt;替换 <,我希望只能键入 s/</&lt;/g而不是 s/\</\&lt\;/g

17239 次浏览

尝试编辑查找并在菜单栏上替换。

你启用魔法了吗?

:set magic

使用这个选项:

set nomagic

参见 :help /magic

这个问题主要是由于混淆了 &在替换字符串中的作用。替换字符串是 没有 a reg-ex,尽管它有一些特殊字符,如 &。您可以在这里阅读关于 &在替换字符串中的作用: :h sub-replace-special

我怀疑 OP 的主要问题不一定是键入额外的反斜杠,而是记住什么时候需要反斜杠,什么时候不需要。一个变通方法可能是在不确定时开始使用“替换表达式”。(见 :h sub-replace-expression)这需要在替换字符串中放入一个‘ =’,但是对于某些人来说,它可以让您更自然地控制被替换的字符串,因为在单引号中放入一个字符串文字将给您所需的替换字符串。例如,这个替代品可以完成 OP 想要的任务:

:s/</\='&lt;'/g

如果要逐字搜索,可以使用 \V正则表达式原子。除了需要转义反斜杠之外,这几乎可以实现您想要的效果。您可以定义您自己的搜索命令,这将逐字逐句地搜索。就像这样:

 :com! -nargs=1 Search :let @/='\V'.escape(<q-args>, '\/')| normal! n

然后使用: Search/foobar/baz

然后,您可以在一个: Search 命令之后简单地使用

:%s//replace/g

因此 Vim 会隐式地提取最后一个搜索项并使用 for 替换。

(只是想给你一些想法)

对于 :s命令,有一个禁用或强制魔法的快捷方式。要关闭魔法,使用 :sno如下:

:sno/search_string/replace_string/g

在这里发现: http://vim.wikia.com/wiki/Simplifying_regular_expressions_using_magic_and_no-magic

以下是在命令模式下禁用正则表达式搜索/替换的方法:

autocmd CmdWinEnter * set nomagic
autocmd CmdWinLeave * set magic

所有依赖于正则表达式的插件(如空格删除器)都应该像往常一样工作。