5

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

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

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

我怎样才能逃脱那些字符?

4

2 回答 2

9

正则表达式以 开头\V,它变成了“非常游手好闲”的模式;即只有以反斜杠开头的原子是特殊的。正是这个反斜杠然后通过escape(). 而且,由于此正则表达式由 分隔/.../,因此也必须转义正斜杠。

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

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

PS:如果filename可以包含特殊字符(如%),你也应该fnameescape()它。

于 2012-07-03T13:13:03.580 回答
0

\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
于 2020-04-30T06:54:03.650 回答