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


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

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 .


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


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>

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.