Comment forcer [count] <Cx> à laisser des zéros non significatifs?

8

Le contexte

J'utilise vifmcomme gestionnaire de fichiers (c'est hors sujet ici, je sais, mais continuez à lire) qui me permet de modifier les noms de fichiers dans un vimtampon.

Un problème qui m'a ennuyé est les fichiers numérotés où je veux garder les zéros en tête (par exemple movie0001.webm). Je n'arrive pas à faire vim pour les formater correctement.

La question

J'ai un vimtampon contenant:

mov70.webm
mov71.webm
mov72.webm
mov73.webm
mov74.webm
mov75.webm
mov76.webm
mov77.webm
mov78.webm
mov79.webm

Et mon curseur commence à mla première ligne. Je fais ensuite VGtout marquer et 69<C-x>le transformer en:

mov1.webm
mov2.webm
mov3.webm
mov4.webm
mov5.webm
mov6.webm
mov7.webm
mov8.webm
mov9.webm
mov10.webm

Mais j'aimerais vraiment y parvenir à la place:

mov01.webm
mov02.webm
mov03.webm
mov04.webm
mov05.webm
mov06.webm
mov07.webm
mov08.webm
mov09.webm
mov10.webm

Ce que j'ai essayé

Le problème avec les nombres avec des zéros en tête est que vimles traitera comme octal, donc j'ai changé nrformatspour une chaîne vide:

:set nrformats=

Pourtant, cela n'a pas aidé. J'ai cherché autour :h nrformatssans trouver quoi que ce soit d'utile.

grochmal
la source
3
Cela ressemble plus à un travail pour :subsitute+printf
muru

Réponses:

6

Cela peut se faire en deux étapes relativement simples:

  1. Décrémenter les lignes avec ctrl-x
  2. Exécutez une substitution sur les lignes modifiées pour ajouter les zéros de tête: '[,']s/\d\@<!\d\>/0\0/

Vous pouvez transformer cela en une commande / fonction si vous pensez que vous devrez le faire souvent.

Une autre façon est de faire comme muru l'a mentionné et d'utiliser substitute+ printf, qui peut conserver la longueur de chaîne des chiffres remplacés:

'<,'>s/\d\+/\=printf('%0*d', len(submatch(0)), submatch(0) - 69)

Cela pourrait également être transformé en une commande réutilisable:

command! -nargs=1 -range Decr <line1>,<line2>s/\d\+/\=printf('%0*d', len(submatch(0)), submatch(0) - <args>)

Avec lequel vous pouvez exécuter :'<,'>Decr 69pour décrémenter les lignes visuelles de 69.

Tommy A
la source
J'apprends encore, viscriptmais len(submatch(0))c'est une excellente astuce. Ajouté à mon vimrc, et également ajouté une Incrcommande.
grochmal
7

Bien que j'irais certainement avec :s+ printfpour des remplacements complexes, je peux obtenir l'effet que vous désirez si je pars et j'en 00ai set nrformats-=octal. C'est:

  1. Sélectionnez les nombres dans un bloc visuel:

    entrez la description de l'image ici

    Notez que j'ai ajouté mov76.webm- vous n'avez pas réellement dix fichiers dans votre liste d'exemples.

  2. Remplacez par des zéros et sélectionnez à nouveau la même région: r0gv

    entrez la description de l'image ici

  3. Utilisation g<c-a>:

    entrez la description de l'image ici

Sans set nrformats-=octal, vous verrez 010, 011etc.

muru
la source
Vos 0yeux ressemblent à des yeux. Terrifiant.
romainl
Oups, c'était une erreur avec le mov76.webm, j'ai utilisé un mauvais répertoire. J'ai édité la question. Oui, pour la police andale .
grochmal
@grochmal C'est la police Ubuntu Mono. : D
muru
@romainl et maintenant je ne peux pas le voir.
muru