ZSH 主题、提示和基于终端的主题之间有什么区别?

ZSH 主题、提示和基于终端的主题之间有什么区别?

也许我已经开始想得太多了,但我也找不到合适的解释。我最近安装了 oh-my-zsh,它附带了几个主题,这些主题改变了“提示”的外观以及使用的颜色,以及整个文本中使用颜色的“位置”。

如果我理解正确的话,有几种“基”颜色,比如某种红色、一些绿色、一些蓝色等。然后主题可以说“嘿,我想要一个蓝色,具体的蓝色应该是这个十六进制值”。

我很困惑为什么人们使用的终端模拟器也可以应用主题。我正在使用 HyperJS,我可以为其应用一个似乎负责所有颜色的主题,但是提示布局仍然可以通过 oh-my-zsh 设置。

oh-my-zsh 中使用的主题与终端主题有什么区别?有人可以解释一下主题正在做什么等的全部细节吗?

答案1

Oh-my-zsh 基本上执行默认操作promptinitzsh 已经这样做了。他们只是通过采购主题文件来采取一些不同的做法。基本思想是修改 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 主题完全不同。

相关内容