บังคับใช้ชื่อบนหน้าจอ GNU


9

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

แก้ไข: นี่คือpreexecฟังก์ชั่นที่ฉันพบในของฉัน.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi

คำตอบ:


9

ขึ้นอยู่กับวิธีการตั้งค่าสิ่งต่าง ๆ แต่โดยค่าเริ่มต้นสิ่งนี้จะทำงานได้

settitle() {
    printf "\033k$1\033\\"
}

จากนั้นเรียกใช้:

settitle NEWTITLE.

ดูเอกสารชื่อหน้าจอและหน้าจอ GNU คำถามที่พบบ่อยสำหรับรายละเอียดเพิ่มเติม

รับCtrl+ A Aจะเปลี่ยนมันจนกว่าคำสั่งต่อไปก็อาจจะถูกตั้งค่าโดย$PS1(เปลือกทั้งหมด) หรือ$PROMPT_COMMAND/ DEBUG trap(ทุบตีเท่านั้น) หรือprecmd/ preexec(zsh เท่านั้น)

คุณควรมองหาสถานที่\eหรือ\033ปรากฏขึ้นพร้อมกับkหรือ\\หลังจากที่มัน, พื้นเช่นฉันsettitleตัวอย่างข้างต้น

UPDATE

preexecคุณบอกว่าคุณมีกำหนดเอง

ทำไมไม่เปลี่ยนเป็น:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\\"
fi

จากนั้นคุณสามารถตั้งชื่อแบบกำหนดเองได้โดยเรียกใช้:

TITLE="my title"

และยกเลิกการตั้งชื่อโดยเรียกใช้

TITLE=

อย่าลืมเปลี่ยนprecmdและ$PS1ถ้าจำเป็น

นอกเหนือ

คุณยังสามารถขยายนี้เพื่อทุกขั้ว (เช่นxterm, gnome-terminalฯลฯ ) โดยไม่ยากเข้ารหัสและ\ek\e\\

นี่คือวิธีที่ฉันทำ:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='\033]0;'
        titlefinish='\007'
        ;;
    cygwin)
        titlestart='\033];'
        titlefinish='\007'
        ;;
    konsole)
        titlestart='\033]30;'
        titlefinish='\007'
        ;;
    screen*)
        # status line
        #titlestart='\033_'
        #titlefinish='\033\'
        # window title
        titlestart='\033k'
        titlefinish='\033\'
        ;;
    *)
        if type tput >/dev/null 2>&1
        then
            if tput longname >/dev/null 2>&1
            then
                titlestart="$(tput tsl)"
                titlefinish="$(tput fsl)"
            fi
        else
            titlestart=''
            titlefinish=''
        fi
        ;;
    esac
}


# or put it inside a case $- in *i* guard
if test -t 0; then
    terminit
fi

# set the xterm/screen/etc. title
settitle()
{
    test -z "${titlestart}" && return 0

    printf "${titlestart}$*${titlefinish}"
}

จากนั้นคุณสามารถเปลี่ยนpreexecเป็น:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi

Ctrl-A Aคำสั่งที่คุณให้ไม่ตรงกับสิ่งเดียวกับ และเกี่ยวกับพรอมต์คุณหมายถึงฉันต้องแก้ไข$PS1ทุกครั้งที่ฉันต้องการให้ชื่อไม่เปลี่ยนแปลง?
gregseth

ฉันหมายถึงตรวจสอบว่าไม่มี ESC k สิ่งที่ ESC \ เหมือนกัน PROMPT_COMMAND
มิเคล

ESC สามารถเขียนหรือ\e \033
มิเคล

ลิงก์ชื่อเอกสารหน้าจอควรมีข้อมูลที่จำเป็น
Mikel

5

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

ถ้าคำสั่งจะปรากฏเป็นชื่อเรื่องของหน้าต่างในขณะที่คำสั่งจะถูกทำงานนี้จะทำโดยpreexecฟังก์ชั่น (ใน zsh) หรือการจำลองดังกล่าวอยู่ภายใต้การทุบตี

หากหัวเรื่องเปลี่ยนไปเมื่อคำสั่งแต่ละคำสั่งเสร็จสิ้นฟังก์ชันนี้จะทำโดยprecmdฟังก์ชันใน zsh PROMPT_COMMANDพารามิเตอร์ใน bash หรือเป็นส่วนหนึ่งของพรอมต์ ( PS1พารามิเตอร์) ในเชลล์ใด ๆ (คำสั่งเพื่อเปลี่ยนหัวเรื่องเป็นลำดับการยกเว้นที่ปล่อยออกมาโดยแอปพลิเคชันใด ๆ ซึ่งเป็นส่วนหนึ่งของเอาต์พุตสตรีมของเทอร์มินัลดังนั้นจึงสามารถฝังในพรอมต์ได้)

มองหาลำดับหนีเช่น\e]0;new title\a, \e]2;new title\aหรือ\eknew title\e\\ในแฟ้มการเตรียมเปลือกของคุณ ( ~/.bashrc, ~/.zshrc, ... ) ถ้ามีอะไรที่เกี่ยวข้องการตั้งค่าอาจจะอยู่ในระบบแฟ้ม (เช่น/etc/bash.bashrc, /etc/zsh/zshrc); จากนั้นเขียนทับพารามิเตอร์หรือฟังก์ชันนั้นในไฟล์เริ่มต้นของคุณเอง

ดูคำตอบของ Mikelสำหรับการตั้งค่าชื่อที่สามารถเอาชนะpreexecได้


ขอบคุณคุณทำให้มันชัดเจนมาก ฉันได้พบpreexecฟังก์ชั่นที่กำหนดใน. zshrc ของฉันแล้ว นั่นคือพฤติกรรมที่ฉันต้องการ ... ส่วนใหญ่แล้ว ฉันต้องการที่จะปิดการใช้งานได้ทันทีบนหน้าจอที่เฉพาะเจาะจง อาจมีตัวแปรที่ฉันสามารถรับpreexecฟังก์ชั่นเมื่อฉันตั้งชื่อด้วยตนเองหรืออะไรแบบนั้น
gregseth

@ การชุมนุม: มันยากที่จะอธิบายโดยทั่วไป แต่ถ้าคุณโพสต์preexecฟังก์ชั่นของคุณฉันหรือคนอื่นอาจจะแนะนำการเปลี่ยนแปลงที่เรียบง่าย
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

ผมกำลังจะพูดถึงแต่เกร็กไม่ได้บอกว่าเขากำลังใช้preexec zshนั่นจะสอนฉัน ;-)
มิเคล

@ Mikel: คำอธิบายของฉันดีกว่าของคุณ แต่preexecการออกแบบใหม่ของคุณดีกว่าของฉัน
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

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