
Sé que puedes definir mensajes multilínea en zsh:
PROMPT='
test
→ '
Pero me preguntaba, ¿por qué no se pueden definir indicaciones correctas de varias líneas? Lo intenté:
RPROMPT='
test
still test '
pero no aparece nada. es posible?
Respuesta1
Puede obtener el efecto deseado (si no me equivoco) utilizando la precmd
función, que se ejecuta cada vez antes de que se muestre el mensaje, para imprimir líneas adicionales encima del mensaje.
Utilice por ejemplo este código
precmd() {
LEFT="The time is"
RIGHT="$(date) "
RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"
Explicación
$LEFT
y$RIGHT
sujetar las cuerdas por el lado izquierdo y derecho, resp. Puede utilizar la salida del comando con la$(...)
sintaxis.$RIGHTWIDTH
es la diferencia del ancho del terminal actual (almacenado porzshen el$COLUMNS
parámetro) y el ancho de la cadena izquierda.$((...))
es para expresiones matemáticas- La magia viene con
${(l:$RIGHTWIDTH::.:)RIGHT}
, donde el parámetro$RIGHT
se rellena a la izquierda (l
) con puntos (omita el último:.:
si desea espacios) hasta una longitud de$RIGHTWIDTH
. - Imprima la línea adicional. Repite los comandos si quieres más líneas.
PS1
yRPS1
son más cortos paraPROMPT
yRPROMPT
.
Manifestación
The time is............................................Fri, Sep 18, 2015 8:20:22 PM
foo > _ bar
Respuesta2
Aparentemente no es imposible configurar un mensaje derecho de varias líneas:Éstemaneja eso. Sin embargo, diría que lo hace así:
local top_left='%F{blue}%~%f'
local top_right="%F{green}${git_branch}%f"
local bottom_left='%B%F{%(?.green.red)}%#%f%b '
local bottom_right='%F{yellow}%T%f'
local REPLY
fill-line "$top_left" "$top_right"
PROMPT=$REPLY$'\n'$bottom_left
RPROMPT=$bottom_right
Al tener un PROMPT
ocupar la parte superior izquierda y derecha, así como la parte inferior izquierda, y el RPROMPT ocupar la parte inferior derecha. Aún así, RPROMPT propiamente dicho tendrá una sola línea.