WezTerm: Lua 配置的 GPU 加速跨平台终端¶
为什么要学 WezTerm¶
终端模拟器的选择往往是在"简单但不够灵活"和"灵活但配置复杂"之间权衡。WezTerm 用 Lua 作为配置语言,找到了独特的平衡点:配置本身就是编程,但 Lua 的学习门槛极低。
| 维度 | iTerm2 | Alacritty | WezTerm |
|---|---|---|---|
| 平台 | macOS 专属 | 全平台 | 全平台 |
| 配置语言 | GUI | TOML | Lua (可编程) |
| GPU 渲染 | 部分 | OpenGL | WebGPU/OpenGL |
| 分屏 | 是 | 否 | 是 |
| 标签页 | 是 | 否 | 是 |
| 多路复用 | 否 | 否 | 是(内置 mux) |
| 字体连字 | 是 | 否 | 是 |
| 图片显示 | 是 | 否 | 是 |
| 远程 SSH 复用 | 否 | 否 | 是 |
| 动态配置 | 有限 | 热重载 | 完全可编程 |
WezTerm 的独特卖点: - Lua 可编程配置:可以写条件逻辑、动态主题、自定义快捷键行为 - 内置多路复用:不需要 tmux 也能有持久化会话 - 跨平台一致性:macOS/Linux/Windows 上体验完全一致 - SSH 复用域:SSH 到远程服务器时自动建立持久连接
核心概念¶
白话解释¶
WezTerm 把"终端配置"变成了"终端编程"。普通终端的配置文件是键值对,WezTerm 的配置文件是一个 Lua 程序——这意味着你可以: - 根据操作系统自动切换字体和快捷键 - 根据时间自动切换深色/浅色主题 - 自定义标签栏和状态栏显示内容 - 编写复杂的快捷键行为
核心概念表¶
| 概念 | 说明 |
|---|---|
wezterm.lua | 配置文件,一个返回配置表的 Lua 程序 |
| Pane | 终端窗格(最小的终端单元) |
| Tab | 标签页,包含一个或多个 Pane |
| Window | 窗口,包含一个或多个 Tab |
| Domain | 执行域(本地/SSH/Unix socket) |
| Multiplexer (Mux) | 内置的终端复用器 |
| Key Assignment | 快捷键绑定 |
| Event | 可 Hook 的事件(窗口创建、标签切换等) |
| Color Scheme | 颜色方案(内置 700+) |
安装配置¶
安装方式¶
macOS
Linux
# Ubuntu/Debian
curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/wezterm-fury.gpg
echo 'deb [signed-by=/usr/share/keyrings/wezterm-fury.gpg] https://apt.fury.io/wez/ * *' | sudo tee /etc/apt/sources.list.d/wezterm.list
sudo apt update
sudo apt install wezterm
# Arch Linux
pacman -S wezterm
# Flatpak
flatpak install flathub org.wezfurlong.wezterm
Windows
# WinGet
winget install wez.wezterm
# Scoop
scoop install wezterm
# Chocolatey
choco install wezterm
配置文件位置¶
# macOS/Linux
~/.config/wezterm/wezterm.lua
# 或
~/.wezterm.lua
# Windows
C:\Users\<用户名>\.wezterm.lua
基础配置¶
-- ~/.config/wezterm/wezterm.lua
local wezterm = require 'wezterm'
local config = wezterm.config_builder()
-- 字体
config.font = wezterm.font('JetBrains Mono')
config.font_size = 14.0
-- 主题
config.color_scheme = 'Catppuccin Mocha'
-- 窗口
config.window_decorations = "RESIZE"
config.window_padding = {
left = 10,
right = 10,
top = 10,
bottom = 10,
}
-- 标签栏
config.hide_tab_bar_if_only_one_tab = true
config.tab_bar_at_bottom = false
-- 关闭确认
config.window_close_confirmation = 'NeverPrompt'
-- 光标
config.default_cursor_style = 'BlinkingBar'
config.cursor_blink_rate = 500
return config
快速上手¶
默认快捷键¶
标签页操作
| 操作 | macOS | Windows/Linux |
|---|---|---|
| 新标签页 | Cmd+T | Ctrl+Shift+T |
| 关闭标签页 | Cmd+W | Ctrl+Shift+W |
| 切换标签 | Cmd+1-9 | Ctrl+Shift+1-9 |
| 下一个标签 | Cmd+Shift+] | Ctrl+Tab |
| 上一个标签 | Cmd+Shift+[ | Ctrl+Shift+Tab |
窗格操作
| 操作 | macOS | Windows/Linux |
|---|---|---|
| 水平分屏 | Cmd+Shift+D | Ctrl+Shift+D |
| 垂直分屏 | Cmd+D | Alt+Shift+D |
| 切换窗格 | Cmd+[ / ] | Ctrl+Shift+[ / ] |
| 关闭窗格 | Cmd+W | Ctrl+Shift+W |
文本操作
| 操作 | macOS | Windows/Linux |
|---|---|---|
| 复制 | Cmd+C | Ctrl+Shift+C |
| 粘贴 | Cmd+V | Ctrl+Shift+V |
| 搜索 | Cmd+F | Ctrl+Shift+F |
| 放大字体 | Cmd+= | Ctrl+= |
| 缩小字体 | Cmd+- | Ctrl+- |
内置功能¶
# 命令面板(类似 VS Code)
# Ctrl+Shift+P (Windows/Linux) 或 Cmd+Shift+P (macOS)
# Quick Select(快速选择模式)
# 按 Ctrl+Shift+Space,输入内容自动高亮可选区域
# 复制模式(Vim 风格)
# 按 Ctrl+Shift+X 进入,hjkl 移动,v 选择,y 复制
进阶用法¶
自定义快捷键¶
local act = wezterm.action
config.keys = {
-- Alt+方向键 切换窗格
{ key = 'h', mods = 'ALT', action = act.ActivatePaneDirection 'Left' },
{ key = 'l', mods = 'ALT', action = act.ActivatePaneDirection 'Right' },
{ key = 'k', mods = 'ALT', action = act.ActivatePaneDirection 'Up' },
{ key = 'j', mods = 'ALT', action = act.ActivatePaneDirection 'Down' },
-- Ctrl+Shift+Enter 全屏切换当前窗格
{ key = 'Enter', mods = 'CTRL|SHIFT', action = act.TogglePaneZoomState },
-- 快速启动常用程序
{ key = 'g', mods = 'CTRL|SHIFT', action = act.SpawnCommandInNewTab {
args = { 'lazygit' },
}},
-- 分屏
{ key = 'd', mods = 'ALT', action = act.SplitHorizontal { domain = 'CurrentPaneDomain' } },
{ key = 'e', mods = 'ALT', action = act.SplitVertical { domain = 'CurrentPaneDomain' } },
}
动态主题切换¶
-- 根据时间自动切换主题
local function get_appearance()
if wezterm.gui then
return wezterm.gui.get_appearance()
end
return 'Dark'
end
local function scheme_for_appearance(appearance)
if appearance:find 'Dark' then
return 'Catppuccin Mocha'
else
return 'Catppuccin Latte'
end
end
config.color_scheme = scheme_for_appearance(get_appearance())
跨平台配置¶
-- 根据操作系统自动调整
local is_macos = wezterm.target_triple:find('darwin') ~= nil
local is_linux = wezterm.target_triple:find('linux') ~= nil
local is_windows = wezterm.target_triple:find('windows') ~= nil
if is_macos then
config.font_size = 14.0
config.window_decorations = "RESIZE"
config.default_prog = { '/opt/homebrew/bin/fish' }
elseif is_linux then
config.font_size = 12.0
config.default_prog = { '/usr/bin/fish' }
elseif is_windows then
config.font_size = 12.0
config.default_prog = { 'pwsh.exe' }
end
自定义标签栏¶
-- 自定义标签栏显示内容
wezterm.on('format-tab-title', function(tab, tabs, panes, config, hover, max_width)
local pane = tab.active_pane
local title = pane.title
-- 如果是 SSH 连接,显示主机名
if pane.domain_name and pane.domain_name ~= 'local' then
title = pane.domain_name .. ': ' .. title
end
-- 截断过长的标题
if #title > max_width - 4 then
title = title:sub(1, max_width - 7) .. '...'
end
return {
{ Text = ' ' .. (tab.tab_index + 1) .. ': ' .. title .. ' ' },
}
end)
自定义状态栏¶
-- 在右下角显示电池/时间/主机名
wezterm.on('update-right-status', function(window, pane)
local date = wezterm.strftime '%Y-%m-%d %H:%M'
local hostname = wezterm.hostname()
window:set_right_status(wezterm.format {
{ Foreground = { Color = '#7aa2f7' } },
{ Text = hostname },
{ Text = ' | ' },
{ Foreground = { Color = '#9ece6a' } },
{ Text = date },
{ Text = ' ' },
})
end)
SSH 复用域¶
WezTerm 可以直接 SSH 到远程服务器,自动建立持久连接:
config.ssh_domains = {
{
name = 'lab-server',
remote_address = 'lab.example.com',
username = 'user',
-- 可选:指定远程 shell
remote_wezterm_path = '/usr/local/bin/wezterm',
},
}
使用时在命令面板中选择 SSH 域,或:
字体高级配置¶
-- 主字体 + 备用字体链
config.font = wezterm.font_with_fallback {
'JetBrains Mono',
'Noto Sans CJK SC', -- 中文回退
'Symbols Nerd Font', -- 图标回退
}
-- 启用字体连字
config.harfbuzz_features = { 'calt=1', 'clig=1', 'liga=1' }
-- 粗体/斜体
config.font_rules = {
{
italic = true,
font = wezterm.font('JetBrains Mono', { italic = true }),
},
{
intensity = 'Bold',
font = wezterm.font('JetBrains Mono', { weight = 'Bold' }),
},
}
常见问题¶
Q1: WezTerm 和 Ghostty 怎么选?¶
- WezTerm:需要跨平台一致性、Lua 可编程配置、内置 SSH 复用
- Ghostty:在 macOS/Linux 上要最好的原生体验、最简配置
- WezTerm 的配置更灵活但更复杂,Ghostty 追求简单
Q2: 配置文件改了不生效?¶
WezTerm 默认热重载配置。如果不生效: - 检查 Lua 语法错误(WezTerm 会在标签栏显示错误) - 确保文件路径正确 - 在命令面板中执行 "Reload Configuration"
Q3: 中文显示乱码?¶
配置回退字体:
Q4: 内置 mux 可以替代 tmux 吗?¶
部分场景可以。WezTerm 的 mux 支持: - 分屏和标签页 - SSH 持久连接
不支持(需要 tmux 的场景): - 在纯 SSH 终端中使用(WezTerm GUI 不可用时) - 服务器端会话持久化
Q5: 700+ 内置主题如何浏览?¶
参考资源¶
| 资源 | 链接 |
|---|---|
| 官方网站 | https://wezfurlong.org/wezterm |
| GitHub 仓库 | https://github.com/wez/wezterm |
| 配置文档 | https://wezfurlong.org/wezterm/config |
| 快捷键参考 | https://wezfurlong.org/wezterm/config/default-keys |
| 颜色方案库 | https://wezfurlong.org/wezterm/colorschemes |
| Lua API 参考 | https://wezfurlong.org/wezterm/config/lua |
总结:WezTerm 是"程序员给程序员做的终端"。Lua 配置语言让它在灵活性上无可匹敌——你可以写出任何你想要的行为。如果你使用多个操作系统、需要 SSH 复用、或者想要完全控制终端的每个细节,WezTerm 是最适合的选择。