【问题标题】:Show Count of Matches in Vim在 Vim 中显示匹配数
【发布时间】:2011-06-07 19:19:45
【问题描述】:

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

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern
Unable to count the number of matches in Vim

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

有什么想法吗?

【问题讨论】:

  • 您可以考虑在superuser.com 中提出这个问题。我不会投票关闭,即使这是题外话,只是因为这可能是寻找 vim 用户的合适论坛。
  • (SU 也不是一个好的论坛,因为答案需要编写脚本,请停止分散提供高级答案的人!)
  • 我完全同意 Luc:在 stackoverflow 常见问题解答 (stackoverflow.com/faq) 中,它说“如果您的问题通常涵盖......程序员常用的软件工具......那么你就在问你问题的正确地方!”。因此,这绝对不是题外话。
  • @Luc,感谢 cmets。 “分散提供高级答案的人!”是什么意思?
  • 通过在所有 SE/SO/SU 站点上分散 vim 问题,我们正在降低答案的全球质量。 @Promather,就我而言,您选择了正确的论坛。

标签: search vim


【解决方案1】:

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

:nmap ,c :%s///gn

然后您应该能够进行搜索,然后点击,c 以报告匹配数。

唯一的问题是*# 会忽略'smartcase',因此使用* 后结果可能会相差一些。您可以通过 * 后跟 /UpENTER 然后 ,c 来解决这个问题。

【讨论】:

  • 你可以这样做来适当地处理'smartcase'的情况:nnoremap ,c :%s/<C-R>=&ignorecase ? '\c' : '\C'<CR><C-R>///gn<CR>
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    @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'
    

    【讨论】:

    • 我可以请求包含忽略大小写的版本吗? :P
    【解决方案4】:

    现代 Vim

    Vim 8.1.1270 开始,核心中有 a new feature 来显示当前匹配位置。 NeoVim 默认启用此功能,但标准 Vim 不启用。

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

    :set shortmess-=S
    

    最初在Ben'sanswer下面提到,为了可见性而添加到这里。

    旧版本

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

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

    【讨论】:

    • 这似乎是最好的答案。我会尝试一下,看看是否可以将您的答案标记为已接受的答案。
    • 看起来很有趣。请注意它不会导致其他插件停止工作,因为它正在重新定义一些相当基本的键。
    • 此插件有更新版本,包含文档和更多功能,地址为GitHub – henrik/vim-indexed-search
    【解决方案5】:

    你已经有了很多答案,但在我看来,还有一个 解决这个问题的更多方法。

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

    功能:

    " 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>
    

    【讨论】:

    • 我建议将您以前的搜索寄存器存储为::let old_query = getreg('/'),并在最后恢复为::call setreg('/', old_query)。这是我对 vim 的“保留”功能:pastebin.com/GZctZxdb,这里是 neovim 版本:pastebin.com/2SpeWFC0
    【解决方案6】:

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

    【讨论】:

    • replace all 替换为您正在搜索的相同字符串 - 除了某些大小写问题取决于您的设置,您不应更改任何内容。在最坏的情况下,你是一个 u 无论如何都无法撤消它。聪明的把戏。 ;^)
    【解决方案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 条命令可以重新映射以使其更快地执行。

    【讨论】:

      【解决方案8】:

      这个插件就是这样做的。 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 次出现。

      【讨论】:

        【解决方案9】:

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

        :set shortmess-=S
        

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

        【讨论】:

          【解决方案10】:

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

          会这样显示:

          【讨论】:

            【解决方案11】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-09-18
              • 1970-01-01
              • 2012-05-05
              • 1970-01-01
              • 2011-07-10
              • 1970-01-01
              • 2023-03-10
              相关资源
              最近更新 更多