คุณต้องมีสองชุดคำสั่งเพื่อทำความสะอาด:
ก่อนอื่นให้เรียกใช้สิ่งนี้ในหน้าต่างที่อ่านไม่ออก (ใช้งานได้แม้ในขณะที่คุณอยู่ssh
):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
จากนั้นเรียกใช้งานบนคอมพิวเตอร์ที่ทำงานtmux
(ทำงานได้ทั้งภายในและภายนอกtmux
):
คำสั่งต่อไปนี้มีผลกับทุกtmux
อินสแตนซ์ซึ่งอาจเปลี่ยนสถานะด้านซ้ายของมากกว่าหน้าต่างปัจจุบัน หากคุณไม่ต้องการฟีเจอร์นั้นให้ทิ้งมันไว้
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
อธิบายรายละเอียด
สิ่งนี้ถูกประกอบขึ้นเพื่อจัดการกับบิตทั้งหมดที่พบในคำตอบและความคิดเห็นอื่น ๆ ดูเหมือนว่าในขณะนี้จะมีเพียงเล็กน้อยที่เหลืออยู่กับคำสั่งที่สอง (ดูใน "บิตที่หายไป" ด้านล่าง)
เพื่อให้เข้าใจถึงวิธีการทำงานนี้ให้เราก่อนฆ่าบรรทัดสถานะของและtmux
tty
หลังจากนั้นเราแก้ไขให้ถูกต้องอีกครั้งโดยใช้วิธีที่ควรจะมีอยู่เสมอ (ต่างจากคำสั่งreset
)
วิธีทำให้tmux
เทอร์มินัล (ถือว่าUTF-8
) ใช้งานไม่ได้
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
คำเตือน:หลังจากรันคำสั่งข้างต้นเชลล์จะตาบอดและหูหนวกและดูเหมือนจะพูดพล่ามในภาษาต่างประเทศที่ไม่รู้จัก ดูด้านล่างเกี่ยวกับวิธีการซ่อมแซมนี้
อธิบาย:
stty -echo
ฆ่าการตอบสนองประเภทอาคารผู้โดยสาร
printf '\016'
ทำ a SO
ดังนั้นคุณอยู่ในชุดอักขระสำรอง
printf '\033]2;%s\007' 'right status text'
กำหนดสถานะที่ถูกต้องในกรณีนี้$'\355
'ซึ่งแสดงข้อผิดพลาดในการนำเสนอ
printf '\033k%2000s\033\\' $'\302\217'
ตั้งชื่อชื่อหน้าต่าง
นี่อาจเป็นการรวมกันที่คุณสามารถเห็นได้บนเทอร์มินัลหลังจากที่คำสั่งแบบโต้ตอบล้มเหลวและตกลงไปในเชลล์ (ด้วย/bin/cat
คุณไม่สามารถกระตุ้นstty -echo
IMHO ได้ แต่คำสั่งแบบโต้ตอบเช่นvim
ปกติตั้งค่านี้)
ตอนนี้ทำความสะอาดระเบียบนี้
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
หมายเหตุ:หากคุณใช้การคัดลอกและวาง (คุณอาจต้องค้างShift
ในขณะที่การวาง) tty
คุณอาจจะไม่เห็นวางของคุณถ้าคุณได้ใช้คำสั่งดังกล่าวจะเลอะกับ ดังนั้นเพียงแค่กดปุ่ม Enter หลังจากสุ่มวาง
อธิบาย:
stty sane
ตั้งค่าพารามิเตอร์เทอร์มินัล "สติ" ดังนั้นคุณจะได้รับเสียงสะท้อนกลับในขณะที่พิมพ์
printf '\033k%s\033\\' "$(basename "$SHELL")"
ตั้งชื่อหน้าต่างกลับเป็นปกติ คุณสามารถใช้tmux rename-window "$(basename "$SHELL")"
อีกทางหนึ่งได้ แต่tmux rename-window
จะ จำกัด เฉพาะtmux
ตำแหน่งที่ escape sequence ทำงานอยู่เสมอ
printf '\033]2;%s\007' "$(uname -n)"
รีเซ็ตสถานะขวาเพื่อแสดงเป็นค่าเริ่มต้น (โปรดทราบว่าคุณไม่ควรใช้tmux set status-right "something"
เพราะเพียงแค่แสดงผลpane title
ที่ได้รับความเสียหายดังนั้นstatus-right
เพียงแค่แสดงข้อผิดพลาดการนำเสนอบางอย่างนอกจากนี้โปรดทราบว่าฉันไม่พบtmux
คำสั่งเพื่อตั้งชื่อบานหน้าต่างโดยตรง)
tput reset
รีเซ็ตเทอร์มินัลในกรณีที่สิ่งนี้เกิดความสับสน
tmux refresh
รีเฟรชหน้าจอเพื่อกำจัดขยะอื่น ๆ ที่อาจปรากฏขึ้น
ไม่มีบิต
การprintf '\033k%s\033\\' "$(basename "$SHELL")"
สูญเสียความสามารถมาตรฐานของtmux
การแสดงคำสั่งปัจจุบันในพื้นที่สถานะด้านซ้าย หลังจากprintf '\033k%s\033\\' "something"
ถูกประหารความสามารถนี้จะหายไปและฉันไม่พบวิธีที่ดี แต่จะนำมันกลับมาเหมือนเดิมได้อย่างไร
แต่ดังที่ระบุไว้ในความคิดเห็นด้านล่างคุณสามารถเปิดใช้งานคุณสมบัติที่คล้ายกันtmux
แทนโดยใช้tmux
การตั้งค่าต่อไปนี้:
set-window-option automatic-rename on
ทำสิ่งนี้ในtmux
บรรทัดคำสั่งซึ่งสามารถเข้าถึงได้ในหน้าต่างปัจจุบันด้วย "Escape" :
(โดยที่ "Escape" เป็นtmux
คีย์คำสั่งของคุณ) จากนั้นป้อนคำสั่ง
หรือ excute tmux set-window-option automatic-rename on
ใน terminal ปัจจุบันของคุณ แต่นี้ล้มเหลวในกรณีที่คุณไม่ได้โดยตรงในระดับเปลือกที่เหมาะสมตัวอย่างเช่นมันไม่ทำงานภายในหรือsudo
ssh
หรือเปิดหน้าต่างอื่นในtmux
เซสชันปัจจุบันและดำเนินการคำสั่งต่อไปนี้:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
หรือเปิดเชลล์อื่นไปยังคอมพิวเตอร์ที่ใช้งานtmux
และรันคำสั่งต่อไปนี้ (นี่อยู่นอก tmux):
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
PS: ขอบคุณทุกคนที่ช่วยกันแก้ปัญหานี้