vi - comment générer un numéro de séquence?
Est-il un moyen pour générer un numéro de séquence dans la vi(m)?
Par exemple, à partir d'une ligne au hasard dans un fichier (ouvert dans vim), dire de la Ligne i - pour une ligne au hasard, disons de la Ligne j, où la Ligne i < Ligne-j, il est un moyen pour générer une séquence de nombres à partir de la Ligne i de la Ligne j à partir du numéro 1 au numéro j de i+1 à l'étape incrément de 1?
Dire 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éfixe du numéro de séquence à partir de la ligne 4 à la ligne n ° 8 à partir du numéro 1 au numéro 5. Après l'opération, le fichier résultant doit ê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, est-il un moyen pour augmenter le nombre de pas? ..par exemple, la séquence doit être 2, 4, 6, 8, 10.. j'.e avec le nombre d'étape 2.
Veuillez NOTER:
Ce DONC, après les est similaire, mais pas identique.
Vous devez vous connecter pour publier un commentaire.
Sélectionner plusieurs lignes, avec V(Maj-v), puis tapez la commande ci-dessous:
Type
:help sub-replace-expression
pour en savoir plus.:let i=1 | let j=1 | '<,'>g/^/ s//\=i/ | let c=i+j | let j=i | let i=c
E481: No range allowed
range
mot-clé (comme je l'ai fait) seulement de l'appliquer une fois pour toutes les lignes:function! NumberedList() range
:let i=1 | '<,'>g/^/ s//\=i . ". "/ | let i+=1
endfunction
Et puis le lier à une touche dans le mode visuelvnoremap <Leader>nl :call NumberedList()<CR>
. J'ai ajouté une période après chaque chiffre pour créer une liste numérotée.'<,'>
quand vous frappez:
, ce qui n'est pas ce que vous voulez dans ce cas. TypeCTRL-U
après:
à effacer la ligne de commande et tapez la commande nouveau.Au lieu de compliqué à construire, il vous suffit d'utiliser une macro avec l' CTRL-a fonction d'incrémenter un nombre important. Exemple de données:
d'abord insérer un numéro de début de la et un espace:
puis enregistrer la macro sur la ligne 1 (
<C-a>
signifie appuyez sur CTRL-a):Explication:
qq
: enregistrer une macro dans le registreq
0
: aller à la première colonne.yf
: tirer jusqu'à et y compris le premier espace (souvenez-vous de votre première ligne a1
et un espace).0jP
: aller vers le bas et collez le motif au début de la ligne.0<C-a>
: aller à la première colonne et le numéro de l'incrément par un.q
: fin de l'enregistrement de la macro.cela donne:
maintenant, vous pouvez appliquer cette macro à l'aide de
@q
aussi longtemps que vous le souhaitez. Si vous avez besoin d'une augmentation de deux suffit d'utiliser CTRL-aCTRL-a au lieu d'une seule fois. Maintenant, vous pouvez appliquer cette macro pour lignes consécutives, par exemple:va ajouter des numéros de ligne pour le reste de votre fichier.
f
et0
?f
, si vous copiez plusieurs chiffres. Donc, oui, il fonctionne pour les nombres avec plus d'un chiffre, juste essayé jusqu'à ce que la ligne de 1449 dans un fichier 🙂 bien sûr, vous pouvez utiliser n'importe quel autre séparation char,tab
vient à l'esprit.zz
dans ma macro pour voir l'épisode suivant. Il est difficile lorsque le curseur est en bas de l'écran.Avec Vim 8.0 on peut utiliser g Ctrl-a, voir
:help v_g_CTRL-A
Aller à la ligne n ° 4, utilisez Ctrl-v pour blockwise sélectionnez le premier caractère, appuyez sur la touche Maj j', entrez
1
(c'est 1, suivi par Espace) et Esc pour quitter le mode insertion. Résultat ressemblera à ceci:Maintenant, à partir de la ligne #5, utilisez Ctrl-v pour sélectionner tous inséré
1
l'exception de la première. Appuyez sur la touche g Ctrl-a pour créer une séquence.Utiliser 2g Ctrl-a pour utiliser un nombre de pas de 2.
à faire ce que vous voulez
si vous avez besoin d'count=2:
cela vous donnera 2,4,6,8,10
les numéros de ligne sont codées en dur dans mon exemple, vous pouvez utiliser V pour sélectionner les lignes que vous souhaitez modifier.
Sélectionnez la cible des lignes en mode Visuel, puis exécutez la commande Ex
Voici un sale truc, mais alors la vie est composée de ces. 🙂
Pas multi-plateforme.
Je pense que toutes les solutions proposées sont trop difficiles à mémoriser, vous pouvez l'utiliser qu'une fois, mais ensuite, vous devez aller dans tous les détails chaque fois que vous l'utilisez (si vous l'utilisez au moins une fois un jour ou deux).
J'ai trouvé le visual incrémentation script vraiment facile à installer et à utiliser. Une fois qu'il est installé dans vim, vous avez juste besoin de générer une colonne de 0, sélectionnez avec les touches Ctrl-V et écrire la commande :I. Il sera alors automatiquement générer davantage de nombres sur chaque ligne. Il y a également d'autres fonctionnalités:
Cela résout un problème plus général, car il travaille également à une position différente de la colonne 0 de la colonne est juste pour être sélectionnable avec Ctrl-V.
La vimball du plugin est ici ou ici.
La Nexus plugin fournit le type de Série et d'un objet, s1, du type utilisé comme ceci:
Nexus est également livré avec un s0 objet de Série, qui a un rendement de 0 en tant que sa première .next() de résultat. Les deux s0 et s1 utiliser un 1-l'étape d'incrémentation. De toutes les Séries d'objets .méthode reset() qui définit les ramener à leur lancée de la valeur. Nouvelle Série d'objets peuvent être créés comme l'appel suivant:
qui crée un 2-l'étape de l'objet de la réunion de votre deuxième demande(rendement de: 2, 4, 6, 8...)
(si votre vim a Perl soutien-défaut dans la plupart des Distributions Linux): Sélectionnez les lignes en mode visuel (V) et ne
Moins flexible, mais facile à retenir est d'utiliser une renumérotation plugin comme Renuméroter.vim http://www.vim.org/scripts/script.php?script_id=189
Si il n'y a pas de chiffres pour le moment, comme dans l'OP, un certain nombre doivent être insérés à leur place. Renuméroter peut gérer l'ordre réel et il le fait basé sur le premier numéro.
Dans cet exemple, je suis en utilisant
<C-v>
pour insérer le numéro de départ sur toutes les lignes que vous souhaitez numérotées.4G<C-v>4jGI1 <Esc>gv:Renumber
Utiliser des étapes de deux
:Renumber s2