В чем разница между темами ZSH, приглашениями и темами на основе терминала?

Возможно, я начал задумываться над этим, но я также не смог найти подходящего объяснения этому. Я недавно установил oh-my-zsh, и он поставляется с несколькими темами, которые изменяют внешний вид «подсказки», а также используемые цвета, а также «где» цвета используются по всему тексту.

Если я правильно понимаю, есть несколько «базовых» цветов, например, какой-то красный, зеленый, синий и т. Д. Темы могут сказать: «Эй, я хочу синий цвет, а конкретный синий цвет должен быть это шестнадцатеричное значение “.

Я не понимаю, почему тогда используемый эмулятор терминала также может применять тему. Я использую HyperJS, и я могу применить для него тему, которая, кажется, берет на себя ответственность за все цвета, однако макет подсказки все еще может быть установлен через oh-my-zsh.

В чем разница между темами, которые используются в oh-my-zsh, и темой терминала? Может кто-нибудь объяснить всю разбивку того, что делают темы и тому подобное?

Терминальная поддержка цветов определяется различными стандартами, например, ECMA-48 или более поздними стандартами, в которых добавлено больше цветов. В наши дни терминалы в основном являются виртуальными windowsми, а не выделенными аппаратными устройствами, и эмулируемый терминал обычно можно изменить, установив переменную среды 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, несмотря на использование того же имени.

Oh-my-zsh в основном делает то, promptinit уже делает по умолчанию promptinit zsh. Они просто делают это немного по-другому, получая файлы тем. Основная идея заключается в том, что они изменяют значения PS1, PS2, PS3 и PS4. Ваш эмулятор терминала не меняет эти значения (afaik). Например, ваш $ 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 или получать список подсказок: prompt -l . Если вы хотите более сложную настройку, посмотрите здесь: zsh-prompt-powerline или моя собственная установка . Смотрите также документацию ZSH здесь или исходный код promptinit .