根据环境变量的值格式化 zsh 提示符

根据环境变量的值格式化 zsh 提示符

我希望根据我是否在 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

相关内容