Comment exécuter la commande Vim à partir du shell?

12

C'est peut-être une question stupide, mais restez avec moi.

J'automatise certaines des tâches habituelles que je fais lors de la configuration d'un nouvel environnement de travail et je voudrais automatiser la commande Vim :BundleInstall(pour installer tous mes plugins Vim).

Est-il possible de l'exécuter à partir du shell?

Sinon, est-il possible de faire exécuter le script Vim, de l'exécuter :BundleInstall, d'attendre qu'il se termine et de quitter?

Merci.

imirique
la source

Réponses:

14

Depuis la vim(1)page de manuel:

+ {commande}

-c {commande}

{commande} sera exécutée après la lecture du premier fichier. {commande} est interprétée comme une commande Ex. Si la {commande} contient des espaces, elle doit être placée entre guillemets (cela dépend du shell utilisé). Exemple: Vim "+ set si" main.c

Remarque: Vous pouvez utiliser jusqu'à 10 commandes "+" ou "-c".

Ignacio Vazquez-Abrams
la source
3
Merci! Je savais que je me sentirais stupide ...: - / Me sert bien de ne pas avoir lu attentivement la page de manuel. J'ai fini par utiliser vim +BundleInstall +qall!.
imiric
4

Vous pouvez exécuter votre commande comme ceci:

vim -E -c BundleInstall -c q

ce qui évitera d'ouvrir une fenêtre Vim dans votre terminal.

Remarque: Ma première réponse incluait l' -soption dont j'avais besoin pour une autre application mais qui était incorrecte ici car elle empêchait une grande partie de l'initialisation de Vim, y compris l'approvisionnement du plugin qui définissait la BundleInstallcommande.

garyjohn
la source
1
Merci, mais pour une raison quelconque, cela ne fonctionnera pas pour moi.
imiric
1
Maintenant je vois pourquoi. J'ai oublié que cela -sfait plus qu'inhiber certains messages - il inhibe également les initialisations - de sorte que la définition de BundleInstall n'était pas fournie. Une façon de résoudre ce problème serait d'ajouter une option comme celui - ci avant la première -c: --cmd 'runtime plugin/bundle.vim'. Modifiez ce nom de fichier à votre convenance. Tu vois :help -s-ex.
garyjohn
2

Bien que la recette spécifique à vim ci-dessus soit la bonne façon de le faire, vous pouvez toujours utiliser une approche plus générale comme autoexpect .

AnonymousLurker
la source
0

Pour les situations où vous avez besoin que vim soit complètement chargé comme si vous l'aviez démarré manuellement, cela fonctionne:

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

Par exemple, je voulais rediriger la sortie de :mapvers un fichier à partir du shell, mais je voulais capturer le mappage que vim- airlines crée uniquement après avoir affiché sa tabline (ligne en haut montrant tous les noms de buffers ouverts.) Parce que cela semble faire cela de manière asynchrone, l'exécution d'une -credirection vers un fichier ne lui donnait pas le temps de faire les mappages. Il pourrait y avoir une meilleure façon, mais cela fonctionne pour moi, d'autant plus que j'ai déjà updatetimeréglé sur 100(0,1 seconde), ce qui affecte la durée avant le CursorHolddéclenchement de l' événement. Par défaut, vim la définit sur 4 secondes.

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