ตั้งค่าชื่อหน้าต่าง xterm (PuTTY) เมื่อใช้หน้าจอหรือไม่


12

ฉันพยายามที่screenจะตั้งxtermชื่อของฉัน ฉันมีการทำงานนอกscreenนี้ แต่screenเก็บชื่ออะไรไว้ในที่เมื่อฉันเริ่มมัน นี่คือของฉัน.bashrc:

ฟังก์ชัน bash_prompt_command () {
    # ควรเก็บจำนวนอักขระของ $ PWD กี่ตัว
    pwdmaxlen ท้องถิ่น = 25
    # ระบุว่ามีการตัดทอนโดย dir
    local trunc_symbol = ".. "
    local dir = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    local pwdoffset = $ (($ {# NEW_PWD} - pwdmaxlen))
    ถ้า [$ {pwdoffset} -gt "0"]
    แล้วก็
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    Fi

    ส่งออก NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# แผนภูมิสี @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
กรณี "$ {TERM}" ใน
    "xterm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {titlebar} \ [\ E [1; 32m \] [\ E [0; 36m \] \ U \ E [1; 32m \] @ \ E [1; 33m \] \ H \ E [ 1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
        ;;
    "หน้าจอ")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ เอก \ E \\\]
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ $ {ESC} \ [\ e [0m "
        ;;
    *)
        PS1 = "\ [\ E [1; 32m \] [\ E [0; 36m \] \ U \ E [1; 32m \] @ \ E [1; 33m \] \ H \ E [1; 32m \ ]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
    ;;
esac

และนี่คือของฉัน.screenrc:

hardstatus alwayslastline
สตริง hardstatus '% {= kg} [% {Y}% H% {g}] [% =% {= kw}%?% - Lw%?% {= b kR} (% {W}% n-% t%? (% u)%?% {= b kR})% {= kw}%?% + Lw%?%?% =% {g}] [% {Y}% l% {g}]% {g} [% {B}% m.% d.% Y% {G}% c% {g}] '

termcapinfo xterm | xterms | xs | rxvt ti @: te @
termcapinfo xterm 'hs: ts = \ E] 2;: fs = \ 007: ds = \ E] 2; หน้าจอ \ 007'

เปิดหน้าจอ
shelltitle '$ | bash'

ฉันทำอะไรผิด

Update (19 สิงหาคม 2010):alwayslastlineปัญหาคือว่าคุณไม่สามารถอัปเดตชื่อของสถานีจากภายในหน้าจอเมื่อคุณตั้งค่า ดังนั้นวิธีการแก้ปัญหาของฉันคือเพียงแค่ยอมแพ้และตั้งชื่อเรื่องที่มีประโยชน์และกำหนดไว้ล่วงหน้าสำหรับเซสชันหน้าจอของฉัน ฉันมีการปรับปรุง.bashrcและ.screenrcสามารถพบได้ที่http://bitbucket.org/jsumners/rcfiles/src

คำตอบ:


4

รหัสหลบหนีมีหน้าจอที่แตกต่างกันภายใน

ด้านนอกของหน้าจอนี้:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

เทียบเท่ากับหน้าจอภายในนี้:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

การเปลี่ยนเคสของคุณ $ {TERM} = "screen" titlebar เป็น

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

จะแก้ปัญหาของคุณ


มันไม่ทำงาน ฉันไม่เข้าใจว่าทำไม
เจมส์ Sumners

ฉันได้พิจารณาแล้วว่าการตั้งค่าhardstatus alwayslastlineที่ฉันทำเพื่อscreenป้องกันscreenการตั้งxtermชื่อ ทีนี้ถ้าฉันแค่หาวิธีทำทั้งสองอย่างในเวลาเดียวกัน
James Sumners

เป็นเพราะ hardstatus ของคุณมี% t (สำหรับชื่อเรื่อง) อยู่หรือเปล่า?
crb

Nope เพิ่งลบออกและรับผลลัพธ์เดียวกัน ฉันเชื่อว่าฉันจะต้องตั้งชื่อแทนสำหรับการscreenตั้งชื่อหน้าต่างแล้วเปิดตัวโปรแกรม screenแล้วก็ให้ขึ้นไปบนชื่อสถานีแบบไดนามิกในขณะที่ใช้ :(
James Sumners

1
bugs.launchpad.net/byobu/+bug/338722/comments/10บอกว่ามันเป็นข้อ จำกัด ในหน้าจอ
agnul

7

ที่จริงแล้วมีวิธีการส่ง escape sequences โดยตรงไปที่ xterm ผ่านหน้าจอ มันไม่ง่ายที่จะหา แต่จากรหัสหน้าจอ (src / ansi.c) ฉันคิดว่ามันอยู่ที่นั่นมาตั้งแต่ปี 2005 ฉันทำงานใน xterm, Gnome Terminal และ putty ฉันพบบันทึกย่อในแหล่ง mintty ที่ระบุว่าไม่ได้ทำงานที่นั่นเพียงเพราะพวกเขาไม่ได้จัดการ DCS (เว้นแต่จะได้รับการแก้ไขล่าสุด)

จากเอกสารสำหรับหน้าจอด้านล่าง (ที่http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html )

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.

ANSI DCS (สตริงควบคุมอุปกรณ์) เป็นรหัสหลบหนีที่ใช้ในการส่งโดยตรงไปยังเทอร์มินัล (ฉันคิดว่านั่นเป็นจุดประสงค์ดั้งเดิมจากหลายปีที่ผ่านมา) สตริงดังกล่าวถูกยกเลิกด้วยรหัสยกเว้น ST (String Terminator)

ล้อมรอบสตริงเพื่อตั้งค่าชื่อหน้าต่างของเทอร์มินัลภายในบล็อก DCS..ST และผ่านหน้าจอและอัปเดตอย่างถูกต้องแม้กับ hardstatus alwayslastline

DCS = \ 033P, ST = \ 033 \

ตัวอย่าง - เพื่ออัปเดตชื่อหน้าต่างด้วยไดเรกทอรีการทำงานปัจจุบันให้ใช้

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

มาสายดีกว่าไม่มาเลย! หวังว่านี่จะช่วยใครซักคน

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

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c

1

crb เป็นชนิดที่ถูกต้อง แต่

ก) รหัสหลบหนีที่เขาใช้ไม่ได้ผลสำหรับฉัน มันควรจะเป็นแทน\033k \033_ดูภายใต้screen (1) "TITLES (naming windows)"ดังนั้นควรเป็น:

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

b) การหลบหนีประเภทนี้ใช้สำหรับตั้งชื่อหน้าจอหน้าต่างเท่านั้น อินสแตนซ์หนึ่งของหน้าจอสามารถมีหลาย windows แต่ละหน้าต่างมีชื่อนั่นคือสิ่งที่จะแสดงในhardstatusและcaptionมีtลำดับหนี

c) bash escaping ปกติจะทำงานถ้าคุณตั้งค่า terminfo ที่เหมาะสมสำหรับ xterm ใน.screenrc:

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(นี้ยังworks on my machineสำหรับผงสำหรับอุดรู)

ดังนั้นในการตั้งชื่อที่ถูกต้องสำหรับทั้งหน้าจอหน้าต่างและชื่อเรื่องโป๊ว / xterm ฉันใช้ someting เช่น:

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

สำหรับการอ้างอิง: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html


1

ฉันจะไม่ตอบคำถามทั้งหมด แต่ให้ฉันแนะนำวิธีการแก้ปัญหา ตัวจัดการหน้าต่างหลายตัวรองรับข้อกำหนดของEWMH นอกจากนี้ยังมีเครื่องมือบรรทัดคำสั่งwmctrlที่สามารถโต้ตอบกับพวกเขา การใช้เครื่องมือนี้อาจเปลี่ยนชื่อหน้าต่างที่ใช้งานได้อย่างง่ายดายด้วยคำสั่งต่อไปนี้:

  wmctrl -r :ACTIVE: -T "FooTitle"

นอกจากนี้ยังเป็นไปได้ที่จะเปลี่ยนไอคอนหน้าต่างเค้าโครงและคุณสมบัติอื่น ๆ เครื่องมือนี้อาจไม่ทำงานกับ PuTTY เนื่องจาก Windows ไม่รองรับ EWMH แต่ระบบ Linux ส่วนใหญ่ควรยอมรับ

ด้วยวิธีนี้มันไม่สำคัญว่าคุณจะใช้screenหรือไม่


0

2 สัปดาห์ที่ผ่านมาฉันได้ค้นหาฟอรัมมากมายและฉันไม่พบคำตอบของคำถาม:

วิธีรับเอาท์พุทคำสั่งทั้งหมดไปที่ชื่อเรื่อง

จำเป็นสำหรับโปรแกรมอื่น ๆ ที่จะรู้ว่าเมื่องานบางอย่างบนเซิร์ฟเวอร์เสร็จและถูกหรือผิด Plink stdout และ stdin ไม่ทำงานฉันใช้ tweaks มากมายกับการรอคอยที่ล่าช้าและสำหรับบางคำสั่งที่ใช้กับคนอื่นไม่ได้ ไม่สามารถติดตั้ง XSEL และ XCLIP บนเซิร์ฟเวอร์นั้น

ดังนั้นนี่คือทางออก:

  1. รับเอาต์พุตคำสั่งในไฟล์
  2. สะท้อนไฟล์นั้นไปที่ชื่อ

สำหรับลูกค้าที่ฉาบและเซิร์ฟเวอร์ suse จะมีลักษณะเช่นนี้:

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

หวังว่าบางคนจะสามารถใช้สิ่งนี้ได้ มันไม่สามารถใช้ได้กับการตั้งค่าเซิร์ฟเวอร์ทุกประเภทและการตั้งค่าไคลเอนต์แบบฉาบ แต่แนวคิดควรใช้งานได้ดี

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