web-dev-qa-db-ja.com

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

押すと AltUpAを端末画面に出力しました。私が押したときに同じことが起こりました AltDown ただし、代わりにBが出力されます。

私が気付いた他のキャラクター。

AltLeft = Dおよび AltRight = C

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

14
yfklon

端末の構成方法に応じて、次のように入力します。 Alt+Key 入力のようなものです Esc そして Key キーを順番に入力するため、ESC文字(別名\eまたは^[または\033)を送信し、その後にその文字を押すと送信された文字または文字のシーケンスが送信されます。 Key

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

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

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

barが1行上にfooの後に書き込まれます。もし、するなら:

stty -echoctl; tput rmkx; read foo

矢印キーでカーソルを移動できることがわかります。

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

今、 Alt-Uprxvtのような一部の端末とetermのような派生物は\033を送信し、その後にエスケープシーケンスを続けます。 Up (つまり、\033\033[Aまたは\033\033OA)ですが、xtermまたはgnome-terminalのような他のいくつかは、次のような組み合わせキーと一緒に使用すると、これらのタイプのキーに対して個別のエスケープシーケンスを持ちます。 Alt、 Shift、 Ctrl

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

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

これが\033\033[Aであろうと\033[1;3Aであろうと、多くのアプリケーションはそれらのシーケンスが何のためにあるのかを知りません。それらのキーの組み合わせが送信する文字を定義するような機能がないため、terminfoデータベースはそれらを助けません。

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

vizshreadlineなどの多くのアプリケーションは、gdbbashなどのアプリケーションをベースにしています(ただし、bashは変更されたバージョンのreadline)を使用すると、任意の文字シーケンスのバインディングを追加できます。

たとえば、zshでは、バインドすることができます Alt-Up、 Alt-Down お気に入り:

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

それらは、履歴を後方および前方に検索して、現在の行のようにカーソルの現在の位置まで開始し、前のコマンドを呼び出すのに非常に便利です。

14

の Alt キーはしばしばmeta修飾子として使用されます。カーソルキーとファンクションキーは、複数の文字を送信する可能性があるため特殊キーと呼ばれ、送信される文字は変更できます。

一部のユーザー、たとえばbashは、 Alt エスケープ文字が前に付いたキーを送信します。文書化された「メタ」機能( terminfo(5) を参照)は8番目のビットを扱います:

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

bashもそれを知っています( ncurses FAQ を参照))が、その機能に興味を持っているユーザーはほとんどいません。それでも、彼らは慣れていますを参照 Alt メタモードがオフになっていても、「メタ」として。 rxvtとxtermの両方が(少なくとも)1990年代初頭からこの機能を備えています。

他のユーザー(xtermパッチ#94、1999 で機能を導入したため)は、特別なキーが送信する文字のシーケンスのパラメーターとして修飾子情報がエンコードされることを期待する場合があります。 XTermのドキュメントでは、これらの変更されたキーを "PCスタイル" ファンクションキーと呼び、 "VT220スタイル" (修飾子はありません)と区別しました。変更されていないカーソルキーが送信される ESC[A、しかしparameterを持つことも合法です、例えば、 ESC[5A、アプリケーションがそれを5回繰り返すと理解する必要があります。 xtermPCスタイルキーの最初のバージョンでは、 "5"を使用して control、およびそれ以降のバージョンでは、繰り返し回数との混乱を避けるために変更されました。そう...

ESC[5A

アプリケーションがカーソルを5行上に移動する一方で、

ESC[1;5A

1行上に移動して、アプリケーションに control キーが押されました。

有用な組み合わせは、 2004 以降、ncurses terminfoデータベースにあります。

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

Terminfoデータベースは、 xterm + pcfkeys の現在のバージョンを、修飾子がどのようにエンコードされているかを示すコメントとともに表示します。

# 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バイトの説明しかサポートしていないため、これらの拡張名をtermcapインターフェースで使用できるようにする理由はありませんでした。 terminfoインターフェースを使用するアプリケーションですぐに利用できます。

ここで問題が発生します。そのようなキーシーケンスが何を表すかをアプリケーションが判断する方法はいくつかあります。

  1. 文字のシーケンスを完全に分析する
  2. それを部分的に分析して捨てる control 不要な場合は修飾子
  3. 文字のシーケンスを辞書と比較し、その意味を判断したいと考えています。

最初に行うプログラムはほとんどありません。一部のテキストエディターは2番目の(実際には、私はthisded のために 後半に行いました1980年代 )。 bashなどのアプリケーションの開発者は、ほとんどの情報がtermcapにあると想定して、3番目のルートを選択しました。または、termcap/terminfo情報を含むテーブルを作成し、最良の情報を提供するインターフェースを使用することもできます。 xtermは、 tcap-query 機能に対してこれを行い、vimに実際のファンクションキーの割り当てを提供します。

bashが比較する文字列はどれも、受け取った文字列と一致しないため、混乱して、部分的な一致(エスケープ文字など)を解決できます。

参考文献:

3
Thomas Dickey

使用できます Crtl+v キーボードの入力コードを返します。矢印キーに対してこれを行うと、[[D^[[C^[[A^[[B値。デフォルトのバインディングはありません Alt+矢印キーなので、実行されたアクションは文字コードだけを印刷しているようです。 Hovewer、readlineライブラリ構成ファイルのローカルバージョンを作成する場合:

$ cp /etc/inputrc ~/.inputrc

そして、行を追加します:

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

どこ [1;3Cは、 Alt+ (使用前と同じ方法で入手できます Crtl+v ショートカット)そしてあなたの端末を再起動します Crtl+ ショートカットは「sometexthere」などのテキストを返します Alt+矢印のショートカットは文字を返すのを停止します。

代わりにテキスト 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
Nykakin