如何根据条件格式化我的 zsh 提示?

Bon*_*nz0 6 linux terminal zsh prompt command-prompt

我正在使用这里给出的答案:如何 zsh ansi 颜色代码工作?格式化并为我的 zsh 提示添加颜色。

有没有办法根据某些条件格式化提示?

例如,如果主机名中有这个词PROD,那么我希望我的提示有一个红色背景。否则,我想要没有背景和粗体绿色文本。

che*_*ner 2

您可以设置一个precmd功能,在每次显示提示之前重置提示。

set_red_prompt_background () {
  if [[ ${(%):-%M} = *PROD* ]]; then
    PS1="%K{red}$PS1%k"
  else
    PS1="%F{green}%B$PS1%f%b"
  fi
}

typeset -a precmd_functions
precmd_functions+=(set_red_prompt_background)
Run Code Online (Sandbox Code Playgroud)

这还没有经过测试,所以如果它按原样工作我会感到惊讶。但这是它的工作原理。

  • ${:-foo}是一种特殊类型的“参数”扩展,它仅扩展为 后面的单词:-。乍一看似乎没什么用...
  • ${(%):-%M}与上面相同,但具有(%)指示zsh处理扩展中发现的任何提示转义的标志。这变成了一种使用转义符获取出现在提示中的完整主机名的奇特方式%M
  • 检查是否与模式匹配*PROD*,即主机名是否包含PROD。
  • 取任何值PS1,并将其包裹起来%K{red}...%k以使背景变为红色。请注意,这可能会覆盖 中已设置的任何背景颜色PS1
  • 添加set_red_prompt_background到显示提示之前执行的函数列表。如果您在此之后添加任何函数,它们可能会覆盖您在此处设置的颜色。