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:
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
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 .
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 :
Antworten:
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
Beachten Sie, dass das Pipe-Symbol in diesem Fall ein Trennzeichen zwischen Vim ex-Befehlen ist, nicht die Pipe der Shell. Siehe auch
quelle
:r!echo
ohne den Puffer zu verändern.Hier ist was ich tue. Darauf wird in den Kommentaren in den obigen Antworten angespielt.
Beispiel 1 : Finden Sie alle Textdateien in
/tmp
Beispiel 2 : Sie bearbeiten die Datei foo.txt und möchten
ls -la foo.txt
die Ausgabe in einem Puffer ausführen :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
Erstellt eine horizontale Teilung. Verwenden:vnew
Sie diese Option, wenn Sie stattdessen eine vertikale Teilung und:tabnew
eine neue Registerkarte wünschen .quelle
%
für den nächsten Puffer außer E499 zu verwenden.funktioniert bei mir.
quelle
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()
:oder speichern Sie den aktuellen Puffernamen für später :
quelle