Jak automatycznie wyłączyć „hlsearch” po zakończeniu wyszukiwania?

19

Uwielbiam ustawienie „hlsearch”, ale po zakończeniu wyszukiwania uważam, że jest to okropne. Zwłaszcza jeśli szukam czegoś, co ma wiele dopasowań. Wiem, że mogę to wyłączyć

:set nohlsearch

Ale zajmuje to całe 16 naciśnięć klawiszy, a co bardziej denerwujące, muszę włączyć go ponownie podczas następnego wyszukiwania za pomocą

:set hlsearch    

Czy istnieje sposób, w jaki hlsearch może automatycznie włączać się, gdy zaczynam wyszukiwanie, i wyłączać, gdy wyszukiwanie jest zakończone? Na przykład, jeśli wejdę w tryb wstawiania lub zmodyfikuję tekst, czy wyszukiwanie hl wyłączy się bez dodatkowych naciśnięć klawiszy?

DJMcMayhem
źródło
3
Zdefiniuj automatycznie.
Antony,
@Antony Jak w przypadku, gdy dokonam edycji lub w trybie wstawiania, wyłączy się bez konieczności naciskania jakichkolwiek przycisków. Jeśli zacznę wyszukiwać za pomocą /lub ?, lub jeśli naciśnie nlub N, włączy się bez konieczności naciskania kolejnych przycisków.
DJMcMayhem
1
Aha i zdefiniuj wyszukiwanie „zrobione”
Christian Brabandt
1
:nno <BS> :set hls!\|set hls?<CR>- jedna linia, jedno naciśnięcie klawisza, informacja zwrotna o stanie i nie próbuje odgadnąć, kiedy możesz chcieć wyróżnić. Czasami chcę wyróżnić pozostawione na ekranie podczas edycji. Czasami tego nie robię, np. Używam /jako ruchu z operatorem.
Antony
nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

Odpowiedzi:

26

Jest o wiele wygodniejszy sposób. Zamiast używać

:set nohlsearch

który faktycznie wyłącza ustawienie hlsearch, użyj

:nohls

Spowoduje to wyłączenie hlsearch aż do ponownego wyszukiwania. Od:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

Jednak to rozwiązanie nie jest idealne, ponieważ :nohlspo każdym wyszukiwaniu wciąż musisz wpisać, co jest uciążliwe. Można to obejść za pomocą mapowania, np

nnoremap <esc><esc> :silent! nohls<cr>

Ale jest jeszcze lepsze rozwiązanie! haya14busa / incsearch.vim . Jest to, przynajmniej moim zdaniem, niezbędna wtyczka vim. Główną cechą jest to, że wszystkie dopasowania wyszukiwania są podświetlane w czasie rzeczywistym podczas pisania wyrażenia regularnego. Na przykład:

wprowadź opis zdjęcia tutaj

Jednak dodatkową funkcją, która jest również dostępna, jest opcja natychmiastowego włączania i wyłączania hlsearch po uruchomieniu / zatrzymaniu wyszukiwania. Aby włączyć tę funkcję, musisz dodać

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

do twojego .vimrc.

Jeśli masz jakieś inne nmapowania, musisz je wyłączyć. Na przykład kiedyś miałem

nnoremap n nzz
nnoremap N Nzz

Te dwa mapowania nie są ze sobą kompatybilne!

DJMcMayhem
źródło
Ponieważ robisz to samo, chciałbym zasugerować, że dodasz również inny problem set hlsearch. Jeśli masz to zdefiniowane vimrc, nadpisze to za :nohkażdym razem, gdy je pozyskasz vimrc. Aby to rozwiązać, mam if !&hlsearch | set hlsearch | endifw sobie vimrc. (I to kolejny problem, który rozwiązuje wtyczka.)
grochmal
Dunno, wydaje mi się, że to cała kupa kodu i konfiguracji, dla mnie niewiele. W rzeczywistości cel wyszukiwania przyrostowego jest trudniejszy do zauważenia, przez co jest mniej przydatny do szybkiej nawigacji.
Antony,
+1 za świetną wtyczkę odpowiadającą na pytanie i robiąc wiele więcej!
RichVel
7

vim-cool to prosta wtyczka, która właśnie to robi.

