Обратите внимание, что вы все еще можете использовать apply-macro-to-region-lines
с макросом, сгенерированным из кода, при условии макрос определен как вектор или строка.С помощью пользовательского apply-named-macro-to-region-lines
[2] вы можете выбрать макрос для интерактивного использования.
Emacs может генерировать код из макроса клавиатуры двумя способами, в зависимости от метода, используемого для его присвоения имени.
Если вы используете kmacro-name-last-macro
(привязано к Cx Ck n ), тогда Emacs генерирует из макроса функцию , котораянапрямую не используется для этой конкретной цели [1].
Если вы используете name-last-kbd-macro
для имени вашего макроса, он будет сгенерирован как вектор или строка.
В любом случае вызатем используйте insert-kbd-macro
для получения кода.
На самом деле векторный / строковый формат является форматом по умолчанию, так что вы можете пропустить шаг именования и сразу запросить код (набрав RET взапрос имени для указания последнего определенного макроса), а затем вручную отредактируйте имя по умолчанию для вставленного кода.
[1]: векторная форма, по-видимому, просто встроена в определение функции, поэтомуВы должны быть в состоянии извлечь это из кода, чтобы вручную перечитатьОпределите макрос-функцию в векторном формате.
[2]: Когда я изначально писал этот ответ, я забыл, что это была пользовательская функция.Извините за это.
(defun apply-named-macro-to-region-lines (top bottom)
"Apply named keyboard macro to all lines in the region."
(interactive "r")
(let ((macro (intern
(completing-read "kbd macro (name): "
obarray
(lambda (elt)
(and (fboundp elt)
(or (stringp (symbol-function elt))
(vectorp (symbol-function elt))
(get elt 'kmacro))))
t))))
(apply-macro-to-region-lines top bottom macro)))