如何在Vim中计算搜索结果?

50

如何使用Vim在文本文件中查找特定词汇出现的次数。

例如,我想要查看代码中单词"name"出现的次数:

"collection": "animals",
    "fields": [
      {
        "field": "id",
        "name": ""
      },
      {
        "field": "age",
        "name": ""
      },
      {
        "field": "origin",
        "name": ""
      }

结果 - 3

5个回答

48

现在(截至Vim 8.1.1270)你可以使用:

set shortmess-=S

为了在每次使用 / 或者 ? 搜索时,在右下角显示 [x/y] 的计数,需要进行如下设置:

native search count

Vim 帮助文档中相关部分:

注意,如果搜索结果超过99个,Vim会只显示[x/>99]

native search count over 99

出于这个原因,我个人使用google/vim-searchindex插件,它适用于任意数量的结果:

vim-search-index search count

(默认情况下,该插件仅限于文件行数“仅”少于一百万行;可以使用let g:searchindex_line_limit=2000000进行调整。)


@ruohola,你用的是哪种配色方案? - Nicolas Lykke Iversen
@ruohola 谢谢。我想我曾经用过它,但在 macOS 上使用 Terminal.app 时看起来不是很好。 - Nicolas Lykke Iversen
@NicolasLykkeIversen 不太清楚那里发生了什么。我正在使用iTerm2,并从“iTerm2->首选项->配置文件->颜色预设->Solarized Dark”激活了太阳能颜色。 - ruohola
有没有配置可以让Vim显示[x/>99]中更多的字符? - aemonge
1
@aemonge 很不幸,这是硬编码的:https://github.com/vim/vim/blob/bc67e5a0a494f5fc48e872d747371e31a782d171/src/search.c#L40 - ruohola
显示剩余3条评论

47
你可以在替换命令中使用 n 标志来计算匹配次数。使用以下代码显示当前缓冲区中 some-word 匹配文本的次数:

使用替换命令中的 n 标志可以计算匹配次数。使用以下代码显示当前缓冲区中 some-word 匹配文本的次数:

:%s/some-word//gn
你可以在vim技巧维基上阅读所有详情。

对于只读缓冲区,需要执行额外的步骤 :set modifiable - minusf

1

请使用以下命令。

  1. 每行多个匹配
:%s/pattern//ng

"

g代表全局,它可以匹配每行中的多个出现。

输出显示为

"
13 matches on 10 lines
  1. 行匹配
:%s/pattern//n

输出显示为

10 matches on 10 lines

1
我有一个单词计数函数,您可以以多种方式使用它。
fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        exec "%s/" . expand("<cword>") . "//gn"
    finally
        call winrestview(l:win_view)
    endtry
endfun
command! -nargs=0 CountWord :call CountWordFunction()

所以,你可以将它映射为:

nnoremap <F3> :CountWord<CR>

即使是鼠标双击...
" When double click a word vim will hightlight all other ocurences
" see CountWordFunction()
" [I shows lines with word under the cursor
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
nnoremap <Leader>* :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

0

我的SearchPosition插件将打印以下输出(光标位于第一个匹配项上,且<A-m>映射或:SearchPosition name命令已启用):

On sole match in this line, 2 in following lines within 5,13 for /\<name\>/

它基于这里提供的其他解决方案,并且是专门为了轻松获取此类统计信息而编写的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接