Comment exécuter une fonction ou une macro sur un dossier de fichiers?

12

Disons que j'ai une fonction, nommée StripWhitespace.

Je peux l'exécuter sur un seul fichier en ouvrant le fichier et en l'exécutant :StripWhitespace.

Comment puis-je exécuter automatiquement cette fonction sur un dossier de fichiers et enregistrer les résultats au fur et à mesure?

grenouille carrée
la source
3
Détails, s'il vous plaît!
200_success

Réponses:

10

Vous pouvez utiliser l' -cargument pour exécuter une commande au démarrage, à partir de vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Exemple:

vim -c ':call StripWhitespace()' file1 file2

Pour quitter ensuite, ajoutez | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2
Martin Tournoij
la source
1
Vous voulez un: argdo, si vous l'exécutez pour quelques fichiers sur la ligne de commande
Christian Brabandt
19

Si vous êtes déjà dans Vim, vous pouvez utiliser les commandes :argdoou :bufdopour exécuter une commande sur chaque élément de la liste d'arguments ou de la liste de tampons, respectivement.

par exemple pour exécuter une :commande sur chaque fichier de la liste des arguments:

:argdo StripWhitespace

Ou pour appeler une fonction de chaque fichier de la liste des tampons:

:bufdo call StripWhitespace()

Ou pour exécuter une macro qsur chaque fichier de la liste des arguments:

:argdo normal @q

Vous pouvez ensuite enregistrer tous les tampons modifiés avec :wall, ou tout enregistrer et quitter Vim avec :wqall.

Si vous souhaitez écrire les fichiers au fur et à mesure, vous pouvez ajouter un appel à :update, comme ceci:

:argdo s/foo/bar/ge | update

Il existe plusieurs façons d’obtenir les fichiers dans Vim en premier lieu, notamment:

  • Fournissez des paramètres à la ligne de commande vim: vim *(cela ajoute tous les fichiers à la liste des arguments),
  • Utilisez la :argscommande (qui prend en charge les caractères génériques et les expressions de backtick) pour remplir la liste d'arguments, ou la :argaddcommande pour y ajouter des fichiers,
  • Il suffit de les ouvrir manuellement :e, :Exou un plug - in d'ouverture de fichier.
Riches
la source
1
J'aime cette réponse car elle ne nécessite pas de quitter Vim, ce qui à mon avis est trop cher (ma précieuse liste de tampons!). J'ai quelques notes: (1) laisser des tampons sans écrire nécessite 'hidden'd'être défini; (2) la : updatecommande est une légère amélioration par rapport au :wfait qu'elle n'écrit que si une modification a été apportée, donc :bufdo updateou :argdo updateécrit tous les tampons ou arguments modifiés.
tommcdo
Bon point update. J'ai envisagé de mentionner hiddenquand j'écrivais la réponse, mais j'ai décidé de ne pas le faire parce que je ne voulais pas trop le compliquer. À la réflexion cependant, cela devrait être là. Je mettrai à jour la réponse pour inclure les deux suggestions actuellement.
Rich
@tommcdo Je viens de vérifier la documentation de: wall, et il n'écrit que les tampons modifiés, donc: la mise à jour bufdo n'est pas nécessaire après tout.
Rich
bonne prise concernant :wall, qui a également l'avantage de ne pas parcourir les tampons et de vous éloigner de l'endroit où vous avez commencé. Je suppose que :argdo updatec'est encore une autre histoire - peut-être que vous ne voulez pas écrire dans des tampons qui ne sont pas dans votre liste d'arguments.
tommcdo
@tommcdo Bon point.
Rich