RPROMPT multilínea en zsh

RPROMPT multilínea en zsh

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 precmdfunció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

  • $LEFTy $RIGHTsujetar las cuerdas por el lado izquierdo y derecho, resp. Puede utilizar la salida del comando con la $(...)sintaxis.
  • $RIGHTWIDTHes la diferencia del ancho del terminal actual (almacenado porzshen el $COLUMNSparámetro) y el ancho de la cadena izquierda. $((...))es para expresiones matemáticas
  • La magia viene con ${(l:$RIGHTWIDTH::.:)RIGHT}, donde el parámetro $RIGHTse 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.
  • PS1y RPS1son más cortos para PROMPTy RPROMPT.

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

información relacionada