Vim wyczyść wyróżnienie ostatniego wyszukiwania


1903

Po przeszukaniu w Vimie podświetlam wszystkie wystąpienia. Jak mogę to wyłączyć? Teraz ponownie szukam czegoś bełkotu, którego nie można znaleźć.

Czy istnieje sposób na tymczasowe wyłączenie podświetlenia, a następnie ponowne włączenie go, gdy zajdzie taka potrzeba?


197
Myślę, że rozwiązanie „nnoremap <esc>: noh <return> <esc>” jest bardziej kompletną odpowiedzią na pytanie - umieszczając to w .vimrc, możesz po prostu nacisnąć <esc> po wyszukiwaniu, aby usunąć zaznaczenie z poprzedniego wyszukiwania (ale nie wyłączaj podświetlania na dobre).
Stewart Johnson,

5
: set invhlsearch wyłączy podświetlanie, jeśli jest już podświetlone, i włącz je, jeśli nie jest. Możesz zmapować go, by powiedzieć Shift-H.
puffadder

1
@StewartJohnson robi to w moich plikach .vimrc wydaje się zakłócać / przerywać: set mouse = a. Jakieś pomysły dlaczego? Ten błąd występuje tylko w iTerm2
Charlie Parker

20
@StewartJohnson Bądź ostrożny! Twój najwyżej oceniany komentarz z mapowaniem powoduje błędy i nieoczekiwane zachowanie opisane w komentarzach do stackoverflow.com/a/1037182/1698467
skywinder

3
nnoremap <esc> :noh<return><esc>Rozwiązanie sugerowane przez @StewartJohnson działa ładnie w GUI vim, ale powoduje problemy z klawiszami strzałek i innych klawiszy ESC zakodowane przy uruchamianiu vim w terminalu. Nie należy umieszczać go w ~/.vimrc bez zawijania w if has('gui_running')... end.
jbyler

Odpowiedzi:


1586

Aby wyłączyć wyróżnianie do następnego wyszukiwania:

:noh

Lub całkowicie wyłącz wyróżnianie:

set nohlsearch

Lub, aby przełączyć:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

14
Wykonując set nohlsearch, podświetlanie powraca po ponownym uruchomieniu vima. :nohdziała lepiej.
Dharmit

21
denerwujące jest to, że wyszukiwanie bełkotliwego ciągu: / oajf3w9 może być tak samo szybkie, jak wpisanie: noh. Podoba mi się rozwiązanie @ avocade polegające na mapowaniu klawisza spacji na: noh
nnyby

160
Nie wynika to jasno z tej odpowiedzi i komentarzy: zwróć uwagę, że set nohlsearchwyłączy to również podświetlanie dla kolejnych wyszukiwań. Zachowanie :nohjest bardzo różne: podświetlenie zostanie automatycznie ponownie włączone, gdy przeprowadzasz nowe wyszukiwanie lub nawet gdy robisz coś związanego z bieżącym wyszukiwaniem (np. Kiedy piszesz, naby przejść do następnego elementu).
Skippy le Grand Gourou,

10
Brak wyjaśnienia, co one faktycznie robią i jakie są konsekwencje. Dzięki @SkippyleGrandGourou za wyjaśnienie niektórych z nich.
Jason S

3
Dla tego, co jest warte, odwzorowuję to '\/'(lub cokolwiek to jest Twój przywódca):map <Leader>/ :nohlsearch<CR>
brianmearns

689

Z dokumentacji VIM

Aby wyczyścić ostatnio używany wzorzec wyszukiwania:

:let @/ = ""

To nie ustawi wzorca na pusty ciąg, ponieważ pasowałby wszędzie. Wzór jest naprawdę wyczyszczony, tak jak podczas uruchamiania Vima.


129
... co byłoby lepszym rozwiązaniem jego problemu, jak rozumiem.
Shaun Bouckaert

8
Właśnie tego szukałem! Głosowałem za tym, pytanie jest nieco niejasne. Doprowadziło mnie to do wniosku, że właśnie tego chciał: „Teraz ponownie szukam czegoś bełkotu, którego nie można znaleźć”. Ponieważ to właśnie robiłem, aby wyczyścić wyszukiwanie, ale nie wyłączać go, aby kolejne wyszukiwanie ponownie się podświetliło.
claytron

