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.
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.
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:
qq
name__: enregistrer la macro dans le registre q
name__0
: va à la première colonne.yf
name__: supprime tout jusqu'au premier espace inclus (souvenez-vous que votre première ligne a 1
et un espace).0jP
: descendez et collez le motif au début de la ligne.0<C-a>
: va à la première colonne et incrémente d'un nombre.q
name__: 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.
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.
: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.
Sélectionnez les lignes cibles en mode visuel, puis exécutez la commande Ex.
:'<,'>s/^/\=(line('.')-line("'<")+1).' '
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.
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 ...)
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:
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.
(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