回答:
端末でキーまたはキーの組み合わせを押すと、1つ以上の文字のシーケンスとして端末で実行されているアプリケーションに送信されます。たとえば、を押すaと、アプリケーションはを受け取りa
ます。押すとEnter、アプリケーションが文字を受信CR
(別名^M
(発音は「コントロール-EMM」)、文字番号13別名、別名\r
または\015
)。関係するキーの組み合わせAltは、通常、文字ESC
(^[
別名aka \e
または\033
)として送信され、その後にキーなしのキーまたはキーの組み合わせのシーケンスが続きAltます。ファンクションキーおよびその他のキーの組み合わせは、\e[
またはで始まるエスケープシーケンスとして送信され\eO
ます。
エスケープシーケンスは完全に標準化されておらず、端末は通常、特定のキーの特定の属性を無視します。例えば、Ctrl+ Shift+はletter、多くの場合、正確に同じように送信されるCtrl+ letterデフォルトで。
シェルプロンプトでCtrl+ を押しVてそのキーの組み合わせを押すC-q
かC-h c
、Emacsのキーの組み合わせを押すことで、端末がキーの組み合わせに対して何を送信するかを確認できます。
一部の端末エミュレータでは、キーごとにエスケープシーケンスを構成できます。Xtermでは、これはXリソースを通じて行われます。ほとんどのセットアップは~/.Xresources
Xの起動時にリソースを読み取り、を使用してファイルを手動でロードできますxrdb -merge ~/.Xresources
。
Term.VT100.translations: #override \n\
Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
Ctrl Shift ~Meta <key>percent: string("\033[37;6~")
一般的な規則ではESC [ number1 ; number2 ~
、修飾子付きのファンクションキーの形式のエスケープシーケンスを使用します。number1
はファンクションキーを示し(15
to 24
for F5to F12—歴史的な理由により、F1 F4は異なるエスケープシーケンスを持っています)number2
、修飾子を示します(2
for Shift、5
for Ctrl、3
for Meta、8
for Ctrl+ Meta、およびadd 1を+に追加しますShift—いいえ、あまり一貫性がありません)。
Emacsはを通じて内部キー表現にエスケープシーケンスを変換するinput-decode-map
か、local-function-key-map
(またはfunction-key-map
emacsの23の前に)。
(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
ESC
(128以上の文字を試してみたいが、入力エンコーディングが制限される場合を除いて)でなければならず、2番目の文字はESC foo
バインドしないものでなければならないことを意味します。
local-set-key
実際にすべきdefine-key
ですか?前者はエラー(引数の数が間違っています)を返しますが、後者は少なくとも<kbd> C-Enter </ kbd>で機能します。konsoleはまだ<kbd> CM-%</ kbd>の送信に問題があるようです。
define-key
。Konsoleのエスケープキーを設定できるかどうかはわかりませんが、xtermはおそらく他の方法よりもカスタマイズ可能です。
XTerm*modifyOtherKeys: 2
リソースそれものために独特の配列が生成されますC-M-
組み合わせを、しかし、その設定でカスタムマッピングの多くを提供する必要があります(XTerm*modifyOtherKeys: 1
能力の低いが、ボックスのはるかに機能的アウトです)。例えば参照(私のために動作しませんでした1が)xterm-extras.el
ライブラリと関連する.Xresources
と.inputrc
のファイルeasymacsのダウンロードを。
限定的ではあるが重要なキーのセットの場合、KDEのコンソールを想定して、emacs -nwで機能する複雑なキーバインディングを行うには、次のようにします。
動作するようにするための実装をS-<RET>
例として使用します。
Return+Shift
押して新しいエントリを作成し、それに有用なキーシーケンスを与えます(\E[27;3
xevでいじっているときにXから送信されたキーシーケンスを選択しましたが、それは間違っている可能性があります-重要なことはmakeです。適切なエスケープがあり、他のものと競合しないことを確認してください)。起動しemacs -nw
、スクラッチバッファで次のことを評価します。
(read-key-sequence-vector "Type your new key:")
次に、新しいキーの組み合わせを入力します。
バインドできるキーシーケンスを吐き出すはずです。
([27 91 50 55 59 51]
私[13]
がコンソールのキーバインドをいじる前の退屈な古いものとは対照的に、それは私に戻ってきました。)
emacs構成に追加します。
(define-key function-key-map [27 91 50 55 59 51] [(shift return)])
私はそれをemacs -nw
使ってスクリーンセッションでそれをテストしました:
(define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
(define-key sh-mode-map [(shift return)] #'send-line-to-shell)
短い答えは、それはすべての端末の基本的な制限であるということです。
少し長い答えは、誰かがあなたが望むことをする端末を作成したとしても、Emacs自体がこの仮想端末で動作するように大きな変更が必要になるということです。
ロスレスキーボード入力を可能にする方法でVTプロトコルを拡張するいくつかの努力があります(グラフィックスなどの他の機能の中でも)。
一例はnottyです:https : //github.com/withoutboats/notty
infocmp $TERM
か?