Pourquoi ZSH termine une ligne avec un symbole de pourcentage en surbrillance?

46

J'ai remarqué cela à l'occasion avec une variété d'applications. J'ai souvent pensé que c'était parce que la sortie avait été annulée tôt (ctrl + c, par exemple) ou quelque chose de similaire, et que zsh remplissait un nouveau caractère de ligne. Mais maintenant, la curiosité a pris le dessus sur moi, puisqu'elle ne semble pas le faire en bash.

zsh

zsh

frapper

entrez la description de l'image ici

Le Sequenceprogramme est quelque chose que j'ai tiré d'un livre en lisant sur les certifications Java et que je voulais juste voir s'il serait compilé et exécuté. J'ai remarqué qu'il n'utilise pas la println()méthode du System.outpackage / class. Au lieu de cela, il utilise plaine vieux print().

Est-ce que l'absence d'un caractère de nouvelle ligne est la raison pour laquelle j'ai ce symbole?

Jktravis
la source

Réponses:

57

Oui, cela arrive parce que c'est une "ligne partielle". Et par défaut, zsh passe à la ligne suivante pour éviter de la couvrir avec l'invite .

Lorsqu'une ligne partielle est conservée, vous verrez par défaut un caractère inverse + gras à la fin de la ligne partielle: un "%" pour un utilisateur normal ou un "#" pour root. S'il est défini, le paramètre shell PROMPT_EOL_MARK peut être utilisé pour personnaliser l'affichage de la fin des lignes partielles.

Leiaz
la source
3
Afin de tester cela: print -n "this is a test"alorsprint "this is a test"
SergioAraujo
5
J'ai maintenant mis PROMPT_EOL_MARK=''dans mon .zshrc pour masquer la différence entre les retours à la ligne ou les retours à la fin.
geekQ
14

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.

Stéphane Chazelas
la source