押すと AltUp、A
を端末画面に出力しました。私が押したときに同じことが起こりました AltDown ただし、代わりにB
が出力されます。
私が気付いた他のキャラクター。
AltLeft = D
および AltRight = C
これらのコマンドの目的は何ですか?
端末の構成方法に応じて、次のように入力します。 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
矢印キーでカーソルを移動できることがわかります。
zsh
やvi
のようなアプリケーションが端末からその文字シーケンスを読み取ると、terminfoデータベース(kcuu1
機能から知っているため、 "Up"アクションとして解釈されます)押したときに送信されるエスケープシーケンスであること Up。
今、 Alt-Up、rxvt
のような一部の端末と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
を読み取り、行エディターに挿入します。
vi
、zsh
、readline
などの多くのアプリケーションは、gdb
やbash
などのアプリケーションをベースにしています(ただし、bash
は変更されたバージョンのreadline
)を使用すると、任意の文字シーケンスのバインディングを追加できます。
たとえば、zsh
では、バインドすることができます Alt-Up、 Alt-Down お気に入り:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
それらは、履歴を後方および前方に検索して、現在の行のようにカーソルの現在の位置まで開始し、前のコマンドを呼び出すのに非常に便利です。
の 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回繰り返すと理解する必要があります。 xterm
のPCスタイルキーの最初のバージョンでは、 "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インターフェースを使用するアプリケーションですぐに利用できます。
ここで問題が発生します。そのようなキーシーケンスが何を表すかをアプリケーションが判断する方法はいくつかあります。
最初に行うプログラムはほとんどありません。一部のテキストエディターは2番目の(実際には、私はthisを ded
のために 後半に行いました1980年代 )。 bash
などのアプリケーションの開発者は、ほとんどの情報がtermcapにあると想定して、3番目のルートを選択しました。または、termcap/terminfo情報を含むテーブルを作成し、最良の情報を提供するインターフェースを使用することもできます。 xterm
は、 tcap-query 機能に対してこれを行い、vim
に実際のファンクションキーの割り当てを提供します。
bash
が比較する文字列はどれも、受け取った文字列と一致しないため、混乱して、部分的な一致(エスケープ文字など)を解決できます。
参考文献:
使用できます 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