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.