Comment puis-je mettre une nouvelle ligne dans mon invite zsh sans provoquer de problèmes de redessin de terminal?

12

J'essaie de résoudre un problème mineur (mais ennuyeux) avec mon invite zsh. Le problème que je vois est que lorsque j'utilise un terminal dans un environnement de GUI OS (par exemple, Terminal.app ou iTerm 2 sur OS X 10.7.2) et que je redimensionne la fenêtre du terminal, le terminal est redessiné avec des invites supplémentaires .

J'ai reproduit le problème sur un fichier .zshrc propre qui contient les éléments suivants:

export PROMPT=">
"

Pour être clair, c'est un fichier de deux lignes. Il y a une nouvelle ligne littérale dans la chaîne, que j'ai lue à plusieurs endroits ( certes anciens ) est la voie à suivre. Cela fonctionne jusqu'à ce que je redimensionne la fenêtre du terminal, auquel cas je me retrouve avec des chaînes d'invite en double. Par exemple, si j'ouvre une nouvelle fenêtre, je vois ( *étant utilisé un espace réservé pour mon curseur):

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

Puis quand je redimensionne la fenêtre, la raccourcissant, je me retrouve avec:

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

Le nombre d'impressions supplémentaires rapides semble à peu près proportionnel à la façon dont je modifie la taille de la fenêtre - généralement verticalement. Si je supprime la nouvelle ligne de la chaîne d'invite, le problème disparaît.

J'ai essayé différentes choses, comme $(print ">\n")ou essayer de boucler la nouvelle ligne %{%}. Je suppose que cela a à voir avec le fait que la nouvelle ligne confond tout ce qui dessine par rapport à la longueur réelle de la chaîne d'invite, ou quelque chose. Ce problème peut-il être résolu ou dois-je simplement vivre avec?


la source

Réponses:

13

Ce problème est dû à la façon dont ZSH réimprime l'invite sur les événements de redimensionnement et m'a également énervé auparavant. La solution consiste à créer une $PROMPTseule ligne et à imprimer la première ligne de l'invite à l'aide d'un precmd.

Donc, dans votre exemple, ce serait simplement:

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

ou pour un exemple plus sophistiqué avec une expansion rapide dans l'instruction print, utilisez les -rPparamètres:

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

Si vous avez plus d'un precmd enregistré, vous devez utiliser add-zsh-hook precmd(voir man zshcontrib).

K-os
la source
1
Pour les débutants comme moi, vous pouvez voir ce que -rP signifie ici: cs.elte.hu/zsh-manual/zsh_17.html . Il semble que ce printsoit une commande spécifique à ZSH, et googler "linux print" ne vous donne pas de très bons résultats.
MikeWyatt
printfait partie de zsh. Vous pouvez voir l'aide à ce sujet dans man zshbuiltins. Bash a son propre équivalent, mais je ne suis pas sûr qu'ils soient compatibles.
Jim Stewart
10

Que diriez-vous quelque chose comme ça:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
Đức Thanh Nguyễn
la source
J'aime mieux cette solution que la réponse acceptée. il est plus portable et me permet de maintenir le même script entre mes environnements zsh et bash
verboze