Макрос emacs не определяет команду

Я написал макрос, который создает псевдоним и генерирует глобальную привязку клавиш на основе имени. Я ожидаю, что если я добавлю в свою конфигурацию 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'.

Я тоже не могу оценить (my-cool-function) в scratch.

Но если я попытаюсь (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)) также не работает


person fallens4e    schedule 13.02.2013    source источник
comment
Помогло изменение make-symbol на intern   -  person fallens4e    schedule 13.02.2013


Ответы (1)


Причина проста: (make-symbol (concat "my-" (symbol-name alias))) возвращает неинтернированный символ. Т.е. он возвращает символ с именем my-cool-function, но он отличается от того, который вы получаете, когда пишете (my-cool-function). Итак, вместо make-symbol вы хотите использовать intern.

person Stefan    schedule 13.02.2013