Linux: pewarnaan bash prompt akan merusak carriage return


23

Ketika saya mencoba untuk mewarnai bashprompt seperti ini:

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

itu merusak carriage return (alih-alih pergi ke baris baru ketika baris penuh, itu mulai di baris yang sama dan menghapus teks input).

Jika saya menghapus urutan warna itu berfungsi dengan baik.
Saya menggunakan Ubuntu 11.10 dan terminal (guake juga memiliki bug yang sama).


Aneh. Ia bekerja tanpa masalah pada RedHat 5 dan Mac OS X
Matteo

Jawaban:


41

Anda harus membungkus semua urutan escape antara \[dan \]agar 'readline' untuk menghitung panjang terlihat prompt dengan benar. Tanpa mereka, 'readline' mengira prompt lebih panjang dari itu, dan tidak tahu kapan teks mencapai margin.

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \] "

4
Terima kasih banyak!! Saya mencoba untuk menemukan beberapa dokumentasi di dokumen resmi tapi tidak bisa - 'stock' color prompt menggunakan 'trik' ini dan saya mengalami kesulitan pada awalnya mencari tahu untuk apa sebenarnya itu, jadi terima kasih telah menjelaskannya. up --- btw saya benar-benar menemukan sumber dokumentasi di 'man readline 3' di sekitar baris 684 dan dikatakan bahwa ini sebenarnya disebut 'skip-csi-sequence' bagi mereka yang ingin tahu di mana dokumentasi mengenai hal ini. Saya tidak berpikir saya akan menemukannya tanpa Anda mengarahkan saya ke readline (3) meskipun saya tahu tentang itu sebelumnya-gagal membuat koneksi.
osirisgothra

Apa artinya "membungkus"? Apakah Anda berarti membungkus semuanya IN sebuah \[, \]? Saya kira begitu, tetapi sepertinya itu tidak berhasil untuk saya.
Max Howell

2
@osirisgothra: Dokumentasi sebenarnya berbicara tentang hal yang berbeda - skip-csi-sequencedimaksudkan untuk menekan urutan input yang dihasilkan oleh kunci khusus.
grawity

1
@ MaxHowell Anda harus membungkus setiap \e[xxmurutan, bukan seluruh string.
Enrico

Terima kasih. Dalam kasus saya saya hanya mengganti \e[39mdengan \[\e[;39m\]dan bekerja dengan baik
Herrgott

1

ujung [dan] bekerja pada bash pada OS X 10.8.2 juga.

Saya menggunakan:

PS1 = "[\ e [0; 37m \ W \ $ (cabang git 2> / dev / null | grep -e '*' | sed 's / ^ .. (. *) / {\ 1} /') \ $ \ e [m] "

yang menunjukkan cabang git saya saat ini digunakan.


Apakah Anda tahu tentang "__git_ps1"?
rafak

nggak. hal ajaib apa yang akan dilakukannya?
stonefruit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.