Wie kann man Shell-Befehle in Vim ausführen, wie es Gary Bernhardt in seinen Screencasts tut?

Dec 13 2020

Ich schaue mir Gary Bernhardts Destroy All Software-Screencasts an, insbesondere A Compiler from Scratch . Dort führt er Shell-Befehle aus, ohne Vim zu verlassen. Ich bin mir fast sicher, dass er nur die normale Vim-Syntax verwendet, zum Beispiel bei der 1-Minuten-Marke : :!chmod u+x compiler.rb. Wenn ich das auf meinem Computer mache, wechselt das Fenster, um den Shell-Befehl auszuführen, und dann muss ich die Eingabetaste drücken, um zum Editor zurückzukehren. Ich denke, dies ist das normale Verhalten von Vim, und andere Leute haben dies bereits gefragt , aber ich glaube nicht, dass Antworten die Dinge so machen, wie Gary es tut.

Ich habe mir seine .vimrcDatei angesehen, insbesondere die letzte Version vor dem Hochladen des Screencasts, konnte aber nicht herausfinden, was er möglicherweise geändert hat, um das gewünschte Verhalten zu erzielen. Ich habe es heruntergeladen, aber ich bekomme immer noch nicht das richtige Verhalten, daher fehlt mir offensichtlich etwas. Keines seiner Plug-Ins scheint damit zu tun zu haben, daher habe ich sie größtenteils ignoriert.

Ich bin fast sicher , dass ich nicht nach einer Lösung, dass Anwendungen tmux oder Dinge wie :split, :term, :below terminaloder :silent. Ich suche auch keine Antwort, die etwas anderes als Vim verwendet. Ich glaube, Gary verwendet nur Vim und ein paar Plugins.

Ich habe Garys Screencasts gesehen, in denen er speziell über Vim spricht, aber er hat diese Frage nicht angesprochen (oder ich habe sie nicht verstanden). Wenn also jemand herausgefunden hat, wie man sie verwendet, :! <shell command>ohne den Texteditor zu verlassen, würde ich es wirklich begrüßen, wenn Sie können mir helfen, das herauszufinden. Ich habe die zuvor erwähnten Optionen sowohl auf Mac als auch auf Linux getestet, aber nichts hat so funktioniert, wie ich es gerne hätte, und ich wäre mit einer Lösung zufrieden, die auf beiden Plattformen funktioniert.

Antworten

3 filbranden Dec 13 2020 at 12:02

Das Video geht schnell vorbei, aber ich habe es angehalten und ich habe gesehen, wie er Folgendes eingetippt hat:

:!chmod u+x %

Welches erzeugt dann diese Ausgabe:

:!chmod u+x compiler.rb
[No write since last change]
"compiler.rb" 5L, 42C
Press ENTER or type command to continue

Eigentlich fordert Vim nach Abschluss des Befehls auf , die EINGABETASTE zu drücken, aber es scheint, dass er ihn so schnell gedrückt hat (vielleicht hat er es bereits erwartet? Oder er hat angefangen, die folgenden Befehle zu drücken?), Dass es den Anschein hat, als wäre diese Nachricht übersprungen.

Hier sind zwei Einstellungen relevant, die erste, um zu verhindern, dass während der Ausführung des Befehls vom alternativen Bildschirm gewechselt wird, und die zweite, um die Datei automatisch neu zu laden, sobald sie durch den externen Befehl geändert wurde (obwohl nur die Berechtigungen geändert wurden).

Wenn wir uns sein GitHub-Dotfiles-Repository ansehen, können wir beide Einstellungen im vimrc ab dem 29.06.2017 (zu dem Zeitpunkt, als das Video veröffentlicht wurde) sehen.

  1. Das Konfigurieren von Vim, um nicht vom alternativen Bildschirm zu wechseln, wird mit diesem Snippet konfiguriert :
" Prevent Vim from clobbering the scrollback buffer. See
" http://www.shallowsky.com/linux/noaltscreen.html
set t_ti= t_te=
  1. Konfigurieren von Vim zum automatischen Neuladen der Datei nach einem externen Vorgang mit dieser Einstellung :
set autoread

Wenn diese beiden Einstellungen aktiviert sind, kann ich fast genau den gleichen Effekt reproduzieren, außer dass ich die [No write since last change]Nachricht nicht erhalte . Ich bin mir nicht sicher, woher es kommt, da er, soweit ich das beurteilen kann, die Datei gerade direkt vor dem chmodBefehl geschrieben hat. (Als Beweis zeigt die Statuszeile kein [+]neben dem Namen der Datei an, was einen Puffer bezeichnen würde, der geändert wurde.)

Vielleicht ist es etwas anderes von seinem vimrc ... Theoretisch sollte es möglich sein, es von GitHub zu bekommen und dasselbe zu versuchen. Es scheint, dass Video Vim 7.4 verwendet, so dass dies auch ein Teil davon sein könnte.

Immer noch auf sein GitHub-Dotfiles-Repo schauend, sieht es so aus, als hätte er Vim wieder erlaubt, den Scrollback-Puffer zu überladen , also hat er seine Meinung zu diesem Teil geändert.

Wenn Sie dieser Teil immer noch interessiert, können Sie sich das Plug-in vim-altscreen ansehen , das dieses Verhalten mit einigen Steuerelementen implementiert. Siehe auch die Diskussion zur Frage "Unterschied zwischen :!{cmd}und :w !{cmd}bezüglich des alternativen Bildschirms" , insbesondere die außergewöhnliche Antwort von @ user938271 .