Est-il possible d'exécuter un script VIM dans un mode non-interactif?

Le traqueur de bug Gnats a une command (edit-pr) qui ouvre un ticket dans $ EDITOR. Mon $ EDITOR est VIM, et lorsque cette command ouvre le ticket dans $ EDITOR, j'aimerais effectuer automatiquement des modifications scriptées sans avoir à faire de frappe supplémentaire.

Existe-t-il un moyen d'écrire un script VIM qui peut être exécuté de façon non interactive comme ceci?

Je n'ai jamais utilisé de moucherons, donc il est difficile de dire exactement ce que edit-pr attend d'être fait. Mais d'après ce que vous nous avez donné, vous pourriez essayer de changer la variable d'environnement EDITOR en un script shell personnalisé, ou peut-être même un script python ou autre chose.

 EDITOR=/path/to/script.(sh|py) edit-pr <args> 

Mais comme je l'ai dit, je ne sais pas quel type de assembly il veut, ou ce qui doit être fait dans l'éditeur. Peut-être que si vous nous avez donné un exemple de ce que vous voudriez automatiser?

Même si vous avez déjà reçu une réponse à votre question, d'autres pourraient find cela utile.

Les commands Vim peuvent également être spécifiées dans un file exécuté à l'aide de l'option -s :

  vim -s commands.txt file 

Exemple:

  echo 'gg=G' > indent.txt echo ':wq' >> indent.txt vim -s indent.txt file 

Cela va utiliser Vim pour indenter le contenu du file, sauvegarder et quitter.

Les commands Vim peuvent être spécifiées sur la command line lorsque vous exécutez le programme comme ceci:

 vim file.txt "+:s/foo/bar/g" 

Vous pouvez continuer à append des commands en ajoutant des arguments "+[cmd]" . Vous pouvez y mettre fin et l'éditeur s'ouvrira, exécutez ces commands et attendez ou vous, ou vous pouvez append un "+:wq" pour sauvegarder et fermer le file.

Vous pouvez également écrire un script à l'aide de la syntaxe vimscript et l'envelopper dans une fonction pour l'appeler lorsque le file s'ouvre ou dans un script distinct pour l'importer et l'appliquer au tampon en utilisant la syntaxe ci-dessus.

Pour exécuter vim en mode non interactif, vous pouvez utiliser le paramètre +{command} / -c {command} ou -s qui vous permettra d'exécuter les commands vim après la lecture du premier file.

Consultez quelques exemples ci-dessous.

Une input et une sortie standard simples utilisant des tuyaux peuvent être obtenues par la command:

 $ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat 

Pour modifier un file et save les modifications dans un autre:

 $ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts $ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3' 

Pour éditer le file sur place, vous pouvez utiliser -s {scriptin} afin de lire le file de script, par exemple:

 $ echo ':0,$s/foo/test/ge' > cmds.txt $ echo ':wq' >> cmds.txt $ vim -s cmds.txt -es file 

Pour parsingr le file et l'envoyer à la sortie du pipeline, vous pouvez essayer ce qui suit:

 $ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat 

ou:

 $ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat 

Voir plus: Comment éditer des files non interactivement (par exemple dans le pipeline)? à Vim SE