如何更改 ZSH 中最后一个退出代码的提示颜色?

How to change color of prompt from last exit code in ZSH?

我的 .zshrc 中有这段代码:

autoload -U colors && colors

function change_color() {
    if [[ "$?" = 0 ]]; then
    return "green"
  else
    return "red"
  fi
}

PS1="%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]% %{$fg[$changecolor]%}➜%b "

但是,无论我做什么, 字符都保持白色。

作为一个函数,您需要调用它,而不是将它扩展为一个变量。用命令替换来做到这一点:

PS1="...%{$fg[$(changecolor)]%}➜%b "

但是,此提示中有很多类似 bash 的东西,您可以用更简单、更强大的 zsh 功能替换它们。首先,%F 可用于直接更改颜色,而无需使用存储在数组中的转义码。 (与原始转义码和其他 zsh 定义的转义序列不同,%F{...} 不需要包装在 %{...%} 中。)其次,有专门用于生成一个值的提示转义或另一个取决于最后的退出状态是否为 0。

PS1='%B%F{red}[%F{yellow}%n%F{green}@%F{blue}%M '
PS1+='%F{magenta}%~%F{red}] %(?.%F{green}.%F{red})➜%b%f '
如果最后一个命令成功,

%(?.FOO.BAR) 扩展为 FOO,否则为 BAR%f 将颜色恢复为默认颜色,而不管前面的任何 %F 代码。


%(...) 实际上比仅测试退出代码更通用。 ? 只是 20 多个可测试条件之一。举个愚蠢的例子,假设你的生日是 1 月 18 日。这是一个在你生日那天在你的提示中放一个蛋糕的逃避方法。

%(0D.%(18d..).)

有关提示转义码的更多信息,请参阅 man zshmisc