Jörgs Webnotizen

Vim: überflüssige Leerzeichen beim Kopieren entfernen

Wenn vim in einem Terminal wie z.B. xfce-terminal läuft, und man mit der Maus einen Abschnitt der in vim geladenen Datei markiert, um diesen mit der mittleren Maustaste in eine andere Anwendung einzufügen, so werden auch eine Menge Leerzeichen mitkopiert, die die Zeilen hinter dem eigentlichen Zeilenende bis zum rechten Rand des Terminals auffüllen. In der in vim geöffneten Datei gibt es diese Leerzeichen nicht, können dort also auch nicht entfernt werden, sie entstehen erst beim Kopieren mit der Maus.

Zum Problem wurde dieses Verhalten, als ich einen Codeabschnitt aus vim in eine Email einfügen wollte. Ich hatte Icedove (Thunderbird) so eingestellt, dass es die Zeilen nach einer bestimmten Anzahl von Zeichen umbricht. Durch die überschüssigen Leerzeichen am Ende wurden die Code-Einrückungen allesamt verschoben.

Eine Lösung für das Problem habe ich hier gefunden. Zum Zugriff auf die Zwischenablage habe ich mir also xsel installiert. Mithilfe von sed kann man dann die angehangenen Leerzeichen in der Zwischenablage löschen:


xsel | sed 's/ *$//' | xsel

Falls dieser Befehl nicht im Terminal eingegeben, sondern in einem Script aufgerufen wird, braucht es noch die Option -i:


xsel | sed 's/ *$//' | xsel -i

Man kann dazu nun einen Alias definieren. Ich wollte es aber noch einfacher haben, und habe einen Shortcut definiert. Unter Xfce kann man dies unter Einstellungen -> Tastatur -> Tastaturkürzel für Anwendungen. Dazu klickt man auf „Hinzufügen“, gibt den oben aufgefühten Befehl ein, und gibt nach dem „OK“ die Tastaturkombination ein, mit der man den Befehl aufrufen möchte. Nun muss ich nach dem Kopieren aus vim nur kurz meinen gewählten Shortcut (linke Win-Taste + S) eintippen, und die Leerzeichen sind weg :-)

Update

Alternativ kann man den Abschnitt statt mit der Maus im Visual Modus von vim markieren und dann mit „:w !xsel“ direkt in die Zwischenablage schieben, so wie es a in seinem Kommentar beschrieben hat.

Kommentare

besser:
V{motion}:w !xsel

{motion} ist sowas wie j, k oder ^D. Das zerstoert im Gegensatz zur sed(1)-Variante keine absichtlichen Leerzeichen im Text.

Es werden nur Leerzeichen am Ende einer Zeile entfernt – deswegen steht der Delimiter „$“ nach dem “ *“.

Deine Variante würde allenfalls helfen, wenn man von vim nach vim kopiert. Die angehängten Leerzeichen entstehen ja erst beim Kopieren mit der Maus, und können von daher nur in der Zwischenablage bearbeitet werden, wenn man den kopierten Text in eine andere Anwendung einfügen möchte.

Ich habe den Beitrag diesbezüglich auch nochmal präzisiert.

Da muss ich mich nochmal korrigieren:

„Deine Variante würde allenfalls helfen, wenn man von vim nach vim kopiert.“

Da war ich wohl noch nicht ganz wach – deine Variante funktioniert auch, wenn ich in andere Anwendungen kopiere, und ist von daher eine gute Alternative! sie ist sogar klar vorzuziehen gegenüber meiner Lösung, wenn der zu kopierende Bereich über den Anzeigebereich des Terminalfensters hinausgeht und man diesen nicht in einem Stück mit der Maus kopieren kann.

Die von Jörg beschriebenen Methode funktioniert natürlich auch, wenn der vim nicht lokal läuft, sondern in einer SSH-Session auf irgendeinem anderen Rechner und man X11-forwarding nicht eingerichtet hat bzw. es nicht will.

Die Kommentarfunktion wurde nach 180 Tagen automatisch geschlossen.