Diciamo che il mio prompt assomiglia a questo (il _ rappresenta il mio cursore)
~ % _
Esiste un modo per farlo sembrare così
~ % _
[some status]
La domanda era originariamente su zsh, ma ora ha altre risposte.
Diciamo che il mio prompt assomiglia a questo (il _ rappresenta il mio cursore)
~ % _
Esiste un modo per farlo sembrare così
~ % _
[some status]
La domanda era originariamente su zsh, ma ora ha altre risposte.
Risposte:
Le seguenti impostazioni sembrano funzionare. Il testo sulla seconda riga scompare se la riga di comando trabocca sulla prima riga. La preexec
funzione cancella la seconda riga prima di eseguire il comando; se vuoi mantenerlo, cambia in 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]; }
%
gli escape sono documentati nel manuale zsh ( man zshmisc
).
Terminfo è un'API di accesso al terminale. Zsh ha un terminfo
modulo che dà accesso al database di descrizione del terminale: $terminfo[$cap]
è la sequenza di caratteri da inviare per esercitare la capacità del terminale $cap
, cioè per eseguire il suo $cap
comando. Vedi man 5 terminfo
(su Linux, il numero di sezione può variare su altri unices) per maggiori informazioni.
La sequenza di azioni è: sposta il cursore in basso di una riga ( cud1
), quindi torna su ( cuu1
); salva la posizione del cursore ( sc
); sposta il cursore in basso di una riga; stampa [some status]
; ripristinare la posizione del cursore. Il bit discendente all'inizio è necessario solo nel caso in cui il prompt si trovi nella riga inferiore dello schermo. La riga preexec cancella la seconda riga ( el
) in modo che non venga confusa con l'output del comando.
Se il testo sulla seconda riga è più largo del terminale, il display potrebbe essere confuso. Usa Ctrl+ Lin un pizzico per riparare.
Ecco un bash
equivalente della soluzione zsh di Gilles. Bash non ha un modulo terminfo nativo, ma il tput
comando (in bundle con terminfo
) fa più o meno la stessa cosa.
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 il terminale non supporta una delle funzionalità, tornerà a un prompt di una riga.
La trap
linea è un modo bizzarro per emulare la preexec
funzione di zsh . Vedi /superuser/175799/ per maggiori informazioni.
EDIT : sceneggiatura migliorata basata sui commenti di Gilles.