vim - substitute - vi replace all



vi-comment générer une séquence de nombres? (7)

Y a-t-il un moyen de générer une séquence de nombres dans vi (m)?

Par exemple, à partir d'une ligne aléatoire dans un fichier (ouvert dans vim), disons Row-i - vers une ligne aléatoire, par exemple Row-j, où Row-i <Row-j, existe-t-il un moyen de générer des numéros -i à Rang-j commençant par le nombre 1 au nombre j-i + 1 avec l'incrément de pas égal à 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 veux 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 devrait être comme suit:

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, y a-t-il un moyen d'augmenter le nombre de pas? ..Par exemple, la séquence devrait être 2, 4, 6, 8, 10 .. c'est-à-dire avec le nombre de pas 2.

Notez s'il vous plaît:

Cet article est similaire mais pas le même.


(si votre vim a le support Perl - par défaut dans beaucoup de distributions Linux): Sélectionnez les lignes en mode visuel (V) et faites

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

Au lieu d'une construction compliquée, vous pouvez simplement utiliser une macro avec la fonction CTRL-a pour incrémenter un nombre premier. 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 enregistrer cette macro sur la ligne 1 ( <Ca> signifie appuyer sur CTRL-a ):

qq0yf 0j0P0<C-a>q

Explication:

  1. qq : enregistre la macro dans le registre q
  2. 0 : aller à la première colonne.
  3. yf : tirez tous jusqu'à et y compris le premier espace (rappelez-vous que votre première ligne a 1 et un espace).
  4. 0jP : descends et colle le motif au début de la ligne.
  5. 0<Ca> : aller à la première colonne et incrémenter le nombre par un.
  6. q : fin de l'enregistrement de la macro.

cela donne:

1 aaa
2 bbb
ccc

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

:.,$norm @q

ajoutera les numéros de ligne principaux pour le reste de votre fichier.


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

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

  • commence par un nombre différent de 0
  • numéros de pads gauche ou droite avec 0 (comme 001, ..., 015)
  • nombre décroissant ou croissant
  • augmenter de plus de 1
  • dates (mais vous avez besoin d'un plugin supplémentaire), les lettres de l'alphabet, les 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, la colonne doit simplement être sélectionnable avec Ctrl-V.

Le vimball du plugin est here ou here .


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 de la série s0 qui donne 0 comme premier résultat .next (). Les deux s0 et s1 utilisent un incrément de 1 étape. Tous les objets de la série ont une méthode .reset () qui les ramène à leur valeur initiée. Les objets New Series peuvent être créés comme l'appel suivant:

let s2 = Series(0, 2)

ce qui crée un objet en 2 étapes répondant à votre deuxième requête (cédant: 2, 4, 6, 8 ...)


Sélectionnez plusieurs lignes avec V (Shift-v), puis tapez la commande ci-dessous:

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

Tapez :help sub-replace-expression pour en savoir plus.


Une méthode moins flexible, mais facile à retenir, consiste à utiliser un plugin de renumérotation comme Renumber.vim http://www.vim.org/scripts/script.php?script_id=189

S'il n'y a pas encore de chiffres, comme dans le PO, un certain nombre devrait être inséré à leur place. Renuméroter peut gérer l'ordre réel et il le fait en fonction du premier nombre.

Dans cet exemple, j'utilise <Cv> pour insérer le numéro de départ sur toutes les lignes que vous voulez numéroter.

4G<Cv>4jGI1 <Esc>gv:Renumber

Pour utiliser les étapes de deux

:Renumber s2


: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 voulez changer.





sequential