Raggruppamento di sequenze di comandi per ripetizione (.)


10

Ritenere:

apple
pear

Posiziona il cursore sulla prima riga e digita Yp, producendo:

apple
apple
pear

Posiziona il cursore sulla pearriga e digita .per ripetere l'ultimo comando. Questo ripete solo il p(anziché la combinazione Yp), producendo:

apple
apple
pear
apple

Vorrei un modo per dire .di ripetere gli ultimi N comandi. Qualcosa come 2.ripetere la combinazione Ypper produrre:

apple
apple
pear
pear

Ofc che non funzionerà: ripete il pdoppio. Ma l'idea sarebbe "ripetere la sequenza degli ultimi 2 comandi".

So di poter qregistrare le sequenze di comandi e ripeterle con @@, ma questa soluzione non è l'ideale, poiché richiede di aver pianificato tutto il tempo, mentre in pratica spesso non ti rendi conto che devi ripetere qualcosa fino a dopo l'hai fatto.

C'è un modo per ottenere ciò che voglio?

Premio di consolazione: se quanto sopra non è possibile, c'è un modo per ripetere l'ultima riproduzione macro? Ad esempio, se ho digitato @@per riprodurre la mia ultima macro, vorrei che il successivo .fosse equivalente alla digitazione di @@nuovo - cosa che non è (ad esempio, se il risultato di @@dipende dalla riga in cui ti trovi)


Non conosco una soluzione per la prima parte del problema, ma per la seconda parte, puoi provare questa mappatura: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>Ma per funzionare, devi installare questo plugin: github.com/tpope/vim-repeat
user9433424

Risposte:


4

Vim memorizza solo l' ultimo comando eseguito, e solo quello viene ripetuto da .; a mio avviso, qualsiasi altra cosa sarebbe difficile da gestire.

Se senti la necessità di ripetere la Ypcombo come un'unica entità, devi eseguirla in un unico comando. Il plugin repeat.vim di Tim Pope consente di farlo facilmente per i mapping personalizzati. Naturalmente, se si sceglie un tasto breve [sequenza] per la mappatura, è possibile semplicemente ridigitare rapidamente quello (invece di .) e persino evitare l'integrazione di repeat.vim.

A proposito, il mio plug-in LineJuggler fornisce una ]dmappatura per duplicare la riga corrente e supporta la ripetizione tramite repeat.vim.


2

In Yp, l'unico "cambiamento" da ripetere è p. L'unico modo che conosco per modificare il comportamento di .in modalità normale è quello di aggiungere yalla cpoptions'opzione:

set cpoptions+=y

che ti consente di ripetere l'ultimo tiro e anche l'ultimo cambiamento.

Ma questo non cambia nulla per il tuo problema perché ci Ypsono ancora due comandi: uno strattone seguito da un cambiamento.

Non penso che tu possa ottenere quello che vuoi senza qualche script non banale. Hai dato un'occhiata alla sezione script di vim.org ?


1

Uso spesso mapper ottenere questo effetto. Per esempio:

map <F12> Yp

Quindi premendo F12ripetutamente si eseguirà YpYpYpecc. Se si desidera passare alla riga successiva dopo ogni incolla, mappare invece un tasto Yp+.


1

Il notevole aggeggio che è il plug-in RepeatLast (dal nostro stesso @joeytwiddle ) fornisce proprio questa funzionalità, tramite il metodo empio di registrare tutto ciò che fai come macro.

Fornisce una serie di nuove mappature, ma, se sto leggendo la documentazione correttamente, per eseguire le modifiche che descrivi potresti usare la sequenza di comandi (presumendo che tu stia usando il valore predefinito <leader>di \):

  • YpStrappa e metti / incolla la linea apple,
  • jSpostati verso il basso di una riga in modo che il cursore si trovi ora sulla pearriga,
  • \Ddimentica il jcomando,
  • 2\.Ripeti i due comandi Yep

Unholy, davvero! Ma apprezzo l'ambizione.
Giona,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.