riprodurre una macro vim fino alla fine del buffer


85

Voglio eseguire una macro che ho appena registrato nel registro " x" su ogni singola riga di un buffer aperto, dal mio cursore alla fine del buffer, in vim. Come lo faccio?

So di poter riprodurre la macro n volte:

15@x

... o tieni premuto @finché non raggiungo l'ultima riga, ma voglio solo premere alcuni tasti e farla finita.

Grazie in anticipo.


15 @ x non funziona su Windows gVIM
Mingjiang Shi

Risposte:


102

Personalmente lo farei

VG:normal @x

Modifica: cambiato registro con quello specificato.


Ben fatto. Mi piace che questa soluzione operi solo sull'area selezionata.
Kevin

Ho mappato questo su nnoremap <C - @> VG: norm @ q <CR>
PAS

Ho provato con la macro "1z =] s" ma corregge solo l'ortografia della prima parola di ogni riga, saltando il resto.
ammissibile il

@elig probabilmente vorrai creare una macro ricorsiva che troverà le parole mancanti su tutte le righe.
Raman

67

Puoi fare (in modalità di comando)

:%normal @x

Mi piace questa soluzione, ma eseguirò la macro su ogni riga del buffer, OP chiesto solo dal suo cursore fino alla fine.
Porunga

24

crea macro ricorsive:

qa@aq

ex:

qa0gUwj@aq

UPCASE la prima parola dalla riga corrente alla fine del file con un singolo @a. Ma assicurati che "un registro sia vuoto:

let @a=""

3
Eccellente. Questo approccio è più utile %:normaldell'approccio poiché rispetta qualsiasi movimento di linea all'interno della macro, quindi è utile quando le linee non sono identiche nella forma. Trovo più facile creare una macro "a" per definire l'azione e poi fare in modo che la macro "b" esegua il bit ricorsivo, cioè qb @ a @ bq.
Paul Ruane

3
Evita questo se la tua macro prevede una ricerca, poiché continuerà dall'alto. ctrl-cfermarsi se ciò accade!
Iain Ballard

3
@ IainBallard, lo :set nowrapscanfa fallire e si ferma quando si raggiunge la fine del file.
ericbn

1
per cancellare registrare una, è sufficiente fare qaqprima che la macro: qaqqa0gUwj@aq. Inoltre, se dimentichi di mettere @qalla fine, puoi sempre qAiniziare ad aggiungere un registro, e poi farlo @q. Di solito registro su reg q per qualche motivo perché è facile (specialmente per le macro ricorsive) e di solito finisco per fare qqqqqgUiwj@qqinvece di due macro. I primi tre qs clear reg q, i secondi due qiniziano la registrazione. Vedi vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

Penso che per cancellare il aregistro si potrebbe semplicemente digitareqaq
Peter Perháč

12

999999@x, a meno che tu non abbia un buffer molto grande ...


6
perché non solo %:normal @xo 1,$:normal @x?
Nathan Fellman

3
questa è sicuramente la soluzione più elegante - immagino 99999@xsia proprio la cosa naturale che ti viene in mente quando sei di fretta :)
Peter

2
9999999 @ x non verrà eseguito molte volte sull'ultima riga a meno che tu non abbia esattamente 999999 righe?
David Oneill

2
L'ho appena provato. Blocca la sessione. Probabilmente continua a eseguirlo per un milione di volte senza fermarsi a fine linea.
CDR

1
Almeno in alcuni casi questo non si comporterà come previsto. Considera l'idea di avere una macro con trova successivo / trova precedente . Quindi, una volta che la ripetizione della macro raggiunge la fine del file, continuerà dall'inizio. vim doc sull'argomento . Per evitare il wrapping della ricerca, si potrebbe voler usare : set nowrapscan . Questo è un esempio che potrei trovare, ma ciò non significa che non ce ne siano altri. :% normal @x è un modo per andare come suggerito da @ryan_s nella sua risposta sopra.
Sergey Markelov

-1

Da vim wiki, versione abbreviata: qqqqq per registrare la macro @qq per terminare la registrazione @q per eseguirla (e verrà eseguita fino alla fine del file)


1
Per favore, puoi aggiungere un riferimento alla documentazione?
aturegano

2
@aturegano Penso che l'autore intendesse usare una macro ricorsiva. Vedi The Vim Wiki: Registra una macro ricorsiva per maggiori informazioni.
dylnmc
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.