คุณต้องมีสองชุดคำสั่งเพื่อทำความสะอาด:
ก่อนอื่นให้เรียกใช้สิ่งนี้ในหน้าต่างที่อ่านไม่ออก (ใช้งานได้แม้ในขณะที่คุณอยู่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 -echoIMHO ได้ แต่คำสั่งแบบโต้ตอบเช่น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 ปัจจุบันของคุณ แต่นี้ล้มเหลวในกรณีที่คุณไม่ได้โดยตรงในระดับเปลือกที่เหมาะสมตัวอย่างเช่นมันไม่ทำงานภายในหรือsudossh
หรือเปิดหน้าต่างอื่นใน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: ขอบคุณทุกคนที่ช่วยกันแก้ปัญหานี้