vim: alterando o valor da variável linha por linha

3

Digamos que eu digitei o seguinte

a + 1 =b and a+1=c

Eu preciso de mais 2 expressões como essa, mas eu quero aumentar o valor de 1 para 3, então eu copio e colei a expressão acima mais 2 vezes e aumentei manualmente 1 então agora meu arquivo parece com

a + 1 =b and a+1=c
a + 2 =b and a+2=c
a + 3 =b and a+3=c

Existe uma maneira de automatizar isso? Meio como procurar e substituir, exceto que eu tenho que procurar por expressão e não por caracter, porque 1 está escrito são outras expressões que eu não quero mudar. e quero alterar o valor de 1 por linha. Cada expressão está em uma nova linha.

    
por Lynob 02.07.2015 / 02:57

3 respostas

3

Além de usar uma macro, você também pode usar localizar e substituir

yy2p
:%s/\v\d+/\=line('.')/g
  • yy2p yanks a linha e passado duas vezes
  • :%s processa uma pesquisa e substitui
  • \v\d+ procura por todos os caracteres numéricos
  • \=line('.') avalia a função de linha como substituto de todas as correspondências

ainda outra opção é

:pu! =map(range(1,3), 'printf(''a + %d =b and a+%d=c'', v:val, v:val)')

difícil de lembrar, mas você não tem que arrancar, pesquisar ou qualquer coisa macro. Começando com um buffer vazio, você obtém toda a enchilada em um comando.

    
por Lieven Keersmaekers 02.07.2015 / 08:00
4

O Vim tem uma maneira de incrementar um número automaticamente: <c-a> (ou Ctrl a ) no modo normal.

Assim, usando uma macro, é bastante fácil construir uma sequência crescente de números no Vim. Comece na linha que contém a+ 1 =b and a+1=c e:

qq
Yp^Aw^A
q

O ^A significa pressionar Ctrl a . Em seguida, use @q para repetir a macro. Então 4@q produziria:

a + 1 =b and a+1=c
a + 2 =b and a+2=c
a + 3 =b and a+3=c
a + 4 =b and a+4=c
a + 5 =b and a+5=c
  • qq inicia a macro ( q ) salvando no registro q .
  • Y arranca a linha atual (linearmente)
  • p pastas e você acaba no início da próxima linha (anteriormente atual).
  • <c-a> você incrementa o primeiro número na linha (e o cursor se move para ele)
  • , então você passa para a próxima palavra e aumenta novamente ( w<c-a> ), dessa vez afetando o segundo número.
por muru 02.07.2015 / 04:55
2

Muitas distribuições vim vieram com suporte interno ao Perl.

Se for o seu caso, você pode:

:perldo s/a\+1=b and a\+1=c/sprintf('a+%d=b and a+%d=c',++$aux,$aux)/e

(Eu provavelmente mudei os espaços no exemplo ...)

    
por JJoao 02.11.2015 / 19:11

Tags