Fügen Sie die Ausgabe eines Systembefehls an der aktuellen Position in vim ein

33

In vim, wenn ich benutze

:r !ls somefilename

Die Ausgabe dieses Befehls wird in eine neue Zeile unterhalb der aktuellen Zeile eingefügt.

Wenn ich mache

let @a = system("ls")

und später

"ap

Die Ausgabe wird weiterhin in eine neue Zeile unterhalb der aktuellen Zeile eingefügt.

Gibt es eine Möglichkeit, die Ausgabe von vim insert an der aktuellen Position zu erstellen?

Deshmukh
quelle
Lesen Sie diese nützliche Antwort. Führen Sie die aktuelle Zeile in bash von vim
Rohan Ghige

Antworten:

14

Sie können den Inhalt des Zwischenablagepuffers mit Strg-R * im Einfügemodus zwischen Zeichen einfügen (und bei anderen Puffern ähnlich). Wenn Sie also den Systembefehl in einen Puffer bekommen können, sollten Sie gesetzt sein. (Quelle: https://stackoverflow.com/questions/1491135/paste-multi-line-string-into-gvim-at-cursor-position ).

:let @a=system("ls -l")Setzt den Ausgang von ls -lin das Register a. Sie können es dann (im Einfügemodus) mit einfügen ^R-a.

Steve Kroon
quelle
Auf den meisten Plattformen wird die Zwischenablage (normalerweise *) mit einem Register synchronisiert. Wenn Sie also Ihre Befehlsausgabe in die Zwischenablage leiten, können "*Sie sie verwenden.
Bruno Bronosky
39
:r !command 

liest die Ausgabe des Befehls und fügt sie in die Zeile unter der aktuellen Zeile ein. So ist vi programmiert, Sie können das Verhalten nicht ändern.

Sagen Sie aber, ob Sie in Zeile 3 stehen. Wenn Sie es versuchen :r !date. Der Datumswert wird in Zeile 4 eingefügt.

Wenn der Datumswert in Zeile 3 angezeigt :2r !datewerden soll, fügen Sie den Datumswert in Zeile 3 ein.

devav2
quelle
4
Das wird in eine andere Zeile eingefügt, aber immer noch in eine eigene Zeile. Ich möchte es an der aktuellen Stelle einfügen!
Deshmukh
13

Hier ist eine alternative Möglichkeit, die Ausgabe eines externen Befehls vor dem Cursor einzufügen:

:exe 'norm i' . system("ls -l")

oder benutze expression register ( :help @=):

"=system('ls -la')

dann schlagen P. Oder kürzer durch:

<CTRL-R>=system('ls -la')<CR>
Kenorb
quelle
4
Das ist die Antwort.
Jacob
1
Einverstanden! Dies sollte wirklich die richtige Antwort sein, da es eine programmatischere Lösung (mit :exe) enthält, die in Befehlen enthalten sein kann.
metasoarous