Berdasarkan informasi yang saya temukan di sini, saya dapat menemukan solusi yang lebih sederhana untuk menyelaraskan ke kanan sambil mengakomodasi konten panjang variabel di kanan atau kiri termasuk dukungan untuk warna. Ditambahkan di sini untuk kenyamanan Anda ...
Catatan tentang warna: menggunakan \033
pelarian yang mendukung alternatif, tanpa \[\]
pengelompokan, terbukti paling kompatibel dan karenanya direkomendasikan.
Caranya adalah dengan menulis sisi kanan terlebih dahulu, kemudian gunakan carriage return ( \r
) untuk kembali ke garis awal dan terus menimpa konten sisi kiri di atas itu, sebagai berikut:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Saya menggunakan tput cols
di Mac OS X untuk mengambil lebar terminal / konsol dari terminfo
sejak $COLUMNS
var saya tidak terisi env
tetapi Anda dapat mengganti " *
" nilai yang bisa diganti %*s
dengan, dengan memberikan " ${COLUMNS}
", atau nilai lain yang Anda inginkan.
Contoh berikut digunakan $RANDOM
untuk menghasilkan konten dengan panjang yang berbeda termasuk warna dan menunjukkan bagaimana Anda dapat mengekstrak fungsi untuk menolak implementasi untuk fungsi yang dapat digunakan kembali.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Karena printf
menganggap panjang string sebagai # karakter yang kita butuhkan untuk mengkompensasi jumlah karakter yang diperlukan untuk merender warna, Anda akan menemukan selalu pendek dari ujung layar karena karakter ANSI yang tidak dicetak tanpa kompensasi. Karakter yang diperlukan untuk warna tetap konstan dan Anda akan menemukan bahwa printf juga memperhitungkan perubahan panjangnya, seperti yang dikembalikan oleh $RANDOM
misalnya ', yang menjaga perataan kanan kita tetap dalam kebijakan.
Hal ini tidak terjadi dengan urutan yang cepat escape pesta khusus (yaitu. \u
, \w
, \h
, \t
) Meskipun, karena ini hanya akan mencatat panjang 2 karena pesta hanya akan menerjemahkan mereka ketika prompt ditampilkan, setelah printf telah memberikan string. Ini tidak memengaruhi sisi kiri tetapi lebih baik menghindarinya di sisi kanan.
Tidak ada konsekuensi jika konten yang dihasilkan akan tetap pada panjang konstan. Seperti dengan \t
opsi waktu yang akan selalu memberikan jumlah karakter yang sama (8) selama 24 kali. Kita hanya perlu memperhitungkan kompensasi yang diperlukan untuk mengakomodasi perbedaan antara 2 karakter yang dihitung yang menghasilkan 8 karakter saat dicetak, dalam kasus ini.
Ingatlah bahwa Anda mungkin perlu meloloskan diri dari \\\
beberapa urutan pelarian yang dinyatakan memiliki arti pada string. Seperti contoh berikut ini, direktori aktif saat \w
ini tidak memiliki arti lain sehingga berfungsi seperti yang diharapkan tetapi waktu \t
, yang berarti karakter tab, tidak bekerja seperti yang diharapkan tanpa harus keluar terlebih dahulu.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!