web-dev-qa-db-fra.com

vi - comment générer une suite de nombres?

Existe-t-il un moyen de générer une suite numérique en vi (m)? 

Par exemple, d'une ligne aléatoire dans un fichier (ouvert dans vim), dites Row-i - à une ligne aléatoire, dites Row-j, où Row-i <Row-j, existe-t-il un moyen de générer une séquence numérique à partir de -i à Row-j en commençant par le nombre 1 au numéro j-i + 1 avec incrément de 1?

Dites que j'ai les lignes suivantes dans un fichier.

this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10

Je souhaite préfixer la séquence de numéros de la ligne 4 à la ligne 8 en commençant par le numéro 1 au numéro 5. Après l'opération, le fichier résultant doit être le suivant:

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10

Si cela est possible, existe-t-il un moyen d'augmenter le nombre de pas? ..par exemple, la séquence doit être 2, 4, 6, 8, 10 .. c’est-à-dire avec le nombre de pas 2. 

Notez s'il vous plaît: 

Ce SO post est similaire mais pas identique.

39

Wybierz kilka linii za pomocąV(Shift-v), un résumé du rôle de la police:

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

Wpisz :help sub-replace-expression, aby przeczytać więcej.

46
kev

Au lieu d’une construction compliquée, vous pouvez simplement utiliser une macro avec le CTRL-a fonction pour incrémenter un nombre en tête. Exemple de données:

aaa
bbb
ccc

insérez d’abord un numéro de départ et un espace:

1 aaa
bbb
ccc

puis enregistrez cette macro sur la ligne 1 (<C-a> signifie appuyez sur CTRL-a):

qq0yf 0j0P0<C-a>q

Explication:

  1. qqname__: enregistrer la macro dans le registre qname__
  2. 0: va à la première colonne.
  3. yfname__: supprime tout jusqu'au premier espace inclus (souvenez-vous que votre première ligne a 1 et un espace).
  4. 0jP: descendez et collez le motif au début de la ligne.
  5. 0<C-a>: va à la première colonne et incrémente d'un nombre.
  6. qname__: termine l'enregistrement de la macro.

cela donne:

1 aaa
2 bbb
ccc

vous pouvez maintenant appliquer cette macro à l'aide de @q aussi longtemps que vous le souhaitez. Si vous avez besoin d'une augmentation de deux, utilisez simplement CTRL-aCTRL-a au lieu d'une seule fois. Vous pouvez maintenant appliquer cette macro à des lignes consécutives, par exemple:

:.,$norm @q

ajoutera des numéros de ligne de repère pour le reste de votre dossier.

27
hochl

Avec Vim 8.0 , on peut utiliser g Ctrl-a, voir :help v_g_CTRL-A

Allez à la ligne 4, utilisez Ctrl-v pour sélectionner le premier caractère par blocs, appuyez sur Shift i, entrez 1 (ceci est 1, suivi par Space) et Esc pour quitter le mode insertion. Le résultat ressemblera à ceci:

this is line #1
this is line #2
this is line #3
1 this is line #4
1 this is line #5
1 this is line #6
1 this is line #7
1 this is line #8
this is line #9
this is line #10

Maintenant, à partir de la ligne 5, utilisez Ctrl-v à nouveau pour sélectionner tous les insérés 1 sauf le premier. presse g Ctrl-a créer une séquence.

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5                                                                     
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #1

Utilisation 2g Ctrl-a utiliser un nombre de pas de 2.


Inspiré par l'utilisateur soulthym : Vous pouvez enregistrer quelques frappes en commençant par la sélection visuelle à la ligne 8. Sélectionnez le premier caractère, insérez le 1, appuyez sur gv pour réappliquer l'ancienne sélection visuelle, appuyez sur j omettre le premier 1 et appuyez sur g Ctrl-a créer une séquence.

18
rkta
:4,8s/^/\=line(".")-3." "    

fera ce que tu veux

si vous avez besoin de compter = 2:

:4,8s/^/\=2*(line(".")-3)." " 

cela vous donnera 2,4,6,8,10

les numéros de ligne sont codés en dur dans mon exemple, vous pouvez utiliser V pour sélectionner les lignes que vous souhaitez modifier.

9
Kent

Sélectionnez les lignes cibles en mode visuel, puis exécutez la commande Ex.

:'<,'>s/^/\=(line('.')-line("'<")+1).' '
2
ib.

Voici un truc sale mais la vie en est composée. :)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

Pas traverser la plate-forme. 

1
Noufal Ibrahim

Le plugin Nexus fournit le type Series et un objet, s1, de ce type utilisé comme ceci:

:4,8s/^/\=s1.next().' '/

Nexus est également livré avec un objet s0 Series qui renvoie 0 comme premier résultat .next (). Les valeurs s0 et s1 utilisent un incrément en 1 étape. Tous les objets Series ont une méthode .reset () qui les restaure à leur valeur initiale. Les nouveaux objets de la série peuvent être créés comme suit:

let s2 = Series(0, 2)

ce qui crée un objet en 2 étapes répondant à votre seconde requête (rendement: 2, 4, 6, 8 ...)

1
dahu

Je pense que toutes les solutions proposées sont trop difficiles à retenir, vous pouvez les utiliser une fois, mais vous devez entrer dans tous les détails à chaque fois que vous les utilisez (si vous l’utilisez moins d’une fois par jour).

J'ai trouvé le script incrémentant visuel vraiment facile à installer et à utiliser. Une fois installé dans vim, il vous suffit de générer une colonne de 0, de la sélectionner avec Ctrl-V et d'écrire la commande suivante: I. Il générera alors automatiquement des nombres croissants sur chaque ligne. Il y a aussi d'autres fonctionnalités:

  • commencez par un nombre différent de 0
  • numéros de pad gauche ou droit avec des 0 (comme 001, ..., 015)
  • nombre décroissant ou croissant
  • augmenter de plus de 1
  • dates (mais vous avez besoin d'un plugin supplémentaire), lettres de l'alphabet, noms de jour

Cela résout un problème plus général car il fonctionne également à une position différente de la colonne 0, celle-ci doit simplement être sélectionnée avec Ctrl-V.

Le vimball du plugin est ici ou ici .

1
Gismo Ranas

(si votre vim est supporté par Perl - valeur par défaut dans de nombreuses distributions Linux): sélectionnez les lignes en mode visuel (V) et

:perldo s/^/++$z . " "/e
0
JJoao