窗格标题在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,
- 你的程序( Node.js实例)与它们所运行的窗格之间的terminal交互有限(即没有光标定位),
- 在程序运行时,不要调整窗格的大小。
像许多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支持并发布它的csr
和cup
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"