sci*_*tor 5 terminal command-line prompt tmux
我最近开始使用 tmux 来真正改善我的终端会话。我需要做的一件事是连接到远程服务器,该服务器也在运行 tmux。但是,我发现当前窗口标题(在 tmux 中表示为 #T)在辅助 tmux shell 中没有更新。我想从辅助会话中更新 primary-tmux-session 值。
“#T”显然采用了 PROMPT_COMMAND 处理的值,这是每次重新加载提示时运行的命令。但是,如果我连接到远程服务器,它会打开一个服务器端 shell,然后打开 tmux 并在辅助 tmux 会话中运行一个全新的 shell。我知道如何更新主 tmux 窗口标题的唯一方法是重新加载服务器端 shell 提示,但这不会在辅助 tmux 会话中发生。
是否有任何命令可以连接两个会话以便它们共享 #T ?我最初认为使用终端覆盖选项可能可行,但它要么不起作用,要么我设置错误。
任何想法或建议将不胜感激。谢谢!
(PS。我怀疑这个问题更适合超级用户,但我之前曾问过一个关于堆栈溢出的问题。我希望这是这类问题的正确论坛)
我做了一些挖掘并为自己找到了答案。好吧,我发现完成监狱的方式并不优雅,但它会有效地完成工作。
首先,您需要在 .tmux.conf 文件中打开“set-titles”选项。以及适当的标题字符串:
set -g set-titles on
set -g set-titles-string '#T'
Run Code Online (Sandbox Code Playgroud)
然而,如果你实现这个,你会立即发现它不起作用。问题是,如果标题字符串以 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}"
Run Code Online (Sandbox Code Playgroud)
我不确定这是否重要,但我认为在关闭 tmux 后重置 TERM 是明智的(因此将其保存到临时变量中)。使用此功能,可以创建一个简单的 shell 脚本来打开嵌套的 tmux 会话,该会话将 #T 标题变量上游发送到其父会话。
这一切都有效,但考虑到必须完成工作以确保在我们自动在 tmux 中启动 shell 时不会创建无限嵌套循环,这有点痛苦。如果有人有更好的解决方案,我也很乐意在这里!
归档时间: |
|
查看次数: |
3128 次 |
最近记录: |