Выделите переменную под курсором в Vim, как в NetBeans - PullRequest
53 голосов
/ 11 октября 2009

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

Ответы [ 7 ]

85 голосов
/ 12 октября 2009

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

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

vi highlight current word

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

:so $VIMRUNTIME/syntax/hitest.vim
21 голосов
/ 11 октября 2009

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

:set hlsearch

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

8 голосов
/ 17 сентября 2014

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

: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>

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

:unlet HlUnderCursor
5 голосов
/ 25 марта 2013

я думаю, что вам действительно нужен следующий плагин от Shuhei Kubota:

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

Согласно описанию: «Этот скрипт выделяет слова под курсором, как и многие IDE».

Приветствие.

4 голосов
/ 11 апреля 2016

Если вы не хотите выделять языковые слова (операторы / препроцессы, такие как 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()
0 голосов
/ 17 июня 2019

vim_current_word работает "из коробки", поддерживает синтаксис и позволяет настраивать цвета.

0 голосов
/ 22 февраля 2019

Этот вариант оптимизирован для скорости (использует CursorHold вместо CursorMoved) и совместимости с hlsearch. Текущее выделение поискового слова не будет прервано.

" autosave delay, cursorhold trigger, default: 4000ms
setl updatetime=300

" highlight the word under cursor (CursorMoved is inperformant)
highlight WordUnderCursor cterm=underline gui=underline
autocmd CursorHold * call HighlightCursorWord()
function! HighlightCursorWord()
    " if hlsearch is active, don't overwrite it!
    let search = getreg('/')
    let cword = expand('<cword>')
    if match(cword, search) == -1
        exe printf('match WordUnderCursor /\V\<%s\>/', escape(cword, '/\'))
    endif
endfunction
...