私はターミナルモードでemacsを使うのが好きです(-nw
)、しかし、ほとんどの(すべて?)端末はいくつかのキーの組み合わせを処理できないようです-たとえば、C-<RET>
またはC-M-%
。これは、ほとんどの端末がこれらの組み合わせを持たないVT-100をエミュレートするためです。これらのキーの組み合わせを処理できるLinux端末(できればKDE)はありますか、それともこれはすべての端末の基本的な制限ですか?
端末でキーまたはキーの組み合わせを押すと、1つまたは複数の文字のシーケンスとして端末で実行されているアプリケーションに送信されます。たとえば、を押すと a、アプリケーションはa
を受け取ります。を押すと Enter、アプリケーションは文字CR
(別名^M
(「control-emm」と発音)、別名文字番号13、別名\r
または\015
)を受け取ります。を含むキーの組み合わせ Alt 通常、文字ESC
(別名^[
a.k.a. \e
または\033
)として送信され、その後にキーまたはキーの組み合わせのシーケンスが続きます。 Alt。ファンクションキーおよびその他のキーの組み合わせは、\e[
または\eO
で始まるエスケープシーケンスとして送信されます。
エスケープシーケンスは完全に標準化されておらず、端末は通常、特定のキーの特定の属性を無視します。例えば、 Ctrl+Shift+letter 多くの場合、まったく同じように送信されます Ctrl+letter デフォルトでは。
を押すと、端末がキーの組み合わせに対して何を送信するかを確認できます Ctrl+V その後にシェルプロンプトでそのキーの組み合わせが続くか、C-q
またはC-h c
の後にEmacsでキーの組み合わせが続きます。
一部のターミナルエミュレータでは、各キーのエスケープシーケンスを構成できます。 Xtermでは、これは Xリソース を介して行われます。ほとんどのセットアップは、Xの起動時に~/.Xresources
からリソースを読み取り、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
から24
の場合 F5 に F12 —歴史的な理由から、F1から F4 異なるエスケープシーケンスがあります)、number2
は修飾子を示します(2
for Shift、3
for Meta、5
for Ctrl、7
for Ctrl+Meta、およびに1を追加します Shift 少なくとも1つ Ctrl または Meta)。
Emacsはエスケープシーケンスを input-decode-map
またはlocal-function-key-map
(またはEmacs23の前のfunction-key-map
)を介して内部キー表現に変換します。
(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
限られているが重要なキーのセットについては、KDEのコンソールを想定して、emacs -nwで機能する複雑なキーバインディングを使用するには、次のようにします。
例として、S-<RET>
を取得する実装を使用します。
Return+Shift
の新しいエントリを作成し、それに役立つキーシーケンスを指定します(xevをいじっていたときにXから送信されたキーシーケンスである\E[27;3
を選択しましたが、それは間違っています-重要なことは、適切なエスケープがあり、他のものと競合しないことを確認することです)。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