如果提示的長度小於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%<<,儘管使用了一個空的替換字串(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

相關內容