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.

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


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.


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


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.


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