Comment répéter une édition sur plusieurs lignes dans Vim?

Je suis conscient que dans Vim, je peux souvent répéter une commande en ajoutant simplement un numéro devant lui. Par exemple, on peut supprimer 5 lignes par:

5dd 

Il est également souvent possible de spécifier une plage de lignes pour appliquer une commande, par exemple

 :10,20s:hello:goodbye:gc 

Comment puis-je effectuer une «modification verticale»? J’aimerais, par exemple, insérer un symbole particulier, par exemple une virgule, au début (ignorer les espaces, c’est-à-dire ce que vous obtiendriez si vous tapez une virgule après Shift-I en mode commande) de chaque ligne d’un gamme. Comment cela peut-il être réalisé (sans avoir recours à une période de baisse de la période descendante)?

:10,20s/^/,/

Ou utilisez une macro, enregistrez avec:

qai , ESC jhq

utiliser avec:

@ a

Explication: qa commence à enregistrer une macro pour enregistrer a , q termine l’enregistrement. Il existe des registres a à z disponibles pour cela.

Ctrlv entre en mode visuel en mode bloc. Vous pouvez alors vous déplacer ( h j k l -wise, normalement), et si vous voulez insérer quelque chose sur plusieurs lignes, utilisez Shifti .

Donc pour le texte:

 abc123abc def456def ghi789ghi 

Si vous appuyez sur Ctrlv avec votre curseur sur le 1, appuyez deux fois sur j pour descendre deux colonnes, puis sur Shifti , ESC , votre texte ressemblera à ceci:

 abc,123abc def,456def ghi,789ghi 

(L’insert multiligne a un petit décalage et ne sera rendu qu’après que vous ayez appuyé sur ESC ).

Voilà à quoi sert la commande: norm (al):

 : 10,20 normal je,

Si vous utilisez déjà le ‘.’ pour répéter votre dernière commande beaucoup, alors j’ai trouvé que c’était la solution la plus commode jusqu’ici. Il vous permet de répéter votre dernière commande sur chaque ligne d’un bloc visuel en utilisant

 " allow the . to execute once for each line of a visual selection vnoremap . :normal . 

Je crois que la meilleure façon de le faire est

1) enregistrer une macro pour une ligne, l’appeler ‘a’; dans ce cas on tape

qa je, ESC jq

2) sélectionnez le bloc de lignes auquel vous souhaitez appliquer la macro

3) utiliser la fonction ‘norm’ pour exécuter la macro ‘a’ sur ce bloc de lignes, c.-à-d.

 :'<,'>norm@a 

Je pense que le plus simple est d’enregistrer une macro, puis de répéter la macro autant de fois que vous le souhaitez. Par exemple, pour append une virgule au début de chaque ligne, tapez:

 qa I , ESC jq 

pour répéter cela 5 fois, vous entrez

 5 @ a 

J’utilise le mode visuel par blocs . Cela vous permet d’effectuer des insertions / modifications sur plusieurs lignes (alias «éditions verticales»).

En dehors des macros, comme cela a déjà été dit, pour le cas spécifique de l’insertion d’une virgule dans une série de lignes (par exemple, de la ligne 10 à 20), vous pouvez faire quelque chose comme:

 :10,20s/\(.*\)/,\1 

C’est-à-dire que vous pouvez créer une correspondance de groupe numérotée avec \ (et \) et utiliser \ 1 dans la chaîne de remplacement pour indiquer “remplacer par le contenu de la correspondance”.