Да, есть способ добавить ранее определенный макрос в кольцо макросов, чтобы вы могли редактировать его с помощью kmacro-step-edit-macro:
Представьте, что вы назвали макрос клавиатуры tata, используя name-last-kbd-macro
, и сделали insert-kbd-macro
для tata. Например:
(fset 'tata
[return return ?f ?o ?o return])
Вы можете сохранить это определение макроса в вашем .emacs для дальнейшего использования. В новом сеансе emacs вы можете использовать следующий код lisp для возврата вашего макроса в ваше kmacro-ring:
(kmacro-push-ring (list 'tata 0 "%d"))
(kmacro-pop-ring)
После этого вы можете сделать kmacro-step-edit-macro
.
Если вы назвали свой макрос, используя kmacro-name-last-macro
вместо name-last-kbd-macro
, вызов insert-kbd-macro
вставит другое определение для вашего макроса, используя лямбда-функцию вместо вектора или строки (чтобы иметь возможность сохранить текущий счетчик), например:
(fset 'tata
(lambda (&optional arg) "Keyboard macro." (interactive "p")
(kmacro-exec-ring-item
(quote ([return return 102 111 111 return] 0 "%d")) arg)))
В этом случае kmacro-step-edit-macro
вызывает ошибку, поскольку это не вектор или строка. Для решения этой проблемы вы можете:
либо преобразуйте вашу лямбда-функцию в классическое векторное макроопределение (как, например, верхнее определение tata выше). Обычно такое преобразование всегда возможно.
или определите макрос, который вызывает ваш макрос лямбда-функции, например: (fset 'foo [?\M-x ?t ?a ?t ?a return])
И затем вы можете поместить этот макрос foo в кольцо kmacro, как сказано выше. Но в этом случае у вас могут возникнуть побочные эффекты в конце выполнения макроса.