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).

Abonec
sumber
Aneh. Ia bekerja tanpa masalah pada RedHat 5 dan Mac OS X
Matteo
kemungkinan duplikat masalah PS1, cmd adalah perulangan
grawity

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 \] "
grawity
sumber
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.

buah Batu
sumber
Apakah Anda tahu tentang "__git_ps1"?
rafak
nggak. hal ajaib apa yang akan dilakukannya?
stonefruit