我最近开始使用 tmux 来真正改善我的终端会话。我需要做的一件事是连接到也运行 tmux 的远程服务器。但是,我发现当前窗口标题(在 tmux 中表示为 #T)在辅助 tmux shell 中不会更新。我想在辅助会话中更新主 tmux 会话值。
“#T” 显然采用了 PROMPT_COMMAND 处理的值,这是每次重新加载提示时运行的命令。但是,如果我连接到远程服务器,它会打开一个服务器端 shell,然后打开 tmux,这会在辅助 tmux 会话中运行一个全新的 shell。我知道如何更新主 tmux 窗口标题的唯一方法是重新加载服务器端 shell 提示,但这不会在辅助 tmux 会话中发生。
是否有任何命令可以连接两个会话以便它们共享 #T ?我原本以为可以使用终端覆盖选项来实现,但它不起作用或者我设置错误。
任何想法或建议都将不胜感激。谢谢!
(PS:我怀疑这个问题更适合超级用户,但我之前在 stack-overflow 上问过一个问题。我希望这是适合这类问题的论坛)
答案1
我做了一些调查,找到了自己的答案。好吧,我发现的完成目标的方法并不优雅,但它可以完成工作。
首先,您需要在 .tmux.conf 文件中启用“set-titles”选项。以及适当的标题字符串:
set -g set-titles on
set -g set-titles-string '#T'
但是,如果您实施了此操作,您会立即注意到它不起作用。问题是,如果它在 xterm 变体中启动(tmux/screen TERM 变量为“screen*”),则只会将标题字符串发送到上游。因此,在启动嵌套 tmux 会话时,您必须通过重置变量来欺骗终端。以下示例将保留 TERM 后缀(例如“-256color”)。
TEMP_TERM=$TERM
TEMP_TERM_SUFFIX=${TERM#$(echo $TERM | cut -f 1 -d'-')}
TERM="xterm${TEMP_TERM_SUFFIX}"
我不确定这是否重要,但我认为在关闭 tmux 后重置 TERM 是明智之举(因此将其保存到临时变量中)。使用这种方法,可以编写一个简单的 shell 脚本来打开嵌套的 tmux 会话,该会话将 #T 标题变量上游发送到其父会话。
这一切都有效,但考虑到必须做一些工作来确保在我们在 tmux 中自动启动 shell 的情况下不会创建无限嵌套循环,这有点麻烦。如果有人有更好的解决方案,我也很乐意在这里分享!