Классический вариант использования:
- Вы начинаете запись макроса:
C-x (
- Вы делаете некоторые вещи, скажем
hello
. - Допустим, вы запускаете команду, которая выдает ошибку
C-g
(например, вы по ошибке запустили,C-s
и вам нужно отменить ееC-g
, теперь ваша работа потеряна).
Теперь ваша запись потеряна.
Я хотел бы продолжить с того места, где остановился, прежде чем выполнил команду, которая прервала мою запись. Я посмотрел C-h f start-kbd-macro
, но он написан на C, поэтому я не могу настроить его. Я также искал переменную типа current-kbd-macro
, но пока не нашел ничего.
Это можно восстановить?
Обновить:
Я не мог понять, почему C-u C-x (
это не работает для меня, но я обнаружил, что это потому, что я тестировал с C-g
.
Оказывается, это C-g
особенное - если вы запускаете ошибку другого типа, например
C-x ( M-: (signal 'quit nil)
Тогда это остановит запись, но last-kbd-macro
будет содержать "M-: M-( signal 'quit nil"
, но с
C-x ( C-g
Это останавливает запись и удаляет все записанное. Как пользователь Cg-happy (как и двое моих друзей), это довольно неудачное различие. Я пытался редактировать keyboard-quit
, но там я ничего не могу сделать.
Похоже, что единственный способ восстановить это - через recent-keys
и автоматически определить, где был вызван макрос start-kbd (или аналогичный), как в kmacro-edit-lossage
.
источник
Выполните
kmacro-start-macro-or-insert-counter
с префиксом (C-u
), чтобы добавить к предыдущему макросу.источник
C-u C-u
) устанавливает какAPPEND
иNO-EXEC
аргументыstart-kbd-macro
, которая позволяет добавлять без первоначальной переигровки макро-так далеко. Такое поведение является документально в руководстве, однако:(emacs) Basic Keyboard Macro
Сочетание хороших ответов от stsquad и artagnon дает (на мой взгляд) полное решение проблемы, которое вполне разумно:
Возможно, необходимость редактировать макрос с потерями не идеальна , но (а) вам обязательно нужно редактировать макрос независимо от того, прервали ли вы запись, и (б) это не должно происходить очень часто, если вы просто помните, как нормально останавливать макрос (например, с помощью <f4>вместо C-g).
Ничто из этого не говорит о том, что было бы бесполезно, если прерванный макрос где-то хранился; просто я не думаю, что это на самом деле происходит. Вероятно, стоило M-x
report-emacs-bug
бы предложить эту функцию.источник
Каноническое решение - это C-x C-k C-e(
kmacro-edit-macro
), которое позволит вам проходить каждое нажатие клавиши и вставлять / удалять все, что вы хотите. Синтаксис команды для редактора немного лаконичен, но?
приведёт руководство. Существует более естественный редактор, связанный с C-x C-k e(edit-kbd-macro
), который предоставляет текстовый редактор макросов с комментариями.Другой вариант, M-x
insert-kbd-macro
который позволит вам редактировать макрос как Lisp, но это не самая читаемая вещь в мире.Что касается переменных, вы ищете
last-kbd-macro
иkmacro-ring
.Поскольку вы упоминаете, что не завершили свой макрос, вы можете просто создать его из своей потери. C-x C-k e C-h lи удалите до 300 предыдущих символов.
источник
last-kbd-macro
ниkmacro-ring
содержат клавиши, нажатые ранее,C-g
или произошла ошибка. Я специально поставил в своем заглавии INCOMPLETE заглавными буквами, ожидая таких плохих ответов. Спасибо за попытку помочь.C-x C-k e C-h l
отредактировать, аC-c C-c
затемC-u f3
продолжить запись (отметив, что этот последнийf3
сначала будет воспроизводить макрос до тех пор, пока не будет ожидать дальнейшего ввода). Возможно, необходимость редактировать макрос с потерями не идеальна , но (а) вам обязательно нужно редактировать макрос независимо от того, прервали ли вы запись, и (б) это не должно происходить очень часто, если вы просто помните, как остановить макрос нормально.