Podświetlić wszystkie wystąpienia wybranego słowa?


159

Jak mogę zaznaczyć wszystkie wystąpienia wybranego słowa w GVim, jak w Notepad ++?

Odpowiedzi:


202

W trybie normalnym:

:set hlsearch

Następnie wyszukać wzór z komendy /w trybie normalnym lub <Ctrl>onastępuje /w trybie Insert. *w trybie normalnym wyszuka następne wystąpienie słowa pod kursorem. Ta hlsearchopcja podświetli je wszystkie, jeśli są ustawione. #wyszuka poprzednie wystąpienie słowa.

Aby usunąć wyróżnienie poprzedniego wyszukiwania:

:nohlsearch

Możesz mapować :nohlsearch<CR>do jakiegoś wygodnego klucza.


34
Jeśli planujesz hlsearchdużo przełączać, możesz chcieć mapować :set hlsearch!zamiast :set nohlsearch. Spowoduje to przełączenie ustawienia zamiast jego wyłączania.
David Winslow

1
Pamiętaj też, że kursor przesunie się do poprzedniego (#) lub następnego (*) wystąpienia słowa
Juan Campa.

1
Ale można wrócić do miejsca, w którym został naciśnięty przycisk *lub #by <Ctrl>ow trybie normalnym.
Ruslan,

8
Zamiast tego :nohlsearchmożesz po prostu użyć:noh
crisron

Set in .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>do przełączania między podświetleniem a usunięciem podświetlenia według <F4>.
Chalist

124

*Klucz zaprezentuje wszystkie wystąpienia tego słowa, które jest pod kursorem.


31
Tylko jeśli &hlsearchjest włączony.
wilhelmtell

10
Przeskoczy również do następnego wystąpienia słowa pod kursorem. Jeśli chcesz przejść do poprzedniego wystąpienia, użyj #.
Vinicius Pinto

7
Czy mogę sprawić, by pozostał na aktualnej pozycji?
nn0p

@ nn0p Tak, możesz - w takim przypadku postępuj zgodnie z zaakceptowaną odpowiedzią stackoverflow.com/a/3431203/363688 . To tylko alternatywna czynność, która również podświetli wszystkie wystąpienia.
sleepynate

1
czy istnieje sposób korzystania z tej funkcji, ale z zaznaczonym jednym lub większą liczbą słów?
Sung Cho

22

Wiem, że to naprawdę stare pytanie, ale jeśli ktoś jest zainteresowany tą funkcją, może sprawdzić ten kod http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1
Czy można zmodyfikować ten skrypt w taki sposób, że tekst pod kursorem, który jest początkowo podświetlony po naciśnięciu z /, pozostaje podświetlony nawet po przeniesieniu kursora na inne słowa? Byłoby to przydatne podczas przewijania kodu źródłowego w poszukiwaniu początkowego słowa.
stensootla

18

najprostszy sposób, wpisz w trybie normalnym *

Mam też te mapowania do włączania i wyłączania

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

Wybierz słowo, klikając je

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

Bonus: CountWordFunction

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

Zaznaczanie wyrazów myszką i od razu liczenie wystąpień: OBS: Zauważ, że w tej wersji na końcu mamy komendę "CountWord"

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

Teraz używam nnoremap * *``cgninnoremap # #``cgN
SergioAraujo

więc jak po *wpisaniu wyłączyć podświetlenie?
user5359531

To jest dla wyróżnienia bieżącego słowa w dokumencie
Chalist

@ user5359531 :nohlub:nohlsearch
dylnmc

@ user5359531 co nnoremap <silent> * :execute "normal! *N"<cr>i nnoremap <silent> # :execute "normal! #n"<cr>? Po prostu podświetlają słowo pod kursorem, ale nie przenoszą go do następnego wystąpienia.
dylnmc

10

Rozwiązania oparte na wyszukiwaniu ( *, /...) przesuwają kursor, co może być niefortunne.

Alternatywą jest użycie rozszerzonej wtyczki mark.vim , a następnie uzupełnij, .vimrcaby podświetlić wyzwalacz dwukrotnym kliknięciem (nie wiem, w jaki sposób wybór klawiatury może wywołać polecenie):

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

Pozwala na wiele wyróżnień, trwałości itp.

Aby usunąć wyróżnienie:

  • Kliknij ponownie dwukrotnie
  • :Mark (wyłącz do następnego wyboru)
  • :MarkClear

2
Rozwiązania oparte na wyszukiwaniu przesuwają kursor tylko wtedy, gdy włączone jest wyszukiwanie zapamiętane. Można go wyłączyć tak: :set noincsearch. Moim zdaniem jest to jedna z najbardziej irytujących funkcji Vima i jedna z pierwszych rzeczy, które wyłączam przy nowych instalacjach.
jahroy

3
Myślę, że *bezwarunkowo przesunie kursor. I nie rozumiem, jakie to incsearchmoże być irytujące, ponieważ jest to tylko „spojrzenie w przyszłość”, wykonywanie bieżącego wyszukiwania bez faktycznej zmiany pozycji.
YvesgereY,

3
Wow ... Masz rację. Zakładałem, że wyłączenie incsearchuniemożliwi ruch, ale szybki test potwierdza, że ​​masz rację. Przepraszam. Jednakże, jest to bardzo proste, aby utworzyć odwzorowanie który uniemożliwia ruch: :nnoremap * *N. Nie mogę uwierzyć, że nie denerwuje Cię to, że podczas wyszukiwania kursor przeskakuje po całym ekranie. Ale ... te rzeczy są całkowicie subiektywne. Vive la différence ;-)
jahroy

