前一段时间需要从本地SSH到某台云服务器查看配置文件,BOSS在我边上跟我一起找文件。找毕,BOSS说:“你这颜色看着不难受么?辨识度太低了”当时我的屏幕是这样的:
其实我也是这么认为的,这颜色太惨了。漆黑的背景,深深蓝色的标识符,实在是看不清楚。说搞就搞,网上找各种配色方案,先来一打iTerm2的配色方案,再把其中的背景图片也设置一下,先不说远端服务器的效果(因为有坑,后说),本机已经是这样的了:
一不做而不休,把本机的oh-my-zsh也在自己CentOS的腾讯云主机里搞一套,当然vim的配色也不能少,都要搞的漂漂亮亮的:
这些配色都还没什么,基本上随便选个zsh主题,选个vim主题,选个iTerm2主题,基本都可以看起来比较舒服了。(主要是自己舒服)
但是,但是!
在选iTerm2主题的时候出现了问题:有时候我选择不同的主题,为什么感觉zsh的条没有变化呢?
这简直就**尴尬了。。那岂不是意味着,那些恶心的蓝色,还会是一如即往的恶心?可这到底是为什么呢?明明用户名都是变色龙一样的了,为啥有些字死活就不动呢?百度不到靠谱的答案,只能google了。在StackOverflow上找到了一个问题,答主热心的解答了其中的原理:
There are two layers of settings/themes at work here:The terminal or terminal emulator, in your case iTerm2
Depending on the terminal only a limited color palette is supported. "Traditionally" there have been 16 colors: 8 Normal and 8 Light/Bright. They are assigned the code 0 to 7 and 8 to 15, respectively. They also have names, with the codes n and n+8 sharing the same name…
由于不是英语课,我就不在这里全文引用了。感兴趣的同学可以通过上面的链接进去看到原文。
我在这里简单介绍下答主的中心思想:
- 终端显示总共经历了两(三)层:
- 应用(如:vim)/ shell:决定了显示成什么样的颜色
- 用户终端(如:iTerm2): 决定了怎么显示
- 你看到了颜色
这么说毕竟太抽象了,不妨换个说法:
- 你上课的时候通过后桌的男生传话给最后面的女生也经历了两(三)个步骤:
- 你说:我爱你,
- 结果后桌也喜欢最后面的小女生,他知道你是在表白,就把你的表白变成了表黑,但他看不懂函数,于是他和小女生说:**说他可烦你了,还给了个公式
- 于是小女生看到了你后桌传过来的信息,就是这样的:***说他可烦你了,还有
看到这一定更糊涂了吧!哈哈!其实后面的故事主要是想表示,各种各样的终端会将应用传过来的信息展示给最终用户看,但是有些终端软件已知的一组预定义颜色是可以被它替换成特定颜色的。而它本身读不懂的颜色(其实是没有替换策略的颜色)就会原封不动的传给坐在显示器前的你的。这样就可以知道,为什么有些颜色可以跟着securtCRT/iTerm2的配色而变,有些不可以了吧?
接下来再具体的展示下如何实现,以及怎么调整配色使配色万年不变或者随着终端千变万化。先看这样一条命令
print -P ‘%F{yellow}yellow %F{2}green %1Fred %F{117}light blue‘
把这条命令通过你的linux终端执行一下,就可以看到如下结果
再输入一条命令:
for a in {0..255}; printf "\x1b[48;2;255;${a};0m \x1b[0m"
可以看到如下结果:
现在可以开始我们的实验了,打开iTerm2的Colors配置页,调整当前页面的配色(选了个Batman)
可以看到结果:在蝙蝠侠的配色下,红的绿的文字被变成了不同的黄色,但是RGB颜色调出来的彩虹是没有变化的。按照这个思路,找到zsh的主题配置页,路径如下:
\~/.oh-my-zsh/themes
对其中一个固定颜色的片段进行调整,用iTerm2所能调整的颜色之一Blue定义这个片段(变化在光标处)1
用source命令生效.zshrc后看看效果:
这样就可以让zsh的配色随着iTerm2的不同主题发生变化了!
同理,大家可以看下vim的主题描述中,大量的使用了非RGB的方式来对配色进行描述。这样带来的好处是,心情变化的时候换配色很容易!
最后附上 ANSI escape code在wiki上的链接以及这些可以随终端配色变化而变化的颜色名称列表,: