Command line Tmux中的窗格标题

Command line Tmux中的窗格标题,command-line,title,tmux,pane,Command Line,Title,Tmux,Pane,在我的本地机器上,我有3个node.js实例同时运行。在名为“服务器”的tmux窗口中,每个服务器都有自己的窗格。问题是要找出哪个节点在哪个窗格中运行并不容易,因为它们的日志是相似的 我需要的是每个窗格的标题。正如我所了解的,tmux本身并没有这个功能:它只有windows的标题,而没有窗格的标题。在每个node.js实例的每个窗格中启动一个单独的tmux会话看起来有点过头了 那么,是否有一些小程序启动命令,用指定的状态栏包装其输出 提前感谢是的,有这样一个命令:tmux。为会话指定名称,它将显

在我的本地机器上,我有3个node.js实例同时运行。在名为“服务器”的tmux窗口中,每个服务器都有自己的窗格。问题是要找出哪个节点在哪个窗格中运行并不容易,因为它们的日志是相似的

我需要的是每个窗格的标题。正如我所了解的,tmux本身并没有这个功能:它只有windows的标题,而没有窗格的标题。在每个node.js实例的每个窗格中启动一个单独的tmux会话看起来有点过头了

那么,是否有一些小程序启动命令,用指定的状态栏包装其输出


提前感谢

是的,有这样一个命令:
tmux
。为会话指定名称,它将显示在内部状态栏中:

TMUX=0 tmux new-session -s my-new-session
tmux确实支持每个窗格的标题,但它不提供每个窗格的位置来显示这些标题

您可以使用转义序列ESC
]2设置窗格标题…ESC
\
(例如,请参阅tmux手册页中名为“名称和标题”的部分)。您可以从shell执行以下操作:

printf '\033]2;%s\033\\' 'title goes here'
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状态行的右侧(会话变量
status right
的默认全局值为
“#22T”%H:%M%d-%b-%y
,显示窗格标题、时间和日期的22个字符)

因此,只要您对能够查看活动窗格的标题感到满意(即,愿意切换窗格以查看非活动窗格的标题),您就可以使用默认功能。在为每个窗格启动主命令之前,只需发送适当的标题设置转义序列


如果您确实需要一个专用行来显示一些每个窗格的信息,那么嵌套的tmux会话可能不会像您最初认为的那样(不必要)“过度使用”

在一般情况下,要在某个给定的终端上提供不可侵犯的状态行,您需要一个完整的终端(re)仿真器,它位于原始终端和新终端(少一行的终端)之间。这种(重新)仿真需要转换发送到内部终端的控制序列,并将其转换为原始终端。例如,要在外部端子的底部保持状态行,命令

移到最后一行

发送到内部的终端必须成为

移到最后一行的下一行

翻译并发送到外部终端时。同样,发送到内部终端的LF必须为

如果光标位于倒数第二行,则将此行及其上方的所有行向上滚动一行,以提供清晰的倒数第二行(保护最后一行上的状态行)。 否则,发送LF

在外部终端

像tmux和screen这样的程序就是这样的终端重新仿真器。当然,终端仿真器还有很多其他功能,但是您需要大量的终端仿真代码来提供可靠的状态行


然而,有一种重量轻的解决方案,只要

  • 您的程序(Node.js实例)与运行它们的窗格之间的终端交互有限(即没有光标定位),并且
  • 程序运行时,不调整窗格的大小
  • 与许多终端模拟器一样,tmux在其窗格中支持“设置滚动区域”终端控制命令。您可以使用此命令将滚动区域限制在终端的顶部(或底部)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"
    
    您可以这样使用它:

    printf '\033]2;%s\033\\' 'title goes here'
    
    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'
    

    只要终端支持并发布其
    csr
    cup
    terminfo功能,脚本也应在tmux之外工作。

    这在短期内没有帮助,但tmux中存在对每个窗格标题的功能请求:


    同时,正如其他人所提到的,嵌套tmux工作正常。

    我正在为tmux-ticket的窗格状态栏工作。 我的开发分支可以在github上找到:


    现在,这已经添加了一个工作重命名窗格“title”命令。仍然存在一些bug,API将得到改进。其想法是为每个窗格创建一个状态栏,它可以有一些格式,比如会话状态栏。与tmux的其余部分一样,所有内容都应该可以编写脚本,并且可以自定义。完成并稳定后,它可能会包含在正式的tmux中。

    此功能已在中添加到tmux中。它不在2.2版中,但看起来将在2.3版中

    要启用它,请执行以下操作:

    tmux set -g pane-border-status top
    
    或者,如果您愿意:

    tmux set -g pane-border-status bottom
    
    要将自定义文本设置为窗格边框状态行,可以使用
    窗格边框格式
    ,例如:

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

    我使用的是tmux版本2.3,我认为以前的版本不支持边框样式。 这就是我的工作原理:

    为每个窗格设置标题:

    printf '\033]2;My Pane Title\033\\'
    
    然后:


    一张gif胜过千言万语。()

    是基于tmux的终端分配器,支持 通过网元显示每个窗格的标题
    $ tmux set pane-border-status bottom      # For current window
    $ tmux set -g pane-border-status bottom   # For all windows
    
    $ tmux set pane-border-status off       # For current window
    $ tmux set -g pane-border-status off    # For all windows
    
    # dispaly pane_current_path as the pane title
    set -g pane-border-status top
    set -g pane-border-format "#{pane_index} #{pane_current_path}"
    
    tmux source-file ~/.tmux.con