Saya yakin bahwa saya telah melihat seseorang memiliki bagian dari prompt mereka disejajarkan ke kanan di jendela terminal mereka dan kemudian mulai kursor aktual pada baris kedua. Saya tahu bahwa saya dapat mencapai baris kedua dengan "\ n" di PS1, tetapi saya tidak tahu bagaimana menyelaraskan bagiannya ke kanan. Apakah yang saya lihat hanya spasi kosong yang ditambahkan di antara kedua string?
sumber
.inputrc
adaset show-mode-in-prompt on
. Kedua tidak menghitung panjang non-prinable kode ANSI CSI , dan tidak benar menyertakan mereka dalam\[
dan\]
seperti yang disebutkan oleh @Mu Mind. Lihat jawaban ini untuk resolusi.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:Saya menggunakan
tput cols
di Mac OS X untuk mengambil lebar terminal / konsol dariterminfo
sejak$COLUMNS
var saya tidak terisienv
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.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.nJoy!
sumber
Menggunakan
printf
dengan$COLUMNS
bekerja dengan sangat baik, sesuatu seperti:Itu benar dibenarkan untuk saya.
sumber
Berikut ini akan menempatkan tanggal dan waktu saat ini di RED pada RHS terminal.
Keuntungan:
shellcheck
bersih..inputrc
sudahset show-mode-in-prompt on
.\[
dan\]
sehingga mengedit teks yang dimasukkan pada prompt tidak menyebabkan prompt untuk mencetak ulang dengan aneh.Catatan : Anda harus memastikan bahwa urutan warna apa pun dalam
$PS1
sebelum kode ini dikeluarkan dilampirkan dengan benar\[
dan\]
dan tidak ada penumpukannya .sumber
bash: local: can only be used in a function
, yang sepele untuk diperbaiki, dan setelah itu, ia tidak menunjukkan apa-apa karenaCOLUMNS
tidak didefinisikan: ia harus diganti dengan$(tput cols)
. hasil yang sama jika potongan disimpan pada file yang berbeda, dan kemudian bersumber ke.bashrc
.tput cols
jika$COLUMNS
tidak disetel. Dan ya, kode ini harus berada di dalam suatu fungsi. Saya menggunakanPROMPT_COMMAND='_prompt_bash_set'
dan memberi nama fungsinya_prompt_bash_set
.Saya hanya berpikir saya akan melemparkan milik saya di sini. Ini hampir persis sama dengan GRML zsh prompt (kecuali pembaruan zsh itu meminta sedikit lebih baik pada baris baru dan ruang belakang - yang tidak mungkin untuk direplikasi dalam bash ... well sangat sulit pada titik waktu ini, setidaknya).
Saya menghabiskan tiga hari yang baik untuk ini (hanya diuji pada laptop yang menjalankan lengkungan), jadi inilah screenshot dan kemudian hal-hal yang terjadi di ~ / .bashrc saya :)
peringatan - ini sedikit gila
selain penting - setiap
^[
(seperti^[[34m
) benar-benar karakter pelarian(char)27
. Satu-satunya cara saya tahu cara memasukkan ini adalah dengan memasukkan ctrl+ ( [v) (yaitu tekan keduanya [dan vsaat ctrlditekan.Saya masih berusaha membuat warna-warna tersebut dapat dikonfigurasi, tetapi saya senang dengan warnanya seperti sekarang.
Saat ini sedang mengerjakan perbaikan untuk
^[
karakter gila dan pergantian warna yang mudah :)sumber
Anda dapat menggunakan
printf
untuk melakukan perataan kanan:sumber
Menambahkan pada jawaban Giles', saya menulis sesuatu untuk menangani warna yang lebih baik (asalkan mereka benar tertutup dalam
\[
dan\]
. Ini yang kasus per kasus dan tidak menangani setiap kasus, tetapi membuat saya dapat mengatur PS1L saya di sintaks yang sama seperti PS1 dan menggunakan tanggal (tidak berwarna) sebagai PS1R.Ini dia di github: dbarnett / dotfiles / right_prompt.sh . Saya menggunakannya di .bashrc saya seperti ini:
Catatan: Saya juga menambahkan baris baru setelah PS1R, yang tidak membuat perbedaan visual, tetapi sepertinya menjaga agar prompt tidak rusak jika Anda menggulir kembali melalui perintah tertentu dalam riwayat perintah Anda.
Saya yakin orang lain dapat memperbaiki ini, dan mungkin menggeneralisasi beberapa kasus khusus.
sumber
Berikut adalah solusi berdasarkan
PROMPT_COMMAND
dantput
:Keajaiban dilakukan oleh:
Yang dipecah oleh:
Di PS1,
tput
diloloskan dengan \ [\] sehingga tidak dihitung dalam panjang yang ditampilkan.sumber