Comment dois-je le répéter une modification sur plusieurs lignes dans Vim?
Je suis conscient que dans Vim, je peux souvent répéter une commande par le simple ajout d'un nombre en face d'elle. Par exemple, on peut supprimer 5 lignes par:
5dd
Il est aussi 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 "verticale modifier"? J'aimerais, par exemple, insérer un symbole particulier, dire une virgule, au début (en ignorant les espaces, c'est à dire ce que vous obtiendrez si vous tapez une virgule après la Maj j'en mode de commande) de chaque ligne dans une plage donnée. Comment cela peut-il être atteint (sans recourir à une période-bas-période-bas-période)?
Vous devez vous connecter pour publier un commentaire.
:10,20s/^/,/
Ou l'utilisation d'une macro, d'enregistrement avec:
q a i , ESC j h q
utiliser avec:
@ a
Explication:
q a
démarre l'enregistrement d'une macro pour enregistrera
,q
se termine l'enregistrement. Il existe des registresa
àz
disponibles pour cela.^\(\s*\)
capture initiale des espaces blancs et l'enregistre dans un registre, que vous pouvez ensuite lire avec\1
.Ctrl-v entre dans le mode visuel blockwise. Vous pouvez ensuite déplacer (hjkl-sage, comme d'habitude), et si vous souhaitez insérer quelque chose sur plusieurs lignes, utilisez Maj-i.
Donc pour le texte:
si vous appuyez sur Ctrl-v avec votre curseur au-dessus de la 1, appuyez sur j deux fois pour descendre deux colonnes, Maj-i,ESC , votre texte pourrait ressembler à ceci:
(multi-ligne insertion a un peu de retard, et ne sont pas rendues jusqu'à ce que vous appuyez sur ESC).
Ctrl + Shift + v
est de coller à la ligne de commande et dans vim. N'est-ce pas?Ctrl + Shift + v
est de coller dans X11 de nombreux clients du terminal (rien à voir avec vim, qui utilisep
etP
pour coller; ni vim, ni le shell de commande sont conscients de l'X11 presse-papiers). Pour contourner ce problème, vous pouvez utiliser le Verrouillage des Majuscules au lieu de shift pour obtenir la capitale V. n'oubliez pas de l'éteindre à nouveau juste après.i
sans la touche shift?C'est ce que l' :norm(al) de commande est de:
Si vous utilisez déjà le". " pour répéter votre dernière commande beaucoup, puis j'ai trouvé cette être la solution la plus pratique à ce jour. Il vous permet de répéter votre dernière commande sur chaque ligne d'un bloc visuelle en utilisant
.
exploite la ligne sage en mode visuel. Je pense que le mode visuel dans ce cas, peut parfois être pratique pour sélectionner une ligne. Mais des commandes et macros sont plus puissant et plus souple dans ce cas.Je crois que la meilleure façon de le faire est
1) l'enregistrement d'une macro d'une ligne, appelez-la "une"; dans ce cas, l'un des types de
2) sélectionner le bloc de lignes que vous souhaitez appliquer la macro à
3) utilisez la "norme" de la fonction à exécuter la macro 'a' sur ce bloc de lignes, c'est à dire,
Je pense que le plus simple est d'enregistrer une macro, puis répétez la macro autant de fois que vous le souhaitez. Par exemple, pour ajouter une virgule au début de chaque ligne, vous tapez:
à répéter 5 fois, vous entrez
- Je utiliser bloquer le mode visuel. Cela vous permet d'effectuer des insertions/modifications sur plusieurs lignes (aka "vertical modifie').
Outre les macros, comme déjà répondu, pour le cas spécifique de l'insertion d'une virgule dans une gamme de lignes (disons à partir de la ligne 10 à 20), vous pourriez faire quelque chose comme:
Qui est, vous pouvez créer un groupe numéroté match avec \( et \), et \1 dans la chaîne de remplacement à dire "remplacer le contenu de la correspondance".
Avec votre édition déjà enregistré dans la
.
opérateur, procédez de la manière suivante::norm .