Vim tip : un peu de renumérotation

Mettons que vous récupériez une liste numérotée, que vous supprimiez les doublons, que changiez l'ordre et que du coup votre numérotation ne soit plus bonne. Un peu dans le genre là (oui, ça ressemble à un liste de courses, c'est le premier truc qui me soit venu à l'esprit) :

4 : lait
1 : jambon
2 : pain
6 : cookies

Mais comment faire pour renuméroter sans me prendre la tête ? (là, ça va, mais quand vous avez une liste d'une bonne centaine d'items, c'est un peu lourd de faire ça à la main)

Je vous propose deux solutions, selon votre goût :

  1. Faire une macro. Je l'ai souvent fait, ça marche très bien mais le problème, c'est que ça peut être long.
    :let i = 1
    :map <F4> :s/^\d\+/\=i/<cr>:let i +=1<cr>j

    Un coup de F4 remplacera les chiffres de début de ligne par la valeur de la variable i que nous avons initialisée juste au dessus, puis incrémentera i et enfin vous positionnera à la ligne du dessus. Il ne vous reste plus qu'à rester le doigt sur F4 jusqu'à ce que vous ayez tout traité.

  2. Là c'est un poil plus compliqué, mais à peine, et surtout l'exécution sera beaucoup plus rapide.
    :let g:i = 1
    :function One()
    : let a = g:i
    : let g:i += 1
    : return a
    :endfunction
    :%s/^\d\+/\=One()/

    On initialise d'abord la variable globale i puis on crée une fonction qui l'incrémente mais qui renvoie sa valeur d'avant l'incréementation. Enfin on remplace tous les nombres de début de ligne par la valeur que renvoie la fonction One, cette valeur s'incrémentant à chaque substitution.

  3. Je crois qu'il existe un plugin Vim qui permet de faire tout seul ce genre de chose mais je n'ai pas le nom sous la main et en plus je n'ai jamais réussi à m'en servir correctement...