请问有什么方式可以判断按键绑定使用了kbd?

像是(kbd "C-k"),有没有类似kbdp的函数来判断该绑定使用了kbd,因为(kbd "C-k")返回的也是一个字符串,这与正常字符串C-k如何区分呢

bu neng

不能区分,因为没有任何区别 kbd是一个macro,展开后就是字符

Emacs 按键可以用字符串和 Vector 两种表示方法。有些按键没法用字符串表示,只能用 Vector,此时 kbd 返回的不是字符串,而是 Vector,比如:

(kbd "<f1> SPC")
;; => [f1 32]

(kbd "C-k") 返回的是由 Unicode code point 11 一个字符组成的字符串,这不是一个可见、可打印字符,平时不会用到。

(string= (kbd "C-k") (string 11))
;; => t
2 个赞

善用 type-of ,可以自己通过类型判断

kbd的签名类似于(-> Str (U Str Vec)) 并不存在单独的kbd对象。

我更觉得你这个是犯了“XY问题”的错误,你不如说说你为什么要判定kbd

内容已经说明(kbd "C-k")返回的也是一个字符串

主要是自定义了一个函数,想要混用

(define-key "C-k" ...)
(define-key (kbd "C-k") ...)
(define-key [f1] ...)

这类用法

可以参考我的 lazy-load.el 的代码,已经有这类实现

发现一个很疑惑的问题,多次使用kbd

(kbd (kbd "t"))
(kbd (kbd "C-t"))
(kbd (kbd "k"))
(kbd (kbd "C-k"))
(kbd (kbd "C-l"))

为何只有C-l返回的是一个空字符串

在 emacs-lisp 中 (kbd "C-k") 的类型是一个向量,不是字符串

(type-of (kbd "C-k"))
;; ==> vector,

我之前是用(stringp (kbd "C-k"))判断得到的结论。。。

你在ielm里面实际用type-of测试一下就知道了

不对啊,为何我(type-of (kbd "C-k"))得到的也是string

emacs-lisp-mode

(type-of (kbd "C-k"))  ; => string
(type-of (kbd "C-x")) ; => string
(type-of (kbd "<f1> 1")) ; => vector

使用 ielm

(type-of (kbd "C-k")) ; => vector
(type-of (kbd "C-x")) ; => string
(type-of (kbd "<f1> 1")) ; => vector

PS: 不好意思,误导了你,我之前一直以为 ielm buffer 是使用的 emacs-lisp-mode, 现在才看到它使用的是 inferior-emacs-lisp-mode:sweat::sweat:

(defvar kbdp nil)

(defun -kbd (&rest r)
  (push (car r) kbdp))

(advice-add (quote kbd) :before (function -kbd))

(defun kbdp (key)
  (cl-find key kbdp :test (function equal)))
(kbd "C-k") 

(kbdp "C-k") ; "C-k"

(kbdp "C-a") ; nil