tmuxรองรับชื่อเรื่องต่อบานหน้าต่าง แต่ไม่ได้ระบุตำแหน่งต่อบานหน้าต่างเพื่อแสดงชื่อเรื่องเหล่านี้
คุณสามารถตั้งหัวเรื่องของบานหน้าต่างด้วยลำดับ ESC ]2;
... ESC \
(เช่นดูส่วนที่เรียกว่าชื่อและชื่อเรื่องในหน้าtmux manpage) คุณสามารถทำได้จากเปลือกเช่นนี้:
printf '\033]2;%s\033\\' 'title goes here'
หัวเรื่องของแต่ละบานจะมีค่าเริ่มต้นเป็นชื่อโฮสต์ของระบบ ตามค่าเริ่มต้นหัวเรื่องของบานหน้าต่างที่ใช้งานอยู่จะแสดงทางด้านขวาของบรรทัดสถานะtmux (ค่าส่วนกลางเริ่มต้นของตัวแปรเซสชันstatus-right
คือ"#22T" %H:%M %d-%b-%y
ซึ่งแสดงอักขระ 22 ตัวของหัวเรื่องของบานหน้าต่างเวลาและวันที่)
ดังนั้นตราบใดที่คุณพอใจกับความสามารถในการดูหัวเรื่องของบานหน้าต่างที่ใช้งานอยู่ (เช่นยินดีที่จะสลับบานหน้าต่างเพื่อดูชื่อของบานหน้าต่างที่ไม่ได้ใช้งาน) คุณสามารถใช้ฟังก์ชันเริ่มต้นได้ เพียงแค่ส่งลำดับการหลีกเลี่ยงการตั้งค่าหัวเรื่องที่เหมาะสมก่อนที่จะเริ่มคำสั่งหลักสำหรับแต่ละบานหน้าต่าง
หากคุณต้องการบรรทัดเฉพาะเพื่อแสดงข้อมูลต่อบานหน้าต่างเซสชันtmux ที่ซ้อนกันอาจไม่มาก (ไม่จำเป็น)“ overkill” อย่างที่คุณคิดในตอนแรก
ในกรณีทั่วไปในการระบุบรรทัดสถานะไม่ถูกละเมิดในเทอร์มินัลบางเครื่องคุณจะต้องมีตัวจำลองเทอร์มินัล (อีกครั้ง) แบบเต็มที่อยู่ระหว่างเทอร์มินัลเดิมและเทอร์มินัลใหม่ (หนึ่งบรรทัดมีน้อยกว่าหนึ่งบรรทัด) จำเป็นต้องมีการจำลอง (อีกครั้ง) เพื่อแปลลำดับการควบคุมที่ส่งไปยังเทอร์มินัลด้านในและแปลสำหรับเทอร์มินัลดั้งเดิม ตัวอย่างเช่นเพื่อรักษาบรรทัดสถานะที่ด้านล่างของเทอร์มินัลภายนอกให้ใช้คำสั่ง
ย้ายไปที่บรรทัดสุดท้าย
ส่งไปยังเทอร์มินัลด้านในจะต้องกลายเป็น
ย้ายไปที่ถัดจากบรรทัดสุดท้าย
เมื่อแปลและส่งไปยังเทอร์มินัลภายนอก ในทำนองเดียวกัน LF ที่ส่งไปยังเทอร์มินัลด้านในจะต้องกลายเป็น
หากเคอร์เซอร์อยู่ถัดจากบรรทัดสุดท้ายให้เลื่อนบรรทัดนี้และทุกบรรทัดที่อยู่ด้านบนขึ้นมาหนึ่งบรรทัดเพื่อให้เห็นบรรทัดถัดจากบรรทัดสุดท้ายที่ชัดเจน (ป้องกันบรรทัดสถานะในบรรทัดสุดท้าย) มิฉะนั้นให้ส่ง LF
ในขั้วด้านนอก
โปรแกรมเช่นtmuxและหน้าจอเป็นเพียงตัวเลียนแบบเทอร์มินัลเท่านั้น แน่นอนว่ามีฟังก์ชั่นอื่น ๆ อีกมากมายที่ล้อมรอบตัวจำลองเทอร์มินัล แต่คุณจะต้องมีโค้ดจำลองเทอร์มินัลจำนวนมากเพื่อให้บรรทัดสถานะที่เชื่อถือได้
อย่างไรก็ตามมีวิธีแก้ปัญหาที่มีน้ำหนักเบาตราบเท่าที่
- โปรแกรมของคุณ ( อินสแตนซ์Node.js ) มีการโต้ตอบเทอร์มินัลที่ จำกัด กับบานหน้าต่างที่กำลังทำงานอยู่ (เช่นไม่มีการวางตำแหน่งเคอร์เซอร์) และ
- คุณไม่ได้ปรับขนาดบานหน้าต่างในขณะที่โปรแกรมของคุณกำลังทำงานอยู่
เช่นเดียวกับตัวจำลองเทอร์มินัลหลาย ๆ ตัวtmuxสนับสนุนคำสั่งควบคุมเทอร์มินัล“ set scrolling region” ในบานหน้าต่าง คุณสามารถใช้คำสั่งนี้เพื่อ จำกัด ขอบเขตการเลื่อนไปที่บรรทัด N-1 บนสุด (หรือล่างสุด) ของเทอร์มินัลและเขียนข้อความระบุอินสแตนซ์บางประเภทลงในบรรทัดที่ไม่เลื่อน
ข้อ จำกัด (ไม่อนุญาตให้ใช้คำสั่งการเคลื่อนย้ายเคอร์เซอร์ไม่ต้องปรับขนาด) เนื่องจากโปรแกรมที่สร้างเอาต์พุต (เช่นอินสแตนซ์Node.js ) ไม่มีความคิดว่าการเลื่อนถูก จำกัด ไว้ที่พื้นที่ใดพื้นที่หนึ่ง หากโปรแกรมสร้างเอาต์พุตเกิดเลื่อนเคอร์เซอร์ไปนอกขอบเขตการเลื่อนผลลัพธ์อาจอ่านไม่ออก ในทำนองเดียวกันโปรแกรมจำลองเทอร์มินัลอาจรีเซ็ตพื้นที่การเลื่อนโดยอัตโนมัติเมื่อมีการปรับขนาดเทอร์มินัล (ดังนั้น "เส้นที่ไม่เลื่อน" อาจสิ้นสุดลงด้วยการเลื่อนออกไป)
ฉันเขียนสคริปต์ที่ใช้tput
ในการสร้างลำดับการควบคุมที่เหมาะสมเขียนลงในบรรทัดที่ไม่เลื่อนและเรียกใช้โปรแกรมหลังจากย้ายเคอร์เซอร์ไปที่ขอบเขตการเลื่อน:
#!/bin/sh
# usage: no_scroll_line top|bottom 'non-scrolling line content' command to run with args
#
# Set up a non-scrolling line at the top (or the bottom) of the
# terminal, write the given text into it, then (in the scrolling
# region) run the given command with its arguments. When the
# command has finished, pause with a prompt and reset the
# scrolling region.
get_size() {
set -- $(stty size)
LINES=$1
COLUMNS=$2
}
set_nonscrolling_line() {
get_size
case "$1" in
t|to|top)
non_scroll_line=0
first_scrolling_line=1
scroll_region="1 $(($LINES - 1))"
;;
b|bo|bot|bott|botto|bottom)
first_scrolling_line=0
scroll_region="0 $(($LINES - 2))"
non_scroll_line="$(($LINES - 1))"
;;
*)
echo 'error: first argument must be "top" or "bottom"'
exit 1
;;
esac
clear
tput csr $scroll_region
tput cup "$non_scroll_line" 0
printf %s "$2"
tput cup "$first_scrolling_line" 0
}
reset_scrolling() {
get_size
clear
tput csr 0 $(($LINES - 1))
}
# Set up the scrolling region and write into the non-scrolling line
set_nonscrolling_line "$1" "$2"
shift 2
# Run something that writes into the scolling region
"$@"
ec=$?
# Reset the scrolling region
printf %s 'Press ENTER to reset scrolling (will clear screen)'
read a_line
reset_scrolling
exit "$ec"
คุณอาจใช้สิ่งนี้:
tmux split-window '/path/to/no_scroll_line bottom "Node instance foo" node foo.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance bar" node bar.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance quux" node quux.js'
สคริปต์ควรทำงานนอกtmuxด้วยตราบเท่าที่เทอร์มินัลรองรับและเผยแพร่ความสามารถของมันcsr
และcup
terminfo