プロンプトの長さがnより短い場合は、プロンプトをドットで埋めます。

プロンプトの長さがnより短い場合は、プロンプトをドットで埋めます。

感謝クラス・メルボーン現在のプロンプトは次のようになります

# this variable can be changed later to change the fraction of the line 
export PROMPT_PERCENT_OF_LINE=40

# make a function, so that it can be evaluated repeatedly
function myPromptWidth() { 
  echo $(( ${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100 )) 
}

# for some reason you can't put a function right in PROMPT, so make an
# intermediary variable
width_part='$(myPromptWidth)'

# if myPromptWidth is less than current prompt ... pad with dots

PS1="%F{013}%${width_part}<...<%d%f%F{012}\${__git_ps1_foo}%f%F{011}%(1j.jobs%j.)%f%(?.%F{004}.%F{001}✕%?)%<<%# %f"

出力は次のようになります

/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
/home/blueray%

しかし、すべてのプロンプトを同じ長さにしたいです。プロンプトの長さが短い場合は、myPromptWidthドットで埋める必要があります。

私の期待する出力は

/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
.............................................../home/blueray%

どうすればそれを達成できるでしょうか?

アップデート1

私は実験してきました%${width_part}(l.true-text.false-text)。これが使用できるかどうかわからないので、問題を解決してください。

答え1

width_part='$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))'
PS1="%F{013}%$width_part<<\${(l[$width_part][.])}%~%F{012}\${__git_ps1_foo}%F{011}%(1j.jobs%j.)%(?.%F{004}.%F{001}✕%?)%<<%# %f"

現状では、 による切り捨ては引き続き行われます%<width><<truncated-part%<<が、置換文字列は空になります ( は...なくなります)。代わりに、の先頭に<width>の値が挿入されます。は、ここではどのパラメータにも適用されない左側パディング パラメータ拡張フラグです。.truncated-part${(l[<width>][.])}

全体がダブル-引用符で囲まれ、$エスケープされているものとされていないものがあります。 ( ) でないものは$width_partその割り当て時に展開され、 ( ) であるものは に文字通り挿入される$PS1ため、各プロンプトが計算されるときに展開されます。その$PS1変数の実際の値は次のとおりです。

%F{013}%$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))<<${(l[$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))][.])}%~%F{012}${__git_ps1_foo}%F{011}%(1j.jobs%j.)%(?.%F{004}.%F{001}✕%?)%<<%# %f

答え2

次のような関数を使用すると、プロンプトが適切な数のドットで埋められますmyPromptWidth

width="$(myPromptWidth)"
print -v dots -f '%*s' $width .
dots=${dots// /.} 
PS1="%$width<...<$dots %/%% "

結果のプロンプトは次のようになります。

......................./tmp% 

dots十分な数のドットを含める必要があるため、上記はおそらくそれを構築する 1 つの方法にすぎません。

これは、私がこれを書いているときに Stéphane がコメントしたこととほぼ同じです。プロンプトをドットで埋めて、シェルに長さに合わせて切り捨てさせます。

プロンプトの実際の有用な部分が より長い場合は、その部分も切り捨てられることに注意してください$width

関連情報