web-dev-qa-db-fra.com

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 chiffre devant celle-ci. Par exemple, on peut supprimer 5 lignes en:

5dd

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

:10,20s:hello:goodbye:gc

Comment puis-je effectuer un «montage vertical»? J'aimerais, par exemple, insérer un symbole particulier, par exemple une virgule, au début (en sautant un espace, c'est-à-dire ce que vous obtiendrez si vous tapez une virgule après Maj-I en mode commande) de chaque ligne intervalle. Comment cela peut-il être réalisé (sans recourir à une période indéterminée)?

100
saffsd

:10,20s/^/,/

Ou utilisez une macro, enregistrez avec:

q a i , ESC j h q

utiliser avec:

@ a

Explication: q a commence l'enregistrement d'une macro dans laquelle enregistrer a, q termine l'enregistrement. Des registres a à z sont disponibles à cet effet.

93
Svante

Ctrl-v passe en mode visuel bloc par bloc. Vous pouvez ensuite bouger (hjklcomme d'habitude), et si vous voulez insérer quelque chose sur plusieurs lignes, utilisez Shift-i.

Donc pour le texte:

abc123abc
def456def
ghi789ghi

si vous frappez Ctrl-v avec votre curseur sur le 1, appuyez sur j deux fois pour descendre deux colonnes, puis Shift-i,ESC , votre texte ressemblerait à ceci:

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

(l’insert multiligne a un peu de retard et ne sera pas rendu avant APRES avoir atteint ESC).

112
rampion

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

: 10,20 normal I, 
50

Si vous utilisez déjà le '.' pour répéter votre dernière commande beaucoup, alors j'ai trouvé ceci être la solution la plus pratique jusqu'à présent. 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 .<CR>
39
emboss

Je crois que le moyen le plus simple de le faire est

1) enregistrer une macro pour une ligne, appelez-le 'a'; dans ce cas on tape

q a I, ESC j q

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

3) utilisez la fonction 'norm' pour exécuter la macro 'a' sur ce bloc de lignes, c'est-à-dire,

:'<,'>norm@a
18
Albert

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

q a I , ESC j q

répéter 5 fois, vous entrez

5 @ a
15
wimh

J'utilise bloque le mode visuel . Cela vous permet d’effectuer des insertions/modifications sur plusieurs lignes (aussi appelé «modifications verticales»).

2
ONODEVO

Outre les macros, comme indiqué précédemment, dans le cas particulier de l'insertion d'une virgule dans une plage de lignes (par exemple, lignes 10 à 20), vous pouvez effectuer les opérations suivantes: 

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

Autrement dit, vous pouvez créer une correspondance de groupe numérotée avec\(et \) et utiliser\1 dans la chaîne de remplacement pour dire "remplacer par le contenu de la correspondance".

1
Paolo Tedesco

Avec votre modification déjà enregistrée dans l'opérateur ., procédez comme suit:

  1. Sélectionnez le texte auquel vous souhaitez appliquer l'opérateur à l'aide du mode visuel
  2. Puis lancez la commande :norm .
0
Noah