preencha o prompt com pontos se o comprimento do prompt for menor que n

preencha o prompt com pontos se o comprimento do prompt for menor que n

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, myPromptWidthele 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-partcom ${(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 $PS1variá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 myPromptWidthfunção:

width="$(myPromptWidth)"
print -v dots -f '%*s' $width .
dots=${dots// /.} 
PS1="%$width<...<$dots %/%% "

O prompt resultante é como:

......................./tmp% 

dotsprecisa 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.

informação relacionada