Wie verhindere ich, dass VIM nach einem Austausch Übereinstimmungen hervorhebt?


13

Ich habe set hlsearchin meinem ~/.vimrc. Dies ist normalerweise sehr nützlich, aber es ist ärgerlich, dies :nohnach einem Ersetzen wie '<,'>s/$/',/(das das Ende jeder Zeile hervorhebt, nachdem ich sie ausgeführt habe) tun zu müssen . Wie komme ich dazu, vimnach dem Ersetzen nicht hervorzuheben?

Ich bin auf Ubuntu 9.04 mit vim7.2. Ich habe das gleiche Problem unter OS X 10.6 (auch vim7.2). Etwas, das auf beiden funktionieren würde, wäre wünschenswert.

UPDATE: Bei allen Antworten, die ich erhalten habe, muss nur eine Tastenzuordnung :noh(oder eine Entsprechung) hinzugefügt werden . Ich versuche wirklich, benutzerdefinierte Schlüsselverhalten zu vermeiden, an die ich mich wirklich gewöhnt hätte, aber dann versage ich kläglich ohne sie (z. B. am Computer eines Freundes usw.). Ich möchte nach einem Austausch vimautomatisch tun :noh. Das heißt, ich möchte nur hlsearchbei der Verwendung /oder *(vielleicht ein paar andere Fälle), aber nicht zu anderen Zeiten.

Antworten:


7

Wenn Sie die Funktion nicht dauerhaft deaktivieren möchten, können Sie eine Taste drücken, um die Hervorhebung umzuschalten, wie in dieser Antwort auf eine ähnliche Frage zum Stapelüberlauf vorgeschlagen.

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

Wenn Sie die Hervorhebung dauerhaft deaktivieren möchten:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(aus den VIM FAQ )


2
Ich war mir dieser Option bewusst. Das Problem ist, dass ich normalerweise nicht nach dem suche , was ich ersetzen möchte. Daher ist es in den meisten Fällen sinnlos, hervorzuheben, was ich ersetze. Allerdings ist es sehr nützlich, wenn ich bin die Suche nach etwas, so dass ich es nicht will , geht vollständig weg.
Benjamin Oakes

@ Benjamin: Du hast implizit danach gesucht. Das ist was: s macht. Sucht nach einem Muster und führt dann eine Transformation für die Übereinstimmung (en) durch. Verwenden von: nohl ist die richtige Lösung, da es die Hervorhebung des aktuellen Suchmusters ausschaltet, bis die nächste Suche durchgeführt wird. Dies geschieht, ohne den Status der Option 'hlsearch' zu ändern oder den gespeicherten Wert des vorherigen Suchbegriffs zu beeinflussen.
Jamessan

2
@ Jamessan: Ich verstehe, dass es ein Suchen und Ersetzen ist. Es ist nur so, dass ich es dann nicht hervorheben muss. Vor allem ein Ärger.
Benjamin Oakes

Vor einiger Zeit habe ich begonnen, die Hervorhebung standardmäßig zu deaktivieren und zu aktivieren, wenn ich es möchte, wie Sie vorgeschlagen haben. Immer noch nicht perfekt, aber es ist besser.
Benjamin Oakes

9

Ich habe zwei verschiedene Lösungen, beide ziemlich gut, jede mit einem differenzierten Verhalten. Mein Favorit ist Option 2:

  1. Ich habe die folgenden 2 Zeilen in meinem .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Der erste wartet auf eine Zeitüberschreitung (nicht konfigurierbar), wenn sich der Cursor nicht bewegt und die Suche deaktiviert. Der zweite schaltet es wieder ein, wenn sich der Cursor wieder bewegt.

    Es ist keine perfekte Lösung, aber es funktioniert für mich (und wird nahezu perfekt sein, wenn das Timeout konfigurierbar ist - im Moment ist das Timeout an einen eingebauten Timer für vim gebunden.)

  2. Oder Sie können diese Zeilen versuchen:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

Dadurch wird die Suche nach einer kurzen Zeit ohne Cursorbewegung deaktiviert und für die Standardsuchbefehle wieder aktiviert. Es werden nicht alle Möglichkeiten beschrieben, die Suche wieder einzuschalten, aber es reicht als Starthilfe für den Proof-of-Concept.


Vielen Dank für das Update - habe es erst jetzt gesehen. (Sieht so aus, als hätten Sie es gerade hinzugefügt? Komisch, dass.) Dies ist ein cooles Konzept. Ich muss damit rumspielen.
Benjamin Oakes

Die Einschränkung von 2. ist, dass die Suche im visuellen Modus Vnicht funktioniert
Bryce Guinta

Ich habe die erste Zeile in Option 1 wie folgt geändert. autocmd cursorhold * set nohlsearch | let @/ = "" Dadurch wird das Suchregister gelöscht und die Hervorhebung entfernt. Ich habe nicht viel Zeit mit diesem Setup verbracht, aber ich wollte es für diejenigen herausbringen, die hier landen.
Berkeley Martinez

2

Ich tippe einfach "/ asdf" (vorausgesetzt, "asdf" ist nicht in der Datei), um die Hervorhebung zu entfernen. Ich weiß, dass es ziemlich simpel ist, aber es funktioniert bei mir.


2
Das ist die gleiche Idee wie :noh, aber es funktioniert nicht immer. :) Witzigerweise erwähnen Sie das: Ich hatte immer einen Freund, der seinen Namen tippte, weil er seltener vorkam als so etwas wie "asdf" in dem, was er schrieb. (Ein bisschen lustig, denke ich.)
Benjamin Oakes

Wahr. Vielleicht erinnere ich mich: beim nächsten Mal nicht.
Greg Graham

1

Fügen Sie Folgendes in Ihre .vimrc-Datei ein:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

Dadurch wird der markierte Suchbegriff unbemerkt ausgeblendet, die :set hlsearchFunktion jedoch nicht deaktiviert . Sie wird bei der nächsten Suche wieder aktiviert.


Es ist besser, einfach den eingebauten Befehl zu verwenden, der für diesen Zweck entwickelt wurde -: nohl. Dann sprengen Sie nicht den Inhalt Ihres
Suchregisters

Ja, aber es hat mich geärgert, dass meine nächste Suche nicht wie vorgesehen hervorgehoben wurde. Also habe ich diese schnelle Lösung gefunden. Es könnte auch schmutzig sein, aber es funktioniert. Ich denke, dies ist für vim akzeptabel - selbst wenn ich keine "schmutzigen" Dinge in einem Quellcode eines echten, großen Projekts verwenden würde.
Gregor Müllegger

1

Eine andere Möglichkeit ist das Zurücksetzen des @/Registers (das eigentlich ein Lese-Schreib-Register ist) nach dem Ersetzen. Dies stellt das vorherige Highlight wieder her:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

Dies hat jedoch noch einige Probleme:
- Anstatt Änderungen vorzunehmen :s, wird ein neuer Befehl definiert. Obwohl es möglich ist, cabbreveine Karte :szu verwenden :S, weiß ich nicht, wie alle Konstruktionen abzufangen sind, wie z :<range>s.
- Wenn Sie :nohlzuvor nur eine Suche ausgeblendet haben, wird die vorherige Suche erneut hervorgehoben. Ich weiß nicht, ob :nohlvorher angerufen wurde. (Es könnte möglich sein, dies zu umgehen und den :nohlBefehl zu überschreiben , aber dies würde auch das Überschreiben aller Suchbefehle erfordern, was zu viel sein könnte ...).

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.