0

エイリアスを作成し、名前に基づいてグローバルキーバインディングを生成するマクロを作成しました。emacs configに次のコードを追加すると、次のようになります。

(defkey-alias cool-function make-directory)

ディレクトリとそれにキーバインドするCccfを作成するコマンドmy-cool-functionがあります。しかし、評価後、キーバインディングはありますが、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のバージョンはGNUEmacs24.2.1、Windows7です

コード:

;;; 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))の使用も機能しません

4

1 に答える 1

2

理由は単純です(make-symbol (concat "my-" (symbol-name alias)))。非インターンシンボルを返します。つまり、名前がであるシンボルを返しますが、my-cool-functionそれはあなたが書いたときに得られるものとは異なるシンボルです(my-cool-function)。したがって、代わりにmake-symbolを使用しますintern

于 2013-02-13T04:12:42.873 に答える