Was ist der funktionale Unterschied zwischen: nohlsearch und: set nohlsearch?

13

Mir ist aufgefallen, dass wenn ich das benutze :nohlsearch, es eigentlich nicht dasselbe macht wie :set nohlsearch.

Insbesondere wird die hlsearchEinstellung nicht tatsächlich ausgeschaltet (was das ist, was :set hlsearch) bewirkt.

Um zu demonstrieren, was ich meine:

:set hlsearch
:nohlsearch
:echo &hlsearch

Dieser druckt 1( hlsearch ist noch eingestellt! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Dies wird gedruckt, 0weil wir die Suche mit der Standardmethode zum Ausschalten einer Einstellung in vim ausgeschaltet haben.

Ich frage mich also, ob es einen Grund geben muss, warum das :nohlsearchEx-Kommando existiert.

Der Grund, warum es mich interessiert, ist, dass ich jetzt in meinem VIM-Skript testen muss, ob das Such-Highlight aktiv ist, und da ich :nohlsearchin meinem anderen Skript anstelle von ": set nohlsearch" verwendet habe, &hlsearchkehrt mein Test immer zurück 1. Ich frage mich also, was ich ändere, indem ich den nohlsearchex-Befehl nicht mehr benutze .

Steven Lu
quelle

Antworten:

15

Von :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Hält die Markierung für die Option 'hlsearch' an. Es
                        wird bei Verwendung einer Suche automatisch wieder aktiviert
                        Befehl, oder setzen Sie die Option 'hlsearch'.
                        Dieser Befehl funktioniert in einem Autobefehl nicht, weil
                        Der Hervorhebungsstatus wird gespeichert und wiederhergestellt, wenn
                        autocommands ausführen autocmd-searchpat.
                        Dasselbe gilt für den Aufruf einer Benutzerfunktion.

Der entscheidende Punkt ist, dass die Hervorhebung automatisch wieder aktiviert wird, wenn Sie eine neue Suche starten. :set nohlsearchDas hlsearchheißt, wenn Sie das nächste Mal nach etwas suchen, erfolgt keine Hervorhebung.

Beispiel: Angenommen, es hlsearchist aktiviert . Wenn Sie derzeit in einem Puffer nach "Hallo" suchen, werden alle "Hallo" -Elemente hervorgehoben. Wenn Sie :nohlsearchnichts verwenden, wird dies hervorgehoben. Wenn Sie dann nach "world" suchen, werden alle "world" hervorgehoben. Wenn Sie set nohlsearchstattdessen "world" verwendet hätten, würde dies nicht hervorgehoben.


Beachten Sie auch, dass dieser Befehl in einer Benutzerfunktion im Grunde nichts bewirkt. Beispielsweise,

function! NoHlsearch()
    nohlsearch
endfunction

hat keinen sichtbaren Effekt beim Laufen.


Um festzustellen, ob hlsearch tatsächlich aktiv ist, möchten Sie die Variable überprüfen v:hlsearch. Wenn die v:hlsearch = 0Hervorhebung deaktiviert ist und wenn die v:hlsearch = 1Hervorhebung aktiviert ist. Sie sollten wahrscheinlich sicherstellen, dass die &hlsearch = 1vor dem Überprüfen v:hlsearch.

Von :h v:hlsearch

                                        v: hlsearch hlsearch-Variable
v: hlsearch Variable, die festlegt, ob die Hervorhebung der Suche aktiviert ist.
                Sinnvoll nur, wenn 'hlsearch' aktiviert ist, was erfordert
                + extra_search. Das Setzen dieser Variablen auf Null verhält sich ähnlich
                : nohlsearch Befehl, es auf eins zu setzen verhält sich wie
                        let & hlsearch = & hlsearch
FDinoff
quelle
Können Sie aus einer Funktion heraus verdeutlichen, was Sie unter "im Grunde nichts" verstehen? Dies ist der Standard (die Suche wird vorübergehend nicht mehr hervorgehoben, bis die nächste Suche aufgerufen wird).
Steven Lu
Ich hoffe auch irgendwie, einen Weg zu finden, um auf das Flag zuzugreifen, das steuert, ob der Transient aktiv :nohlsearchist oder nicht ... Ich denke, in seiner Abwesenheit muss ich darauf zurückgreifen, alle :nohlsearchAnrufe mit einer Variablen zu verfolgen .
Steven Lu
@StevenLu siehe Änderungen.
FDinoff
Vielen Dank. Sieht aus wie der Code, den ich verwendet habe, um den Aspekt "im Grunde nichts zu tun" zu hacken, indem ich dies tue: nnoremap <silent> <expr> <boundkey> SearchHighlight()wo SearchHighlight()kann eine Zeichenfolge zurückgeben ":silent nohlsearch\<CR>". Danke auch für den v:hlsearchTipp, genau das, was ich gebraucht habe.
Steven Lu
1

Erfordert Ihr Skript, dass der aktuelle Status der Hervorhebung bekannt ist?

Um hlsearchnur für die aktuelle Suche auszuschalten , verwende ich Ctrl-lin meinem .vimrc:

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

Die Hervorhebung der Suche kehrt bei der nächsten Suche zurück, wenn der obige Befehl verwendet wird. Ctrl-lDies ist praktisch, da der normale Gebrauch darin besteht, den Bildschirm zu löschen und neu zu zeichnen.

Um den Hervorhebungsstatus der Suche dauerhaft zu ändern, verwende ich F3 als Umschalter:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
Dieser Alte
quelle