Grep word under cursor

Grep word under cursor

Version 1 #

:nnoremap <leader>g :grep -R <cWORD> .<cr>

存在的问题:如果文件中有"foo;ls"这样的字符串,导致shell去执行ls命令。

Version 2, Literal Strings #

:nnoremap <leader>g :grep -R '<cWORD>' .<cr>

存在的问题:如果原文中有"that’s",单引号会太妨碍grep的执行。

Version 3, use shellescape #

:nnoremap <leader>g :execute "grep -R " . shellescape("<cWORD>") . " ."<cr>

存在问题:依旧不能处理"that’s",究其原因,shellescape会在扩展"<cWORD>“之前执行:

:echom shellescape("<cWORD>")

结果会是:’<cWORD>' 没有特殊字符时,命令可以正确执行,此时shellescape的调用完全是多余的,最终的’<cWORD>‘依旧由execute来扩展。

Version 4, use expand #

:nnoremap <leader>g :execute "grep -R " . shellescape(expand("<cWORD>")) . " ."<cr>

存在的问题:命令执行后会自动跳转到第一个结果上。 Vim会显示grep的输出。

Version 5, use grep! and silent #

:nnoremap <leader>g :silent execute "grep! -R " . shellescape(expand("<cWORD>")) . " ."<cr>:copen<cr>

执行后不显示grep命令的输出,也不会自动跳到第一个结果,而是打开quickfix window,让你选择跳转的目标。

:help c_ctrl-u
:help operatorfunc
:help map-operator
:help visualmode()