WSL中zsh的颜色问题

8
所以,我正在尝试在wsl终端中设置oh-my-zsh(在这里使用powershell作为控制台,但在cmd中遇到了相同的问题)。我认为我已正确设置所有颜色: enter image description here 当我运行以下命令时: print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b' 我得到了期望的结果: enter image description here 但是,我的提示仍然有问题,如您所见。我正在使用agnoster主题,pwd上的灰色背景应该是蓝色。
是否有办法查看转义序列,以便确定问题是转义序列本身还是呈现问题?

1
为什么不使用本地WSL控制台? - 4c74356b41
没有本地的wsl控制台。默认情况下,它在cmd控制台中运行,但对我来说有同样的问题。 - Tejay Cardon
你可能想要查看Joel Bennett的Pansies - BenH
1个回答

2
我们可以检查$PROMPT(或$PS1)。
事实上,oh-my-zsh的agnoster主题使用PROMPT_SUBST。因此,我们可以通过重定向或管道print -P的输出来获取原始转义序列:
$ print $PROMPT
%{%f%b%k%}$(build_prompt)
$ print -P $PROMPT | cat -v ;# or redirect to a file as you like
^[[39m^[[0m^[[49m^[[40m^[[39m me@mycomputer ^[[44m^[[30mM-nM-^BM-0^[[30m ~ ^[[49m^[[34mM-nM-^BM-0^[[39m

这些原始的转义序列,即 ANSI 转义码,在 https://en.wikipedia.org/wiki/ANSI_escape_code#Colors 中有详细描述。它是 CSI 代码 CSI n m SGR - 选择图形呈现。

尝试描述上述输出:

(^[[39m: 前两个字符被 cat -v 转义了。我们得到了 ESC[39m。)

  • ^[[39m^[[0m^[[49m:这些代码是来自于print $PROMPT输出中的%{%f%k%b%}部分。 ^[[39m 用于重置默认前景色,^[[0m 用于重置所有效果,而[[49m则用于重置默认背景色。
  • ^[[40m^[[39m me@mycomputer:背景色为黑色,前景色为默认颜色。
  • ^[[44m^[[30m M-nM-^BM-0:背景色为蓝色,前景色为默认颜色(M-nM-^BM-0cat -v转义后的形式,代表着)。

从这里可以看出,提示符输出了一个pwd的背景蓝色代码。您可以使用以下命令进行检查:
print -P '%b%F{red}co%F{green}lo%F{blue}rs%f%b'(注意:第一个'%b')

这意味着PowerShell的颜色设置与ANSI转义序列不匹配。如果我们有sh,可以使用发行版中的16colors.sh,并查看sh ./16colors.sh的输出来检查终端的颜色调色板设置是否正确。(例如,可以在https://www.in-ulm.de/~mascheck/various/xterm/16-table.html找到示例xterm默认设置的输出。)
看起来你的PowerShell的Solarized(?)主题将ansi颜色序列蓝色(^[[44m^[[34m)映射为对我们眼睛来说是灰色的颜色。

请问您能告诉我这段代码的含义吗? ^[[39m^[[0m^[[49m^[[40m^[[39m me@mycomputer ^[[44m^[[30mM-nM-^BM-0^[[30m ~ ^[[49m^[[34mM-nM-^BM-0^[[39m - Tejay Cardon
更新了;我已经添加了尝试描述它们。 - hchbaw

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