反转(kbd)函数是什么?

9

我想知道是否有一个反向的(kbd)函数,可以用它从键码中获取有意义的描述,例如,从2获取C-b

通常情况下,(format "%c" x)可以工作,但是对于上面的示例以及许多其他示例来说,不起作用,因为键绑定,特别是在Emacs上,通常比单个字符更复杂,即使它们确实是单个字符,它们也可能是空格或制表符。

文档函数似乎使用自己编写的C函数(describe-buffer-bindings),这个函数是不可变的,因此我想尽可能避免使用它,并以我自己的方式操作数据以提供更高级的功能。

2个回答

12
你可能正在寻找的是(key-description KEYS &optional PREFIX)
例如:(key-description [2])(key-description (kbd "C-b"))会返回"C-b"

1
谢谢!这正是我需要的!(key-description (format "%c" 2))现在返回C-b! - konr
1
@konr 我猜你应该使用(vector 2),因为有些按键映射是非常大的整数,没有字符与它们对应。 - xuhdev

3
键盘反转的定义
(defun my-kbd-inverse (key)
  (if (numberp key)
      (setq key (vector key)))
  (key-description key))

测试

(defvar my-example-keys nil)
(setq my-example-keys
      (list 2 3 ?a
            24
            [?\C-x ?l]
            (list "C-x" "A")
            [(meta right) (meta left)]
            (kbd "<f9>")
            (kbd "<C-f9>")
            (kbd "C-M-a")
            [24 f9 97]))
(cl-loop for key in my-example-keys
         do
         (princ (my-kbd-inverse key))
         (terpri))

如果有任何可传递给global-set-key但与my-kbd-inverse的当前定义无法配合的关键字,请告诉我。
附带说明:字符不能作为key-description的参数,有两个注意点:
1.字符只是一个数字,没有单独的数据类型。 2.感觉字符不是一个键。字符是一个输入事件,一系列输入事件形成一个键序列(键盘快捷方式),而一个键序列简称键。字符“?a”不是键,但向量“[a]”和字符串“a”是键。global-set-key函数和key-description函数只接受键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接