每天进步一点点: 终端也可以色彩斑斓

in #cn7 years ago

昨天的帖子,学习了如何让Python程序原地刷新。实现原地刷新以后我又冒出了个新想法,有没有办法让输出的内容带一些颜色呢,这样看起来是不是会更舒服一些呢。


(图源 :pixabay)

简单例子

查了一下果然和上篇文章中用到的回车、换行、退格一样,色彩功能也是用ASCII码\e配合其它控制内容实现的。试了一下属实很好玩,但是具体使用方法有点晕,乱乱的找不到头绪。

比如这行代码:
echo -e 'This is a \033[1;35m test \033[0m!'
可以在终端显示这样的文本:
但是你能看懂代码都是啥意思吗?总之我是看不懂。

作为一个喜欢刨根问底儿的人,有看不懂的代码,如果行数很多也就罢了,这才一行代码,怎么能忍得了。必须搞懂啊,于是一通查资料,比如维基百科上的这篇文章:ANSI escape code

详细解释

通过学习这篇ANSI escape code,我们可以理解上述代码了。

\033就是ESC啦,也可以用\e来表示。
\033[表示要开始操作啦
后边可以接几组设置内容,每组内容用;分割,用m结束
然后中间放要显示的文本
最后用\033[0m恢复默认设置

这样在读上述代码,是不是就没有障碍了?
根据ANSI escape code说明,我们可以自由发挥一下,加入更多的设置元素。

比如:echo -e "Normal \e[1;4;33;46mI am oflyhigh! \e[0m"

额,要把颜色调得好看一些,还真是个难题呢!

网上一些文章,写着设置格式:
开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m
这个呢,说正确也正确,因为你按照这个格式设置,不会出啥错;说不正确呢,也不正确,因为显示方式;前景色;背景色这里并没有顺序要求。
比如这段代码:echo -e "Normal \e[33;46;1;4mI am oflyhigh! \e[0m"
和之前的代码,显示结果是一样一样的。

设置部分,可以参考ANSI escape codeSGR (Select Graphic Rendition) parameters部分。
颜色选择,可以参考ANSI escape codeColors部分。

简单的颜色选择,可以使用下表中元素:

比如我们之前示例代码中就使用了这个表中的前景色和背景色。

除此之外,还有更复杂的颜色选择方式:

ESC[ … 38;5;<n>… m Select foreground color
ESC[ … 48;5;<n> … m Select background color
0- 7: standard colors (as in ESC [ 30–37 m)
8- 15: high intensity colors (as in ESC [ 90–97 m)
16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
232-255: grayscale from black to white in 24 steps

例如:echo -e "Normal \e[38;5;9mI am oflyhigh! \e[0m"

又例如:echo -e "Normal \e[48;5;8mI am oflyhigh! \e[0m"

至于24位色,我在putty里试着没成功,可能和putty模拟的终端类型有关,也可能是我代码使用的不对。

其它

除了颜色以外,还有一些其它功能,比如说控制光标。

这样一来,可比我们上篇文章用\r\b,来控制光标位置高级多了。因为这篇主要讲色彩,就不再此处啰嗦了,回头单独开贴学习。

结论

通过学习ANSI escape code,发现给终端输出的文本设置颜色是一件很简单也很有趣的事情。

但是呢,如何用设置颜色功能设置出来漂亮的颜色,还真是门大学问呢,至少对于我这种审美观奇差的人是相当有难度的啦。

另外,终端设置颜色啥的,终究是小道,人家现在都玩GUI、玩网页,字符界面一般都很少被使用了。不过了解一下也挺好玩的,至少我以前不知道字符界面这么强大呢。

相关链接

Sort:  

好棒!

直接 oh-my-zsh 不好嘛……

搜索了一下oh-my-zsh,又见识了一个强大的东东,感谢
不过尽管它很强大,但是和我文中想要的东西还是不太一致
比如说我想一段实现输出一段花花绿绿的内容,不清楚你说的oh-my-zsh如何实现

另外,我也是初学者,不知道的东西太多啦:)

推荐学习一下这本书: conquering the command line, 免费的, 对终端的操作有很大帮助...

谢谢,回头了解一下
不过其实我就是随便玩玩😀

有辦法設定成特殊指令自動變色嗎?話說我覺得自己的terminal滿帥的,條透明就很好看了,跟家分享一下。剩下有些指令希望可以自動變色 xD

额,我也不太懂
或者你可以参考 @momok 提到的 oh-my-zsh

Great post,i like your posts very much.

nice one, lovely colours using in programming

Thanks a lot for sharing your valuable post....
Carry on next
Best of luck..
I will still wait for your next post....

Is the best

your art so nice thanks for sharing.