
Eu sei que você pode definir prompts multilinhas no zsh:
PROMPT='
test
→ '
Mas eu queria saber, por que você não pode definir prompts corretos de múltiplas linhas? Tentei:
RPROMPT='
test
still test '
mas nada aparece. Isso é possível?
Responder1
Você pode obter o efeito desejado (se eu estiver certo) usando a precmd
função, que é executada sempre antes do prompt ser exibido, para imprimir linhas adicionais acima do prompt.
Use por exemplo este código
precmd() {
LEFT="The time is"
RIGHT="$(date) "
RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"
Explicação
$LEFT
e$RIGHT
segure as cordas do lado esquerdo e direito, resp. Você pode usar a saída do comando com a$(...)
sintaxe.$RIGHTWIDTH
é a diferença da largura atual do terminal (armazenada porzshno$COLUMNS
parâmetro) e a largura da string esquerda.$((...))
é para expressões matemáticas- A mágica vem com
${(l:$RIGHTWIDTH::.:)RIGHT}
, onde o parâmetro$RIGHT
é preenchido à esquerda (l
) por pontos (omita o último:.:
se quiser espaços) até o comprimento de$RIGHTWIDTH
. - Imprima a linha adicional. Repita os comandos se quiser mais linhas.
PS1
eRPS1
são mais curtos paraPROMPT
eRPROMPT
.
Demonstração
The time is............................................Fri, Sep 18, 2015 8:20:22 PM
foo > _ bar
Responder2
Aparentemente, não é impossível definir um prompt correto de várias linhas:Estegerencia isso. No entanto, eu diria que é assim:
local top_left='%F{blue}%~%f'
local top_right="%F{green}${git_branch}%f"
local bottom_left='%B%F{%(?.green.red)}%#%f%b '
local bottom_right='%F{yellow}%T%f'
local REPLY
fill-line "$top_left" "$top_right"
PROMPT=$REPLY$'\n'$bottom_left
RPROMPT=$bottom_right
Tendo uma PROMPT
ocupação no canto superior esquerdo e direito, bem como no canto inferior esquerdo, e o RPROMPT ocupa o canto inferior direito. Ainda assim, o RPROMPT propriamente dito terá uma única linha.