WezTerm 完整配置指南

macOS 难度:中级 阅读时间:25 分钟 前置知识:终端基础

WezTerm 是一款基于 Rust 开发的现代 GPU 加速终端模拟器,支持 Lua 脚本配置、多平台、连字、图像显示等高级特性。本指南将带你从安装到完成一套精美的个性化配置。

开始安装 →

学习目标 #

  • 掌握 WezTerm 在 macOS 上的安装方法
  • 理解 WezTerm Lua 配置文件的结构与语法
  • 实现主题自动跟随系统深浅色模式切换
  • 配置毛玻璃透明效果、字体连字与自定义快捷键
  • 添加实时 CPU/内存监控 Status Bar

核心摘要 #

WezTerm 是一款跨平台的 GPU 加速终端模拟器,使用 Rust 编写。它通过 Lua 脚本实现高度可定制化配置,支持连字、图像协议、多窗格、SSH 复用等现代终端特性。

配置文件位于 ~/.config/wezterm/wezterm.lua,所有修改即时生效,无需重启终端。

概念图 #

安装 WezTerm
创建配置文件
主题配色
字体设置
窗口样式
快捷键
Status Bar

基础知识 #

先决条件

  • macOS 10.14 (Mojave) 或更高版本
  • 已安装 Homebrew 包管理器
  • 基本的终端使用经验
  • (可选)已安装 Nerd Font 字体以显示图标

为什么选择 WezTerm?

  • GPU 加速:使用 WebGPU/Metal 渲染,滚动丝滑流畅
  • Lua 配置:比 JSON/YAML 更灵活,支持条件逻辑和函数
  • 跨平台:同一配置文件可在 macOS/Linux/Windows 使用
  • 内置功能丰富:SSH 复用、串行端口、图像协议无需插件
  • 热重载:配置文件修改后自动生效

常见误区

❌ 误区:WezTerm 配置文件必须放在 ~/.wezterm.lua

✓ 正确:WezTerm 支持多个配置路径,推荐使用 ~/.config/wezterm/wezterm.lua,更符合 XDG 规范且便于版本控制。

安装步骤 #

选择你的操作系统查看对应的安装步骤:

  1. 使用 Homebrew 安装 WezTerm

    WezTerm 已收录在 Homebrew Cask 中,一行命令即可安装:

    Terminal
    $ brew install --cask wezterm
  2. 安装 Nerd Font 字体(推荐)

    Nerd Font 包含丰富的图标字符,用于显示文件类型图标、Git 状态、系统监控图标等:

    Terminal
    $ brew install --cask font-jetbrains-mono-nerd-font
  3. 创建配置目录和文件
    Terminal
    $ mkdir -p ~/.config/wezterm && touch ~/.config/wezterm/wezterm.lua

    配置文件路径:~/.config/wezterm/wezterm.lua

  4. 验证安装

    打开 WezTerm 应用,运行以下命令查看版本:

    Terminal
    $ wezterm --version
    wezterm 20240203-110809-5046fc22

方式一:使用 Winget(推荐)

PowerShell
> winget install wez.wezterm

方式二:使用 Scoop

PowerShell
> scoop bucket add extras
> scoop install wezterm

方式三:使用 Chocolatey

PowerShell (管理员)
> choco install wezterm -y

方式四:手动下载安装

访问 WezTerm 官网下载页 下载 .exe 安装包或 .zip 便携版。

安装 Nerd Font 字体

PowerShell
# 使用 Scoop 安装
> scoop bucket add nerd-fonts
> scoop install JetBrainsMono-NF

或从 Nerd Fonts 官网 下载字体后手动安装。

配置文件路径

Windows 上配置文件位于:

  • C:\Users\你的用户名\.config\wezterm\wezterm.lua(推荐)
  • C:\Users\你的用户名\.wezterm.lua
PowerShell
# 创建配置目录
> mkdir "$env:USERPROFILE\.config\wezterm" -Force
> New-Item "$env:USERPROFILE\.config\wezterm\wezterm.lua" -ItemType File

