Klasyczny przypadek użycia:
- Zaczynasz rejestrować makro:
C-x (
- Robisz coś, powiedzmy
hello
. - Wykonujesz polecenie, które generuje błąd, powiedzmy
C-g
(np. Błędnie uruchomiłeśC-s
i musisz to anulowaćC-g
, teraz twoja praca jest utracona).
Twoje dotychczasowe nagranie zostało utracone.
Chciałbym wznowić od miejsca, w którym skończyłem, zanim wykonałem polecenie, które przerwało moje nagrywanie. Spojrzałem C-h f start-kbd-macro
, ale jest napisane w C, więc nie mogę go poprawić. Również szukałem takiej zmiennej current-kbd-macro
, ale jak dotąd nie znalazłem żadnej.
Czy można to odzyskać?
Aktualizacja:
Nie mogłem zrozumieć, dlaczego C-u C-x (
dla mnie nie działało, ale odkryłem, że to dlatego, że testowałem C-g
.
Okazuje się, że C-g
jest wyjątkowy - jeśli wywołasz inny rodzaj błędu np
C-x ( M-: (signal 'quit nil)
To zatrzyma nagrywanie, ale last-kbd-macro
będzie zawierać "M-: M-( signal 'quit nil"
, ale z
C-x ( C-g
To zatrzymuje nagrywanie i odrzuca wszystko, co zostało nagrane. Jako użytkownik Cg zadowolony (podobnie jak co najmniej dwóch moich znajomych) jest to raczej niefortunne rozróżnienie. Próbowałem edytować keyboard-quit
, ale nic nie mogę na to poradzić.
Wygląda na to, że jedynym sposobem na to jest odzyskanie recent-keys
i automatyczne ustalenie, gdzie wywołano makro start-kbd (lub podobne), jak w kmacro-edit-lossage
.
źródło
Wykonaj za
kmacro-start-macro-or-insert-counter
pomocą prefiksu (C-u
), aby dołączyć do poprzedniego makra.źródło
C-u C-u
) ustawia zarównoAPPEND
iNO-EXEC
argumentystart-kbd-macro
, które pozwala dołączyć bez początkowego powtórki makro-tak daleko. Zachowanie to zostało udokumentowane w podręczniku, jednak:(emacs) Basic Keyboard Macro
Połączenie dobrych odpowiedzi ze stsquad i artagnon daje (moim zdaniem) całkowite rozwiązanie problemu, który jest całkowicie uzasadniony:
Być może potrzeba edycji makra stratnego jako makra nie jest idealna , ale (a) musiałeś edytować makro niezależnie od tego, czy przerwałeś nagrywanie, i (b) nie powinno tak się często zdarzać, jeśli tylko pamiętasz, jak normalnie zatrzymać makro (np. <f4>zamiast zamiast C-g).
Nic z tego nie znaczy, że nie byłoby użyteczne, gdyby gdzieś przechowywane było przerwane makro; po prostu wydaje mi się, że tak się nie dzieje. Prawdopodobnie warto M-x
report-emacs-bug
zasugerować tę funkcję.źródło
Rozwiązaniem kanonicznym jest C-x C-k C-e(
kmacro-edit-macro
), które pozwoli ci przejść przez każde naciśnięcie klawisza i wstawić / usunąć cokolwiek chcesz. Składnia polecenia edytora jest nieco zwięzła, ale?
przywołuje przewodnik. Istnieje bardziej naturalny edytor związany z C-x C-k e(edit-kbd-macro
), który daje zwykły edytor makr z komentarzem.Inną opcją jest M-x
insert-kbd-macro
edytowanie makra jako Lisp, ale nie jest to najbardziej czytelna rzecz na świecie.Jeśli chodzi o zmienne, których szukasz
last-kbd-macro
ikmacro-ring
.Jak już wspomniałeś, nie ukończyłeś swojego makra, możesz po prostu utworzyć je na podstawie straty. C-x C-k e C-h li usuń do 300 poprzedzających znaków.
źródło
last-kbd-macro
niekmacro-ring
zawiera klawiszy naciskanych wcześniej,C-g
ani nie wystąpił błąd. W tytule umieszczam INCOMPLETE na wielkich literach, oczekując takich złych odpowiedzi. Dzięki za próbę pomocy.C-x C-k e C-h l
edytuj,C-c C-c
a następnie kontynuujC-u f3
nagrywanie (zauważając, że ten ostatnif3
najpierw odtworzy makro do tej pory, zanim czeka na dalsze dane). Być może potrzeba edycji makra stratnego jako makra nie jest idealna , ale (a) musiałeś edytować makro niezależnie od tego, czy przerwałeś nagrywanie, i (b) nie powinno tak się często zdarzać, jeśli pamiętasz, jak normalnie zatrzymać makro.