Como forço [count] <Cx> a deixar zeros à esquerda?

8

Contexto

Eu uso vifmcomo meu gerenciador de arquivos (que está fora do tópico aqui, eu sei, mas continue lendo), o que me permite editar nomes de arquivos dentro de um vimbuffer.

Um problema que me incomodou são os arquivos numerados nos quais quero manter os zeros à esquerda (por exemplo movie0001.webm). Não consigo obter o vim para formatá-los corretamente.

A questão

Eu tenho um vimbuffer contendo:

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

E meu cursor começa na mprimeira linha. Faço então VGpara marcar tudo e 69<C-x>transformá-lo em:

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

Mas eu realmente gostaria de alcançar isso:

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

O que eu tentei

O problema com números com zeros à esquerda é que vimeles serão tratados como octal, portanto, mudei nrformatspara uma string vazia:

:set nrformats=

No entanto, isso não ajudou. Eu procurei :h nrformatssem encontrar nada útil.

grochmal
fonte
3
Soa mais como um trabalho para :subsitute+printf
muru

Respostas:

6

Isso pode ser feito em duas etapas relativamente simples:

  1. Decrementar as linhas com ctrl-x
  2. Execute uma substituição nas linhas alteradas para adicionar os zeros à esquerda: '[,']s/\d\@<!\d\>/0\0/

Você pode transformar isso em um comando / função se achar que precisará fazer isso com frequência.

Outra maneira é fazer como o muru mencionado e usar substitute+ printf, que pode preservar o comprimento da string dos dígitos substituídos:

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

Isso também pode ser transformado em um comando reutilizável:

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

Com o qual você pode executar :'<,'>Decr 69para diminuir as linhas visuais em 69.

Tommy A
fonte
Ainda estou aprendendo, viscriptmas len(submatch(0))é um ótimo truque. Adicionado ao meu vimrce também adicionou um Incrcomando.
grochmal
7

Embora eu prefira :s+ com printfsubstituições complexas, posso obter o efeito que você deseja se eu começar 00e tiver set nrformats-=octal. Isso é:

  1. Selecione os números em um bloco visual:

    insira a descrição da imagem aqui

    Observe que eu adicionei mov76.webm- você realmente não tem dez arquivos na sua lista de exemplos.

  2. Substitua por zeros e selecione a mesma região novamente: r0gv

    insira a descrição da imagem aqui

  3. Use g<c-a>:

    insira a descrição da imagem aqui

Sem set nrformats-=octal, você verá 010, 011etc.

muru
fonte
Você 0parece olhos. Arrepiante.
romainl
Opa, isso foi um erro com o mov76.webm, eu usei um diretório ruim. Eu editei a pergunta. Yay, para a fonte andale .
grochmal
@grochmal Essa é a fonte Ubuntu Mono. : D
muru
@romainl e agora não consigo deixar de vê-lo.
Muru