Представление о смещении нажатия клавиши Emacs

88
6

Я обычно определяю новые сочетания клавиш в emacs с помощью

"C-x (" --> (command kmacro-start-macro)
"C-x )" --> (kmacro-end-macro)
(name-last-kbd-macro)
(insert-kbd-macro)
Но создаваемый им код выглядит иначе, чем код, который я читаю и изменяю в различных основных/второстепенных режимах и других утилитах emacs.

Недавно я натолкнулся на это сообщение в блоге, которое устраняет некоторые из моих замешательств.

Есть ли средство emacs, упрощающее представление нажатия клавиши?
В идеале, это означает, что в любом значении смены звукового символа emacs от ahk).


Изменить: некоторые другие чтения, чтобы очистить мое замешательство:
руководство по связыванию клавиш Яри Аалто.

спросил(а) 2021-01-25T18:59:02+03:00 5 месяцев назад
1
Решение
109

Указанная последовательность упрощает представление нажатия клавиш. То, что вы оставили, - это, по сути, набор нажатых клавиш.


Уже задано вопрос, можете ли вы преобразовать макрос emas в elisp.


Возможно, вы спрашиваете, можно ли сделать его более понятным для человека?
Если да, то вам повезло.


Вы можете использовать макрос kbd, чтобы преобразовать печатное изображение нажатий клавиш в эквивалентный вектор нажатий клавиш.


Например, последовательность, которая приводит к query-replace 3 с tj, выглядит так: M-% 3 RET tj RET !


Ну, вы можете вручную установить это с помощью:

(fset 'my-hand-crafted-kbd-macro (kbd "M-% 3 RET tj RET !"))

И этот фрагмент кода elisp должен сгенерировать выше для вас, если вы назвали свой макрос 'my-hand-crafted-kbd-macro:


(defun insert-pretty-kbd-macro (macro-name)
(interactive (list (intern (completing-read
"Insert kbd macro (name): "
obarray
(lambda (elt)
(and (fboundp elt)
(or (stringp (symbol-function elt))
(vectorp (symbol-function elt))
(get elt 'kmacro))))
t))))
(interactive)
(insert "(fset '")
(prin1 macro-name (current-buffer))
(insert "\n (kbd \"")
(insert (key-description (symbol-function macro-name)))
(insert "\"))\n"))

Чтобы это произошло автоматически, когда вы закончили макрос клавиатуры C-x ) , вы можете использовать этот совет:


(defadvice kmacro-end-macro (after kmacro-end-macro-name-it-and-insert activate)
"user wants to insert elisp to reproduce the last kbd macro"
(let ((name (read-string "Name for this kbd macro: ")))
(insert "(fset '")
(insert name)
(insert "\n (kbd \"")
(insert (key-description last-kbd-macro))
(insert "\"))\n")))

ответил(а) 2021-01-25T18:59:02+03:00 5 месяцев назад
63

Спасибо Трей.

Я скомбинировал имя-last-kbd-macro с вашим макросом insert-pretty-kbd в name-and-insert-last-kbd-macro

(defun name-and-insert-last-kbd-macro (macro-name)
(interactive (list (intern (completing-read
"Insert kbd macro (name): "
obarray
t))))
(interactive)
(insert "(fset '")
(prin1 macro-name (current-buffer))
(insert "\n (kbd \"")
(fset symbol last-kbd-macro)
(insert (key-description (symbol-function symbol)))
(insert "\"))\n"))

, теперь я могу начать определять макрос с f8, end и test/запустите его с именем f9 и именем и вставьте его с помощью f10:
(global-set-key [f8] 'kmacro-start-macro)
(global-set-key [f9] 'kmacro-end-and-call-macro)
(global-set-key [f10] 'name-and-insert-last-kbd-macro)
(global-set-key [f12] 'menu-bar-open) ; originally bound to F10

ответил(а) 2021-01-25T18:59:02+03:00 5 месяцев назад
45

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

ответил(а) 2021-01-25T18:59:02+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема