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

时间:2009-02-04 00:57:38

标签: search vim

当我点击时,我想列出匹配项:

/example

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

12 个答案:

答案 0 :(得分:206)

:g//p

以较长的形式:

:global/regular-expression/print

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

琐事: grep工具是以此命令序列命名的。

答案 1 :(得分:48)

你也可以这样做:

g/pattern/#

将打印您想要的图案和行号。

答案 2 :(得分:42)

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

:vimgrep example %

:grep example %

这将填充所有匹配的“错误列表”,以便您可以使用:copen将它们全部列在quickfix缓冲区中,按特定行上的Enter跳转到该匹配,或使用命令像:cn:cp一样来回走动。

有关详细说明,请参阅my reply to a similar question

答案 3 :(得分:31)

刚刚学会了一个新的:Location List
输入:lvim foo %以在当前文件中搜索foo,并将包含foo的所有匹配项输入位置列表
键入:lopen以在quickfix窗口中打开位置列表,该窗口可以像往常一样完全导航 使用:lnext / :lprevious通过列表(使用 tpope / unmpaired 映射获得最佳体验)

答案 4 :(得分:15)

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

[I

这将列出光标下所有出现的单词。它可能比您需要的多,因为它还将搜索当前文件中包含的任何文件。

但是这个命令的好处是搜索结果显示还显示了匹配数的计数,以及每个匹配的行号。

:help include-search

看到很多变种。

关于

的说明
:g//p

这可以进一步减少到

:g//

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

答案 5 :(得分:10)

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

答案 6 :(得分:8)

详细说明......而不是

/example
:g//p

你也可以直接写

:g/example/p

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

:g/example

而不是p(rint),其他动作也是可能的,例如:删除)。请参阅:help:global

答案 7 :(得分:8)

你可以得到一个漂亮的quickfix窗口,其匹配项构成您当前的搜索模式

:vim // %
:copen
如果您之前使用/pattern

制作了复杂的搜索模式,那么

非常方便

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

:bufdo vimgrepadd // %
:copen

答案 8 :(得分:5)

g/pattern

如果您有:set number,则上述命令也会显示行号。

如果您没有:set number,那么

g/pattern/#

将显示行号。

答案 9 :(得分: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

答案 10 :(得分: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>

答案 11 :(得分:-1)

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

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>