Exibe o material abaixo do prompt em um prompt de shell?

21

Vamos dizer que meu prompt se parece com isso (o _ representa meu cursor)

~ % _

Existe alguma maneira de fazer com que pareça com isso

~ % _
[some status]

A questão era originalmente sobre o zsh, mas agora tem outras respostas.

    
por xenoterracide 22.08.2010 / 21:56

2 respostas

17

As configurações a seguir parecem funcionar. O texto na segunda linha desaparece se a linha de comando ultrapassar a primeira linha. A função preexec 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 tem um módulo terminfo que dá acesso ao banco de dados de descrição do terminal: $terminfo[$cap] é a sequência de caracteres a ser enviada para exercer a capacidade do terminal $cap , ou seja, executar seu comando $cap . Veja man 5 terminfo (no Linux, o número da seção pode variar em outros unices) para mais informações.

A seqüência de ações é: mova o cursor uma linha para baixo ( cud1 ), depois faça backup ( cuu1 ); salve a posição do cursor ( sc ); mova o cursor para baixo uma linha; imprimir [some status] ; restaure a posição do cursor. O bit down-down 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 não se misture com a saída do comando.

Se o texto na segunda linha for mais largo que o terminal, o visor pode ficar truncado. Use Ctrl + L em um beliscão para reparar.

    
por 22.08.2010 / 23:28
5

Aqui está um bash equivalente da solução zsh de Gilles. Bash não tem um módulo terminfo nativo, mas o comando tput (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á a um prompt de uma linha.

A linha trap é uma maneira hacky de emular a função preexec do zsh. Consulte o link para obter mais informações.

EDIT : script melhorado com base nos comentários de Gilles.

    
por 13.01.2011 / 20:44

Tags