web-dev-qa-db-ja.com

bashでショートカットを再マップするためのターミナルキーコードのリストはどこにありますか?

例えば:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

\eはエスケープを表し、C-は Ctrl、しかしこれらの数字(1)と文字(Z)は何ですか? ;[-の標識は何のためにありますか?

試行錯誤のみですか、それともbashキーコードの完全なリストとその構文の説明がありますか?

45
bug

これらは、特定のキーを押したときに端末から送信される文字のシーケンスです。それ自体はbashやreadlineとは関係ありませんが、特定のキーを押したときに何かを実行するようにreadlineを構成する場合は、特定のキーまたはキーの組み合わせが送信する文字のシーケンスを知りたいでしょう。

を押すと A キー、一般的に端末はa(0x61)文字を送信します。 <Ctrl-I>または<Tab>を押すと、通常はTABまたは^Iとも呼ばれる\t文字(0x9)を送信します。ほとんどのファンクションキーとナビゲーションキーは、^[(control- [)で始まる一連の文字を送信します。これは、ESCまたは\e(0x1b、033 8進数)とも呼ばれます。ただし、正確なシーケンスは端末ごとに異なります。

キーまたはキーの組み合わせが端末に送信するものを見つける最良の方法は、sed -n lを実行し、それを入力してから、 Enter キーボード。次に、次のようなものが表示されます。

$ sed -n l
^[[1;5A
\033[1;5A$

最初の行は、端末デバイスによって行われたローカル端末echoが原因です(端末デバイスの設定が影響を与えるため、信頼できない場合があります)。

2行目はsedによって出力されます。 $は含まれません。行の終わりがどこにあるかを示すだけです。

上記はそれを意味します Ctrl-Up (私が押した)6文字ESC[1;5およびA(0x1b 0x5b 0x31 0x3b 0x35 0x41)

terminfoデータベースは、($TERM値に基づいて)複数の端末のいくつかの共通キーのいくつかのシーケンスを記録します。

例えば:

TERM=rxvt tput kdch1 | sed -n l

を押すと、rxvtによってどのエスケープシーケンスが送信されるかがわかります。 Delete キー。

infocmp(ここではncurses infocmpと仮定)を使用して、現在の端末で特定のシーケンスに対応するキーを検索できます。

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

のようなキーの組み合わせ Ctrl-Upterminfoデータベースに対応するエントリがないので、それらが送信するものを見つけるには、対応する端末のソースまたはドキュメントを読むか、上記のsed -n lメソッドで試してください。

57

これは、GNU readlineライブラリを介して提供されます。 man 3 readline を調べて、その説明を確認する必要があります。

Escspeコードのような\[Aの意味に関する情報も必要なようです。この情報はウィキペディア ANSI esacape code の記事にあります。

4
rush

これらのコードは同じソースからのものですか?最後のものはGNU readline bindingのように見えます。これはユーザーがbashに送信するものです(Rushの回答を参照してください)。しかし、最初の2つは 端末制御シーケンス)のように見えます (最初のものが不正な形式であっても)カーソルの動きやテキストの色などを制御するために、bashまたは別のプログラムがターミナルエミュレータに送り返します。

3
Uwe

キーまたはキーのコンボによって生成されたエスケープシーケンスを確認する最も簡単な方法は、 Ctrl+v ターミナルで、知りたいキー/コンボを押します。

^[Oaのようなシーケンスを取得し、^[\eまたは\033または\x1bまたはキーバインディングシステムの他の表現に変換する必要がありますエスケープ文字が必要です。

これはquoted-insertという名前のEmacs関数として始まり、BashおよびZshのデフォルトのキーバインドはEmacsを模倣しているため、それらもコピーしました。

Bashは、GNU Readline入力ライブラリを介してそれを取得します。これは、Pythonのimport rlcompleter拡張機能などの他のものも使用します。

Readlineマニュアル の説明は次のとおりです。

quoted-insertC-qまたはC-v

入力した次の文字をそのまま行に追加します。これは、たとえばC-qなどのキーシーケンスを挿入する方法です。

GNU Readlineに基づいてanythingで動作するはずです。

ZLEはZLEという独自の代替を使用しますが、皮肉なことに、Viモードでは元のEmacs C-qバインディングのみを尊重しますが、C-vはデフォルトのEmacsのような入力モードでも機能します。 (zshzleまたはzshall`のマンページでquoted-insertを検索すると、結果の2番目のペアにデフォルトのキーバインドがリストされます。)

ニーモニックについては、 Ctrl+v それを求めてverbatim。

0
ssokolow