我有一个类似的问题。在我的情况下,设置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
钩子中使用的想法不是我自己的,但是我忘记了在哪里看到它。谢谢,无论写在哪里的人。