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 $PROMPT
uma 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 -rP
parâ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"