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

Emacs 以下解除绑定脚本有什么问题?,emacs,elisp,Emacs,Elisp,它不断地给出错误: (dolist (abcc '("C-a" "C-b")) (global-unset-key (kbd abcc))) 调试器已输入--Lisp错误:(类型参数integer-or-MAKER-p abcc错误) 读取kbd宏(abcc) #[(键)“\301!\207”[键读取kbd宏]2 2180088](abcc) (kbd abcc) (全局未设置键(kbd abcc)) (while--dolist tail--(setq-abcc(car--dolist

它不断地给出错误:

(dolist (abcc '("C-a" "C-b"))
  (global-unset-key (kbd abcc)))
调试器已输入--Lisp错误:(类型参数integer-or-MAKER-p abcc错误)
读取kbd宏(abcc)
#[(键)“\301!\207”[键读取kbd宏]2 2180088](abcc)
(kbd abcc)
(全局未设置键(kbd abcc))
(while--dolist tail--(setq-abcc(car--dolist tail--)(全局未设置键(kbd-abcc))(setq--dolist tail--(cdr--dolist tail--)
(let((-dolist tail--…)abcc)(而--dolist tail--(setq abcc…)(全局未设置键…(setq--dolist tail--…))
(dolist(abcc(报价…)(全局未设置键(kbd abcc)))
求值缓冲区(#nil)/home/name/.emacs“nil t);缓冲器位置63处的读数
使用代码转换加载(“/home/name/.emacs”“/home/name/.emacs”t)
荷载(“~/.emacs”t)
#[nil”\205\264

(键)
是一个直接传递到
(读取kbd宏)的宏
。由于某种原因,前者对我来说也会出错,但后者不会。试试看吧?

kbd
是一个宏,所以它不会评估其参数。

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

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

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
kbd是一个包装函数的宏,但是它没有显式地计算其参数,所以符号abcc直接传递给函数

经过一点思考(并阅读文档),这实际上是用户的错误

kbd
的文档字符串清楚地表明,它应该用于字符串常量

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

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

但是,当您希望计算参数时,应该使用
read kbd macro

这些小东西让我讨厌Emacs(或者更准确地说,它的API…),谢谢。
(define-key foo-mode-map (kbd "C-a") 'foo)