首页 > 解决方案 > 防止 tmux 的 pane_title 被更新

问题描述

我正在尝试编写一个脚本,它将以编程方式设置 tmux 窗格的标题。我主要通过使用以下方法来工作:

# tmux.conf
set -g pane-border-format "#{pane_index}:#{pane_title}"
# script
# ...
tmux select-pane -t foo:0.0 -T "this will be shortlived"

但是,只要我在该窗格中执行任何操作,自定义标题就会取消设置。我查看了 tmux 的源代码,但找不到任何明显的答案。(该值似乎是 my 的一个片段$PS1。)

那么,是如何pane_title设置的,有什么方法可以防止它覆盖我的自定义标题?(我很确定您可以使用 shell 函数在窗格边框格式字符串模板中填充值,但如果这些值是通过脚本动态设置的,这实际上不起作用。)

标签: bashtmux

解决方案


窗格标题的目的是让 tmux 内部的应用程序对其进行更新,除了将每个应用程序配置为不这样做或修改 tmux 本身之外,没有其他方法可以防止这种情况发生。在这种情况下,是你的 shell 改变了它。您可以检查您的 shell 配置文件和系统 shell 配置文件以了解 OSC 标题设置序列(\033]2;或 \033]0;或 \e[2;或 \e[0;),但其他程序仍然可以随意使用改变它。

如果您想要应用程序无法修改的自定义窗格标题,最好的办法是使用用户选项。如果您有 tmux 3.0a 或更高版本,您可以在脚本的窗格中设置它:

[ -n "$TMUX" ] && tmux set -p @mytitle "foo"

然后以窗格边框格式使用它:

set -g pane-border-format "#{@mytitle}"

如果您有较旧的 tmux,则没有窗格选项,但可以使用以窗格 ID 命名的选项,例如:

if [ -n "$TMUX" ]; then
    I=$(tmux display -p '#{pane_id}')
    tmux set -w "@mytitle_$I" "foo"
fi

然后:

set -g pane-border-format '#(tmux show -wv "@mytitle_#{pane_id}")'

推荐阅读