Wie schalte ich "hlsearch" automatisch aus, nachdem ich mit der Suche fertig bin?


18

Ich mag die "hlsearch" -Einstellung, aber nachdem ich mit der Suche fertig bin, finde ich sie widerlich. Vor allem, wenn ich nach etwas suche, das viele Übereinstimmungen hat. Ich weiß, dass ich das mit ausschalten kann

:set nohlsearch

Aber das dauert ganze 16 Tastenanschläge, und noch ärgerlicher ist, dass ich es für meine nächste Suche mit wieder einschalten muss

:set hlsearch    

Gibt es eine Möglichkeit, die Suche automatisch zu aktivieren, wenn ich mit der Suche beginne, und zu deaktivieren, wenn ich mit der Suche fertig bin? Wenn ich beispielsweise in den Einfügemodus wechsle oder den Text ändere, wird die Suche ohne zusätzliche Tastatureingaben deaktiviert?


3
Automatisch definieren.
Antony

@Antony Wie in, wenn ich Änderungen vornehme oder mich im Einfügemodus befinde, wird es ausgeschaltet, ohne dass ich irgendwelche Tasten drücken muss. Wenn ich mit /oder zu suchen beginne ?oder wenn ich noder drücke N, wird es eingeschaltet, ohne dass ich weitere Tasten drücken muss.
DJMcMayhem

1
Oh und definiere "erledigte" Suche
Christian Brabandt

1
:nno <BS> :set hls!\|set hls?<CR>- Eine Zeile, ein Tastendruck, Status-Feedback und keine zweite Vermutung, wann Sie Hervorhebungen wünschen oder nicht. Manchmal möchte ich beim Bearbeiten eine Markierung auf dem Bildschirm lassen. Manchmal mache ich das nicht, z. B. /als Bewegung mit einem Operator.
Antony

nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

Antworten:


25

Es gibt einen viel bequemeren Weg. Anstatt zu verwenden

:set nohlsearch

das schaltet eigentlich die hlsearch einstellung aus, benutze

:nohls

Dadurch wird die Suche nur so lange deaktiviert, bis Sie erneut suchen. Von: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.

Diese Lösung ist jedoch nicht perfekt, da Sie immer noch tippen müssen, :nohlswas nach jeder Suche mühsam ist. Sie können dies mit einem Mapping umgehen, z

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

Aber es gibt eine noch bessere Lösung! haya14busa / incsearch.vim . Dies ist zumindest meiner Meinung nach ein wesentliches Vim-Plugin. Das Hauptmerkmal ist, dass alle Suchtreffer in Echtzeit hervorgehoben werden, während Sie Ihren regulären Ausdruck eingeben. Beispielsweise:

Bildbeschreibung hier eingeben

Als sekundäre Funktion wird jedoch auch die Option bereitgestellt, die Suche sofort ein- und auszuschalten, wenn Sie die Suche starten / beenden. Um diese Funktion zu aktivieren, müssen Sie hinzufügen

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#)

zu deinem .vimrc.

Wenn Sie andere nZuordnungen haben, müssen Sie diese deaktivieren. Zum Beispiel hatte ich

nnoremap n nzz
nnoremap N Nzz

Diese beiden Zuordnungen sind nicht miteinander kompatibel!


Da Sie eine Selbstantwort machen, möchte ich vorschlagen, dass Sie auch ein weiteres Problem hinzufügen set hlsearch. Wenn Sie es definiert haben, wird es jedes Mal vimrcüberschrieben, :nohwenn Sie die Quelle angeben vimrc. Um das zu klären, habe ich if !&hlsearch | set hlsearch | endifin meinem vimrc. (Und dies ist ein weiteres Problem, das das Plugin löst.)
voraussichtlich

Keine Ahnung, scheint wie ein Haufen Code und Konfiguration für mich nicht viel Gewinn. Tatsächlich ist das Ziel Ihrer inkrementellen Suche schwieriger zu erkennen, sodass es für die schnelle Navigation weniger nützlich ist.
Antony

+1 für eine großartige Plugin-Antwortfrage und viel mehr!
RichVel

7

vim-cool ist ein einfaches Plugin, das genau dies tut.

