
感謝クラス・メルボーン現在のプロンプトは次のようになります
# 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
。