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