Есть ли способ конвертировать макрос emacs в elisp, а не как то, что делает M-x insert-kbd-macro
, фактическая активность становится elisp-операциями.
Спасибо за вашу помощь.
Есть ли способ конвертировать макрос emacs в elisp, а не как то, что делает M-x insert-kbd-macro
, фактическая активность становится elisp-операциями.
Спасибо за вашу помощь.
Нет, извините. Существует нет тривиального способа преобразования макроса emacs в elisp.
Обновление: В Emacs появилась некоторая работа, чтобы начать этот путь. См. этот поток в качестве отправной точки. Это все еще невозможно (июнь 2010 г.), но есть активность.
Первая причина, по которой я могу думать, - это иметь дело с интерактивными командами и переводить нажатия клавиш в правильные аргументы для функций.
Подумайте о следующей последовательности:
C-x b .em TAB RET
Это начинает команду переключиться на буфер, набирает три символа, использует завершение TAB для его завершения и RET для принятия. Эквивалент lisp для конечного результата (в сеансе emacs, где завершение TAB уникально):
(switch-to-buffer ".emacs")
Размышляя о завершении, есть также взаимодействия с расширением всех типов (dabbrev
, hippie-expand
и т.д.).
Отправной точкой может быть M-x edit-last-kbd-macro, которая (в моем случае) показывает это:
;; Keyboard Macro Editor. Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-x b .em <tab> RET
Command: last-kbd-macro
Key: none
Macro:
C-x b ;; switch-to-buffer
.em ;; self-insert-command * 3
<tab> ;; pabbrev-expand-maybe
RET ;; newline-and-indent
Это, по крайней мере, дает вам некоторые имена функций. Но вы увидите, что RET помечен как 'newline-and-indent
, что неверно, потому что во время выполнения макроса минибуфер активен, а привязка фактически 'minibuffer-complete-and-exit
. Аналогично, правильное связывание для TAB составляет 'minibuffer-complete
.
Я сделал пакет, который позволяет в значительной степени именно это на https://github.com/Silex/elmacro
У него есть некоторые причуды, но он работает очень хорошо... например, следующий макрос:
F3 C-e M-b M-u C-a C-n F4
Создает следующий elisp:
(defun upcase-last-word ()
"Change me!"
(interactive)
(move-end-of-line 1)
(backward-word 1)
(upcase-word 1)
(move-beginning-of-line 1)
(next-line 1 1))