如何打造好看还好用的 Windows Terminal

2020-03-21 笔记本
Cover Image

换回 Windows ,终端体验可能是最不尽人意的。由于环境所致,Windows 内置的 PowerShell 和 cmd 实用性远不比 Unix 系统的终端。系统、SSH、Git 在 Windows 上可能会同时需要 3 个终端……

既然出场配置不尽人意,那就自己动手打造最适合的终端。

效果#

至于默认终端长什么样子大家自己心里清楚就好,我先放上我最后配置好的效果:

接下来我将详细介绍我是如何一步步实现这种效果的,部分内容可能过于繁复,各路高人可以选择性阅读。

让我们开始吧。

Windows Terminal 简介#

Windows Terminal 是一款微软自家的 终端模拟器 ,拥有其他第三方终端难以匹敌的响应速度、完整的字符渲染机制(如果配置得当的话)、现代化风格的设计。这款 开源免费 终端自发布以来就好评不断,在眼花缭乱的第三方终端面前丝毫不乱阵脚,甚至连自家默认终端都完全不放过,照单全部碾压。

你可以点击上方链接前往 Microsoft Store 安装,或者使用 Scoop 一行命令安装:

scoop install windows-terminal

兴冲冲直接打开,好像还是很一般?

不急,我们还可以根据自身审美对其进一步完成个性化配置。

个性化配置#

在 Windows Terminal 下拉菜单中点击 Settings 进入配置(或使用快捷键 Ctrl + ,),会使用记事本打开配置文件。

而配置文件是一个 JSON 格式的文件,包含以下几个部分:

  • 全局配置 Globals:在配置文件最外侧大括号内的内容,会影响整个窗口的配置。如亮/暗主题,默认打开终端等。
  • 环境配置 Profilesprofiles 内的内容,存放单个环境的配置。这里可以单独配置每个在 Windows Terminal 中打开的终端,如 PowerShell,CMD,Git Bash 等。
  • 色彩配置 Schemesschemes 内的内容,放置终端的主题色彩配置。这些配置可以在环境 Profiles 中被单独调用。
  • 快捷键配置 KeybindingsKeybindings 内的内容,适用于终端内的自定义快捷键配置。

大致了解 Windows Terminal 中各项配置的意义后,我们就可以着手自定义自己的配置了。

全局配置 Globals#

这是在配置文件最外侧大括号内的内容,整个配置文件一开始的地方,适用于整个窗口。

我们可以自定义:

  • 默认终端 defaultProfile:Windows Terminal 打开时默认开启哪个终端,填入对应终端的 UUID 即可(环境配置 Profiles 中会详细介绍 GUID)
  • 亮/暗主题 requestedTheme:可以设为 light 亮色主题、dark 暗色主题、system 跟随系统。
  • ……

我只列举了常用的几个,如愿了解全部可以在本文最下方 References 中前往官方文档查看。

环境配置 Profiles#

环境配置包含两大块 defaultslists ,前者为所有环境的默认配置,后者为单个环境的特殊配置。

这里可以调整背景配置、字体相关、颜色配置(需要在后面 schemes 中有相关)、光标配置等。

也许你也注意到每个配置都有一个 UUID,这可以理解为配置的身份证号。它有一定格式,通过这个码就能准确地找到这个配置。全局配置中的默认终端就是填写环境的 UUID 来确定的。

默认配置就包含 Windows 自带的 PowerShell 和 CMD 。如果我们想新增一个配置,在PowerShell 中输入 new-guid 就可以新创建一个 UUID,按如下格式插入一段代码到 profileslist 里:

"list":
[
{
// Make changes here to the git-bash.exe profile
"guid": "{12a5517e-7758-458a-adf1-c3cadeda9ac8}",
"name": "Git Bash",
"icon": "F:\\_work\\Windows-Terminal\\git-icon.png",
"commandline": "C:\\Program Files\\Git\\bin\\bash.exe",
"hidden": false
},
...
]

这里拿添加 Git Bash 举例。注意路径改为自己的,且路径的分节符用两个 \\ ,因为一个反斜线会被识别为转义符。

你也可以使用 这个网站 生成一个独一无二的 UUID 。

如果你经常需要控制自己的 VPS,不妨试试单独配置一个环境,使得打开时输入密码直接使用 SSH 管理远程服务器(目前 PowerShell 已支持 SSH):