50
O to myślałem, że chodziło o pytanie ... oto polecenie, które wydałem, aby przyspieszyć czyszczenie szukanego ciągu (a tym samym usunąć wszystkie podświetlenia): :command C let @/=""Użycie tego pozwala na wpisanie, :Caby wyczyścić szukany ciąg ... bardzo szybko i nie wpływa na przyszłe wyszukiwanie ani wyróżnianie.
Jason

12
@ jcreamer898, patrz pomoc vima na temat „register” ( :he registers). Vim ma kilka różnych wbudowanych rejestrów, które przechowują tekst, czasem dla szarpanych danych, czasami dla ostatniego wyszukiwania itp. Podczas wyszukiwania, vim umieszcza wzorzec w rejestrze „/”, do którego się odwołujesz @/. Możesz także przypisać wartości do rejestrów, używając @regname=valuegdzie gdzie regnamejest nazwa rejestru. Po @/=""prostu ustawia rejestr „/” na pusty ciąg znaków (z wyjątkiem tego, że dla rejestru „/” vim wyczyści ostatnie wyszukiwanie, jeśli zawiera pusty ciąg).
Ben Davis,

3
Dodaj to do swojego .vimrc, aby uzyskać Ctrl + /, aby wyczyścić ostatnie wyszukiwanie: noremap <silent> <c-_> :let @/ = ""<CR>
angrydust

583

Możesz to zrobić

:noh

lub :nohlsearchtymczasowo wyłączyć podświetlanie wyszukiwania do następnego wyszukiwania.


3
dzięki, to było pomocne ... jakieś polecenie powrotu do podświetlenia?
Gabriel Solomon

17
: nohs po prostu wyłącza bieżące podświetlanie. Jeśli masz: ustaw hlsearch, a następnie podświetli twoje wyszukiwania.
greyfade

6
Myślę, że tego właśnie szukał PO (choć odpowiedź Shauna również działa). Głosuję za tym, że jestem niższy. Wiem, że zaakceptował odpowiedź nohlsa, ale jej ustawienie spowoduje wyłączenie podświetlenia wszystkich wyszukiwań, nawet jeśli później spróbuje się innego wyszukiwania.
Thiago Arrais

5
Prawdopodobnie tego właśnie chciał PO i jest to najkrótsza, najlepsza odpowiedź IMHO.

Doskonałość jest osiągalna nawet w tym śmiertelnym królestwie! Użyję tego więcej niż: help i nie chcę zanieczyszczać <esc>: nnoremap <F1>: noh <CR>
Sam Watkins

305

Znalazłem tę odpowiedź lata temu na vim.org:

Dodaj następujące elementy do pliku .vimrc:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

Dlatego po zakończeniu wyszukiwania naciśnij ponownie klawisz Return w trybie poleceń, a podświetlenie zniknie.


36
Myślę, że jest to znacznie lepsze rozwiązanie niż to, które faktycznie zostało zaakceptowane - albo to jedno, albo drugie, w którym zamiast tego jest mapowane na <ESC>.
Stewart Johnson,

20
Jest to znacznie lepsza odpowiedź na „nnoremap <esc>: noh <return> <esc>”, ponieważ nie powoduje dziwnego zachowania.
Dennis

19
Ważną rzeczą do zapamiętania, upewnij się, że nie umieszczasz żadnych komentarzy po prawej stronie remapu. Będą one interpretowane jako polecenia remapu, a nie komentarze.
codybuell,

13
Komentarz jest błędny; komenda powoduje nie rozbroić ostatniego wyszukiwania wzorca, ale po prostu się wyłącza podświetlenie aktualnych wyników; możesz nacisnąć, naby znaleźć następne wystąpienie (które zostanie ponownie podświetlone). BTW, podczas pisania skryptów unikałbym skróconej formy i zamiast tego pisałem :nohlsearch.
Tobias

