.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,你的绑定就会起作用。