用 WezTerm 替代 Windows Terminal

用 WezTerm 替代 Windows Terminal

RayAlto OP

1. 废话

Windows Terminal

之前还在 Preview 的时候我就开始用 Windows Terminal 了,那时的 Windows Terminal 还很干练,启动速度也很快,后来上架 Microsoft Store 安装更方便了,但最近感觉越来越臃肿了,冷启动要好久,还有很多按键组合不能传给 Shell ,所以打算换一个更简单的 Terminal 。我的要求只有三点: GPU 加速、 ligature 支持、轻量

2. Kitty

Kitty 是一款十分优秀的 Terminal ,在 Linux 环境下一直是我的首选,虽然作者是个阿三而且对 CJK 用户态度不是非常好,但这个 Terminal 在技术层面完全长在我的审美上。

  • 首先它主要使用 C 编写渲染及核心部分
  • 然后它使用 Python 编写逻辑部分,支持插件(被叫做 kitten )
  • 自定义程度很高,我能想象到的部分都可以自定义

但是 Kitty 不支持 Windows 操作系统。

3. Alacritty

Alacritty 非常的火,但我不是非常喜欢。

  • 首先它用 Rust 编写,而且有一大坨参差不齐的 Rust 依赖,有种 JavaScript 的美,跟我每天早上坐在马桶上产生的东西有十分甚至九分的相似。
  • 项目的第 50 个 ISSUE 就是 ligature 相关的,到现在 6 年多了, Alacritty 依然不支持 ligature ,感觉这群开发者好像对项目的整洁有一定要求,有几个 PR 都支持了 ligature ,但这群开发者一直不 merge ,我寻思这些解决方案再乱也不比你这一坨乱七八糟的依赖更恶心,不知道这群开发者在坚持什么,感觉他们像是能在现实生活中说出“兄弟,你的项目应该用 Rust 重写!”的人
  • 在项目 README 里加入 Benchmark ,硬搞拉踩,有种 fastjson 的美

综上,这个东西我永远不会考虑。

4. WezTerm

WezTerm 是一个存在感不高的 Terminal ,是一个个人项目,也是用 Rust 开发,但依赖还不算太杂,从 ISSUE 和 PR 模块来看作者的态度也十分 nice 。虽然在 Linux 下我更喜欢 Kitty ,但 Windows 下 WezTerm 似乎是比较好的选择了。

  • 用 Rust 开发,但闻不到宗教的味道,所以 OK
  • 自定义程度极高,使用 Lua 语言作为配置文件,用户甚至可以给 WezTerm 的各种事件绑定 callback 。

5. 配置

我的 WezTerm 截图

可以去官网 上找更详细的说明,下面是我的配置文件:

1
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
local wezterm = require 'wezterm'
local c = {}
if wezterm.config_builder then
c = wezterm.config_builder()
end

-- 初始大小
c.initial_cols = 96
c.initial_rows = 24

-- 关闭时不进行确认
c.window_close_confirmation = 'NeverPrompt'

-- 字体
c.font = wezterm.font 'Noto Mono'

-- 配色
local materia = wezterm.color.get_builtin_schemes()['Material Darker (base16)']
materia.scrollbar_thumb = '#cccccc' -- 更明显的滚动条
c.colors = materia

-- 透明背景
c.window_background_opacity = 0.9
-- 取消 Windows 原生标题栏
c.window_decorations = "INTEGRATED_BUTTONS|RESIZE"
-- 滚动条尺寸为 15 ,其他方向不需要 pad
c.window_padding = { left = 0, right = 15, top = 0, bottom = 0 }
-- 启用滚动条
c.enable_scroll_bar = true

-- 默认启动 MinGW64 / MSYS2
c.default_prog = { 'C:/msys64/msys2_shell.cmd', '-defterm', '-here', '-no-start', '-shell', 'zsh', '-mingw64' }

-- 启动菜单的一些启动项
c.launch_menu = {
{ label = 'MINGW64 / MSYS2', args = { 'C:/msys64/msys2_shell.cmd', '-defterm', '-here', '-no-start', '-shell', 'zsh', '-mingw64' }, },
{ label = 'MSYS / MSYS2', args = { 'C:/msys64/msys2_shell.cmd', '-defterm', '-here', '-no-start', '-shell', 'zsh', '-msys' }, },
{ label = 'PowerShell', args = { 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe' }, },
{ label = 'CMD', args = { 'cmd.exe' }, },
{ label = 'nas / ssh', args = { 'C:/msys64/usr/bin/ssh.exe', 'nas' }, },
}

-- 取消所有默认的热键
c.disable_default_key_bindings = true
local act = wezterm.action
c.keys = {
-- Ctrl+Shift+Tab 遍历 tab
{ key = 'Tab', mods = 'SHIFT|CTRL', action = act.ActivateTabRelative(1) },
-- F11 切换全屏
{ key = 'F11', mods = 'NONE', action = act.ToggleFullScreen },
-- Ctrl+Shift++ 字体增大
{ key = '+', mods = 'SHIFT|CTRL', action = act.IncreaseFontSize },
-- Ctrl+Shift+- 字体减小
{ key = '_', mods = 'SHIFT|CTRL', action = act.DecreaseFontSize },
-- Ctrl+Shift+C 复制选中区域
{ key = 'C', mods = 'SHIFT|CTRL', action = act.CopyTo 'Clipboard' },
-- Ctrl+Shift+N 新窗口
{ key = 'N', mods = 'SHIFT|CTRL', action = act.SpawnWindow },
-- Ctrl+Shift+T 新 tab
{ key = 'T', mods = 'SHIFT|CTRL', action = act.ShowLauncher },
-- Ctrl+Shift+Enter 显示启动菜单
{ key = 'Enter', mods = 'SHIFT|CTRL', action = act.ShowLauncherArgs { flags = 'FUZZY|TABS|LAUNCH_MENU_ITEMS' } },
-- Ctrl+Shift+V 粘贴剪切板的内容
{ key = 'V', mods = 'SHIFT|CTRL', action = act.PasteFrom 'Clipboard' },
-- Ctrl+Shift+W 关闭 tab 且不进行确认
{ key = 'W', mods = 'SHIFT|CTRL', action = act.CloseCurrentTab{ confirm = false } },
-- Ctrl+Shift+PageUp 向上滚动一页
{ key = 'PageUp', mods = 'SHIFT|CTRL', action = act.ScrollByPage(-1) },
-- Ctrl+Shift+PageDown 向下滚动一页
{ key = 'PageDown', mods = 'SHIFT|CTRL', action = act.ScrollByPage(1) },
-- Ctrl+Shift+UpArrow 向上滚动一行
{ key = 'UpArrow', mods = 'SHIFT|CTRL', action = act.ScrollByLine(-1) },
-- Ctrl+Shift+DownArrow 向下滚动一行
{ key = 'DownArrow', mods = 'SHIFT|CTRL', action = act.ScrollByLine(1) },
}

return c
目录
用 WezTerm 替代 Windows Terminal