Emacs 中 kbd 宏的字符串语法

Emacs 中 kbd 宏的字符串语法

可能的重复:
使用 Mxdescribe-key 查找代码后在 Emacs 中关联函数

.emacs我在我的文件中输入了以下宏

(global-set-key (kbd "M-<left>") 'windmove-left)          ; move to left windnow
(global-set-key (kbd "M-<right>") 'windmove-right)        ; move to right window
(global-set-key (kbd "M-<up>") 'windmove-up)              ; move to upper window
(global-set-key (kbd "M-<down>") 'windmove-down)          ; move to lower window

但是,当我按Alt+left或任何其他键盘组合时,我会在 minibuffer 中收到如下错误M-o 3 c is undefined

为什么不起作用?我以为我遵循了所描述的语法这里kbd宏)。

答案1

终端知道字符,而不是键,因此没有对应字符的键需要转换为转义序列并返回。当您按Alt+时Left,它会被转换为字符序列,\eO3d其中\e是转义字符。不幸的是,其中一些字符序列没有标准化,因此您需要声明您的终端发送到 Emacs 的内容。

Ctrl+ Q,然后按组合键(例如Alt+ Left)以在缓冲区中输入按键序列。Ctrl+命令Q告诉 Emacs 按字面解释前导转义字符。您会看到类似的内容^[O3d,其中^[不是两个字符^[而是一个转义字符,最好在 Emacs Lisp 字符串中写为\e

将每个组合键的转义序列添加到input-decode-map。例如(此代码进入您的.emacs):

(define-key input-decode-map "\eO3a" [M-up])
(define-key input-decode-map "\eO3b" [M-down])
(define-key input-decode-map "\eO3c" [M-right])
(define-key input-decode-map "\eO3d" [M-left])

(kbd "M-<up>")或者(kbd "<M-up>")是替代的写作方式[M-up]

一旦你声明了这些翻译,Emacs 就会知道当终端发送例如^[O3d它代表组合键Alt+时Left,你的绑定就会起作用。

相关内容