Pertanyaan Toggle format string prompt gnome terminal dengan perintah?


Terminal saya memiliki format prompt default seperti ini:

username @ boxname / path / to / current / direktori $

Kode yang menghasilkan terlihat seperti ini: (ini memiliki beberapa definisi warna juga)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

Jika jalur ke direktori saat ini terlalu lama, menjadi tidak menyenangkan untuk bekerja dengan terminal karena Anda terus-menerus melanggar jalur. Dalam kasus seperti itu saya lebih suka format yang menghasilkan string yang lebih pendek seperti ini:

username @ boxname current_dir_name $

Kode yang menghasilkannya akan terlihat seperti ini (sekali lagi dengan warna):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Apakah ada yang tahu bagaimana saya bisa dengan mudah mengubah format jendela terminal saat ini dari satu gaya ke gaya lainnya hanya dengan mengetik misalnya: prompttoggle?


9
2017-09-07 22:12


asal


Apakah Anda menyadari bash PROMPT_DIRTRIM parameter? - steeldriver
@steeldriver tidak sampai sekarang. Beralih antara PROMPT_DIRTRIM=0 dan PROMPT_DIRTRIM=1 tampak lebih sederhana daripada beralih antara nilai yang berbeda untuk PS1 dan hasilnya hampir sama. Terimakasih atas infonya! - Rotareti
Menggunakan PROMPT_DIRTRIM seseorang juga bisa menambahkan argumen ke perintah. Jika Anda tidak melewati argumen, Anda beralih di antara PROMPT_DIRTRIM=0 dan PROMPT_DIRTRIM=1 dan jika Anda memberikan angka sebagai argumen yang Anda tetapkan PROMPT_DIRTRIM untuk itu. promptlen akan menjadi nama yang lebih tepat untuk perintah itu. - Rotareti


Jawaban:


Simpan baik panjang maupun pendek Anda PS1 variabel dengan nama berbeda:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Pastikan untuk mengatur PS1ke salah satunya awalnya:

PS1="$PS1long"

Kemudian Anda dapat membuat alias seperti ini untuk beralih antara dua nilai PS1:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

Menambahkan keempat baris ke Anda ~/.bashrc file akan menerima perintah yang tersedia di sesi Bash Anda, di sini mereka lagi untuk memudahkan penyalinan:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

10
2017-09-07 22:21





Anda bisa menggunakan yang kecil bash fungsi:

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

Fungsi di atas cocok jika saat ini $PS1 mengandung basename, jika ya, maka PS1 tanpa basename diatur sebaliknya dengan satu basename diatur.

Masukkan fungsi ke dalam Anda ~/.bashrc untuk membuatnya tersedia di semua sesi interaktif.

Contoh:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

7
2017-09-07 22:20





Atau ... buat dua sangat fungsi kecil dan tambahkan ke ujung Anda ~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

untuk permintaan singkat, ketik promptshort, untuk kembali ke jalur lengkap, ketik promptlong

\W hanya menampilkan direktori kerja saat ini $(basename ${PWD}) adalah imho yang berlebihan

Anda dapat menggabungkan ke dalam satu fungsi tetapi "panjang" dan "pendek" bersifat deskriptif dan keduanya memiliki ketikan kurang dari "toggle";)

Alih-alih menambahkan baris untuk mengganti PS1 saya lebih suka mengubah kode yang mengaturnya (misalnya, tanda komentar force_color_prompt=yes dan edit baris setelahnya [ "$color_prompt" = yes ]; then)


5
2017-09-07 22:40





Ini a ~/.bashrc definisi fungsi yang saya pribadi gunakan untuk mereset / mengubah prompt saya dari prompt biasa menjadi adil $. Adaptasi seperlunya sesuai dengan kebutuhan Anda.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

3
2017-09-08 06:00





Ini adalah jawaban untuk masalah Anda (direktori panjang memecah baris perintah) dan tidak secara khusus untuk pertanyaan Anda (bagaimana mengubah command prompt dengan cepat.)

Saya memecahkan masalah ini bertahun-tahun yang lalu dengan prompt ini:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

Apa ini:

  1. output nilai keluar dari perintah sebelumnya (Ini sangat berguna)
  2. output pengguna dan host saat ini dalam satu warna
  3. menampilkan direktori kerja dengan warna lain (sesuaikan warna sesuai selera Anda)
  4. output dolar dan ruang pada baris baru, mengakhiri urutan warna sebelum jeda baris

Ini memberi Anda semua ruang yang Anda butuhkan untuk perintah Anda, tidak menggesernya tepat ketika Anda berada dalam struktur direktori yang dalam, tidak memotong baris pengetikan dengan kode warna (menghindari bug aneh yang terjadi kadang-kadang), sambil tetap memberi Anda warna petunjuk tentang di mana output dari satu perintah berakhir dan yang berikutnya dimulai:

enter image description here


1
2017-09-08 17:19