202 votes

Comment mettre en évidence toutes les occurrences d'un mot sélectionné dans le VIM ?

Comment puis-je mettre en évidence toutes les occurrences d'un mot sélectionné dans GVim, comme dans Notepad++ ?

252voto

wilhelmtell Points 25504

En mode normal :

:set hlsearch

Ensuite, recherchez un motif avec la commande / en mode Normal, ou <Ctrl>o suivi par / en mode insertion. * en mode normal, recherche la prochaine occurrence du mot situé sous le curseur. Le site hlsearch les mettra toutes en évidence si elle est activée. # recherchera l'occurrence précédente du mot.

Pour supprimer la surbrillance de la recherche précédente :

:nohlsearch

Vous pourriez souhaiter cartographier :nohlsearch<CR> à une touche pratique.

45 votes

Si vous prévoyez de basculer hlsearch beaucoup de choses que vous pourriez vouloir cartographier :set hlsearch! au lieu de :set nohlsearch . Cela permet de basculer le paramètre plutôt que de le désactiver systématiquement.

1 votes

Sachez également que le curseur se déplacera vers l'occurrence précédente (#) ou suivante (*) du mot.

1 votes

Mais vous pouvez retourner à la position où vous avez appuyé sur * o # por <Ctrl>o en mode normal.

155voto

sleepynate Points 3837

El * met en évidence toutes les occurrences du mot qui se trouve sous le curseur.

38 votes

Seulement si &hlsearch est en cours.

14 votes

Il passe également à l'occurrence suivante du mot situé sous le curseur. Si vous souhaitez revenir à l'occurrence précédente, utilisez la commande # .

15 votes

Est-ce que je peux faire en sorte qu'il reste sur la position actuelle ?

24voto

CocoOS Points 523

Je sais que c'est une très vieille question, mais si quelqu'un est intéressé par cette fonctionnalité, il peut vérifier ce code http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1 votes

Est-il possible de modifier ce script de sorte que le texte sous le curseur qui est initialement mis en évidence lorsque l'on appuie sur z/ reste mis en évidence même lorsque le curseur est déplacé vers d'autres mots ? Cela serait utile lorsqu'on fait défiler le code source à la recherche du mot initial.

21voto

user2571881 Points 1787

La manière la plus simple, tapez en mode normal *

J'ai également ces mappings à activer et désactiver

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

Sélectionnez le mot en cliquant dessus

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

Bonus : CountWordFunction

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

Sélection d'un mot avec la souris et comptage des occurrences en une seule fois : OBS : Remarquez que dans cette version nous avons la commande "CountWord" à la fin.

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

0 votes

Maintenant, j'utilise nnoremap * *``cgn y nnoremap # #``cgN

2 votes

Donc après avoir tapé * comment désactiver le surlignage ?

0 votes

Ceci permet de mettre en évidence le mot courant dans le document

11voto

Solutions basées sur la recherche ( * , / ...) déplacer le curseur, ce qui peut être regrettable.

Une alternative est d'utiliser amélioré mark.vim puis complétez votre .vimrc pour que le double-clic déclenche la mise en évidence (je ne sais pas comment une sélection au clavier peut déclencher une commande) :

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

Il permet des surlignages multiples, la persistance, etc.

Pour supprimer la mise en évidence, soit :

  • Double-cliquez à nouveau
  • :Mark (éteint jusqu'à la prochaine sélection)
  • :MarkClear

2 votes

Les solutions basées sur la recherche ne déplacent le curseur que si la recherche incrémentale est activée. Vous pouvez la désactiver comme suit : :set noincsearch . À mon avis, c'est l'une des fonctions les plus ennuyeuses de Vim et l'une des premières choses que je désactive lors des nouvelles installations.

3 votes

Je pense * déplacera inconditionnellement le curseur. Et je ne vois pas comment incsearch peut être gênant, car il ne s'agit que d'un "regard vers l'avenir", qui effectue une recherche actuelle sans changer réellement votre position.

3 votes

Wow... Tu as raison. Je pensais qu'éteindre incsearch empêcherait le mouvement, mais un test rapide confirme que vous avez raison. Toutes mes excuses. Cependant, il est très facile de créer un mappage qui empêche le mouvement : :nnoremap * *N . Je n'arrive pas à croire que tu Ne le fais pas. vous trouvez ennuyeux que votre curseur saute partout sur l'écran lorsque vous effectuez une recherche. Mais... ces choses sont totalement subjectives. Vive la différence ;-)

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