如何在Vim脚本中避免搜索模式或正则表达式?

10

我正在使用vimscript编写一个vim插件,我需要使用以下命令在另一个文件中搜索光标下的单词:

exec 'vimgrep /' . expand('<cword>') . '/g filename'

我需要确保搜索模式中没有正则表达式或斜杠。

如何转义这些字符?

2个回答

13

如果你以\V开始正则表达式,它会变成"非魔法"模式;也就是说,只有以反斜杠开头的原子才是特殊的。正是这个反斜杠经过了escape()的转义。另外,由于这个正则表达式是由/.../分隔的,所以正斜杠也必须进行转义。

exec 'vimgrep /\V' . escape(expand('<cword>'), '/\') . '/g filename'

如果您想使搜索对大小写敏感而不考虑 'ignorecase' 设置,请添加 \C 原子: /\V\C...

PS: 如果 filename 可能包含特殊字符(例如 %),您也应该对其进行 fnameescape() 处理。


3

\V在能够使用的情况下是理想的。但在某些情况下,您可能希望转义字符串,然后将其包含在使用魔术字符的正则表达式中。

在这种情况下(1),我一直在使用这样的函数:

function! EscapeForVimRegexp(str)
  return escape(a:str, '^$.*?/\[]~')
endfunction

我不确定它是否已经逃逸了所有需要的内容,请让我知道如果您发现任何失败的示例!

请注意,如果您的正则表达式将被 GNU grep 使用,而不是作为 Vim 的正则表达式,则可能需要转义一些不同的内容:

function! EscapeForGNURegexp(str)
  return escape(a:str, '^$.*?/\[]()' . '"' . "'")
endfunction

" Example usage
command! FndFunc exec 'grep "\<' . EscapeForGNURegexp(expand('<cword>')) . '(" . -r' | cope

我相信在EscapeForVimRegexp()中,你也需要转义波浪线~。 - jpavel

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