À quoi sert le mode EX pour le traitement par lots?


20

Le didacticiel mentionne que le mode Ex est destiné au traitement par lots. Puisqu'il s'agit pour moi d'une nuisance plutôt que d'un outil, j'aimerais voir quelques exemples pratiques. Qui l'utilise? Pourquoi?

À quoi sert le mode EX pour le traitement par lots?


@Masi: associez vos comptes afin que les publications migrées soient associées à votre compte SU après la migration.
Greg Hewgill

Réponses:


4

Vim en mode Ex (également appelé ex) est utile lorsque:

  • Vous avez besoin de modifier (plusieurs) fichiers de manière non interactive (dans le cadre du script).
  • Votre connexion est très lente ou l'écran n'est pas mis à jour après vos actions.
  • Les mappages et abréviations sont désactivés.
  • Des touches communes telles que Escapeou Controlne fonctionnent pas correctement.

Modification de fichiers non-interactive est l'utilisation et les plus courantes à l' utiliser de manière similaire sedet awk, mais ils sont plus sont orientés flux - ils ne lisent que le fichier avant du début à la fin tout vimest orienté BUFFER - vous pouvez aller de l' avant et vers l' arrière dans le fichier comme vous le souhaitez. Deuxièmement, les expressions régulières de vim sont plus puissantes que les expressions de awk et sed (elles ne sont pas conçues pour fonctionner avec plusieurs lignes) - par exemple, vim peut correspondre sur plusieurs lignes et ne prend en charge aucune correspondance.

Ex est également un éditeur (prédécesseur direct de vi) et dans Vim - le mode Ex émule ex(ils exécutent toujours le même code), il est donc possible d'accéder au mode de commande exde l'intérieur de vi et vice-versa. Il existe un mode Ex ( vim -e) et un mode Ex amélioré qui permet des commandes plus avancées que le mode Ex compatible vi ( vim -E). Voir: Quelle est la différence entre le mode Ex et le mode Ex amélioré?

Ex est la racine d'une famille d'éditeurs: edit, ex et vi. Ex est un super-ensemble de ed, l'extension la plus notable étant une fonction d'édition d'affichage. ex (1)


Exemple 1

Voici exemple simple de changer 127à 128votre hostsfichier et imprimer la sortie:

ex -s +%s/127/128/g +%p +q! /etc/hosts

est équivalent à:

sed s/127/128/g /etc/hosts

Pour une solution plus avancée, vous pouvez avoir un fichier avec des commandes vim et l'utiliser par une approche plus classique de la redirection d'E / S:

echo :%s/127/128/g > cmds.vim
echo :%print >> cmds.vim
echo :%quit! >> cmds.vim
ex -s /etc/hosts < cmds.vim # The same as: vim -s cmds.vim /etc/hosts

Exemple 2

Vous pouvez également utiliser des plugins vim pour effectuer certaines tâches.

Par exemple, le one-liner suivant convertirait votre fichier de code source en html en utilisant l'un des plugins standard:

ex -s '+let g:html_no_progress=1' '+syntax on' '+set ft=c' '+runtime syntax/2html.vim' -cwqa my_code.c

Il générera un fichier html (avec mise en évidence de la syntaxe) à partir de votre code (écrit dans n'importe quelle langue prise en charge) qui est prêt pour l'impression ou la publication sur votre site Web.


Exemple 3

Ou un exemple réel en direct de la spécification RPM :

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

Exemple 4

Le script suivant créera un nouveau fichier html en téléchargeant html du site Example et en remplaçant son corps par une table 20x20 générée automatiquement avec des nombres aléatoires:

" table.vim
%!curl -s example.com 
let @t='<table>'.repeat('<tr>'.repeat('<td>_</td>',20).'</tr>',20).'</table>'
/<body
norm!vitd"tP
%s/_/\=system('echo $RANDOM')/g
wq

Usage:

ex -s table.html < table.vim

Cela fonctionnera sur les systèmes de type * nix avec curl installé. Cliquez -Vsur Ajouter pour voir le script en action.

Plus d'exemples:


Voir également:


22

Le mode Ex sert principalement à effectuer la même action sur un certain nombre de fichiers.

Supposons que vous ayez 25 fichiers .html avec:

<a href="/superuser//home.html"> ...

Au lieu d'ouvrir chacun d'entre eux, vous pouvez utiliser le mode Ex pour tout changer en index.html:

vim -E -s bob.html <<-EOF
   :%substitute/home.html/index.html/
   :update
   :quit
EOF

7
Une mise en œuvre complète - et plus concise - serait for file in *.html; do vim -es -c '%s/home\.html/index.html/g' -c wq "$file"; done.
intuition

6

Depuis le récent 7.3 qui, en tant que support d'annulation permanent, le mode ex et d'autres formes de traitement par lots vim est supérieur aux autres méthodes non vim, car il n'encombrera pas l'historique d'annulation.

Ajout: 'annulation persistante' si activée, conserve toutes les modifications apportées à un fichier (jusqu'à une limite) dans l'historique d'annulation, à travers les sessions d'édition de vim. Si le fichier est édité par un programme externe, vim réinitialisera l'historique d'annulation lors de la détection par somme de contrôle qu'il a changé. vim -E vous permettra de modifier un fichier par lots et la modification sera dans l'historique d'annulation.


2
Cela semble assez exagéré, mais c'est certainement raisonnable et intelligent! +1
Tarrasch

1

Cela ne répond pas à votre question sur le traitement par lots, mais c'est une autre façon d'expliquer ce qu'est le mode Ex. Vous savez comment vous appuyez:passer en mode ligne de commande et entrer des commandes? Eh bien, le mode Ex vous permet également d'entrer les mêmes commandes, sauf que Vim ne quitte pas le mode Ex après avoir entré une commande, il reste en mode Ex et vous pouvez entrer une autre commande. C'est donc un peu comme un REPL (lire, évaluer, imprimer, boucler), mais sans l'impression (donc juste un REL ...). Je reviendrai sur les raisons pour lesquelles vous voudrez peut-être ce type de REL plus tard. C'est pourquoi il est appelé mode Ex, il vous permet d'entrer des commandes Ex, ce qui est la même chose que le mode ligne de commande, il vous permet d'entrer une commande Ex. Une autre façon de l'expliquer, c'est qu'il vous permet d'entrer et d'exécuter immédiatement le code Vimscript / VimL. Vimscript / VimL est un langage que vous pouvez utiliser pour écrire des plugins Vim. C'est également le langage que vous utilisez pour écrire votre fichier de configuration (proably .vimrc). C'est également la langue que vous utilisez lorsque vous entrez des commandes Ex à partir du mode ligne de commande ou du mode Ex. Donc, de ce point de vue, le mode Ex peut être considéré comme un REL VimL. Pourquoi voudriez-vous un VimL REL? Pour la même raison, les gens aiment les REPL pour d'autres langues. Ils peuvent être très utiles pour déboguer du code ou expérimenter le langage pour voir comment les choses fonctionnent, surtout si vous écrivez des plugins dans VimL ou personnalisez fortement votre fichier de configuration (ce qui signifierait probablement que vous violez le principal SRP et que vous devez le décomposer en plugins).


Ce serait formidable d'obtenir des exemples sous forme de vidéos pour montrer l'utilité de l'ancien mode. Je ne l'ai jamais réalisé car je peux utiliser le gestionnaire de fenêtres Linux et le mode visuel de vim avec :!pythonetc.
Léo Léopold Hertz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.