反转(kbd)功能?

时间:2011-09-03 08:59:14

标签: emacs elisp

我想知道是否存在反向(kbd)函数,我可以使用该函数从密钥代码中获取对其有意义的描述,例如来自C-b的{​​{1}}。

通常2确实有用,但不适用于前一个例子以及许多其他例子,因为特别是在Emacs上的键绑定通常比单个字符更复杂,即使它们确实是单个字符,它们可以是空格或制表符。

文档函数似乎使用函数(format "%c" x),它是用C编写的,因此是不可变的,如果可能的话,我想避免使用该路由,并以我的方式操作数据发烧友特色。

2 个答案:

答案 0 :(得分:11)

您可能正在寻找(key-description KEYS &optional PREFIX)

例如:(key-description [2])(key-description (kbd "C-b"))评估为"C-b"

答案 1 :(得分:3)

kbd逆的定义

(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的当前定义,请与我们联系。

旁注:有一个原因,键描述不会将字符作为参数。有两个角色:

  1. 一个字符只是一个数字。字符没有单独的数据类型。

  2. 有一种感觉,一个角色不是一把钥匙。角色是输入事件。一系列输入事件形成键序列(键盘快捷键),键序列称为键,简而言之。字符?a不是键,而是矢量[a]和字符串“a”。功能global-set-keykey-description仅使用键。