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 preexecfunzione 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 terminfomodulo 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 $capcomando. 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 bashequivalente della soluzione zsh di Gilles. Bash non ha un modulo terminfo nativo, ma il tputcomando (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 traplinea è un modo bizzarro per emulare la preexecfunzione di zsh . Vedi /superuser/175799/ per maggiori informazioni.
EDIT : sceneggiatura migliorata basata sui commenti di Gilles.