Tampilkan hal-hal di bawah prompt pada prompt shell?

21

Katakanlah prompt saya terlihat seperti ini (_ mewakili kursor saya)

~ % _

Apakah ada cara saya bisa membuatnya terlihat seperti ini

~ % _
[some status]

Pertanyaannya awalnya tentang zsh, tetapi sekarang memiliki jawaban lain.

xenoterracide
sumber
Bagaimana dengan layar + buobu ?: launchpad.net/byobu , dan mungkin kmandla.wordpress.com/2010/01/03/... untuk tangkapan layar
Janus

Jawaban:

17

Pengaturan berikut tampaknya berfungsi. Teks pada baris kedua menghilang jika baris perintah meluap baris pertama. The preexecFungsi menghapus baris kedua sebelum menjalankan perintah; jika Anda ingin menyimpannya, ubah ke 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]; }

%lolos didokumentasikan dalam manual zsh ( man zshmisc).

Terminfo adalah API akses terminal. Zsh memiliki terminfomodul yang memberikan akses ke database deskripsi terminal: $terminfo[$cap]adalah urutan karakter yang akan dikirim untuk menjalankan kemampuan terminal $cap, yaitu untuk menjalankan $capperintahnya. Lihat man 5 terminfo(di Linux, nomor bagian dapat bervariasi pada kesatuan lainnya) untuk informasi lebih lanjut.

Urutan tindakan adalah: gerakkan kursor ke bawah satu baris ( cud1), lalu kembali ke atas ( cuu1); simpan posisi kursor ( sc); gerakkan kursor ke bawah satu baris; cetak [some status]; mengembalikan posisi kursor. Bit down-and-up di awal hanya diperlukan jika prompt ada di garis bawah layar. Baris preexec menghapus baris kedua ( el) sehingga tidak tercampur dengan output dari perintah.

Jika teks pada baris kedua lebih lebar dari terminal, tampilan mungkin kacau. Gunakan Ctrl+ Ldalam keadaan darurat untuk memperbaiki.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Berikut ini bashsetara dengan solusi zsh Gilles. Bash tidak memiliki modul terminfo asli, tetapi tputperintah (dibundel dengan terminfo) melakukan hal yang sama.

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

Jika terminal tidak mendukung salah satu kapabilitas, ia akan kembali ke prompt satu baris.

The trapline adalah cara Hacky untuk meniru zsh ini preexecfungsi. Lihat /superuser/175799/ untuk info lebih lanjut.

EDIT : Skrip yang ditingkatkan berdasarkan komentar Gilles.

Jander
sumber
@Gilles: Terima kasih atas masukannya! Saya pikir saya sudah membuatnya bekerja lebih baik sekarang. Mencoba bash 4.1.5 di gnome-terminal dan xterm, dan bash 3.2.48 di OSX Terminal.
Jander