Zeigen Sie nachfolgende Leerzeichen in vim an

10

Ich hätte gerne eine schöne und süße Darstellung des nachlaufenden Leerraums in meinem Terminal-Vim. Dies würde es mir ermöglichen, sie vor dem Schließen der Datei zu entfernen.

Mir ist bewusst, dass diese Frage sehr beliebt ist und ich habe bereits Dutzende von Antworten auf SO gefunden. Leider habe ich noch keine zufriedenstellende gefunden ...

Also werde ich versuchen, die gesammelten Informationen und die Lösungen, die ich gefunden habe, zusammenzufassen.

Lösung 1: Markieren Sie nachgestellte Leerzeichen manuell

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Markieren Sie nachgestellte Leerzeichen

Vorteile:

  • Einfach zu verwenden
  • Schnell
  • Kompatibel mit cursorline

Nachteile:

  • Die gewählte Farbe ist nicht mit anderen Farbschemata kompatibel, da die Farbe manuell auf eingestellt wird red
  • Große rote Hintergrundblöcke sind nicht sehr ästhetisch

Lösung 2: Verwenden der Listenfunktion

set list
set listchars+=trail:◦

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Vorteile:

  • Einfach zu verwenden
  • Schnell

Nachteile:

  • Problem, wenn :set cursorlineaktiviert
  • Die dedizierte Farbe für list/trailist nicht konfigurierbar. Muss mit den anderen Listchars identisch sein

Lösung 3: Verwenden der Verdeckungsfunktion

syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2 
set concealcursor=nv
highlight Conceal ctermfg=red

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Vorteile:

  • Schöner als die erste Lösung

Nachteile:

  • Der Hintergrund ist nicht mit dem Hintergrund der Cursorzeile identisch
  • Kann andere Verdeckungsregeln stören
  • Die gewählte Farbe ist nicht immer mit dem Farbschema kompatibel
  • Nicht kompatibel mit älteren Versionen von Vim

Meine Frage

Welche der aufgezählten Lösungen ist hinsichtlich Leistung und Kompatibilität am besten geeignet und wie kann ich alle Vor- und Nachteile erzielen?

Mit anderen Worten, ich möchte eine Lösung finden, bei der:

  • Die hervorgehobene Farbe des Glanzlichts stimmt mit dem gewählten Farbschema überein
  • Diese Farbe ist deutlich sichtbar, aber für die Augen nicht zu aggressiv
  • Kompatibel mit cursorline(Hintergrund und Vordergrund) `
  • Kompatibel mit anderen Plugins, die möglicherweise Conceal verwenden
  • Das nachfolgende Zeichen kann auf ein beliebiges Unicode-Zeichen gesetzt werden
nowox
quelle
Wenn Sie Rot nicht mögen, wählen Sie eine andere Farbe. Wenn Sie möchten, dass die Farbe mit verschiedenen Farbschemata kompatibel ist, verknüpfen Sie sie mit einem Farbgruppennamen, anstatt eine bestimmte Farbe zu verwenden, z :hi link ExtraWhitespace CursorLine. Siehe :help hi-link.
Garyjohn

Antworten:

4

In Bezug auf die Leistung sollte keines davon einen Unterschied machen. Vim ist meistens durch komplexe Syntaxmuster festgefahren. Das Muster hier ist recht einfach.

Verwenden Sie :hi linkeine vorhandene Gruppe, damit die Hervorhebungsfarbe mit dem ausgewählten Farbschema übereinstimmt . normalerweise wäre das so Error. Natürlich ist dies nur dann von Bedeutung, wenn Sie häufig (ganz andere) Farbschemata wechseln. Andernfalls wäre es auch in Ordnung, geeignete Farben direkt zu verwenden (wie in Ihrer Lösung 1).

Lösung 1: Markieren Sie nachgestellte Leerzeichen manuell

Ich würde mich dafür entscheiden, aber matchadd()stattdessen verwenden :match; Letzteres bleibt für die benutzerdefinierte Hervorhebung übrig. Auch clearmatches()ist zu grob; Es löscht alle Übereinstimmungen und kann daher Auswirkungen auf Plugins haben. Sie können mein ShowTrailingWhitespace-Plugin für eine saubere und leistungsstarke Implementierung verwenden (einschließlich Ausnahmen für bestimmte Dateitypen). Ja, es ist eine viel größere Lösung, aber ich habe noch keine Auswirkungen bemerkt.

Lösung 2: Verwenden der Listenfunktion

Dies ist an sich schon eine nützliche Funktion, und wenn Sie sie dauerhaft aktiviert lassen, wirkt sich dies auf die Cursorpositionierung auf Tabulatorzeichen aus. Daher würde ich dies nicht empfehlen.

Lösung 3: Verwenden der Verdeckungsfunktion

Dies wird sicherlich einige Syntaxen und Plugins beeinträchtigen, die diese Funktion verwenden. Schlechte Idee.

Ingo Karkat
quelle
Aus Ihrer Antwort geht hervor, dass es eine Lösung gibt, die die Verwendung eines benutzerdefinierten Unicode-Zeichens zum Markieren zusätzlicher Leerzeichen ermöglicht. Diese Frage ist in der Tat schwieriger, als ich ursprünglich gedacht habe.
Nowox
Richtig, benutzerdefinierte Zeichen funktionieren nur mit 'listchars'. Für mich ist die Hervorhebung mehr als ausreichend (insbesondere bei aggressiven Farben).
Ingo Karkat