7

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

 2 years ago
source link: https://blog.ichr.me/post/windows-terminal-configuration/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

20200321210320.jpg?q=100

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

让我们开始吧。

Windows Terminal 简介

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

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

scoop install windows-terminal

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

20200321210256.jpg?q=100

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

个性化配置

在 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 。

20200321210401.jpg?q=100

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

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

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

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

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

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

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

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

配色主题 Schemes

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

20200321210653.jpg?q=100

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

20200321210826.jpg?q=100

快捷键配置 Keybindings

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

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

20200321211027.png?q=100

把 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 等。

20200321211431.jpg?q=100

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

20200321212810.jpg?q=100

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

20200321211310.jpg?q=100

到这里你应该已经可以彻底投入 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 字体渲染

20200321211051.jpg?q=100

\渲染错误*

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

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

20200321211148.png?q=100

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

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

20200321211203.png?q=100

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

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

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

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

多环境命令冲突问题

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

20200321211230.jpg?q=100

可以使用命令 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK