Mostra cose sotto il prompt al prompt della shell?


Risposte:


17

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.


5

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.


@Gilles: grazie per l'input! Penso che ora funzioni meglio. Ho provato bash 4.1.5 in gnome-terminal e xterm e bash 3.2.48 in OSX Terminal.
Jander
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.