我只想在当前文件的视觉选择中而不是整个文件中使用 vimgrep 进行搜索。这可能吗?怎么做?我在谷歌或 vim 帮助中找不到适合这种情况的东西。
我想要这个的原因是因为我需要快速列表 ( copen
) 中的结果,并且:g/FOO
在底部显示匹配行并没有做这项工作。
是的,你可以,因为 Vim 有用于标记位置的特殊正则表达式原子,并且视觉选择的开始和结束由'<
和标记'>
。由于标记上/之前/之后有原子,我们需要将它们组合起来以覆盖所选行的整个范围:
在选择开始|
之后和选择结束之前的选择开始|
。
为了将搜索限制在当前文件,使用了特殊%
关键字。
:vimgrep/\%(\%'<\|\%>'<\%<'>\|\%'>\)FOO/ %
使用:g
命令,您走在正确的道路上。基本思想是做这样的事情:
:g/FOO/caddexpr expand("%") . ":" . line(".") . ":" . getline(".")
现在让我们把它变成一个命令
command! -range -nargs=+ VisualSeach cgetexpr []|<line1>,<line2>g/<args>/caddexpr expand("%") . ":" . line(".") . ":" . getline(".")
现在您可以执行此操作:VisualSearch FOO
,它会将搜索添加到quickfix
列表中。
请注意,此问题仅在每行中找到一个匹配项。
这是来自 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>