Jak wznowić NIESAMOWITE nagranie makra na klawiaturze?

10

Klasyczny przypadek użycia:

  1. Zaczynasz rejestrować makro: C-x (
  2. Robisz coś, powiedzmy hello.
  3. Wykonujesz polecenie, które generuje błąd, powiedzmy C-g(np. Błędnie uruchomiłeś C-si 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-gjest wyjątkowy - jeśli wywołasz inny rodzaj błędu np

C-x ( M-: (signal 'quit nil) 

To zatrzyma nagrywanie, ale last-kbd-macrobę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-keysi automatyczne ustalenie, gdzie wywołano makro start-kbd (lub podobne), jak w kmacro-edit-lossage.

Christopher Done
źródło

Odpowiedzi:

8

Zacząłem implementację tutaj który pozwala ponownie powiązać swoją C-x (TO resmacro-start-macro.

Załóżmy teraz, że przechodzisz do połowy makra i popełniasz błąd i uderzasz C-g, np. Biegniesz C-sprzez pomyłkę, więc naciskasz, C-gaby go anulować lub w / e.

C-x ( hello C-s C-g 

Teraz uruchom, C-u C-x (który wyświetli monit w minibuforze za pomocą:

Wznów makro za pomocą (RET: kontynuuj, DEL: usuń ostatni): h e l l o C-s

Więc naciskasz backspace ( DEL), aby usunąć, C-sa następnie RETkontynuować. Teraz mówi:

Dołączanie do makra KBD ...

I możesz kontynuować.

W całości:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

Wygodny, bez przełączania kontekstu, minimalne skróty klawiszowe do wykonania zadania, automatycznie ustalają, od czego zaczyna się makro (at C-x () (recent-keys).

Christopher Done
źródło
1
Hej, to brzmi naprawdę fajnie. Chcesz przesłać go jako poprawkę do Emacsa?
Stefan
Możesz to zrobić / zmienić licencję, jak chcesz! Będę testował go przez jakiś czas lokalnie, zanim ogłosi go gdziekolwiek, aby wiedzieć, że jest niezawodny. Jednak opiekunowie Emacsa mogą uważać to za zbyt hackujące. ;-)
Christopher Done
Aby dołączyć go do Emacsa, musimy podpisać dokumentację dotyczącą praw autorskich (ta sama dokumentacja oczywiście dotyczyłaby również trybu boskiego).
Stefan
Link jest teraz zerwany :(
DirtY iCE
2

Wykonaj za kmacro-start-macro-or-insert-counterpomocą prefiksu ( C-u), aby dołączyć do poprzedniego makra.

artagnon
źródło
2
Docstring nie mówi tak, ale podwójne prefiks arg ( C-u C-u) ustawia zarównoAPPEND i NO-EXECargumenty start-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
phils
Spróbuj tego z przykładem w moim pytaniu, nie działa.
Christopher Sporządzono
2

Połączenie dobrych odpowiedzi ze stsquad i artagnon daje (moim zdaniem) całkowite rozwiązanie problemu, który jest całkowicie uzasadniony:

  • C-xC-keC-hl edytować makro wygenerowane na podstawie utraty
  • edytuj makro, aby zredukować je do oryginalnego nagrania
  • C-cC-c do przechowywania edytowanego makra
  • Albo C-u<f3>najpierw odtwórz to makro, a następnie kontynuuj rejestrowanie kolejnych naciśnięć klawiszy, które zostaną dołączone do definicji makra
  • ... lub C-uC-u<f3>kontynuować nagrywanie bez początkowego odtworzenia jak dotąd makra.

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-bugzasugerować tę funkcję.

phils
źródło
To nie rozwiązuje problemu. Dzięki Twojemu rozwiązaniu połowę czasu łatwiej byłoby po prostu ponownie uruchomić makro. Wysłałem odpowiedź gdzie indziej, która ładnie rozwiązuje problem.
Christopher Sporządzono
1
Jasne, w prostych przypadkach rozpoczęcie od nowa byłoby łatwiejsze. Nadal jednak jest użyteczny dla reszty, co oznacza, że ​​niektórzy ludzie uznają go za pomocny; zwłaszcza, że ​​jest domyślnie dostępny. Jak już wspomniałem, myślę, że pomysł bardziej zautomatyzowanego podejścia jest dobry, dlatego cieszę się, że pracujesz nad rozwiązaniem i z pewnością głosowałem za odpowiedzią.
phils
0

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-macroedytowanie makra jako Lisp, ale nie jest to najbardziej czytelna rzecz na świecie.

Jeśli chodzi o zmienne, których szukasz last-kbd-macroi kmacro-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.

stsquad
źródło
To zła odpowiedź, którą głosowałbym, gdybym mógł. Albo nie przeczytałeś pytania, albo je ignorujesz. Ani last-kbd-macronie kmacro-ringzawiera klawiszy naciskanych wcześniej, C-gani nie wystąpił błąd. W tytule umieszczam INCOMPLETE na wielkich literach, oczekując takich złych odpowiedzi. Dzięki za próbę pomocy.
Christopher Sporządzono
1
@ChristopherDone: na pewno możesz - dodałem notatkę na dole, aby wspomnieć o stratach. Możesz utworzyć makro z maksymalnie 300 wcześniej wpisanych znaków.
stsquad
Tak, ktoś wspomniał o stratach na #emacs. Chcę tylko wrócić do miejsca, w którym skończyłem. Nie chcę otwierać edytora i zaczynać usuwania z tego, kiedy jestem w trakcie robienia czegoś.
Christopher Sporządzono
2
Połączenie tego i odpowiedzi artagnon daje dobre rozwiązanie:, C-x C-k e C-h ledytuj, C-c C-ca następnie kontynuuj C-u f3nagrywanie (zauważając, że ten ostatni f3najpierw 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.
phils
1
@phils +1 Może powinieneś zmienić to w osobną odpowiedź.
itsjeyd