.bashrc PS1設定を正しくレンダリングできませんでした。

.bashrc PS1設定を正しくレンダリングできませんでした。

\[...\]私は基本的に問題が何であるかを知っています。 (空白ではありませんか?)文字をエスケープし、bashがプロンプトの幅を正しく計算できるようにするには、これを使用する必要があるためです。

しかし、私はすべてを理解することができず、正確にどこに置くべきかをよく理解していないので、試行錯誤を受けました\[...\]

STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \[\t\]$ENDCOLOR\w>\$?\$\]"

私が使っているものです。唯一の問題は、矢印キーを使用して前のコマンドを長すぎるまでスクロールすると、\w>\$?\$\PS1セクションが消えることです。前のコマンドを使用して前に移動した後に矢印キーを使用して戻るにも、この現象が発生します。

答え1

問題は、出力内容を印刷するために非印刷タグを使用していることです(\t--timestamp)。

STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \t$ENDCOLOR\w>\$?\$ "

\[ ... \]カラーコードなど、印刷されない文字の周囲のシーケンスにのみ適用されます。

答え2

したがって、問題は合計を\[「過剰」にすることです\]。これは、印刷できない文字列にのみ使用できます。バッシュマニュアル:

\[
Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\]

また、Bashがタブを正しくレンダリングするには、特別な構文を使用する必要があります$'\t'

したがって、最終的にプロンプ​​トコードのやや修正されたバージョンは次のようになります。

#!/usr/bin/env bash

readonly PROMPT_STARTCOLOR='\[\e[0;31m\]'
readonly PROMPT_ENDCOLOR='\[\e[0m\]'
readonly PROMPT_BACKGROUND='\[\e[47m\]'

export PS1="$PROMPT_STARTCOLOR$PROMPT_BACKGROUND\u@\h"$'\t'"$PROMPT_ENDCOLOR\w>$?$"

環境との競合の可能性を防ぐために変数名を変更しました。

このスクリプトを使用するには:

source <path_to_file>

私がしばらく前に尋ねた関連の質問は次のとおりです。if句に対するプロンプトのカスタマイズの問題

関連情報