【问题标题】:Color issues with zsh in wslwsl中zsh的颜色问题
【发布时间】:2017-08-11 17:37:22
【问题描述】:

所以,我正在尝试在 wsl 终端中设置 oh-my-zsh(此处使用 powershell 作为控制台,但我在 cmd 中遇到了同样的问题)。我想我正确设置了所有颜色:

当我运行这个时:

print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'

我得到了预期:

但是,如您所知,我的提示仍然是错误的。我使用的是 agnoster 主题,密码上的灰色背景应该是蓝色的。

有什么方法可以查看转义序列,以便我可以确定问题出在转义序列与渲染之间吗?

【问题讨论】:

  • 为什么不用原生 wsl 控制台?
  • 没有原生 wsl 控制台。默认情况下,它在 cmd 控制台中运行,但这对我来说有同样的问题。
  • 您可能想查看 Joel Bennett 的 Pansies

标签: powershell terminal zsh oh-my-zsh windows-subsystem-for-linux


【解决方案1】:

我们可以检查$PROMPT(或$PS1)。

确实,oh-my-zsh 的 agnoster 主题 uses 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:来自%{%f%k%b%} 部分print $PROMPT 输出。 ^[[39m 重置默认前景色,^[[0m 重置所有效果,[[49m 重置默认背景颜色。
  • ^[[40m^[[39m me@mycomputer: bg black 和 fg 默认颜色
  • ^[[44m^[[30m M-nM-^BM-0:bg blue 和 fg 默认颜色(M-nM-^BM-0cat -v  的转义形式)

此时,提示似乎输出了pwd的bg蓝色代码。您可以通过
print -P '%b%F{red}co%F{green}lo%F{blue}rs%f%b' 进行检查(注意:第一个 '%b')

这意味着 powershell 的调色板设置与 ANSI 转义序列不匹配。如果我们有sh 并看到sh ./16colors.sh 的输出,我们可以通过xterm 分发中的16colors.sh 检查终端的色板设置是否正确。 (可以找到示例 xterm 默认设置的输出,例如:https://www.in-ulm.de/~mascheck/various/xterm/16-table.html

您的 powershell 的 Solarized(?) 主题似乎将 ansi 颜色序列蓝色(^[[44m^[[34m)映射为 grey-ish 颜色。

【讨论】:

  • 别以为你能指点我从哪里得到这个意思:^[[39m^[[0m^[[49m^[[40m^[[39m me@mycomputer ^[[44m^[[30mM-nM-^BM-0^[[30m ~ ^[[49m^[[34mM-nM-^BM-0^[[39m
  • 已更新;我已经添加以尝试描述它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多