zsh justifica à direita no ps1
Eu gostaria de um prompt zsh de várias linhas com uma parte alinhada à direita, que será algo como isto:
Eu sei sobre o RPROMPT no zsh, mas que possui um prompt alinhado à direita, oposto ao prompt normal, que está na mesma linha de texto da sua digitação.
Existe uma maneira de ter uma parte alinhada à direita na primeira linha de um prompt de comando com várias linhas? Estou procurando por uma diretiva na variável PS1 que diga 'alinhar agora' ou uma variável que seja para PS1 o que RPROMPT é PROMPT.
Você encontrará uma resposta detalhada e um exemplo aqui . A idéia é escrever a linha antes do PS1 usando o precmdretorno de chamada, o uso $COLUMNSe um pouco de matemática para calcular a posição do texto no lado direito da tela. O conhecimento das seqüências de escape também ajudará no posicionamento e coloração do cursor.
Outra solução pode ser usar um tema de Oh My ZSH .
Eu também estava procurando por isso. Para mim, o fato de que as precmd()linhas desenhadas não são redesenhadas ao redimensionar ou quando ^Lé usado para limpar a tela foi algo que me incomodou. O que estou fazendo agora é usar seqüências de escape ANSI para mover o cursor um pouco. Embora eu suspeite que exista uma maneira mais elegante de publicá-los, isso está funcionando para mim:
Lembre-se de que o manual zsh afirma que% {...%} é para seqüências de escape literais que não movem o cursor . Mesmo assim, estou usando-os porque eles permitem ignorar o tamanho de seu conteúdo (não foi possível descobrir como emitir a fuga que move o cursor usando-os)
Depois de brincar com isso por algum tempo, ele erra ocasionalmente e coloca o cursor ou a data na linha errada. Não é um grande negócio; basta pressionar enter para corrigi-lo.
Aqui está como eu configurei essa coisa agora. Essa abordagem não requer nenhuma manipulação de sequência de escape, mas fará com que você tenha duas variáveis ​​diferentes para o prompt primário: PS1com coloração e NPS1sem.
Observe o uso de print -Ppara expansão rápida, ${#variable}para obter o comprimento da string armazenada em variável e printf "%Nd"para preenchimento à esquerda com Nespaços. Ambos printe printfsão comandos internos, portanto, não deve haver desempenho atingido.
Vamos definir prompt com este layout:
Para fazer isso, precisaremos de uma função que nos diga quantos caracteres uma determinada string leva quando impressa.
Precisamos de outra função que use dois argumentos e imprima uma multa completa com esses argumentos nos lados opostos da tela.
Finalmente, podemos definir uma função que define PROMPTe RPROMPT, instruir o ZSH para chamá-la antes de cada prompt, e definir opções de expansão de prompt apropriadas:
Isso produz o seguinte prompt:
Superior esquerdo: diretório atual azul.
Superior direito: Ramo verde do Git.
Parte inferior esquerda: #se raiz, %se não; verde em caso de sucesso, vermelho em caso de erro.
Em baixo à direita: hora atual amarela.
Você pode encontrar detalhes adicionais no prompt de várias linhas: O ingrediente que falta e o código completo nesta lista .
— Roman Perepelitsa
— CaldeiraG
@CaldeiraG Reescrevi minha resposta seguindo sua sugestão. FWIW, o formato da minha resposta original foi informado pela resposta mais votada e aceita nesta questão.