長い入力文字列のbash(ttyおよびX)でホームキーが正しく動作しない


11

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

私はそれがこれまでで最高の説明ではないことを知っていますが、要点はbashがそれを認識して正しいことを行おうとするが、しばしば失敗するということです。

Xセッションのttyと端末の両方でこれを再現します。私はヒットするとCtrl+ V、その後、Home私は(異なる配列を参照して^[OH、Xに^[[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 $TERMショーlinuxのttyでとxtermXセッションインチ

それは

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

誰にもこれについての手掛かりがありますか?


1
あなたのプロンプトはどのくらいですか?約36文字のコマンドラインを入力すると、端末の1行が埋められ、横スクロールが発生しますか?このプロンプトを使用しても引き続き発生しますか?PS1='$ '
ミケル

@Mikel私はあなたが何を考えているのかわかりませんが、おそらくあなたは正しい道の近くにいます。ミニマルプロンプトを使用しても、発生しないようです。私が使用したものはデフォルトのものと比較して少し変更されました:PS1="\e[0;36m[\u@\h \W]\$ \e[m"。何か問題はありますか?36文字を入力しても、1行に収まりません(断然)。また、ttyでの横スクロールはありません:)
Lev Levitsky

@Mikel私はjw013のアドバイスに従い、プロンプトを調整しました。多分あなたは問題が何であったかについて詳しく説明して、最初にそれを理解するための担当者としてあなたに報酬を与えることができるようにしたかもしれません:)
Lev Levitsky

回答:


13

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

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

言うすべてが間に実際に画面に印刷されないこと、すなわち、ゼロの長さを有しています。入力した文字をエコーする場所を知るには、計算されたプロンプトの長さが必要です。除外するとプロンプトの長さが正しく計算されず、カーソルが実際の位置と一致していないというの考えが原因で、端末のジオメトリに依存した奇妙な動作が発生することがよくあります。\[\]bash\[ \]bashbash


おかげで、これで問題が解決しました。しかし、いくつかの説明をいただければ幸いです。その動作の理由は何か、角かっこは何をするのかなどです。すべてを1つのページに配置して、将来他の人を助けることができるとよいでしょう。
Lev Levitsky

@LevLevitsky私は答えに短い説明を追加しました。
jw013 2012年

まことにありがとうございます!今ではそれがもっと理にかなっています。
Lev Levitsky
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.