У меня была похожая проблема. В моей ситуации настройки DISPLAY
было недостаточно. По умолчанию часть среды задается при запуске сервера tmux (при запуске первого сеанса), а не только новый сеанс. Следующее работает для меня, но я сомневаюсь, что это оптимально.
В .tmux.conf
tmux запомнить переменные, которые вы хотите сохранить от внешней среды. Я использовал те, которые отличались между локальным использованием Gnome Terminal и удаленным использованием Terminal.app. Некоторые из них, вероятно, не нужны, но я не уверен, какой. Флаг -g
может быть неверным.
set -g update-environment "\
CLUTTER_IM_MODULE \
DBUS_SESSION_BUS_ADDRESS \
DBUS_SESSION_BUS_ADDRESS \
DEFAULTS_PATH \
DESKTOP_AUTOSTART_ID \
DESKTOP_SESSION \
DISPLAY \
GDMSESSION \
GNOME_DESKTOP_SESSION_ID \
GPG_AGENT_INFO \
GTK_IM_MODULE \
GTK_MODULES \
SESSION_MANAGER \
SSH_AGENT_PID \
SSH_ASKPASS \
SSH_AUTH_SOCK \
SSH_CONNECTION \
WINDOWID \
WINDOWPATH \
XAUTHORITY \
XDG_CONFIG_DIRS \
XDG_CURRENT_DESKTOP \
XDG_DATA_DIRS \
XDG_MENU_PREFIX \
XDG_RUNTIME_DIR \
XDG_SEAT \
XDG_SESSION_DESKTOP \
XDG_SESSION_ID \
XDG_SESSION_TYPE \
XDG_VTNR \
XMODIFIERS \
"
Несмотря на название «update-environment», настройка, кажется, фактически не меняет среду. Однако вы можете получить его, используя tmux show-environment
. Поэтому я использовал его для обновления среды в моем .zshrc
:
zshrc_restore_x11_vars()
{
if [[ -z $TMUX ]]
then
return 0
fi
local tmux_env="$(tmux show-environment)"
for var_line in ${(f)tmux_env}
do
if [[ $var_line == -[A-Za-z_]* ]]
then
local var=${var_line#-}
unset $var
elif [[ $var_line == [A-Za-z_]*'='* ]]
then
export $var_line
fi
done
}
precmd()
{
zshrc_restore_x11_vars
}
preexec()
{
zshrc_restore_x11_vars
}
Использование tmux show-environment -s
вероятно, было бы лучше. Но я не знал об этом, пока не перечитал часть man tmux
чтобы написать этот ответ.
Тем не менее, мне приходится иногда отсоединять и подключать при использовании существующего сеанса. Хотя это гораздо менее раздражает, чем раньше.
Полное раскрытие: идея использования tmux show-environment
в precmd
и preexec
была не моей, но я забыл, где я ее видел. Спасибо, кто бы ни написал это, где бы вы ни написали.