Tiêu đề ngăn trong Tmux


88

Trên máy cục bộ của mình, tôi có 3 phiên bản node.js đang chạy đồng thời. Mỗi cái đều có ngăn riêng trong cửa sổ tmux được gọi là "máy chủ". Vấn đề là không dễ để tìm ra nút nào đang chạy trong ngăn nào, vì nhật ký của chúng tương tự nhau.

Những gì tôi cần là một tiêu đề cho mỗi ngăn. Như tôi đã hiểu, bản thân tmux không có tính năng: nó chỉ có tiêu đề cho cửa sổ chứ không phải cho bảng. Khởi chạy một phiên tmux riêng biệt bên trong mỗi ngăn cho mỗi phiên bản node.js trông giống như một sự quá mức cần thiết.

Vì vậy, có một số chương trình nhỏ khởi chạy một lệnh, bao bọc đầu ra của nó bằng một thanh trạng thái được chỉ định?

Cảm ơn trước


1
tmux kể từ phiên bản 2.3 hỗ trợ tiêu đề ngăn, hãy xem stackoverflow.com/a/37602055/266453
Dennis G

Câu trả lời:


80

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"#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ư tmuxscreen 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à

  1. 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à
  2. 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ó csrvà các cupkhả năng của nó .


kịch bản của bạn hoạt động chính xác như tôi mong đợi; câu hỏi duy nhất: tôi nên google cái gì để tùy chỉnh màu của "non_scroll_line"?
Andrey Lushnikov

1
Có thể là “màu nền trước khả năng của ga cuối” (tức là đọc về màu trong trang chủ của ga cuối). Bạn có thể sử dụng tputđể bao gồm các chuỗi điều khiển thích hợp trong đối số "nội dung dòng". Với hầu hết các thiết bị đầu cuối, bạn có thể đặt dòng là “lục lam (6) và xanh lục (3) trên đỏ tươi (5)” với no_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js. setafđặt nền trước, setabđặt nền, opđặt lại màu mặc định của thiết bị đầu cuối. Các khả năng màu có một số từ 0–7, 0–15, 0–87 hoặc 0–255, tùy thuộc vào mô phỏng thiết bị đầu cuối của bạn.
Chris Johnsen

Bây giờ chúng tôi đã phát hành pymux. Màn hình này pane thanh tiêu đề: github.com/jonathanslenders/pymux
Jonathan Slenders

Có vẻ như hành vi là tiêu đề ngăn được đặt thành lệnh đang được chạy trong trình bao. Vì vậy, nó sẽ không "dính" trừ khi chúng ta đang chạy một quá trình tồn tại lâu dài (cũng biết cách xuất chuỗi thoát cài đặt tiêu đề) bên trong.
Steven Lu,

4
Vui lòng xem thêm câu trả lời bên dưới: stackoverflow.com/a/37602055/266453 tmux kể từ phiên bản 2.3 hỗ trợ tiêu đề trong đường viền ngăn.
Dennis G

78

Chức năng này đã được thêm vào tmux trong cam kết này . Nó không có trong phiên bản 2.2, nhưng có vẻ như nó sẽ ở phiên bản 2.3.

Để kích hoạt nó:

tmux set -g pane-border-status top

hoặc nếu bạn thích:

tmux set -g pane-border-status bottom

Để đặt một văn bản tùy chỉnh làm dòng trạng thái đường viền ngăn, bạn có thể sử dụng pane-border-format, ví dụ như sau:

tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"

1
Điều này hiển thị số của ngăn và tiêu đề mặc định. Làm thế nào để bạn thay đổi nó suy nghĩ?
adn

Tôi không chắc chắn về số ngăn, nhưng nó phản hồi giống như tiêu đề cửa sổ xterm để thoát khỏi các chuỗi. Ví dụ, với bash, tôi đã thiết lập PS1 = '[\ e] 0; \ u @ \ h: \ w \ a] $' để có được "user @ host: dir làm việc /"
kevmitch

Theo như tôi hiểu, bạn đã thiết lập trình tự đó trước tay. Nhưng không có phím tắt hoặc tổ hợp phím nào có thể thay đổi chúng. Vì vậy, tmuxbạn cần một số lệnh bên ngoài tmuxđể thay đổi nó. Đúng? Hoặc có trình tự nào bên trong có thể cập nhật nó?
adn

Vâng, bạn chỉ cần đặt biến trong trình bao đang chạy và nó cập nhật khi lời nhắc tiếp theo được vẽ. Đối với tôi, có vẻ như tmux hơi sơ sài và chỉ thực sự cập nhật nó khi bạn chuyển sang một ngăn khác.
kevmitch

