Garis panjang tumpang tindih di Bash PS1 custom prompt

13

Saya telah mengonfigurasi PS1bash prompt dua baris yang mewah , dengan nama server, waktu, nama pengguna, dan variabel berguna lainnya.

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

masukkan deskripsi gambar di sini

Sumber Github lengkap di sini .

Masalahnya adalah bahwa garis panjang sering melilit diri mereka sendiri, yang berarti bahwa baris baru tumpang tindih dengan yang sebelumnya.

Masalahnya tidak konsisten: beberapa garis dibungkus dengan benar, beberapa tidak.

Adakah cara untuk memperbaikinya?

Adam Matan
sumber

Jawaban:

16

Inilah PS1 dua baris mewah saya untuk bash prompt.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Jadi inilah yang saya lakukan. Jika ini warna saya:

\e[1;32m

Saya mengubahnya menjadi:

\[\e[1;32m\]

Pada dasarnya Anda perlu melampirkannya di:

\[$mycolor\]

Lihat jawaban ini .

varunyellina
sumber
+1 Terima kasih. Anehnya, sepertinya tidak berfungsi di mac.
Adam Matan
Anda seorang penyelamat! Adapun mac, Adam .. Kemungkinan besar karena jumlah kolom. Coba atur prompt ke hanya serangkaian karakter, seperti 'ini prompt saya:' dan lihat apakah masalahnya masih ada. Jika demikian, pengaturan kolom Anda pada terminal Anda terlalu lebar atau terlalu sempit.
Alex Summers
7

Menemukan solusi ini online, yang menyarankan tanda kurung tutup ke variabel warna:

Ubah ini:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

untuk:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

Saya telah melakukan perubahan - harapan itu berfungsi seperti yang diharapkan.

Adam Matan
sumber
1
tidak yakin apa yang harus dicapai ini. Anda perlu membungkus apa pun yang tidak memakan ruang (ansi-escapes) \[ \], jadi Anda tidak bisa hanya mengakhiri semua warna pelarian ansi dengan \]karena bagaimana jika tidak ada \[. Saat Anda memasukkan karakter yang tidak dapat dicetak, Anda harus membungkusnya \[ \](mis PS1='\[\e[32;1m\] green prompt \[\e[0m\] $'.).
dylnmc
Memang! Tanpa pembukaan \ [, ini akan menjadi prompt bagi kita pengguna linux. Mungkin berbeda untuk OSX? Aneh sekali. \ [dan \ e [ditafsirkan sebagai dua hal berbeda untuk linux. Yang pertama menunjukkan kepada bash bahwa urutan berikut ini tidak dapat dicetak dan tidak dihitung sebagai bagian dari karakter yang ditampilkan dari prompt. \ E [adalah braket pelarian untuk memulai skema warna ANSI.
Alex Summers
0

Solusi pilihan saya untuk masalah garis panjang tumpang tindih di bash PS1 adalah memiliki \ndi akhir baris cepat PS1.

misalnya

masukkan deskripsi gambar di sini

Jika Anda ingin semua hal saya yang lain - waktu, pengguna, host, direktori, dan cabang git (!) Anda dapat menggunakan ini (mac atau linux):

/unix//a/124012/10043

Michael Durrant
sumber
untuk cabang git Anda harus menggunakan if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Ini adalah standar ketika menempatkan git ke dalam skrip dan mengevaluasi nama cabang dari apa yang telah saya baca sebelumnya.
dylnmc