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ę.


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.


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

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=""

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 ...


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)


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
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.