回答:
端末の設定方法に応じて、タイピングAlt+KeyはキーEscとKeyキーを順番に入力することに似ているため、ESC文字(別名\e
または^[
または\033
)を送信し、続いてそのを押すと送信される文字または文字シーケンスを送信しますKey。
押すとUp、ほとんどの端末エミュレータは、いずれかの3つの文字を送っ\033[A
たり\033OA
、彼らがアプリケーションキーパッドモードかにいるかどうかに応じて。
最初のものは、端末に出力するときにカーソルを上に移動するエスケープシーケンスに対応します。もしあなたがそうするなら:
printf '\nfoo\033[Abar\n\n'
1行上にbar
書かれていることがわかりますfoo
。もしあなたがそうするなら:
stty -echoctl; tput rmkx; read foo
矢印キーでカーソルが動き回ることがわかります。
アプリケーションは、端末からその文字シーケンスを好むzsh
かvi
読み取ると、「アップ」アクションとして解釈します。kcuu1
これは、terminfoデータベース(機能)から、を押すと送信されるエスケープシーケンスであることを知っているため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)は無視されます)。対応するキーパッドキーはないため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
これらは、前のコマンドを呼び出すのに非常に便利なカーソルの現在の位置まで現在のものと同じように開始するコマンドラインの履歴を前後に検索することです。
Crtl+ vを使用して、キーボードの入力コードを返すことができます。あなたは、矢印キーのためにそれを行う場合は、あなたが得るだろう[[D^
、[[C^
、[[A^
、および[[B
値を。Alt+矢印キーのデフォルトのバインディングはないため、実行されたアクションは文字コードのみを印刷しているようです。Hovewer、ローカルバージョンのreadlineライブラリ構成ファイルを作成する場合:
$ cp /etc/inputrc ~/.inputrc
そして行を追加します:
"\e[1;3C": "sometexthere"
+の[1;3C
入力コードがある場所(+ ショートカットを使用する前と同じ方法で取得できます)でターミナルを再起動すると、+ ショートカットは「sometexthere」というテキストを返し、その他の+ショートカットは文字の戻りを停止します。Alt→CrtlvCrtl→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
Altキーは、しばしば使用されているメタ修飾子。カーソルキーとファンクションキーは、複数の文字を送信する場合があるため、特殊キーと呼ばれます。送信される文字は変更できます。
一部のユーザーは、たとえば、bash
押すAltとエスケープ文字が前に付いたキーが送信されることを期待しています。文書化された「メタ」機能(を参照terminfo(5)
)は、8番目のビットを扱います。
端末にシフトキーとして機能する「メタキー」があり、送信される文字の8番目のビットを設定している場合、この事実はで示され
km
ます。それ以外の場合、ソフトウェアは8番目のビットがパリティであると想定し、通常はクリアされます。文字列は、この有効に存在する場合は、「メタモード」 のオンとオフを、彼らはとして与えることができsmm
、およびrmm
。
bash
それについても知っています(ncurses FAQを参照)が、その機能に興味があるユーザーはほとんどいません。それにAltもかかわらず、メタモードがオフになっていても、「メタ」と呼ばれることに慣れています。(少なくとも)1990年代初頭以来、rxvtとxtermの両方にこの機能がありました。
他のユーザー(パッチ#94、1999でxterm
機能を導入したため)は、特別なキーが送信する文字シーケンスのパラメーターとして修飾子情報がエンコードされることを期待する場合があります。XTermのドキュメントでは、これらの変更されたキーを「PCスタイル」のファンクションキーと呼び、「VT220スタイル」(修飾子のない)と区別しています。未修正のカーソルキーを送信することがありますが、持っていることも合法であるパラメータを、例えば、アプリケーションがどのなければならないことを5回繰り返すと理解しています。のPCスタイルキーの最初のバージョンでは、「5」を使用してESC[AESC[5Axterm
control、それ以降のバージョンでは、繰り返し回数との混乱を避けるために変更しました。そう...
ESC[5A
アプリケーションはカーソルを5行上に移動することを提案しますが、
ESC[1;5A
controlキーが押されたことをアプリケーションに伝えるために、1行上に移動することを提案します。
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
です。1999年以来 ncursesで提供されている拡張機能を使用して、ユーザー定義の名前を許可しています。termcapは2文字の名前と1023バイトの説明のみをサポートするため、これらの拡張名をtermcapインターフェースで利用可能にする理由はありませんでした。それらは、terminfoインターフェースを使用するアプリケーションですぐに使用できます。
ここで問題が発生します。アプリケーションがそのようなキーシーケンスが何を表すかを判断する方法はいくつかあります。
最初に行うプログラムはほとんどありません。一部のテキストエディターは2番目を行います(実際、1980年代後半にこれを行いded
ました)。などのアプリケーションの開発者は、ほとんどの情報がtermcapにあると想定して3番目のルートを選択しました。または、termcap / terminfo情報を含むテーブルを作成し、最適な情報を提供するインターフェイスを使用することもできます。 これを行いTCAPクエリー提供、機能、実際のファンクションキーの割り当てを。bash
xterm
vim
文字列のどれのでbash
マッチに対してそれが受け取る文字列を比較し、それは、(それ自体でエスケープ文字として)部分一致のためにセトリング、混乱することができます。
参考文献: