สลับรูปแบบของสตริงพรอมต์ terminal gnome ตามคำสั่งหรือไม่


9

เทอร์มินัลของฉันมีรูปแบบพร้อมท์เริ่มต้นดังนี้

ชื่อผู้ใช้ @ boxname / path / to / current / directory $

รหัสที่สร้างให้มีลักษณะดังนี้: (มีคำจำกัดความบางสีด้วย)

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

หากเส้นทางไปยังไดเรกทอรีปัจจุบันยาวเกินไปมันจะไม่เป็นที่พอใจเมื่อใช้งานกับเทอร์มินัลเนื่องจากคุณแบ่งสายอย่างต่อเนื่อง ในกรณีเช่นนี้ฉันต้องการรูปแบบที่สร้างสตริงที่สั้นกว่าเช่นนี้:

ชื่อผู้ใช้ @ boxname current_dir_name $

รหัสที่สร้างมันจะมีลักษณะเช่นนี้ (อีกครั้งด้วยสี):

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

ไม่มีใครทราบว่าฉันสามารถทำได้อย่างง่ายดายสลับรูปแบบของหน้าต่าง terminal ปัจจุบันจากรูปแบบหนึ่งไปที่อื่น ๆ โดยเพียงแค่พิมพ์ตัวอย่างเช่น: prompttoggle?


6
คุณทราบถึงพารามิเตอร์PROMPT_DIRTRIMของ bash หรือไม่
ขับขี่เหล็ก

@steeldriver ไม่ได้จนถึงตอนนี้ สลับไปมาระหว่างPROMPT_DIRTRIM=0และPROMPT_DIRTRIM=1ดูเหมือนง่ายกว่าสลับระหว่างค่าที่แตกต่างกันPS1และผลที่ได้เกือบเหมือนกัน ขอบคุณสำหรับข้อมูล!
Rotareti

การใช้งานPROMPT_DIRTRIMหนึ่งสามารถเพิ่มข้อโต้แย้งไปยังคำสั่ง หากคุณไม่ผ่านการโต้แย้งคุณสลับไปมาระหว่างPROMPT_DIRTRIM=0และPROMPT_DIRTRIM=1ถ้าคุณผ่านตัวเลขเป็นอาร์กิวเมนต์ที่คุณตั้งPROMPT_DIRTRIMไว้ promptlenจะเป็นชื่อที่เหมาะสมกว่าสำหรับคำสั่งนั้น
Rotareti

คำตอบ:


10

เก็บทั้งPS1ตัวแปรยาวและสั้นของคุณไว้ในชื่ออื่น:

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เป็นหนึ่งในนั้น:

PS1="$PS1long"

จากนั้นคุณสามารถสร้างนามแฝงเช่นนี้เพื่อสลับระหว่างค่า PS1 สองค่า:

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

การเพิ่มทั้งสี่บรรทัดลงใน~/.bashrcไฟล์ของคุณจะทำให้คำสั่งนั้นพร้อมใช้งานในเซสชัน Bash ของคุณนี่คืออีกครั้งเพื่อการคัดลอกที่ง่ายขึ้น:

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'

7

คุณสามารถใช้bashฟังก์ชั่นเล็ก ๆ:

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 ;}

ฟังก์ชั่นด้านบนตรงกับว่าปัจจุบัน$PS1มีbasenameถ้าใช่แล้วPS1โดยไม่มีการbasenameตั้งค่ามิฉะนั้นที่มีการbasenameตั้งค่า

ใส่ฟังก์ชั่นในของคุณ~/.bashrcเพื่อให้พร้อมใช้งานในเซสชันการโต้ตอบทั้งหมด

ตัวอย่าง:

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 $

5

หรือ ... ทำให้ทั้งสองมากฟังก์ชั่นขนาดเล็กและเพิ่มส่วนท้ายของคุณ~/.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') ; }

สำหรับพรอมต์ย่อให้พิมพ์promptshortเพื่อกลับไปที่เส้นทางแบบเต็มพิมพ์promptlong

\Wแสดงไดเร็กทอรีการทำงานปัจจุบันเท่านั้นดังนั้น$(basename ${PWD})overkill imho

คุณสามารถรวมเป็นหนึ่งฟังก์ชั่น แต่ "ยาว" และ "สั้น" เป็นคำอธิบายและทั้งสองมีการกดแป้นพิมพ์น้อยกว่า "สลับ";)

แทนที่จะเพิ่มบรรทัดเพื่อแทนที่ PS1 ฉันต้องการบิดโค้ดที่ตั้งไว้ (ตัวอย่างเช่นไม่force_color_prompt=yesใส่เครื่องหมายข้อคิดเห็นและแก้ไขบรรทัดหลัง[ "$color_prompt" = yes ]; then)


3

นี่คือ~/.bashrcนิยามฟังก์ชันว่าผมเองใช้เพื่อรีเซ็ต / $สลับพรอมต์ของฉันจากปกติพร้อมที่จะเป็นเพียงแค่ ปรับเปลี่ยนตามความจำเป็นเพื่อให้เหมาะกับความต้องการของคุณ

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

1

นี่คือคำตอบสำหรับปัญหาของคุณ (ไดเรกทอรียาวแบ่งบรรทัดคำสั่ง) และไม่เฉพาะคำถามของคุณ (วิธีการเปลี่ยนพรอมต์คำสั่งได้ทันที)

ฉันแก้ไขปัญหานี้เมื่อหลายปีก่อนด้วยพรอมต์นี้:

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

สิ่งนี้ทำอะไร:

  1. เอาท์พุทมูลค่าทางออกของคำสั่งก่อนหน้า(ซึ่งมีประโยชน์อย่างเหลือเชื่อ)
  2. เอาท์พุทผู้ใช้ปัจจุบันและโฮสต์ในสีเดียว
  3. ส่งออกไดเรกทอรีการทำงานในสีอื่น (ปรับสีให้เข้ากับรสนิยมของคุณ)
  4. เอาท์พุทดอลลาร์และพื้นที่บนบรรทัดใหม่สิ้นสุดลำดับสีก่อนที่จะแบ่งบรรทัด

สิ่งนี้จะให้พื้นที่ทั้งหมดที่คุณต้องการสำหรับคำสั่งของคุณไม่เปลี่ยนมันทันทีเมื่อคุณอยู่ในโครงสร้างไดเรกทอรีที่ลึกไม่ยุ่งเหยิงบรรทัดการพิมพ์ด้วยรหัสสี (หลีกเลี่ยงข้อผิดพลาดแปลก ๆ ที่เกิดขึ้นในบางครั้ง) บอกใบ้ว่าเอาต์พุตของคำสั่งเดียวจบลงที่ใดและคำสั่งถัดไปเริ่มขึ้น:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.