28
Dodaj <silent>, aby uniknąć migania wyświetlacza i pozostawienia nic w wierszu poleceń -: nnoremap <silent> <CR>: nohlsearch <CR> <CR>
Peter N Lewis

137

Od http://twitter.com/jonbho/status/2194406821

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[

Druga linia jest potrzebna do mapowania na klawisz Escape, ponieważ Vim wewnętrznie używa Esc do reprezentowania specjalnych klawiszy.


12
Żeby było jasne, pozwala to wyczyścić podświetlanie wyszukiwania, naciskając klawisz Escape
Gavin Miller

7
Z jakiegoś powodu powoduje to, że mój terminal vim uruchamia się tak, jakby naciśnięto „c”. Jakieś pomysły?
Jakub

31
Spowodowało to pewne dziwne zachowanie, kiedy próbowałem: przy starcie regularne ruchy vima (np. J, k) powodowałyby usunięcie linii. nnoremap <CR>: noh <CR> <CR> nie spowodował tych problemów. Nie mogłem wyśledzić przyczyny.
oasisbob

9
hmm, miałem taki sam problem jak te powyżej. Nie używaj tego w obecnym stanie bez testowania, chyba że lubisz usuwać tekst losowo ...
Derek Litz

8
użycie „nnoremap <esc>: noh <powrót> <esc>” powoduje, że vim zawsze zaczyna się w trybie „WYMIANY”.
user1850133

38

Moje oryginalne rozwiązanie (poniżej) było brudne i marnotrawne. Teraz używam:noh

Podobnie jak wiele funkcji w Vimie, właściwa droga często nie jest łatwa do wykrycia.

-

(NIE RÓB TEGO)

Wyszukaj mało prawdopodobną sekwencję znaków (zacieraj klawisze w wierszu głównym):

/;alskdjf;

Działa to w vimie i mniej, i łatwiej jest zapamiętać / wpisać niż logicznie czystsze rozwiązanie @ ShaunBouckaert „aby usunąć ostatnio używany wzorzec wyszukiwania”:

:let @/ = ""

Potencjalnym minusem jest to, że dodaje śmieci do historii wyszukiwania.


17
Jest to nie tylko brudne rozwiązanie (którego sam do tej pory używałem, bez obrazy), ale kolejną wadą jest to, że dodaje brzydki czerwony sztandar z napisem „nie znaleziono wzoru” w dolnej części okna, co jest prawie tak denerwujące jak wyróżnienie i wymaga odrzucenia dalszych działań (np. „szukaj + backspace”).
Skippy le Grand Gourou,

5
Może to również potrwać kilka sekund, ponieważ faktycznie przeszukuje całą resztę pliku. To naprawdę denerwujące, jeśli plik jest duży. Oczywiście możesz zaznaczyć swoją obecną pozycję, przeskoczyć na początek i wyszukać postać do tyłu, ale to również jest brudne.
Blacklight Shining

5
Jest to rozwiązanie, z którego większość skorzysta przed zapoznaniem się z :nohlpoleceniem. Gdy dowiedziałem się o tym drugim, natychmiast przestałem wyszukiwać.
Tobias

7
To nie jest odpowiedź; po prostu zaleca zrobienie tego, co już robi OP: „Teraz szukam czegoś bełkotu, którego nie można znaleźć”.
Przywróć Monikę - notmaynard

2
Jeśli chcesz mieć niezawodny i krótki wzór, po prostu użyj /$4. Jest nie tylko mało prawdopodobne, aby coś do siebie pasowało, ale w rzeczywistości NIEMOŻLIWE. $zawsze musi następować nowa linia lub być końcem pliku, a 4 nie jest ani nową linią, ani końcem pliku. (Powodem 4 jest po prostu to, że ma ten sam klawisz, więc bardzo łatwo jest szybko pisać)
średnik

32

Zmapowany do mojego pliku .vimrc.local, szybki i brudny, ale bardzo funkcjonalny:

" Clear last search highlighting
map <Space> :noh<cr>

32
nnoremap <cr> :noh<CR><CR>:<backspace>

W ten sposób pozbywam się :nohpokazanego w wierszu poleceń, gdy uderzamenter po wyszukiwaniu.

:przypomina rozpoczęcie wprowadzania nowego polecenia, Backspaceusuwa je i przenosi fokus z powrotem do okna edytora.


6
Dziękuję Ci. Pojawiające się w lewym dolnym rogu „: noh” doprowadzało mnie do szaleństwa, cholerna OCD.
andrewtweber

Próbowałem zmapować go do przesuniętego cr, wykonując nnoremap <S-cr>: noh <CR> <CR>, ale to nie działało, czy wiesz, dlaczego może nie działać?
Charlie Parker

Podejrzewam, że nie można łączyć zmiany z powrotem, ale szczerze mówiąc nie mam pojęcia.
sjas

@CharlieParker IIRC możesz używać tylko Shift On [a-z]i takich znaków.
sjas,

7
Zamiast robić :<Backspace>, wystarczy dodać <silent>po nnoremappowiedzieć Vima nie wyświetla żadnych wyjście w obszarze poleceń: nnoremap <silent> <cr> :noh<CR><CR>.
Soren Bjornstad

31

Odpowiedzi proponujące :nohlub :nohlsearch(np. Matt McMinn) są poprawne tymczasowo wyłączenia podświetlania wyszukiwania - zgodnie z pierwotnym pytaniem.

Pomyślałem, że przyczynię się do mapowania, które uważam za przydatne w trybie normalnym:

nnoremap <C-L> :nohlsearch<CR><C-L>

Domyślnie CtrlLw Vimie czyści i przerysowuje ekran. Wiele programów wiersza poleceń (głównie tych korzystających z biblioteki GNU Readline , takich jak Bash) używa tej samej kombinacji klawiszy, aby wyczyścić ekran. Ta funkcja jest przydatna w sytuacji, gdy proces działający w tle drukuje do terminala, zastępując części procesu pierwszego planu.

To mapowanie w trybie normalnym usuwa również podświetlenie ostatniego wyszukiwanego terminu przed przerysowaniem ekranu. Uważam, że dwie funkcje się uzupełniają i wygodnie jest używać jednej CtrlLz nich dla obu akcji razem, zamiast tworzyć osobne mapowanie w celu wyłączenia podświetlania wyszukiwania.

Uwaga: noremap zamiast tego używane jest mapodwzorowanie rekurencyjne.

Wskazówka: Zwykle remap Caps Lockaby Ctrlułatwić wpisywanie takich kombinacji klawiszy; szczegółowe informacje na ten temat zależą od wybranego przez ciebie systemu operacyjnego / systemu okien (i są nie na temat tej odpowiedzi). Zarówno Poniższe wskazówki zawierają informacje na temat mapowania Caps Lockaby Ctrljak Esc:


26

Zazwyczaj odwzorowuję :nohklawisz odwrotnego ukośnika. Aby ponownie włączyć podświetlanie, wystarczy nacisnąć n, a podświetli się ponownie.


24

Wyłącz podświetlanie wyszukiwania na stałe

Dopasowania nie będą podświetlane przy każdym wyszukiwaniu za pomocą /

:set nohlsearch

Wyczyść zaznaczenie do następnego wyszukiwania

:noh

lub :nohlsearch(usuwa do momentu naciśnięcia nlub N)


Wyczyść zaznaczenie po naciśnięciu ESC

nnoremap <esc> :noh<return><esc>

Usuń zaznaczenie po naciśnięciu innego klawisza lub mapy niestandardowej

  • Wyczyść podświetlenia po naciśnięciu \(ukośnik odwrotny)

    nnoremap \ :noh<return>
    
  • Wyczyść zaznaczenia po ESCdwukrotnym trafieniu

    nnoremap <esc><esc> :noh<return>
    

2
nnoremap <silent> <esc> :noh<return><esc>Rozwiązanie działa ładnie w GUI vim, ale powoduje poważne problemy z klawiszy strzałek i innych klawiszy ESC zakodowane przy uruchamianiu vim w terminalu. Nie należy umieszczać go w ~/.vimrc bez zawijania w if has('gui_running')... end. Zastanów się również nad dodaniem tego, <silent>co pozwala uniknąć flashowania :nohpolecenia na pasku stanu.
jbyler

17

Oto, czego używam (wyodrębniony z wielu różnych pytań / odpowiedzi):

nnoremap <silent> <Esc><Esc> :let @/=""<CR>

Przy „podwójnym” Escusuwasz podświetlenie, ale jak tylko zaczniesz szukać, podświetlenie pojawi się ponownie.


Inna alternatywa:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>

Według dokumentacji vima:

rozszczepienia ()

    Clears all matches previously defined by |matchadd()| and the

    |:match| commands.

Napotkałem kilka błędów w najlepszych rozwiązaniach, aby zaoszczędzić czas na wypróbowaniu wszystkich odpowiedzi. Skorzystaj z tego rozwiązania! Edytuj swój .vimrci wstaw w nim następujący wpis:nnoremap <silent> <Esc><Esc> :let @/=""<CR>
user1336087,

Ale tak mówi Oo. Może mógłbyś głosować?
Pablo Olmos de Aguilera C.

Popieram twoje rozwiązanie ... To jest najlepsze IMO ... I też go głosowałem .. :)
user1336087 11.08.16

