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他のキーボードの組み合わせを押すと、以下のようにミニバッファにエラーが発生しますM-o 3 c is undefined

なぜ動作しないのですか?説明された構文に従ったと思いました。ここkbdマクロ)。

答え1

端末はキー以外の文字について知っているので、その文字を持たないキーはエスケープシーケンスに変換してから戻す必要があります。Alt+を押すとLeft文字シーケンスに変換されます。ここでエスケープ文字は次のとおりです\eO3d\e残念ながら、これらの文字シーケンスの一部は標準化されていないため、端末がEmacsに送信する内容を宣言する必要があります。

Ctrl+を押しQてからキーの組み合わせ(たとえば、Alt+ Left)を押して、バッファにキーシーケンスを入力します。Ctrl+ コマンドはQEmacs に先行するエスケープ文字を文字通り解釈するよう指示します。 2文字の代わりにEmacs Lisp文字列で書くのが最善のエスケープ文字を持つの^[O3dと同じことがわかります。^[^[\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バインディングが機能することを知っています。

関連情報