Mettre en évidence toutes les occurrences d'un mot sélectionné?


159

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

Réponses:


202

En mode normal:

:set hlsearch

Recherchez ensuite un motif avec la commande /en mode Normal, ou <Ctrl>osuivi de /en mode Insertion. *en mode normal recherche la prochaine occurrence du mot sous le curseur. L' hlsearchoption les mettra tous en évidence si elle est définie. #recherchera l'occurrence précédente du mot.

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

:nohlsearch

Vous souhaiterez peut-être mapper :nohlsearch<CR>vers une clé pratique.


34
Si vous prévoyez de basculer hlsearchbeaucoup de choses, vous voudrez peut-être mapper à la :set hlsearch!place :set nohlsearch. Cela fait basculer le paramètre plutôt que de toujours le désactiver.
David Winslow

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

1
Mais vous pouvez revenir à la position où vous avez appuyé sur *ou #par <Ctrl>oen mode normal.
Ruslan

8
Au lieu de :nohlsearch, vous pouvez simplement utiliser:noh
crisron

Définir .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>pour basculer entre la surbrillance et supprimer la surbrillance de <F4>.
Chalist

124

La *touche mettra en évidence toutes les occurrences du mot qui se trouve sous le curseur.


31
Seulement si &hlsearchest allumé.
wilhelmtell

10
Il passera également à la prochaine occurrence du mot sous le curseur. Si vous souhaitez passer à l'occurrence précédente, utilisez #.
Vinicius Pinto

7
Puis-je faire en sorte qu'il reste sur la position actuelle?
nn0p

@ nn0p Oui, vous pouvez - dans ce cas, suivez la réponse acceptée stackoverflow.com/a/3431203/363688 . Ceci est juste une action alternative qui mettra également en évidence toutes les occurrences.
sleepynate

1
existe-t-il un moyen d'utiliser cette fonctionnalité mais avec le ou les mots en surbrillance?
Sung Cho

22

Je sais que c'est une très vieille question, mais si quelqu'un est intéressé par cette fonctionnalité, 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
Est-il possible de modifier ce script de telle sorte que le texte sous le curseur qui est initialement mis en surbrillance lorsque z / est pressé reste en surbrillance même lorsque le curseur est déplacé vers d'autres mots? Cela serait utile lors du défilement du code source à la recherche du mot initial.
stensootla

18

le moyen le plus simple, tapez en mode normal *

J'ai également ces mappages pour 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 de mot avec la souris et comptage des occurrences à la fois: OBS: Notez 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>

Maintenant, j'utilise nnoremap * *``cgnetnnoremap # #``cgN
SergioAraujo

Alors après avoir tapé *, comment désactiver la mise en évidence?
user5359531

Ceci est pour mettre en évidence le mot actuel dans le document
Chalist

@ user5359531 :nohor:nohlsearch
dylnmc

@ user5359531 qu'en est-il nnoremap <silent> * :execute "normal! *N"<cr>et nnoremap <silent> # :execute "normal! #n"<cr>? Celles-ci ne font que mettre en évidence le mot sous le curseur mais ne le déplacent pas à l'occurrence suivante.
dylnmc

10

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

Une alternative est d'utiliser le plugin mark.vim amélioré , puis de terminer votre .vimrcpour laisser le double-clic déclencher la mise en surbrillance (je ne sais pas comment une sélection de clavier peut déclencher une commande):

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

Il permet de multiples surlignages, persistance, etc.

Pour supprimer la mise en évidence, soit:

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

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

3
Je pense que *déplacera inconditionnellement le curseur. Et je ne vois pas à quel point cela incsearchpourrait être ennuyeux, car il ne s'agit que d'un `` regard vers l'avenir '', effectuer la recherche actuelle sans changer réellement votre position.
YvesgereY

3
Wow ... Vous avez raison. J'ai supposé que la désactivation incsearchempêcherait le mouvement, mais un test rapide confirme que vous avez raison. 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 vous ne trouviez pas gênant que votre curseur saute sur tout l'écran lorsque vous effectuez une recherche. Mais ... ces choses sont complètement subjectives. Vive la différence ;-)
jahroy

3
Vous pouvez également faire :let @/='hilight_this', en supposant que vous avez hlsearchactivé. Il met en évidence le texte sans sauter et vous n'avez pas à modifier les paramètres existants. Cela modifie la valeur actuellement stockée dans le registre de recherche.
Ben Davis

1
Cela devrait être la réponse acceptée. <leader> m fait le travail, pas besoin de mappage double-clic.
Sassan le

4

Premièrement (ou dans votre .vimrc):

:set hlsearch

Placez ensuite votre curseur sur le mot que vous souhaitez mettre en surbrillance et appuyez sur *.

