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.
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.
Jawaban:
Pengaturan berikut tampaknya berfungsi. Teks pada baris kedua menghilang jika baris perintah meluap baris pertama. The preexec
Fungsi 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 terminfo
modul yang memberikan akses ke database deskripsi terminal: $terminfo[$cap]
adalah urutan karakter yang akan dikirim untuk menjalankan kemampuan terminal $cap
, yaitu untuk menjalankan $cap
perintahnya. 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.
Berikut ini bash
setara dengan solusi zsh Gilles. Bash tidak memiliki modul terminfo asli, tetapi tput
perintah (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 trap
line adalah cara Hacky untuk meniru zsh ini preexec
fungsi. Lihat /superuser/175799/ untuk info lebih lanjut.
EDIT : Skrip yang ditingkatkan berdasarkan komentar Gilles.