zsh right-justify em ps1

19

Eu gostaria de um prompt zsh de várias linhas com uma parte alinhada à direita, que será algo como isto:

2.nate@host:/current/dir                                               16:00
->

Eu sei sobre o RPROMPT em zsh, mas ele tem um prompt alinhado à direita em frente ao seu prompt normal, que está na mesma linha de texto da sua digitação.

Existe uma maneira de ter uma parte alinhada à direita para a primeira linha de um prompt de comando com várias linhas? Estou procurando uma diretriz na variável PS1 que diga 'right align now' ou uma variável que seja para PS1 o que RPROMPT é para PROMPT.

Obrigado!

    
por So8res 14.11.2011 / 01:53

3 respostas

12

Você encontrará uma resposta detalhada e um exemplo aqui . A idéia é escrever a linha antes do PS1 usando o retorno de chamada precmd , use $COLUMNS e um pouco de matemática para calcular a posição do texto no lado direito da tela. O conhecimento das sequências de escape também o ajudará no posicionamento e na coloração do cursor.

Outra solução pode ser usar um tema de Oh My ZSH .

    
por 14.11.2011 / 04:13
9

Eu tenho procurado por isso também. Para mim, o fato de as linhas desenhadas precmd() não serem redesenhadas no redimensionamento ou quando ^L é usado para limpar a tela era algo que ficava me irritando. O que estou fazendo agora é usar sequências de escape ANSI para mover o cursor um pouco. Embora eu suspeite que haja uma maneira mais elegante de emiti-los, isso está funcionando para mim:

_newline=$'\n'
_lineup=$'\e[1A'
_linedown=$'\e[1B'

PROMPT=...whatever...${_newline}...whatever...
RPROMPT=%{${_lineup}%}...whatever...%{${_linedown}%}

Tenha em atenção que o manual do zsh indica 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 consegui descobrir como emitir o escape que move o cursor usando-os)

    
por 03.04.2014 / 22:29
3

Aqui está como eu configurei essa coisa agora. Essa abordagem não requer nenhuma manipulação de seqüência de escape, mas fará com que você tenha duas variáveis diferentes para o prompt principal: PS1 com coloração e NPS1 sem.

# Here NPS1 stands for "naked PS1" and isn't a built-in shell variable. I've
# defined it myself for PS1-PS2 alignment to operate properly.
PS1='%S%F{red}[%l]%f%s %F{green}%n@%m%f %B%#%b '
NPS1='[%l] %n@%m # '
RPS1='%B%F{green}(%~)%f%b'

# Hook function which gets executed right before shell prints prompt.
function precmd() {
    local expandedPrompt="$(print -P "$NPS1")"
    local promptLength="${#expandedPrompt}"
    PS2="> "
    PS2="$(printf "%${promptLength}s" "$PS2")"
}

Observe o uso de print -P para a expansão de prompt, ${#variable} para obter o comprimento da string armazenada na variável e printf "%Nd" para o preenchimento da esquerda com N espaços. Os comandos print e printf são comandos internos, portanto, não deve haver nenhum impacto no desempenho.

    
por 03.11.2014 / 21:13

Tags