我想只在当前文件的视觉选择中搜索vimgrep而不是整个文件。这可能吗?怎么样?我无法通过Google或vim帮助找到适合此案例的内容。
我想要这个的原因是因为我需要快速列表(copen
)和:g/FOO
中的结果,它显示底部的匹配行没有完成这项工作。
答案 0 :(得分:5)
是的,你可以,因为Vim有标记位置的特殊正则表达式 atoms ,视觉选择的开始和结束由'<
和'>
标记。由于标记上/之前/之后有原子,我们需要将这些原子组合起来覆盖整个选定线的范围:
在选择开始之后和选择结束时选择结束|
之前选择开始|
。
要将搜索范围限制为当前文件,请使用特殊的%
关键字。
:vimgrep/\%(\%'<\|\%>'<\%<'>\|\%'>\)FOO/ %
答案 1 :(得分:4)
使用:g
命令,您正走在正确的道路上。基本的想法是做这样的事情:
:g/FOO/caddexpr expand("%") . ":" . line(".") . ":" . getline(".")
现在让它成为一个命令
command! -range -nargs=+ VisualSeach cgetexpr []|<line1>,<line2>g/<args>/caddexpr expand("%") . ":" . line(".") . ":" . getline(".")
现在您可以执行:VisualSearch FOO
并将搜索添加到quickfix
列表。
请注意,这个问题只发现每行一个匹配。
答案 2 :(得分:2)
这是来自Steve Losh的vimrc。它使*
适用于视觉选择。我非常依赖它。
" Visual Mode */# from Scrooloose {{{
function! s:VSetSearch()
let temp = @@
norm! gvy
let @/ = '\V' . substitute(escape(@@, '\'), '\n', '\\n', 'g')
let @@ = temp
endfunction
vnoremap * :<C-u>call <SID>VSetSearch()<CR>//<CR><c-o>
vnoremap # :<C-u>call <SID>VSetSearch()<CR>??<CR><c-o>