2013-02-13 48 views
0

我已經編寫了一個宏,它可以生成一個別名並根據名稱生成全局鍵綁定。 我想到,如果我添加到我的emacs配置下面的代碼,例如:emacs宏沒有定義命令

(defkey-alias cool-function make-directory) 

我會命令我酷,功能,創建一個目錄和一個鍵綁定C-C C F到它。但評估後,我有鍵綁定,但沒有命令我酷功能。

而且,如果我做C-H K C的-C C F I看到:

C-c c f runs the command my-cool-function, which is an alias for `make-directory'. 

我無法評價(我的酷功能)劃傷無論是。如果我嘗試(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定義...(互動)(呼叫交互「功能))也做不工作

+0

將生產符號更改爲實習生幫助 – fallens4e 2013-02-13 04:19:22

回答

2

原因很簡單:(make-symbol (concat "my-" (symbol-name alias)))返回一個非實名符號。即它會返回一個名稱爲my-cool-function的符號,但它與您在編寫(my-cool-function)時得到的符號不同。所以,而不是make-symbol你想要使用intern

+0

感謝您的回答!那就對了 – fallens4e 2013-02-13 05:03:33