78 votes

Macro Vim sur chaque ligne de la sélection visuelle

J'aimerais exécuter une macro sur chaque ligne d'une sélection, plutôt que de totaliser le nombre de lignes dans ma tête. Par exemple, je pourrais écrire une macro pour transformer :

Last, First

Sur

First Last

et j'aimerais qu'il fonctionne sur toutes ces lignes :

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

Une idée des gourous de Vim ?

EDIT : Ceci n'est qu'un exemple, évidemment c'est trivialement regexable, mais il y a d'autres cas qui se présentent qui ne sont pas aussi faciles et pour lesquels je préfère utiliser des macros.

145voto

rampion Points 38697

Supposons que vous ayez une macro q qui fonctionnait (et restait) sur une seule ligne. Ensuite, vous pouvez l'exécuter sur chaque ligne de votre sélection avec :

:'<,'>normal @q

(si vous avez déjà sélectionné un groupe de lignes, la touche : produit :'<,'> sur la ligne de commande)

Par exemple, la macro suivante met en majuscules tous les mots sauf le premier sur une ligne :

:let @q="^dwgU$P"

Ainsi, en l'exécutant sur les éléments suivants (où le + les lignes sont sélectionnées)

 0000: a long long time ago
 0001: in a galaxy far away
+0002: naboo was under an attack
+0003: and i thought me and qui-gon jinn
+0004: could talk the federation in
 0005: to maybe cutting them a little slack.

Avec ce qui précède normal @q produit :

 0000: a long long time ago
 0001: in a galaxy far away
 0002: naboo WAS UNDER AN ATTACK
 0003: and I THOUGHT ME AND QUI-GON JINN
 0004: could TALK THE FEDERATION IN
 0005: to maybe cutting them a little slack.

16voto

Dave Kirby Points 12310

Sélectionnez les lignes puis appuyez sur : pour entrer en mode commande. Vim remplira automatiquement '<,'> qui limite la plage aux lignes sélectionnées. Pour votre exemple, vous pouvez utiliser l'option :s pour effectuer l'échange :

:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/

Cela permettra d'échanger deux mots séparés par une virgule sur chaque ligne de la sélection visuelle.

Vous pouvez également utiliser '< y '> comme n'importe quel autre signet ou position de ligne, par exemple dans le cadre d'une commande de mouvement, donc en mode normal d'< supprimera la position actuelle du curseur jusqu'au début de la première ligne de la sélection visuelle. Les marques restent en vigueur même si le bloc n'est plus mis en évidence visuellement.

Si vous voulez relire une macro enregistrée sur chaque ligne, vous devez exécuter la macro avec la commande :normal commande. Malheureusement, le :normal ne fonctionne pas sur une plage de lignes, mais vous pouvez corriger cela avec la commande :global commande. Celle-ci exécute un :ex sur chaque ligne qui correspond à une regex, donc vous pouvez faire ceci :

:'<,'>g/^/ norm @a

Explication :

:'<,'>       for every line in the visual block
g/^/         on every line that matches the regex /^/ - i.e. every line
norm         run in normal mode
@a           the macro recorded in a

1voto

user2571881 Points 1787

Vous pouvez ajouter la fonction ci-dessous à votre ~/.vimrc ou simplement le copier sur votre navigateur et l'exécuter :@+

fun! RunMacroOverSelection(macroname)
    execute "'<,'>normal @". a:macroname
endfun
com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
nnoremap <leader>r :Rover<space>

L'avantage est que vous pouvez appliquer n'importe quelle macro sur la sélection visuelle. Vous devez donner la lettre de la macro comme argument, par exemple :

:Rover a

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X