J'ai un fichier texte comme celui-ci (en utilisant gVim sous Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Je veux ajouter un numéro à chaque ligne du fichier. Ne pas utiliser :set number
, mais ajouter le numéro en tant que texte précédant chaque ligne, comme suit, de sorte que le numéro fasse partie du fichier.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
la source
la source
awk
est probablement l'outil pour ce travail. Mais je suis sous Windows (soupir).cat
ounl
, qui peuvent faire des lignes numériques, mais ne sont généralement pas disponibles sous Windows (comme OP l'indique dans leur commentaireawk
). Les deux premières solutions sont purement Vim. Enfin, toutes les lignes par rapport à un para ne sont qu'une question de sélection de plage. Ce n'est clairement pas un gros problème.Réponses:
En pure mode Vim:
Explication:
Voir
:help \=
et:help line()
.L'utilisation d'une expression dans la pièce de rechange est très puissante et FWIW un assez bon point d'entrée pour vimscript.
la source
:help sub-replace-expression
Une bonne chose à propos des macros Vim est qu'elles peuvent récurrer (elles peuvent s'appeler):
qqq
ggI1.
(n'oubliez pas l'espace!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
La macro continuera ensuite à s'appeler jusqu'à ce qu'elle atteigne la fin du fichier.
Vous pouvez utiliser l'astuce macro récursive pour de nombreux autres problèmes similaires, c'est donc une bonne chose à savoir.
Si vous ne souhaitez pas utiliser une macro récursive pour une raison quelconque, vous pouvez omettre les étapes 1 et 8 et utiliser un décompte pour exécuter la macro plusieurs fois, par exemple
100@q
exécutera la macroq
100 fois.la source
J'aime utiliser la commande globale vim pour accomplir des tâches comme celle-ci. Cela s'applique à l'ajout d'une itération au début d'une ligne ou à la modification d'un symbole dans le texte. Cela semble plus compliqué que les autres solutions, mais c'est un modèle assez flexible à utiliser lorsque vous l'avez à portée de main, et il est facile à modifier sans beaucoup de réflexion.
Tout d'abord, choisissez votre plage (quelles lignes vous souhaitez appliquer). J'utilise généralement des marques (par exemple
ma
sur la première ligne etmb
sur la seconde, mais vous pouvez également utiliser des numéros de ligne ou une sélection visuelle), puis entrez une modification de la commande suivante (actuellement modifiée pour votre cas d'utilisation)Déconstruction
Cela définit une variable
i
avec une valeur de départ. Habituellement, les listes commencent par 1, donc je mets i à 1.La barre démarre une nouvelle commande
Cela définit la plage de la commande suivante. Je vais de marque
a
en marqueb
, ce qui serait défini sur la première ligne et la dernière ligne de votre liste.Ceci est la commande globale. Il recherche dans le fichier (ou la plage) une expression régulière donnée et exécutera le reste de la ligne de commande sur chacune des lignes correspondantes. Je fais correspondre chaque ligne en recherchant "début de ligne". Si vous aviez du texte comme
et veulent seulement mettre ces étiquettes devant
Item
et ignorer les autres lignes, faitesg/Item/
ou à lag/^Item/
place (en supposant le texte littéral de l'article)Cela exécute l'expression régulière pour remplacer le début de la ligne par la valeur de
i
concaténé avec a.
. En général, vous pouvez le faire pour n'importe quoi (remplacez l'étiquetteItem
par le numéro, par exemple).Même si la barre démarre une nouvelle commande, elle configure une deuxième commande à exécuter dans la commande globale, au lieu de la fin de la commande globale. Le résultat est que nous incrémentons
i
avant que la ligne suivante soit traitée par g. Voici un autre lieu de flexibilité. La modification de i peut être n'importe quoi (incrémenter de 2, appeler une fonction qui génère l'élément suivant de la séquence de Fibonacci, peu importe).la source
Ajouter des numéros à toutes les lignes
Il est possible d'utiliser des commandes
:%!nl -ba
ou:%!cat -n
qui ajouteront des numéros de ligne à toutes les lignes.Sous Windows, vous devez avoir installé Cygwin / MSYS / SUA.
Ajouter des numéros aux lignes sélectionnées
Pour ajouter des numéros uniquement pour les lignes sélectionnées, veuillez les sélectionner en mode visuel ( vet curseurs), puis lorsque vous avez terminé - exécutez la commande:
:%!nl
(ignorer les lignes vides) ou:%!cat -n
(lignes vides incluses).Mise en page
Pour supprimer des espaces supplémentaires, sélectionnez-les dans le bloc visuel ( Ctrl+ v) et supprimez-les ( x).
Pour ajouter des caractères (
.
,:
,)
) après les chiffres, les sélectionner dans le bloc visuel ( Ctrlde + v), puis ajoutez le caractère ( A, tapez le caractère, puis terminez avec Esc).la source
Une modification de la réponse de romainl :
Cela n'ajoutera pas seulement des numéros de ligne, il remplacera également les numéros de ligne existants s'ils sont déjà là. Si vous avez inséré une ligne à mi-chemin, elle renumérotera tout comme prévu.
Cela fonctionne en remplaçant n'importe quel nombre suivi d'un. et un espace au début de la ligne avec un nouveau numéro. Cela cassera évidemment si vous avez une ligne qui commence déjà par ce modèle, alors utilisez-la avec réflexion.
La partie ajoutée:
^
- Début de ligne\(
- Démarrer un nouveau sous-groupe\d\+
- Faites correspondre un chiffre une ou plusieurs fois\.
- Faites correspondre un point (
.
) et un espace.
\)
- Fin du sous-groupe\?
- Rendez le groupe facultatif, pour qu'il fonctionne comme avant s'il n'y a pas encore de numéro sur cette ligne.Astuce bonus:
pour supprimer les numéros de ligne, vous pouvez utiliser le même modèle avec la partie de remplacement vide:
la source
Cela numérote les deux premières lignes et vous pouvez appuyer sur
@q
pour numéroter les lignes suivantes (ou tapez ex.18@q
Si vous voulez numéroter 20 lignes au total).Explication:
L'avantage de ceci est qu'il ne nécessite aucune commande externe, ce qui est utile si vous travaillez avec Vim sous Windows, par exemple.
la source
1. <esc>h
vous êtes sur la deuxième colonne, pas sur la première colonne. Je remplacerais leh
par0
, après quoi je pense que votre solution devrait être très bonne.^
attend un deuxième caractère afin de permettre des combinaisons de frappe comme^a -> â
. Je suis toujours d'accord pour dire que c'est la meilleure solution, mais je pense que cela devrait également être mentionné.Je pense que la réponse choisie est la meilleure, mais dans l'esprit de la variété, je proposerai une alternative en utilisant un programme externe:
Cela filtrera l'intégralité de votre tampon (comme indiqué par
%
) via le programme externecat
, où l'-n
indicateur ajoute à chaque ligne d'entrée un numéro de ligne.Cela, bien sûr, nécessite que vous ayez
cat
installé, ce qui est vrai pour (probablement) tous les systèmes de type Unix.Consultez
:help :range!
pour plus de détails sur le filtrage via des programmes externes.la source
msysgit
et ajouté cela à votre PATH (IIRC c'est une option d'installation), cette solution devrait également fonctionner sous Windows.cat -n
n'est pas POSIX, mais l'nl
est, donc ce pourrait être une meilleure option.Une solution un peu hackish pourrait être la suivante (tout ce qui est écrit entre <et> doit être inséré après avoir appuyé sur Ctrl+ v):
Déconstruction
exécute la commande en mode normal sur chaque ligne spécifiée par la plage, dans ce cas, chaque ligne
redirige chaque sortie effectuée par les commandes ex vers le tampon sans nom.
est une commande ex qui affiche le numéro de ligne actuel (avec un saut de ligne précédent malheureusement)
arrête la redirection vers le tampon sans nom
insère le contenu du tampon sans nom avec un. et un onglet à l'avant de chaque ligne et quitte le mode d'insertion.
monte d'une ligne et supprime la nouvelle ligne qui est le résultat de la commande:. =.
la source