例えば:
"\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
、TAB
or \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
(ここではncurses
infocmpを想定しています)。
$ 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
その後に-1
bashを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
です。