gos*_*pes 8 bash statusbar tmux
它归结为,我想
并使用状态栏中的输出,使每个窗口状态是唯一的.我试图通过两种情况更清楚地说明:
场景1
我正在尝试在状态栏中打印一个唯一的每个窗口变量.我在tmux中打开了一个shell,并分别使用以下命令在本地(每个会话)和全局(对于所有会话)存储了tmux环境变量:
bash> tmux set-environment TMUX_STATUS_1 localvalue1
bash> tmux set-environment -g TMUX_STATUS_1 globalvalue1
Run Code Online (Sandbox Code Playgroud)
我可以验证这些值,例如通过转到另一个shell(在同一个会话中)并键入:
bash> tmux show-environment TMUX_STATUS_1
TMUX_STATUS_1=localvalue1
bash> tmux show-environment -g TMUX_STATUS_1
TMUX_STATUS_1=globalvalue1
Run Code Online (Sandbox Code Playgroud)
我试图在状态栏中打印上述值(本地值和全局值)并配置窗口格式如下:
WINDOW='[#(tmux show-environment -g TMUX_STATUS_#I 2>&1)]'
setw -g window-status-current-format $WINDOW
setw -g window-status-format $WINDOW
Run Code Online (Sandbox Code Playgroud)
最初它只显示windows为'[]',之后我将stderr重定向到stdout并获得状态栏显示如下:
[unknown variable: TMUX_STATUS_1] [unknown variable: TMUX_STATUS_2] [...
Run Code Online (Sandbox Code Playgroud)
需要更改什么才能使状态栏显示(根据以前的命令):
[globalvalue1] [unknown variable: TMUX_STATUS_2] [...
Run Code Online (Sandbox Code Playgroud)
PS:这不是状态栏刷新问题,因为我在设置变量后手动强制刷新状态栏时使用了以下命令:
tmux refresh-client -S
Run Code Online (Sandbox Code Playgroud)
情景2
我写了一个名为'tmuxscript'的小bash脚本,仅包含:
echo "$(date '+%S') window:$(tmux display -p '#I') args:$@"
Run Code Online (Sandbox Code Playgroud)
我更新了我的PATH变量,并将窗口格式更改为'[#(tmuxscript arg1 #I)]'.输出如下:
[47 window:1 args:arg1] [47 window:1 args:arg1] [...
Run Code Online (Sandbox Code Playgroud)
时间更新很好.在脚本中打印窗口索引似乎不起作用.数字1表示当前聚焦窗口的窗口索引.为所有窗口设置此值,这不是我想要的.我至少期望看到(注意窗口索引号):
[47 window:1 args:arg1] [47 window:2 args:arg1] [...
Run Code Online (Sandbox Code Playgroud)
此外,#I没有过去的脚本,但文本'arg1'是.如何将tmux变量传递给脚本?
编辑:我现在也尝试将窗口状态设置为:
'[#(tmux show-environment -g TMUX_STATUS_$\(tmux display -p "#I"\) 2>&1 | sed "s:^.*=::" )]'
Run Code Online (Sandbox Code Playgroud)
当活动(聚焦)窗口索引为1时,它给出了以下内容:
[globalvalue1] [globalvalue1] [...
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!
好吧,我明白了。
问题在于,在.tmux.conf中指定窗口状态时,您必须使用 -g (全局)标志。
.tmux.conf:
WINDOW="[#I #20W]"
set-window -g window-status-current-format $WINDOW
set-window -g window-status-format $WINDOW
Run Code Online (Sandbox Code Playgroud)
关键是创建窗口后将状态设为本地。此外,每个窗口都需要是唯一可识别的。幸运的是,这可以通过 tmux 变量“window_id”来完成。如下所示的一个小脚本将输出一个窗口唯一的变量,并以此 id 作为其第一个参数:
〜/ tmuxstatus:
#!/bin/bash
VARIABLE="W_$1"
VALUE=$(tmux show-environment -g $VARIABLE 2>&1)
VALUE=${VALUE#*=}
echo $VALUE
Run Code Online (Sandbox Code Playgroud)
可能有一个仅 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
Run Code Online (Sandbox Code Playgroud)
当改变W_id的值时,窗口状态也会改变。看起来像:
[1 value_@0] [2 value_@1] [3 value_@2] [4 value_@3]
Run Code Online (Sandbox Code Playgroud)
享受!
归档时间: |
|
查看次数: |
8902 次 |
最近记录: |