谢谢克拉斯·梅尔伯恩我当前的提示看起来像
# 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
。