Ubuntu / Debian

WezTerm 提供官方 APT 仓库:

Terminal
# 添加 GPG 密钥
$ curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --yes --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

Fedora / RHEL

Terminal
$ sudo dnf copr enable wezfurlong/wezterm-nightly
$ sudo dnf install wezterm

Arch Linux

Terminal
$ sudo pacman -S wezterm
# 或使用 AUR (nightly)
$ yay -S wezterm-git

Flatpak(通用)

Terminal
$ flatpak install flathub org.wezfurlong.wezterm

AppImage(便携版)

GitHub Releases 下载 .AppImage 文件:

Terminal
$ chmod +x WezTerm-*.AppImage
$ ./WezTerm-*.AppImage

安装 Nerd Font 字体

Terminal
# 下载并安装 JetBrainsMono Nerd Font
$ mkdir -p ~/.local/share/fonts
$ cd ~/.local/share/fonts && curl -fLO https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
$ unzip JetBrainsMono.zip && rm JetBrainsMono.zip
$ fc-cache -fv

配置文件路径

Terminal
$ mkdir -p ~/.config/wezterm && touch ~/.config/wezterm/wezterm.lua

配置文件路径:~/.config/wezterm/wezterm.lua

✓ 验证安装

无论哪个平台,安装完成后打开 WezTerm,运行 wezterm --version 确认安装成功。

详细配置 #

配置文件基本结构

WezTerm 配置文件是一个 Lua 脚本,必须返回一个配置表(table):

~/.config/wezterm/wezterm.lua
-- 导入 wezterm 模块
local wezterm = require 'wezterm'

-- 使用 config_builder 获取更好的类型检查和错误提示
local config = wezterm.config_builder()

-- 在这里添加你的配置...
config.font_size = 17.0

-- 返回配置表
return config

1. 主题配色(自动跟随系统)

为什么重要:自动跟随系统深浅色模式可以保持视觉一致性,减少眼睛疲劳。

运作原理:通过监听 window-config-reloaded 事件,检测系统外观变化并动态切换配色方案。

主题配置 Lua
-- Catppuccin 配色定义
local colors = {
  dark = {
    scheme = 'Catppuccin Mocha',
    mantle = '#181825',
    base = '#1e1e2e',
    surface0 = '#313244',
    surface1 = '#45475a',
    text = '#cdd6f4',
    subtext0 = '#a6adc8',
    mauve = '#cba6f7',
    blue = '#89b4fa',
    pink = '#f5c2e7',
  },
  light = {
    scheme = 'Catppuccin Latte',
    mantle = '#eff1f5',
    base = '#eff1f5',
    surface0 = '#ccd0da',
    surface1 = '#bcc0cc',
    text = '#4c4f69',
    subtext0 = '#6c6f85',
    mauve = '#8839ef',
    blue = '#1e66f5',
    pink = '#ea76cb',
  },
}

local function is_dark(appearance)
  return appearance:find 'Dark'
end

local function get_colors(appearance)
  return is_dark(appearance) and colors.dark or colors.light
end

-- 动态切换主题
wezterm.on('window-config-reloaded', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  local appearance = window:get_appearance()
  local c = get_colors(appearance)
  if overrides.color_scheme ~= c.scheme then
    overrides.color_scheme = c.scheme
    window:set_config_overrides(overrides)
  end
end)

2. 字体配置

为什么重要:好的字体配置可以提升代码可读性,连字特性让操作符更直观。

字体配置 Lua
config.font = wezterm.font_with_fallback {
  {
    family = 'JetBrainsMono Nerd Font',
    weight = 'Medium',
    -- 启用连字特性
    harfbuzz_features = { 'calt=1', 'clig=1', 'liga=1' },
  },
  { family = 'Fira Code', weight = 'Medium' },
  'Apple Color Emoji',  -- Emoji 回退
}

config.font_size = 17.0
config.line_height = 1.2
config.cell_width = 1.0

3. 窗口样式(毛玻璃效果)

