2011-09-03 73 views
7

我想知道是否有反向(kbd)函數,我可以用它從密鑰代碼中獲得對它的有意義的描述,例如,從2得到C-b反向(kbd)功能?

通常(format "%c" x)可以工作,但不適用於上一個示例以及其他許多人,因爲Emacs上的鍵綁定通常比單個字符更復雜,即使它們確實是單個字符,也可以成爲一個空格或Tab。

看來,文檔函數本身使用函數(describe-buffer-bindings),它是用C語言編寫的,因此是不可變的,我想盡可能地避開那條路徑,並以我的方式處理數據以提供更好的功能。

回答

10

您可能正在尋找(key-description KEYS &optional PREFIX)。例如:(key-description [2])(key-description (kbd "C-b"))評估爲"C-b"。大骨節病的逆

+1

謝謝!這正是我需要的! (鍵描述(格式「%c」2))現在返回C-b! – konr

2

定義

(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只帶鑰匙。