3
Możesz także to zrobić :let @/='hilight_this', zakładając, że masz hlsearchwłączone. Podświetla tekst bez przeskakiwania i nie musisz zmieniać istniejących ustawień. Spowoduje to zmianę wartości, która jest obecnie przechowywana w rejestrze wyszukiwania.
Ben Davis,

1
To powinna być akceptowana odpowiedź. <leader> m wykonuje swoją pracę, nie ma potrzeby mapowania podwójnego kliknięcia.
Sassan

4

Najpierw (lub w twoim .vimrc):

:set hlsearch

Następnie umieść kursor nad słowem, które chcesz wyróżnić, i naciśnij *.

hlsearchoznacza podświetlenie wszystkich wystąpień bieżącego wyszukiwania i *oznacza wyszukiwanie słowa pod kursorem.


3

Najpierw upewnij się, że hlsearch jest włączone, wydając następujące polecenie

:set hlsearch

Możesz również dodać to do swojego pliku .vimrc jako zestaw

set hlsearch

teraz, gdy używasz mechanizmu szybkiego wyszukiwania w trybie poleceń lub zwykłego polecenia wyszukiwania, wszystkie wyniki zostaną podświetlone. Aby przejść do przodu między wynikami, naciśnij „n”, aby przejść do tyłu, naciśnij „N”

W trybie normalnym, aby wykonać szybkie wyszukiwanie słowa pod kursorem i przeskoczyć do następnego wystąpienia jednym poleceniem, naciśnij '*', możesz również wyszukać słowo pod kursorem i przejść do poprzedniego wystąpienia, naciskając '# '

W trybie normalnym szybkie wyszukiwanie można również wywołać za pomocą rozszerzenia

/searchterm<Enter>

aby usunąć podświetlenia przy użyciu zdarzeń, powiązałem to ze skrótem w moim .vimrc

:nohl

2

Włącz wyróżnianie wyszukiwania:

:set hlsearch

Następnie wyszukaj słowo:

/word<Enter>


2

aby podświetlić słowo bez przesuwania kursora, plop

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

do twojego vimrc.

Fajne w tym jest g*i g#nadal będzie działać jak „normalne” *i #.


Aby ustawić hlsearchoff, można użyć „short-form” (chyba że masz inną funkcję, która zaczyna się od „Noh” w trybie poleceń) :noh. Lub możesz użyć długiej wersji::nohlsearch

Dla maksymalnej wygody (przełączam się hlsearchmoże 20 razy dziennie), możesz zmapować coś do przełączania w następujący hlsearchsposób:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.:. jeśli tak <leader>jest \(domyślnie), możesz nacisnąć \st(szybko) w trybie normalnym , aby przełączyć hlsearch.

A może po prostu chcesz :nohzmapować:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

Powyższe działa po prostu :nohlsearchtak (w przeciwieństwie :set hlsearch!), że nadal będzie podświetlać słowo po następnym naciśnięciu *lub #w trybie normalnym .

Twoje zdrowie



1

Posługiwać się autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

Upewnij się, że IncSearchcoś ustawiłeś. np call s:Attr('IncSearch', 'reverse'). Alternatywnie możesz użyć innej grupy podświetlenia w jej miejsce.

Spowoduje to bezzwłoczne podświetlenie wszystkich wystąpień słów pod kursorem. Uważam, że opóźnienie spowalnia mnie, gdy przeglądam kod. Kolor podświetlenia będzie pasował do koloru słowa, więc pozostaje spójny z Twoim schematem.


0

Dlaczego nie tylko: z /

To podświetli bieżące słowo pod kursorem i wszystkie inne wystąpienia. I nie musisz wydawać osobnego polecenia dla każdego szukanego elementu. Może to nie jest dostępne w przeklętym gvimie? Domyślnie jest w Vimie.

* jest dobre tylko wtedy, gdy chcesz, aby kursor przeszedł do następnego wystąpienia. Podczas wizualnego porównywania dwóch rzeczy często nie chcesz, aby kursor się poruszał, i denerwujące jest naciskanie klawisza * za każdym razem.


Vim i gvim zwykle mają ten sam zestaw poleceń. W dokumentacji pomocy nie ma odniesienia do polecenia „z /”.
wds

Nie jest dostępny nie tylko w gvim, ale także w vimie. Właśnie to sprawdziłem - po prostu nie działa.
Ruslan,

z / działa, gdy używany jest ten skrypt wspomniany we wcześniejszej odpowiedzi .
fzzylogic

0
  1. Dodaj te linie do swojego ~/.vimrcpliku

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. Przeładuj ustawienia za pomocą :so%
  2. W normalnym modelu przejdź przez słowo.

  3. Naciśnij * Naciśnij klawisz F8, aby wyszukać rekurencyjnie poniżej całego projektu nad słowem


0

Na przykład te wtyczki:

Wystarczy wyszukać pod kursorem w vimawesome.com

Kluczem, jak wspomniano clagccs , jest to, że podświetlenie NIE koliduje z twoim wyszukiwaniem : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Zrzut ekranu pokazujący, jak NIE koliduje to z wyszukiwaniem: wprowadź opis obrazu tutaj Uwagi:

  • vim-illuminate podświetlenia domyślnie, na moim zrzucie ekranu przełączyłem się na podkreślenie
  • vim-illuminate domyślnie podkreśla / podkreśla słowo pod kursorem, na moim zrzucie ekranu go usuwam
  • moje schematy kolorów są bardzo szare. Sprawdź swoje, aby je dostosować.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.