3 votes

vim : modification de la valeur d'une variable ligne par ligne

Disons que j'ai tapé ce qui suit

a + 1 =b and a+1=c

J'ai besoin de 2 autres expressions comme celle-là mais je veux augmenter la valeur de 1 à 3, donc j'ai copié-collé l'expression ci-dessus 2 fois de plus et j'ai augmenté manuellement 1, donc maintenant mon fichier ressemble à ceci

a + 1 =b and a+1=c
a + 2 =b and a+2=c
a + 3 =b and a+3=c

Y a-t-il un moyen d'automatiser cela ? C'est un peu comme chercher et remplacer, sauf que je dois chercher l'expression et non le caractère, parce que 1 est écrite est d'autres expressions que je ne veux pas changer. et je veux changer la valeur de 1 par ligne. Chaque expression est sur une nouvelle ligne.

4voto

muru Points 180007

Vim dispose d'un moyen d'incrémenter un nombre automatiquement : <c-a> (ou Ctrla ) en mode normal.

Ainsi, en utilisant une macro, il est assez facile de construire une séquence croissante de nombres dans Vim. Commencez à la ligne contenant a+ 1 =b and a+1=c et :

qq
Yp^Aw^A
q

El ^A signifie qu'il faut appuyer sur Ctrla . Ensuite, utilisez @q pour répéter la macro. Donc 4@q produirait :

a + 1 =b and a+1=c
a + 2 =b and a+2=c
a + 3 =b and a+3=c
a + 4 =b and a+4=c
a + 5 =b and a+5=c
  • qq lance la macro ( q ) en sauvegardant dans le registre q .
  • Y efface la ligne courante (dans le sens de la ligne)
  • p colle et vous vous retrouvez au début de la ligne suivante (anciennement actuelle).
  • <c-a> vous incrémentez le premier chiffre de la ligne (et le curseur s'y déplace)
  • vous passez donc au mot suivant et vous incrémentez à nouveau ( w<c-a> ), en affectant cette fois le deuxième numéro.

3voto

Lieven Keersmaekers Points 146

Outre l'utilisation d'une macro, vous pouvez également utiliser la fonction "Rechercher et remplacer".

yy2p
:%s/\v\d+/\=line('.')/g
  • yy2p arrache la ligne et la passe deux fois
  • :%s tarte une recherche et un remplacement
  • \v\d+ recherche tous les caractères numériques
  • \=line('.') évalue la fonction de la ligne comme remplacement pour toutes les correspondances

une autre option encore est

:pu! =map(range(1,3), 'printf(''a + %d =b and a+%d=c'', v:val, v:val)')

difficile à retenir, mais vous n'avez pas besoin d'arracher, de chercher ou de faire une macro. En partant d'un buffer vide, vous obtenez toute l'enchilada en une seule commande.

2voto

De nombreuses distributions de vim sont fournies avec un support Perl intégré.

Si c'est votre cas, vous le pouvez :

:perldo s/a\+1=b and a\+1=c/sprintf('a+%d=b and a+%d=c',++$aux,$aux)/e

(J'ai probablement changé les espaces dans l'exemple...)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X