In Vim, come posso applicare una macro a un insieme di linee?


222

Ho un file con un sacco di righe. Ho registrato una macro che esegue un'operazione su una sola riga. Voglio ripetere quella macro su tutte le righe rimanenti nel file. C'è un modo rapido per farlo?

Ho provato Ctrl + Q, ho evidenziato una serie di linee e ho premuto @@, ma questo non sembrava fare il trucco.


Domanda offtopica: non ero a conoscenza delle macro VIM (o non volevo esserne consapevole: P) Hai qualche link orientato al "lettore pigro" sulle macro VIM?
OscarRyz,

Certo, questo: oreillynet.com/mac/blog/2006/07/… lo riassume abbastanza bene.
Jordan Parmer,

Puoi anche controllare: ripete in modo complesso dall'interno di Vim
Sam,

Risposte:


354

Utilizzare il comando normale in modalità Ex per eseguire la macro su più / tutte le righe:

Eseguire la macro memorizzata nel registro a sulle righe da 5 a 10.

:5,10norm! @a

Eseguire la macro memorizzata nel registro a sulle righe 5 fino alla fine del file.

:5,$norm! @a

Eseguire la macro memorizzata nel registro a su tutte le righe.

:%norm! @a

Eseguire il negozio macro nel registro una su tutte le linee corrispondenti modello .

:g/pattern/norm! @a

Per eseguire la macro su linee visivamente selezionate, premere V e il j o k fino a selezionare la regione desiderata. Quindi digitare :norm! @ae osservare che viene visualizzata la seguente riga di input.

:'<,'>norm! @a

Enter : help normal in vim per leggere di più.


1
Sì,: aiuto normale in vim o nel link che ho appena aggiunto.
Giudice Maygarden,

1
Tutto per aiutare un altro utente non-emacs!
Giudice Maygarden,

48
Bello!! Suggerimento per principianti: usa V quindi j / k per evidenziare le linee che desideri, quindi digita solo:norm! @a
Kevin Bourrillion,

7
Per aggiungere il suggerimento molto utile di @KevinBourrillion, quando si preme :dopo aver evidenziato le linee, la riga di input Ex leggerà invece :'<,'>a cui si aggiungerà il resto di ciò che Kevin ha suggerito. Questo renderà il comando finale diceva: :'<,'>norm! @a.
Deiwin,

3
@GabeMoothart !Evita la rimappatura delle chiavi da parte dell'utente. Potrebbe non essere necessario, ma una risposta che funziona per tutti lo richiede.
Giudice Maygarden,

60

Usa global per eseguire la macro "a" su tutte le righe che contengono "pattern"

:g/pattern/normal! @a

Per informazioni, controllare: :help global.


4
Solo per chiarimenti per i futuri utenti: questo è un comando Ex globale.
atp

39

Puoi anche fare questo:

In modalità normale:

[number of times to apply the macro] @ [register]

Per esempio:

1000@q

Applica la macro nel registro q alle successive 1000 righe.

Aggiornamento: la risposta accettata è molto meglio

Aggiornamento: come sottolineato da @kevinliu, probabilmente vorrai terminare la macro con un jper passare alla riga successiva.


4
Questo si ferma sull'ultima riga e non viene eseguito più volte sull'ultima riga, di cui avevo paura.
Hubro,

@Hubro, queste risposte di altri utenti hanno funzionato per me: :%norm! @aevGG :norm! @a
Max Heiber il

2
Per qualche ragione, questo ha funzionato meravigliosamente e la risposta accettata no. La mia macro prevedeva l'inserimento di una nuova riga, l'esecuzione di operazioni e il passaggio alla riga successiva.
jasonszhao,

@jasonszhao sì, lo stesso qui. ma c'è comunque di non dire 1000 ma tutte le righe fino alla fine .. e ancora prendersi cura della nuova linea, fare cose, ecc.
ihightower

2
Penso che dovrebbe essere sottolineato che la tua macro deve terminare con un jcomando per passare alla riga successiva, altrimenti proverà ad applicarla alla stessa riga.
Kevin Liu,

2

C'è anche un plugin chiamato RangeMacro, fa esattamente quello che vuoi! Per tutti coloro che non riescono a indovinare con il nome, cosa fanno: ripete una macro registrata per ogni riga in un dato intervallo, non importa se per selezione visiva o con un: 40,50 /: +10

Vedi http://www.vim.org/scripts/script.php?script_id=3271

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.