最近在捣鼓在Windows Terminal上的WSL的Ubuntu上使用oh-my-posh美化终端。
(插一句嘴:在powershell上使用这个实在是太慢了,不喜欢)
对于oh-my-posh的美化效果,我最感兴趣的是终端究竟是如何输出如此多彩的行指示信息以及哪些特殊的形状是如何输出的?
这篇文章不会提及具体的oh-my-posh的安装教程,如果你在读完这篇文章之后需要美化你自己的终端,请参考oh-my-posh的官方网站,其中有非常详细的安装教程
oh-my-posh官网:https://ohmyposh.dev/
🎨颜色部分
这个很好理解,对于大多数的终端或代码输出都支持颜色的输出
有少部分代码彩色输出的原理使用到了系统的API
但也有相当一部分是ANSI 转义序列(ANSI Escape codes)
ANSI 转义序列(ANSI Escape codes)是一种带内信号(In-band signaling)的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以 ESC 转义字符和 [ 字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。
💻终端
终端类型 | 是否支持 | 代码形式 | 原理 |
---|---|---|---|
cmd | 是 | 使用 color 或 findstr | findstr会高亮找到的文本 |
pwsh | 是 | Write-Host “OK” -ForegroundColor:Green -NoNewline | Write-Host命令允许设置颜色 |
zsh | 是 | echo $‘\e[1;31m文本’ | ANSI 转义序列 |
bash | 是 | echo $‘\e[1;31m文本’ | ANSI 转义序列 |
🔧语言
语言类型 | 是否支持 | 代码实现 | 原理 |
---|---|---|---|
C/C++ on Windows | 是 | SetConsoleTextAttribute | 通过系统API设置控制台颜色属性 |
Java | 是 | 略 | ANSI 转义序列 |
Node.js | 是 | 略 | ANSI 转义序列 |
Python | 是 | 略 | ANSI 转义序列 |
🎨图标部分
如图,我们可以看见在Windows Terminal中的终端,在输入行能够输出各种多彩而有实际作用的信息,同时通过一些特殊图标的点缀,从而达到美化终端的目的。
那么这些图标究竟是如何显示的呢?
🔤字体
在安装oh-my-posh时,如果没有安装指定的字体,就会导致这些图标无法正常显示。那么很明显,这些图标便是存储在字体当中的“一个字符”。
各个系统或环境中字体的安装方式不同,但最重要的一步总是下载推荐使用的Nerd Font字体。这个Nerd Font包含了普通的英文字体之外,还包含了各种各样的图标。
Nerd Font官网:https://www.nerdfonts.com/
既然我们明白这些"图标"只不过是一个字符而已,那么我们就可以用输出字符的方式来输出这些图标到你的终端。
🔍搜索图标
这些字符的具体编码,你可以在官网提供的图标搜索栏中搜索你需要的图标,或是显示所有图标来寻找你想要使用的图标。
Nerd Font官网图标搜索
由于nf(Nerd Font)中含有太多的图标,对于我们图标的使用和一览带来了极大的麻烦。所以即使是使用官网提供的搜索栏也会有一定的困难。不过官网以及为我们将图标分好了类,注好了名,我们只需要一定的搜索技巧即可。
首先所有的图标都由nf-开头,代表这是属于Nerd Font 中可用的
其次是子图标集的名称,比如nf-weather就代表了图表中的天气符号
下表是各个子图标集以及其搜索名称
图标集 | 搜索名称前缀 | 图标内容 |
---|---|---|
Powerline Symbols | nf-pl | 用于美化输入行最基础的符号 |
Powerline Extra Symbols | nf-ple | 上者的扩展集,包含更多形状 |
Font Awesome | nf-fa | 包含商标、箭头等 |
Font Awesome Extension | nf-fae | 上者的扩展集,水果、器官等 |
Devicons | nf-dev | 开发环境或系统的图标 |
Weather Icons | nf-weather | 天气相关图标 |
Seti UI | nf-seti | 部分编程语言或工具的图标 |
custom | nf-custom | 上者的部分追加,更多语言的图标 |
Octicons | nf-oct | 箭头,文件,浏览器相关图标 |
Font Logos | nf-linux | Linux相关图标,各种系统的图标 |
IEC Power Symbols | nf-iec | IEC电源图标 |
Pomicons | nf-pom | 包含几个图标,主要是各种番茄 |
Material Design | nf-mdi | 比较大的图标集,包含各种各样的图标 |
Codicons | nf-cod | 比较大的图标集,包含各种各样的图标 |
Indent | nf-indent | 几个缩进线图标 |
然后是图标名称,比如你想搜"心",你输入"heart"即可
这样你就能找到或者遇到你想要输出的图标了
📝输出
当你找到你要输出的图标后,将你的鼠标移动到图标上能够看见COPY中的三个选项,单击这些选项会复制不同的内容
首先是Icon,意思为直接复制该字符。此时如果你直接将其粘贴到没有使用Nerd Font的地方,多半就只会显示一个方框。但是如果粘贴到使用了Nerd Font的地方,就会直接显示这个图标啦
其次是Class,意思为复制该图标的名称,比如nf-oct-terminal之类的。这个的用处是在浏览器中使用,比如
I really <i class="nf nf-fa-heart"></i> <i class="nf nf-custom-vim"></i>
最后是Hex,意思为复制该图标编码的十六进制值。这个的用处是在别处输出该字符,这里我举一个C语言中的例子。
printf("\uf489");
就可以在使用了Nerd Font的终端输出该字符了
✅实例
这里我举一个Python中的例子
import subprocess
if __name__ == "__main__":
cmd = ""
print("using Python 3.9.7")
while True:
#这里的\u001b是ANSI 转义序列
#这里的\ue0b6等是NerdFont图标
print("\u001b[35;40m\ue0b6", end="")
print("\u001b[37;45m username ", end="")
print("\u001b[35;40m\ue0b0", end="")
print("\u001b[30;46m\ue0b0", end="")
print("\u001b[30;36m path ", end="")
print("\u001b[36;40m\ue0b0", end="")
print("\033[0m", end="")
cmd = input()
subprocess.Popen(cmd, shell=True, stdout=None, stderr=None).wait()
运行结果:
这样,我们就能够自己美化自己的终端了
在达到文章效果之前,你还需要做以下的事情
- 安装Windows Terminal
- 下载一种Nerd Font
- 在Windows Terminal配置中使用一种Nerd Font