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

Posted

技术标签:

【中文标题】如何在状态栏中显示 tmux 环境变量(作为窗口格式)【英文标题】:How to show a tmux environment variable in the status bar (as window format) 【发布时间】:2014-02-03 23:12:36 【问题描述】:

归根结底是,我想

打印窗口独有的变量,或者 运行窗口独有的脚本

并使用状态栏中的输出,使每个窗口状态都是唯一的。我试图通过 2 个场景使其更加清晰:


场景 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 那为什么错误信息会报告正确的变量呢?如果我在终端中运行(在索引为 1 的 tmux 窗口中):'tmux showenv -g TMUX_STATUS_#I' 它返回:'未知变量:TMUX_STATUS_#I'。但是,当您尝试运行自定义脚本时,您是对的。 #I 没有得到扩展/通过(参见场景 2)。 可能我没有解释清楚。错误消息原来是TMUX_STATUS_#I not found,因为您设置了窗口名称,#I 被替换为1,2,3... winIdx。这就是为什么您在错误消息中得到“正确”变量名的原因。但是你在 shell 错误消息中得到了 #I 【参考方案1】:

好的,我想通了。

问题在于,在 .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 唯一的解决方案来使状态成为本地,但我目前没有时间。我在环境变量 PROMPT_COMMAND 的帮助下使用 bash 来执行此操作,该变量在显示提示之前进行评估。

.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]

享受吧!

【讨论】:

【参考方案2】:

也许使用 echo 命令,您可以使用以下语法手动设置标题:

echo -ne "\033]0;$(tmux show-environment TMUX_STATUS_1)\007"

尝试在不同的 TMUX 窗口中运行它,看看它是否改变了标题。

【讨论】:

以上是关于如何在状态栏中显示 tmux 环境变量(作为窗口格式)的主要内容,如果未能解决你的问题,请参考以下文章

c#中,调试的时候,下面怎么不显示局部变量和监视窗口?

tmux:如何将两个 tmux 窗口合并为一个窗格?

如何在tmux窗口中启动脚本后自动终止ssh连接?

tmux 使用 tmux-resurrent 保存当前工作环境

tmux 使用 tmux-resurrent 保存当前工作环境

如何设置PATH环境变量