2009-10-11 15 views
51

Ho lavorato in NetBeans e mi è piaciuta questa funzione: quando si posiziona il cursore in un nome di variabile, tutte le occorrenze della variabile vengono evidenziate. Questo è molto utile per la ricerca rapida di tutte le occorrenze della variabile. È possibile aggiungere questo comportamento a Vim?Evidenzia la variabile sotto il cursore in Vim come in NetBeans

risposta

81

Questa autocomando farà ciò che si vuole:

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

vi highlight current word

Edit: Ho usato il gruppo IncSearch momento clou nel mio esempio, ma è possibile trovare altri colori da utilizzare per l'esecuzione di questo comando:

:so $VIMRUNTIME/syntax/hitest.vim 
+0

c'è un modo per silenziare gli errori di corrispondenza? – UncleZeiv

+0

@UncleZeiv: Non sono abbastanza sicuro di cosa intendi per errori –

+0

se sposto il cursore alla fine di un commento in stile C (stella seguita da barra), ottengo 'E488: Caratteri finali: corrispondenza IncSearch/\ <*/\> ', e devo anche premere Invio prima di continuare, piuttosto fastidioso! Immagino che dovrebbe essere sfuggito in qualche modo e/o almeno sarebbe ok trovare un modo per mettere a tacere l'avvertimento. Ottimo consiglio comunque. – UncleZeiv

18

Se si imposta

:set hlsearch 

per evidenziare tutte le occorrenze di un modello di ricerca, e quindi utilizzare * o # per trovare le occorrenze della parola sotto il cursore, che vi porterà qualche modo a ciò che si desidera. Tuttavia, ritengo che l'evidenziazione di una variabile sintattica esuli dallo scopo di VIM.

+1

la tua soluzione è fantastica! l'unico problema è quando uso * il cursore salta al risultato di ricerca successivo. Non è possibile mantenere il cursore sulla parola corrente? – Meysam

+2

@Meysam - puoi creare una semplice mappatura che fa proprio questo (non testato): nmap * * N – lukaszkorecki

5

Questa affermazione consentirà una variabile per abilitare/disabilitare evidenziare tutte le occorrenze della parola sotto il cursore:

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

Si potrebbe attivare mettendo in evidenza con:

:let HlUnderCursor=1 

E disabilitarlo con:

:let HlUnderCursor=0 

Si potrebbe facilmente definire un tasto di scelta rapida per abilitare/disabilitare ng evidenziazione:

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

Cancellare la variabile impedirebbe la dichiarazione partita da eseguire, e non è chiaro il momento clou corrente:

:unlet HlUnderCursor 
2

Se non si desidera evidenziare parole della lingua (dichiarazioni/preprocs quali if, #define) quando il cursore si trova su queste parole, si può mettere questa funzione nel vostro .vimrc in base alla risposta @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() 
Problemi correlati