我正在vimscript中编写一个vim插件,我需要使用以下命令在另一个文件中搜索当前光标下的单词:
exec 'vimgrep /' . expand('<cword>') . '/g filename'
我需要确保搜索模式中没有正则表达式或斜杠。
我怎样才能逃脱这些角色?
答案 0 :(得分:6)
使用\V
启动正则表达式,将其转换为“非常无害”模式;即只有以反斜杠开头的原子才是特殊的。确切地说,这个反斜杠然后通过escape()
进行转义。并且,由于此正则表达式由/.../
分隔,因此必须转义正斜杠。
exec 'vimgrep /\V' . escape(expand('<cword>'), '/\') . '/g filename'
如果您想使搜索区分大小写而不考虑'ignorecase'
设置,请添加\C
原子:/\V\C...
PS:如果filename
可以包含特殊字符(例如%
),那么您也应该fnameescape()
。
答案 1 :(得分: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