hlsearchsignifie mettre en évidence toutes les occurrences de la recherche en cours, et *signifie rechercher le mot sous le curseur.


3

Assurez-vous d'abord que hlsearch est activé en exécutant la commande suivante

:set hlsearch

Vous pouvez également l'ajouter à votre fichier .vimrc comme défini

set hlsearch

maintenant, lorsque vous utilisez le mécanisme de recherche rapide en mode commande ou une commande de recherche ordinaire, tous les résultats seront mis en surbrillance. Pour avancer entre les résultats, appuyez sur 'n' pour reculer appuyez sur 'N'

En mode normal, pour effectuer une recherche rapide du mot sous le curseur et pour passer à l'occurrence suivante en une seule commande, appuyez sur '*', vous pouvez également rechercher le mot sous le curseur et passer à l'occurrence précédente en appuyant sur '# '

En mode normal, la recherche rapide peut également être appelée avec le

/searchterm<Enter>

pour supprimer les surbrillances sur l'utilisation des occurrences, j'ai lié ceci à un raccourci dans mon .vimrc

:nohl

2

Activer la mise en évidence de la recherche:

:set hlsearch

Recherchez ensuite le mot:

/word<Enter>


2

pour mettre en évidence le mot sans déplacer le curseur, plop

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

dans votre vimrc.

Ce qui est bien, c'est g*et g#fonctionnera toujours comme "normal" *et #.


Pour définir au hlsearchlarge, vous pouvez utiliser « court formulaire » (sauf si vous avez une autre fonction qui commence par « Noh » en mode commande): :noh. Ou vous pouvez utiliser la version longue::nohlsearch

Pour plus de commodité (je me retrouve à basculer hlsearchpeut-être 20 fois par jour), vous pouvez mapper quelque chose à basculer hlsearchcomme suit:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.:. si <leader>c'est le cas \(c'est le cas par défaut), vous pouvez appuyer \st(rapidement) en mode normal pour basculer hlsearch.

Ou peut-être voulez-vous simplement avoir :nohmappé:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

Ce qui précède s'exécute simplement, :nohlsearchdonc (contrairement à :set hlsearch!) il mettra toujours le mot en surbrillance la prochaine fois que vous appuyez sur *ou #en mode normal .

à votre santé



1

Utilisation autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

Assurez-vous que vous avez IncSearchréglé quelque chose. par exemple call s:Attr('IncSearch', 'reverse'). Vous pouvez également utiliser un autre groupe de surbrillance à sa place.

Cela mettra en évidence toutes les occurrences de mots sous votre curseur sans délai. Je trouve qu'un délai me ralentit lorsque je passe à travers le code. La couleur de surbrillance correspond à la couleur du mot, elle reste donc cohérente avec votre schéma.


0

Pourquoi pas simplement: z /

Cela mettra en évidence le mot actuel sous le curseur et toutes les autres occurrences. Et vous n'avez pas à donner une commande distincte pour chaque élément que vous recherchez. Peut-être que ce n'est pas disponible dans le gvim impie? C'est dans vim par défaut.

* n'est bon que si vous voulez que le curseur se déplace vers l'occurrence suivante. Lorsque vous comparez deux choses visuellement, vous ne voulez souvent pas que le curseur se déplace, et il est ennuyeux d'appuyer sur la touche * à chaque fois.


Vim et gvim ont normalement le même jeu de commandes. Il n'y a aucune référence dans la documentation d'aide à une commande "z /".
wds

Il n'est pas disponible non seulement dans gvim, mais aussi dans vim. Je viens de le vérifier - ne fonctionne manifestement pas.
Ruslan

z / fonctionne lorsque ce script mentionné dans une réponse précédente est utilisé.
fzzylogic

0
  1. Ajoutez ces lignes dans votre ~/.vimrcfichier

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. Rechargez les paramètres avec :so%
  2. Dans le modèle normal, passez en revue le mot.

  3. Appuyez sur * Appuyez sur F8 pour rechercher récursivement sous l'ensemble de votre projet sur le mot


0

Par exemple, ces plugins:

Recherchez simplement sous le curseur sur vimawesome.com

La clé, comme clagccs l'a mentionné, est que le point culminant n'est PAS en conflit avec votre recherche : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Capture d'écran montrant comment cela n'entre PAS en conflit avec la recherche: entrez la description de l'image ici Remarques:

  • vim-illuminate met en évidence par défaut, dans ma capture d'écran, je suis passé à souligné
  • vim-illuminate met en évidence / souligne le mot sous le curseur par défaut, dans ma capture d'écran, je le désactive
  • mes couleurs sont très grises. Vérifiez le vôtre pour le personnaliser également.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.