So geben Sie das Ergebnis von vim-Befehlen an die Shell aus

11

Nehmen wir an, ich bin in der Shell ( bash) und möchte eine Ausgabe sehen, :scriptnamesdie geben würde, aber ich möchte vim nicht starten oder ich möchte das in eine andere Datei übertragen.

Also führe ich aus

vim +scriptnames

Was zeigt mir alle Skripte, aber wie kann ich das in die Standardausgabe der Shell einfügen?

hgiesel
quelle

Antworten:

10

Das passiert, weil Vim normalerweise zum alternativen Bildschirm wechselt und dort arbeitet. Beim Beenden schaltet Vim zurück und daher sehen Sie nichts mehr von Ihrer Vim-Sitzung, sondern das Ergebnis des Befehls, der bereits vor dem Starten von Vim ausgeführt wurde.

Diese Funktion wird unter :h xterm-screens (Link) erklärt.

Sie wollen das also im Grunde nicht und wollen das deshalb deaktivieren. Sie können dies tun, indem Sie :set t_ti= t_te=die Terminalcodes, die dies ausführen, auf leer setzen.

Wenn Sie alles zusammenfügen, möchten Sie Vim folgendermaßen starten:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Wir setzen die 'more'Option zurück, damit Sie die Eingabeaufforderung nicht sehen.

Christian Brabandt
quelle
1
Das ist super, vielen Dank! Ich bezweifelte tatsächlich, dass dies möglich war.
Hgiesel
Ermöglicht dies die Verwendung von VimL als vollwertige System-Skriptsprache, indem es in stdout geschrieben wird (besonders für Masochisten)?
Shadowtalker
1
Ein Problem dabei ist, dass ich das Terminal nicht scrollen kann. (Wenn der Text länger als meine Terminalhöhe ist, kann ich den oberen Rand nicht sehen.) Der Text verschwindet auch, wenn ich vim öffne und dann beende.
FDinoff
@FDinoff Dafür lesssind Pager da. Pipe es einfach in weniger so vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. Das Layout ist vielleicht zuerst durcheinander (es befindet sich in meinem Terminal), aber nach dem Drücken von <CL> ist alles schön und gut.
Hgiesel
Ich sehe keine Ausgabe beim Ausführen vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', es gibt nur einen "Schnellblitz", der Befehl wird mit Code 0 beendet, keine Ausgabe. Vermisse ich etwas
TrungDQ
3

Wir können den :redirBefehl auch verwenden , um die Ergebnisse von vim-Befehlen in eine Datei umzuleiten

Zum Beispiel,

vim -c "redir! > vimout | scriptnames | redir END | q"

Dadurch wird die Ausgabe von scriptnamesin die Datei "vimout" umgeleitet.

MS.Kim
quelle
1

Ich schätze die Antwort von Christian Brabandt, aber ich denke, eine bessere Antwort wäre, den Befehl quit mit einem anderen Befehl -c wie folgt zu trennen:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

Wenn Sie diese Methode verwenden, können Sie eine Reihe verschiedener Befehle aneinanderreihen und dann das letzte 'q!' aus vim herauskommen.

Benjamin Frazier
quelle
0

In Situationen, in denen vim vollständig geladen sein muss, als ob Sie es manuell gestartet hätten, funktioniert dies wie folgt:

vim -c "autocmd! CursorHold * <commands to run>"

Zum Beispiel wollte ich die Ausgabe :mapvon der Shell in eine Datei umleiten , aber ich wollte das Mapping erfassen, das vim-airline erst erstellt, nachdem es seine Tabline angezeigt hat (Zeile oben zeigt alle geöffneten Buffernamen). Weil es zu funktionieren scheint Dies asynchrones einfaches Ausführen einer -cUmleitung zu einer Datei gab ihm keine Zeit, um die Zuordnungen vorzunehmen. Es könnte ein besserer Weg geben, aber das funktioniert für mich, zumal ich bereits updatetimeeingestellt 100(0,1 Sekunden), die bis in dem , wie lange wirkt CursorHoldEreignis ausgelöst wird . Standardmäßig legt vim den Wert auf 4 Sekunden fest.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
user1902689
quelle