
Graças aKlas Melbournmeu prompt atual parece
# 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"
Então a saída é algo como
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
/home/blueray%
Mas quero que todos os prompts tenham o mesmo comprimento. Se o comprimento do prompt for menor, myPromptWidth
ele deverá ser preenchido com pontos.
Então, minha saída esperada é
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
.............................................../home/blueray%
Como posso conseguir isso?
Atualização 1
Eu tenho experimentado %${width_part}(l.true-text.false-text)
. Não tenho certeza se isso pode ser usado, então resolva o problema.
Responder1
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"
Assim sendo, ainda fazemos truncamento com %<width><<truncated-part%<<
, embora com uma string de substituição vazia (o ...
desapareceu), mas em vez disso inserimos <width>
valor .
no início do truncated-part
com ${(l[<width>][.])}
qual é o sinalizador de expansão do parâmetro de preenchimento esquerdo aqui aplicado a nenhum parâmetro.
Você notará que a coisa toda édobro-citado, e alguns dos $
s são escapados e outros não. Os que não são ( $width_part
) são expandidos no momento dessa atribuição, os que são serão inseridos literalmente em $PS1
, portanto serão expandidos no momento em que cada prompt for computado. O valor real dessa $PS1
variável é:
%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
Responder2
Algo assim preencheria o prompt com um número apropriado de pontos, usando sua myPromptWidth
função:
width="$(myPromptWidth)"
print -v dots -f '%*s' $width .
dots=${dots// /.}
PS1="%$width<...<$dots %/%% "
O prompt resultante é como:
......................./tmp%
dots
precisa conter um número suficiente de pontos, o acima é provavelmente apenas uma maneira de construí-lo.
Isso é basicamente o que Stéphane acabou de comentar enquanto eu escrevia: preencha o prompt com pontos e deixe o shell truncá-lo no comprimento.
Observe que isso também truncará a parte útil real do prompt se for maior que $width
.