Tirant et collant tout en incrémentant

14

J'édite un fichier .sql dans Vim:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),

Ce que je cherche à faire est d'arracher la (1, 1),ligne et de la coller 137 fois; cependant, je veux que le deuxième nombre entre parenthèses soit incrémenté à chaque fois. La sortie ressemblerait à:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),
(1, 2),
(1, 3),
...
(1, 137),

Existe-t-il un moyen de le faire dans Vim et, si oui, quelle commande dois-je utiliser?

Merci!

lisses
la source

Réponses:

11

Placez votre curseur sur la (1, 1),ligne puis tapez:

qaVypt)<C-a>q135@a

Explication:

qacommence l'enregistrement d'une macro dans le registre a (vous pouvez choisir une autre lettre).

Vyp duplique la ligne actuelle, en sélectionnant la ligne entière (V), en la copiant (y) puis en la collant en dessous (p).

t) déplacez le curseur juste avant la parenthèse fermée suivante, de sorte qu'il se trouve sur le deuxième nombre.

<C-a>( Ctrlet a) incrémente le nombre.

q termine l'enregistrement de la macro.

135@arejoue la macro stockée dans le registre a 135 fois.

Edit: Peter Rincker a une commande plus courte:

qqYpW<c-a>q135@q

Les différences sont les suivantes:

il utilise le registre q pour stocker la macro (plus rapide à taper qqque qaparce que c'est la même touche),
il copie la ligne avec une seule touche Y(au lieu de deux Vy),
et il déplace le curseur sur le deuxième numéro avec une seule touche W(à la place de t)).

saginaw
la source
4
Golf vim: qqyypW<c-a>q135@q. Encore plus court si vous utilisez Yau lieu de yy.
Peter Rincker
9

Les récents Vims ont appris à incrémenter des régions visuelles sélectionnées ainsi qu'à créer une séquence. Vous pouvez donc le faire après avoir collé votre ligne 137 fois:

1) sélectionner visuellement le bloc ( Ctrl-V) le deuxième 1 à partir de la ligne 3.

2) appuyez sur gCtrl-A

J'ai enregistré un casting d'écran ici

Avertissement: Cela nécessite un Vim 7.4.900 ou plus.

Christian Brabandt
la source
Testé avec succès dans Vim 7.4.826 sur Debian / Sid.
Dubu
Votre screencast a disparu mais cette méthode est IMPRESSIONNANTE! Merci.
david_nash
2

Le moyen facile à comprendre / facile à retenir / facile à adapter à d'autres situations: utilisez le plugin VisIncr (si vous préférez utiliser une version qui fonctionne bien avec les gestionnaires de paquets de ce siècle plutôt que de traiter avec vimballs , vous pouvez l'obtenir auprès de GitHub ). Avec ça:

  • allez à la (1, 1),ligne et tirez dessus:Vy
  • collez-le 136 fois: 136p
  • allez dans la deuxième colonne de 1et marquez-la verticalement:C-vGf)h
  • exécutez l'incrément: :II
  • lire le manuel pour découvrir les autres goodies: :help visincr.
Sato Katsura
la source
1

Je jouerais avec g^a.

Essayez 137i0^v137kg^a.

Moisès
la source
1
Bienvenue chez Vi et Vim ! J'ai formaté votre réponse à l'aide de démarques. Ce serait encore mieux si vous éditez pour expliquer comment cela répond à la question OPs.
D. Ben Knoble