如何在tmux状态栏中显示环境变量(作为窗口格式)

12

关键是,我希望能够:

  • 打印一个窗口唯一的变量,或者
  • 运行一个窗口唯一的脚本

并将输出用于状态栏,使每个窗口的状态都是唯一的。 我尝试通过以下两种情况来更清楚地说明:


情况1

我正在尝试在状态栏中打印每个窗口唯一的变量。 我已经在tmux内开了一个shell,并使用以下命令存储了tmux环境变量的本地副本(对于每个会话)和全局副本(适用于所有会话):

bash> tmux set-environment TMUX_STATUS_1 localvalue1
bash> tmux set-environment -g TMUX_STATUS_1 globalvalue1

例如,我可以通过打开另一个 shell(在同一个会话中)并输入以下命令来验证这些值:

bash> tmux show-environment TMUX_STATUS_1
    TMUX_STATUS_1=localvalue1
bash> tmux show-environment -g TMUX_STATUS_1
    TMUX_STATUS_1=globalvalue1

我已经尝试在状态栏中打印上述值(本地和全局值),并将窗口格式配置如下:

WINDOW='[#(tmux show-environment -g TMUX_STATUS_#I 2>&1)]'
setw -g window-status-current-format $WINDOW
setw -g window-status-format $WINDOW

最初只显示窗口为 '[]',之后我添加了将stderr重定向到stdout的操作,然后状态栏显示如下:

[unknown variable: TMUX_STATUS_1] [unknown variable: TMUX_STATUS_2] [...

需要更改哪些内容才能使状态栏显示(根据先前的命令):

[globalvalue1] [unknown variable: TMUX_STATUS_2] [...

PS:这不是状态栏刷新的问题,因为在将变量设置后,我使用了以下命令来手动强制刷新状态栏:

tmux refresh-client -S

场景2

我写了一个名为“tmuxscript”的小型bash脚本,其内容如下:

echo "$(date '+%S') window:$(tmux display -p '#I') args:$@"

我已更新了PATH变量,并将窗口格式更改为 '[#(tmuxscript arg1 #I)]'。输出结果如下:
[47 window:1 args:arg1] [47 window:1 args:arg1] [...

时间显示更新得很好。在脚本中打印窗口索引似乎不起作用。数字1代表当前聚焦窗口的窗口索引。该值适用于所有窗口,而这不是我想要的。我至少希望看到(请注意窗口索引号):
[47 window:1 args:arg1] [47 window:2 args:arg1] [...

此外,#I无法传递到脚本中,但文本“arg1”可以。我如何将tmux变量传递给脚本?


编辑:我现在还尝试将窗口状态设置为:

'[#(tmux show-environment -g TMUX_STATUS_$\(tmux display -p "#I"\) 2>&1 | sed "s:^.*=::" )]'

当活动(焦点)窗口索引为1时,我得到了以下结果:
[globalvalue1] [globalvalue1] [...

非常感谢您提供的任何帮助!


我猜测问题出在 #(..) 中没有扩展 #I。但是在错误信息中,它被扩展了:unknow... :Tmux_.._#I。很可能是这样工作的。换句话说,你的 shell 命令正在寻找不存在的 tmux_status_#I - Kent
那么为什么错误消息会报告正确的变量呢?如果我在终端中运行(在索引为1的tmux窗口中):'tmux showenv -g TMUX_STATUS_#I',它会返回:'unknown variable: TMUX_STATUS_#I'。但是当尝试运行自定义脚本时,你是正确的。#I没有被扩展/传递(见方案2)。 - gospes
也许我没有解释清楚。错误消息原始内容为 TMUX_STATUS_#I not found,因为你设置了窗口名称,#I 被替换为 1,2,3... 的 winIdx。这就是为什么你在错误消息中得到了“正确”的变量名。但是,在 shell 错误消息中你得到了 #I - Kent
2个回答

2

好的,我已经理解了。

问题在于,在.tmux.conf中指定窗口状态时,您必须使用-g(全局)标志。

.tmux.conf文件:

WINDOW="[#I #20W]"
set-window -g window-status-current-format $WINDOW
set-window -g window-status-format $WINDOW

关键是在创建窗口后使状态本地化。此外,每个窗口都需要有唯一的标识符。幸运的是,可以通过tmux变量'window_id'来实现这一点。下面是一个小脚本,将输出一个变量,其第一个参数是具有此id的窗口的唯一标识符: 〜/ tmuxstatus
#!/bin/bash

VARIABLE="W_$1"
VALUE=$(tmux show-environment -g $VARIABLE 2>&1)
VALUE=${VALUE#*=}
echo $VALUE

可能存在一种仅使用TMUX的解决方案使状态本地化,但我目前没有时间去实现。我正在使用bash通过环境变量PROMPT_COMMAND来实现,该变量在显示提示符之前被评估。

.bashrc文件:

function __prompt_command (){
   if [ -n "$TMUX" ] && [ ! -n "$TMUX_INIT" ]; then
        W=$(tmux display -p '#{window_id}')
        VARIABLE="W_$W"
        VALUE="value_$W"
        STATUS="[#I #(~/tmuxstatus $W)]"
        tmux set-option quiet on;
        tmux set-environment -g $VARIABLE $VALUE;
        tmux set-window window-status-current-format "$STATUS";
        tmux set-window window-status-format "$STATUS";
        export TMUX_INIT="done";
    fi; 
}
export PROMPT_COMMAND=__prompt_command

当更改W_id的值时,窗口状态也会发生变化。它看起来像这样:

[1 value_@0] [2 value_@1] [3 value_@2] [4 value_@3]

尽情享受吧!


0
也许可以使用echo命令。您可以使用以下语法手动设置标题:
echo -ne "\033]0;$(tmux show-environment TMUX_STATUS_1)\007"

尝试在不同的tmux窗口中运行,并查看是否更改了标题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接