Es kommt häufig vor, dass beim Programmieren oder Öffnen von Textdateien am Ende einer Zeile ein Leerzeichen nachgestellt wird. vim hat eine Möglichkeit, dies zu zeigen, indem Sie die trail
Option in der listchars
Option setzen und dann einschalten list
.
Was ist jedoch der einfachste Weg, um dieses nachgestellte Leerzeichen global über die gesamte Datei hinweg zu beseitigen (idealerweise ohne Plug-in)?
whitespace
line-breaks
Andrew Ferrier
quelle
quelle
:h vim-faq
und suchen/trailing
. Das schwer zu merkende Tag ist:h faq-12.1
.Antworten:
Verwenden Sie eine Tastenkombination, um alle nachgestellten Leerzeichen zu entfernen
Da einige Seiten, die ich bearbeite, tatsächlich abschließende Leerzeichen (z. B. Abschriften) benötigen und andere nicht, habe ich eine Tastaturbindung eingerichtet, F5damit es trivial ist, ohne automatische Zeichen auszukommen . Fügen Sie dazu den folgenden Code (von vim.wikia) oder eine Variation davon zu Ihrem
.vimrc
:nnoremap <F5>
führtF5
im normalen Modus eine nicht rekursive Zuordnung zum Schlüssel durch:let _s=@/
speichert den letzten Suchbegriff (aus dem Makro@/
) in der Variablen_s
<Bar>
Fungiert als Pipe-Symbol|
zum Trennen von Befehlen,|
würde jedoch einen Befehl in diesem Kontext beenden und<Bar>
muss stattdessen verwendet werden.:%s/\s\+$//e
sucht nach nachgestellten Leerzeichen und löscht sie überall im Puffer ( eine detaillierte Aufschlüsselung dieses Ausdrucks finden Sie in der Antwort von CarpetSmoker )let @/=_s
Stellt Ihren letzten Suchbegriff für das Makro wieder her@/
, sodass er beim nächsten Treffer verfügbar istn
.<CR>
Beendet die Zuordnung... oder selektiver sein
Wenn Sie Fälle haben, in denen Sie nicht alle abschließenden Leerzeichen entfernen möchten, können Sie ein selektiveres Muster verwenden. Der folgende Code zeigt zum Beispiel, wie ich abschließende Leerzeichen nur entferne, wenn sie nach einem Semikolon stehen (hier ist es gebunden F8).
Dies ist nützlich, wenn Sie, wie ich, einige Dateien mit abschriftenähnlichen Heredocs haben, die zwischen Semikolon-terminierten Programmieranweisungen eingefügt sind.
quelle
:keeppatterns
, ein Überschreiben zu verhindern@/
. Und schauen Sie sich auch an:keepjumps
.:help keeppattern
und nichts bekommen.:nohl
, wenn Sie etwas hervorheben, wird es weiterhin hervorgehoben es (siehe meine aktualisierte Antwort).Der "einfachste" Weg ist, einfach zu benutzen
:substitute
::%s
:substitute
über den Bereich laufen%
, der den gesamten Puffer darstellt.\s
t Entspricht allen Whitespace-Zeichen.\+
um sie 1 oder mehrmals zu wiederholen.$
am Ende der Linie zu verankern.e
Flag, dass kein Fehler ausgegeben wird, wenn keine Übereinstimmung vorliegt (dh die Datei enthält bereits keinen nachgestellten Whitespace).Dies ist jedoch wahrscheinlich nicht der "beste" Weg, da zwei Nebenwirkungen auftreten:
Sie können beide Elemente reparieren, indem Sie dies in eine Funktion umwandeln:
Und dann benutze es wie folgt:
winsaveview()
wird die aktuelle "Ansicht"winrestview()
gespeichert , die die Cursorposition, Falze, Sprünge usw. enthält. Am Ende wird dies aus der gespeicherten Variablen wiederhergestellt.:keeppatterns
verhindert , dass das\s\+$
Muster aus der Such Geschichte hinzugefügt werden.Da es etwas ärgerlich ist, immer etwas einzugeben
:call
, können Sie einen Befehl definieren:Welche können ohne die verwendet werden
:call
:Und Sie können es natürlich an einen Schlüssel binden:
Einige Leute machen das gerne automatisch, bevor sie eine Datei auf die Festplatte schreiben, so:
Es gefällt mir nicht, da einige Formate abschließende Leerzeichen erfordern (z. B. Markdown), und in einigen Fällen möchten Sie sogar abschließende Leerzeichen in Ihrem Code (z. B. das Formatieren einer E-Mail und das Verwenden des
--<Space>
Markers zum Anzeigen des Beginns einer Signatur) ).Schamloser Plug-Modus: Vor einiger Zeit habe ich ein kleines Python-Skript geschrieben , um Whitespace für ein gesamtes Projekt auf einmal zu bereinigen.
quelle
`
nach Abschluss des Ersetzens zweimal drücken . Dies eröffnet die Möglichkeit, einen Oneliner wie diesen zu erstellen:%s/\s\+$//e | exe "normal ``"
Um alle nachfolgenden Leerzeichen (am Ende jeder Zeile) zu löschen, können Sie den folgenden Befehl verwenden:
Verwenden Sie zum
\s
Einschließen von Registerkarten anstelle von Leerzeichen.Über die Befehlszeile:
Alle Dateien im aktuellen Verzeichnis (rekursiv verwenden
**/*.*
):Python Weg:
oder:
Verwenden Sie
lstrip()
für den linken Streifen (nachlaufend),rstrip()
für den rechten Streifen (vorlaufend) oderstrip()
zum Entfernen von beiden Enden.Hier ist eine nützliche Funktion, die überflüssige Leerzeichen am Ende einer Zeile entfernt, die Sie hinzufügen können
.vimrc
:Dafür gibt es auch das Plugin DeleteTrailingWhitespace .
Leerzeichen hervorheben
Verwenden Sie Folgendes, um zu überprüfen, ob alle nachgestellten Leerzeichen weg sind:
Tippe
/ $
, um sie zu finden. Wenn es welche gibt, würde vim sie für Sie hervorheben.Verwenden Sie Farben, um sie hervorzuheben:
Verwenden Sie sichtbare Zeichen ( Quelle ):
Siehe auch: Markieren Sie unerwünschte Leerzeichen
Um abschließende Leerzeichen standardmäßig hervorzuheben, können Sie Folgendes konfigurieren
.vimrc
:Leerzeichen werden standardmäßig entfernt
Wenn Sie sicherstellen möchten, dass alle nachgestellten Leerzeichen in einer Datei beim Speichern automatisch entfernt werden, können Sie den folgenden Befehl hinzufügen
.vimrc
:Dies wird nicht empfohlen, da abschließende Leerzeichen aus jeder vom Benutzer gespeicherten Datei entfernt werden (auch wenn Leerzeichen gewünscht werden können).
Siehe auch:
quelle
Um Christopher Bottoms Antwort ein wenig zu kommentieren : Jonathan Palardy hat einen guten Artikel dazu geschrieben . Darin schreibt er eine Funktion,
Preserve(command)
die den Zustand des Editors (hauptsächlich Cursorposition und letztes Suchmuster) beim Ausführen eines beliebigen Befehls beibehält:Dies hat den Vorteil, dass es sich um eine Mehrzweckanwendung handelt. Sie können es beispielsweise verwenden, um alle nachfolgenden Leerzeichen zu ersetzen (wie es Jonathan tut), indem Sie Folgendes zuordnen:
Sie können es auch für eine visuelle Moduszuordnung verwenden, um nur die nachgestellten Leerzeichen auf visuell ausgewählten Linien zu entfernen:
Sie können es auch für andere Anrufe verwenden, z. B. zum Formatieren des gesamten Dokuments unter
=
Beibehaltung Ihrer Position (verwenden Sie diesmal einen anderen Schlüssel, um Konflikte zu vermeiden):Alles in allem habe ich festgestellt, dass die
Preserve(command)
Funktion ein gutes Werkzeug ist.quelle
@/
sollte nicht nötig sein (in diesem fall jedenfalls).winsaveview()
undwinrestview()
sind weit überlegen.Eine andere Version der StripTrailingSpaces-Funktion:
WIRKLICH GIBT ES EINEN FEHLER IN DIESER FUNKTION (DIESER): Der Besitz wird aufgrund der Option "Reichweite" nicht aufbewahrt. es ist entfernt, es funktioniert sehr gut, aber ich teile den Code, um etwas Hilfe zu erhalten.
Wie Sie sehen können, wird auch die oben gezeigte Preserve- Funktion verwendet, allerdings auf etwas andere Weise.
Der Unterschied hierbei ist, dass ich einen Zeilenbereich oder einen Absatz mit auswählen kann
vip
und der Bereich:'<,'>
dann automatisch an der Eingabeaufforderung angezeigt wird.Die Idee kam aus dem Post von Bez Hermoso .
quelle