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


12

Estoy tratando de solucionar un problema menor (pero molesto) con mi indicador zsh. El problema que veo es que cuando estoy usando un terminal en un entorno GUI OS (por ejemplo, Terminal.app o iTerm 2 en OS X 10.7.2) y redimensionamos la ventana del terminal, el terminal se vuelve a dibujar con indicaciones adicionales .

He reproducido el problema en un archivo .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 lugares ( ciertamente antiguos ) es el camino a seguir. Esto funciona hasta que cambie el tamaño de la ventana de terminal, momento en el que termino con cadenas de solicitud duplicadas. Por ejemplo, si abro una nueva ventana, veo (que *se usa un 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
>
>
>
>
*

El número de impresiones de solicitud 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 de solicitud, el problema desaparece.

He intentado varias cosas, como $(print ">\n"), o tratar de envolver la nueva línea %{%}. Supongo que esto tiene que ver con el hecho de que la nueva línea confunde lo que está dibujando wrt cuánto dura realmente la cadena de solicitud, o algo así. ¿Se puede solucionar este problema o solo tengo que vivir con él?

Respuestas:


13

Este problema se debe a cómo ZSH vuelve a imprimir la solicitud de cambio de tamaño de los eventos y también me ha molestado antes. La solución es hacer una $PROMPTsola línea e imprimir la primera línea de la solicitud utilizando un precmd.

Entonces, en su 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 de impresión, use los -rPparámetros:

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

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


1
Para los novatos como yo, puedes ver lo que significa -rP aquí: cs.elte.hu/zsh-manual/zsh_17.html . Parece que printes un comando específico de ZSH, y buscar en Google "linux print" no le da muy buenos resultados.
MikeWyatt

printes parte de zsh. Puedes ver la ayuda para ello en man zshbuiltins. Bash tiene su propio equivalente, pero no estoy seguro de que sean compatibles.
Jim Stewart

10

Qué tal algo como esto:

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

Me gusta esta solución mejor que la respuesta aceptada. es más portátil y me permite mantener el mismo script entre mis entornos zsh y bash
verboze
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.