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

时间:2011-06-06 16:05:14

标签: regex vim replace

在vim中进行搜索/替换时,我几乎从不需要使用正则表达式,因此不断地逃避一切是很痛苦的,有没有办法让它默认不使用正则表达式,或者是否有替代命令来实现这一点?

例如,如果我想将<替换为&lt;,我希望能够输入s/</&lt;/g而不是s/\</\&lt\;/g

7 个答案:

答案 0 :(得分:76)

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

:%sno/search_string/replace_string/g

在此处找到:http://vim.wikia.com/wiki/Simplifying_regular_expressions_using_magic_and_no-magic

答案 1 :(得分:15)

问题主要是由于&在替换字符串中的作用混淆而引起的。替换字符串不是一个注册表,虽然它有一些特殊字符,如&。您可以在此处阅读&在替换字符串中的角色::h sub-replace-special

我怀疑OP的主要问题不一定是输入额外的反斜杠,而是记住何时需要反斜杠,何时不需要反斜杠。一种解决方法可能是在不确定时开始使用“替换表达式”。 (参见:h sub-replace-expression。)这需要在替换字符串中加上一个'\ =',但对于某些人来说,它可以让你更自然地控制被替换的字符串,因为将字符串文字放在单引号中会给你替换字符串你要。例如,这个替代品符合OP的要求:

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

答案 2 :(得分:12)

使用此选项:

set nomagic

请参阅:help /magic

答案 3 :(得分:3)

如果您想按字面搜索,可以使用\V正则表达式原子。除了你还需要逃避反斜杠之外,这几乎可以达到你想要的效果。您可以定义自己的搜索命令,从字面上进行搜索。像这样:

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

然后使用:搜索/ foobar / baz

对于替补,你可以在a:搜索命令之后使用

:%s//replace/g

从那时起,Vim会隐式拿起最后一个搜索项并使用替换。

(只是想给你一些想法)

答案 4 :(得分:0)

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

autocmd CmdWinEnter * set nomagic
autocmd CmdWinLeave * set magic

所有依赖于正则表达式的插件,如空白去除器,都应该照常工作。

答案 5 :(得分:-1)

你启用了魔法吗?

:set magic

答案 6 :(得分:-5)

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