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

时间:2014-01-15 13:04:34

标签: bash statusbar tmux

归结为,我想

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

并使用状态栏中的输出,使每个窗口状态都是唯一的。我试图通过两种情况更清楚地说明这一点:


情景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

最初它只显示windows为'[]',之后我添加了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] [...

感谢任何帮助!

2 个答案:

答案 0 :(得分: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'来完成。如下所示,一个小脚本将输出一个唯一的窗口变量作为其第一个参数:

<强>〜/ 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]

享受!

答案 1 :(得分:0)

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

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

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