1
Wyczyszczenie rejestru wyszukiwania za @/=""pomocą powoduje, że nnie działa, aby odzyskać wyszukiwanie. Wolę, aby :nohzachować poprzednie wyszukiwanie w rejestrze do ponownego użycia.
jbyler



8

Janus dla VIM i GVIM ma wiele upieczonych rzeczy dla newbów takich jak ja, w tym

<leader>hs - toggles highlight search

dokładnie tego potrzebujesz. Wystarczy wpisać \hsw trybie normalnym. (Klucz lidera jest odwzorowany na\ Domyślnie ).

HTH.



7

Wyłącz podświetlenie, gdy tylko poruszysz kursorem:

Zainstaluj vim-cool . Został stworzony, aby rozwiązać ten konkretny problem. Wyłącza podświetlanie, gdy tylko przesuniesz kursor. Ostrzegamy jednak, że wymaga najnowszej wersji vima!


6

Spowoduje to wyczyszczenie podświetlenia wyszukiwania po updatetimemilisekundach braku aktywności.

updatetimedomyślnie 4000ms lub 4s, ale ustawiłem mój na 10s. Ważne jest, aby pamiętać, że updatetimerobi to więcej niż tylko to, dlatego przeczytaj dokumentację przed zmianą.

function! SearchHlClear()
    let @/ = ''
