Search 显示Vim中的匹配计数

Search 显示Vim中的匹配计数,search,vim,Search,Vim,当你进行搜索时,谷歌浏览器有一个很好的功能。它告诉您要搜索的关键字的匹配数。然而,在Vim中我没有看到这样的特性。一些人建议使用%s/pattern//gn或类似方法: 但那真的很长!!当a按“*”、“%”或使用“/”和“?”进行任何搜索时,我正在查找计数 有什么想法吗?我不知道有什么直接的方法,但是你可以利用的方法:%s//使用最后一次搜索作为默认模式: :nmap ,c :%s///gn 然后,您应该能够进行搜索,然后点击,c报告匹配数 唯一的问题是*和#忽略'smartcase',因

当你进行搜索时,谷歌浏览器有一个很好的功能。它告诉您要搜索的关键字的匹配数。然而,在Vim中我没有看到这样的特性。一些人建议使用
%s/pattern//gn
或类似方法:


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


有什么想法吗?

我不知道有什么直接的方法,但是你可以利用
的方法:%s//
使用最后一次搜索作为默认模式:

:nmap ,c :%s///gn
然后,您应该能够进行搜索,然后点击
,c
报告匹配数


唯一的问题是
*
#
忽略
'smartcase'
,因此在使用
*
后,结果可能会被关闭几次。您可以通过执行
*
,然后执行
/
向上输入,然后执行
,c

来解决此问题。@Al建议您可以映射组合键以写入大部分行,然后将光标移动到插入实际图案的位置:

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

其中,“^[”为Ctrl+V,Esc,“^[OD”为Ctrl+V,左侧


然后按“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'
s:prevcountcache=[],0]
函数!ShowCount()
let key=[@/,b:changedtick]
如果s:prevcountcache[0]=#键
返回s:prevcountcache[1]
恩迪夫
设s:prevcountcache[0]=键
设s:prevcountcache[1]=0
设pos=getpos('.'))
尝试
redir=>子计数
静默%s///gne
重拨端
让结果=matchstr(子计数“\d\+”)
设s:prevcountcache[1]=结果
返回结果
最后
调用setpos('.',pos)
末日
端功能
定尺
let&statusline='%{ShowCount()}%Modern-Vim
从Vim 8.1.1270开始,在core中显示当前匹配位置。NeoVim默认启用此功能,但标准Vim不启用

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

:set shortmess-=S
最初在中提到,并在此处添加以提高可见性

旧版本 在Vim 7.4+中,可以使用该插件


查看GitHub以确保获得最新版本。

您已经有了大量答案,但在我看来,仍然有一个答案 更多的方法来解决这个问题

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

职能:

" 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>
“对当前单词进行计数
nmap w:调用计数(展开(“”)

这里有一个便宜的解决方案…我在Vim中使用了查找和替换所有。没有花哨的脚本。我做了一个查找X并用X替换所有。最后,Vim报告“9892行上的2134个替换”。X出现了2134次。使用:q!退出文件而不保存它。没有造成任何伤害

:vim[grep][!] /{pattern}/[g][j] {file} ...
Vimgrep使用Vim的内置正则表达式搜索引擎,因此您可以重用Vim的标准搜索命令中的模式/

然后输入以下内容:

:vim /CTRL+r//g %

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

此插件正是这样做的。


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

我不确定添加它的确切版本,但这已经内置到Vim中,您只需要:

:set shortmess-=S

在8.1.x补丁中添加了一些补丁(截至本文,我们的版本是8.1.2300)。

另一个不错的vim插件:

将显示如下所示:


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

例如,如果要在当前文件中搜索
TODO
,则为:

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

你可能会考虑问这个问题。我不会投票关闭,即使这是偏离主题,只是因为这可能是寻找VIM用户的合适论坛。(SU不会是一个很好的论坛,因为答案需要脚本编写,并且请停止分散提供高级答案的人!)我完全同意卢克:在StAccExoFaq()中,上面写着“如果你的问题通常涉及……程序员常用的软件工具……那么你就来问你的问题了!”。因此,这绝对不是离题。@Luc,谢谢你的评论。你说的“分散提供高级答案的人”是什么意思!"?通过在所有SE/SO/SU站点上分散vim问题,我们正在降低答案的全球质量。@Promather,就我而言,您选择了正确的论坛。这似乎是最好的答案。我将尝试一下,看看它是否能很好地将您的答案标记为已接受的答案。看起来非常有趣。请注意,它不会导致其他插件停止工作,因为它正在重新定义一些相当基本的密钥。在上有一个更新版本的插件,包含文档和更多功能。您可以这样做来适当地处理
'smartcase'
案例:
nnoremap,c:%s/=&ignorecase?'\c':'\c'///gn
我可以重新安装吗