RPROMPT multilinha em zsh

RPROMPT multilinha em zsh

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 precmdfunçã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

  • $LEFTe $RIGHTsegure 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 $COLUMNSparâ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.
  • PS1e RPS1são mais curtos para PROMPTe RPROMPT.

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 PROMPTocupaçã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.

informação relacionada