67 votes

Afficher le nombre de matchs dans Vim

Il y a une belle fonctionnalité de Google Chrome lorsque vous faites une recherche. Il vous indique le nombre de matchs, il est pour le mot-clé que vous recherchez. Cependant, dans Vim, je ne vois pas une telle fonctionnalité. Certaines personnes ont suggéré d'utiliser %s/pattern//gn ou similaires:

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern
Impossible de compter le nombre de matches dans Vim

Mais c'est assez long, vraiment!! Je suis à la recherche pour le comte quand un appuyez sur la touche '*', '%', ou faire une recherche à l'aide de '/' et '?'.

Une idée?

58voto

user2571881 Points 1787

23voto

DrAl Points 29528

Je ne connais pas de moyen direct de le faire, mais vous pourriez faire usage de la façon dont :%s/// utilise la dernière recherche que le modèle par défaut:

:nmap ,c :%s///gn

Vous devriez alors être en mesure de faire une recherche, puis appuyez ,c à déclarer le nombre de matchs.

Le seul problème sera qu' * et # ignorer 'smartcase', de sorte que les résultats pourraient être désactivé par un peu après l'utilisation de *. Vous pouvez contourner cela en effectuant * suivie par /Jusqu'àENTRER et ensuite, ,c.

13voto

ZyX Points 26516

Un ajout à la réponse de @ Al: si vous voulez que vim l'affiche automatiquement dans la ligne d'état, essayez d'ajouter ce qui suit au 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'
 

3voto

alfredodeza Points 1587

Vous avez déjà une bonne mine de réponses, mais il me semble qu'il existe encore une autre approche à ce problème.

C'est en fait quelque chose que j'ai dû gérer il y a quelques jours. J'ai ajouté une fonction et un mappage de telle manière que vous frappiez le mappage lorsque le curseur est sous le mot que vous souhaitez compter et qu'il renvoie le nombre de correspondances.

La fonction:

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

Et la cartographie:

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

2voto

Alternativement à partir de ce que @Al suggère, vous pouvez mapper la combinaison de touches pour écrire la majeure partie de la ligne, puis déplacer le curseur à la position où le motif réel est inséré:

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

Où '^ [' est Ctrl + V, Esc et '^ [OD' est Ctrl + V, Left

Appuyez ensuite sur ', c' pour passer en mode commande, entrez le motif et laissez le curseur sur le second '/', prêt à insérer le motif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X