tmux 不会立即更新窗格的标题

tmux 不会立即更新窗格的标题

我希望 tmux “立即”更新窗格的标题以匹配当前在终端中执行的操作。例如:

  • 如果窗格包含外壳,则其标题应该是bash
  • 如果窗格包含正在执行的 vim,那么它的标题应该是vim
  • 如果窗格包含正在执行的 nano,则其标题应该是nano

但事实并非如此,实际发生的情况如下:

如果我在窗格中有 bash shell,那么我执行会发生vim什么情况?窗格的标题不会更新,直到发生事件(例如按下某个键或切换到另一个窗格)或者在经过特定的时间间隔之后,该间隔由以下方式指定:

set-option -g status-interval interval

退出时也会发生同样的事情vim,除非发生事件或间隔已经过去,否则标题不会改变。

我想要的是,窗格的标题在当前正在执行的命令更改时立即更新(即,当我输入vimbash 并按下Enter时,标题立即更改为vim)。但是,据我所知(如果错了,请纠正我),指定的间隔set-option -g status-interval interval不能小于 1 秒,在这种情况下,即使 1 秒仍然会明显延迟。那么我如何强制窗格标题立即更新?

操作系统是 Debian 12。tmux
版本是tmux 3.3a

答案1

基于命令的即时更新在automatic-rename我们所用的机制中是不可能的,因为 tmux 本身不知道正在执行什么以及何时执行。操作系统不会告知堆栈下方几层正在运行哪些进程 – 它必须定期扫描进程列表以检测任何变化。尝试近似“即时”更新会导致 CPU 占用率过高。

为了使更新立即生效,您的交互式 shell(或正在运行的程序)必须明确地告诉 tmux 有关新命令的信息 - 或者更具体地说有关新标题和/或“窗口名称”(显示在状态栏中)。

  • 例如,在 Zsh 中,您必须从中设置窗口名称precmd(),而在 Bash 中,您可能需要使用trap DEBUG或第三方“bash precmd”脚本。

    printf '\e]0;%s\e\\' "New terminal title"
    
    printf '\ek%s\e\\' "New window name"
    

    这篇文章有一个很好的例子,说明如何使用 Bash 中的“trap DEBUG”自动设置窗格标题。(它会检查,screen*但几乎所有终端(包括 tmux)都能理解相同的机制。)

  • 由于您特别询问的是“窗格标题”,它使用在其他终端中发现的通用标题/状态行机制(而不是“窗口名称”,它是屏幕/tmux 特定的):许多程序可以自行更新终端标题;例如,在 Vim 中您只需要set title启用此功能。

相关内容