長い入力文字列に対して bash (tty および X) で Home キーが異常に動作する

長い入力文字列に対して bash (tty および X) で Home キーが異常に動作する

現在の入力が十分に短い場合Home(たとえば、36文字未満)は、正常に動作します。ただし、長いコマンドを入力して最初に戻りたい場合、その機能は機能しているように見えますが、コマンドは機能しません。表示されたもう右にはなりません。先頭ではなく、約 10 文字ずれているように見えます。「盲目的に」入力するとうまく機能しますが、入力全体が右にシフトされているが再描画されていないかのように、完全に混乱しているように見えます。そのため、その上に入力しますが、「実際には」そうではありません。なぜなら、「消去」している場所は「実際には」10 文字右にあるからです。したがって、コマンドを消去しようとすると、最初の 10 文字はまだ表示されますが、Enterそれを押すと、前の入力が空だったかのように別のプロンプトが表示されます。

これが最良の説明ではないことは承知していますが、要点は、bash がそれを認識して正しいことを実行しようとするものの、失敗することが多いということです。

私はこれを tty と X セッションのターミナルの両方で再現します。Ctrl+を押すVと、Home異なるシーケンス ( ^[OHX では、^[[1~tty では) が表示されますが、私の場合は両方とも次のようです/etc/inputrc

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif

echo $TERMlinuxtty とxtermX セッションに表示されます。

その

GNU bash、バージョン 4.2.24(2) リリース (i686-pc-linux-gnu)

これについて手がかりを持っている人はいますか?

答え1

プロンプトの印刷されない部分 (色を変更するためのエスケープ シーケンスを含むがこれに限定されない) を と で囲む必要があり\[ます\]

元のプロンプト:\e[0;36m[\u@\h \W]\$ \e[m
修正されたプロンプト:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

\[は、その間にあるものはすべて実際には画面に印刷されない、つまり長さがゼロであることを示します。 計算されたプロンプトの長さは、入力した文字をどこに表示するかを知るために必要です。 を省略すると、 は誤っ\]たプロンプトの長さを計算し、カーソルの位置に関する の考えが現実と一致しないため、端末のジオメトリに依存する奇妙な動作につながることがよくあります。bash\[ \]bashbash

関連情報