endfunction
augroup searchhighlight
    autocmd!
    autocmd CursorHold,CursorHoldI * call SearchHlClear()
augroup END

6

Jeśli chcesz mieć możliwość szybkiego włączania / wyłączania podświetlania , możesz zmapować klucz

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

Po prostu włóż powyższy fragment do pliku .vimrc.

To najwygodniejszy sposób dla mnie, aby pokazać i ukryć wyróżnienie wyszukiwania za pomocą pojedynczego naciśnięcia klawisza

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją http://vim.wikia.com/wiki/Highlight_all_search_pattern_matches


5

Jeszcze jedno rozwiązanie, łącząc 2 najlepsze odpowiedzi:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>

Wyczyszczenie rejestru wyszukiwania za @/=""pomocą powoduje, że nnie działa, aby odzyskać wyszukiwanie. Wolę, aby :nohzachować poprzednie wyszukiwanie w rejestrze do ponownego użycia. Możesz się <F3>z tym powiązać za pomocąnnoremap <F3> :noh<CR>
jbyler


4

Po prostu używam poniższego prostego nohl i nie są potrzebne żadne wtyczki.

:nohl


4

Domyślam się, że pierwotne pytanie dotyczyło nie wyłączania podświetlania wyszukiwania, ale po prostu usuwania podświetlenia z ostatniego wyszukiwania. Rozwiązanie szukania bełkotliwego sznurka, o którym wspominał oryginalny plakat, jest tym, z którego korzystałem od jakiegoś czasu, aby wyczyścić wyróżnienia z poprzedniego wyszukiwania, ale jest brzydkie i kłopotliwe.

