C'est une caractéristique spécifique zsh(et maintenant fishaussi) de vous permettre de voir clairement les lignes non terminées dans la sortie d'une commande.
Dans les coquilles traditionnelles, si une commande transmet des données après le dernier caractère de nouvelle ligne, ou, autrement dit, si elle laisse le curseur borne pas au début de la ligne, l'invite suivante par les extrémités shell jusqu'à annexé à cette dernière ligne non terminée un péché:
bash-4.4$ printf XXX
XXXbash-4.4$
Cela altère l’invite, et il est facile de l’oublier, XXXsurtout si vous avez une invite plus sophistiquée comme celle-là. Cela affecte également le positionnement du curseur, ce qui provoque des problèmes d'affichage lorsque vous déplacez le curseur.
zshContourne ce %problème en montrant que la sortie comporte une ligne non terminée avec un caractère en gras et en vidéo inversée et affiche l' invite suivante au début de la ligne suivante:
zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
Pour ce faire, il envoie cette vidéo inversée %à la fin de chaque commande (avant chaque invite), suivie de 79 espaces (en supposant un terminal large de 80 caractères), un caractère CR (celui qui force le curseur à revenir à la première). colonne) et la séquence à effacer jusqu’à la fin de la ligne (puis l’invite).
De cette façon, s'il y a une ligne non terminée, puisque le curseur n'est pas en première position, ces 80 caractères le feront passer à la ligne suivante (et cela %restera). Sinon, %les 79 espaces seront placés sur une ligne et seront supprimés par la suite.
Maintenant, cela ne fonctionne que si le terminal encapsule des lignes (par exemple, cela ne fonctionnera pas correctement après tput rmam). Si vous avez un terminal lent (comme sur une ligne série à 9600 bauds), il est possible que ceux-ci %soient affichés puis supprimés après chaque commande. zshVous pouvez donc désactiver cette fonctionnalité:
unsetopt prompt_cr prompt_sp
De cette façon, zshse comporte plus comme des coquilles traditionnelles.
Vous pouvez également changer cette marque avec la $PROMPT_EOL_MARKvariable.
print -n "this is a test"alorsprint "this is a test"