シフトアップ+端子にEmacsが認識されないアプリケーションや端末に送信する文字との間のインターフェース(むしろまたはバイト)ので、私はキー、端末はエスケープシーケンスに最もファンクションキーを変換する方法を説明しません。いくつかの修飾子と文字の組み合わせのみが独自の文字を持っています。
- Ctrlプラス文字または
@[\]^_
バイト0〜31(ASCII 制御文字)に変わる1つ。
- 多くの場合、Ctrl+ ?はバイト127になり、Ctrl+ SpaceはCtrl+ @(バイト0)と同等です。
- 一部のファンクションキーは、制御文字と同等です:Tab= Ctrl+ I、Return= Ctrl+ M、Esc= Ctrl+ [。
- そして、構成に応じてBackspace= Ctrl+ HまたはCtrl+ ?。Ctrl+ ?はヘルプなので、Ctrl+ HはEmacsにとってより便利です。
- Meta+ characterはEsc、文字の後に送信されます。
では、Ctrl+ ;やCtrl+ Shift+ などの他の組み合わせはどうletterでしょうか?対応する文字がないため、端末は文字を再利用するか、エスケープシーケンスを送信する必要があります。多くの端末は、対応する文字がない場合に修飾子を無視します。そのため、Ctrl+ ;送信;
、Ctrl+ Shift+にletter相当するCtrl+ letterなどになります。
ターミナルベンダーは長い間シンプルなことを続けていました。自己永続的なエスケープシーケンスの標準はありませんでした。ターミナルベンダーはそれを実装せず、アプリケーションはそれをサポートせず、ユーザーはそれを期待していません。ターミナルエミュレータの中には、任意のエスケープシーケンスを送信するように構成できるものがあります。したがって、可能であれば、Emacsにエスケープシーケンスを構成して宣言できます(これについては後で説明します)。
エスケープシーケンスを標準化するための2つの提案があったため、最近状況は変化しています。1つは、構文を使用したLeoNerdのlibtermkeyです。もう1つは、構文を使用したThomas Dickeyのxtermです。リソースを設定することにより、xtermの現在のバージョン(216以上)をどちらの構文にも構成できます。を0以外の値に設定して、機能をアクティブにする必要があります。ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
端末エミュレータがこれらの構文をサポートしていないが、構成できる場合は、どちらかを選択します。
Emacs 24.4以降modifyOtherKeys
、端末がxtermバージョン≥216であることを検出すると、Emacsは自動的に機能をオンにします。Emacsのキーをエンコードするエスケープシーケンスの検出は、変数を介して機能しますlocal-function-key-map
。Emacs 24.4の時点では、すべてのエスケープシーケンスがサポートされているわけではありません。initファイルで次のコードを使用して、ジョブを完了することができます。
;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
"Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
(if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
(and (<= ?a c) (<= c ?z)))
(logand c ?\x1f)
(logior (lsh 1 26) c))))
(if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
(if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
(vector c))
(defun my-eval-after-load-xterm ()
(when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
(let ((c 32))
(while (<= c 126)
(mapc (lambda (x)
(define-key xterm-function-map (format (car x) c)
(apply 'character-apply-modifiers c (cdr x))))
'(;; with ?.VT100.formatOtherKeys: 0
("\e\[27;3;%d~" meta)
("\e\[27;5;%d~" control)
("\e\[27;6;%d~" control shift)
("\e\[27;7;%d~" control meta)
("\e\[27;8;%d~" control meta shift)
;; with ?.VT100.formatOtherKeys: 1
("\e\[%d;3u" meta)
("\e\[%d;5u" control)
("\e\[%d;6u" control shift)
("\e\[%d;7u" control meta)
("\e\[%d;8u" control meta shift)))
(setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))
TERM
環境変数がに設定されていない場合、xterm
またはなどのバリアントではxterm-256color
、Emacsはこれらのシーケンスをアクティブにしません。Emacsがの値を既にサポートしている場合、名前がの値であるLispファイルをロードしたTERM
後に実行される上記のような関数を定義することにより、サポートを追加できますTERM
。Emacsにそのようなサポートがない場合は、のterm
どこかにサブディレクトリload-path
を作成し、term/$TERM.el
where $TERM
の値がのLispファイルを作成し、TERM
という関数を定義することで追加できますterminal-init-$TERM
。
私が書いているように、これらのエスケープシーケンスを採用しているxterm以外の端末エミュレータはほとんどないようです。OSXでは、キーの組み合わせごとにエスケープシーケンスを1つずつ選択することにより、iTerm2を構成できます。
C-;
コンボをしてから使用しM-x view-lossage
てもEmacsのになってきたかどうかを確認します。