web-dev-qa-db-fra.com

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

Je l'ai remarqué à 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 zsh remplit un nouveau caractère de ligne. Mais maintenant, la curiosité a pris le dessus sur moi, car elle ne semble pas le faire en bash.

zsh

zsh

bash

enter image description here

Le programme Sequence est quelque chose que j'ai tiré d'un livre en lisant sur Java certifications et je voulais juste voir s'il se compilerait et s'exécuterait. J'ai remarqué qu'il n'utilisait pas le println() méthode du package/classe System.out. Au lieu de cela, elle utilise le vieux print().

L'absence d'un nouveau caractère de ligne est-elle la raison pour laquelle j'obtiens ce symbole?

56
jktravis

Oui, cela se produit car il s'agit d'une "ligne partielle". Et par défaut zsh passe à la ligne suivante pour éviter de le couvrir avec l'invite .

Lorsqu'une ligne partielle est conservée, par défaut, vous verrez 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.

66
Leiaz

C'est une caractéristique spécifique de zsh (et maintenant aussi de fish) pour vous permettre de voir clairement les lignes non terminées dans la sortie d'une commande.

Dans les shells traditionnels, si une commande génère des données après le dernier caractère de retour à la ligne, ou, en d'autres termes, si elle laisse le curseur terminal pas au début de la ligne, la prochaine invite du shell se termine up annexé à cette dernière ligne non terminée comme dans:

bash-4.4$ printf XXX
XXXbash-4.4$

Cela modifie l'invite, et il est facile de manquer cette XXX là-bas, surtout si vous avez une invite plus sophistiquée comme celle-ci. Il affecte également le positionnement du curseur, ce qui provoque des problèmes d'affichage lorsque vous déplacez le curseur.

zsh contourne cela, en montrant que la sortie a une ligne non terminée avec un % dans la vidéo en gras et inversé, et émet l'invite suivante au début de la ligne suivante:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

Il le fait en sortant cette vidéo inversée % à la fin de la commande every (avant chaque invite), mais suivie de 79 espaces (en supposant un terminal de 80 caractères), un caractère CR (celui qui provoque le retour du curseur à 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 avait une ligne non terminée, puisque le curseur n'est pas en première position, ces 80 caractères feront déplacer le curseur sur la ligne suivante (et que % restera). Sinon, alors que % et ces 79 espaces seront sur une seule ligne qui sera supprimée 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), vous pouvez voir ces % étant affiché puis supprimé après chaque commande, donc zsh vous permet de désactiver cette fonctionnalité:

unsetopt Prompt_cr Prompt_sp

De cette façon, zsh se comporte plus comme des coques traditionnelles.

Vous pouvez également modifier cette marque avec le $Prompt_EOL_MARK variable.

18
Stéphane Chazelas