【问题标题】:emacs macro doesn't define commandemacs 宏没有定义命令
【发布时间】:2013-02-13 02:55:03
【问题描述】:

我编写了一个宏,它可以创建别名并根据名称生成全局键绑定。 我希望如果我将以下代码添加到我的 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 ...(interactive)(call-interactively 'function)) 也不起作用

【问题讨论】:

  • 将 make-symbol 更改为实习生有帮助

标签: emacs macros elisp alias


【解决方案1】:

原因很简单:(make-symbol (concat "my-" (symbol-name alias))) 返回一个非实习符号。 IE。它返回一个名称为my-cool-function 的符号,但它与您编写(my-cool-function) 时得到的符号不同。所以你想用intern代替make-symbol

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多