Agrupando sequências de comandos para repetir (.)

10

Considerar:

apple
pear

Coloque o cursor na primeira linha e digite Yp, produzindo:

apple
apple
pear

Coloque o cursor na pearlinha e digite .para repetir o último comando. Isso repete apenas o p(em vez da combinação Yp), produzindo:

apple
apple
pear
apple

Eu gostaria de uma maneira de dizer .para repetir os últimos N comandos. Algo como 2.repetir a combinação Yppara produzir:

apple
apple
pear
pear

Ofc que não vai funcionar - repete o pdobro. Mas a ideia seria "repetir a sequência dos 2 últimos comandos".

Sei que posso qgravar as sequências de comando e repeti-las @@, mas essa solução não é ideal, pois exige que você planeje o tempo todo o tempo todo, enquanto na prática você geralmente não percebe que precisa repetir algo até depois você fez isso.

Existe alguma maneira de conseguir o que eu quero?

Prêmio de consolação: se o acima não for possível, há uma maneira de repetir a última reprodução de macro? Por exemplo, se eu digitar @@para reproduzir minha última macro, gostaria que o subseqüente .fosse equivalente a digitar @@novamente - o que não é (por exemplo, se o resultado @@depende da linha em que você está)

Jonah
fonte
Não conheço uma solução para a primeira parte do seu problema, mas para a segunda parte, você pode tentar este mapeamento: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>Mas, para que funcione, você precisa instalar este plugin: github.com/tpope/vim-repeat
Você pode usar o seguinte comando

Respostas:

4

O Vim armazena apenas o último comando executado, e somente isso é repetido por .; na minha opinião, qualquer outra coisa seria difícil de lidar.

Se você sentir a necessidade de repetir o Ypcombo como uma entidade única, precisará fazer um único comando. O plugin repeat.vim de Tim Pope permite fazer isso facilmente para mapeamentos personalizados. Obviamente, se você escolher uma [sequência] de teclas curtas para o mapeamento, poderá digitar novamente rapidamente (em vez de .) e até evitar a integração repeat.vim.

BTW, meu plugin LineJuggler fornece um ]dmapeamento para duplicar a linha atual e suporta a repetição via repeat.vim.

Ingo Karkat
fonte
2

Em Yp, a única "alteração" a repetir é p. A única maneira que sei alterar o comportamento .no modo normal é adicionar yà cpoptionsopção:

set cpoptions+=y

que permite repetir o último puxão e a última alteração.

Mas isso não muda nada no seu problema, porque Ypainda existem dois comandos: um puxão seguido de uma mudança.

Eu não acho que você pode obter o que deseja sem scripts não triviais. Você deu uma olhada na seção de scripts do vim.org ?

romainl
fonte
1

Eu freqüentemente uso mappara alcançar esse efeito. Por exemplo:

map <F12> Yp

Em seguida, pressionar F12repetidamente executará YpYpYpetc. Se você quiser passar para a próxima linha após cada colar, mapeie uma tecla para Yp+.

user112358
fonte
1

A engenhoca notável que é o plug- in RepeatLast (do nosso próprio @joeytwiddle ) fornece exatamente essa funcionalidade, através do método profano de gravar tudo o que você faz como macro.

Ele fornece uma série de novos mapeamentos, mas, se eu estou lendo a documentação corretamente, para executar as edições que descrevem você pode usar a seqüência de comandos (presumindo que você estiver usando o padrão <leader>de \):

  • YpArranque e cole / cole a linha apple,
  • jMova para baixo uma linha para que o cursor esteja agora na pearlinha,
  • \Desqueça o jcomando,
  • 2\.Repita os dois comandos Yep
Rico
fonte
Profano, de fato! Mas eu aprecio a ambição.
Jonah