Dalam sistem dengan Ubuntu 14.04 dan bash
, saya memiliki PS1
variabel yang diakhiri dengan konten berikut:
\u@\h:\w\$
sehingga muncul prompt sebagai
user@machinename:/home/mydirectory$
Kadang-kadang, bagaimanapun, direktori saat ini memiliki nama panjang, atau berada di dalam direktori dengan nama panjang, sehingga muncul prompt
user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$
Ini akan mengisi baris di terminal dan kursor akan pergi ke baris lain, yang menjengkelkan.
Sebagai gantinya saya ingin mendapatkan sesuatu seperti
user@machinename:/home/mydirectory1/...another_long_name$
Apakah ada cara untuk mendefinisikan PS1
variabel untuk "membungkus" dan "memadatkan" nama direktori, untuk tidak pernah melebihi jumlah karakter tertentu, memperoleh prompt yang lebih pendek?
Jawaban:
Pertama-tama, Anda mungkin hanya ingin mengubah
\w
dengan\W
. Dengan begitu, hanya nama direktori saat ini yang dicetak dan bukan seluruh lintasannya:Itu mungkin masih belum cukup jika nama direktori itu terlalu panjang. Dalam hal ini, Anda dapat menggunakan
PROMPT_COMMAND
variabel untuk ini. Ini adalah variabel bash khusus yang nilainya dieksekusi sebagai perintah sebelum setiap prompt ditampilkan. Jadi, jika Anda menyetelnya ke fungsi yang menetapkan permintaan yang Anda inginkan berdasarkan pada lintasan direktori Anda saat ini, Anda bisa mendapatkan efek yang Anda cari. Misalnya, tambahkan baris ini ke~/.bashrc
:Efeknya terlihat seperti ini:
sumber
Menambahkan kembali karakter adalah solusi utama saya untuk ini
Jadi prompt saya (yang memiliki hal lain juga, membuatnya lebih lama) terlihat seperti ini:
Anda akan melihat bahwa $ akan dikembalikan sebagai baris baru
Saya mencapai ini dengan
Perhatikan bahwa, meskipun pada baris terpisah, pohon direktori super panjang seperti
/home/durrantm/Dropbox/96_2013_archive/work/code/ruby__rails
disingkat menjadiyaitu "3 direktori teratas / _ / dua direktori terbawah" yang biasanya saya pedulikan
Ini akan memastikan bahwa garis tidak pernah menjadi terlalu panjang karena panjang pohon direktori. Jika Anda selalu menginginkan pohon direktori lengkap, sesuaikan saja LOCATION, yaitu
sumber
$
? (Lihat ini .)Dibuat ~ / .bash_prompt:
Ditambahkan di ~ / .bash_profile saya:
Output adalah:
sumber
Bukan solusi untuk mempersingkat jalur yang panjang, tetapi cara yang mudah untuk mendapatkan gambaran umum yang lebih baik sambil menjaga agar semua informasi jalur tetap terlihat, menambahkan baris baru sebelum karakter terakhir. Dengan cara ini, kursor selalu dimulai di kolom yang sama, bahkan jika jalurnya cukup panjang untuk dililitkan, tetapi jendela konsol Anda harus cukup tinggi untuk tidak menggulirkan baris sebelumnya terlalu cepat. Saya menghapus kode warna untuk lebih jelas:
sumber
Saya menggunakan ini, ia membungkus ke beberapa baris dan indentasi dengan panjang
user@host
sehingga mengasumsikan arusPS1
secara efektif '\u@\h:\w$
'. Itu tidak memotong jalan, dan menyesuaikan dengan lebar terminal saat ini. Itu hanya membagi jalan/
, sehingga tidak elegan menangani direktori yang sangat panjang (tapi itu menghemat ruang untuk seleksi / salin). Itu memastikan Anda selalu memiliki setidaknya 20 karakter ruang yang tersedia untuk input.Ini berfungsi dengan mengeluarkan keajaiban
\w
(hanya cocok\w$
untuk ini)PS1
dan menggantinya$PWD
, lalu membungkusnya sebagai string karakter sederhana. Ini mengkomputasi ulangPS1
setiap kali dari nilai asli yang disimpan_PS1
, ini berarti lolos "tak terlihat" juga dipertahankan, string prompt penuh asli saya untukxterm
dan huruf tebal:Dan hasil akhirnya di terminal 80 kolom:
Ini berfungsi dari bash-3.2 seperti
printf -v var
yang digunakan. Karena berbagai kompleksitas itu perlu penyesuaian untuk variasi lainPS1
.(Jalur di bilah judul xterm tidak dibungkus atau disingkat, sesuatu yang bisa dilakukan dengan memasukkan salah satu jawaban lain di sini ke dalam fungsi di atas.)
sumber
Sebagai alternatif, di .zshrc saya menyingkat huruf pertama dari setiap direktori jika lebar piksel melebihi lebar tertentu:
menjadi:
Inilah fungsi zsh untuk melakukannya:
Saya benar-benar menggunakan ini untuk memperbarui judul terminal sehingga dengan banyak tab, saya bisa tetap tab mana. .Zshrc lengkap untuk melakukan ini ada di sini .
Ini sangat berguna karena menjaga konteks dan di zsh memungkinkan Anda untuk dengan cepat menabrak direktori dalam format yang sama. (mis. mengetik
cd /h/m/s/<tab>
akan otomatis terisi kecd /home/mydirectory1/second_directory
)sumber
Coba gunakan skrip Python ini . Itu memotong bagian individu dari nama path, persis seperti yang Anda inginkan dalam pertanyaan Anda. Ia juga menggunakan elipsis unicode yang hanya memakan satu kolom, bukan tiga.
Contoh output untuk jalur Anda (ketika diberi batas 30 karakter):
Perlu dicatat bahwa solusi ini menangani Unicode dengan benar dalam nama direktori dengan menggunakan
wcswidth
.${#PWD}
, yang jawaban lain telah gunakan, akan salah menilai lebar visual dari setiap jalur yang berisi karakter UTF-8.sumber