(dolist (abcc '("C-a" "C-b"))
(global-unset-key (kbd abcc)))
Run Code Online (Sandbox Code Playgroud)
它不断给出错误:
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
Run Code Online (Sandbox Code Playgroud)
我最初认为这是Emacs中的一个错误.我很惊讶以前没有人碰到这个.
您可以使用以下解决方法:
(dolist (abcc '("C-a" "C-b"))
(global-unset-key (read-kbd-macro abcc)))
Run Code Online (Sandbox Code Playgroud)
会发生什么是kbd是一个包装函数的宏,但是它不会显式地计算它的参数.所以符号abcc直接传递给函数.
经过多思考(并阅读文档).这实际上是用户错误.
doc-string kbd明确指出它应该用在字符串常量上.
因此,kbd当您只希望键的内部表示出现在已编译的字节代码中时,应该使用它.例如
(define-key foo-mode-map (kbd "C-a") 'foo)
Run Code Online (Sandbox Code Playgroud)
但是read-kbd-macro当你想要评估参数时应该使用它.