窗格标题在Tmux

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

我需要的是每个窗格的标题。 正如我得到的,tmux本身没有这个function:它只有窗口标题而不是窗格标题。 在每个窗格内为每个node.js实例启动一个单独的tmux会话看起来像一个矫枉过正的。

那么有没有一个小程序启动一个命令,用指定的状态栏包装它的输出?

提前致谢

tmux支持每个窗格标题,但不提供每个窗格位置来显示这些标题。

您可以使用转义序列ESC ]2;设置窗格的标题]2; … ESC \ (例如,参见tmux手册页中的名称和标题部分)。 你可以这样做,从壳:

 printf '\033]2;%s\033\\' 'title goes here' 

每个窗格的标题默认为系统的主机名。 默认情况下,活动窗格的标题显示在tmux状态行的右侧(会话variablesstatus-right的默认全局值是"#22T" %H:%M %d-%b-%y ,它显示窗格标题的22个字符,时间和date)。

所以,只要您能够看到活动窗格的标题(即愿意切换窗格以查看非活动窗格的标题),就可以使用默认function。 只需发送适当的标题设置转义序列,然后再启动每个窗格的主命令。


如果你绝对需要一个专门的行来显示一些每个窗格的信息,那么嵌套的tmux会话可能不会像你想象的那么多(不必要的)“矫枉过正”。

在一般情况下,为了在某个给定的terminal上提供一个不可侵犯的状态行,你将需要一个位于原始terminal和一个新terminal之间的完整terminal(重新)仿真器(一个具有更less的行)。 这种(重新)仿真需要将发送到内部terminal的控制序列转换并转换为原始terminal。 例如,要维护外部terminal底部的状态行,该命令

移到最后一行。

发送到内部terminal必须成为

移到最后一行。

当翻译并发送到外部terminal。 同样,发送到内部terminal的LF必须成为

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

在外部terminal。

诸如tmux屏幕 之类的程序就是这样的terminal重新仿真程序。 当然,在terminal仿真器周围还有很多其他function,但是您需要大量的terminal仿真代码才能提供可靠的状态行。


然而,只要有一个轻量级的解决scheme,

  1. 你的程序( Node.js实例)与它们所运行的窗格之间的terminal交互有限(即没有光标定位),
  2. 在程序运行时,不要调整窗格的大小。

像许多terminal仿真器一样, tmux在其窗格中支持“设置滚动区域”terminal控制命令。 您可以使用此命令将滚动区域限制为terminal的顶部(或底部)N-1行,并将某种实例标识文本写入非滚动行。

由于生成输出的程序(例如Node.js实例)不知道滚动限制在特定区域,因此需要限制(不允许使用光标移动命令,不需要resize)。 如果输出生成程序碰巧将光标移动到滚动区域之外,则输出可能会变成乱码。 同样,terminal仿真器可能在terminalresize时自动重置滚动区域(所以“非滚动行”可能最终会滚动)。

我写了一个脚本,它使用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' 

只要terminal支持并发布它的csrcup terminfofunction,脚本也应该在tmux之外工作。

这个function已经添加到这个提交 tmux git。 这不是在2.2版本,但它看起来会在2.3。

要启用它:

 tmux set -g pane-border-status top 

或者如果你喜欢:

 tmux set -g pane-border-status bottom 

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

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

我正在处理tmux-ticket的窗格状态栏。 我的开发分支可以在这里findgithub: https : //github.com/jonathanslenders/tmux

现在,这已经添加了一个工作的重命名窗格“标题”命令。 还是有一些bug,API会改善。 这个想法是创build一个状态栏,每个窗格可以有一些格式,如会话状态栏。 就像tmux的其余部分一样,所有东西都应该可以编写脚本,并且可以自定义。 完成并稳定后,可能会包含在官方的tmux中。

是的,有这样一个命令: tmux 。 给你的会话一个名字,它会显示在一个内部状态栏中:

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

这在短期内没有任何帮助,但是在tmux中有针对每个窗格标题的function请求: http : //sourceforge.net/tracker/? func = detail&aid = 3495916&group_id = 200378&atid = 973265#

与此同时,正如其他人所提到的那样,嵌套式三层结构体面地工作。

我正在使用tmux版本2.3,我觉得以前的版本不支持边框样式。 这是什么对我有用:

对于每个窗格设置标题:

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

然后:

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