emacs宏不';t定义命令

emacs宏不';t定义命令,emacs,macros,elisp,alias,Emacs,Macros,Elisp,Alias,我编写了一个宏,它生成别名并基于名称生成全局键绑定。 例如,我希望在emacs配置中添加以下代码: (defkey-alias cool-function make-directory) 我将使用command-mycool函数创建一个目录和一个键绑定C-cf。但经过评估后,我有键绑定,但没有命令我的酷功能 如果我做C-hkc-cfc,我会看到: C-c c f runs the command my-cool-function, which is an alias for `make-dir

我编写了一个宏,它生成别名并基于名称生成全局键绑定。 例如,我希望在emacs配置中添加以下代码:

(defkey-alias cool-function make-directory)
我将使用command-mycool函数创建一个目录和一个键绑定C-cf。但经过评估后,我有键绑定,但没有命令我的酷功能

如果我做C-hkc-cfc,我会看到:

C-c c f runs the command my-cool-function, which is an alias for `make-directory'.
我也不能在scratch中评估(我的酷功能)

但如果我尝试(macroexpand'(defkey alias cool function make directory))然后评估扩展的s-expr,它就可以工作了

调用宏和调用宏扩展然后求值之间有什么区别?为什么alias不可调用? 多谢各位

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…(交互式)(交互式调用“函数”)也不起作用

原因很简单:
(生成符号(concat“my-”(符号名称别名)))
返回非内部符号。也就是说,它返回一个名为
my cool function
的符号,但它与编写
(my cool function)
时得到的符号不同。因此,您不想使用
makesymbol
而是想使用
intern

将makesymbol更改为intern