"list":
[
{
"guid": "{da0d1a9a-79de-403f-afe8-9f2353033a7b}",
"name": "VPS1",
"commandline": "powershell.exe ssh root@xxx.xxx.xxx.xxx"
},
...
]

此外还有背景配置和光标配置。我开启了背景半透明,需要设置如下两行:

{
"useAcrylic": true,
"acrylicOpacity": 0.6
}

第一项为开关,第二项为透明度。

我个人并不对背景图片很感冒,有时感觉过于花哨,不过还是介绍下如何开启:

{
"backgroundImage": "[[ Image Path ]]",
"backgroundImageStretchMode": "uniformToFill",
"backgroundImageOpacity": 0.6
}

第一个为图片路径,第二个为伸缩模式,第三个为背景透明度。

配色主题 Schemes#

控制 Winds Terminal 的同样是 JSON 文件,放在 shremes 中。可以自己调,也可以尝试别人做好的配置:iTerm2 Color Schemes 。这里包含许多适配了 Windows Terminal 的色彩方案,将喜欢的直接复制过来即可。

然后在环境配置中对应环境添加 colorScheme 属性使方案生效。

快捷键配置 Keybindings#

其实默认的快捷键就挺好用的了,我没有在这里更改任何内容。

大家可以按住 Alt 然后点击下拉菜单的 Settings 查看默认配置。不要修改这个文件的内容,完全不会生效的。

把 Windows Terminal 添加到右键菜单#

也许你已经习惯了「右键 - Git bash Here」,但是我们说过我会把所有工作都集中到着一个终端完成的,所以后面我也会说明该如何才能直接在 Windows Terminal 中使用 Git Bash 全部功能。不过在此之前,让我们先看看怎么把 Windows Terminal 添加到右键菜单中。

首先上微软 GitHub 地址下载 Windows Terminal 的图标到本地,地址

然后新建一个 .reg 的注册表文件,名字任意、位置任意,并填入:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt]
@="Windows Terminal here"
"Icon"="[[ 图标绝对位置 ]]"

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt\command]
@="C:\\Users\\[[ 用户名 ]]\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe"

所有路径还是要使用两个 \\ ,原因同上。

然后执行这个文件即可。

当然你使用 Quicker 等右键效率软件也可以得到相似效果,这里就不展开了。

如果遇到打开路径不对的问题,可以参照 #故障处理 一节的方法。

更进一步——Oh My Posh#

按照上面的步骤来,还是有点不尽人意。没有 Git 仓库提示,全部黑底白字也有点厌倦,更别说一类像 Oh My Zsh 那些高效的插件了。

不过 Zsh 有 Oh My Zsh ,Poweshell 也有自己的 Oh My Posh ,用于实现一部分常用内容。

oh-my-posh 安装并应用主题#

使用下列命令安装 oh-my-posh 并初始化:

Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser

Set-Prompt
Set-Theme Paradox
# 主题根据自己喜好来选,可以去上面 GitHub 链接向下翻查看预览

然后用下面命令打开默认 PowerShell 的启动配置文件(如果没有就创建):

if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
notepad $PROFILE

并在弹出的窗口中粘贴以下内容:

Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Paradox

之后每次打开 Windows Terminal 中的 PowerShell 都会做好自动完成 oh-my-posh 的引入和主题配置。

很简单是不是?但是接下来我可能要告诉你,这里是整个配置中坑最多的!你可能会遇到执行权限的问题;当你好不容易成功执行,又发现字符渲染出事了。我想告诉大家,这里是我折腾最久的地方,从零碎的互联网中爬了大量教程才出坑。

如果你没有遇到任何问题,祝贺你。如果你也像我一样出事了,我把这里的详细解决思路放在后面 #故障处理 一节专门说明。相信我,这是你在搜索引擎前 10 页能找到最详细的处理方法了。(目前而言,可能之后有人直接抄袭我的做法也说不准)

插件功能的实现#

光好看还不行,还要向 Zsh 那样强大才更好。

Oh My Zsh 有像高亮、自动补全等提高效率和易用性的插件。Oh My Posh 原生就支持高亮了,自动补全也有专门插件实现,那就是 PSReadline

输入下面命令打开 $profile

notepad $profile

然后将官方给的 样例 全部复制进去,注意命名空间的申明(using namespace)一定要在最上端。并在 Import-Module PSReadLine 下面加上一行:

Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

用于实现 Tab 触发选择模式。

此插件的方法很多,大家可以配合样例内的注释理解或更改。

将 Git Bash 添加到环境中#

