[英]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 8.1.1270开始,核心中有一个新功能可以显示当前匹配位置。 NeoVim 默认启用此功能,但标准 Vim 不启用。
要在标准 Vim 中启用它,请运行:
:set shortmess-=S
在 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[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.