Обратная (кбд) функция? - PullRequest
       13

Обратная (кбд) функция?

8 голосов
/ 03 сентября 2011

Мне было интересно, есть ли обратная функция (kbd), которую я мог бы использовать, чтобы получить из кода ключа ее содержательное описание, например, C-b из 2.

Обычно (format "%c" x) работает, но не для предыдущего примера, а также для многих других, поскольку привязки клавиш, особенно в Emacs, часто более сложны, чем один символ, и даже когда они действительно являются одним символом, они может быть пробелом или табуляцией.

Похоже, что функции документации сами используют функцию (describe-buffer-bindings), которая написана на C и поэтому неизменна, и я хотел бы, по возможности, избежать этого маршрута и манипулировать данными для обеспечения более интересных функций. .

Ответы [ 2 ]

11 голосов
/ 03 сентября 2011

Вы, наверное, ищете (key-description KEYS &optional PREFIX).

Например: (key-description [2]) и (key-description (kbd "C-b")) оценивают как "C-b".

3 голосов
/ 15 сентября 2013

Определение инверсии 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-key и key-description принимают только клавиши.

...