首先要说明的时,PowerShell 时直接支持了 Git 操作的!只要你安装了 Git 环境。

但是 Git Bash 带上的 GNU 工具包就没能直接支持了,像是 GPG 等。

这时候我们可以在系统中添加环境变量来实现 PowerShell 中一同支持 Git Bash 所有操作,彻底抛弃 Git Bash,全部转移至 Windows Terminal 。

将 Git 文件夹下的位置 usr/bin/ 添加到 path 中,重启终端再尝试就发现都支持了。

到这里你应该已经可以彻底投入 Windows Terminal 怀抱了。

故障处理#

折腾过程中难免遇到各种问题,我这里记录了一些比较有代表性的。欢迎留言或私信告诉我还有那些需要注意的地方,不胜感激。

右键打开目录错误#

如果用右键打开时发现地址不对,比如在家目录而非当前目录。这时你需要在「Settings - profiles - defaults」中添加以下内容:

{
"startingDirectory": "."
}

这样默认打开目录就是当前目录了。

脚本执行权限问题#

PowerShell 脚本 .ps1 有四种执行策略:

  • Restricted —— 默认的设置, 不允许任何 script 运行
  • AllSigned —— 只能运行经过数字证书签名的 script
  • RemoteSigned —— 运行本地的 script 不需要数字签名,但是运行从网络上下载的 script 就必须要有数字签名
  • Unrestricted —— 允许所有的 script 运行

你可以输入下面的命令查看当前执行策略:

get-executionpolicy

而由于 PowerShell 每次打开都是通过一个 .ps1 脚本完成个性化配置的,所以失败很有可能是因为权限不足导致的。

我们可以通过下面命令更改执行策略:

Set-ExecutionPolicy [[ 策略名 ]]

调成 RemoteSigned 或者 Unrestricted 均可,建议前者。

之后重启终端就可以正常初始化了。

PowerLine 字体渲染#

*渲染错误

默认 PowerShell 「新宋体」不耐看不说,在渲染某些字符(比如 Git 相关符号)还会出乱码。而目前我所了解,中文环境下支持这样严格要求的字体,只有「Sarasa Gothic / 更纱黑体 / 更紗黑體 / 更紗ゴシック」,可以前往更纱黑体 GitHub 页面 下载。

别看压缩包只有 200+M ,全部解压后将近 10G 大小!

注意剩余空间,而且字体完全没必要解压在 C 盘,随便解压到一个位置然后双击打开后安装即可。

适合代码阅读环境的等宽字体有「等距更纱黑体 SC」或者「Sarasa Mono SC Regular」,名称可能有细微差别,以自己情况为准。

之后在 Windows Terminal 的「Settings - profiles - defaults」中加入:

{
"fontFace": "等距更纱黑体 SC",
}

如果你完全没有中文字体需求(系统语言、终端语言、路径名称、环境变量等完全不含中文),你也可以尝试下一款专门为阅读代码设计的字体 JetBrains Mono 。不过官方说明暂时没有支持中文的计划,详见这个 Issue

当然你也可以尝试其他 PowerLine 字体 ,安装后在 Settings 中做好与上面类似配置即可,至于有没有专门做好中文字体显示优化就要看你的选择了。

多环境命令冲突问题#

如果你出现下面这样的报错,可能是 Windows 和引入的 Git 中命令有重复甚至冲突。

可以使用命令 Get-Alias 查看 PowerShell 中的命令,对于冲突的命令使用 Remove-Item alias:\[[ Command Name ]] 来移除。

下面列举几个我遇到的,欢迎大家补充。

Remove-Item alias:\rm
Remove-Item alias:\ls
Remove-Item alias:\cp

#

Windows Terminal 的出现可以说拯救了 Windows 上糟糕的命令行体验。原生支持让它拥有十分可观的速度和兼容性,同时也拥有很大的后期定制空间。如果你有配置 WSL(Windows Subsystem for Linux),配合 Windows Terminal 也可以获得更好的开发体验。

但是就像 Linux 软件生态远不及 Windows 一样,Windows 的命令行生态也是远不及 Linux 的。这只能慢慢填补,但至少我们现在能感受到更多希望。

这回,我们总该在 Windows 上更多青睐命令行了吧?


(完,感谢阅读!)


官方文档:https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md

本文作者:ChrAlpha

本文链接: https://blog.ichr.me/post/windows-terminal-configuration/

文章默认采用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。

笔记本

评论

您所在的地区可能无法访问 Disqus 评论系统,请切换网络环境再尝试。