Alt + 矢印キーを押すと印刷される文字は何ですか?

Alt + 矢印キーを押すと印刷される文字は何ですか?

を押すとAltUpAターミナル画面に出力されます。 を押したときも同じことが起こりましたAltDownが、B代わりに が出力されます。

私が気づいた他のキャラクターは、

AltLeft=DおよびAltRight=C

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

答え1

端末の設定方法によっては、入力はとキーを順番にAlt+Key入力することと同じになり、ESC 文字 (またはまたはとも呼ばれます) に続いて、その を押したときに送信される文字または文字シーケンスが送信されます。EscKey\e^[\033Key

を押すと、ほとんどの端末エミュレーターは、アプリケーション キーパッド モードかどうかに応じて、Up3 文字\033[Aまたは のいずれかを送信します。\033OA

最初のものは、端末に出力するときにカーソルを上に移動するエスケープ シーケンスに対応します。次のようにすると、

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

bar1行上に書かれたものが表示されますfoo。その場合:

stty -echoctl; tput rmkx; read foo

矢印キーでカーソルが移動するのがわかります。

zshまたはのようなアプリケーションがvi端末からその文字列を読み取ると、アプリケーションはそれを「Up」アクションとして解釈します。これは、アプリケーションが terminfo データベース (kcuu1機能) から、それが を押したときに送信されるエスケープ シーケンスであることを認識しているためですUp

さて、 についてはAlt-Up、 のような一部の端末rxvtや、 のような派生のetermsend\033にエスケープ シーケンスUp(つまり\033\033[Aまたは\033\033OA)が続きますが、 や のような他の一部の端末では、xterm、、などの組み合わせキーと一緒に使用する場合、gnome-terminalそれらのタイプのキーに対して別のエスケープ シーケンスを持ちますAltShiftCtrl

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

端末に送信されると、そのシーケンスはカーソルを上に移動します(2番目のパラメータ(3)は無視されます)。対応するものはありません。キーパッドAlt-Upキーなので、送信時と受信時に同じシーケンスが送信されますアプリケーションキーパッドモード

または のいずれの場合も\033\033[A\033[1;3A多くのアプリケーションはそれらのシーケンスが何のためにあるのかを認識しません。terminfo データベースは、それらのキーの組み合わせが送信する文字を定義する機能がないため、それらのアプリケーションには役立ちません。

彼らはそのシーケンスを解釈するために最善を尽くします。bashたとえば、は\033[1;3エスケープ シーケンスとして解釈しますが、それについては何も知らないので何もしませんA。その後に . が続きzsh、一致する既知の文字シーケンスがないことがわかるとすぐに読み取りを停止します。 で始まるエスケープ シーケンスはないので、\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^、、、、およびの値が得られます。+矢印キーにはデフォルトのバインディングがないため、実行されるアクションは文字コードのみを印刷するようです。ただし、readline ライブラリ構成ファイルのローカル バージョンを作成する場合は、次[[C^のようになります。[[A^[[BAlt

$ cp /etc/inputrc ~/.inputrc

次の行を追加します:

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

+[1;3Cの入力コードはどこにありますか ( +ショートカットを使用して以前と同じ方法で取得できます)。ターミナルを再起動すると、+ショートカットはテキスト「sometextthere」を返し、他の+ 矢印ショートカットは文字を返さなくなります。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 番目のビットを扱います。

端末にシフトキーとして機能し、送信された文字の8番目のビットを設定する「メタキー」がある場合、この事実は次のように示されます。kmそれ以外の場合、ソフトウェアは8番目のビットがパリティであると想定し、通常はクリアされます。これを無効にする文字列が存在する場合、「メタモード」 オンとオフの場合、次のように与えられますsmmそしてrmm

bashそれについても知っている(ncurses に関するよくある質問) がありますが、この機能に興味を持つユーザーはほとんどいません。それでも、メタ モードがオフになっているにもかかわらず、ユーザーは を「メタ」と呼ぶことに慣れていますAlt。rxvt と xterm はどちらも、(少なくとも) 1990 年代初頭からこの機能を備えています。

他のユーザー(xtermこの機能を導入して以来パッチ #94、1999)は、特殊キーが送信する文字列のパラメータとして修飾子情報がエンコードされることを想定する。XTermのドキュメントでは、これらの修飾キーを次のように呼んでいる。「PCスタイル」ファンクションキーを区別するために「VT220スタイル」(修飾子はなかった)。修飾されていないカーソルキーは を送信する可能性があるESC[Aが、パラメータ例えば、ESC[5Aアプリケーションすべきxtermそれを5回繰り返すと理解できます。PCスタイルキーは「5」を使用して を示していましたcontrolが、後のバージョンでは繰り返し回数との混同を避けるために変更されました。つまり...

ESC[5A

アプリケーションはカーソルを5行上に移動することを提案し、

ESC[1;5A

キーが押されたことをアプリケーションに伝え、1 行上に移動することを提案しますcontrol

有用な組み合わせは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、ほとんどの情報がタームキャップあるいは、termcap/terminfo情報を含むテーブルを作成し、最適な情報を提供するインターフェースを使用することもできたでしょう xtermtcap クエリvim実際のファンクションキーの割り当てを提供する機能です。

比較する文字列のいずれも受信した文字列と一致しないためbash、混乱が生じ、部分的な一致 (エスケープ文字のみなど) に落ち着く可能性があります。

参考文献:

関連情報