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,让你选择跳转的目标。
Links #
:help c_ctrl-u
:help operatorfunc
:help map-operator
:help visualmode()