tmux không hỗ trợ tiêu đề trên mỗi ngăn, nhưng nó không cung cấp vị trí trên mỗi ngăn để hiển thị các tiêu đề này.
Bạn có thể đặt tiêu đề của ngăn bằng trình tự thoát ESC ]2;
… ESC \
(ví dụ: xem phần Tên và Tiêu đề trong trang tmux ). Bạn có thể làm điều này từ shell như sau:
printf '\033]2;%s\033\\' 'title goes here'
Tiêu đề của mỗi ngăn được đặt mặc định là tên máy chủ của hệ thống. Theo mặc định, tiêu đề của ngăn đang hoạt động được hiển thị ở phía bên phải của dòng trạng thái tmux (giá trị chung mặc định của biến phiên status-right
là "#22T" %H:%M %d-%b-%y
, hiển thị 22 ký tự của tiêu đề, thời gian và ngày tháng).
Vì vậy, miễn là bạn hài lòng với việc có thể xem tiêu đề của ngăn đang hoạt động (tức là sẵn sàng chuyển các ngăn để xem tiêu đề của ngăn không hoạt động), bạn có thể sử dụng chức năng mặc định. Chỉ cần gửi chuỗi thoát cài đặt tiêu đề thích hợp trước khi bắt đầu lệnh chính cho mỗi ngăn.
Nếu bạn thực sự cần một dòng dành riêng để hiển thị một số thông tin trên mỗi ngăn, thì các phiên tmux lồng nhau có thể không quá “quá mức cần thiết) (không cần thiết) như bạn nghĩ ban đầu.
Trong trường hợp chung, để cung cấp dòng trạng thái bất khả xâm phạm trên một số thiết bị đầu cuối nhất định, bạn sẽ cần một trình giả lập (lại) thiết bị đầu cuối đầy đủ nằm giữa thiết bị đầu cuối ban đầu và một thiết bị đầu cuối mới (một có ít dòng hơn). Mô phỏng (lại) như vậy là cần thiết để dịch các chuỗi điều khiển được gửi đến thiết bị đầu cuối bên trong và dịch chúng cho thiết bị đầu cuối ban đầu. Ví dụ: để duy trì dòng trạng thái ở cuối thiết bị đầu cuối bên ngoài, lệnh
Di chuyển đến dòng cuối cùng.
gửi đến thiết bị đầu cuối bên trong phải trở thành
Di chuyển đến dòng tiếp theo đến dòng cuối cùng.
khi được dịch cho và gửi đến thiết bị đầu cuối bên ngoài. Tương tự như vậy, một LF được gửi đến thiết bị đầu cuối bên trong phải trở thành
Nếu con trỏ ở dòng tiếp theo đến dòng cuối cùng, thì cuộn dòng này và tất cả các dòng phía trên nó lên một dòng, để cung cấp một dòng tiếp theo rõ ràng (bảo vệ dòng trạng thái trên dòng cuối cùng). Nếu không, hãy gửi một LF.
ở nhà ga bên ngoài.
Các chương trình như tmux và screen chỉ là những trình mô phỏng lại thiết bị đầu cuối như vậy. Chắc chắn, có rất nhiều chức năng khác được bao bọc xung quanh trình giả lập đầu cuối, nhưng bạn sẽ cần một lượng lớn mã mô phỏng đầu cuối chỉ để cung cấp một dòng trạng thái đáng tin cậy .
Tuy nhiên, có một giải pháp trọng lượng nhẹ miễn là
- các chương trình của bạn ( phiên bản Node.js ) có giới hạn tương tác đầu cuối với các ngăn mà chúng đang chạy (tức là không định vị con trỏ) và
- bạn không thay đổi kích thước các ngăn trong khi chương trình của bạn đang chạy.
Giống như nhiều trình giả lập thiết bị đầu cuối, tmux hỗ trợ lệnh điều khiển thiết bị đầu cuối “đặt vùng cuộn” trong các ngăn của nó. Bạn có thể sử dụng lệnh này để giới hạn vùng cuộn ở N-1 dòng trên cùng (hoặc dưới cùng) của terminal và viết một số loại văn bản nhận dạng phiên bản vào dòng không cuộn.
Các hạn chế (không cho phép lệnh di chuyển con trỏ, không thay đổi kích thước) là bắt buộc bởi vì chương trình đang tạo đầu ra (ví dụ: phiên bản Node.js ) không biết rằng việc cuộn đã bị giới hạn trong một vùng cụ thể. Nếu chương trình tạo đầu ra tình cờ di chuyển con trỏ ra ngoài vùng cuộn, thì đầu ra có thể bị cắt. Tương tự như vậy, trình giả lập đầu cuối có thể tự động đặt lại vùng cuộn khi thiết bị đầu cuối được thay đổi kích thước (vì vậy “dòng không cuộn” có thể sẽ kết thúc cuộn đi).
Tôi đã viết một tập lệnh sử dụng tput
để tạo chuỗi điều khiển thích hợp, viết vào dòng không cuộn và chạy một chương trình sau khi di chuyển con trỏ vào vùng cuộn:
#!/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"
Bạn có thể sử dụng nó như thế này:
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'
Tập lệnh cũng phải hoạt động bên ngoài tmux miễn là thiết bị đầu cuối hỗ trợ và xuất bản các khả năng của nó csr
và các cup
khả năng của nó .