也许我已经开始想得太多了,但我也找不到合适的解释。我最近安装了 oh-my-zsh,它附带了几个主题,这些主题改变了“提示”的外观以及使用的颜色,以及整个文本中使用颜色的“位置”。
如果我理解正确的话,有几种“基”颜色,比如某种红色、一些绿色、一些蓝色等。然后主题可以说“嘿,我想要一个蓝色,具体的蓝色应该是这个十六进制值”。
我很困惑为什么人们使用的终端模拟器也可以应用主题。我正在使用 HyperJS,我可以为其应用一个似乎负责所有颜色的主题,但是提示布局仍然可以通过 oh-my-zsh 设置。
oh-my-zsh 中使用的主题与终端主题有什么区别?有人可以解释一下主题正在做什么等的全部细节吗?
答案1
Oh-my-zsh 基本上执行默认操作promptinit
zsh 已经这样做了。他们只是通过采购主题文件来采取一些不同的做法。基本思想是修改 PS1、PS2、PS3 和 PS4 值。您的终端模拟器不会更改这些值(据我所知)。例如,如果您在终端模拟器中将字体的默认颜色设置为红色,则 $reset_color 将为红色。
您可以轻松地在库存 ZSH 安装上创建自己的主题,例如,我有自己的库存 zsh 主题(提示):
~./.zsh/prompt/prompt_XXXXXXX_setup
您可以创建一个包含以下内容的文件:
prompt_XXXXXXX_setup() {
autoload -Uz colors && colors
# You now have access to:
# $fg[red] etc
# $bg[red] etc
# and the bold variant: $bg_bold and $fg_bold
# and the $reset_color
PROMPT="$fg_bold[blue]My shiney$reset_color $bg_bold[green]prompt %(!.#.%) " # although the docs seem to prefer you using PS1
}
prompt_XXXXXXX_setup "$@"
现在启用此提示:
zcompile ~/.zsh/prompt/prompt_XXXXXXX_setup # optional, but advised
# set this in your .zshrc and you will always have this as a prompt when using zsh
fpath=(~/.zsh/prompt $fpath)
autoload -Uz promptinit && promptinit && prompt XXXXXXX
您现在可以使用 切换提示prompt <name>
,或获取提示列表:prompt -l
。如果您想要更复杂的设置,请看这里:zsh-提示符-powerline或者我自己的设置。另请参阅 ZSH 文档这里或源代码提示初始化。
答案2
终端对颜色的支持由各种标准指定,例如ECMA-48或添加更多颜色的更高标准。如今,终端大多是虚拟窗口,而不是专用硬件设备TERM
通常可以通过设置环境变量来更改模拟的终端 -可以模拟不支持颜色的终端, 例如。
对于现代终端,如果您想要颜色,通常的建议是启用 256 色支持,通常是通过TERM=xterm-256color
旧标准仅指定少得多的颜色。各种各样的文档详细说明了确切的代码用于生成颜色,这可以手动完成
% print "\033[31;5mDANGER DANGER WILL ROBINSON\033[0m"
...
尽管为了可移植性,通常最好使用库,例如ncurses
或在您的情况下针对各种颜色代码使用特定的 ZSH 语法
% print -P '%F{red}DANGER%f'
...
% print -P '%F{red}DANGER%f' | hexdump -C
00000000 1b 5b 33 31 6d 44 41 4e 47 45 52 1b 5b 33 39 6d |.[31mDANGER.[39m|
00000010 0a |.|
00000011
% print "\033[31;5mxxx\033[0m" | hexdump -C
00000000 1b 5b 33 31 3b 35 6d 78 78 78 1b 5b 30 6d 0a |.[31;5mxxx.[0m.|
0000000f
oh-my-zsh 正在做的是捆绑与上面类似的随机代码,(最终)生成类似于\033[31m
上面显示的代码的内容,然后由终端使用并显示(或不显示)。终端如何处理这些代码取决于终端,\033[31m
(“前景色红色”)可以显示为绿色(或忽略);终端中的此类颜色设置集可能被终端软件称为主题;尽管使用相同的名称,但这与 oh-my-zsh 主题完全不同。