繁体   English   中英

在 Vim 中显示匹配数

[英]Show Count of Matches in Vim

当您进行搜索时,Google Chrome 中有一个很好的功能。 它会告诉您与您正在搜索的关键字匹配的数量。 但是,在 Vim 中我没有看到这样的功能。 有些人建议使用%s/pattern//gn或类似的:

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern
无法计算 Vim 中的匹配数

但这真的很长!! 我正在查找按“*”、“%”或使用“/”和“?”进行任何搜索时的计数。

有什么想法吗?

现代 Vim

Vim 8.1.1270开始,核心中有一个新功能可以显示当前匹配位置。 NeoVim 默认启用此功能,但标准 Vim 不启用。

要在标准 Vim 中启用它,请运行:

:set shortmess-=S

最初在Ben 的回答中提到,并在此处添加以提高可见性。

旧版本

在 Vim 7.4+ 中,可以使用IndexedSearch插件。

检查 GitHub 上的henrik/vim-indexed-search以确保您获得最新版本。

我不知道这样做的直接方法,但您可以使用:%s///使用最后一个搜索作为默认模式的方式:

:nmap ,c :%s///gn

然后,您应该能够进行搜索,然后按,c来报告匹配项的数量。

唯一的问题是*#忽略'smartcase' ,因此使用*后结果可能会有所不同。 您可以通过执行*后跟/ Up ENTER然后,c

对@Al 的回答的补充:如果您想让 vim 在状态行中自动显示它,请尝试将以下内容添加到 vimrc:

let s:prevcountcache=[[], 0]
function! ShowCount()
    let key=[@/, b:changedtick]
    if s:prevcountcache[0]==#key
        return s:prevcountcache[1]
    endif
    let s:prevcountcache[0]=key
    let s:prevcountcache[1]=0
    let pos=getpos('.')
    try
        redir => subscount
        silent %s///gne
        redir END
        let result=matchstr(subscount, '\d\+')
        let s:prevcountcache[1]=result
        return result
    finally
        call setpos('.', pos)
    endtry
endfunction
set ruler
let &statusline='%{ShowCount()} %<%f %h%m%r%=%-14.(%l,%c%V%) %P'

这是一个便宜的解决方案......我在 Vim 中使用了 Find and Replace All。 没有花哨的脚本。 我做了一个查找 X 并用 X 替换全部。最后,Vim 报告“9892 行上有 2134 次替换”。 X出现了2134次。 使用 :q! 退出文件而不保存它。 没有伤害。

您已经有了大量的答案,但在我看来,这个问题还有另一种方法。

这实际上是我几天前不得不处理的事情。 我添加了一个函数和一个映射,当光标位于要计算的单词下方时,您点击映射并返回匹配数。

功能:

" Count number of occurances of a word
function Count(word)
    let count_word = "%s/" . a:word . "//gn"
    execute count_word
endfunction

和映射:

" Count current word 
nmap <Leader>w <Esc>:call Count(expand("<cword>"))<CR>

我不确定到底是哪个版本添加了它,但现在 Vim 内置了它,你只需要:

:set shortmess-=S

在 8.1.x 补丁中的某个时间添加(在撰写本文时,我们在 8.1.2300)。

或者,根据@Al 的建议,您可以映射组合键以写入大部分行,然后将光标移动到插入实际模式的位置:

:nmap ,c ^[:%s//gn^[OD^[OD^[OD^[OD]

其中 '^[' 是Ctrl +V, Esc和 '^[OD' 是Ctrl +V, Left

然后按 ',c' 将进入命令模式,输入模式并将光标留在第二个 '/' 上,准备插入模式。

这个插件就是这样做的。 https://github.com/osyo-manga/vim-anzu

在 vim 中搜索单词时,它会在状态行上显示字数。 它还可以选择在搜索词旁边显示,即。 this_is_my_sample_word (3/12)this_is_my_sample_word(7/12) 这基本上是说:这是 12 次总出现中的第 3 次或第 7 次出现。

另一个不错的 vim 插件: https : //github.com/google/vim-searchindex

将显示如下:

在文件中查找“cd”时

:vim[grep][!] /{pattern}/[g][j] {file} ...

Vimgrep 使用 Vim 的内置正则表达式搜索引擎,因此您可以重用 Vim 标准搜索命令中的模式。 因此,我首先使用以下常规方式测试搜索模式:/{pattern}/

然后输入以下内容:

:vim /CTRL+r//g %

其中CTRL+r/将在第一个斜杠后插入最后一个搜索模式。 状态行将显示 (1 of max),其中 max 是{pattern}的最大匹配数。 然后使用:cnext:cprev搜索下一个和上一个匹配项,使用:cfirst:clast搜索第一个和最后一个匹配项。 可以重新映射这 4 个命令以使其更快地执行。

另一种方法是使用grep命令进行计数。

例如。 如果要在当前文件中搜索TODO是:

:echo system('grep -c TODO ' . expand('%:p'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM