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

12

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

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

export PROMPT=">
"

Para deixar claro, é um arquivo de duas linhas. Há uma nova linha literal na string, que eu li em vários lugares ( reconhecidamente antigos ) é o caminho a percorrer. Isso funciona até que eu redimensione a janela do terminal; nesse ponto, terminarei com seqüências de caracteres duplicadas. Por exemplo, se eu abrir uma nova janela, vejo ( *sendo usado um espaço reservado para o meu cursor):

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

Então, quando redimensiono a janela, diminuindo, 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 altero o tamanho da janela - geralmente na vertical. Se eu remover a nova linha da string de prompt, o problema desaparecerá.

Eu tentei várias coisas, como $(print ">\n"), ou tentando envolver a nova linha %{%}. Eu estou assumindo que isso tem a ver com o fato de que a nova linha confunde o que está desenhando, quanto tempo a string de prompt realmente tem, ou algo assim. Esse problema é corrigível ou eu apenas tenho que conviver com ele?


fonte

Respostas:

13

Esse problema ocorre devido à forma como o ZSH reimprime o prompt dos eventos de redimensionamento e também me incomodou antes. A solução é criar $PROMPTlinha ú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 rápida expansão na instrução print, use os -rPparâmetros:

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

Se você tiver mais de um precmd registrado, precisará usar add-zsh-hook precmd(consulte man zshcontrib).

K-os
fonte
1
Para iniciantes como eu, você pode ver o que -rP significa aqui: cs.elte.hu/zsh-manual/zsh_17.html . Parece que printé um comando específico do ZSH, e o "linux print" do Google não fornece resultados muito bons.
MikeWyatt
printfaz parte do zsh. Você pode ver a ajuda para isso man zshbuiltins. O Bash tem seu próprio equivalente, mas não tenho certeza de que sejam compatíveis.
Jim Stewart
10

Que tal algo como isso:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
Thanh Nguyễn
fonte
Eu gosto mais desta solução do que a resposta aceita. é mais portátil, e me permite manter o mesmo script entre os meus ambientes zsh eo bash
verboze