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

11

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

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

export PROMPT=">
"

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

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

Então, quando eu 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 é quase proporcional ao quanto eu mudo o tamanho da janela - geralmente na vertical. Se eu remover a nova linha da string de prompt, o problema desaparece.

Eu tentei várias coisas, como $(print ">\n") , ou tentei quebrar a nova linha em %{%} . Estou assumindo que isso tem a ver com o fato de que newline confunde o que está desenhando com quanto tempo a string de prompt realmente está, ou algo assim. Este problema é consertável ou eu simplesmente tenho que viver com ele?

    
por Josh 26.01.2012 / 04:21

2 respostas

9

Este problema é devido a como o ZSH reimprime o promt em eventos de redimensionamento e também me incomodou antes. A solução é criar $PROMPT linha única e imprimir a primeira linha do prompt usando um prefmd.

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

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

ou para um exemplo mais sofisticado com rápida expansão no comando print use os parâmetros -rP :

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

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

    
por 01.03.2012 / 15:57
9

Que tal algo como isto:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
    
por 15.10.2015 / 00:19