如何列出Vim搜索的匹配项?


101

当我点击时,我想列出比赛:

/example

这样我就可以一次看到所有比赛的位置。

Answers:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
我非常喜欢您的F5-F8创意。可以在此处看到这些命令的一些可视化效果/输出结果。F8如何设计工作?它仅搜索当前目录?--dir的省略是自定义-为什么node_modules?--perl正则表达式如何更改Vim的默认功能?- -下面是如何我设计我的搜索.tex文件里askubuntu.com/a/789769/25388这将是很好的向你学习如何改进它。它不是那么直观,所以我也经常忘记自己的逻辑。
莱奥波德·赫兹(LéoLéopoldHertz),2017年

如果要开发前端,node_modules是包含来自npm模块的许多js代码的目录...这只是一个示例...
Yordan Georgiev

1
做一个.vimrc的备份并添加这些设置,用:so%加载它们,然后尝试在命令中运行“帮助” ... vim很难-您将不得不重复数千次,但是一旦掌握它们,你会笑@everyone谁指向自己gread新的用户界面IDE功能...
约尔丹Georgiev的

226
:g//p

以较长的形式:

:global/regular-expression/print

您可以省略模式/正则表达式,Vim将重新使用上一个搜索词。

花絮:grep的工具是这个命令序列命名。


18
:g//-由于p(rint)是默认操作,因此您也可以忽略该操作。
dekeguard

6
:g/更短!
Sparhawk

2
是否可以像grep一样在这里查看上下文--context 9
维塔利·兹达涅维奇

@VitalyZdanevich尝试:%s/regular-expression//gn 它将产生以下内容:X matches on Y lines
Alexej Magura,

@AlexejMagura我的意思是-如何看到字符串前后的几行?
维塔利·兹达涅维奇

50

您也可以执行以下操作:

g/pattern/#

这将打印所需的图案和行号。


2
好一个。但是,如果您已启用行号,则#不需要。默认情况下,它显示行号
Pavan Manjunath

44

如果您想查看此列表并在比赛之间快速跳转,请考虑使用

:vimgrep example %

要么

:grep example %

这将填充“错误清单”所有的比赛,这样就可以使用:copen它们全部列出在quickfix缓冲区,按特定线路上的输入跳转到该比赛,还是喜欢使用命令:cn:cp去来回。

有关详细说明,请参阅我对类似问题的答复


这使得E499: Empty file name for '%' or '#', only works with ":p:h"上的MacVim 8.1
林肯Bergeson

35

刚学了一个新的:Location List
键入:lvim foo %foo在当前文件中进行搜索,然后将所有包含foo的匹配项输入到位置列表中
键入:lopen以在快速修复窗口中打开位置列表,该窗口通常可以完全导航。
使用:lnext/ :lprevious来遍历列表(使用tpope /未配对映射以获得最佳体验)


2
不错的提示!这导致我进行以下映射,该映射会自动扩展光标下的单词并一次扫过lopen:nnoremap <leader> f:lvim / <cr> = expand(“ <cword>”)<cr> /%<cr>: LOPEN <CR>
Jörgen的

16

另一种可能性是使用包含文件搜索命令。

[I

这将列出该光标下所有出现的单词。但是,它可能超出了您的需要,因为它还会搜索当前文件中包含的所有文件。

但是,此命令的好处是,除了每个匹配项的行号之外,搜索结果显示还显示了匹配数的计数。

:help include-search

看到很多变体。

关于的注释

:g//p

这可以进一步减少到

:g//

正如其他人所说,因为p(rint)是默认操作。


是否有可能从[I上下文获得结果,例如在grep上--context 9
维塔利·兹达涅维奇

10

您可以quickfix在当前搜索模式中找到一个带有匹配项的漂亮窗口

:vim // %
:copen

超级方便,如果您以前仅使用 /pattern

编辑:刚刚发现这也适用于所有打开的缓冲区

:bufdo vimgrepadd // %
:copen

10

使用:set hlsearch将以黄色突出显示所有匹配项,使您可以轻松扫描文件以查找匹配项。但是,搜索之后,:g // p可能并不是您想要的,列出的匹配项将给您。


2
应该是':set hlsearch'而不是':hlsearch'。
太多的php

:nohl当您不再需要突出显示时,也可以进行映射以清除突出显示。
科斯

9

详细说明...而不是

/example
:g//p

你也可以直接写

:g/example/p

或者,由于p(rint)是:g(lobal)命令的默认操作,因此可以缩短为

:g/example

除了p(rint),其他动作也是可能的,例如d(elete)。参见:help:global



0

我为此编写了一段代码。它实际上避免了的问题vimgrep。它甚至适用于未命名的文件。而且更容易使用。

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

当您使用模式调用它时,它将打开包含所有匹配项的位置窗口。

这可能是一个命令

command! -nargs=1 Mat call Matches(<f-args>)

所以您要做的就是输入 :Mat pattern

我还使用以下映射来获取当前视觉选择的匹配项。

vnoremap Y "xy:call Matches(@x)<CR>

-1

Ctrl-f列出所有搜索结果:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.