Beralih format string prompt terminal gnome dengan perintah?

9

Terminal saya memiliki format prompt default seperti ini:

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

Kode yang menghasilkannya terlihat seperti 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 memutus garis. Dalam kasus seperti itu saya lebih suka format yang menghasilkan string lebih pendek seperti ini:

username @ boxname current_dir_name $

Kode yang memproduksinya 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\]'

Adakah yang tahu bagaimana saya dapat dengan mudah beralih format jendela terminal saat ini dari satu gaya ke yang lain hanya dengan mengetik misalnya prompttoggle:?

Rotareti
sumber
6
Apakah Anda mengetahui parameter PROMPT_DIRTRIM bash ?
steeldriver
@steeldriver tidak sampai sekarang. Beralih antara PROMPT_DIRTRIM=0dan PROMPT_DIRTRIM=1tampaknya lebih sederhana daripada beralih antara nilai yang berbeda untuk PS1dan hasilnya hampir sama. Terimakasih atas infonya!
Rotareti
Menggunakan PROMPT_DIRTRIMsatu juga bisa menambahkan argumen ke perintah. Jika Anda tidak memberikan argumen, Anda beralih di antara PROMPT_DIRTRIM=0dan PROMPT_DIRTRIM=1dan jika Anda memberikan nomor sebagai argumen yang Anda tetapkan PROMPT_DIRTRIMuntuk itu. promptlenakan menjadi nama yang lebih tepat untuk perintah itu.
Rotareti

Jawaban:

10

Simpan PS1variabel panjang dan pendek Anda dengan nama yang 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 satu dari mereka pada awalnya:

PS1="$PS1long"

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

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

Menambahkan keempat baris ke ~/.bashrcfile Anda akan melakukan perintah yang tersedia di sesi Bash Anda, berikut ini lagi untuk menyalin lebih mudah:

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'
Komandan Byte
sumber
7

Anda dapat menggunakan bashfungsi kecil :

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 $PS1berisi basename, jika ya, maka PS1tanpa basenamediatur jika tidak maka dengan basenameyang diatur.

Masukkan fungsi Anda ~/.bashrcuntuk 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 $
heemayl
sumber
5

Atau ... buat dua fungsi yang sangat kecil dan tambahkan di akhir 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 prompt singkat, ketik promptshort, untuk kembali ke path lengkap, ketikpromptlong

\Wmenunjukkan direktori kerja saat ini hanya begitu $(basename ${PWD})berlebihan

Anda dapat menggabungkan menjadi satu fungsi tetapi "panjang" dan "pendek" bersifat deskriptif dan keduanya memiliki penekanan tombol lebih sedikit daripada "beralih";)

Alih-alih menambahkan baris untuk menimpa PS1 saya lebih memilih untuk mengubah kode yang menetapkannya (misalnya, batalkan komentar force_color_prompt=yesdan edit baris setelah [ "$color_prompt" = yes ]; then)

Zanna
sumber
3

Berikut adalah ~/.bashrcdefinisi fungsi yang saya pribadi gunakan untuk mengatur ulang / mengganti prompt saya dari prompt biasa menjadi adil $. Sesuaikan dengan kebutuhan sesuai kebutuhan Anda.

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

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

Saya memecahkan masalah ini tahun lalu dengan prompt ini:

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

Apa yang dilakukan:

  1. output nilai keluar dari perintah sebelumnya (ini sangat berguna)
  2. output pengguna saat ini dan host dalam satu warna
  3. output direktori kerja dalam 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 dengan benar ketika Anda berada dalam struktur direktori yang dalam, tidak memotong-motong garis pengetikan dengan kode warna (menghindari bug aneh yang kadang-kadang terjadi), sambil tetap memberi Anda warna petunjuk tentang di mana output dari satu perintah berakhir dan yang berikutnya dimulai:

masukkan deskripsi gambar di sini

Tobia
sumber