
謝謝克拉斯·梅爾伯恩我目前的提示看起來像
# 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%<<
,儘管使用了一個空的替換字串(the...
已經消失了),而是在 的開頭插入value ,<width>
這是此處的左填充參數擴展標誌,根本不應用於任何參數。.
truncated-part
${(l[<width>][.])}
你會注意到整件事是雙倍的- 引用,有些$
s 被轉義,有些則沒有。不屬於 ( $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
需要包含足夠數量的點,以上可能只是建構它的一種方法。
這幾乎就是 Stéphane 在我寫它時所評論的內容:用點填充提示符,然後讓 shell 將其截斷到一定長度。
請注意,如果提示的長度超過 ,這也會截斷提示的實際有用部分$width
。