Como posso colocar uma nova linha no meu prompt zsh sem causar problemas de redesenho do terminal?

Como posso colocar uma nova linha no meu prompt zsh sem causar problemas de redesenho do terminal?

Estou tentando corrigir um problema menor (mas irritante) com meu prompt zsh. O problema que estou vendo é que quando estou usando um terminal em um ambiente GUI OS (por exemplo, Terminal.app ou iTerm 2 no OS X 10.7.2) e redimensiono a janela do terminal, o terminal é redesenhado com prompts extras .

Reproduzi o problema em um .zshrc limpo que contém o seguinte:

export PROMPT=">
"

Para ser claro, é um arquivo de duas linhas. Há uma nova linha literal na string, que li em vários (reconhecidamente velho) lugares é o caminho a percorrer. Isso funciona até eu redimensionar a janela do terminal, momento em que acabo com strings de prompt duplicadas. Por exemplo, se eu abrir uma nova janela, vejo ( *sendo usado como espaço reservado para meu cursor):

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

Então, quando redimensiono a janela, tornando-a mais curta, acabo com:

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

O número de impressões extras de prompt parece aproximadamente proporcional ao quanto eu altero o tamanho da janela - geralmente verticalmente. Se eu remover a nova linha da string do prompt, o problema desaparecerá.

Eu tentei várias coisas, como $(print ">\n")ou tentando agrupar a nova linha em %{%}. Estou assumindo que isso tem a ver com o fato de que a nova linha confunde o que quer que esteja desenhando com o comprimento real da string de prompt, ou algo assim. Esse problema pode ser resolvido ou eu apenas tenho que conviver com ele?

Responder1

Esse problema se deve ao modo como o ZSH reimprime o prompt em eventos de redimensionamento e também me incomodou antes. A solução é criar $PROMPTuma linha única e imprimir a primeira linha do prompt usando um precmd.

Então, no seu exemplo, isso seria simplesmente:

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

ou para um exemplo mais sofisticado com expansão imediata na instrução print use os -rPparâmetros:

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

Se você tiver mais de um precmd cadastrado você precisa usar add-zsh-hook precmd(veja man zshcontrib).

Responder2

Que tal algo como isso:

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

informação relacionada