W Vimie, jak zastosować makro do zestawu linii?


222

Mam plik z wieloma liniami. Nagrałem makro, które wykonuje operację na jednej linii. Chcę powtórzyć to makro na wszystkich pozostałych wierszach pliku. Czy jest na to szybki sposób?

Wypróbowałem Ctrl + Q, podświetliłem zestaw linii i nacisnąłem @@, ale to chyba nie pomogło.


Pytanie offtopowe: Nie wiedziałem o makrach VIM (lub nie chciałem być tego świadomy: P) Czy masz jakieś miłe łącze zorientowane na „leniwego czytnika” na makrach VIM?
OscarRyz

Jasne, to: oreillynet.com/mac/blog/2006/07/07 to całkiem dobrze podsumowuje.
Jordan Parmer

Możesz także sprawdzić: powtórzenie kompleksów od wewnątrz vima
Sam

Odpowiedzi:


354

Użyj normalnego polecenia w trybie Ex, aby wykonać makro w wielu / wszystkich liniach:

Wykonaj makro zapisane w rejestrze a w liniach od 5 do 10.

:5,10norm! @a

Wykonaj makro zapisane w rejestrze a w wierszach 5 do końca pliku.

:5,$norm! @a

Wykonaj makro zapisane w rejestrze a na wszystkich liniach.

:%norm! @a

Uruchom magazyn makr w rejestrze a we wszystkich wierszach pasujących do wzorca .

:g/pattern/norm! @a

Aby wykonać makro na wizualnie wybranych liniach, naciśnij V i j lub k, aż zostanie wybrany żądany region. Następnie wpisz :norm! @ai obserwuj następującą linię wprowadzania.

:'<,'>norm! @a

Enter : pomoc normalna w vimie, aby przeczytać więcej.


1
Tak: pomóż normalnie w vimie lub w właśnie dodanym linku.
Sędzia Maygarden,

1
Wszystko, aby pomóc innym użytkownikom, którzy nie są emacami!
Sędzia Maygarden,

48
Miły!! Wskazówka dla początkujących: użyj V, a następnie j / k, aby podświetlić żądane linie, a następnie wpisz tylko:norm! @a
Kevin Bourrillion

7
Aby dodać do bardzo pomocnej wskazówki @KevinBourrillion, po naciśnięciu :po podświetleniu linii, linia wejściowa Ex przeczyta, :'<,'>do której następnie dodasz resztę sugestii Kevina. Spowoduje to, że ostateczna komenda odczytu: :'<,'>norm! @a.
Deiwin

3
@GabeMoothart !Unika ponownego mapowania kluczy przez użytkownika. Możesz go nie potrzebować, ale odpowiedź, która działa dla wszystkich, wymaga tego.
Sędzia Maygarden

60

Użyj globalnego, aby uruchomić makro „a” na wszystkich liniach zawierających „wzorzec”

:g/pattern/normal! @a

Aby uzyskać pomoc, należy sprawdzić: :help global.


4
Tylko dla wyjaśnienia dla przyszłych użytkowników: to globalne polecenie Ex.
atp

39

Możesz także to zrobić:

W trybie normalnym:

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

Na przykład:

1000@q

Umieszcza makro w rejestrze q do kolejnych 1000 wierszy.

Aktualizacja: zaakceptowana odpowiedź jest znacznie lepsza

Aktualizacja: jak zauważył @kevinliu, prawdopodobnie chcesz zakończyć makro, jaby przejść do następnej linii.


4
To zatrzymuje się na ostatniej linii i nie wykonuje wielokrotnego czasu na ostatniej linii, czego się obawiałem.
Hubro

@Hubro, te odpowiedzi od innych użytkowników pracowały dla mnie: :%norm! @aivGG :norm! @a
Max Heiber

2
Z jakiegoś powodu zadziałało to niesamowicie, a zaakceptowana odpowiedź nie. Moje makro wymagało wstawienia nowej linii, zrobienia rzeczy i przejścia do następnej linii.
jasonszhao

@jasonszhao tak to samo tutaj. ale czy i tak nie można powiedzieć 1000, ale wszystkie linie do końca ... i nadal dbać o nową linię, robić rzeczy itp.
ihightower

2
Myślę, że należy zauważyć, że twoje makro musi kończyć się jpoleceniem, aby przejść do następnego wiersza, w przeciwnym razie spróbuje zastosować go do tego samego wiersza.
Kevin Liu

2

Jest też wtyczka o nazwie RangeMacro, robi dokładnie to, co chcesz! Dla wszystkich, którzy nie potrafią zgadnąć po nazwie, co robi: powtarza zarejestrowane makro dla każdej linii w danym zakresie, bez względu na wybór wizualny lub przez: 40,50 /: +10

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.