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

12

我正在尝试使用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种颜色工作更容易,那么我可以做到!
谢谢!
2个回答

20

为了让zsh解释ANSI转义序列,您需要使用美元单引号

PROMPT=$'\e[32mhi> '

会做你想要的,但最好将所有特殊代码放在%{...%}括号中,以便字面处理代码并防止光标位置的意外移动。 此外,你应该将颜色改回默认值,除非你想将终端文本前景全部染成绿色。

最终,你的提示设置应该像这样:

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

19

zsh提供了内置支持,可以在不直接处理ANSI转义代码的情况下改变颜色。

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

4
唯一正确的答案出现在“man zshmisc”的混浊内部。 - Cecil Curry
这适用于终端数据库,因此也适用于不使用ANSI转义序列的终端。(惊喜!)便携且更易读。还支持支持256色和1600万色的终端。man zshzle - Eljay
有没有一种方法可以打印出变量的转义版本,以查看其中的ANSI转义序列(而不是查看终端显示的解释/彩色版本)? - musbur
类似 print -P $PROMPT | hexdump -C 这样的命令, -P 选项展开了提示符转义序列,然后 hexdump -C 以更易读的 ASCII 格式显示原始字节。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接