Как показать переменную среды tmux в строке состояния (как формат окна)

все сводится к тому, что я хотел бы

  • печать переменной, уникальной для окна, или
  • запустите скрипт, уникальный для окна

и используйте вывод в строке состояния, чтобы каждый статус окна был уникальным. Я попытался сделать это более ясным через 2 сценария:


Сценарий 1

Я пытаюсь напечатать уникальную переменную в окне в строке состояния. Я открыл shell внутри tmux и сохранили переменную среды tmux локально (за сеанс) и глобально (для всех сеансов) со следующими командами соответственно:

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

Я могу проверить эти значения, например, перейдя в другую оболочку (в том же сеансе) и набрав:

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

Я написал небольшой скрипт bash под названием "tmuxscript", содержащий только:

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 ответов


хорошо, я понял.

проблема заключается в том, что вы обязаны использовать флаг-G (global) при указании состояния окна в .tmux.conf.

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

наслаждайтесь!


возможно, используя команду echo, вы можете вручную установить заголовок, используя этот синтаксис:

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

попробуйте запустить это в разных окнах TMUX и посмотреть, изменяет ли он заголовок.