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

Ank*_*rVj 4 emacs elisp

(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)

eve*_*_jr 6

我最初认为这是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当你想要评估参数时应该使用它.