
Digamos que meu prompt seja assim (o _ representa meu cursor)
~ % _
Existe alguma maneira de fazer com que fique assim
~ % _
[some status]
A pergunta era originalmente sobre zsh, mas agora tem outras respostas.
Responder1
As seguintes configurações parecem funcionar. O texto da segunda linha desaparece se a linha de comando ultrapassar a primeira linha. A preexec
função apaga a segunda linha antes de executar o comando; se você quiser mantê-lo, mude para preexec () { echo; }
.
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
escapes estão documentados no manual do zsh ( man zshmisc
).
Terminfo é uma API de acesso ao terminal. Zsh possui um terminfo
módulo que dá acesso ao banco de dados de descrição do terminal: $terminfo[$cap]
é a sequência de caracteres a enviar para exercitar a capacidade do terminal $cap
, ou seja, para executar seu $cap
comando. Consulte man 5 terminfo
(no Linux, o número da seção pode variar em outros dispositivos) para obter mais informações.
A sequência de ações é: mover o cursor uma linha para baixo ( cud1
) e depois voltar para cima ( cuu1
); salve a posição do cursor ( sc
); mova o cursor uma linha para baixo; imprimir [some status]
; restaurar a posição do cursor. O bit para cima e para baixo no início só é necessário caso o prompt esteja na linha inferior da tela. A linha preexec apaga a segunda linha ( el
) para que ela não se confunda com a saída do comando.
Se o texto na segunda linha for mais largo que o terminal, a exibição poderá ficar distorcida. Use Ctrl+ Lem caso de emergência para reparar.
Responder2
Aqui está um bash
equivalente à solução zsh de Gilles. O Bash não possui um módulo terminfo nativo, mas o tput
comando (empacotado com terminfo
) faz praticamente a mesma coisa.
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
Se o terminal não suportar um dos recursos, ele retornará para um prompt de uma linha.
A trap
linha é uma maneira hackeada de emular a função do zsh preexec
. Verhttps://superuser.com/questions/175799/para mais informações.
EDITAR: Roteiro aprimorado com base nos comentários de Gilles.