2013-04-09 233 views
2

使用记事本++搜索字符串时,将打开新窗口并显示查找 结果。我想在vim中使用这个功能。谷歌搜索后,我发现了一些建议:如何在vim中显示搜索的所有结果

vimgrep /<pattern>/ % 
copen 

这是可能的创建映射,执行这两个命令。模式应该是当前的词语:可能是vim中的cword关键字?

+0

请注意,如果您执行'vimgrep ...%',它可能无法在unamed缓冲区上工作。 – Kent 2013-04-09 15:40:42

回答

3

要求实际上是很容易。但要获得用户输入模式,您需要一个功能。

function! FindAll() 
    call inputsave() 
    let p = input('Enter pattern:') 
    call inputrestore() 
    execute 'vimgrep "'.p.'" % |copen' 
endfunction 

,如果你想有一个映射,加入这一行:

nnoremap <F8> :call FindAll()<cr> 

但我你的问题下评论。 %可能不适用于未知的缓冲区。

+0

非常感谢。我可以使用鼠标浏览搜索结果吗?即点击 |浏览搜索结果。 – 2013-04-09 15:54:11

+1

@VardanHovhannisyan为鼠标操作..我不知道,我很少使用鼠标时,我与vim。但是当我有时间时我可以检查你。对于光标下的单词。在命令行中按''会给你..实际上sehe在他的回答中有这个。 – Kent 2013-04-09 16:17:19

+0

@VardanHovhannisyan双击quickfix窗口中的条目将跳转到此处。我在''.vimrc'中设置了鼠标= a' – Kent 2013-04-09 20:12:10

2

我建议lvimgrep(这样你就可以使用的quickfix:让)

:nnoremap <F6> :lvimgrep /\M\<<C-R><C-W>\m\>/ **/*.[ch]pp **/Makefile | lopen<CR> 

此外,如果你只是想在当前文件中找到:

:g/<pattern>/ 

将调用“打印'(默认命令)在每个匹配行上。

:v//    " non-matching lines 
:g//-1    " lines preceding the matching line 
:g//-1,+1   " lines around the matching line 

:全球是更为有用:

:g/foo/ join  " join all lines containing foo 

+0

感谢您的帮助。我尝试了,但它给出了错误信息: 处理/home/student/.vimrc时发现错误: line 30: E488:尾随字符:lopen 2013-04-09 15:37:12

+0

我使用':number'(或':nu'简称)与':g'相结合,相当不错。 – 2013-04-09 16:41:29

+0

@PeterRincker我选择的武器会更短:':g //#' – sehe 2013-04-09 17:48:50

1

这两个命令可以缩短和链接::vim foo %|co。你可以像这样在光标下面拉字::vim <C-r><C-w> %|co

这里是一个快速正常模式映射,您可以使用列出的单词的所有出现在quickfix窗口的光标下:

nnoremap <F6> :vimgrep /<C-r><C-w>/j % <bar> cwindow<cr> 

您还可以使用:il[ist] foo显示列表在foo[I的所有匹配项中,为您的光标下的单词显示相同的列表。

当列表显示时,使用:{line number}跳转到相应的行。