Come forzo [count] <Cx> a lasciare zeri iniziali?


8

Contesto

Uso vifmil mio file manager (è fuori tema qui, lo so, ma continua a leggere) che mi permette di modificare i nomi dei file all'interno di un vimbuffer.

Un problema che mi ha infastidito sono i file numerati in cui voglio mantenere gli zeri iniziali (ad es movie0001.webm.). Non riesco a ottenere VIM per formattarli correttamente.

La domanda

Ho un vimbuffer contenente:

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

E il mio cursore inizia mnella prima riga. Quindi faccio VGper contrassegnare tutto e 69<C-x>trasformarlo in:

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

Ma vorrei davvero raggiungere questo invece:

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

Quello che ho provato

Il problema con i numeri con zeri iniziali è che vimli tratteranno come octal, quindi ho cambiato nrformatsin una stringa vuota:

:set nrformats=

Tuttavia, ciò non ha aiutato. Ho cercato in giro :h nrformatssenza trovare nulla di utile.


3
Sembra più un lavoro per :subsitute+printf
muru,

Risposte:


6

Questo può essere fatto in due passaggi relativamente semplici:

  1. Decrementa le linee con ctrl-x
  2. Esegui una sostituzione nelle righe modificate per aggiungere gli zeri iniziali: '[,']s/\d\@<!\d\>/0\0/

Potresti trasformarlo in un comando / funzione se pensi di doverlo fare spesso.

Un altro modo è fare come menzionato muru e usare substitute+ printf, che può preservare la lunghezza della stringa delle cifre sostituite:

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

Questo potrebbe anche essere trasformato in un comando riutilizzabile:

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

Con cui è possibile eseguire :'<,'>Decr 69per ridurre le linee visive di 69.


Sto ancora imparando viscriptma len(submatch(0))è un grande trucco. Aggiunto al mio vimrce anche aggiunto un Incrcomando.
grochmal,

7

Mentre andrei sicuramente con :s+ printfper sostituzioni complesse, posso ottenere l'effetto che desideri se parto da 00e ho set nrformats-=octal. Questo è:

  1. Seleziona i numeri in un blocco visivo:

    inserisci qui la descrizione dell'immagine

    Nota che ho aggiunto mov76.webm: in realtà non hai dieci file nell'elenco di esempi.

  2. Sostituisci con zeri e seleziona di nuovo la stessa area: r0gv

    inserisci qui la descrizione dell'immagine

  3. Utilizzare g<c-a>:

    inserisci qui la descrizione dell'immagine

Senza set nrformats-=octal, vedrete 010, 011e così via


I tuoi 0occhi sembrano occhi. Raccapricciante.
Romainl,

Ooops, è stato un errore con il mov76.webm, ho usato una directory cattiva. Ho modificato la domanda. Sì, per il carattere andale .
grochmal

@grochmal Questo è il carattere Ubuntu Mono. : D
muru,

@romainl e ora non riesco a vederlo.
Muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.