Podświetl zmienną pod kursorem w Vimie tak jak w NetBeans

Pracowałem w NetBeans i spodobała mi się Ta funkcja: gdy umieścisz kursor w nazwie zmiennej, wszystkie jej wystąpienia są podświetlone. Jest to bardzo przydatne do szybkiego przeszukiwania wszystkich wystąpień zmiennej. Czy można dodać to zachowanie do Vima?

Author: Keith Pinson, 2009-10-11

9 answers

Ten autocommand zrobi to, co chcesz:

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

vi podświetl aktualne słowo

Edit: użyłem grupy podświetlenia IncSearch w moim przykładzie, ale możesz znaleźć inne kolory do użycia, uruchamiając to polecenie:

:so $VIMRUNTIME/syntax/hitest.vim
 96
Author: too much php,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 13:37:00

Jeśli ustawisz

:set hlsearch

Aby podświetlić wszystkie wystąpienia wzorca wyszukiwania, a następnie użyć * lub #, aby znaleźć wystąpienie słowa pod kursorem, które zapewni Ci jakiś sposób na to, co chcesz. Myślę jednak, że podświetlanie zmiennych świadomych składni wykracza poza zakres Vima.

 23
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-11 17:45:06

To polecenie pozwoli zmiennej włączyć / wyłączyć podświetlanie wszystkich wystąpień słowa pod kursorem:

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

Można aktywować podświetlenie za pomocą:

:let HlUnderCursor=1

I wyłącz go za pomocą:

:let HlUnderCursor=0

Można łatwo zdefiniować klawisz skrótu do włączania / wyłączania podświetlania:

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

Usunięcie zmiennej uniemożliwiłoby wykonanie polecenia match i nie wyczyściłoby bieżącego podświetlenia:

:unlet HlUnderCursor
 9
Author: Tjaart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 10:02:29

Jeśli nie chcesz wyróżniać słów językowych (wypowiedzi / preprocesy takie jak if, #define) gdy kursor znajduje się na tych słowach, możesz umieścić tę funkcję w swoim .vimrc na podstawie odpowiedzi @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()
 6
Author: FunkySayu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 16:35:41

Myślę, że to, czego naprawdę chcesz, to następujący plugin Shuhei Kubota:

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

Zgodnie z opisem: 'ten skrypt podświetla słowa pod kursorem jak wiele IDE.'

Zdrówko.

 5
Author: kostasv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-25 16:04:18

vim_current_word działa po wyjęciu z pudełka, jest świadomy składni i umożliwia konfigurowanie kolorów.

 1
Author: Tom Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-17 12:28:46

Aby odwzorować F2, aby przełączyć podświetlenie:

map <F2> :set hlsearch!<CR> * #
To z pewnością nie jest idealne. '* #'skacze trochę...
 1
Author: user3555835,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-16 12:53:09

Ten wariant jest zoptymalizowany pod kątem szybkości (używa CursorHold zamiast CursorMoved)i kompatybilności z hlsearch. Bieżące podświetlanie słowa wyszukiwania nie zostanie przerwane.

" 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
Author: TheJJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 16:51:40

Podobne do zaakceptowanej odpowiedzi, ale w ten sposób można ustawić czas opóźnienia po przytrzymaniu kursora nad Słowem, zanim pojawi się podświetlenie. 1000 jest w milisekundach i oznacza, że podświetli się po 1 sekundzie.

set updatetime=1000

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

Zobacz :h CursorHold aby uzyskać więcej informacji.

 0
Author: apostl3pol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-17 23:22:26