Emacs
Emacs 中 kbd 宏的字元串語法
可能重複:
我在我的
.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
宏)。
終端知道字元,而不是鍵,因此沒有相應字元的鍵需要被轉換為轉義序列並返回。當您按
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
時,你的綁定將起作用。