\[...\]
私は基本的に問題が何であるかを知っています。 (空白ではありませんか?)文字をエスケープし、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句に対するプロンプトのカスタマイズの問題