2013-08-05 148 views
4

所以我正在尋找一種方法來將Emacs鍵盤宏保存爲elisp代碼 - 用'insert-kbd-macro所使用的Emacs鍵描述語言替換映射到宏鍵的實際函數。如何插入反斜槓?

在這樣做時,我一直在尋找第一個檢索映射到鍵的功能,其次是使這些功能作爲字符串寫入當前緩衝區

(symbol-name 
    (key-binding "\C-xo")) 

將返回字符串"other-window"

但是,insert-kbd-macro目前insert-kbd-macro將宏保存爲插入符號(不是人類可讀的符號)(例如:^P vs \C-p)函數key-binding似乎只接受可讀的符號。

所以在努力轉換爲人類可讀的符號,我看着功能key-description

(key-description "\346") 

回報"M-f"

但是爲了通過key-binding所接受,它需要符號的形式` 「\ MF」)

一個明顯的方式做這將是

(concat "\\" (key-description "\346")

但是emacs的永遠只能返回"\\""\"

爲了弄清楚發生了什麼事情,我決定去看看什麼角色"\"的原始字節顯示爲....

(byte-to-string 92) 

它返回'\\'

我懷疑它可能是一個在elisp中的錯誤。

+0

所以你實際上並不想插入一個反斜槓:)?請注意,^ M的代碼是13,並且不能從彙編\和M.獲取它。 –

+0

實際上,我確實想插入一個反斜槓!你可以插入一個反斜槓嗎? – jones

+0

是的,當然。只需鍵入反斜槓。順便說一下,'鍵綁定'爲我讀取一切。 –

回答

5

答案是不要插入/的 - 使用read-kbd-macro獲取可讀的文本,也可用於key-descriptionkey-binding

(key-description (read-kbd-macro "M-f")) 

(key-binding (read-kbd-macro "M-f")) 

如果你真的想插入\,正如您在您的評論注意到,您可以通過

(insert "\\") 

這樣做,但,爲您節省了大量的焦慮,你可能想放棄因爲目前不可能將鍵盤宏以通用的方式轉換成elisp。看到問題"Convert Emacs macro into Elisp"

1

我將此函數添加到我的。emacs的:

(defun insert-backs() 
    "insert back-slash" 
    (interactive) 
    (insert "\\ ")) 

然後:

(global-set-key (kbd "M-:") 'insert-backs) ;調用定義的函數

意味着現在我結合'Meta'':'讓我'\'

+0

請使用正確的格式。 – SteveFest