ViM: Rechercher et surligner mais ne pas sauter

La touche super star (*) dans ViM recherche le mot sous le curseur et avance au prochain match. L’utilisateur peut accéder aux prochaines correspondances avec la touche n . Si hlsearch est activé, il mettra également en évidence les correspondances.

Je veux pouvoir appuyer sur * et obtenir les correspondances en surbrillance et pouvoir naviguer dans les correspondances en utilisant la touche n. Cependant, je ne veux pas que ViM passe au match suivant lorsque vous appuyez sur *, il doit restr sur le mot actuel. Y a-t-il un moyen de faire cela?

Je mapperais:

 nnoremap * *`` 

Fonctionne exactement comme vous voulez, sauf que cela ajoute un saut dans la liste des sauts. Pour éviter que vous ayez besoin de:

 nnoremap * :keepjumps normal *`` 

La meilleure solution:

  1. ne pas append un saut à la liste de saut
  2. le comportement de la touche écanvas n’est pas modifié

Alors, essayez le plugin: http://www.vim.org/scripts/script.php?script_id=4335

Beaucoup mieux que:

 " a jump adds to the jump list nnoremap * *`` " I got a dead loop on macvim nnoremap * :keepjumps normal *`` " the behavior is changed nnoremap  * :let @/='\<=expand("")\>':set hls 

J’ai le suivant dans mon fichier .vimrc, qui fonctionne mieux que les autres alternatives:

 " Put word under cursor into search register and highlight nnoremap  * :let @/='\<=expand("")\>':set hls vnoremap  * : \let old_reg=getreg('"')let old_regtype=getregtype('"') \gvy:let @/=substitute( \escape(@", '/\.*$^~['), '\_s\+', '\\_s\\+', 'g') \gV:call setreg('"', old_reg, old_regtype):set hls 

Si vous souhaitez conserver la vue actuelle et append la recherche à l’historique, essayez cette solution [pas très efficace]:

 noremap * msHmt`s*`tzt`s 

Il utilise les marques s (save) et t (top).

Une solution simple me vint à l’esprit: mettre map * *# dans le fichier .vimrc (il clignotera cependant).

Je n’ai pas encore vu celui-ci:

nmap * "syiw: let @/ = @s

Il est très court et ne nécessite pas de sauter, ce qui peut entraîner le clignotement.

Explication: copiez le mot sous le curseur sur s register puis définissez le registre de recherche ( / ) sur le contenu du registre s . Le registre de recherche n’est pas accessible en écriture directement, c’est pourquoi le let est nécessaire et donc le silent pour garder la ligne de commande de vim propre.

J’ai trouvé que cela fonctionnait plutôt bien, il n’y a pas de clignotement et il n’est pas nécessaire d’avoir un registre intermédiaire.

 nnoremap  * :let @/= '\<' . expand('') . '\>'  set hls  

Ou si vous voulez le comportement de g* :

 nnoremap  g* :let @/=expand('')  set hls  

Les autres réponses ici sont bonnes, en particulier celles de @ rodrigo, mais je voulais écrire une solution qui préserve la position de défilement sans affecter les marques.

Cela fonctionne pour moi:

 function! StarPositionSave() let g:star_position_cursor = getpos('.') normal! H let g:star_position_top = getpos('.') call setpos('.', g:star_position_cursor) endfunction function! StarPositionRestore() call setpos('.', g:star_position_top) normal! zt call setpos('.', g:star_position_cursor) endfunction nnoremap  * :call StarPositionSave()*:call StarPositionRestore() 

Mettre normal! * normal! * dans la fonction directement ne semble pas fonctionner, car (au moins dans neovim) elle empêche le déclenchement de la mise en évidence de la recherche (comme si :nohlsearch était exécuté).