Подтвердить что ты не робот

Преобразование макроса Emacs в Elisp

Есть ли способ конвертировать макрос emacs в elisp, а не как то, что делает M-x insert-kbd-macro, фактическая активность становится elisp-операциями.

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Нет, извините. Существует нет тривиального способа преобразования макроса 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.

Ответ 2

Я сделал пакет, который позволяет в значительной степени именно это на 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))