(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
答案 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。