跳转至

WezTerm: Lua 配置的 GPU 加速跨平台终端

为什么要学 WezTerm

终端模拟器的选择往往是在"简单但不够灵活"和"灵活但配置复杂"之间权衡。WezTerm 用 Lua 作为配置语言,找到了独特的平衡点:配置本身就是编程,但 Lua 的学习门槛极低

维度iTerm2AlacrittyWezTerm
平台macOS 专属全平台全平台
配置语言GUITOMLLua (可编程)
GPU 渲染部分OpenGLWebGPU/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

brew install --cask wezterm

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

快速上手

默认快捷键

标签页操作

操作macOSWindows/Linux
新标签页Cmd+TCtrl+Shift+T
关闭标签页Cmd+WCtrl+Shift+W
切换标签Cmd+1-9Ctrl+Shift+1-9
下一个标签Cmd+Shift+]Ctrl+Tab
上一个标签Cmd+Shift+[Ctrl+Shift+Tab

窗格操作

操作macOSWindows/Linux
水平分屏Cmd+Shift+DCtrl+Shift+D
垂直分屏Cmd+DAlt+Shift+D
切换窗格Cmd+[ / ]Ctrl+Shift+[ / ]
关闭窗格Cmd+WCtrl+Shift+W

文本操作

操作macOSWindows/Linux
复制Cmd+CCtrl+Shift+C
粘贴Cmd+VCtrl+Shift+V
搜索Cmd+FCtrl+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 域,或:

wezterm connect lab-server

字体高级配置

-- 主字体 + 备用字体链
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: 中文显示乱码?

配置回退字体:

config.font = wezterm.font_with_fallback {
  'JetBrains Mono',
  'Noto Sans CJK SC',  -- 或其他中文字体
}

Q4: 内置 mux 可以替代 tmux 吗?

部分场景可以。WezTerm 的 mux 支持: - 分屏和标签页 - SSH 持久连接

不支持(需要 tmux 的场景): - 在纯 SSH 终端中使用(WezTerm GUI 不可用时) - 服务器端会话持久化

Q5: 700+ 内置主题如何浏览?

-- 列出所有可用主题
-- 在命令面板中输入 "Select Color Scheme"
-- 或访问 https://wezfurlong.org/wezterm/colorschemes/

参考资源

资源链接
官方网站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 是最适合的选择。