すべてのキーの組み合わせを処理できるLinux端末はありますか?


11

端末モード(-nw)でemacsを使用するのが好きですが、ほとんど(すべて?)の端末は一部のキーの組み合わせを処理できないようです(たとえば、C-<RET>または)C-M-%。これは、ほとんどの端末がVT-100をエミュレートしているため、これらの組み合わせがなかったためです。これらのキーの組み合わせを処理できるLinux端末(できればKDE)はありますか?これはすべての端末の基本的な制限ですか?

回答:


15

端末でキーまたはキーの組み合わせを押すと、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-qC-h c、Emacsのキーの組み合わせを押すことで、端末がキーの組み合わせに対して何を送信するかを確認できます。

一部の端末エミュレータでは、キーごとにエスケープシーケンスを構成できます。Xtermでは、これはXリソースを通じて行われます。ほとんどのセットアップは~/.XresourcesXの起動時にリソースを読み取り、を使用してファイルを手動でロードできます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はファンクションキーを示し(15to 24for F5to F12—歴史的な理由により、F1 F4は異なるエスケープシーケンスを持っています)number2、修飾子を示します(2for Shift5for Ctrl3for Meta8for Ctrl+ Meta、およびadd 1を+に追加しますShift—いいえ、あまり一貫性がありません)。

Emacsはを通じて内部キー表現にエスケープシーケンスを変換するinput-decode-mapか、local-function-key-map(またはfunction-key-mapemacsの23の前に)。

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

したがって、これを正しく理解している場合は、まず、キーの組み合わせに対応するエスケープシーケンスを端末で定義する必要があります。次に、emacsで、エスケープシーケンスをキーの組み合わせにマップする必要があります。エスケープシーケンスは、で定義されているものと競合しない限り、任意にできますinfocmp $TERMか?
Yossarian 2013年

2
@Yossarianはい。競合しないことに加えて、エスケープシーケンスは明確である必要があります。つまり、エスケープシーケンスは別のエスケープシーケンスのプレフィックスであってはなりません。これは実際には、最初の文字はESC(128以上の文字を試してみたいが、入力エンコーディングが制限される場合を除いて)でなければならず、2番目の文字はESC fooバインドしないものでなければならないことを意味します。
Gilles「SO-邪悪なことをやめなさい」

私はあなたが提案したことを試すことに丸くなっています。local-set-key実際にすべきdefine-keyですか?前者はエラー(引数の数が間違っています)を返しますが、後者は少なくとも<kbd> C-Enter </ kbd>で機能します。konsoleはまだ<kbd> CM-%</ kbd>の送信に問題があるようです。
Yossarian 2013年

@Yossarian確かに、それはである必要がありますdefine-key。Konsoleのエスケープキーを設定できるかどうかはわかりませんが、xtermはおそらく他の方法よりもカスタマイズ可能です。
Gilles「SO-邪悪なことをやめよ」

1
Thomas Dickeyのxtermは活発に開発されていることに注意してください。XTerm*modifyOtherKeys: 2リソースそれものために独特の配列が生成されますC-M-組み合わせを、しかし、その設定でカスタムマッピングの多くを提供する必要があります(XTerm*modifyOtherKeys: 1能力の低いが、ボックスのはるかに機能的アウトです)。例えば参照(私のために動作しませんでした1が)xterm-extras.elライブラリと関連する.Xresources.inputrcのファイルeasymacsのダウンロードを。
phils 2013年

1

限定的ではあるが重要なキーのセットの場合、KDEのコンソールを想定して、emacs -nwで機能する複雑なキーバインディングを行うには、次のようにします。

動作するようにするための実装をS-<RET>例として使用します。

  1. 新しいコンソールを開き、設定->現在のプロファイル->キーボード->編集と進みます。
  2. AddをReturn+Shift押して新しいエントリを作成し、それに有用なキーシーケンスを与えます(\E[27;3xevでいじっているときにXから送信されたキーシーケンスを選択しましたが、それは間違っている可能性があります-重要なことはmakeです。適切なエスケープがあり、他のものと競合しないことを確認してください)。
  3. 下部の小さなテスト領域で遊んで、機能していることを確認します。
  4. konsoleを再起動します。
  5. 起動しemacs -nw、スクラッチバッファで次のことを評価します。

    (read-key-sequence-vector "Type your new key:")

    次に、新しいキーの組み合わせを入力します。

    • これに慣れていない場合は、行を書き、カーソルを行の最後に置いて、Cx Ceを押してemacsにその行を実行させます。何かを入力。
  6. バインドできるキーシーケンスを吐き出すはずです。
    [27 91 50 55 59 51][13]がコンソールのキーバインドをいじる前の退屈な古いものとは対照的に、それは私に戻ってきました。)

  7. emacs構成に追加します。

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. 私はそれを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)
    

0

短い答えは、それはすべての端末の基本的な制限であるということです。

少し長い答えは、誰かがあなたが望むことをする端末を作成したとしても、Emacs自体がこの仮想端末で動作するように大きな変更が必要になるということです。


それは私には起こらなかったemacsの良い点です。代わりにGUIを使い始めると思います。
Yossarian 2013年

それが私がすることです。
hruvulum 2013年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.