Windows Terminal 主题美化
# Windows Terminal 主题美化
提示
这个教程是看的知乎一个大佬的
目标是打造拥有和 Linux & mac 一样体验的 Shell。 如果有 PowerShell 基础,大约半个小时完成。
使用 Windows 的用户一定会对这个丑陋的黑色框框不陌生。不错,它就是 CMD 命令行
,从 Windows 诞生就一直存在。
随后,Windows 基于 .Net Framework 开发了全新的替代 CMD 的工具:Windows PowerShell
,它不仅可以兼容 CMD,同时引入了 cmdlet
,功能更强大了。打开看一下,蓝天白云中透着火热的太阳。这字体、配色,像极了蓝屏的感觉,怎么看怎么不舒服,特别是抛出来的错误,感觉很惊悚,尽管认真读错误提示,还是不知所云,甚至连最简单的复制粘贴功能都无法实现。无法比拟 Linux 和 mac 下的 Shell。
不久前,Windows 终于发布了跨平台的 PowerShell 7
。官方称是全新设计的 PowerShell,因为用了 .Net Core 作为运行时,可以跨平台使用,支持:Windows、macOS、Linux,甚至还支持了 ARM。看来是下了苦功夫从头再来。
微软在 Build 2019 大会上发布了 Windows Terminal
,它把目前 Windows 上的 PowerShell、CMD 以及 Windows Linux 子系统(WSL)三大环境实现了统一。
其实很容易把 PowerShell 和 Windows Terminal 混淆,它们是两个不同的软件。可以这么理解,PowerShell 是命令行程序,真正执行指令的程序,而 Windows Terminal 则是管理各种命令行的工具。单独使用 PowerShell 就行了,为什么还要 Windows Terminal 呢?那是因为 Windows 下不仅可以安装 CMD,还可以安装 PowerShell 5.1、PowerShell 7、WSL、Azure Cloud Shell等,它需要一个工具集中管理,它就是 Windows Terminal。下图可以看出,Windows Terminal 可以打开不同的命令行程序。那么,命令是在 Windows Terminal 界面输入,它会调用对应的 PowerShell 来执行,执行完毕后再返回 Windows Terminal 显示出来,所以,我们就不用再面对丑陋的 CMD、PowerShell 界面了。
最激动人心的是: Windows Terminal
可以配置主题,让界面更好看,更有个性。
# 安装 Windows Terminal
如果你是 Windows 10 系统,可以打开系统自带的 Microsoft Store,搜索 Windows Terminal
直接安装就可以了。
如果还没安装 PowerShell 7.x,强烈推荐安装,可参考 官网 (opens new window),如果下载不了,点 这里 (opens new window)下载,适用 Windows x64。 后面也会基于 PowerShell 学习。
# 主题美化原理
看了网上的美化教程,很多方法让我疑惑,于是查阅了许多资料,才逐渐明白整个过程。
美化过程其实分成两个部分,PowerShell 和 Windows Terminal,因为这两个软件是独立的,就如前面介绍的,Windows Terminal 只是一个壳(载体),用来显示 PowerShell 的输出内容,最终执行 Shell 的还是 PowerShell。Windows Terminal 本身有主题机制,通过配置文件很容易更改主题。同样地,PowerShell 也可以进行个性化配置,但最强大的之处在于它的插件机制,可以通过引入模块到 PowerShell,增加 PowerShell 的功能。
所以接下来将独立配置 PowerShell 和 Windows Terminal。
# 先决条件
# 安装 scoop
scoop
是 Windows 平台的包管理工具(非官方),类似 Linux 的 yum
或者 mac 的 homebrew
。打开 PowerShell 7
,输入命令:
# 设置执行权限
> Set-ExecutionPolicy RemoteSigned -scope CurrentUser
# 从网络下载脚本并安装
> Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
# ( 如果出现错误提示,是因为访问不了目标地址,使用如下地址安装 )
> Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://cdn.yulinyige.com/script/scoop-installs.ps1')
2
3
4
5
6
# 配置 PowerShell
为什么先配置 PowerShell 呢?因为最终的输出内容是由 PowerShell 决定的,原生 PowerShell 输出的内容是如此的丑陋。
值得注意的是,这只是 PowerShell 自身的美化,不是 Windows Terminal。PowerShell + Windows Terminal 一起美化,效果更佳。
PowerShell 主要美化:
- 更改整体配色。
- 改变输出样式,提示符前显示用户名和计算机名。
- 增强 Git 命令功能和 Git 分支状态显示。
- 自动补齐功能,可根据历史命令和当前目录补齐。
- ls 命令显示色彩。
系统自带的 Windows PowerShell 5.x 和刚安装的 PowerShell 7.x 是两个独立的 Shell,注意到 5.x 带有 Windows 前缀,而 7.x 没有。两者的配置也是独立的,互不影响,所以如果你在 7.x 做配置,打开 5.x 并不会生效。 为了减少疑惑,接下来将统一使用原生的 PowerShell 7.x。
# 安装 oh-my-posh
和 posh-git
oh-my-posh
是 PowerShell 主题管理工具,posh-git
可以实现类似 oh-my-zsh
一样的 Git
命令增强工具(命令别名和显示分支信息等),但是,oh-my-posh
基于 posh-git
的,所以两个都要安装。
可以通过 PowerShell Gallery
安装,方法:打开 PowerShell 7(不是 Windows PowerShell),输入命令:
> Install-Module posh-git
> Install-Module oh-my-posh
2
# 配置 PowerShell
开启 Prompt
# 这是开启默认配置的
> Set-Prompt; Set-Theme指令已经被Set-PoshPrompt取代
# 设置主题,Agnoster 是主题名
> Set-Theme Agnoster
2
3
4
显示效果马上改变,是不是变成了 Linux Shell 风格。原来的 PS C:\Users\yulinyige>
变成了 yulinyige@DESKTOP-N8LA1TE
。但是你会发现,命令提示符是乱码,因为当前使用的字体没有包含特殊的符号,后面再详细安装。
上面开启 Prompt 效果只对当前窗口有效,关闭重开又没了,所以我们必须要把配置写入 PowerShell 的配置文件,它在哪里呢?输入命令($
符号也要输入)打印出路径( 如果你使用 Windows PowerShell 5.x,会发现它保存在 Windows PowerShell
文件夹,可以看出它们是独立的)。
> $PROFILE
好了,用前面安装的 VSCode 打开配置。
> code $PROFILE
把下面的配置写入 ps1
文件并保存,每次启动 PowerShell
,它会自动加载。
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Agnoster
2
3
另外,可以利用
PowerShell
的PSReadLine
丰富PowerShell
的功能,添加如下的 ``` Set-PSReadLineOption -PredictionSource History # 设置预测文本来源为历史记录 Set-PSReadlineKeyHandler -Key Tab -Function Complete # 设置 Tab 键补全 Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete # 设置 Ctrl+d 为菜单补全和 Intellisense Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo # 设置 Ctrl+z 为撤销 Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward # 设置向上键为后向搜索历史记录 Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward # 设置向下键为前向搜索历史纪录 ```
# 更换 oh-my-posh
主题
oh-my-posh
内置了很多主题,足够我们使用了,可以在 这里 (opens new window) 查看,只要把前面 Set-Theme
命令后的主题名称更换即可。下面的主题都觉得不好看,可以 自定义主题 (opens new window),为了减少难度,这里就不详细学习了。
# 更换 PowerShell
字体
还记得前面显示的命令的乱码吗 ?我们更换字体解决它。示例安装 FantasqueSansMono-NF
字体(也可以使用系统自带字体,这一步就不需要安装)。
> scoop search FantasqueSansMono-NF
> scoop bucket add 'nerd-fonts'
# 下面一个命令要加 sudo 提权
> sudo scoop install FantasqueSansMono-NF
2
3
4
安装好字体后,右击标题栏,打开 默认值
设置(是默认值,不是属性),选择刚才安装的字体,确定后,需要重新打开 PowerShell 一切显示正常了。
# 使用 ColorTool
自定义 PowerShell 文字颜色
我们不是使用 oh-my-posh
配置好 PowerShell
主题了吗,为什么还要 ColorTool
更改颜色?事实上,oh-my-posh
是更改显示内容的风格,而 ColorTool
是更改文字的颜色。当觉得 oh-my-posh
内置的颜色不满足需求时,可以使用 ColorTool
更改,如果 OK 就可以跳过这一步了。
ColorTool
是微软出品的更改 PowerShell
文字颜色的工具,使用也非常简单。
# 安装微软官方颜色工具
> scoop install colortool
# 查看内置的配色方案,共有 8 种
> colortool --schemes
# 设置主题,后面是配色方案名称。
> colortool OneHalfDark.itermcolors
2
3
4
5
6
7
8
# 增强 PowerShell
的 ls
功能
dircolors
是 Linux 下的命令,可以设置 ls
指令在显示目录或文件时的色彩,同样的,如果也想让 PowerShell
显示彩色目录,可用插件 DirColors
实现。
# 安装 DirColors
> Install-Module DirColors
# 打开 PowerShell 配置
> code $PROFILE
2
3
4
在配置文件末尾添加一行,重启 PowerShell 就可以看到彩色目录了。
Import-Module DirColors
其他插件也可以用同样的方法安装,开始探索吧 ~
# 配置 Windows Terminal
前面折腾那么久都是围绕 PowerShell 转,开始 Windows Terminal 吧!
强大的功能之一就是可以自定义主题,包括:字体、文字颜色、背景等。最终配置成什么效果,就看审美水平了。可以参考 WIndows Terminal 文档 (opens new window) 进行配置,下面是我的配置过程。
在 Windows Terminal 打开 PowerShell 7,可以看到,还是一样丑。前面的配置似乎不生效,因为 Windows Terminal 也有一套自己的主题。
# 配置文件
Windows Terminal 可以说有两个配置文件,一个是默认的 default.json
,它不能被修改;一个是 setting.json
,我们即将要修改的。要找到配置文件很简单,点击标题栏的下拉箭头
,再点击 设置
,它会用默认的 json
编辑器打开配置。
如果想打开默认的
default.json
,在点击设置
时按住Alt
键。 Windows Terminal 以前的版本配置文件叫profile.json
,所以网上有些文章是讨论profile.json
的。
仔细观察两个配置文件,他们的结构是一样的。我把它分成 四部分:
Global
Windows Terminal APP 整体的配置,启动参数、样式等profiles
配置每个终端的样式。schemes
终端配色方案。actions
定义快捷键操作,一般默认即可。
Global
和 profiles
的影响范围。setting.json
会覆盖 default.json
的相同配置。如果不知道如何配置 setting.json
,可以参考 default.json
每一个节点的 key-value
值。主题配置主要是 Global
、profiles
和 schemes
节点。
# profiles 配置终端样式
profiles
下有 list
节点,它是一个数组,表示每种终端的样式,所以可以做到每种终端显示不一样的效果。每个节点详细信息可以看 官方文档 (opens new window)。
想统一配置所有终端样式?安排!可修改 defaults
节点,key-value
值和 list
一样。
{
"profiles":{
"defaults":{
// 对所有终端生效
},
"list":[
{
// 终端 1
},
{
// 终端 2
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
接下来我们配置 PowerShell
的样式,找到 name=PowerShell
的子节点。
# 字体颜色
字体颜色在 schemes
节点中定义,只要引用 shemes 的 name
即可,默认是 Campbell
,我们改成 One Half Dark
,马上看到字体颜色就变了。
{
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"hidden": false,
"name": "PowerShell",
"source": "Windows.Terminal.PowershellCore",
"colorScheme":"One Half Dark"
}
2
3
4
5
6
7
# 字体
只要是系统安装的字体都可以引用,但是最重要的是支持特殊字符,否则像上面出现乱码。我们使用官方推荐的 Cascadia Code (opens new window) 字体( Github 的附件很难下载,我备份了一个,点 这里 (opens new window) 下载),解压后会发现很多字体,可以安装自己喜欢的。我安装了 otf/static/CascadiaCodePL-Bold.otf
,字体的名称打开字体查看。
{
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"hidden": false,
"name": "PowerShell",
"source": "Windows.Terminal.PowershellCore",
"colorScheme":"One Half Dark",
"fontFace":"Cascadia Code PL"
}
2
3
4
5
6
7
8
其实还有很多好用的字体:
Sarasa
很多人推荐,支持中文。- Jetbrains Mono (opens new window) Jetbrains 官方字体。
# 背景图片
可以自定义背景图片、对齐方式、图片缩放、图片透明度等。
{
...
// 图片路径,注意斜杠转义
"backgroundImage":"C:\\Users\\yulinyige\\Pictures\\dolaameng.jfif",
// 缩放方式
"backgroundImageStretchMode":"uniformToFill",
// 对齐方式
"backgroundImageAlignment":"center",
// 透明度
"backgroundImageOpacity":0.2
}
2
3
4
5
6
7
8
9
10
11
# 毛玻璃效果
还记得 Windows 7
的毛玻璃效果吗?其实我觉得挺好看的,特别是点击时渐变反馈效果,肉肉的,符合操作习惯。但是到了 Windows 8
以后界面都拍扁了。Windows Terminal 也支持毛玻璃效果。开启毛玻璃效果是不是又漂亮了一点?
{
...
// 开启毛玻璃效果
"useAcrylic":true,
// 毛玻璃透明度
"acrylicOpacity":0.5
}
2
3
4
5
6
7
# schemes 配色方案
schemes
管理配色方案,同样是一个数组,每种配色方案会有一个名字 name
,引用配色方案就是通过 name
的值。默认预设了几种配色方案,可在 default.json
查看,详细 点这里 (opens new window)。
除了 name
之外都是配色,具体的颜色代表什么意思暂时还找不到,下面的颜色说明来自 这里 (opens new window)。
// 典型的 schemes 格式
{
"schemes":[
{
"name": "Campbell", // 配色方案名称,必须的
"foreground": "#CCCCCC", // 输出显示字体颜色
"background": "#0C0C0C", // 背景色
"cursorColor": "#FFFFFF", // 光标颜色
"black": "#0C0C0C", // 箭头左边三角,git 目录的 .git 目录下提示箭头背景提示文字
"red": "#C50F1F", // ssh 后 vim 打开文本文件已输入行普通字符显示文字
"green": "#13A10E", // git 目录的 .git 目录下提示箭头背景提示
"yellow": "#C19C00", // git 目录的分支箭头背景提示
"blue": "#0037DA", // 目录箭头本体
"purple": "#881798", // ssh 后 vim 等工具打开文件后的 { 和 }等符号本体,git 更新完后显示的分支箭头背景提示
"cyan": "#3A96DD", // 引号及内部字符
"white": "#CCCCCC", // 未知
"brightBlack": "#767676", // cd 等 命令后面的 .. 和 * 等特殊符号,以及命令参数字符颜色
"brightRed": "#E74856", // 系统提示字符颜色:错误的命令,git status 显示
"brightGreen": "#16C60C", // ssh 用户权限显示
"brightYellow": "#F9F1A5", // 输入的命令字符
"brightBlue": "#3B78FF", // ssh 文件夹等高亮显示,ssh 目录,vim 打开文本文件未输入行 ~ 字符显示
"brightPurple": "#B4009E", // 未知
"brightCyan": "#61D6D6", // ssh vim 等工具打开文件后的 { 和 } 等符号背景
"brightWhite": "#F2F2F2" // 目录箭头左边和中间的提示文字
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 如何找到合适的配色
自定义配色很繁琐,而且很好费时间,最好的方法是用别人做好的配色。可以在项目 iTerm2-Color-Schemes (opens new window) 里找,有两百多方案,先在 Screenshots 里挑选好颜色,然后到 windwosterminal
目录对应的 json 文件复制样式。
还有一些可以挑配色的网站:
# Global 全局配置
全局配置就不逐个学习了,详细可参考 官方文档 (opens new window) 中的 启动
、交互
、外观
三个小节。
默认的配置基本上挺好看的,一个值得修改的地方是默认终端,因为最新版的 PowerShell
功能非常强大,我们希望 Windows Terminal 默认打开 PowerShell,修改 defaultProfile
成 PowerShell 的 guid
即可:
# 设置主题(切换主题)
- 然后打开Windows Terminal,输入
module
即能看到我们要安装的模块已经出现了
- 设置主题 oh-my-posh 给我们内置了很多主题,使用命令即可查看所有内置主题
Get-PoshThemes
然后选择自己喜欢的修改配置文件即可。也可以参考这里:oh-my-posh themes (opens new window)
用这个命令设置主题
Set-PoshPrompt -Theme <主题名>
1
2
不过这个效果是暂时的,只针对当前shell如,果想要永久有效,继续看下边。
- 在Windows Terminal中敲下下面两行命令
// 1. 启动编辑power shell配置文件的引擎
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
// 2. 使用记事本打开配置文件
notepad $PROFILE
2
3
4
- 在打开的记事本中写入如下内容(脚本文件)
Import-Module posh-git
Import-Module oh-my-posh
Set-PoshPrompt -Theme JanDeDobbeleer
2
3
保存退出。
- 第一条命令表示导入posh-git
- 第二条命令表示导入oh-my-posh
- 第三条命令表示设置主题为JanDeDobbeleer
每次打开Windows Terminal中的Power shell都会执行脚本文件中的三条命令。
注意:
- 此处的第三行是oh-my-posh2与3的不同之一,在oh-my-posh2里的是: Set-Theme XXXX
- 如果不是很喜欢这个主题,可以使用以下命令来查看所有主题以及主题的名称.omp Get-PoshThemes
- 找到喜欢的主题后,可以在之前的脚本文件中将主题名称替换为你想要主题的名称。 注意:此处获取主题在oh-my-posh2的命令为: Get-Theme
- 如果你使用的是vscode(如果不是就完成了),且使用自带终端,它的字体也会乱
打开设置,在顶部输入框输入以下字符:
Integrated:Font Family
在所显示(Terminal › Integrated:Font Family)的输入框中输入
InconsolataGo Nerd Font