Exécuter la commande pour plusieurs fichiers

Sep 17 2020

Je me retrouve souvent dans la situation où je souhaite exécuter plusieurs vimcommandes sur plusieurs fichiers.

Considérez file1.txt, file2.txt, file3.txt que j'aurais besoin d'exécuter :retab, puis certains :%s/ /, /par exemple.

Comment puis-je faire pipecela vim?

Réponses

4 Quasímodo Sep 17 2020 at 23:17

Tout d'abord, vous exécutez Vim, pas Vi, car ce dernier n'offre pas la retabcommande.

En supposant que le fichier doit être modifié (c'est ce que xfait ci-dessous), vous pouvez diriger les commandes vers le mode amélioré Ex de cette façon:

printf '%s\n' 'retab' '%s/ /, /' 'x' | vim -E file1.txt

Maintenant, gardez à l'esprit que Ex sautera votre .vimrc, donc retabne prendra pas tabstopet les expandtabvaleurs de ce fichier. Bien sûr, vous pouvez simplement les fournir manuellement, par exemple,

printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E file1.txt

Pour opérer sur divers fichiers (matching file[digit].txt), il suffit de l'envelopper dans une boucle shell,

for file in file[0-9].txt; do
    printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E "$file"
done
2 filbranden Sep 18 2020 at 00:21

Vous pouvez utiliser l' -cargument de la ligne de commande pour exécuter des commandes dans Vim après l'ouverture d'un fichier. Vous pouvez le transmettre plusieurs fois pour exécuter plusieurs commandes distinctes. Une fois que vous avez exécuté les commandes d'édition, vous voudrez probablement inclure un :wqpour que Vim enregistre vos modifications et quitte.

$ vim -c 'retab' -c '%s/ /, /' -c 'wq' file1.txt

Vous pouvez bien sûr l'utiliser dans une forboucle pour l'exécuter sur chacun de vos fichiers texte.

Une autre option consiste à ouvrir tous les fichiers dans Vim, puis à utiliser :argdopour exécuter une séquence de commandes dans tous les fichiers de la liste d'arguments. Dans ce cas, vous devez joindre toutes vos commandes en utilisant |(qui est le séparateur de commandes dans Vim) et vous devez terminer chacune :argdopar un :updateafin qu'il enregistre le fichier (si nécessaire) avant de passer au suivant. Ceci est important, sinon Vim pourrait refuser de s'éloigner du tampon actuel, ce qui interromprait votre :argdoexécution.

$ vim file*.txt

Puis à l'intérieur de Vim:

:argdo retab | %s/ /, / | update

Tous vos fichiers auront été mis à jour et vous serez dans le dernier fichier de votre liste d'arguments. À ce stade, vous pouvez simplement quitter Vim avec :q.

WW00WW Sep 20 2020 at 09:56

Avec le code suivant, ouvrez tous les fichiers dans vim, puis exécutez :Bufdo retab

function! Bufdo(command)
  let curbuf=bufnr("%")
  execute 'bufdo ' . a:command
  execute 'buffer ' . curbuf
endfunction
command! -nargs=+ -complete=command Bufdo call Bufdo(<q-args>)