Конвертировать макрос Emacs в Elisp - PullRequest
18 голосов
/ 11 ноября 2009

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

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

Ответы [ 3 ]

22 голосов
/ 11 ноября 2009

Нет, извините. Не существует тривиального способа преобразования макроса emacs в elisp.

Обновление: В Emacs была проделана определенная работа, чтобы начать этот путь. См. эту тему в качестве отправной точки. Это все еще невозможно (июнь 2010 г.), но есть активность.

Первая причина, по которой я могу придумать, связана с интерактивными командами и переводом нажатий клавиш в надлежащие аргументы для функций.

Подумайте о следующей последовательности:

C-x b .em TAB RET

Это начинает команду для переключения в буфер, вводит три символа, использует завершение TAB для его завершения и RET для принятия. Эквивалентный шрифт для конечного результата (в сеансе 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.

5 голосов
/ 28 августа 2014

Я сделал пакет, который в значительной степени позволяет это в https://github.com/Silex/elmacro

У него есть некоторые причуды, но он работает довольно хорошо ... например, следующий макрос:

F3 C-e M-b M-u C-a C-n F4

Создает следующее элисп:

(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))
0 голосов
/ 26 апреля 2018

Я не знаю, были ли эти команды введены более недавно, чем приведенные выше комментарии, но вы можете сделать это следующим образом:

Дайте макросу клавиатуры имя с 'kmacro-name-last-macro', затем запустите 'insert-kbd-macro', который запросит это имя и вставит определение функции в отметку.

См .: 17.5 Имена и сохранение макросов клавиатуры

...