Como posso usar números consecutivos em um comando substituto ao estilo Ex?


8

Por exemplo, digamos que eu queira colocar um número antes de cada linha que começa com a palavra "Do". O comando seria algo parecido :%s/^(Do )/1. \1/, mas o que posso fazer para aplicar números consecutivamente em vez do mesmo número a cada vez?

Observe que estou ciente das inúmeras maneiras de fazer isso usando macros e Ctrl-A, mas para uso em comandos mais complicados do modo Ex, gostaria de saber a resposta exatamente para a pergunta do título.

Para outro exemplo em que uma abordagem de macro não seria tão fácil, digamos que eu queira anexar um número a todas as instâncias da palavra "Seção" e tê-los numerados consecutivamente, mas reiniciando a contagem após cada linha que inicia o "Capítulo". Um comando no modo Ex que quase pode fazer isso, exceto o aumento do número a ser adicionado, é:

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

Você pode ver que um método fácil de incrementar números no comando substituto no modo Ex pode ser muito útil.

Respostas:


8

Este comando faz o que você deseja:

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

Explicação…

  • let i = 1inicializa o contador i,
  • g/^Do/s/^/\=i/precede ia cada linha começando com Do,
  • let i = i + 1incrementos i.

O truque é que o incremento acontece antes da próxima substituição.

--- editar ---

Se usarmos uma única substituição, o contador será incrementado apenas uma vez, depois que tudo estiver pronto.

Como estamos executando várias substituições - uma para cada linha correspondente - em vez de uma única, o contador é incrementado corretamente antes da próxima substituição.


Como você pode colocar um ponto após o número? \=i. é uma expressão inválida.
David Conrad

2
@DavidConrad, .torna-se um operador concatenado na \=expressão. Então s//\=i . '. '/, anexará o '. ' check-out :help expression-syntax.
Wildcard

o incremento acontece após a substituição
Christian Brabandt 14/10

@ChristianBrabandt, oops, acidentalmente, uma palavra.
Romainl # 14/15
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.