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


42

例えば:

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

\eはエスケープとC-forの略のように、ほんの少ししか知りませんCtrlが、これらの数字(1)と文字(Z)は何ですか?;[および-サインとは何ですか?

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


2
シェルの実際のreadline バインディングをリストするための追加のヒントはbind -pです。

1
そのようなコードのほとんどは、端末によって解釈されます。大規模なリストについては、ウィキペディアでANSIエスケープコードについてお読みください。
-chepner

stty -aは端末の回線設定を表示します
バグ

回答:


52

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

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

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

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

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

2行目はによって出力されsedます。$それはラインの終わりがどこにあるかを示すためにのみだが、含まれるべきではありません。

その手段上記のことをCtrl-Up(私が押したもの)6つの文字を送信ESC[1;5およびA(として0x1B 0x5b 0x31 0x35の0x3b 0×41)

terminfoデータベースが(に基づいて端末数の共通鍵の数のための配列の数を記録し$TERMた値)。

例えば:

TERM=rxvt tput kdch1 | sed -n l

キーrxvtを押すと送信されるエスケープシーケンスを教えてくれますDelete

現在の端末で特定のシーケンスに対応するキーを検索できますinfocmp(ここではncursesinfocmpを想定しています)。

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

などのキーの組み合わせCtrl-Upにはterminfoデータベースに対応するエントリがないため、送信する内容を調べるには、対応する端末のソースまたはドキュメントを読むか、sed -n l上記の方法で試してください。


これは素晴らしい説明です、ありがとう!これですべてが所定の位置に収まり\e-1\C-i、逆方向タブにcontrolなります。これは、タブをi挿入し、escapeその後に-1bashを1回逆方向に実行するように指示しているためです(これをゴーグルで確認しましたdigit-arguments)。
バグ

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib。それは数字の1ではなく小文字のL
ステファンシャゼル

1
@ user367890、これはキーパッドモードです。おそらく、after tput smkx、端末は\e[ODkcub1)およびafter tput rmkx\e[Dcub1、カーソルを左に移動するシーケンスと同じコードを送信し、これらのキーのエコーがカーソルを移動するstty -echoctl; tput rmkx; sleep infことがわかります。試してみてくださいキーパッドモードではない場合、矢印キーはカーソルを移動します)。
ステファンシャゼル16

1
@ user367890、Thomas(ncursesとxtermのメンテナー)がリンクした答えで言ったことから、はい、それは動作するはずです。キーパッドモードまたはアプリケーションモードは同じものを参照するため、(再びThomasによると)terminfoデータベースのキー仕様はsmkxが有効な場合に使用されます。
ステファンシャゼラス

4

gnu readlineライブラリを介して提供されます。あなたは、になるはずの男3のreadlineその説明を見つけるために。

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


これは私の例を説明しません。
バグ

少し誤解されたようです。回答の更新をご覧ください。
ラッシュ

この記事には、私の特定の例に関する情報はありません。「[A」のページ検索でも何も返されませんでした。
バグ

1
@bugは記事を注意深く読んでください。\[A行「CSI n A」内の表「CSIコード」にあります
突入

おかげで急いで、しかしどこ私は上の説明を見つけるか[Z[1;5Cまたは-1
バグ

3

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


他のチュートリアルでは、Ctrlキーを押しながら矢印を前方に移動するために「\ e [1; 5C」が使用され、menu-complete-backwardsに「\ e [Z」および「\ e-1 \ Ci」が使用されることがわかりました。これらはすべて.inputrcファイル内で使用されています。
バグ

OK、readlineによって解釈される場合、これらの制御シーケンスがctrl、alt、またはファンクションキーまたは矢印キーでのシフトの組み合わせにバインドされているターミナルエミュレータが必要です。(私はどれを知らない。)
Uwe

0

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

あなたのようなシーケンスを得るでしょう^[Oa、あなたは変換する必要があります^[\eまたは\033または\x1bまたは他のどんな表現でエスケープ文字のためのあなたのキーバインドシステムを期待します。

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

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

ここからの説明だReadlineのマニュアルには

quoted-insertC-qまたはC-v

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

これはGNU Readlineに基づいたものであれば何でも動作するはずです。

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

ニーモニックのために、私はの思考助言Ctrl+をv、それを求めてV erbatim。

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