it-swarm.com.ru

Выделите переменную под курсором в Vim, как в NetBeans

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

53
kipelovets

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

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

vi highlight current Word

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

:so $VIMRUNTIME/syntax/hitest.vim
85
too much php

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

:set hlsearch

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

21
Brian Agnew

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

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

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

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

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

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

5
kostasv

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

Этот вариант оптимизирован для скорости (использует 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
0
TheJJ