
我希望 tmux “立即”更新窗格的标题以匹配当前在终端中执行的操作。例如:
- 如果窗格包含外壳,则其标题应该是
bash
。 - 如果窗格包含正在执行的 vim,那么它的标题应该是
vim
。 - 如果窗格包含正在执行的 nano,则其标题应该是
nano
。
但事实并非如此,实际发生的情况如下:
如果我在窗格中有 bash shell,那么我执行会发生vim
什么情况?窗格的标题不会更新,直到发生事件(例如按下某个键或切换到另一个窗格)或者在经过特定的时间间隔之后,该间隔由以下方式指定:
set-option -g status-interval interval
退出时也会发生同样的事情vim
,除非发生事件或间隔已经过去,否则标题不会改变。
我想要的是,窗格的标题在当前正在执行的命令更改时立即更新(即,当我输入vim
bash 并按下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
启用此功能。