例えば:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
\e
はエスケープを表し、C-
は Ctrl、しかしこれらの数字(1
)と文字(Z
)は何ですか? ;
、[
、-
の標識は何のためにありますか?
試行錯誤のみですか、それともbashキーコードの完全なリストとその構文の説明がありますか?
これらは、特定のキーを押したときに端末から送信される文字のシーケンスです。それ自体は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
メソッドで試してください。
これは、GNU readlineライブラリを介して提供されます。 man 3 readline を調べて、その説明を確認する必要があります。
Escspeコードのような\[A
の意味に関する情報も必要なようです。この情報はウィキペディア ANSI esacape code の記事にあります。
これらのコードは同じソースからのものですか?最後のものはGNU readline bindingのように見えます。これはユーザーがbashに送信するものです(Rushの回答を参照してください)。しかし、最初の2つは 端末制御シーケンス)のように見えます (最初のものが不正な形式であっても)カーソルの動きやテキストの色などを制御するために、bashまたは別のプログラムがターミナルエミュレータに送り返します。
キーまたはキーのコンボによって生成されたエスケープシーケンスを確認する最も簡単な方法は、 Ctrl+v ターミナルで、知りたいキー/コンボを押します。
^[Oa
のようなシーケンスを取得し、^[
を\e
または\033
または\x1b
またはキーバインディングシステムの他の表現に変換する必要がありますエスケープ文字が必要です。
これはquoted-insert
という名前のEmacs関数として始まり、BashおよびZshのデフォルトのキーバインドはEmacsを模倣しているため、それらもコピーしました。
Bashは、GNU Readline入力ライブラリを介してそれを取得します。これは、Pythonのimport rlcompleter
拡張機能などの他のものも使用します。
Readlineマニュアル の説明は次のとおりです。
quoted-insert
(C-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。