【问题标题】:How to change color of prompt from last exit code in ZSH?如何从 ZSH 中的最后一个退出代码更改提示颜色?
【发布时间】:2022-01-14 01:35:26
【问题描述】:

我的 .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 "

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

【问题讨论】:

  • 您正在使用变量$changecolor,它永远不会被分配。但即使您将它分配给某个值,PS1 也会在定义 PS1 变量时获得该值,并且之后永远不会改变。
  • 您可以安装spaceship 或至少查看其源代码以了解如何在那里实现基于状态的提示更改,而不是重新发明轮子。

标签: shell zsh prompt


【解决方案1】:

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

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找到。

【讨论】:

  • 非常感谢,这真的帮助了我,解决了很多小时或为此烦恼:)。我的提示现在很完美,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多