2010-11-19 16 views
20

Souvent, il semble que j'ai une liste d'éléments, et j'ai besoin d'ajouter des chiffres devant eux. Par exemple:Macro pour faire des listes numérotées dans vim?

Item one 
Item two 
Item three 

qui devrait être:

1. Item one 
2. Item two 
3. Item three 

Dans vim, je peux appuyer sur I en mode édition, insérer "1", l'évasion a frappé. Ensuite, je vais à la ligne suivante, appuyez sur ., puis ^A pour incrémenter le nombre. Cela semble extrêmement inefficace ... comment pourrais-je faire une macro pour que je puisse aller à la ligne suivante, et insérer un nombre au début qui est un plus grand que la ligne avant?

Répondre

18

Vous pouvez facilement enregistrer une macro pour le faire.

Première insertion 1. au début de la première ligne (il y a quelques espaces après le 1. mais vous ne pouvez pas les voir). Aller au début de la deuxième ligne et passer en mode enregistrement avec qa.

Appuyez sur la séquence suivante:

i       # insert mode 
<ctrl-Y><ctrl-Y><ctrl-Y> # copy the first few characters from the line above 
<ESC>      # back to normal mode 
|       # go back to the start of the line 
<ctrl-A>     # increment the number 
j       # down to the next line 
q       # stop recording 

Maintenant, vous pouvez lire l'enregistrement avec @a (la première fois, pour les fois suivantes, vous pouvez faire @@ répéter la macro dernière exécution) et il sera ajouter un nouveau nombre incrémenté au début de chaque ligne.

+7

Utilisez '3 @ a' pour exécuter la macro 3 fois –

+8

Je choisirais' k^yWjP^ j' à la place. Le texte peut ne pas être au début de la ligne, et plus important votre macro ne fonctionnera pas après la dixième ligne. –

+0

Spot sur, @Luc - précisément comment je l'avais moi-même sauf que j'ai cloué sur^à la fin de sorte qu'il positionne le curseur au début de la ligne lorsque vous avez terminé. Aucune différence fonctionnelle due au^au début, je me sentais un peu plus propre. –

10

Sélectionnez vos lignes en mode visuel avec: V, puis tapez:

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

Ce qui est facile à mettre dans une commande:

command! -nargs=0 -range=% Number <line1>,<line2>s/^\s*\zs/\=(line('.') - <line1>+1).'. ' 
+0

J'aime la répétabilité de ceci. Pour les lignes simples, c'est génial. Malheureusement, pour * mes * buts, quand j'insère la numérotation, j'ai tendance à faire dans reStructuredText, et j'ai donc besoin essentiellement de la fonctionnalité '}' - mais en raison de la façon dont il effectue le comptage des lignes, remplace simplement '^' par \ n \ n ne le couperait pas. Pitié, sinon il aurait pénétré dans mon '.vimrc'. Bon code, de toute façon, je n'étais pas au courant de '\ =()' - et je ne peux pas le trouver dans l'aide de vim! –

+0

Vous pouvez utiliser n'importe quelle fonction que vous souhaitez, comme par exemple une fonction qui conserve un compte pour elle-même. Dans ce cas, vous devrez peut-être jouer avec une commande qui encapsule la "boucle", par ex. http://stackoverflow.com/questions/1809571/how-do-i-substitute-from-a-list-of-strings-in-vim/1809780#1809780. Sinon, voir ': h sous-remplacement - \ =' –

+0

belle ligne() astuce - je ne l'avais pas encore trouvé! – egbutter

2

Vous pouvez utiliser la fonction 'record'. C'est un moyen facile d'enregistrer des macros dans Vim.

Voir: aider à enregistrer

En mode normal « qa » pour commencer à enregistrer ce que vous tapez dans le « un » registre Tapez la commande nécessaire pour insérer un numéro au début de la ligne, le copier à la ligne suivante et utilisez CTRL-A pour augmenter sa valeur. 'q' pour terminer l'enregistrement puis '@a' pour rejouer la macro stockée dans le registre 'a' ('@@' répète la dernière macro).

Et vous pouvez faire des choses comme '20 @a 'pour le faire vingt fois de suite.

Il est très pratique de répéter une modification de texte. Selon les cas, il est plus facile ou plus difficile à utiliser qu'une expression régulière.

6

Il y a aussi quelques plugins pour faire ce type de travail si vous devez le faire à l'occasion:

http://vim.sourceforge.net/scripts/script.php?script_id=670

+0

Ne peut être plus d'accord, un plugin dédié à cette tâche est bien mieux qu'une macro faite maison, et cela parce que la création de séries est une tâche que vous aurez plus d'une fois. – Benoit

2

Peut-être pas une solution macro, mais au moins il est facile.

ajouter des numéros à toutes les lignes

Il est possible d'utiliser :%!nl -ba ou :%!cat -n commandes qui ajouteront des numéros de ligne à toutes les lignes.

Sous Windows, Cygwin/MSYS/SUA doit être installé.

ajouter des numéros aux lignes sélectionnées

Pour ajouter des numéros seulement pour les lignes sélectionnées, s'il vous plaît les sélectionner en mode visuel (v et curseurs), puis lorsque vous avez terminé - exécuter la commande: :%!nl (ignorer les lignes vides) ou :%!cat -n (lignes vides incluses).

mise en forme

Pour enlever les espaces, les sélectionner dans le bloc visuel (Ctrl +v) et retirez-les (x).

Pour ajouter des caractères (., :, )) après les chiffres, sélectionnez dans le bloc visuel (Ctrl + v), puis ajouter le caractère (A, tapez le caractère, puis terminez avec Esc).

+0

Pour ajouter des caractères ('.'), vous pouvez utiliser': '<,'> normal a.' sur les lignes sélectionnées. Comme la sélection a déjà été faite, répétez-la avec 'gv'. – wryrych

0

Insérez un chiffre au début du bloc de texte, par ex.

1. Item One

Entrez la commande en mode normal vim comme suit:

qb^yW+P^<Ctrl-A>q 

Cela signifie:

qb  # start recording macro 'b' 
^  # move to start of text on the line 
yW  # 'yank' or copy a word including the ending whitespace. 
+  # move one line down to the start of the next line 
P  # place text ahead of the cursor 
^  # move to start of text 
<Ctrl-A> # increment text 
q  # Finish recording macro 

Qu'est-ce qui vous permet de le faire est rejouer la macro dans la dernière ligne liste numérotée autant de fois que nécessaire.