Wie führe ich den Vim-Befehl über die Shell aus?

12

Dies mag eine dumme Frage sein, aber ertrage sie mit mir.

Ich automatisiere einige der üblichen Dinge, die ich beim Einrichten einer neuen Arbeitsumgebung mache, und möchte den Vim-Befehl automatisieren :BundleInstall(zum Installieren aller meiner Vim-Plugins).

Ist es möglich, dies von der Shell aus auszuführen?

Ist es alternativ möglich, das Skript Vim ausführen zu lassen :BundleInstall, auszuführen , zu warten, bis es beendet ist, und zu beenden?

Vielen Dank.

imirisch
quelle

Antworten:

14

Von der vim(1)Manpage:

+ {Befehl}

-c {Befehl}

{Befehl} wird ausgeführt, nachdem die erste Datei gelesen wurde. {Befehl} wird als Ex-Befehl interpretiert. Wenn der Befehl {Leerzeichen enthält, muss er in doppelte Anführungszeichen gesetzt werden (dies hängt von der verwendeten Shell ab). Beispiel: Vim "+ set si" main.c

Hinweis: Sie können bis zu 10 "+" oder "-c" Befehle verwenden.

Ignacio Vazquez-Abrams
quelle
3
Vielen Dank! Ich wusste, dass ich mich dumm fühlen würde ...: - / Es tut mir recht, dass ich die Manpage nicht gründlich gelesen habe. Am Ende habe ich verwendet vim +BundleInstall +qall!.
Imiric
4

Sie können Ihren Befehl folgendermaßen ausführen:

vim -E -c BundleInstall -c q

Dadurch wird vermieden, dass ein Vim-Fenster in Ihrem Terminal geöffnet wird.

Hinweis: Meine erste Antwort enthielt die -sOption, die ich für eine andere Anwendung benötigt hatte, die hier jedoch falsch war, da sie einen Großteil der Vial-Initialisierung verhinderte, einschließlich der Beschaffung des Plugins, das den BundleInstallBefehl definierte .

Garyjohn
quelle
1
Danke, aber aus irgendeinem Grund wird es bei mir nicht funktionieren.
Imiric
1
Jetzt verstehe ich warum. Ich habe vergessen, dass -sdies mehr als nur bestimmte Nachrichten hemmt - es verhindert auch die Initialisierung -, sodass die Definition von BundleInstall nicht bezogen wurde. Eine Möglichkeit, dies zu beheben, besteht darin, vor dem ersten eine Option wie diese hinzuzufügen -c: --cmd 'runtime plugin/bundle.vim'. Bearbeiten Sie den Dateinamen entsprechend. Siehe :help -s-ex.
Garyjohn
2

Während das vim-spezifische Rezept oben der richtige Weg ist, können Sie immer einen allgemeineren Ansatz wie Autoexpect verwenden .

AnonymousLurker
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 die Tabline angezeigt wurde (Zeile oben zeigt alle geöffneten Buffernamen). Weil es zu funktionieren scheint Das asynchrone Ausführen einer -cUmleitung zu einer Datei ließ 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