Leiten Sie die Ausgabe des Shell-Befehls (!) In einen neuen Puffer in Vim

33

Wie kann ich die Ausgabe eines Shell-Befehls in einen neuen Puffer in Vim leiten? Folgendes würde offensichtlich nicht funktionieren, aber Sie können sehen, worauf ich hinaus will:

:!echo % | :newtab
Richie Marquez
quelle
1
stackoverflow.com/questions/3826003/…
Ciro Santilli von 996ICU

Antworten:

26

Sie können die Ausgabe eines Shell-Befehls nicht an einen Befehl weiterleiten, der einen neuen Puffer erstellt. Sie können jedoch einen neuen Puffer erstellen und die Ausgabe eines Shell-Befehls mit einem Eintrag in der Befehlszeile von Vim in diesen Puffer einlesen. Eine funktionierende Version Ihres Beispiels wäre

:tabnew | r !echo <c-r>=bufname("#")<cr>

Beachten Sie, dass das Pipe-Symbol in diesem Fall ein Trennzeichen zwischen Vim ex-Befehlen ist, nicht die Pipe der Shell. Siehe auch

:help :tabnew
:help :r!
:help :bar
garyjohn
quelle
Das ist fast genau das, was ich brauche, nur umgekehrt, damit ich auf den Dateinamen des aktuellen Puffers zugreifen kann. Hinweis: Die Frage wurde aktualisiert, um das gewünschte Endergebnis zu klären.
Richie Marquez
@ Richard Marquez: Ich habe diese Antwort aktualisiert. Die neue Registerkarte wird nun mit dem "alten" Dateinamen geöffnet. Sie können also
Folgendes
Aber nicht :r!echoohne den Puffer zu verändern.
Luc Hermitte
@ Luc Hermitte: Richtig, ich werde zurückrollen.
Akira
2
@garyjohn, akira: danke für die hilfe. Der Teil "<cr> = ..." verursachte Vim-Fehler, aber ich konnte es zum Laufen bringen mit ": tabnew | r! Echo #".
Richie Marquez
14

Hier ist was ich tue. Darauf wird in den Kommentaren in den obigen Antworten angespielt.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Beispiel 1 : Finden Sie alle Textdateien in/tmp

:new | r ! find /tmp -name '*.txt'

Beispiel 2 : Sie bearbeiten die Datei foo.txt und möchten ls -la foo.txtdie Ausgabe in einem Puffer ausführen :

:new | r ! ls -la #

Das #wird durch den Dateinamen des ursprünglichen Puffers ersetzt, den Sie bearbeiten. Dies ist besonders nützlich für Ad-hoc-Versionsverwaltungsbefehle, z

:new | r ! hg annotate -un #

:newErstellt eine horizontale Teilung. Verwenden :vnewSie diese Option, wenn Sie stattdessen eine vertikale Teilung und :tabneweine neue Registerkarte wünschen .

überdenken
quelle
Können Sie diese Frage auch hier beantworten ? Es geht darum, den aktuellen Puffer %für den nächsten Puffer außer E499 zu verwenden.
hhh
4
:tabnew | enew | r ! <your shell cmd>

funktioniert bei mir.

justrajdeep
quelle
2

Wenn Sie das Ergebnis wirklich in einem neuen Puffer speichern möchten, aber Informationen aus dem alten aktuellen Puffer benötigen, können Sie Folgendes verwenden system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

oder speichern Sie den aktuellen Puffernamen für später :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
Luc Hermitte
quelle
Wenn Sie die andere Antwort sehen, können Sie dies tun, ohne den Namen in einer Variablen zu speichern. aber trotzdem gute antwort.
Akira
Tatsächlich. Ich war mir nicht sicher, ob '#' in diesem Fall das erwartete Ergebnis liefern wird - da ich niemals Tabulatoren verwende
Luc Hermitte