シフトキーを含むキーの組み合わせに対してbashに異なるコードを送信させる方法があるかどうか疑問に思いましたか?たとえば、(Ctrl+は) +と+ +が同じように解釈されるVことを示しています(^ N)。それとも違いを生むことができる端末はありますか?またはそれがするように私を修正してバッシュすることができますか?CtrlNCtrlShiftN
3 に答える
端末はキーボードと直接対話しません。受信したバイトのストリームと相互作用します。これは通常(必ずしもそうとは限りませんが)キーボードによって生成されます。印刷可能なASCII値の場合、値とキーボードのキー(または組み合わせ)の間には明らかな対応関係があります。ASCII 97はa、ASCII 65はShifta、などです。
ただし、 ASCII0からASCII31までの32の非印刷制御文字があります。これは、端末を制御することを目的としていたためです。それらを入力するためにControl、他のキーと組み合わせてこれらのコードを生成できるようにするためにが追加されました。単純なスキームが使用されました。Control--xを押すと、 xから64を引くことに対応する制御コードが生成されます。@ASCII 64を生成するので、ASCII 0を生成します。同じマッピングがthroughControl@にも当てはまります(残りの対応については、お気に入りのASCII参照を参照してください)。A_
ただし、ASCII64からASCII95を生成するためにShiftキーが必要かどうかは、キーボードによって異なります。私の米国のキーボードレイアウトでは、Shiftキーなしでのみ[入力]できます。(ここで使用しているのは大文字のASCII範囲であり、小文字ではないことを覚えておいてください。)したがって、簡単にするために、どのキーコードが--xShiftで送信されるかを決定する際に無視されることが決定されたと思います。(何らかの理由で、キーボードにキー/ Shiftキーのペアによって生成された64〜95の文字が2つある場合、端末は関連する制御文字の代替マッピングを定義する必要があることに注意してください。)Control
ControlShiftこれはすべて、 -xと--xが通常同じであるControl理由を説明するために単純に(?)です。明らかに、最新のオペレーティングシステムでは、あらゆる種類のキーボードの組み合わせを区別できます。しかし、無数の可能性のうち、端末に一意の値を送信できるのは256個だけです。残りは必然的に他の1つ以上を複製する必要があります。有用であるためには、通常ASCII 27(ESC)で始まる複数バイトのシーケンスを端末に送信するように構成する必要があります。端末がそのバイトを受信すると、他のバイトが後に続くかどうかを確認するために一時停止します。ファンクションキーや矢印キーなどのキーには、かなり標準的なシーケンスがあり、端末はこれをさまざまな方法で解釈します。その他のキー(ControlShiftnあなたの例では)合意された意味がないので、ターミナルエミュレータはそれを割り当てる必要があります。ほとんどのエミュレーターではこれを実行できるはずですが、その方法は明らかにプログラム固有です。
ここで、bashのキーボードショートカットのカスタマイズに関する2つの優れた記事があります。
iTerm2を使用すると、Control+ Shift+ ,(を表す必要がありますC-<
)などのキーの組み合わせをエスケープシーケンスにマップできます。Emacsは、デフォルトで特定のエスケープシーケンスを期待されるキーシーケンスに変換します。したがって、iTermで目的のキーの組み合わせを適切なエスケープシーケンスに再マッピングすることで、目的の動作を得ることができます。詳細については、この応答を参照してください。