Exécuter la commande pour plusieurs fichiers
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
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
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.
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>)