powtórz makro vima aż do końca bufora

85

Chcę uruchomić makro, które właśnie nagrałem w rejestrze, xw każdym wierszu otwartego bufora, od kursora do końca bufora w programie vim. Jak mogę to zrobić?

Wiem, że mogę odtworzyć makro n razy:

15@x

... lub po prostu przytrzymaj, @aż dojdę do ostatniej linii, ale chcę po prostu nacisnąć kilka klawiszy i skończyć z tym.

Z góry dziękuję.

Kevin
źródło
15 @ x nie działa w systemie Windows gVIM
Mingjiang Shi

Odpowiedzi:

101

Osobiście zrobiłbym to

VG:normal @x

Edycja: zmieniony rejestr na podany.

Randy Morris
źródło
Niezłe. Podoba mi się, że to rozwiązanie działa tylko na wybranym obszarze.
Kevin
Zmapowałem to na nnoremap <C - @> VG: norm @ q <CR>
PAS
Próbowałem tego z makrem „1z =] s”, ale poprawia ono tylko pisownię w pierwszym słowie w każdej linii, pomijając resztę.
elig
@elig prawdopodobnie chcesz utworzyć makro rekurencyjne, które znajdzie brakujące słowa we wszystkich wierszach.
raman
67

Możesz zrobić (w trybie poleceń)

:%normal @x
ryan_s
źródło
Podoba mi się to rozwiązanie, ale il wykona makro w każdej linii bufora, OP zapytał tylko od swojego kursora do końca.
Porunga
24

zrobić makro rekurencyjne:

qa@aq

dawny:

qa0gUwj@aq

UPCASE pierwsze słowo z bieżącej linii do końca pliku pojedynczym @a. Ale upewnij się, że „rejestr jest pusty:

let @a=""
Maxim Kim
źródło
3
Świetny. To podejście jest bardziej przydatne niż %:normalpodejście, ponieważ uwzględnia wszelkie przesunięcia linii w makrze, więc jest przydatne, gdy linie nie mają identycznej formy. Łatwiej jest mi utworzyć makro „a” w celu zdefiniowania akcji, a następnie zlecić makro „b” wykonanie rekurencyjnego bitu, tj. Qb @ a @ bq.
Paul Ruane
3
Unikaj tego, jeśli twoje makro obejmuje wyszukiwanie, ponieważ będzie kontynuowane od góry. ctrl-cprzestać, jeśli tak się stanie!
Iain Ballard
3
@IainBallard, :set nowrapscanpowoduje niepowodzenie i zatrzymuje się po osiągnięciu końca pliku.
ericbn
1
aby wyczyścić zarejestrować, wystarczy zrobić qaqprzed makra: qaqqa0gUwj@aq. Dodatkowo, jeśli zapomnisz umieścić @qna końcu, zawsze możesz zrobić, qAaby rozpocząć dołączanie rejestru, a następnie to zrobić @q. Zwykle nagrywam do reg q z jakiegoś powodu, ponieważ jest to łatwe (szczególnie w przypadku makr rekurencyjnych) i zwykle kończy się na wykonywaniu qqqqqgUiwj@qqdwóch makr. Pierwsze trzy qs wyczyść reg q, drugie dwie qs rozpoczynają nagrywanie. Zobacz vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc
myślę, że aby wyczyścić arejestr, można by qaq
użyć
11

999999@xchyba że masz bardzo duży bufor ...

Piotr
źródło
6
dlaczego nie po prostu %:normal @xlub 1,$:normal @x?
Nathan Fellman
3
jest to zdecydowanie bardziej eleganckie rozwiązanie - 99999@xwydaje mi się, że to naturalna rzecz, na którą się spieszysz :)
Piotr
2
Czy 9999999 @ x nie uruchomi go wiele razy w ostatniej linii, chyba że masz dokładnie 999999 wierszy?
David Oneill
2
Po prostu spróbowałem. Zawiesza sesję. Prawdopodobnie kontynuuje uruchamianie go milion razy bez zatrzymywania się na końcu linii.
CDR
1
Przynajmniej w niektórych przypadkach nie będzie to działać zgodnie z oczekiwaniami. Rozważ umieszczenie w nim makra z funkcją find next / find prev . Tak więc, gdy powtórzenie makra dotrze do końca pliku, będzie kontynuowane od początku. vim doc na ten temat . Aby zapobiec zawijaniu wyszukiwania, można użyć : set nowrapscan . To jest przykład, który mógłbym wymyślić, ale to nie znaczy, że już nie ma. :% normal @x to droga, jak zasugerował @ryan_s w swojej odpowiedzi powyżej.
Sergey Markelov
-1

Z wiki vim, skrócona wersja: qqqqq, aby nagrać makro @qq, aby zakończyć nagrywanie @q, aby je wykonać (i będzie działać do końca pliku)

user3499436
źródło
1
Czy może Pan dodać odniesienie do dokumentacji?
aturegano
2
@aturegano Myślę, że autor chciał użyć makra rekurencyjnego. Zobacz Vim Wiki: Record a Recursive Macro, aby uzyskać więcej informacji.
dylnmc