Esse é um recurso específico de zsh
(e agora fish
também) para permitir que você veja claramente linhas não terminadas na saída de um comando.
Em shells tradicionais, se um comando gerar alguns dados após o último caractere de nova linha, ou, em outras palavras, se ele deixar o cursor do terminal não no início da linha, o próximo prompt será o shell acaba anexado a essa última linha não terminada como em:
bash-4.4$ printf XXX
XXXbash-4.4$
Isso manipula o prompt, e é fácil perder XXX
, especialmente se você tiver um prompt mais interessante como esse. Também afeta o posicionamento do cursor, o que causa falhas de exibição quando você move o cursor.
zsh
trabalha em torno disso, mostrando que a saída tem uma linha não terminada com um caractere %
em negrito e vídeo reverso e emite o próximo prompt no início da próxima linha:
zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
Ele faz isso enviando o vídeo reverso %
ao final de todo comando (antes de cada prompt), mas seguido por 79 espaços (supondo um terminal de 80 caracteres), um caractere CR (aquele que faz com que o cursor volte para a primeira coluna) e a sequência para apagar até o final da linha (e depois o prompt).
Dessa forma, se houver uma linha não terminada, como o cursor não está na primeira posição, esses 80 caracteres farão com que o cursor se mova para a linha seguinte (e que %
permanecerá) . Se não, então, %
e os 79 espaços estarão em uma linha, que serão excluídos posteriormente.
Agora, isso só funciona se o terminal quebrar linhas (por exemplo, isso não funcionará corretamente após tput rmam
). Se você tem um terminal lento (como na linha serial de 9600 bauds), você pode realmente ver aqueles %
sendo exibidos e depois removidos após cada comando, então zsh
permite que você desabilite esse recurso:
unsetopt prompt_cr prompt_sp
Dessa forma, zsh
se comporta mais como shells tradicionais.
Você também pode alterar essa marca com a variável $PROMPT_EOL_MARK
.