防止 tmux 的 pane_title 被更新

Prevent tmux's pane_title from being updated

我正在尝试编写一个脚本,以编程方式设置 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 的源代码,但未能找到任何明显的答案。 (该值似乎是我的 $PS1 的片段。)

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

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

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

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

然后在pane-border-format中使用:

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}")'