以下解除绑定脚本有什么问题?

时间:2011-09-26 00:38:31

标签: emacs elisp

(dolist (abcc '("C-a" "C-b"))
  (global-unset-key (kbd abcc)))

不断给出错误:

Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p abcc)
  read-kbd-macro(abcc)
  #[(keys) "\301!\207" [keys read-kbd-macro] 2 2180088](abcc)
  (kbd abcc)
  (global-unset-key (kbd abcc))
  (while --dolist-tail-- (setq abcc (car --dolist-tail--)) (global-unset-key (kbd abcc)) (setq --dolist-tail-- (cdr --dolist-tail--)))
  (let ((--dolist-tail-- ...) abcc) (while --dolist-tail-- (setq abcc ...) (global-unset-key ...) (setq --dolist-tail-- ...)))
  (dolist (abcc (quote ...)) (global-unset-key (kbd abcc)))
  eval-buffer(#<buffer  *load*> nil "/home/name/.emacs" nil t)  ; Reading at buffer position 63
  load-with-code-conversion("/home/name/.emacs" "/home/name/.emacs" t t)
  load("~/.emacs" t t)
  #[nil "\205\264

3 个答案:

答案 0 :(得分:6)

我最初认为这是Emacs中的一个错误。我很惊讶以前没有人碰到这个。

以下是您可以使用的解决方法:

(dolist (abcc '("C-a" "C-b"))
  (global-unset-key (read-kbd-macro abcc)))

kbd是一个包装函数的宏,但它不会显式计算其参数。所以符号abcc直接传递给函数。

经过多思考(并阅读文档)。这实际上是用户错误。

kbd的doc字符串清楚地表明它应该用在字符串常量上。

因此,当您只希望密钥的内部表示出现在已编译的字节代码中时,应使用kbd。 e.g。

(define-key foo-mode-map (kbd "C-a") 'foo)

但是当你想要评估参数时,应该使用read-kbd-macro

答案 1 :(得分:1)

(keys)是一个直接传递到(read-kbd-macro)的宏。由于某些原因,前者也出错了,但后者却没有。试试这个呢?

答案 2 :(得分:0)

kbd是一个宏,所以它不会评估它的arg。