Por que ZSH termina uma linha com um símbolo de porcentagem destacado?

46

Notei isso ocasionalmente com uma variedade de aplicações. Eu sempre pensei que era porque a saída foi cancelada mais cedo (ctrl + c, por exemplo) ou algo semelhante, e o zsh está preenchendo um novo caractere de linha. Mas agora a curiosidade ganhou o melhor de mim, pois não parece fazer isso no bash.

zsh

zsh

bater

insira a descrição da imagem aqui

O Sequenceprograma é algo que eu retirei de um livro enquanto lia as certificações Java e só queria ver se ele seria compilado e executado. Eu notei que ele não usa o println()método do System.outpacote / classe. Em vez disso, usa planície antiga print().

A falta de um caractere de nova linha é a razão pela qual recebo esse símbolo?

jktravis
fonte

Respostas:

57

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

Quando uma linha parcial é preservada, por padrão, você verá um caractere inverso + negrito no final da linha parcial: um "%" para um usuário normal ou um "#" para raiz. Se definido, o parâmetro do shell PROMPT_EOL_MARK pode ser usado para personalizar como o final das linhas parciais é mostrado.

Leiaz
fonte
3
Para testar, faça o seguinte: print -n "this is a test"entãoprint "this is a test"
SergioAraujo 6/17/17
5
Agora coloquei PROMPT_EOL_MARK=''no meu .zshrc para ocultar a diferença entre a linha nova à direita ou não na saída do comando.
GeekQ
14

Essa é uma característica específica zsh(e agora fishtambém) de permitir que você veja claramente linhas não terminadas na saída de um comando.

Nos shells tradicionais, se um comando gerar alguns dados após o último caractere de nova linha, ou, em outras palavras, se deixar o cursor do terminal não no início da linha, o próximo prompt do shell será anexado à última linha não terminada como em:

bash-4.4$ printf XXX
XXXbash-4.4$

Isso controla o prompt, e é fácil perder isso XXX, especialmente se você tiver um prompt mais sofisticado como esse. Também afeta o posicionamento do cursor, o que causa falhas na exibição quando você move o cursor.

zshcontorna isso, mostrando que a saída tem uma linha não terminada com um %caractere em vídeo em negrito e 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 exibindo o vídeo reverso %no final de cada comando (antes de cada prompt), mas seguido por 79 espaços (assumindo um terminal de 80 caracteres), um caractere CR (aquele que faz com que o cursor volte ao primeiro coluna) e a sequência a ser apagada no final da linha (e depois no prompt).

Dessa forma, se houver uma linha não terminada, já que o cursor não está na primeira posição, esses 80 caracteres farão o cursor mover para a próxima linha (e isso %permanecerá). Caso contrário, %esses e esses 79 espaços estarão em uma linha que será excluída posteriormente.

Agora, isso só funciona se o terminal quebrar linhas (por exemplo, que não funcionará corretamente depois tput rmam). Se você tiver um terminal lento (como na linha serial de 9600 baud), poderá realmente ver aqueles %sendo exibidos e removidos após cada comando, portanto, zshdesabilite esse recurso:

unsetopt prompt_cr prompt_sp

Dessa forma, zshcomporta-se mais como conchas tradicionais.

Você também pode alterar essa marca com a $PROMPT_EOL_MARKvariável

Stéphane Chazelas
fonte