Путаница в представлении клавиш Emacs - PullRequest
3 голосов
/ 26 июня 2010

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

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

Существует ли инструмент emacs, который упрощает представление нажатий клавиш?Идеально тот, который переводит из ahk нотации клавиш в любую нормальную нотацию клавиш Emacs.

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

Ответы [ 3 ]

5 голосов
/ 26 июня 2010

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

Уже спрашивали, можете ли вы преобразовать макрос emacs в 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"))

Чтобы это произошло автоматически после завершения макроса клавиатуры Cx) , вы можете воспользоваться этим советом:

(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")))
1 голос
/ 26 июня 2010

Спасибо, Трей.
Я объединил макрос name-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 и протестируйте / запустите его с 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
0 голосов
/ 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))
...