Jak mogę nagrać zagnieżdżone makro?

11

Chcę nagrać makro wewnątrz makra, tak jak to:

qa
    [ first macro ... ]
    qb
        [ second macro ... ]
    q
    [ some more stuff, involving @b ... ]
q

Jednak drugie qjest interpretowane jako żądanie zatrzymania pierwszego makra, a reszta jest interpretowana jako polecenia.

Czy jest jakiś sposób, aby rozpocząć rejestrowanie drugiego makra w makrze?

Jeśli nie, to czy istnieje jakiś inny sposób na osiągnięcie pożądanego efektu powtarzania określonej sekwencji naciśnięć klawiszy, gdy już znajduje się on w makrze?

Klamka
źródło
1
Nie możesz najpierw nagrać makra, ba następnie awywołać wywołanie makra @b?
statox
@statox Problem polega na tym, że bma destrukcyjne działanie, więc nie mogę go najpierw nagrać (chyba że chcę go nagrać, nacisnąć ukilka razy, a następnie rozpocząć nagrywanie a).
Klamka
1
Myślę, że to twoje najlepsze rozwiązanie. Pamiętaj, że możesz również nagrać go w innym buforze ( enew, nagrywanie bd) lub bezpośrednio edytować brejestr, zapisując w pliku zawartość makra, a następnie „nagrywając”, umieszczając znaki w rejestrze za pomocą "by.
statox

Odpowiedzi:

10

AFAIK, nie można nagrać dwóch makr za qx...qjednym razem. Aby spełnić twoje wymagania, musisz utworzyć makro bdo qb....qtego czasu qa...@bq.

Jeśli nie chcesz, aby „Record” bmożna zrobić let @b='whatever'wtedy @bbędzie odtwarzać makra. Np. let @b='ggdG'Zdefiniuj makro, baby usunąć całą zawartość bieżącego bufora bez „nagrywania”.

Istnieje sztuczka polegająca na definicji makra, która może nie mieć związku z twoim pytaniem. Jest to makro rekurencyjne, a nie zagnieżdżone. Oznacza to, że możesz:

qa..whatever..@aq

spowoduje to rekurencyjne odtworzenie makra a. Czasami jest to przydatne, gdy nie wiemy, ile razy chcemy odtworzyć makro. Ponieważ w przypadku wystąpienia błędu odtwarzanie makra zostanie automatycznie zatrzymane. Oszczędza 999@ana przykład.

Kent
źródło
1

Rejestrowanie naciśnięć klawiszy na makrze @a jest tym samym, co szarpanie tekstu odpowiadającego tym naciśnięciom klawiszy w celu zarejestrowania. Gdy coś zostanie zapisane w rejestrze, możesz go umieścić lub odtworzyć jako makro / naciśnięcia klawiszy. Aby rozpocząć rejestrowanie makra na @a qa, wtedy, gdy makro jest w trakcie nagrywania, pociągnij za tekst, aby zarejestrować b, być może używając czegoś podobnego "bye. Wszystko, co robi, to przeciągnięcie tekstu do innego rejestru niż w przypadku, gdy nie określono rejestru b. Teraz, gdy rejestr b ma w sobie tekst, możesz go odtworzyć jako naciśnięcie klawisza, naciskając @b. Możesz to zrobić nawet podczas rejestrowania makra @a. To jest metamakroliczne!

Główną wadą tego jest to, że prawdopodobnie łatwiej byłoby napisać jakąś funkcję vimscript, która robi to, co chcesz, a następnie wywołać ją podczas nagrywania makra. Piękno makr polega na tym, że możesz zobaczyć efekt tego, co nagrywasz podczas nagrywania, ale ta technika nagrywania meta makr nieco to odbiera.

still_dreaming_1
źródło