63 votes

Mettre en évidence la variable sous le curseur dans Vim comme dans NetBeans

J'ai travaillé dans NetBeans et j'ai apprécié cette fonctionnalité : lorsque vous placez le curseur sur le nom d'une variable, toutes les occurrences de cette variable sont mises en évidence. C'est très utile pour rechercher rapidement toutes les occurrences de la variable. Est-il possible d'ajouter ce comportement à Vim ?

96voto

too much php Points 27983

Cette autocommande fera ce que vous voulez :

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

Edit : J'ai utilisé le IncSearch dans mon exemple, mais vous pouvez trouver d'autres couleurs à utiliser en exécutant cette commande :

:so $VIMRUNTIME/syntax/hitest.vim

0 votes

Si je déplace le curseur à la fin d'un commentaire de style C (étoile suivie d'un slash), j'obtiens E488: Trailing characters: match IncSearch /\<*/\> et je dois même appuyer sur Enter avant de continuer, c'est assez ennuyeux ! Je suppose que l'on devrait pouvoir y échapper d'une manière ou d'une autre et/ou au moins trouver un moyen de faire taire l'avertissement. Bon conseil en tout cas.

9 votes

Ok, assez facile, j'ai juste eu à le changer en :autocmd CursorMoved * silent! exe printf('match IncSearch /\<%s\>/', expand('<cword>'))

3 votes

@UncleZeiv : J'ai corrigé la réponse pour échapper au motif. Le "silent !" ne fait que supprimer les erreurs - il est préférable d'en corriger la cause.. ;)

24voto

Brian Agnew Points 143181

Si vous définissez

:set hlsearch

pour mettre en évidence toutes les occurrences d'un modèle de recherche, puis utilisez * ou # pour trouver des occurrences du mot sous votre curseur, qui vous permettront d'atteindre ce que vous voulez. Cependant, je pense qu'une mise en évidence des variables tenant compte de la syntaxe est au-delà de la portée de VIM.

1 votes

Votre solution est géniale ! Le seul problème est que lorsque j'utilise *, le curseur saute au résultat de recherche suivant. N'est-il pas possible de garder le curseur sur le mot actuel ?

2 votes

@Meysam - vous pouvez créer un mappage simple qui fait exactement cela (non testé) : nmap <leader>* *N

1 votes

En complément du commentaire de lukaszkorecki : Si vous voulez que le curseur reste à la même position, vous pouvez utiliser nmap <leader>* `` (double backtick)

9voto

Tjaart Points 1

Cette instruction permet à une variable d'activer/désactiver la mise en évidence de toutes les occurrences du mot sous le curseur :

:autocmd CursorMoved * exe exists("HlUnderCursor")?HlUnderCursor?printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\')):'match none':""

On pourrait activer la mise en évidence avec :

:let HlUnderCursor=1

Et le désactiver avec :

:let HlUnderCursor=0

On pourrait facilement définir un raccourci clavier pour activer/désactiver la mise en évidence :

:nnoremap <silent> <F3> :exe "let HlUnderCursor=exists(\"HlUnderCursor\")?HlUnderCursor*-1+1:1"<CR>

La suppression de la variable empêcherait l'exécution de l'instruction match, et n'effacerait pas la surbrillance actuelle :

:unlet HlUnderCursor

6voto

FunkySayu Points 3002

Si vous ne souhaitez pas mettre en évidence les mots de la langue (déclarations / préprocessions telles que if , #define ) lorsque votre curseur se trouve sur ces mots, vous pouvez mettre cette fonction dans vos .vimrc sur la base de la réponse de @too_much_php :

let g:no_highlight_group_for_current_word=["Statement", "Comment", "Type", "PreProc"]
function s:HighlightWordUnderCursor()
    let l:syntaxgroup = synIDattr(synIDtrans(synID(line("."), stridx(getline("."), expand('<cword>')) + 1, 1)), "name")

    if (index(g:no_highlight_group_for_current_word, l:syntaxgroup) == -1)
        exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))
    else
        exe 'match IncSearch /\V\<\>/'
    endif
endfunction

autocmd CursorMoved * call s:HighlightWordUnderCursor()

5voto

kostasv Points 41

Je pense que ce que vous voulez vraiment est le plugin suivant de Shuhei Kubota :

http://www.vim.org/scripts/script.php?script_id=4306

Selon la description : "Ce script surligne les mots sous le curseur comme beaucoup d'IDEs".

A la vôtre.

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