Как сохранить макрос клавиатуры как функцию Lisp?

41

Очень часто мне нужно выполнять набор шагов, требующих нескольких нажатий клавиш. Для того же сеанса эти шаги могут быть записаны в макросе клавиатуры.

Примером является сохранение часто выполняемой операции поиска / замены в виде макроса клавиатуры. Но этот макрос теряется, когда я покидаю emacs.

Как я могу сохранить мой часто используемый макрос клавиатуры как функцию Lisp?

Для простоты я хочу сохранить действие замены "abc" на "def" в качестве функции, чтобы я мог повторно использовать ее в сеансах emacs.

Каушал Моди
источник

Ответы:

48

Вот шаги, которые вы можете выполнить:

  • Выберите регион, который вы хотите сделать поиск-заменить.
  • Начать запись макроса.

    M-x start-kbd-macro

  • Сделайте необходимое M-x query-replace-regexp(замените «abc» на «def») и используйте !для принудительного поиска-замены во всем регионе.
  • Остановить запись макроса.

    M-x kmacro-end-or-call-macro,

  • Сделайте M-x kmacro-name-last-macroи дайте макросу описательное имя, например replace-abc-with-def. После этого вы сможете снова вызвать этот макрос M-x replace-abc-with-def.
  • Теперь сохраните этот макрос как функцию в файл, который вы загружаете во время инициализации emacs; например init.el,.
    • M-x insert-kbd-macro
    • Выберите ваш названный макрос для вставки туда.

Автоматически созданное replace-abc-with-defопределение функции выглядит так:

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

Теперь вы можете M-x replace-abc-with-defво всех ваших сессиях Emacs.

Каушал Моди
источник
1
+1 за insert-kbd-macro. Это ответ на вопрос (а остальная часть этого ответа предоставляет дополнительную помощь).
Дрю
6
Также обратите внимание, что Emacs может генерировать два разных формата для клавиатурных макросов. Какой из них вы получите, когда insert-kbd-macroзависит от того, назвали ли вы его, используя kmacro-name-last-macro(как в ответе выше) или name-last-kbd-macro.
Филс
1
Обратите внимание, что если вы используете name-last-kbd-macroформат (как упомянуто выше @phils), вы получите строку, а не функцию. fsetпривязка к символу позволяет вам выполнить макрос, используя Mx, но не вызывать его из lisp ( commandp-> t, functionp-> nil). Как ни странно, даже вызов через call-interactivelyнего не работает (хотя вы можете использовать его execute-kbd-macroдля запуска).
пирократизм
24

@lunaryorn уже упоминал о elmacro, но как автор этого пакета я подумал, что было бы неплохо привести пример.

Если вы записываете макрос, как это:

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

Затем выполнение M-x elmacro-show-last-macro upcase-last-wordсоздает буфер с:

(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))
кремнезем
источник
17

Пакет elmacro позволяет вам просматривать последний записанный макрос как правильный Emacs Lisp M-x elmacro-show-last-macro.

lunaryorn
источник
7
Кто-то рекомендует мой пакет \ o /
Silex