Wie verhindere ich einen führenden Newline in Vim, wenn Sie: r! Date und andere Shell-Befehle verwenden?

439
Seltzer

Wenn ich ein Datum einsetze, versuche ich es meistens mitten in einer Zeile. Standardmäßig sieht es so aus, als würde die :r!Einfügung das Ergebnis immer in einer neuen Zeile anzeigen. Dies ist für mich sinnvoll, da die meisten Shell-Befehle vor dem Anzeigen eines Befehlsergebnisses eine neue Zeile ausgeben, und dies ist in einem Terminal sicherlich vorzuziehen. Für den Fall date +%x, dass ich mich für ein winziges Kommando von Vim ausschälte, ist dies nicht mein bevorzugtes Verhalten. Wie gehe ich damit um?

0

2 Antworten auf die Frage

2
Christian Brabandt

Im Einfügemodus können Sie Ctrl-R=einen Ausdruck an der aktuellen Cursorposition einfügen.

Sie können zB die system()Funktion verwenden, leider löst dies nur die Hälfte des Problems, da bei der Ausgabe von system()immer mindestens der letzte Zeilenumbruch hinzugefügt wird, so dass die Zeile nach der Eingabe unterbrochen wird. Eine Lösung, wie Sie diese letzten Zeilenumbrüche im system()Fall vermeiden können, finden Sie unter vi.stackexchange von mir .

(so könnten Sie zB Ctrl-R=systemlist ('date') [0] verwenden Enter).


Eine alternative Möglichkeit zum Einfügen des Datums an der aktuellen Cursorposition wäre die Verwendung von Ctrl-R=strftime ('% c').Enter

Ctrl-R=verwendet das Ausdrucksregister, um Inhalt einzufügen. Sie können mit dem :help i_ctrl-rBefehl mehr herausfinden oder die Dokumentation in appspot anzeigen .

0
Scott

Ich glaube, dass das Problem nicht so groß ist, dass Shell - Befehle normalerweise am Ende mit einer Neuen - Zeile, aber das readist ein zeilenorientierte Befehl (dh ein ex - Befehl). Es war in der Originalversion von edin den 1970er Jahren vorhanden, bevor es existierte, und der übliche Anwendungsfall bestand darin, ein paar Zeilen (z. B. eine C-Funktion oder einen Textabschnitt) aus einer Datei in eine andere zu lesen. Die meisten Benutzer hätten die meiste Zeit als neue separate Zeilen einfügen wollen.:r!command

Sie können dies überprüfen / demonstrieren :r!printf Tuesday. Auch wenn der printf TuesdayBefehl keine neue Zeile schreibt (da Sie keine Angabe gemacht haben \n), erhalten Sie Tuesdayeine Zeile ganz alleine.

Vielleicht ist die einfachste Abhilfe ist zu tun i Enter Esc(die aktuelle Zeile zu brechen), -oder kwieder auf eine Linie zu bewegen, dann tun, und dann zu den Linien wieder zusammen. Wenn Sie dies häufig tun, kann es nützlich sein, ein Makro dafür zuzuordnen.:r!commandJJoin

Offenlegung: Ich weiß vieinigermaßen gut, aber es gibt eine Menge Sachen vim, die ich nicht gelernt habe. Es könnte einen einfacheren Weg geben, dies in zu tun vim.