Vim-cool deaktiviert die Hervorhebung der Suche, wenn Sie fertig sind, und aktiviert sie wieder, wenn Sie erneut suchen.

Es funktioniert ohne Remapping durch Verwendung der CursorMovedund InsertEnterautomatischen Befehle.


Diese Technik (unter Verwendung von Autobefehlen) ist viel besser als meine Antwort, und ich kann nicht glauben, dass ich nicht daran gedacht habe, als ich meine geschrieben habe. Upvote.
Rich

5

Ich benutze <Leader><Enter>als Abkürzung zu :noh. (Mein Anführer ist ,, so ist es ziemlich nah)

Dadurch werden die Markierungen bis zu Ihrer nächsten Suche deaktiviert.


3

Wie Sie bereits in Ihrer eigenen Antwort festgestellt haben , ist es weitaus effizienter, die Hervorhebung mit dem :nohlsearchBefehl (der abgekürzt werden kann) zu deaktivieren, :nohals die gesamte Funktion auszuschalten und sie bei der nächsten Suche wieder einzuschalten.

Wenn Sie die Hervorhebung bei jedem Wechsel iin den Einfügemodus deaktivieren möchten , können Sie eine einfache Zuordnung erstellen:

:nnoremap i :noh<cr>i

Es ist eine Übung für den Leser, ähnliche Zuordnungen für andere Befehle zu erstellen, deren Hervorhebung deaktiviert werden soll.


1

Es klingt vielleicht dumm oder naiv, aber wenn ich die Hervorhebung beenden möchte, suche ich nach einer zufälligen Zeichenfolge, die (mit ziemlicher Sicherheit) nicht im Dokument vorhanden ist. Etwas wie das:

/skljdfhadhfs

Zugegeben, es dauert ein paar Tastenanschläge, aber sie sind wirklich zufällig, so dass sie in kürzester Zeit eingegeben werden können.


1
Aber das macht nund Nfunktioniert nicht mehr, und auch Sachen wie :%s//somethingoder :g//something. Außerdem wird Ihr Suchverlauf unübersichtlich
DJMcMayhem

Ja, aber meine (wahrscheinlich falsche) Annahme ist, dass Sie sich auch nicht für diese bestimmte Suche interessieren, da Sie keine Hervorhebung mehr benötigen. Das Durcheinanderbringen des Suchverlaufs ist ein echtes Problem, wenn man sich darauf verlässt.
Kostas

0

Ich benutze <Leader><Enter>als Abkürzung :hlsund habe meinen Anführer als Leerzeichen gesetzt.

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

Nach der Suche wird ein Element hervorgehoben. Um es auszuschalten, drücken Sie <Space><Esc>. Wenn Sie die Suchergebnisse erneut anzeigen möchten, klicken Sie auf <Space><Esc>. Die hls!Mittel ordnen diese Tastenbelegung zu, um die Einstellung für hls(Kurzform für hlsearch, dh Hervorheben von Suchergebnissen) !umzuschalten (damit die Einstellung direkt davor umgeschaltet wird).


0

Ich fand es intuitiver, das Ctrl- repaint Lneu zuzuordnen, um Folgendes einzuschließen :nohls:

nnoremap <C-L> :nohls<cr><C-L>

Willkommen bei Vi und Vim ! Vielen Dank, dass Sie Ihr Wissen über eine zugegebenermaßen alte Frage weitergeben. Wie Sie vielleicht bemerkt haben, werden Antworten von hoher Qualität in der Regel mit einer Erklärung der Funktionsweise des Codes geliefert (dies ist besonders hilfreich für neuere Vimmer, die möglicherweise ohne viel Wissen hier landen). Es kann auch eine gute Idee sein, die entsprechenden :helpAbschnitte zu lesen!
D. Ben Knoble vor

-1

Fügen Sie dieses Makro Ihrem .vimrc hinzu

map #h :set hls!<CR>

Auf diese Weise können Sie das Hilighting mit #h umschalten


Dies ist nicht anders als die Antwort von James Affleck.
Jamessan

Meins scheint prägnanter zu sein.
Darrel Lee

Warum ist Prägnanz relevant? Der andere Beitrag enthält weitere Informationen zur Bedeutung der Teile des Befehls, und dieser Beitrag enthält keinen zusätzlichen Inhalt.
Jamessan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.