例えば:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
私\eはエスケープとC-forの略のように、ほんの少ししか知りませんCtrlが、これらの数字(1)と文字(Z)は何ですか?;、[および-サインとは何ですか?
試行錯誤だけですか、それともbashキーコードの完全なリストとその構文の説明がありますか?
例えば:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
私\eはエスケープとC-forの略のように、ほんの少ししか知りませんCtrlが、これらの数字(1)と文字(Z)は何ですか?;、[および-サインとは何ですか?
試行錯誤だけですか、それともbashキーコードの完全なリストとその構文の説明がありますか?
回答:
これらは、特定のキーを押したときに端末から送信される一連の文字です。bashやreadline自体readlineとは何の関係もありませんが、特定のキーを押したときに何かを実行するように構成する場合は、特定のキーまたはキーの組み合わせが送信する文字のシーケンスを知りたいでしょう。
押すとA、キーを、一般に、端末は、送信a(の0x61)文字を。<Ctrl-I>またはを押す<Tab>と、通常^I、TABor \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 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
tput smkx、端末は\e[OD(kcub1)およびafter tput rmkx、\e[D(cub1、カーソルを左に移動するシーケンスと同じコードを送信し、これらのキーのエコーがカーソルを移動するstty -echoctl; tput rmkx; sleep infことがわかります。試してみてくださいキーパッドモードではない場合、矢印キーはカーソルを移動します)。
gnu readlineライブラリを介して提供されます。あなたは、になるはずの男3のreadlineその説明を見つけるために。
escspeコードの\[A意味についての情報も必要なようです。この情報は、ウィキペディアのANSI esacapeコードの記事にあります。
\[A行「CSI n A」内の表「CSIコード」にあります
[Z、[1;5Cまたは-1?
これらのコードは同じソースからのものですか?最後のものはGNU readlineバインディングのように見えます。これは、ユーザーがbashに送信するものです(ラッシュの回答を参照)。ただし、最初の2つは端末制御シーケンスのように見えます(最初の2つは不正な形式であっても)。それは、カーソルの移動、テキストの色などを制御するために、bashまたは別のプログラムがターミナルエミュレータに送り返すものです。
キーまたはキーコンボによって生成されるエスケープシーケンスを確認する最も簡単な方法は、ターミナルでCtrl+ vを押してから、知りたいキー/コンボを押すことです。
あなたのようなシーケンスを得るでしょう^[Oa、あなたは変換する必要があります^[に\eまたは\033または\x1bまたは他のどんな表現でエスケープ文字のためのあなたのキーバインドシステムを期待します。
これは、Emacs関数という名前quoted-insertで始まり、BashとZshのデフォルトのキーバインドはEmacsを模倣しているため、それらもコピーしました。
Bashは、GNU Readline入力ライブラリを介して取得し、Pythonのimport rlcompleter拡張機能などの他の機能も使用します。
ここからの説明だReadlineのマニュアルには:
quoted-insert(C-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。
bind -pです。