Emacs

Emacs 中 kbd 宏的字元串語法

  • September 7, 2012

可能重複:

使用 Mx describe-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宏)。

終端知道字元,而不是鍵,因此沒有相應字元的鍵需要被轉換為轉義序列並返回。當您按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時,你的綁定將起作用。

引用自:https://unix.stackexchange.com/questions/47508