5

我只想在当前文件的视觉选择中而不是整个文件中使用 vimgrep 进行搜索。这可能吗?怎么做?我在谷歌或 vim 帮助中找不到适合这种情况的东西。

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

4

3 回答 3

5

是的,你可以,因为 Vim 有用于标记位置的特殊正则表达式原子,并且视觉选择的开始和结束由'<和标记'>。由于标记上/之前/之后有原子,我们需要将它们组合起来以覆盖所选行的整个范围:

在选择开始|之后和选择结束之前的选择开始|

为了将搜索限制在当前文件,使用了特殊%关键字。

:vimgrep/\%(\%'<\|\%>'<\%<'>\|\%'>\)FOO/ %
于 2014-01-31T16:09:52.283 回答
4

使用:g命令,您走在正确的道路上。基本思想是做这样的事情:

:g/FOO/caddexpr expand("%") . ":" . line(".") .  ":" . getline(".")

现在让我们把它变成一个命令

command! -range -nargs=+ VisualSeach cgetexpr []|<line1>,<line2>g/<args>/caddexpr expand("%") . ":" . line(".") .  ":" . getline(".")

现在您可以执行此操作:VisualSearch FOO,它会将搜索添加到quickfix列表中。

请注意,此问题仅在每行中找到一个匹配项。

于 2014-01-31T18:21:52.497 回答
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>
于 2014-01-31T16:55:24.887 回答