rellenar el mensaje con puntos si la longitud del mensaje es menor que n

rellenar el mensaje con puntos si la longitud del mensaje es menor que n

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, myPromptWidthse 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-partwith, ${(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 $PS1variable 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 myPromptWidthfunción:

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

El mensaje resultante es como:

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

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

información relacionada