Маркирайте променливата под курсора във Vim като в NetBeans

Работих в NetBeans и харесах тази функция: когато поставите курсора в име на променлива, всички появявания на променливата се маркират. Това е много полезно за бързо търсене на всички срещания на променливата. Възможно ли е да добавите това поведение към Vim?


person kipelovets    schedule 11.10.2009    source източник


Отговори (9)


Тази автоматична команда ще направи това, което искате:

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

vi маркирайте текущата дума

Редактиране: Използвах групата за осветяване IncSearch в моя пример, но можете да намерите други цветове, които да използвате, като изпълните тази команда:

:so $VIMRUNTIME/syntax/hitest.vim
person too much php    schedule 12.10.2009
comment
ако преместя курсора в края на коментар в стил C (звезда, последвана от наклонена черта), получавам E488: Trailing characters: match IncSearch /\<*/\> и дори трябва да натисна Enter, преди да продължа, доста досадно! Предполагам, че трябва да се избегне по някакъв начин и/или поне би било добре да се намери начин да се заглуши предупреждението. Страхотен съвет все пак. - person UncleZeiv; 28.01.2010
comment
добре, лесно, просто трябваше да го променя на :autocmd CursorMoved * silent! exe printf('match IncSearch /\<%s\>/', expand('<cword>')) - person UncleZeiv; 29.01.2010
comment
@UncleZeiv: Поправих отговора, за да избягам от шаблона. Мълчаливият! само потиска грешките - по-добре е да коригирате причината за тях.. ;) - person blueyed; 12.07.2012
comment
Може ли някоя благотворителна душа да обясни как работи тази команда? - person Sebastián Grignoli; 30.12.2012
comment
Netbeans ще подчертае променливите, които са достъпни в контекста на текущо избраната променлива. Той знае разликата между същата променлива, декларирана във функцията lamda, и нормална функция, която я съдържа, и ще подчертае съответно. Възможно ли е да се въведе такъв вид специфична за езика интелигентност в подчертаването? - person SenG; 01.09.2015
comment
@SenG Ами винаги може да се разчита на мозъка за това или просто да не се използва същата променлива във вложени сематични обхвати, което така или иначе е объркващо и трябва да се избягва. Като се има предвид това, погледнете Eclim, ако има способността да изброява всички срещания на семантична единица, тогава можете да използвате тази команда вместо match за подчертаване. Но предполагам, че това ще бъде ужасно неефективно и само за Java. Като се замисля, вземам това обратно. Използвайте match и просто се радвайте, че сте открили миризлив код благодарение на vim ;). - person thesaint; 06.09.2015
comment
Възможно ли е думата на курсора да не е маркирана? Това работи приятно, но може да бъде малко лесно да загубите мястото си на екрана. - person Karl; 08.02.2016
comment
Това работи чудесно! Чудя се дали някой може да ме насочи да накарам това да работи във всички отворени файлове. Ситуация: дефиниция на функция във файл A, използване във файл B. Екранът е разделен като A и B. Когато курсорът е върху името на функцията в който и да е файл, бих искал да видя събитията в двата файла да бъдат маркирани. - person vc669; 27.08.2019
comment
@SenG - на този етап бих искал да използвам IDE, познаваща езика, и може би такава с VIM емулация (напр. Intellij + IdeaVIM плъгин - не е идеален, но свързва света на IDE и Vim доста добре) - person Brian Agnew; 16.09.2019

Ако зададете

:set hlsearch

за да маркирате всички срещания на шаблон за търсене и след това използвайте * или #, за да намерите срещания на думата под курсора, което ще ви отведе до това, което искате. Въпреки това мисля, че подчертаването на променлива, съобразено със синтаксиса, е извън обхвата на VIM.

person Brian Agnew    schedule 11.10.2009
comment
решението ти е страхотно! единственият проблем е, когато използвам *, курсорът прескача към следващия резултат от търсенето. Не е ли възможно да задържите курсора върху текущата дума? - person B Faley; 10.05.2011
comment
@Meysam - можете да създадете просто картографиране, което прави точно това (нетествано): nmap ‹leader›* *N - person lukaszkorecki; 24.02.2012
comment
Като допълнение към коментара на lukaszkorecki: Ако искате курсорът да остане на същата позиция, можете да използвате 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
person Tjaart    schedule 17.09.2014

Ако не искате да маркирате езикови думи (изявления / предварителни процедури като 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()
person FunkySayu    schedule 11.04.2016

Мисля, че това, което наистина искате, е следният плъгин от Shuhei Kubota:

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

Според описанието: „Този ​​скрипт подчертава думите под курсора като много IDE.“

наздраве

person kostasv    schedule 25.03.2013

vim_current_word работи извън кутията, познава синтаксиса и позволява персонализирани цветове.

person Tom Hale    schedule 17.06.2019

За да картографирате F2 за превключване на осветяването:

map <F2> :set hlsearch!<CR> * #

Със сигурност не е перфектно. '* #' скача малко...

person user3555835    schedule 16.10.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
person TheJJ    schedule 22.02.2019

Подобно на приетия отговор, но този начин ви позволява да зададете време на забавяне след задържане на курсора върху дума, преди да се появи осветяването. 1000 е в милисекунди и означава, че ще се освети след 1 секунда.

set updatetime=1000

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

Вижте :h CursorHold за повече информация.

person apostl3pol    schedule 17.11.2020