Как показать переменную среды 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 и посмотреть, изменяет ли он заголовок.