Vim-cool wyłącza podświetlanie wyszukiwania po zakończeniu wyszukiwania i włącza je ponownie podczas ponownego wyszukiwania.

Działa bez manipulowanie przy użyciuCursorMoved i InsertEnterautokomend.

Jon Parise
źródło
Ta technika (używanie komend automatycznych) jest znacznie lepsza niż moja odpowiedź i nie mogę uwierzyć, że nie pomyślałem o tym, kiedy napisałem swoją. Głosuj.
Bogaty
5

Używam <Leader><Enter>jako skrótu do :noh. (Mój lider jest ,, więc jest bardzo blisko)

Spowoduje to wyłączenie wyróżnień do następnego wyszukiwania.

Amit Gold
źródło
3

Jak już zauważyłeś we własnej odpowiedzi , o wiele bardziej efektywne jest wyłączenie wyróżniania za pomocą :nohlsearchpolecenia (które można skrócić :noh) zamiast wyłączania całej funkcji, a następnie włączania jej ponownie przy następnym wyszukiwaniu.

Jeśli chcesz wyłączyć podświetlanie za każdym razem, igdy wchodzisz w tryb wstawiania, możesz utworzyć proste mapowanie, aby to zrobić:

:nnoremap i :noh<cr>i

Pozostawia to czytelnikowi ćwiczenie do tworzenia podobnych odwzorowań dla innych poleceń, w których chcą wyłączyć podświetlanie.

Bogaty
źródło
2

Może to zabrzmieć głupio lub naiwnie, ale to, co robię, gdy chcę zatrzymać podświetlanie, to szukam losowego ciągu, który (praktycznie na pewno) nie jest obecny w dokumencie. Coś takiego:

/skljdfhadhfs

To prawda, że ​​wymaga kilku naciśnięć klawiszy, ale są one naprawdę losowe, więc można je pisać w mgnieniu oka.

Kostas
źródło
1
Ale to powoduje ni Njuż nie działa, a także rzeczy takie jak :%s//somethinglub :g//something.
Zaśmieca
Tak, ale moje (prawdopodobnie niepoprawne) założenie jest takie, że skoro nie musisz już więcej zaznaczać, nie przejmujesz się także tym konkretnym wyszukiwaniem. Zaśmiecanie historii wyszukiwania jest prawdziwym problemem, jeśli się na niej opiera.
Kostas
1

Przekonałem się, że bardziej intuicyjne jest odwzorowanie Ctrl- Lodmalowanie obejmuje :nohls:

nnoremap <C-L> :nohls<cr><C-L>
DanG
źródło
Witamy w Vi i Vimie ! Dziękujemy za podzielenie się swoją wiedzą na temat, co prawda, starego pytania. Odpowiedzi o wysokiej jakości, jak zapewne zauważyliście, zazwyczaj zawierają wyjaśnienie tego, co robi kod (jest to szczególnie przydatne dla nowszych vimerów, którzy mogą tu wylądować bez dużej wiedzy). Może to być również dobry pomysł na odpowiednie :helpsekcje!
D. Ben Knoble,
0

Używam <Leader><Enter>jako skrótu do :hlsmojego lidera i ustawiam go jako spację.

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

Po wyszukaniu element zostanie podświetlony, aby go wyłączyć, naciśnij <Space><Esc>. A jeśli zdecydujesz, że chcesz ponownie wyświetlić wyniki wyszukiwania, naciśnij <Space><Esc>. Te hls!środki wiążące map ten przycisk, aby włączyć ustawienie hls(skrótem hlsearch, czyli wynik wyszukiwania podświetlanie) (tak !przełącza prawo ustawienie przed nią).

James Affleck
źródło
-1

Dodaj to makro do swojego .vimrc

map #h :set hls!<CR>

Umożliwi to przełączanie hilightingu za pomocą #h

Darrel Lee
źródło
Nie różni się to od odpowiedzi Jamesa Afflecka.
jamessan,
Mój wydaje się bardziej zwięzły.
Darrel Lee
Dlaczego zwięzłość jest ważna? Drugi post zawiera więcej informacji o tym, co oznaczają poszczególne części polecenia, a ten post nie zawiera żadnej dodatkowej treści.
jamessan