Come posso inserire una nuova riga nel mio prompt di zsh senza causare problemi di ridisegno terminale?


12

Sto cercando di risolvere un problema minore (ma fastidioso) con il mio prompt di zsh. Il problema che sto vedendo è che quando sto usando un terminale in un ambiente con sistema operativo GUI (ad esempio Terminal.app o iTerm 2 su OS X 10.7.2) e ridimensionando la finestra del terminale, il terminale viene ridisegnato con prompt aggiuntivi .

Ho riprodotto il problema su un .zshrc pulito che contiene quanto segue:

export PROMPT=">
"

Per essere chiari, questo è un file a due righe. C'è una nuova riga letterale nella stringa, che ho letto in diversi posti ( certamente vecchi ) è la strada da percorrere. Questo funziona fino a quando non ridimensiono la finestra del terminale, a quel punto finisco con stringhe di prompt duplicate. Ad esempio, se apro una nuova finestra, vedo ( *essendo utilizzato un segnaposto per il mio cursore):

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

Quindi quando ridimensiono la finestra, rendendola più breve, finisco con:

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

Il numero di stampe di prompt aggiuntive sembra approssimativamente proporzionale a quanto cambio le dimensioni della finestra, di solito in verticale. Se rimuovo la nuova riga dalla stringa del prompt, il problema scompare.

Ho provato varie cose, come $(print ">\n"), o cercando di avvolgere la nuova riga %{%}. Suppongo che ciò abbia a che fare con il fatto che newline confonde qualsiasi cosa stia disegnando e quanto sia lunga la stringa del prompt, o qualcosa del genere. Questo problema è risolvibile o devo solo conviverci?

Risposte:


13

Questo problema è dovuto al modo in cui ZSH ristampa la promessa sugli eventi di ridimensionamento e mi ha anche infastidito prima. La soluzione è creare $PROMPTuna riga singola e stampare la prima riga del prompt usando un precmd.

Quindi nel tuo esempio sarebbe semplicemente:

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

o per un esempio più sofisticato con rapida espansione nell'istruzione print utilizzare i -rPparametri:

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

Se hai più di un precmd registrato devi usare add-zsh-hook precmd(vedi man zshcontrib).


1
Per i neofiti come me, puoi vedere cosa significa -rP qui: cs.elte.hu/zsh-manual/zsh_17.html . Sembra che printsia un comando specifico per ZSH, e googling "linux print" non ti dà ottimi risultati.
MikeWyatt,

printfa parte di zsh. Puoi vedere l'aiuto per man zshbuiltins. Bash ha un suo equivalente, ma non sono sicuro che siano compatibili.
Jim Stewart,

10

Che ne dici di qualcosa del genere:

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

Mi piace questa soluzione meglio della risposta accettata. è più portatile e mi permette di mantenere lo stesso script tra i miei ambienti zsh e bash
verboze
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.