Öffnen Sie die Ausgabe eines Shell-Befehls in einem geteilten Bereich

23

Betrachten Sie eine interpretierte Programmiersprache.

Ich kann das aktuell geöffnete Skript mit ausführen ! interpreter %und nach Abschluss der Ausführung mit der Eingabetaste zu vim zurückkehren.

Ist es irgendwie möglich, das aktuelle Fenster nicht durch die Ausgabe des ausgeführten Shell-Befehls zu ersetzen, sondern die Ausgabe in einem neuen geteilten Bereich zu öffnen? Ich möchte meinen Quellcode während der Ausführung meines Skripts immer noch sehen.

Ich habe es versucht :split ! interpreter %, aber es hat nicht funktioniert.

Gibt es einen Weg? Ich benutze Vim 7.3.

Muffel
quelle

Antworten:

29

Mit :!wird der externe Befehl in einer Shell ausgeführt, und die flüchtige Ausgabe wird nicht in Vim erfasst. Sie sehen nur, was auf dem Terminal gedruckt wird, und die Steuerung kehrt nach Beendigung des externen Befehls zu Vim zurück.

Um die Ausgabe zu behalten, müssen Sie sie in einen Vim- Puffer einlesen . Dafür gibt es den :read!Befehl. Kombinieren Sie dies zum Öffnen eines neuen Arbeitspuffers mit :new:

:new | 0read ! <command>

Wenn Sie den Dateinamen ( %) des aktuellen Puffers an den externen Befehl übergeben möchten , müssen Sie diesen verwenden :execute, damit er bereits im aktuellen Puffer ausgewertet wird:

:execute 'new | 0read ! interpreter' expand('%')

Oder Sie verwenden die Tatsache, dass mit einem neuen Puffer der vorherige zum alternativen Puffer wird , und verwenden #anstelle von %:

:new | 0read ! interpreter #

Entfernen Sie den Kratzerpuffer mit :bdelete!.

Wenn Sie die Ausgabe während der Ausführung asynchron sehen möchten, benötigen Sie einen externen Multiplexer oder ein Plugin, wie in @chaos answer angegeben.

Ingo Karkat
quelle
Der obige Befehl ": execute ..." funktioniert für mich, aber wenn ich versuche, ihn an einen F9-Tastenanschlag zu binden, verwende ich diesen .vimrc-Eintrag [nnoremap <buffer> <F9>: execute 'new | 0read! / Usr / bin / env python3 'expand ('% ')], ich erhalte den folgenden Fehler: [/ bin / bash: -c: Zeile 0: Unerwartetes EOF bei der Suche nach übereinstimmendem' 'expand ('% ' )]. Ich habe mehrere Fluchtsequenzen ausprobiert, aber ich denke nicht die richtige. = :). Irgendwelche Ideen? Vielen Dank.
NYCeyes
2

Soweit ich weiß, können Sie das nicht tun vim. Verwenden Sie dafür aber einen Terminal-Multiplexer screen. Starten Sie vor dem Öffnen eines VIM den Multiplexer:

screen

Drücken Sie dann ctrl- a Sfür horizontal und ctrl- a |für einen vertikal verschütteten Bildschirm.

Öffnen Sie nun eine Datei in vimeinem der geteilten Bildschirme. Und mit ctrl- zum anderen Bildschirm springen a tab. Beachten Sie, dass Sie im zweiten Bildschirm zuerst einen neuen Bildschirm ( ctrl- a c) öffnen müssen, bevor Sie ihn verwenden können.

Auf dem Bildschirm mit vim können Sie die Datei bearbeiten und auf dem anderen Bildschirm können Sie sie ausführen und die Meldungen und den Code dauerhaft anzeigen.

Hier eine Kurzanleitung für screen.

Chaos
quelle
Alternativ können Sie tmuxMultiplexer und vim-dispatchPlug-in verwenden, um das Teilen und Wechseln zwischen Fenstern zu automatisieren.
Am