Arrancar e colar enquanto incrementa

13

Estou editando um arquivo .sql no Vim:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),

O que estou procurando fazer é puxar a (1, 1),linha e colá-la 137 vezes; no entanto, quero que o segundo número entre parênteses seja incrementado a cada vez. A saída seria semelhante a:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),
(1, 2),
(1, 3),
...
(1, 137),

Existe uma maneira de fazer isso no Vim e, em caso afirmativo, qual comando eu usaria?

Obrigado!

punhos lisos
fonte

Respostas:

10

Coloque o cursor na (1, 1),linha e digite:

qaVypt)<C-a>q135@a

Explicação:

qainicia a gravação de uma macro dentro do registro a (você pode escolher outra letra).

Vyp duplica a linha atual, selecionando a linha inteira (V), copiando-a (y) e colando-a abaixo (p).

t) mova o cursor imediatamente antes do próximo parêntese fechado, para que ele fique no segundo número.

<C-a>( Ctrle a) incrementa o número.

q finaliza a gravação da macro.

135@arepete a macro armazenada no registo de 135 vezes.

Edit: Peter Rincker tem um comando mais curto:

qqYpW<c-a>q135@q

As diferenças são:

usa o registrador q para armazenar a macro (mais rápido para digitar do qqque qaporque é a mesma tecla),
copia a linha com apenas um pressionamento de tecla Y(em vez de dois Vy)
e move o cursor para o segundo número com apenas um pressionamento de tecla W(em vez de t)).

saginaw
fonte
4
Golf Vim: qqyypW<c-a>q135@q. Ainda mais curto se você usar em Yvez de yy.
Peter Rincker 11/11
9

Vims recentes aprenderam sobre o incremento de regiões visuais selecionadas, bem como a criação de uma sequência. Então você pode fazer isso depois de colar sua linha 137 vezes:

1) selecionar visualmente o bloco ( Ctrl-V) o segundo 1 a partir da linha 3.

2) pressione gCtrl-A

Gravei um elenco de tela aqui

Isenção de responsabilidade: isso precisa de um Vim 7.4.900 ou mais.

Christian Brabandt
fonte
Testado com sucesso no Vim 7.4.826 no Debian / sid.
2018
Seu screencast desapareceu, mas esse método é IMPRESSIONANTE! Obrigado.
David_nash
2

A maneira fácil de entender / fácil de lembrar / fácil de se adaptar a outras situações: fazê-lo: use o plug- in VisIncr (se você preferir usar uma versão que seja realmente agradável com os gerenciadores de pacotes deste século, em vez de lidar com vimballs , você pode obtê-lo no GitHub ). Com isso:

  • vá para a (1, 1),linha e puxe-a:Vy
  • cole 136 vezes: 136p
  • vá para a segunda coluna de 1e marque-a verticalmente:C-vGf)h
  • execute o incremento: :II
  • ler o manual para saber mais sobre as outras coisas: :help visincr.
Sato Katsura
fonte
1

Eu brincaria g^a.

Tente 137i0^v137kg^a.

Moisès
fonte
1
Bem-vindo ao Vi e Vim ! Formatei sua resposta usando a remarcação. Seria ainda melhor se você editar para explicar como isso responde à pergunta do OP.
D. Ben Knoble 08/12/19