Por que o ZSH termina uma linha com um símbolo de porcentagem realçado?

35

Eu notei isso ocasionalmente com várias aplicações. Muitas vezes eu pensei que era porque a saída foi cancelada cedo (ctrl + c, por exemplo) ou algo similar, e zsh está preenchendo um novo caractere de linha. Mas agora a curiosidade obteve o melhor de mim, já que não parece fazer isso no bash.

zsh

bash

O programa Sequence é algo que tirei de um livro enquanto lia em certificações Java e queria apenas ver se ele seria compilado e executado. Eu notei que ele não usa o método println() do System.out package / class. Em vez disso, ele usa o antigo print() .

A falta de um novo caractere de linha é a razão pela qual eu recebo este símbolo?

    
por jktravis 12.11.2014 / 17:01

2 respostas

48

Sim, isso acontece porque é uma "linha parcial". E por padrão zsh vai para a próxima linha para evitar cobrí-la com o prompt .

When a partial line is preserved, by default you will see an inverse+bold character at the end of the partial line: a "%" for a normal user or a "#" for root. If set, the shell parameter PROMPT_EOL_MARK can be used to customize how the end of partial lines are shown.

    
por 12.11.2014 / 17:45
10

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 .

    
por 11.08.2016 / 08:17