从 tmux 2.6 开始,tmux 现在允许每个窗格标题。它们可以通过启用tmux set -g pane-border-status top
。当每个窗口运行 10 个以上窗格时,这非常方便。我还设置了标题格式,如下所示,以便我可以重命名它们:
set -g pane-border-format "#{pane_index} #{pane_title}"
# rename prompt
bind . command-prompt -p "(rename-pane)" -I "#T" "select-pane -T '%%'"
我唯一不喜欢的是后备默认值,它默认为计算机的主机名。我更喜欢以下内容:
- 如果
pane_title
由用户设置,则使用 (#{pane_title}
) - 否则,使用当前工作目录 (
#{pane_current_path}
)
任何一个本身都是简单的:
tmux set -g pane-border-format "#{pane_index} #{pane_title}"
tmux set -g pane-border-format "#{pane_index} #{pane_current_path}"
tmux 的格式化部分(https://github.com/tmux/tmux/wiki/Formats)表明我可以使用三元条件检查来实现我想要的后备类型,但我在所有情况下都无法使其正常工作,因为pane_index
在未设置时,似乎默认为(我的猜测)任何hostname
命令在窗格生成时返回。这是我目前拥有的:
tmux set -g pane-border-format "#{pane_index} #{?#{!=:#{pane_title},$(hostname)},#{pane_title},#{pane_current_path}}"
这适用于已由用户显式重命名的窗格,也适用于使用相同主机名生成的窗格。不幸的是,我的工作机器上的主机名随着IP的变化而变化,所以上面的命令看起来太脆弱了。更糟糕的是,出于某种原因,它仅在直接从窗格运行时才有效,而不是放入 tmux 配置中(当然,没有 tmux 前缀)。有没有更好的方法来确定 pane_title 是否未设置?
答案1
您可以尝试使用挂钩将新窗格的窗格标题设置为更容易识别的内容,例如:
set-hook -g after-split-window 'selectp -T ""'
set-hook -g after-new-window 'selectp -T ""'
set-hook -g after-new-session 'selectp -T ""'
然后查找空标题而不是主机名:
#{?pane_title,#{pane_title},#{pane_current_command}}
答案2
我不确定是否可以回答您的所有问题,但我可以尝试解决一些问题。
在我的配置中,我有这个怪物:
setw -g pane-border-format ' #{=/-20/…:pane_title} [#{=/-20/…:pane_current_command}] #(pgrep -P "#{pane_pid}" | tr "\n" " ")#{pane_current_path} #{?alternate_on,<Alt Mode> ,}'
(其中一些可能依赖于 tmux ~3.1 功能)
使用 ofsetw -g
而不是set -g
可以使其在 config.xml 中为您工作。
正如你所看到的,我的方法是将我可能想知道的所有内容都塞进去,因为如果你不使用它或试图对空间吝啬,那么你无论如何都会浪费边界线中的其余空间。终端的尺寸很少会小于 60 列,因此我认为保持边框内容线紧凑的价值为零。使用低对比度颜色作为边框是这里的关键,以保持或多或少干净的外观。因此,这解决了尝试控制该字段中显示内容的尴尬:考虑不要尝试控制显示内容和同时显示内容。
关于窗格标题的另一件事是它“应该”由 shell 和/或 shell 正在运行的程序设置。去年十月,这让我非常头痛,尽管我知道我已经解决了问题。截至目前,我的大脑和 git 日志都无法提供足够的信息来确定您需要做的正确事情是控制 pane_title 的设置方式,但足以说这是您需要做的复杂事情之一需要触摸您的 bash/zsh 配置来执行此操作,这可能是负责将其分配给您的主机名的东西,而不是更有用的东西,例如 cwd 或活动命令行。
我相信我必须将:XT
字符串添加到我的终端覆盖中以帮助其正常工作。看https://unix.stackexchange.com/a/75382/12497
我花了很长的路才能让这个工作正常进行,这也很重要,因为到目前为止,pane_title 是检查窗格中实际可能运行的程序的唯一可靠的直接方法。自从我开始工作以来,我的上下文相关 tmux 键绑定(根据 pane_title 的值进行谓词)工作得非常完美:当 zsh 处于活动状态时,pane_title 由 zsh 设置为最后运行的命令,当 vim 启动时,它会覆盖窗格标题带有我在 vimrc 等中设置的特定字符串。这可以很好地控制我的上下文敏感键绑定。之前出现的严重问题之一是,如果脚本“myscript”运行 Vim,那么 pane_title 就会变成“myscript”,导致我的按键绑定系统无法知道我正在窗格中运行 Vim。现在 Vim 可以更新终端标题,并在 tmux 窗格中正确设置它,检查窗格是否运行 vim 的逻辑大大简化了。
检测窗格内正在运行的内容的另一种方法是查询操作系统以查看进程是什么,因为我们确实可以访问 PID。但到目前为止,我一直避免在管道方面过于疯狂,而倾向于“标准”功能。我确信如果 pane_title 最终打败了我,我会编写一个 C++ 程序来打印我在相关窗格中运行的内容。祝你好运。