我编写了一个创建别名并根据名称生成全局键绑定的宏。我希望如果我将以下代码添加到我的 emacs 配置中,例如:
(defkey-alias cool-function make-directory)
我将使用命令 my-cool-function 创建一个目录和一个键绑定 Cc cf 到它。但是经过评估,我有键绑定但没有命令 my-cool-function。
如果我执行 Ch k Cc cf 我会看到:
C-c c f runs the command my-cool-function, which is an alias for `make-directory'.
我也无法从头开始评估(my-cool-function) 。
但是,如果我尝试 (macroexpand '(defkey-alias cool-function make-directory)) 然后评估扩展的 s-expr 它可以工作。
调用宏和调用宏扩展然后求值有什么区别?为什么别名不可调用?谢谢你。
Emacs 版本是 GNU Emacs 24.2.1,Windows 7
编码:
;;; defining keys
(defun name-to-key(funname)
" works like:
'my-cool-function -> \"\C-cmcl\" "
(apply 'concat
"\C-c"
(mapcar (lambda(str)(substring str 0 1))
(split-string (symbol-name funname)
"-"))))
(defmacro defkey-alias(alias function)
"works like defalias but you should not quote symbols and sets global key mapping
Usage: (defkey-alias mkdir make-directory)"
(let ((myalias (make-symbol (concat "my-" (symbol-name alias)))))
`(progn
(defalias ',myalias ',function)
(global-set-key ,(name-to-key alias) ',myalias))))
更新:使用 (defun ...(interactive)(call-interactively 'function)) 也不起作用