web-dev-qa-db-ja.com

端末プロンプトが正しく折り返されない

Bashで非常に長いコマンドを入力すると、ターミナルが正しく入力した内容を表示しないという問題があります。私は次のようなコマンドがあると思います:

username@someserver ~/somepath $ ssh -i /path/to/private/key
[email protected]

コマンドは2行でレンダリングする必要があります。代わりに、それはしばしばラップアラウンドして、次のように私のプロンプトの上に書き始めます:

[email protected] -i /path/to/private/key

戻って引数を変更することにした場合、カーソルが表示される場所がわかりません。プロンプトの中央に表示されることもありますが、通常はaboveと入力します。

私がいつ Up 前のコマンドに。私はこれをgnome-terminalとterminatorの両方で、そしてi3とCinnamonで試しました。誰かがそれが私のプロンプトであると提案したので、ここにそれがあります:

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]

Ctrllreset、およびclearはすべて彼らが言うことを実行しますが、コマンドを再度入力するか、 Up 同じことが起こります。

私がチェックしたところ、bashでcheckwinsizeが有効になっています。これは、80x24およびその他のウィンドウサイズで発生します。

これは私が一緒に暮らすことを学ぶだけのものですか?知っておくべき魔法がありますか?私は本当に短いプロンプトを使用することで解決しましたが、それでも問題は解決しません。

185
Muricula

印刷不可能なシーケンスは \[および\]で囲まれている である必要があります。あなたのPS1を見ると、\Wの後に囲まれていないシーケンスがあります。ただし、2番目のエントリは冗長であり、前のステートメント "1; 34"を繰り返します。

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.

そのため、これは意図した色付けである必要があります。

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.

"original"を保持することもこれでうまくいくはずです:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]

編集:

この動作の理由は、bashはプロンプトが実際よりも長いと信じているためです。簡単な例として、もし使用するなら:

PS1="\033[0;34m$"
       1 2345678

プロンプトは1ではなく8文字であると考えられています。そのため、ターミナルウィンドウが20カラムの場合、12文字を入力すると、20文字で折り返されます。これは、バックスペースを実行しようとした場合や、 Ctrl+u。 9桁目で停止します。

ただし、最後の列にない限り、新しい行は開始されません。その結果、最初の行が上書きされます。

入力を続ける場合、32文字の後、行は次の行に折り返されます。

206
Runium

ほとんどの場合、端末が想定するウィンドウのサイズが実際のウィンドウサイズと同じではありません。 bashを使用している場合は、これを試すことができます。

$ shopt checkwinsize

あなたが得ないなら

checkwinsize    on

次に、それをアクティブにします

$ shopt -s checkwinsize

次に、別のコマンド(lsなど)を実行するか、ウィンドウのサイズを1回変更するだけで、上記はいつでもうまくいきます。

特にRedhatシステムの場合、この問題は~/.bashrcを呼び出さないように/etc/bashrcを誤って設定したことが原因であることがよくあります。通常、bashは~/.bashrcをロードします。これは、デフォルトで/etc/bashrcを含むshopt -s checkwinsizeを呼び出すことが想定されています。

89
saketrp

私はかつてどこかを読んだことがある(もうどこか分からない)\001および\002 の代わりに \[および\]はこの問題を解決できます。それは私のためにした。

ちなみに、PS1の定義は見苦しくなくてもかまいません。

green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@Host
PS1+="$blue\w\$$reset " # workingdir$

export PS1
unset green blue dim reset
10
phil294

他の回答で述べたように、\e[0;30mなどの印刷不可能なシーケンスは\[...\]でラップする必要があります。

さらに(そして私がまだ言及していないこと)、複数行のプロンプトがある場合、\r\n\[...\]の-​​outsideである必要があるようです。最終的にそれを理解するには、試行錯誤が必要でした。

10
Geraden

これは、COLUMNSLINES環境変数の設定に問題があるようです。ウィンドウのサイズを変更すると、通常はgnome-terminalによって自動的に設定されます(私はそう思います)、コマンドresizeを発行して強制的に手動で設定することができます。

Gnome-terminalのサイズを79x17に変更すると、変数は次のように表示されます。

$ echo $COLUMNS; echo $LINES
79
17

私はそれを次のように強制できます:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;
7
slm

折り返しを防ぐために、たとえば、使用して列の数を増やすこともできます。

stty columns 120
6
ishmael

また、幅広いユニコードシンボルを使用することで同じ問題が発生する可能性があります( https://stackoverflow.com/a/34812608/1657819 など)。これは問題を引き起こしているスニペットです($Greenおよび$Redは適切にエスケープされた色の文字列です):

FancyX='\342\234\227'
Checkmark='\342\234\223'


# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
    PS1+="$Green$Checkmark "
else
    PS1+="$Red$FancyX "
fi

Bashは長さを正しく計算できないため、これらのワイドシンボルの3つの部分のうち2つをエスケープするのが最も簡単な方法です。

FancyX='\[\342\234\]\227'
Checkmark='\[\342\234\]\223'
3
The Godfather

tput smam

Ubuntu 19.10のTERM=xterm-256colorを含むGnomeターミナルでは、ターミナルが行を折り返す正確なエスケープシーケンスを発行します。

tput smam

あなたはそのエスケープが何であるかを見ることができます:

tput smam | hd

次のコマンドを使用して端末状態をリセットします。

reset

tput smamを設定する効果もあるようです。

Manページ:

man terminfo

ドキュメントsmamおよびその反対のrmam

       enter_am_mode   smam   SA   turn on automatic margins
       exit_am_mode    rmam   RA   turn off automatic margins

ただし、特定の端末にはその機能がないことに注意してください。 tmuxの内部にはTERM=screen-265colorがあり、smamは機能のリストに表示されません。

infocmp

したがって、tput smamは何も出力しません。

方法はわかりませんが、 QEMUはtputがなかったときにtmuxの行の折り返し状態を変更できました