Kilka sugestii, które znalazłem w nnoremap ...~ / .vimrc, skutkuje wprowadzeniem vima w tryb zastępowania podczas uruchamiania, co wcale nie jest tym, czego chcę. Najprostszym rozwiązaniem, jakie znalazłem, jest dodanie linii

nmap <esc><esc> :noh<return>

do mojego ~ / .vimrc. Jest to zgodne z zasadą KISS i nie koliduje z klawiszami strzałek, co robi pojedyncze użycie <esc>. Podwójny <esc> jest wymagany w trybie poleceń (lub trzykrotny <esc> z trybu wstawiania lub zastępowania), aby wyczyścić podświetlanie z poprzedniego wyszukiwania, ale z perspektywy interfejsu użytkownika sprawia, że ​​operacja jest tak prosta, jak to możliwe.


Co rozumiesz przez pojedyncze <esc> ingerujące w klawisze strzałek?
hansmosh

1
@hansmosh Patrz unix.stackexchange.com/questions/28713/ ... Używam dwóch linii w moim .vimrc w następujący sposób nmap <esc><esc> :noh<return> - to turn off search highlighting and nmap <esc>` :set hlsearch<return> - to turn on search highlighting
Lindsay Haisley

4

Używam następujących w moim ~/.vimrc

nnoremap <Leader><space> :noh<Enter>

Dzięki temu bardzo łatwo i szybko można wyczyścić bieżące wyróżnione wyszukiwanie. Mój klawisz lidera jest przypisany do mapy, \dzięki czemu operacja jest bardzo łatwa do wykonania za pomocą mojego prawego różowego palca i kciuka.


3

Myślę, że miksowanie @ShaunBouckaert i Mar 19 '09 o 16:22 to dobry kompromis:

" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

Naciśnij, Entera podświetlony tekst nie jest już podświetlony, a podświetlanie wyszukiwania jest nadal włączone.


3

możesz użyć : noremap, aby włączyć / wyłączyć wynik wyszukiwania, w ten sposób

:noremap <F3> :set hls! hls?<CR>


3

W oparciu o odpowiedź @ baruch-even, możesz usunąć wyszukiwane hasło po ESCdwukrotnym naciśnięciu w trybie normalnym za pomocą:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[

Myślę, że drugie wiązanie jest OK, ale pierwsze jest niebezpieczne. Ponowne mapowanie <esc>działa dobrze w GUI vim, ale powoduje poważne problemy z klawiszami strzałek i innymi kluczami zakodowanymi w ESC podczas uruchamiania vima w terminalu. Nie należy umieszczać go w ~/.vimrc bez zawijania w if has('gui_running')... end. Zastanów się również nad dodaniem tego, <silent>co pozwala uniknąć flashowania :nohpolecenia na pasku stanu.
jbyler

1

Też mi się nie podoba. Ciągłe wchodzenie w grę było dla mnie męczące :nohl... więc umieściłem w nim następujące mapowanie.vimrc

noremap <C-_> :nohl<cr>:<backspace>

Pierwszy bit ( :nohl<cr>) usuwa podświetlenie; drugi bit ( :<backspace>) to podstęp do wyczyszczenia linii poleceń. Wyszukiwanie jest nadal w tle, więc jeśli po prostu klikniesz n, ponownie je podświetli i zabierze Cię do następnego wystąpienia.


1

Dodałem to do mojego vimrcpliku.

command! H let @/=""

Po zakończeniu wyszukiwania i chcesz usunąć zaznaczenia z wyszukiwania, po prostu zrób :H


1

Alternatywnie możesz dodać mapowanie do pliku .vimrc jako,

nmap <C-N>: nohlsearch

a następnie możesz nacisnąć

Ctrl + N

w dowolnym momencie, aby usunąć podświetlony tekst


Proszę edytować swoje odpowiedzi, aby zapewnić, że poprawia po innych odpowiedzi już obecnych w tej kwestii.
hongsy
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.