
Gracias aKlas Mellbournmi mensaje actual se ve así
# 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"
Entonces la salida es algo como
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
/home/blueray%
Pero quiero que todas las indicaciones tengan la misma duración. Si la longitud de un mensaje es menor, myPromptWidth
se debe rellenar con puntos.
Entonces mi resultado esperado es
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
.............................................../home/blueray%
¿Cómo puedo lograr eso?
Actualización 1
He estado experimentando con %${width_part}(l.true-text.false-text)
. No estoy seguro de si esto se puede utilizar, así que resuelva el problema.
Respuesta1
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"
Así, todavía truncamos con %<width><<truncated-part%<<
, aunque con una cadena de sustitución vacía (ya ...
no está), pero en su lugar insertamos <width>
el valor de .
al principio de truncated-part
with, ${(l[<width>][.])}
que es el indicador de expansión del parámetro de relleno izquierdo que aquí no se aplica a ningún parámetro.
Notarás que todo esdoble-citado, y algunas de las $
s tienen escape y otras no. Los que no son ( $width_part
) se expanden en el momento de esa asignación, los que sí se insertarán literalmente en $PS1
, por lo que se expandirán en el momento en que se calcule cada mensaje. El valor real de esa $PS1
variable es:
%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
Respuesta2
Algo como esto llenaría el mensaje con una cantidad adecuada de puntos, usando su myPromptWidth
función:
width="$(myPromptWidth)"
print -v dots -f '%*s' $width .
dots=${dots// /.}
PS1="%$width<...<$dots %/%% "
El mensaje resultante es como:
......................./tmp%
dots
necesita contener una cantidad suficiente de puntos, lo anterior probablemente sea solo una forma de construirlo.
Esto es más o menos lo que Stéphane acaba de comentar mientras lo escribía: llene el mensaje con puntos y deje que el shell lo trunque a su longitud.
Tenga en cuenta que esto también truncará la parte útil real del mensaje si tiene una longitud superior a $width
.