所以我一直在寻找一种方法来将Emacs键盘宏保存为elisp代码 - 将'insert-kbd-macro
使用的Emacs键描述语言替换为映射到宏键的实际函数。
在这样做时,我首先查看映射到键的函数,然后将这些函数呈现为要写入当前缓冲区的字符串
(symbol-name
(key-binding "\C-xo"))
将返回字符串"other-window"
但是,目前insert-kbd-macro
在插入符号中保存宏(不是人类可读的非常好)(例如:^P
vs \C-p
)函数key-binding
似乎只是接受人类可读的符号。
因此,为了转换为人类可读的符号,我查看了函数key-description
(key-description "\346")
返回"M-f"
然而,为了被key-binding
接受,它需要以“”\ M-f“形式表示符号
显而易见的方法是
(concat "\\" (key-description "\346")
然而,emacs只返回"\\"
而不是"\"
为了弄清楚发生了什么,我决定看看字符"\"
的原始字节显示为......
(byte-to-string 92)
返回'\\'
我怀疑它可能是elisp中的一个错误。
答案 0 :(得分:6)
答案是不要插入 - 使用read-kbd-macro
获取可与key-description
和key-binding
一起使用的可读文字。
(key-description (read-kbd-macro "M-f"))
(key-binding (read-kbd-macro "M-f"))
如果你真的想插入一个\
,正如你在评论中注意到的那样,你可以通过
(insert "\\")
但是,为了省去很多焦虑,你可能想放弃这项工作,因为目前无法以一般方式将键盘宏转换为elisp。请参阅问题"Convert Emacs macro into Elisp"。
答案 1 :(得分:1)
我将此功能添加到我的.emacs:
(defun insert-backs ()
"insert back-slash"
(interactive)
(insert "\\ "))
然后:
(global-set-key (kbd "M-:") 'insert-backs) ;
调用已定义的函数
表示我现在合并'Meta'
和':'
来获取'\'