像是(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测试一下就知道了
在 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
。
(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