【问题标题】:Reverse (kbd) function?反向(kbd)功能?
【发布时间】:2023-03-17 19:05:02
【问题描述】:

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

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

似乎文档函数自己使用函数(describe-buffer-bindings),它是用C编写的,因此是不可变的,如果可能的话,我想避免这条路线,并以我的方式操纵数据以提供更高级的功能.

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

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

    例如:(key-description [2]) 和 (key-description (kbd "C-b")) 计算结果为 "C-b"。

    【讨论】:

    • 谢谢!这正是我所需要的! (key-description (format "%c" 2)) 现在返回 C-b!
    • @konr 我猜你应该使用(vector 2),因为有些键映射是非常大的整数,没有字符对应。
    【解决方案2】:

    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 的当前定义,请告诉我。

    旁注:key-description 不将字符作为参数是有原因的。有两个字符陷阱:

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

    2. 感觉字符不是键。字符是输入事件。一系列输入事件形成一个键序列(键盘快捷键),一个键序列简称为一个键。字符?a 不是键,但向量[a] 和字符串“a”是。 global-set-key 和 key-description 函数只带键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多