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

75
在vim中进行搜索/替换时,我几乎从不需要使用正则表达式,所以经常需要转义所有内容很麻烦。是否有一种方法可以使其默认不使用正则表达式,或者有另一种命令可以实现此功能?
例如,如果我想将<代码><替换为&lt;,我希望只需键入s/</&lt;/g而不是s/\</\&lt\;/g

2
你本来不应该转义 <。除此之外,我认为没有任何方法可以让 & 直接生效。 - Tomalak
你应该考虑接受bjunix的答案。被接受的答案实际上并没有回答问题,更像是一种批评而不是答案。 - Kellen Stuart
@KolobCanyon 谢谢,我已经做了。 - Mike Crittenden
7个回答

113

9
关闭魔法仍然赋予“$”和“\”字符特殊含义。 - gbr
2
我觉得在VIM中缺省使用正则表达式很奇怪。通常进行搜索和替换都不需要用到正则表达式。因此,我最终使用Ctrl+ Shift + H 进行操作。我想这也是我需要提高正则表达式技能的另一个原因。 - Kellen Stuart
1
@ma11hew28 是“在路径中替换”的快捷方式... 抱歉,这是 Rider IDE 的快捷方式,不是 VIM 的快捷方式。 - Kellen Stuart
3
@gbr,你可以使用\V命令来使"$"符号变为普通字符:http://vimdoc.sourceforge.net/htmldoc/pattern.html#/magic - drevicko
1
@bjunix,你的回答有误导性,似乎暗示用非正则表达式模式替换:s的方法是:%sno,而实际上只需使用:sno即可。%表示将在整个文件范围内进行替换操作。请考虑删除%并更新您的回答。 - Atralb
显示剩余4条评论

23

使用此选项:

set nomagic

请参阅:help /magic


2
在这种特定情况下并没有帮助。但是可能在一般情况下有所帮助。+1 - Tomalak
2
@Tomalak -- 不确定你为什么说这在这种情况下没有帮助。对我来说,将其设置为“_nomagic_”似乎很好用。然后发出命令 :s/</&lt;/g,它就能按预期工作了。我认为这不是一个很好的解决方案,因为通常情况下你想要开启魔术模式,但它确实有效。 - Herbert Sitz
@Herbert 我已经尝试使用\M开关,它应该与nomagic相同(但是在每个正则表达式的基础上),但显然nomagic会改变替换中&的行为,而\M不会。这也是我认为让&成为文字很困难的原因。 - Tomalak
@Tomalak -- 不确定,问题可能是替换命令的替换部分 不是 模式(即不是正则表达式),而只是一个带有一些特殊字符的字符串,因此预先设置的魔术/非魔术标志在其中不起作用。(尽管通过 set 命令设置魔术/非魔术标志可以,参见 :h sub-replace-string。) - Herbert Sitz
2
关闭魔术模式仍然会给“$”和“\”字符留下特殊含义。 - gbr

16
问题主要是由于混淆了替换字符串中的 & 的作用所致。虽然替换字符串中包含一些特殊字符,如 &,但它并不是一个正则表达式。你可以在这里阅读有关替换字符串中 & 的作用的信息::h sub-replace-special
我怀疑针对 OP 的主要问题不仅仅是输入额外的反斜杠,而是记住何时需要反斜杠和何时不需要。一种解决方法可能是在不确定的情况下开始使用“替换表达式”(replacement expressions)。(请参见:h sub-replace-expression)这需要在替换字符串中放置`\=',但对于一些人来说,这样做可以更自然地控制被替换的内容,因为将字符串文字放入单引号中将会给出你想要的替换字符串。例如,以下替换实现了 OP 想要的效果:
:s/</\='&lt;'/g

更好的纯文本搜索/替换答案如下。使用:sno而不是:s可以禁用正则表达式。 - Vitali
“输入额外的反斜杠”?你有没有使用过复制和粘贴?当你想要搜索剪贴板中的文本时,必须转义其字符是一个很大的烦恼!是的,你可以输入一些奇怪的转义命令,但这是荒谬的,你不应该为了这个基本功能而费尽心思!!我喜欢正则表达式,但有时它们并不是正确的解决方案! - gbr

3

如果您想要进行文字字面查找,可以使用\V正则表达式原子。这个几乎做到了你想要的,除了你还需要转义反斜杠。您可以定义自己的搜索命令来进行文字字面查找。例如:

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

然后使用:搜索/ foobar / baz

对于替换,您可以在:搜索命令之后简单地使用

:%s//replace/g

自那时起,Vim会隐式地选择上次搜索的项目并用于替换。(只是想给你一些想法)

太好了,谢谢!这是唯一一个能帮助替换任何文本的答案,包括dos路径和反斜杠。我简直不敢相信vim还没有纯文本搜索功能,怎么可能假装你要在开始进行替换之前转义所有反斜杠(或手动执行某些奇怪的命令)?大多数情况下,手动替换每个出现的地方所需的时间都比较短!!!我喜欢正则表达式,只是有时候你必须避免使用它们! - gbr
最好提到,替换文本也会解释某些字符,所以大多数人可能会想使用建议中的:%s//\='replace'/g,同时,大多数时候您可能还想添加'c'标志 - :%s//\='replace'/gc - gbr

0

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

autocmd CmdWinEnter * set nomagic
autocmd CmdWinLeave * set magic

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


-1

你启用了魔法吗?

:set magic

-4

尝试在菜单栏上使用编辑查找和替换功能。


该命令只使用“\V”开关,这会使反斜杠需要转义。 - gbr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接