我编写了一个创建别名的宏,并根据名称生成全局键绑定。 我希望如果我在我的emacs配置中添加以下代码,例如:
(defkey-alias cool-function make-directory)
我将命令my-cool-function创建一个目录和一个键绑定C-c c f。但经过评估后,我有键绑定但没有命令my-cool-function。
如果我做C-h k C-c c f,我会看到:
C-c c f runs the command my-cool-function, which is an alias for `make-directory'.
我无法在 scratch 中评估(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 ...(交互式)(call-interactively'功能))也不起作用
答案 0 :(得分:2)
原因很简单:(make-symbol (concat "my-" (symbol-name alias)))
返回一个非实习符号。即它返回一个名称为my-cool-function
的符号,但它与您在编写(my-cool-function)
时得到的符号不同。因此,您需要使用make-symbol
而不是intern
。