¿Cómo puedo poner una nueva línea en mi indicador zsh sin causar problemas de redibujado en la terminal?

¿Cómo puedo poner una nueva línea en mi indicador zsh sin causar problemas de redibujado en la terminal?

Estoy intentando solucionar un problema menor (pero molesto) con mi mensaje zsh. El problema que veo es que cuando uso una terminal en un entorno de sistema operativo GUI (por ejemplo, Terminal.app o iTerm 2 en OS X 10.7.2) y cambio el tamaño de la ventana de la terminal, la terminal se vuelve a dibujar con indicaciones adicionales. .

Reproduje el problema en un .zshrc limpio que contiene lo siguiente:

export PROMPT=">
"

Para ser claros, es un archivo de dos líneas. Hay una nueva línea literal en la cadena, que he leído en varios (ciertamente viejo) lugares es el camino a seguir. Esto funciona hasta que cambio el tamaño de la ventana de la terminal, momento en el que termino con cadenas de mensajes duplicadas. Por ejemplo, si abro una nueva ventana, veo ( *se utiliza como marcador de posición para mi cursor):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

Luego, cuando cambio el tamaño de la ventana, haciéndola más corta, termino con:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

La cantidad de impresiones adicionales parece aproximadamente proporcional a cuánto cambio el tamaño de la ventana, generalmente verticalmente. Si elimino la nueva línea de la cadena del mensaje, el problema desaparece.

He probado varias cosas, como $(print ">\n")o intentar incluir la nueva línea en %{%}. Supongo que esto tiene que ver con el hecho de que la nueva línea confunde lo que se está dibujando con la longitud real de la cadena de aviso, o algo así. ¿Se puede solucionar este problema o simplemente tengo que vivir con él?

Respuesta1

Este problema se debe a cómo ZSH reimprime el mensaje en eventos de cambio de tamaño y también me ha molestado antes. La solución es hacer $PROMPTuna sola línea e imprimir la primera línea del mensaje usando un precmd.

Entonces, en tu ejemplo eso sería simplemente:

precmd() { print ">" }
export PROMPT=""

o para un ejemplo más sofisticado con una rápida expansión en la declaración impresa, use los -rPparámetros:

precmd() { print -rP "%~" }
export PROMPT="%# "

Si tiene más de un precmd registrado, debe usarlo add-zsh-hook precmd(consulte man zshcontrib).

Respuesta2

Qué tal algo como esto:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

información relacionada