在 zsh 提示符下使用 ANSI 转义序列

Using ANSI escape sequences in zsh prompt

我正在尝试使用 ANSI 转义序列来设置我的 zsh 提示符的颜色,但是转义符 (\e) 似乎在显示提示符时被转义了。这是我 运行 和我得到的输出的示例:

> autoload promptinit && promptinit
> autoload colors && colors
> echo "Not sure if those two lines are required" > /dev/null
> PROMPT="\e[32mhi> "
\e[32mhi> echo "Note that the escape character wasn't interpreted correctly" > /dev/null
\e[32mhi> print -P "$PROMPT"
hi>
\e[32mhi> echo "The hi> was printed in green, as I want" > /dev/null

zsh 打印文档似乎说 -P 标志使它像在提示中一样打印,但它与实际的提示行为不匹配。有谁知道为什么转义字符不起作用?

我尝试使用 $fg_no_bold$fg_no_bold[red] 之类的东西确实有效,但我想使用超过 8 种标准颜色,但 $fg_no_bold[32] 不起作用(对于任何数字,而不仅仅是 32)。如果使用 $fg_no_bold 获得 256 种颜色更容易,那么我会这样做!

谢谢!

zsh 为更改颜色提供内置支持,而无需直接处理 ANSI 转义码。

PROMPT="%F{green}hi>%f "

您需要使用 dollar 单引号 来告诉 zsh 解释 ANSI 转义序列。 所以

PROMPT=$'\e[32mhi> '

会做你想做的事,但是将所有特殊代码另外放在 %{...%} 括号内以按字面意思处理代码并防止光标位置不必要地移动会更安全。 此外,您应该将颜色改回默认值,除非您想将所有终端文本前景着色为绿色。

毕竟你的提示设置应该是这样的

PROMPT=$'%{\e[32m%}hi> %{\e[0m%}'