我希望根据我是否在 tmux 会话中来决定 zsh 提示符的颜色。在bash中,可以通过检查$TMUX的值来完成,但我在zsh中找不到等效的方法。在zsh中可以吗?
答案1
在 zsh 中,prompt_subst
选项默认关闭。如果您想在提示中使用变量替换,请将其打开。
setopt prompt_subst
PS1='$foo'
不过,对于$TMUX
,您不需要这个。该值在会话期间不会更改,因此您可以PS1
在 shell 启动时进行初始化。
setopt prompt_subst
if (($+TMUX)); then
PS1='[tmux:${TMUX_PANE//\%/%%}] %# '
else
PS1='[not tmux] %# '
fi
注意迅速扩张发生在变量替换之后,这就是为什么需要保护变量值中的百分号。
答案2
启动时,tmux 将继承启动它的 shell 的环境变量(与所有其他进程一样)。
从那时起,tmux 会将这些相同的环境变量赋予它创建的伪终端。除了一个重要的环境变量
$TERM
tmux 服务器将保存原始 shell 赋予它的值。
您可以通过以下方式查询
<C-b>:display-message "$TERM"
在我的系统上,这给出了xterm-256color
.
但是 tmux 启动的所有伪终端都会得到类似的结果
$TERM=screen
在我的系统上,我设置了伪终端,以便TERM=screen-256color
在 tmux 内运行的程序(vim)知道终端的颜色功能。您可以使用 tmux 命令来完成此操作
set -g default-terminal "screen-256color"
无论哪种方式,您都可以检查该字符串是否存在并相应地设置提示
~/.zshrc
if [[ $TERM == *screen* ]]; then
# you're in tmux, congratulate yourself :)
# set your tmux prompt here
else
# you're not in tmux
# set your fallback prompt here
fi