Macro Vim sur chaque ligne de sélection visuelle

Je voudrais lancer 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 

Dans

 First Last 

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

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

Des idées de gourous Vim?

EDIT: Ceci est juste un exemple, évidemment, c’est sortingvialement regexable, mais il y a d’autres exemples qui ne sont pas si faciles que je préférerais utiliser des macros.

Supposons que vous ayez une macro q exécutée (et restée) 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à un groupe de lignes sélectionné, bash : produit :'< ,'> sur la ligne de commande)

Par exemple, la macro suivante capitalise chaque mot, sauf le premier sur une ligne:

 :let @q="^dwgU$P" 

Donc, l’exécuter sur les éléments suivants (où 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 la commande normal @q ci-dessus, 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. 

Sélectionnez les lignes puis appuyez sur : pour accéder au mode de commande. Vim remplira automatiquement '< ,'> , ce qui limite la plage aux lignes sélectionnées. Pour votre exemple, vous pouvez utiliser la commande :s pour effectuer le swap:

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

Cela échangera deux mots séparés par une virgule sur chaque ligne de la sélection visuelle.

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

Si vous voulez rejouer une macro enregistrée sur chaque ligne, vous devez exécuter la macro avec la commande :normal . Malheureusement, la commande :normal ne fonctionne pas sur une gamme de lignes, mais vous pouvez corriger cela avec la commande :global . Cela exécute une commande :ex sur chaque ligne correspondant à une expression régulière, vous pouvez donc le faire:

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

Explication:

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

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

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

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

 :Rover a