web-dev-qa-db-fra.com

Ajouter des numéros de ligne au code source dans vim

Comment puis-je ajouter des numéros de ligne à une plage de lignes dans vim? Pas comme dans ": set nu" - cela n'affiche que les nombres, mais ne les ajoute pas au fichier.

70
dkretz

Avec

:%s/^/\=line('.')/

EDIT: pour résumer les commentaires.

Cette commande peut être modifiée autant que vous le souhaitez.


Supposons que vous souhaitiez ajouter des nombres devant des lignes à partir d'une sélection visuelle (V + déplacer), et que vous souhaitiez que la numérotation commence à 42.

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

Si vous souhaitez ajouter une chaîne entre le numéro et l'ancien texte de la ligne, concaténez-la (avec . Dans VimL) à l'expression-nombre:

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

Si vous en avez besoin pour trier sous forme de texte, vous souhaiterez peut-être mettre à zéro les résultats, ce qui peut être fait en utilisant printf pour 0001, 0002 ... au lieu de 1, 2 ... par exemple:

:%s/^/\=printf('%04d', line('.'))/

Quoi qu'il en soit, si vous souhaitez plus d'informations, ouvrez simplement l'aide de vim: :h :s Et suivez les liens (|subreplace-special|, ..., |submatch()|)

109
Luc Hermitte

cat -n ajoute des numéros de ligne à son entrée. Vous pouvez diriger le fichier actuel vers cat -n et remplacez le tampon actuel par ce qu'il imprime sur stdout. Heureusement, cette solution alambiquée comporte moins de 10 caractères dans vim:

 :%!cat -n

Ou, si vous voulez juste une sous-sélection, sélectionnez visuellement la zone et tapez ceci:

 :!cat -n

Cela placera automatiquement les marqueurs de sélection visuelle et ressemblera à ceci après l'avoir tapé:

 :'<,'>!cat -n

Afin d'effacer les numéros de ligne, je recommande d'utiliser control-v, qui vous permettra de sélectionner visuellement un rectangle, vous pouvez ensuite supprimer ce rectangle avec x.

33
Jerub

Sur un système GNU: avec le binaire externe nl:

:%!nl
22
Martin v. Löwis

Avec un environnement de type Unix, vous pouvez utiliser cat ou awk pour générer facilement un numéro de ligne, car vim a une interface conviviale avec Shell, donc tout fonctionne aussi bien dans vim que dans Shell.
De Astuce Vim28 :

:%!cat -n

ou

:%!awk '{print NR,$0}'

Mais, si vous utilisez vim dans MS-DOS, de win9x, win2000, vous perdez ces toolkit. voici un moyen très simple de l'archiver uniquement par vim:

fu! LineIt()
  exe ":s/^/".line(".")."/"
endf

Ou, une séquence composée d'alphabet est aussi simple que ci-dessus:

exe "s/^/".nr2char(line("."))."/" 

Vous pouvez également utiliser un subst:

:g/^/exe ":s/^/".line(".")."^I/"

Vous pouvez également uniquement imprimer les lignes sans les ajouter au fichier:

"Parfois, il peut être utile de modifier des fichiers source volumineux pour imprimer les numéros de ligne sur papier.
Pour ce faire, vous pouvez utiliser l'option :set printoptions=number:y pour activer et :set printoptions=number:n pour désactiver cette fonction.
Si le numéro de ligne doit toujours être imprimé, placez la ligne set printoptions=number:y dans le vimrc. "

6
VonC

Tout d'abord, vous pouvez supprimer les numéros de ligne existants si vous devez:

:%s/^[0-9]*//

Ensuite, vous pouvez ajouter des numéros de ligne. NR fait référence au numéro de ligne actuel commençant à un, vous pouvez donc faire quelques calculs dessus pour obtenir la numérotation souhaitée. La commande suivante vous donne des numéros de ligne à quatre chiffres:

:%!awk '{print 1000+NR*10,$0}'
4
Lance Roberts

Le plugin "VisIncr" est bon pour insérer des colonnes de nombres incrémentiels en général (ou lettres, dates, chiffres romains, etc.). Vous pouvez contrôler le format des nombres, le remplissage, etc. Insérez donc un "1" devant chaque ligne (via :s ou :g ou insert de bloc visuel), mettez cette colonne en surbrillance en mode bloc visuel et exécutez l'une des commandes du plugin.

3
Brian Carper

Si quelqu'un veut mettre une tabulation (ou des espaces) après avoir inséré les numéros de ligne en utilisant le cette excellente réponse , voici un moyen. Après être passé en mode d'échappement, procédez comme suit:

:%s/^/\=line('.').'    '/

^ signifie le début d'une ligne et %s est la directive de substitution. Donc, nous disons que mettre un numéro de ligne au début de chaque ligne et y ajouter 4 espaces, puis mettre tout ce qui était le contenu de la ligne avant la substitution, et faire cela pour toutes les lignes du fichier.

Cela le remplacera automatiquement. Sinon, si vous souhaitez que la commande vous demande une confirmation, faites:

:%s/^/\=line('.').'    '/igc

P.S: puissance de vim :)

0
kmario23