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

8

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

Existe-t-il un moyen d'écrire un script VIM pouvant être exécuté de manière non interactive comme ceci?

Matt Pfefferle
la source

Réponses:

3

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

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

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

Falmarri
la source
La commande gnats n'était qu'un exemple. Je cherchais une solution générale et je pense que votre réponse est la voie à suivre. Merci!
Matt Pfefferle
20

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

Les commandes Vim peuvent également être spécifiées dans un fichier qui est exécuté en utilisant l' -soption:

    vim -s commands.txt file

Exemple:

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

Cela utilisera Vim pour mettre en retrait le contenu du fichier, enregistrer et quitter.

S. Christoffer Eliesen
la source
14

Les commandes Vim peuvent être spécifiées sur la ligne de commande lorsque vous exécutez le programme comme ceci:

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

Vous pouvez continuer à ajouter des commandes en ajoutant des "+[cmd]"arguments. Vous pouvez soit vous arrêter là et l'éditeur s'ouvrira, exécutera ces commandes et attendra ou vous, ou vous pouvez ajouter un "+:wq"pour enregistrer et fermer le fichier.

Vous pouvez également écrire un script à l'aide de la syntaxe vimscript et l'encapsuler dans une fonction à appeler à l'ouverture du fichier ou dans un script distinct à importer et à appliquer au tampon à l'aide de la syntaxe ci-dessus.

Caleb
la source
5

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

Vérifiez quelques exemples ci-dessous.

Des entrées et sorties standard simples à l'aide de tuyaux peuvent être obtenues par la commande:

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

Pour modifier un fichier et enregistrer 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 fichier sur place, vous pouvez utiliser -s {scriptin}pour que le fichier de script soit lu, par exemple:

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

Pour analyser le fichier 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 fichiers de manière non interactive (par exemple dans un pipeline)? à Vim SE

kenorb
la source
Très utile! Avez-vous une idée de la ressource sur laquelle :hirepose le téléavertisseur de Vim, par exemple, où peut- on faire défiler et afficher -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Il n'apparaît pas dans la liste des tampons, et l'écriture avec :wécrit un fichier vide (et la touche `` Entrée '' fait défiler ou quitter le téléavertisseur) que je peux utiliser :redir! >file | :hi | :redir END , qui capture autant que je fais défiler. Je pense que cela peut fonctionner mécaniquement comme un bidirectionnel more. Je dois me demander pourquoi :helpet :hine sont pas tous les deux paginés ou tamponnés par RO ...
John P