上キーを押したときに時々「[A」の表示を止めるにはどうすればよいですか?

上キーを押したときに時々「[A」の表示を止めるにはどうすればよいですか?

私は時々以前に使用したコマンドにすばやくアクセスするためにbashと上矢印キーを使用します。迷惑時々これにより、[A前のコマンドの代わりにコマンドが表示されます。オンラインで調査した結果、これはコンピュータに送信される上矢印キーを表すキーコードであるようです。

オンラインで答えが見つからないようです。このようなことが再発しないようにするにはどうすればよいですか?

答え1

背景

シーケンスは実際にありEscape[A、インポートされたセットの一部です。Xma1976年基準ECMA-48、ANSIは別々ですが、長年にわたってほぼ同じ標準でサポートされ(後で撤回)、ANSIによって承認されました。ISO/IEC 6429途中で。これらの多重標準化の結果として、ANSIエスケープコードとして頻繁に引用されますが、正しくECMA-48制御関数*で呼び出す必要があります。

説明する

画面には表示されますがタスクには表示されない一般的な理由[Aは、初期エスケープコードが誤って吸収されたためです。Ctrl Vターミナルラインドライバが次の文字を単語として扱うように指示する最初のキーを押さないと、キーボードはこれを再現できません。

したがって、このシーケンスを取得してCtrl VEscape[A可視出力を生成できます[A

一連の文字をすばやく連続して押すと、Escape[Aカーソルが上に移動することがわかります。ただし、最初の文字の後に一時停止すると、カーソルは移動しません。これは、エスケープ文字に関連するタイムアウトがあるためです。これは、UNIXシステムに接続されている遅いシリアル回線の実際の問題であり、最も近い問題は、このシーケンスの送信中にしばらく遅延する遅いまたは断続的なネットワーク接続です。

防止

今、あなたの質問に答えて、このようなことが起こらないようにする方法を教えてください。断続的なネットワーク接続を使用している場合は、Escapekviモード()でコマンドの編集中に使用できる次の代替シーケンスの1つを使用する以外は何もできません。kkset -o vi


*私の考えでは、JavaScriptのようにECMAScriptと呼ばれる必要があるようです。

答え2

@roaimaが述べたように、これはネットワークまたはシリアル回線を介して実行されるプログラムで頻繁に発生するよく知られた問題であり、送信遅延によってプレーンテキスト(viなど)を区別しようとするプログラムが妨げられました。脱出するの文字エスケープシーケンス。ほとんどのユーザーは時間共有サーバーでプログラムを実行しなくなったため、これに気付くことはありません。

問題は、プログラムがエラーがないかどうかを確認するために「短い」時間遅延する必要があることです。脱出する文字の後に他の文字が続きます。できるの一つの一部になるエスケープシーケンス待っています。伝統的に、特殊キー(カーソルキー、ファンクションキーなど)はエスケープシーケンスに送信されます。

キーリピート機能が有効になるようにキーを押し続けると、これらのエスケープシーケンスは(一部の)プログラムが読み取ることができるものよりも速く送信できます。これが発生すると、個々の文字間の時間が長くなる傾向があり、最終的に文字を区別するために割り当てられた「短い」時間を超えます。脱出する文字エスケープシーケンス

readline(/バンドルに含まれる一部)bashは、(viのように)同じ方法で開始できるさまざまな文字シーケンスを区別しようとします。この「短い」時間を変更する機能があります。

8.3.1Readline 初期化ファイルの構文
keyseq-timeout
あいまいなキーシーケンスを読み取るときにReadlineが文字を待つ期間を指定します(これまで読み取った入力を使用して完全なキーシーケンスを形成するか、追加の入力を使用してより長いキーシーケンスを完了できます)。制限時間内に入力が受信されない場合、Readline は短いが完全なキーシーケンスを使用します。 Readlineはこの値を使用して、現在の入力ソースから入力が可能かどうかを決定します(デフォルトはrl_instream)。値はミリ秒単位で指定されるため、値1000はReadlineが追加の入力を1秒間待つことを意味します。この変数がゼロ以下の値、または数値以外の値に設定されている場合、Readlineは完了するキーシーケンスを決定するために別のキーが押されるのを待ちます。デフォルトは 500 です。

つまり、以下を~/.inputrcファイルに入れることができます。

set keyseq-timeout 0

readline はこのカーソルキーを無限に待ちます。欠点は、ライブラリ内の一部の文字と一致する一部の文字を入力すると、予期しない結果が生じる可能性があることです。

答え3

私のターミナルシェル(bashを使用するKonsole)で許可されている回答の説明^[[Aに従って再現できます。Ctrl+Vしかし、私が受け入れた答えとは異なりできる[A具体的に尋ねる質問をタップして直接コピーするようにEscArrowUp

誤って押したときに矢印キーが外れるのをEsc防ぐために、矢印キーの最初の部分をもう一度押すと抜け出すのを防ぐことができます[A

答え4

すべての答えはとても良いです。迅速で汚い方法は、h、j、k、lを矢印キーとして使用することです。または、vimパッケージ全体をインストールしてください。私が正確に覚えているなら、Ubuntuディストリビューションのデフォルトはvim??-runtimeであり、vim??をインストールすると問題が自然に「解決」されます??は最新の完全なパッケージバージョンです。 Ubuntuについてapt-cache search vimお知らせします。

h=左、j=下、k=上、l=右

関連情報