2009-10-11 4 views
51

Я работал в NetBeans и мне понравилась эта функция: при размещении курсора в имени переменной выделяются все вхождения переменной. Это очень полезно для быстрого поиска всех вступлений переменной. Можно ли добавить это поведение к Vim?Выделите переменную под курсором в Vim, как в NetBeans

ответ

81

Это автокомандный будет делать то, что вы хотите:

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

vi highlight current word

Edit: Я использовал группу IncSearch выделения в моем примере, но вы можете найти другие цвета использовать, запустив этот команда:

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

есть способ заставить замолчать соответствующие ошибки? – UncleZeiv

+0

@UncleZeiv: Я не совсем понимаю, что вы подразумеваете под ошибками –

+0

, если я перемещаю курсор в конце комментария стиля C (звездочка, за которой следует косая черта), я получаю 'E488: обратные символы: соответствие IncSearch/\ <*/\> ', и мне даже нужно нажать Enter, прежде чем продолжить, довольно раздражает! Я предполагаю, что это должно быть каким-то образом сбежать и/или, по крайней мере, было бы хорошо найти способ заставить замолчать предупреждение. Отличный совет. – UncleZeiv

18

Если вы установили

:set hlsearch 

, чтобы выделить все вхождения шаблона поиска, а затем использовать * или # найти вхождения слова под курсором, которая поможет вам каким-то образом к тому, что вы хотите. Однако я думаю, что подсветка переменных с поддержкой синтаксиса выходит за рамки VIM.

+1

Ваше решение отлично! единственная проблема заключается в том, что я использую * курсор перескакивает на следующий результат поиска. Невозможно ли курсор на текущее слово? – Meysam

+2

@Meysam - вы можете создать простое сопоставление, которое делает именно это (untested): nmap * * N – lukaszkorecki

5

Это заявление позволит переменной для включения/выключения подсветки всех вхождений слова под курсором:

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

Можно было бы активировать выделение с:

:let HlUnderCursor=1 

и отключить его:

:let HlUnderCursor=0 

Можно легко определить комбинацию клавиш для включения/отключения нг подсветка:

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

Удаление переменной будет препятствовать заявление матча от исполнения, и не ясно, текущее выделение:

:unlet HlUnderCursor 
2

Если вы не хотите, чтобы выделить языковые слова (заявления/preprocs, такие как if, #define), когда курсор находится над этими словами, вы можете поместить эту функцию в .vimrc на основе @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() 
Смежные вопросы