Bạn thực sự có thể sử dụng pane-border-formatđể đặt chuỗi định dạng tùy chỉnh cho ngăn hiển thị ( #{...}định dạng thông thường ). Tôi đã chỉnh sửa câu trả lời của bạn để bao gồm điều này.
Dennis G

32

tmux 2.6bạn có thể làm:

$ tmux select-pane -t {pane} -T {title}

# Examples:
$ tmux select-pane -T title1          # Change title of current pane
$ tmux select-pane -t 1 -T title2     # Change title of pane 1 in current window
$ tmux select-pane -t 2.1 -T title3   # Change title of pane 1 in window 2

Bạn có thể thấy tiêu đề mỗi ngăn trong thanh trạng thái với:

$ tmux set pane-border-status bottom      # For current window
$ tmux set -g pane-border-status bottom   # For all windows

Tắt thanh trạng thái với:

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows

Bạn có biết có cách nào để ngăn tmux thay đổi tiêu đề của bạn không? Ví dụ: nếu tôi đặt tiêu đề của ngăn và sau đó làm điều gì đó trong ngăn đó, chẳng hạn như cd $HOME, tiêu đề được thay đổi thành giá trị của $HOME. (Tôi thấy điều này trên tmux 2.8.)
pdoherty926

1
@ pdoherty926 Có thể bạn đã có câu trả lời, nhưng hãy kiểm tra set-window-option automatic-rename off.
noname

Tôi có set-option -g allow-rename offtrong .tmux.confhồ sơ của mình .
Eyal Levin

1
Cảm ơn vì những gợi ý. Tôi đã sử dụng pane-border-formatvà một biến do người dùng cung cấp (tôi không chắc liệu có tên chính thức cho tính năng này hay không) để kiểm soát những gì được hiển thị. Đây là một ví dụ.
pdoherty926

14

Tôi đang làm việc trên thanh trạng thái ngăn cho tmux - ticket. Chi nhánh phát triển của tôi có thể được tìm thấy tại đây trên github: https://github.com/jonathanslenders/tmux

Ngay bây giờ, điều này đã thêm một lệnh "title" ngăn đổi tên đang hoạt động . Vẫn còn một số lỗi và API sẽ được cải thiện. Ý tưởng là tạo một thanh trạng thái trên mỗi ngăn, có thể có một số định dạng, như thanh trạng thái phiên. Giống như phần còn lại của tmux, mọi thứ phải có thể viết được và có thể tùy chỉnh. Khi hoàn thành và ổn định, nó có thể sẽ được đưa vào tmux chính thức.


Khi đang ở đó, bạn có thể làm cho tiêu đề ngăn trở thành tiêu đề cửa sổ mặc định trong ngăn ngắt không?
djsadinoff

Chi nhánh này chưa bao giờ được hợp nhất trong tmux. Nhưng tôi đã tạo pymux thay vào đó, trong đó có thanh tiêu đề cửa sổ: github.com/jonathanslenders/pymux
Jonathan Slenders

Lệnh này cũng không hoạt động trên bản dựng mới nhất (commit a24260).
adn

14

Tôi đang sử dụng tmux phiên bản 2.3, tôi nghĩ rằng kiểu đường viền không được hỗ trợ trong các phiên bản trước. Đây là những gì làm việc cho tôi:

Đối với mỗi ngăn đặt tiêu đề:

printf '\033]2;My Pane Title\033\\'

Sau đó:

tmux set -g pane-border-format "#{pane_index} #T"

9
Ít nhất là gần đây nhất là tmux 2.6, bạn có thể thay đổi tiêu đề ngăn trong tmux: select-pane -T "my title"does this. Bạn thậm chí có thể thiết lập một phím ràng buộc vì vậy bạn chỉ cần cung cấp danh hiệu:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
lucasem

3
@lucasem có thể tôi chưa theo dõi chủ đề này, nhưng đây có vẻ như là câu trả lời.
icicleking

@lucasem Tôi không chắc 100% nhưng tôi tin rằng phương pháp của bạn (IMO nào là tốt nhất và đơn giản nhất trong toàn bộ chuỗi này, đối với các phiên bản gần đây của tmux) chỉ hoạt động nếu pane-border-statustùy chọn được đặt thành ( tophoặc bottom).
cjauvin

11

Một gif có giá trị bằng một ngàn lời nói. ( nguồn )

tmux-xpanes là trình phân chia đầu cuối dựa trên tmux, hỗ trợ hiển thị tiêu đề cho từng ngăn thông qua -ttùy chọn mới được thêm vào .


1
Một gif có giá trị bằng một nghìn từ, nhưng nếu nó liên kết bị thối rữa thì nó chẳng có giá trị gì.
Vụ kiện của Fund Monica vào

7

Có có một lệnh như vậy: tmux. Đặt tên cho phiên của bạn và nó sẽ được hiển thị trong thanh trạng thái bên trong:

TMUX=0 tmux new-session -s my-new-session

2
Vâng, cảm ơn bạn đã trả lời! Nhưng do đó, tôi sẽ phải khởi chạy một phiên tmux mới trong mỗi ngăn chỉ cho một tiêu đề ở dưới cùng của nó - loại quá mức cần thiết, phải không?
Andrey Lushnikov

Tôi không biết. Là nó? Bạn đã thử chưa? Phiên sử dụng thêm bao nhiêu bộ nhớ?
event_jr

vâng, tôi đã sử dụng các phiên tmux lồng nhau cho đến hôm nay. Tôi không chắc về việc tiêu thụ bộ nhớ và những thứ như thế này - tôi chỉ không thích bản thân khái niệm vì nó không thuần túy.
Andrey Lushnikov


0

TL; DR

Nối các cấu hình sau vào tệp cấu hình tmux của bạn (trong trường hợp của tôi là ~/.tmux.conf.local)

# dispaly pane_current_path as the pane title
set -g pane-border-status top
set -g pane-border-format "#{pane_index} #{pane_current_path}"

sau đó chạy:

tmux source-file ~/.tmux.con

tận hưởng nó

Cảm ơn https://stackoverflow.com/a/37602055/5121972

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.