Saat memulai XTerm prompt dimulai pada baris pertama terminal. Saat menjalankan perintah, prompt bergerak ke bawah hingga mencapai bagian bawah, dan sejak saat itu tetap ada di sana (bahkan tidak Shift- Page Downatau mouse dapat mengubahnya). Alih-alih memiliki awal masa terminal menjadi "khusus" prompt harus selalu di bagian bawah terminal. Harap dicatat bahwa saya memiliki prompt multi-line .
Tentu saja, itu seharusnya berfungsi seperti sebelumnya (dapat diubah ukurannya, digulir, tidak ada baris baru yang tidak perlu dalam output, dan tidak ada output yang menghilang secara misterius), jadi PROMPT_COMMAND='echo;echo;...'
atau serupa bukanlah pilihan. Solusinya idealnya tidak harus spesifik-shell.
Edit: The solusi saat ini , saat bekerja dalam kasus sederhana, memiliki beberapa masalah:
- Ini spesifik Bash . Solusi ideal harus portabel untuk cangkang lain.
- Hal gagal jika proses lainnya memodifikasi
PS1
. Salah satu contohnya adalah virtualenv, yang menambahkan(virtualenv)
pada awal dariPS1
, yang kemudian selalu menghilang tepat di atas flip. - Ctrl- lsekarang menghapus halaman terakhir sejarah.
Apakah ada cara untuk menghindari masalah ini, selain dari forking XTerm?
clear
perintah.Jawaban:
Jika menggunakan
bash
, yang berikut ini harus melakukan trik:Atau (kurang efisien karena menjalankan satu
tput
perintah sebelum setiap prompt, tetapi berfungsi setelah jendela terminal diubah ukurannya):Untuk mencegah
tput
perubahan kode keluar, Anda dapat secara eksplisit menyimpan dan meresetnya:Perhatikan bahwa variabelnya
retval
adalah lokal; itu tidak mempengaruhiretval
variabel apa pun yang mungkin telah Anda tetapkan di shell.Karena sebagian besar
cup
kemampuan terminal adalah sama\e[y;xH
, Anda juga dapat melakukan hardcode:Jika Anda ingin aman dari pengaturan ulang PS1 nanti, Anda juga dapat menggunakan
PROMPT_COMMAND
variabel. Jika diatur, dijalankan sebagai perintah sebelum prompt ditampilkan. Jadi efeknya juga bisa dicapai olehTentu saja, walaupun pengaturan ulang
PS1
tidak akan memengaruhi ini, beberapa perangkat lunak lain mungkin juga berubahPROMPT_COMMAND
.sumber
tput
berbeda dari banyakecho
perintah? (Bertanya karena penasaran)'\[$(tput cup "$LINES")\]'
bekerja dengan indah . Terima kasih!tput
: Tampaknya reset$exit_code
. Diperbaiki dengan menggunakan\[\e[$LINES;1H\]
.tput
yang mempertahankan kode keluar.Sebagai sedikit penyederhanaan dari jawaban sebelumnya, saya merasa lebih mudah untuk hanya menjalankan:
di awal
.bashrc
atau.zshrc
. Itu hanya melakukan pekerjaan.Pro:
Cons:
clear
untukclear; tput ...
tidak membantu;sumber
Jawaban menggunakan
$LINES
tidak perlu portabel. Seperti yang dilakukan dalamresize
, Anda hanya dapat memintaxterm
untuk mengatur posisi ke nomor baris besar yang sewenang-wenang, misalnya,(dengan asumsi bahwa Anda memiliki jendela lebih kecil dari 10 ribu baris, mengabaikan scrollback ).
Karena string tidak akan berubah sebagai efek samping dari mengubah ukuran jendela, Anda dapat menghitung ini sekali, dan menempelkannya ke string-cepat Anda sebagai konstanta, misalnya,
dan kemudian
sesuai dengan preferensi Anda.
Adapun proses lain memodifikasi
PS1
: Anda harus menghitung ulangPS1
setelah perubahan itu, untuk memastikan bahwa itu terlihat seperti yang Anda inginkan. Tetapi tidak ada cukup detail dalam pertanyaan untuk menunjukkan di mana harus melakukan perubahan.Dan akhirnya: perilaku untuk penyelesaian tab tidak cocok dengan perubahan semacam ini, karena asumsi bash.
sumber
PS1="${TPUT_END} myprompt: "
, atau bahkanPS1="${TPUT_END}${PS1}"