¿Cómo fuerzo a [count] <Cx> a dejar ceros a la izquierda?

8

Contexto

Lo uso vifmcomo mi administrador de archivos (eso está fuera de tema aquí, lo sé, pero sigo leyendo) lo que me permite editar nombres de archivos dentro de un vimbúfer.

Un problema que me molestó son los archivos numerados donde quiero mantener los ceros a la izquierda (por ejemplo movie0001.webm). No puedo obtener vim para formatearlos correctamente.

La pregunta

Tengo un vimbuffer que contiene:

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

Y mi cursor comienza en el men la primera línea. Luego hago VGpara marcar todo y 69<C-x>transformarlo en:

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

Pero realmente me gustaría llegar a esto en su lugar:

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

Lo que he intentado

El problema con los números con ceros a la izquierda es que vimlos tratará como octal, por lo tanto, cambié nrformatsa una cadena vacía:

:set nrformats=

Sin embargo, eso no ayudó. He buscado alrededor :h nrformatssin encontrar nada útil.

grochmal
fuente
3
Suena más como un trabajo para :subsitute+printf
muru

Respuestas:

6

Esto se puede hacer en dos pasos relativamente simples:

  1. Disminuya las líneas con ctrl-x
  2. Ejecute una sustitución en las líneas modificadas para agregar los ceros iniciales: '[,']s/\d\@<!\d\>/0\0/

Podría convertirlo en un comando / función si cree que tendrá que hacer esto con frecuencia.

Otra forma es hacer lo que muru mencionó y usar substitute+ printf, que puede preservar la longitud de la cadena de los dígitos reemplazados:

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

Esto también podría convertirse en un comando reutilizable:

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

Con el que puedes correr :'<,'>Decr 69para disminuir las líneas visuales en 69.

Tommy A
fuente
Todavía estoy aprendiendo viscriptpero len(submatch(0))es un gran truco. Lo agregó a mi vimrc, y también agregó un Incrcomando.
grochmal
7

Si bien definitivamente iría con :s+ printfpara reemplazos complejos, puedo obtener el efecto que deseas si empiezo 00y tengo set nrformats-=octal. Es decir:

  1. Seleccione los números en un bloque visual:

    ingrese la descripción de la imagen aquí

    Tenga en cuenta que he agregado mov76.webm: en realidad no tiene diez archivos en su lista de ejemplos.

  2. Reemplace con ceros y seleccione la misma región nuevamente: r0gv

    ingrese la descripción de la imagen aquí

  3. Uso g<c-a>:

    ingrese la descripción de la imagen aquí

Sin set nrformats-=octal, verá 010, 011, etc.

muru
fuente
Tus 0ojos parecen ojos. Siniestro.
romainl
Vaya, eso fue un error con el mov76.webm, usé un directorio incorrecto. Edité la pregunta. Yay, por la fuente andale .
grochmal
@grochmal Esa es la fuente Ubuntu Mono. : D
muru
@romainl y ahora no puedo verlo.
muru