如果提示的长度小于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

相关内容