¿Cómo puedo usar números consecutivos en un comando sustituto de estilo Ex?

8

Por ejemplo, supongamos que quiero poner un número antes de cada línea que comienza con la palabra "Do". El comando se vería algo así :%s/^(Do )/1. \1/, pero ¿qué puedo hacer para que aplique números consecutivamente en lugar del mismo número cada vez?

Tenga en cuenta que conozco las numerosas formas de hacerlo usando macros y Ctrl-A, pero para usar en comandos Ex-mode más complicados, me gustaría saber la respuesta a la pregunta del título.

Para otro ejemplo en el que un enfoque macro no sería tan fácil, digamos que quiero agregar un número a todas las instancias de la palabra "Sección", y tenerlas numeradas consecutivamente pero reiniciando el conteo después de cada línea que comienza "Capítulo". Un comando Ex-mode que casi puede hacer esto, salvo para aumentar realmente el número que se agregará, es:

:g/^Chapter/;/^Chapter/-s/Section\zs/ 1/g

Puede ver que un método fácil de incrementar números en el comando sustituto del modo Ex podría ser muy útil.

Comodín
fuente

Respuestas:

8

Este comando hace lo que quieres:

:let i = 1|g/^Do/s/^/\=i/|let i = i + 1

Explicación…

  • let i = 1inicializa contrarrestar i,
  • g/^Do/s/^/\=i/antecede ia cada línea que comienza con Do,
  • let i = i + 1incrementos i.

El truco es que el incremento ocurre antes de la próxima sustitución.

--- editar ---

Si usáramos una sola sustitución, el contador solo se incrementaría una vez, después de que todo esté hecho.

Como estamos realizando múltiples sustituciones, una para cada línea coincidente, en lugar de una sola, el contador se incrementa correctamente antes de la próxima sustitución.

romainl
fuente
¿Cómo puedes poner un punto después del número? \=i. Es una expresión inválida.
David Conrad
2
@DavidConrad, se .convierte en un operador concatenado en la \=expresión. Por s//\=i . '. '/lo tanto, se agregará '. ' Check out :help expression-syntax.
Comodín el
el incremento ocurre después de la sustitución
Christian Brabandt
@ChristianBrabandt, uy, accidentalmente una palabra.
romainl