Alt+矢印キーを押すと、どの文字が印刷されますか?

Alt+矢印キーを押すと、どの文字が印刷されますか?

AltUpを押すとA端末画面に印刷されます。押してAltDown印刷してもB同じことが起こります。

私が知っている他のキャラクター。

AltLeft=DAltRight=C

このコマンドの目的は何ですか?

答え1

端末の設定方法に応じて、入力はキーをAlt+Key順番に入力するのと同じであるため、ESC文字(またはまたは)の後にその文字または文字シーケンスが送信されます。EscKey\e^[\033Key

を押すと、Upほとんどの端末エミュレータはアプリケーションキーボードモードになっているかどうかに応じて3文字程度を\033[A送信します。\033OA

1つ目は、端末に出力するときにカーソルを上に移動するエスケープシーケンスに対応します。これにより:

printf '\nfoo\033[Abar\n\n'

前の行の後に書かれたものを見ることbarができます。fooこれにより:

stty -echoctl; tput rmkx; read foo

矢印キーを押すと、カーソルが動いていることがわかります。

アプリケーションが端末でその文字シーケンスを好むかzsh読み取ると、それはterminfoデータベース(関数)を介して時間内に送信されたエスケープシーケンスであることを知っているので、これを「up」操作として解釈します。vikcuu1Up

sendなどのAlt-Up一部の端末には(または)などのエスケープシーケンスがあり、他の端末では、などのキーの組み合わせで使用するときに、このタイプのキーに対して別々のエスケープシーケンスを提供または提供します。rxvteterm\033Up\033\033[A\033\033OAxtermgnome-terminalAltShiftCtrl

通常\033[1;3Aはに送信されますAlt-Up

端末に送信されると、このシーケンスもカーソルを上に移動します(2番目の引数(3)は無視されます)。該当事項はありません鍵盤Alt-Upキーなので、受信または発信時に送信されるのと同じシーケンスです。アプリケーションキーボードモード

今や\033\033[A\033[1;3A多くのアプリケーションはこれらのシーケンスの用途を知りません。これらのキーの組み合わせで送信される文字を定義する機能がないため、terminfoデータベースは役に立ちません。

彼らは順序を説明するために最善を尽くします。たとえば、エスケープシーケンスとしてbash解釈され、これについて何も知らないので、何もしません。これに続いて、既知の一致する文字シーケンスが見つからないとすぐに読み取りを停止します。エスケープシーケンスが何で始まるかわからないので、そのシーケンスをスキップして残りの部分を読み、行エディタに挿入します。\033[1;3Azsh\033[1;3A

多くのアプリケーション(たとえば、viベースのアプリケーション(使用されている修正バージョンに注意))を使用すると、任意の文字シーケンスのバインディングを追加できます。zshreadlinegdbbashbashreadline

たとえば、次のようにzshバインドできます。Alt-UpAlt-Down

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

これは、現在のコマンドラインから現在のカーソル位置までコマンドライン履歴を使用して前後に検索するため、前のコマンドを呼び出すのに非常に便利です。

答え2

Crtl+を使用してvキーボードの入力コードを返すことができます。矢印キーを使用してこれを実行すると、および[[D^[[C^が表示されます。 +矢印キーにはデフォルトのバインディングがないので、文字コードを個別に印刷するようです。ただし、readlineライブラリ構成ファイルのローカルバージョンを生成する場合:[[A^[[BAlt

$ cp /etc/inputrc ~/.inputrc

そして1行を追加してください:

"\e[1;3C": "sometexthere"

+の入力コードはどこにあり[1;3C(+ショートカットを使用する前と同じように取得できます)、端末を再起動すると+ショートカットは「sometexthere」テキストを返し、他の+矢印ショートカットは文字の返却を停止します。AltCrtlvCrtlAlt

代わりに、バインド可能なコマンドを渡すことができます。http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands良い

"\e[1;3C": unix-line-discard

Crtl+(行削除)とu同じ効果があります。

詳細については、ここをクリックしてください。http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

答え3

このAltキーは通常、次のように使用されます。修飾子カーソルキーとファンクションキーが呼び出されます。特殊キーこれは、複数の文字を送信でき、送信された文字が変更される可能性があるためです。

たとえば、一部のユーザーは、キーをbash押すとAltエスケープ文字が前に付いたキーが送信されると期待しています。レコードの「メタ」機能(参照terminfo(5))は8番目のビットを処理します。

端末に Shift キーとして機能する "metakey" があり、送信された文字のビット 8 を設定する場合、この事実は次のコマンドで表現できます。km。それ以外の場合、ソフトウェアはビット8がパリティビットであると仮定し、通常はクリアされます。文字列が存在する場合は、次のように変換できます。「メタパターン」 オープンとクローズは次のように表現できます。smmそしてrmm

bashこれも知られている(参照ncurses FAQ)、しかしこの機能に興味がある人はほとんどいません。それにもかかわらず、Altメタモードがオフになっても「メタ」と呼ばれることに慣れています。 rxvtとxtermは(少なくとも)1990年代初頭からこの機能を使用してきました。

他のユーザー(xterm機能が導入された後パッチ#94、1999)修飾子情報は、特殊キーが送信する文字シーケンスのパラメータとしてエンコードされると予想できます。 XTermのドキュメントでは、これらの変更されたキーを次のように指します。「PCスタイル」これを区別するファンクションキー「VT220スタイル」(修飾子なし)。変更されていないカーソルキーを送信できますがESC[A範囲、例えばESC[5Aしなければならない5回繰り返して理解してください。xterm最初のバージョンコンピュータスタイルキーは「5」を使用して表示されcontrol、これは反復計算との混同を避けるために将来のバージョンで変更されました。だから...

ESC[5A

アプリケーションの実行中にカーソルを5行上に移動することをお勧めします。

ESC[1;5A

control特定のキーが押されたことをアプリケーションに通知するために1行上に移動することをお勧めします。

有用な組み合わせはすでにncurses terminfoデータベースにあります。2004年:

# 2004-07-17
#       * add xterm-pc-fkeys -TD

terminfo データベースは現在のバージョンを表示します。xterm+pcfキー修飾子がエンコードされる方法を示すコメントは次のとおりです。

# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
#    Code     Modifiers
#  ---------------------------------
#     2       Shift
#     3       Alt
#     4       Shift + Alt
#     5       Control
#     6       Shift + Control
#     7       Alt + Control
#     8       Shift + Alt + Control
#  ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.

(AltとMetaは必ずしも同じキーではありません)。これはビルディングブロック(他のコンポーネントで構成)xterm端末記述が形成された。 ncurses で提供される拡張機能を使用します。1999年からユーザーは名前を定義できます。 termcapは2つの文字名と1023バイトの説明のみをサポートしているため、渡す理由はありません。用語キャップ相互作用。以下を使用するアプリケーションで簡単に使用できます。用語情報相互作用。

これで困難が発生します。アプリケーションがこれらのキーシーケンスが何を表すかを判断するには、いくつかの方法があります。

  1. 文字シーケンスの完全な分析
  2. control部分的に分析し、必要でない場合は修飾子を削除します。
  3. 文字の順序を辞書と比較し、そのように意味を決定するだけです。

最初のタスクを実行するプログラムはほとんどなく、一部のテキストエディタは2番目のタスクを実行します。これ~のためded内部に1980年代後半)。このようなアプリ開発者は、bashほとんどの情報が次のとおりであると仮定し、3番目のパスを選択します。用語キャップ。あるいは、termcap / terminfo情報を含むテーブルを作成し、最良の情報を提供するインターフェイスを使用することもできます。 xtermこれは以下のために行われます。tcap クエリfunction -vim実際のファンクションキー割り当てを提供します。

比較された文字列のうち、bash受信した文字列と一致する文字列がないため、混乱して部分的な一致(たとえば、エスケープされた文字自体)を解決できます。

追加資料:

関連情報