是否可以使用vimgrep直观选择当前文件?

时间:2014-01-31 15:34:41

标签: search vim vimgrep

我想只在当前文件的视觉选择中搜索vimgrep而不是整个文件。这可能吗?怎么样?我无法通过Google或vim帮助找到适合此案例的内容。

我想要这个的原因是因为我需要快速列表(copen)和:g/FOO中的结果,它显示底部的匹配行没有完成这项工作。

3 个答案:

答案 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>