Работих в NetBeans и харесах тази функция: когато поставите курсора в име на променлива, всички появявания на променливата се маркират. Това е много полезно за бързо търсене на всички срещания на променливата. Възможно ли е да добавите това поведение към Vim?
Маркирайте променливата под курсора във Vim като в NetBeans
Отговори (9)
Тази автоматична команда ще направи това, което искате:
:autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))
Редактиране: Използвах групата за осветяване IncSearch
в моя пример, но можете да намерите други цветове, които да използвате, като изпълните тази команда:
:so $VIMRUNTIME/syntax/hitest.vim
E488: Trailing characters: match IncSearch /\<*/\>
и дори трябва да натисна Enter, преди да продължа, доста досадно! Предполагам, че трябва да се избегне по някакъв начин и/или поне би било добре да се намери начин да се заглуши предупреждението. Страхотен съвет все пак.
- person UncleZeiv; 28.01.2010
:autocmd CursorMoved * silent! exe printf('match IncSearch /\<%s\>/', expand('<cword>'))
- person UncleZeiv; 29.01.2010
Ако зададете
:set hlsearch
за да маркирате всички срещания на шаблон за търсене и след това използвайте *
или #
, за да намерите срещания на думата под курсора, което ще ви отведе до това, което искате. Въпреки това мисля, че подчертаването на променлива, съобразено със синтаксиса, е извън обхвата на VIM.
nmap <leader>* ``
(удвоена обратна отметка)
- person Vladimir Zhdanov; 15.09.2019
Този оператор ще позволи на променлива да активира/деактивира осветяването на всички срещания на думата под курсора:
: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
Ако не искате да маркирате езикови думи (изявления / предварителни процедури като 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()
Мисля, че това, което наистина искате, е следният плъгин от Shuhei Kubota:
http://www.vim.org/scripts/script.php?script_id=4306
Според описанието: „Този скрипт подчертава думите под курсора като много IDE.“
наздраве
vim_current_word
работи извън кутията, познава синтаксиса и позволява персонализирани цветове.
За да картографирате F2 за превключване на осветяването:
map <F2> :set hlsearch!<CR> * #
Със сигурност не е перфектно. '* #' скача малко...
Този вариант е оптимизиран за скорост (използва 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
Подобно на приетия отговор, но този начин ви позволява да зададете време на забавяне след задържане на курсора върху дума, преди да се появи осветяването. 1000
е в милисекунди и означава, че ще се освети след 1 секунда.
set updatetime=1000
autocmd CursorHold * exe
\ printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))
Вижте :h CursorHold
за повече информация.