Як зберегти макрос клавіатури як функцію 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 вище), ви отримуєте рядок, а не функцію. fsetting що символ дозволяє вам виконувати макрос за допомогою Mx, але не викликати його з lisp ( commandp-> t, functionp-> nil). Як не дивно, навіть дзвінок через call-interactivelyнього не працює (хоча ви можете використовувати його execute-kbd-macroдля запуску).
пірокрастія

24

elmacro вже згадувався @lunaryorn, але як автор цього пакету я подумав, що було б непогано навести приклад.

Якщо ви записуєте такий макрос:

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.


7
Хтось рекомендував мій пакет \ o /
Silex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.