适用场景:想要现代化、美观的终端外观,同时能看到桌面背景。

窗口样式 Lua
-- 窗口透明度 + 毛玻璃效果
config.window_background_opacity = 0.7
config.macos_window_background_blur = 30

-- 窗口装饰:将关闭/最小化/最大化按钮集成到 Tab Bar
config.window_decorations = 'INTEGRATED_BUTTONS|RESIZE'

-- 窗口内边距
config.window_padding = {
  left = 20,
  right = 20,
  top = 30,
  bottom = 20,
}

-- 初始窗口大小
config.initial_cols = 90
config.initial_rows = 23

4. 快捷键配置

为什么重要:自定义快捷键可以大幅提升操作效率,让常用操作触手可及。

快捷键配置 Lua
config.keys = {
  -- Tab 操作
  { key = 't', mods = 'CMD', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'w', mods = 'CMD', action = wezterm.action.CloseCurrentTab { confirm = true } },

  -- Tab 切换 (Cmd+1-5)
  { key = '1', mods = 'CMD', action = wezterm.action.ActivateTab(0) },
  { key = '2', mods = 'CMD', action = wezterm.action.ActivateTab(1) },
  { key = '3', mods = 'CMD', action = wezterm.action.ActivateTab(2) },
  { key = '4', mods = 'CMD', action = wezterm.action.ActivateTab(3) },
  { key = '5', mods = 'CMD', action = wezterm.action.ActivateTab(4) },

  -- 分屏
  { key = 'd', mods = 'CMD', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
  { key = 'd', mods = 'CMD|SHIFT', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },

  -- 窗格导航 (Cmd+Alt+hjkl)
  { key = 'h', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Left' },
  { key = 'l', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Right' },
  { key = 'k', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Up' },
  { key = 'j', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Down' },

  -- 其他
  { key = 'k', mods = 'CMD', action = wezterm.action.ClearScrollback 'ScrollbackAndViewport' },
  { key = 'f', mods = 'CMD', action = wezterm.action.Search 'CurrentSelectionOrEmptyString' },
  { key = 'f', mods = 'CMD|CTRL', action = wezterm.action.ToggleFullScreen },
}

5. Status Bar(系统监控)

运作原理:通过 update-status 事件定期执行 shell 命令获取系统信息,并显示在 Tab Bar 右侧。

Status Bar 配置 Lua
config.status_update_interval = 2000  -- 每 2 秒更新

wezterm.on('update-status', function(window, pane)
  local appearance = window:get_appearance()
  local is_dark = appearance:find 'Dark'
  local fg_color = is_dark and '#cdd6f4' or '#4c4f69'
  local icon_color = is_dark and '#89b4fa' or '#1e66f5'

  local success, stdout = wezterm.run_child_process({
    '/bin/zsh', '-c',
    [[
      cpu=$(top -l 1 -n 0 | grep 'CPU usage' | awk '{printf "%.0f", $3}')
      mem_used=$(top -l 1 -n 0 | head -n 10 | grep PhysMem | awk '{print $2}' | tr -d 'G')
      mem_total=$(sysctl -n hw.memsize | awk '{printf "%.0f", $1/1024/1024/1024}')
      echo "$cpu|$mem_used|$mem_total"
    ]]
  })

  local status_text = ''
  if success then
    local cpu, mem_used, mem_total = stdout:match('(%d+)|(%d+)|(%d+)')
    if cpu and mem_used and mem_total then
      status_text = wezterm.format({
        { Foreground = { Color = icon_color } }, { Text = '󰻠 ' },
        { Foreground = { Color = fg_color } }, { Text = cpu .. '%' },
        { Foreground = { Color = icon_color } }, { Text = '   󰍛 ' },
        { Foreground = { Color = fg_color } }, { Text = mem_used .. 'G/' .. mem_total .. 'G' },
        { Text = '  ' },
      })
    end
  end

  window:set_right_status(status_text)
end)

反模式 vs 最佳实践 #

❌ 不推荐

直接硬编码颜色值散落在配置各处

config.colors = {
  tab_bar = {
    background = '#181825',
    active_tab = { bg_color = '#cba6f7' }
  }
}
-- 深色/浅色需要维护两份代码

问题:切换主题需要修改多处,容易遗漏导致颜色不一致。

✓ 推荐

使用变量集中管理配色

local colors = {
  dark = { mauve = '#cba6f7', ... },
  light = { mauve = '#8839ef', ... },
}
local c = get_colors(appearance)
-- 使用 c.mauve 引用

优点:一处定义,处处引用,主题切换只需改变 colors 对象。

❌ 不推荐

在 Status Bar 中执行耗时命令

config.status_update_interval = 100
-- 每 100ms 执行 top 命令
-- 会导致 CPU 占用过高
✓ 推荐

合理的更新间隔

config.status_update_interval = 2000
-- 每 2 秒更新一次
-- 平衡实时性与性能

完整示例 #

基础配置 - 快速上手

最简配置,适合快速体验 WezTerm:

wezterm.lua (基础版)
local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- 基础配置
config.color_scheme = 'Catppuccin Mocha'
config.font = wezterm.font('JetBrainsMono Nerd Font')
config.font_size = 16.0

-- 窗口
config.window_background_opacity = 0.9
config.window_decorations = 'RESIZE'

return config

高级配置 - 性能优化

启用 GPU 加速和高帧率:

性能配置
-- 性能与渲染
config.front_end = 'WebGpu'            -- 使用 WebGPU 渲染
config.webgpu_power_preference = 'HighPerformance'
config.max_fps = 120                   -- 最大帧率
config.animation_fps = 60              -- 动画帧率

-- 滚动缓冲区
config.scrollback_lines = 10000       -- 历史行数
config.enable_scroll_bar = false      -- 隐藏滚动条

-- 光标
config.default_cursor_style = 'BlinkingBar'
config.cursor_blink_rate = 500
config.cursor_thickness = 2

完整配置文件

以下是当前使用的完整配置,可直接复制使用:

~/.config/wezterm/wezterm.lua
local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- ══════════════════════════════════════════════════════════════════════════════
-- 外观主题(自动跟随系统深色/浅色模式)
-- ══════════════════════════════════════════════════════════════════════════════

-- Catppuccin 配色定义
local colors = {
  dark = {
    scheme = 'Catppuccin Mocha',
    mantle = '#181825',
    mantle_alpha = 'rgba(24, 24, 37, 0.7)',  -- 带透明度的标题栏背景
    base = '#1e1e2e',
    surface0 = '#313244',
    surface1 = '#45475a',
    text = '#cdd6f4',
    subtext0 = '#a6adc8',
    mauve = '#cba6f7',
    blue = '#89b4fa',
    pink = '#f5c2e7',
  },
  light = {
    scheme = 'Catppuccin Latte',
    mantle = '#eff1f5',
    mantle_alpha = 'rgba(239, 241, 245, 0.7)',  -- 带透明度的标题栏背景
    base = '#eff1f5',
    surface0 = '#ccd0da',
    surface1 = '#bcc0cc',
    text = '#4c4f69',
    subtext0 = '#6c6f85',
    mauve = '#8839ef',
    blue = '#1e66f5',
    pink = '#ea76cb',
  },
}

local function is_dark(appearance)
  return appearance:find 'Dark'
end

local function get_colors(appearance)
  return is_dark(appearance) and colors.dark or colors.light
end

local function get_appearance()
  if wezterm.gui then
    return wezterm.gui.get_appearance()
  end
  return 'Dark'
end

-- 生成 Tab Bar 颜色配置
local function make_tab_bar_colors(c)
  return {
    background = c.mantle,
    inactive_tab_edge = c.surface0,
    active_tab = {
      bg_color = c.mauve,
      fg_color = c.base,
      intensity = 'Bold',
    },
    inactive_tab = {
      bg_color = c.surface0,
      fg_color = c.subtext0,
    },
    inactive_tab_hover = {
      bg_color = c.surface1,
      fg_color = c.text,
      italic = true,
    },
    new_tab = {
      bg_color = c.mantle,
      fg_color = c.blue,
    },
    new_tab_hover = {
      bg_color = c.surface0,
      fg_color = c.pink,
      italic = true,
    },
  }
end

-- 初始化配色
local current_colors = get_colors(get_appearance())
config.color_scheme = current_colors.scheme

-- 动态切换主题
wezterm.on('window-config-reloaded', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  local appearance = window:get_appearance()
  local c = get_colors(appearance)
  if overrides.color_scheme ~= c.scheme then
    overrides.color_scheme = c.scheme
    overrides.colors = { tab_bar = make_tab_bar_colors(c) }
    overrides.window_frame = {
      font = wezterm.font { family = 'JetBrainsMono Nerd Font', weight = 'Bold' },
      font_size = 14.0,
      active_titlebar_bg = c.mantle,
      inactive_titlebar_bg = c.mantle,
      border_left_width = '0.4cell',
      border_right_width = '0.4cell',
      border_top_height = '0.2cell',
      border_bottom_height = '0.2cell',
      border_left_color = c.mantle,
      border_right_color = c.mantle,
      border_top_color = c.mantle,
      border_bottom_color = c.mantle,
    }
    window:set_config_overrides(overrides)
  end
end)

-- 自定义 Tab 标题格式(设置最小宽度)
local TAB_MIN_WIDTH = 12  -- 最小宽度(字符数)

wezterm.on('format-tab-title', function(tab, tabs, panes, config, hover, max_width)
  local title = tab.active_pane.title
  -- 如果标题太长,截断并加省略号
  if #title > max_width - 2 then
    title = string.sub(title, 1, max_width - 5) .. '...'
  end
  -- 如果标题太短,两侧补空格使其居中
  if #title < TAB_MIN_WIDTH then
    local padding = TAB_MIN_WIDTH - #title
    local left_pad = math.floor(padding / 2)
    local right_pad = padding - left_pad
    title = string.rep(' ', left_pad) .. title .. string.rep(' ', right_pad)
  end
  return ' ' .. title .. ' '
end)

-- ══════════════════════════════════════════════════════════════════════════════
-- 字体配置
-- ══════════════════════════════════════════════════════════════════════════════

config.font = wezterm.font_with_fallback {
  {
    family = 'JetBrainsMono Nerd Font',
    weight = 'Medium',
    harfbuzz_features = { 'calt=1', 'clig=1', 'liga=1' },  -- 启用连字
  },
  { family = 'Fira Code', weight = 'Medium' },
  'Apple Color Emoji',
}

config.font_size = 17.0
config.line_height = 1.2
config.cell_width = 1.0

-- ══════════════════════════════════════════════════════════════════════════════
-- 窗口样式
-- ══════════════════════════════════════════════════════════════════════════════

-- 窗口透明度 + 毛玻璃效果
config.window_background_opacity = 0.7
config.macos_window_background_blur = 30

-- 窗口装饰:将关闭/最小化/最大化按钮集成到 Tab Bar
config.window_decorations = 'INTEGRATED_BUTTONS|RESIZE'

-- 窗口内边距
config.window_padding = {
  left = 20,
  right = 20,
  top = 30,
  bottom = 20,
}

-- 初始窗口大小
config.initial_cols = 90
config.initial_rows = 23

-- ══════════════════════════════════════════════════════════════════════════════
-- Tab Bar 样式
-- ══════════════════════════════════════════════════════════════════════════════

config.enable_tab_bar = true
config.use_fancy_tab_bar = true
config.tab_bar_at_bottom = false
config.tab_max_width = 50
config.show_tab_index_in_tab_bar = true
config.switch_to_last_active_tab_when_closing_tab = true

-- Tab Bar 字体和颜色(根据当前外观初始化)
config.window_frame = {
  font = wezterm.font { family = 'JetBrainsMono Nerd Font', weight = 'Bold' },
  font_size = 14.0,
  active_titlebar_bg = current_colors.mantle,
  inactive_titlebar_bg = current_colors.mantle,
  border_left_width = '0.4cell',
  border_right_width = '0.4cell',
  border_top_height = '0.2cell',
  border_bottom_height = '0.2cell',
  border_left_color = current_colors.mantle,
  border_right_color = current_colors.mantle,
  border_top_color = current_colors.mantle,
  border_bottom_color = current_colors.mantle,
}

config.colors = {
  tab_bar = make_tab_bar_colors(current_colors),
}

-- ══════════════════════════════════════════════════════════════════════════════
-- 光标样式
-- ══════════════════════════════════════════════════════════════════════════════

config.default_cursor_style = 'BlinkingBar'
config.cursor_blink_rate = 500
config.cursor_blink_ease_in = 'Constant'
config.cursor_blink_ease_out = 'Constant'

-- ══════════════════════════════════════════════════════════════════════════════
-- 性能与渲染
-- ══════════════════════════════════════════════════════════════════════════════

config.front_end = 'WebGpu'
config.webgpu_power_preference = 'HighPerformance'
config.max_fps = 120
config.animation_fps = 60
config.cursor_thickness = 2

config.scrollback_lines = 10000
config.enable_scroll_bar = false

-- ══════════════════════════════════════════════════════════════════════════════
-- 快捷键
-- ══════════════════════════════════════════════════════════════════════════════

config.keys = {
  -- Shift+Enter 插入换行而不执行(Ctrl+V + LF)
  { key = 'Enter', mods = 'SHIFT', action = wezterm.action.SendString '\x16\x0a' },
  { key = 't', mods = 'CMD', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'w', mods = 'CMD', action = wezterm.action.CloseCurrentTab { confirm = true } },
  { key = '1', mods = 'CMD', action = wezterm.action.ActivateTab(0) },
  { key = '2', mods = 'CMD', action = wezterm.action.ActivateTab(1) },
  { key = '3', mods = 'CMD', action = wezterm.action.ActivateTab(2) },
  { key = '4', mods = 'CMD', action = wezterm.action.ActivateTab(3) },
  { key = '5', mods = 'CMD', action = wezterm.action.ActivateTab(4) },
  { key = '[', mods = 'CMD|SHIFT', action = wezterm.action.ActivateTabRelative(-1) },
  { key = ']', mods = 'CMD|SHIFT', action = wezterm.action.ActivateTabRelative(1) },
  { key = 'd', mods = 'CMD', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
  { key = 'd', mods = 'CMD|SHIFT', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },
  { key = 'k', mods = 'CMD', action = wezterm.action.ClearScrollback 'ScrollbackAndViewport' },
  { key = 'f', mods = 'CMD', action = wezterm.action.Search 'CurrentSelectionOrEmptyString' },
  { key = ',', mods = 'CMD', action = wezterm.action.SpawnCommandInNewTab {
    cwd = wezterm.home_dir,
    args = { 'open', wezterm.config_file },
  }},
  { key = 'f', mods = 'CMD|CTRL', action = wezterm.action.ToggleFullScreen },
  { key = 'h', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Left' },
  { key = 'l', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Right' },
  { key = 'k', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Up' },
  { key = 'j', mods = 'CMD|ALT', action = wezterm.action.ActivatePaneDirection 'Down' },
}

-- ══════════════════════════════════════════════════════════════════════════════
-- 其他设置
-- ══════════════════════════════════════════════════════════════════════════════

config.window_close_confirmation = 'NeverPrompt'
config.check_for_updates = false
config.audible_bell = 'Disabled'
config.term = 'xterm-256color'

-- ══════════════════════════════════════════════════════════════════════════════
-- Status Bar(系统监控)
-- ══════════════════════════════════════════════════════════════════════════════

config.status_update_interval = 2000

wezterm.on('update-status', function(window, pane)
  local appearance = window:get_appearance()
  local is_dark = appearance:find 'Dark'
  local fg_color = is_dark and '#cdd6f4' or '#4c4f69'
  local icon_color = is_dark and '#89b4fa' or '#1e66f5'

  local success, stdout = wezterm.run_child_process({
    '/bin/zsh', '-c',
    [[
      cpu=$(top -l 1 -n 0 | grep 'CPU usage' | awk '{printf "%.0f", $3}')
      mem_used=$(top -l 1 -n 0 | head -n 10 | grep PhysMem | awk '{print $2}' | tr -d 'G')
      mem_total=$(sysctl -n hw.memsize | awk '{printf "%.0f", $1/1024/1024/1024}')
      echo "$cpu|$mem_used|$mem_total"
    ]]
  })

  local status_text = ''
  if success then
    local cpu, mem_used, mem_total = stdout:match('(%d+)|(%d+)|(%d+)')
    if cpu and mem_used and mem_total then
      status_text = wezterm.format({
        { Foreground = { Color = icon_color } }, { Text = '󰻠 ' },
        { Foreground = { Color = fg_color } }, { Text = cpu .. '%' },
        { Foreground = { Color = icon_color } }, { Text = '   󰍛 ' },
        { Foreground = { Color = fg_color } }, { Text = mem_used .. 'G/' .. mem_total .. 'G' },
        { Text = '  ' },
      })
    end
  end

  window:set_right_status(status_text)
end)

return config

术语词汇表 #

config_builder()
WezTerm 提供的配置构建器,提供更好的类型检查和错误提示
font_with_fallback
字体回退链,按顺序尝试字体直到找到可用的
harfbuzz_features
OpenType 字体特性,如连字 (ligatures)
window_decorations
窗口装饰样式,控制标题栏和边框外观
front_end
渲染后端,如 WebGpu、OpenGL、Software
Pane / Tab
Pane 是窗格(分屏),Tab 是标签页

故障排除 #

问题症状 可能原因 解决方案
图标显示为方框 未安装 Nerd Font brew install --cask font-jetbrains-mono-nerd-font
配置不生效 Lua 语法错误 查看 WezTerm 日志:View → Debug Overlay
毛玻璃无效 透明度设为 1.0 设置 window_background_opacity < 1.0
Status Bar 不显示 Shell 命令失败 确保 /bin/zsh 可执行,检查 top 命令输出
配置文件路径优先级

WezTerm 按以下顺序查找配置文件:

  1. $WEZTERM_CONFIG_FILE 环境变量
  2. $XDG_CONFIG_HOME/wezterm/wezterm.lua
  3. ~/.config/wezterm/wezterm.lua
  4. ~/.wezterm.lua
如何查看 WezTerm 日志?

Cmd+Shift+L 或通过菜单 View → Debug Overlay 打开调试面板,可以看到配置加载错误和运行时日志。

速查表 #

快捷键速查

操作 快捷键
新建 TabCmd + T
关闭 TabCmd + W
切换 TabCmd + 1-5
水平分屏Cmd + D
垂直分屏Cmd + Shift + D
窗格导航Cmd + Alt + H/J/K/L
清屏Cmd + K
搜索Cmd + F
全屏Cmd + Ctrl + F
打开配置Cmd + ,

常用配置项速查

配置项 说明 示例值
font_size字体大小17.0
line_height行高1.2
window_background_opacity窗口透明度0.7
macos_window_background_blur毛玻璃模糊度30
scrollback_lines滚动历史行数10000
max_fps最大帧率120

自测评估 #

1. WezTerm 配置文件使用什么语言编写?

2. 如何启用 WezTerm 的 GPU 加速?

3. 配置文件修改后需要重启 WezTerm 吗?

下一步行动 #

快速开始

  1. 复制上方「完整配置」到 ~/.config/wezterm/wezterm.lua
  2. 打开 WezTerm,配置自动生效
  3. 根据个人喜好调整字体大小、透明度等参数

相关工具推荐

  • Powerlevel10k - Zsh 主题,与 WezTerm 完美搭配
  • zsh-autosuggestions - 命令自动补全
  • zsh-syntax-highlighting - 语法高亮
已复制到剪贴板!