WezTerm Copy Mode 完全指南:用键盘完成滚动回看与精确选择

发布时间:2026/9/12 16:03:29
WezTerm Copy Mode 完全指南:用键盘完成滚动回看与精确选择 WezTerm Copy Mode 完全指南用键盘完成滚动回看与精确选择【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermCopy Mode复制模式是 WezTerm 内置的一种键盘驱动的选择与复制机制它让你无需触碰鼠标即可在滚动回看scrollback中自由移动光标、以多种粒度选中文本并复制到剪贴板。本文以ActivateCopyMode这一键位绑定动作为核心完整梳理 Copy Mode 的激活方式、默认按键表、自定义配置方法并结合仓库源码说明其底层实现。什么是 Copy ModeActivateCopyMode是 KeyAssignmentconfig/src/keyassignment.rs第 588 行枚举中的一个动作用于进入 Copy Mode。根据官方文档 copymode.md 的描述Copy Mode 允许你完全使用键盘在终端中做出选择不需要伸手去够鼠标或触控板。它与 Quick Select Mode 定位不同模式定位Copy Mode基于键盘控制适合精确描述选区逐格、逐行、逐词移动光标Quick Select Mode快速匹配常见模式URL、引号字符串等并一键复制两者各有分工Quick Select 追求快Copy Mode 追求精。进入 Copy Mode 后的行为变化当ActivateCopyMode被触发后WezTerm 会发生两件可见的变化见 copymode.md标签标题前缀变为 Copy Mode提示你当前处于复制模式当前标签的行为被切换键盘输入不再送入终端程序而是用于控制光标在滚动回看中移动滚动视口也会随光标自动调整操作风格与 Vim 编辑器类似。从源码看这一动作在 wezterm-gui/src/termwindow/mod.rs 中处理WezTerm 会为当前窗格创建一个CopyOverlay实现于 wezterm-gui/src/overlay/copy.rs并通过key_table_state.activate激活名为copy_mode的 Key Table见 key-tables.md。激活 Copy Mode默认绑定与自定义绑定默认快捷键ActivateCopyMode默认绑定在CTRL-SHIFT-X上见 default-keys.md开箱即用无需任何配置。自定义绑定官方文档 ActivateCopyMode.md 给出的自定义示例如下——把ActivateCopyMode绑定到CTRL-Xconfig.keys { { key X, mods CTRL, action wezterm.action.ActivateCopyMode }, }如果你希望保留默认绑定同时增加一个新的入口例如CTRL-ALT-C可以这样写local wezterm require wezterm local act wezterm.action config.keys { { key C, mods CTRL|ALT, action act.ActivateCopyMode }, }注意mods支持SUPER、CTRL、ALT、SHIFT、LEADER等修饰键多个修饰键用|连接。完整的键位语法可参考 keys.md 与 default-keys.md。Copy Mode 基础操作选择与复制进入 Copy Mode 后的典型操作流程copymode.md将光标移动到想要选择的起点按v切换选择模式默认关闭即刚进入时只是普通光标移动将光标移动到选区的终点选区会实时高亮使用复制动作默认CTRL-SHIFT-C即全局的CopyToClipboard把选区复制到剪贴板。Copy Mode 支持三种选区形态可通过SelectionMode枚举切换见下文源码解析选区形态按键说明单元格选择Cellv默认模式逐格选择适合精确到字符整行选择LineShiftV整行整行选择矩形/块选择BlockCtrlV20220624-141144-bd1b7c5d 起以矩形块选择适合对齐的列数据高亮/选中文本的颜色可通过 appearance.md 中的自定义颜色配置 调整。Copy Mode 默认按键表以下是官方文档 copymode.md 记录的完整默认按键分配动作按键激活 Copy ModeCtrlShiftX复制并退出 Copy Modey退出 Copy ModeEscCtrlCCtrlGq单元格选择v整行选择ShiftV矩形选择20220624-141144-bd1b7c5d 起CtrlV左移LeftArrowh下移DownArrowj上移UpArrowk右移RightArrowl前进一个单词AltRightArrowAltFTabw后退一个单词AltLeftArrowAltBShiftTabb前进到单词末尾20230320-124340-559cb7b0 起e移到本行行首0Home移到下一行行首Enter移到本行行尾$End移到缩进行的行首AltM^移到滚动回看底部ShiftG移到滚动回看顶部g移到视口顶部ShiftH移到视口中部ShiftM移到视口底部ShiftL上翻一屏PageUpCtrlB上翻半屏20230320-124340-559cb7b0 起CtrlU下翻一屏PageDownCtrlF下翻半屏20230320-124340-559cb7b0 起CtrlD移到选区另一端o水平移到选区另一端矩形选择时有用ShiftO可以看到这套键位大量借鉴了 Vim 的移动习惯h/j/k/l、w/b/e、0/$、gg/G、Ctrl-U/D/F/B等Vim 用户几乎可以零成本上手。可配置的 Copy Mode 按键表从 20220624-141144-bd1b7c5d 版本起Copy Mode 的按键分配由名为copy_mode的 Key Table 定义你可以提供自己的同名键表来完全覆盖默认配置。查看当前版本的默认键表由于默认键表可能随版本演进文档提醒可以直接用以下命令查看你当前安装版本中的实际配置wezterm show-keys --lua --key-table copy_modewezterm show-keys是 WezTerm 自带的 CLI 工具详见 show-keys.md--lua参数会以可直接粘贴进配置文件的 Lua 形式输出。基于默认值增量扩展如果只想在默认键表上追加或修改个别绑定而不是整体替换可以使用wezterm.gui.default_key_tables()自 20221119-145034-49b9839f 起提供。该函数返回无配置文件时生效的默认键表详见 default_key_tables.md。例如给 Copy Mode 增加一个Backspace回退一格的绑定同时保留其他默认按键local wezterm require wezterm local act wezterm.action local copy_mode nil if wezterm.gui then copy_mode wezterm.gui.default_key_tables().copy_mode table.insert( copy_mode, { key Backspace, mods NONE, action act.CopyMode MoveLeft } ) end return { key_tables { copy_mode copy_mode, }, }要点说明wezterm.gui仅在 GUI 进程中存在因此用if wezterm.gui then守卫避免在无 GUI 环境如 mux server中报错act.CopyMode MoveLeft是wezterm.action.CopyMode(MoveLeft)的语法糖早期版本只能整体替换键表default_key_tables()提供了增量扩展的能力。完整替换默认键表仓库中的 docs/examples/default-copy-mode-key-table.markdown 记录了文档构建时的完整默认copy_mode键表与上文表格一一对应。如果你想彻底重定义 Copy Mode 的行为可以以此为蓝本改写local wezterm require wezterm local act wezterm.action return { key_tables { copy_mode { { key Tab, mods NONE, action act.CopyMode MoveForwardWord }, { key Tab, mods SHIFT, action act.CopyMode MoveBackwardWord }, { key Enter, mods NONE, action act.CopyMode MoveToStartOfNextLine }, { key Escape, mods NONE, action act.Multiple { { CopyMode ScrollToBottom }, { CopyMode Close }, }, }, { key Space, mods NONE, action act.CopyMode { SetSelectionMode Cell }, }, { key $, mods NONE, action act.CopyMode MoveToEndOfLineContent }, { key $, mods SHIFT, action act.CopyMode MoveToEndOfLineContent }, { key ,, mods NONE, action act.CopyMode JumpReverse }, { key 0, mods NONE, action act.CopyMode MoveToStartOfLine }, { key ;, mods NONE, action act.CopyMode JumpAgain }, { key F, mods NONE, action act.CopyMode { JumpBackward { prev_char false } } }, { key F, mods SHIFT, action act.CopyMode { JumpBackward { prev_char false } } }, { key G, mods NONE, action act.CopyMode MoveToScrollbackBottom }, { key G, mods SHIFT, action act.CopyMode MoveToScrollbackBottom }, { key H, mods NONE, action act.CopyMode MoveToViewportTop }, { key H, mods SHIFT, action act.CopyMode MoveToViewportTop }, { key L, mods NONE, action act.CopyMode MoveToViewportBottom }, { key L, mods SHIFT, action act.CopyMode MoveToViewportBottom }, { key M, mods NONE, action act.CopyMode MoveToViewportMiddle }, { key M, mods SHIFT, action act.CopyMode MoveToViewportMiddle }, { key O, mods NONE, action act.CopyMode MoveToSelectionOtherEndHoriz }, { key O, mods SHIFT, action act.CopyMode MoveToSelectionOtherEndHoriz }, { key T, mods NONE, action act.CopyMode { JumpBackward { prev_char true } } }, { key T, mods SHIFT, action act.CopyMode { JumpBackward { prev_char true } } }, { key V, mods NONE, action act.CopyMode { SetSelectionMode Line } }, { key V, mods SHIFT, action act.CopyMode { SetSelectionMode Line } }, { key ^, mods NONE, action act.CopyMode MoveToStartOfLineContent }, { key ^, mods SHIFT, action act.CopyMode MoveToStartOfLineContent }, { key b, mods NONE, action act.CopyMode MoveBackwardWord }, { key b, mods ALT, action act.CopyMode MoveBackwardWord }, { key b, mods CTRL, action act.CopyMode PageUp }, { key c, mods CTRL, action act.Multiple { { CopyMode ScrollToBottom }, { CopyMode Close }, }, }, { key d, mods CTRL, action act.CopyMode { MoveByPage 0.5 } }, { key e, mods NONE, action act.CopyMode MoveForwardWordEnd }, { key f, mods NONE, action act.CopyMode { JumpForward { prev_char false } } }, { key f, mods ALT, action act.CopyMode MoveForwardWord }, { key f, mods CTRL, action act.CopyMode PageDown }, { key g, mods NONE, action act.CopyMode MoveToScrollbackTop }, { key g, mods CTRL, action act.Multiple { { CopyMode ScrollToBottom }, { CopyMode Close }, }, }, { key h, mods NONE, action act.CopyMode MoveLeft }, { key j, mods NONE, action act.CopyMode MoveDown }, { key k, mods NONE, action act.CopyMode MoveUp }, { key l, mods NONE, action act.CopyMode MoveRight }, { key m, mods ALT, action act.CopyMode MoveToStartOfLineContent }, { key o, mods NONE, action act.CopyMode MoveToSelectionOtherEnd }, { key q, mods NONE, action act.Multiple { { CopyMode ScrollToBottom }, { CopyMode Close }, }, }, { key t, mods NONE, action act.CopyMode { JumpForward { prev_char true } } }, { key u, mods CTRL, action act.CopyMode { MoveByPage -0.5 } }, { key v, mods NONE, action act.CopyMode { SetSelectionMode Cell } }, { key v, mods CTRL, action act.CopyMode { SetSelectionMode Block } }, { key w, mods NONE, action act.CopyMode MoveForwardWord }, { key y, mods NONE, action act.Multiple { { CopyTo ClipboardAndPrimarySelection }, { CopyMode ScrollToBottom }, { CopyMode Close }, }, }, { key PageUp, mods NONE, action act.CopyMode PageUp }, { key PageDown, mods NONE, action act.CopyMode PageDown }, { key End, mods NONE, action act.CopyMode MoveToEndOfLineContent }, { key Home, mods NONE, action act.CopyMode MoveToStartOfLine }, { key LeftArrow, mods NONE, action act.CopyMode MoveLeft }, { key LeftArrow, mods ALT, action act.CopyMode MoveBackwardWord }, { key RightArrow, mods NONE, action act.CopyMode MoveRight }, { key RightArrow, mods ALT, action act.CopyMode MoveForwardWord }, { key UpArrow, mods NONE, action act.CopyMode MoveUp }, { key DownArrow, mods NONE, action act.CopyMode MoveDown }, }, }, }从这份默认配置中可以看到几个值得注意的细节退出即回到底部Esc、Ctrl-C、Ctrl-G、q都被绑定为act.Multiple { CopyMode ScrollToBottom, CopyMode Close }即退出 Copy Mode 前先把视口滚回当前输出底部避免退出后停留在滚动回看的中间位置复制即退出y依次执行CopyToClipboardAndPrimarySelection同时写入剪贴板与主选择区、ScrollToBottom、Close一键完成复制 退出 回到底部上下翻页绑定两套语义Ctrl-B上翻一屏、Ctrl-U上翻半屏、Ctrl-D下翻半屏、Ctrl-F下翻一屏其中半屏翻页由MoveByPage配合0.5/-0.5实现负值表示向上按字符查找f/F/t/T对应JumpForward/JumpBackwardprev_char控制是否回退到目标字符前一格对应 Vim 的f/F/t/T;与,分别对应JumpAgain/JumpReverse重复/反向重复上次查找。源码解析Copy Mode 的底层实现动作定义KeyAssignment与CopyModeAssignmentCopy Mode 相关的动作定义在 config/src/keyassignment.rs 中第 588 行的ActivateCopyMode是全局KeyAssignment枚举的一个单元变体负责进入 Copy Mode第 636 行的CopyMode(CopyModeAssignment)是另一个变体用于在 Copy Mode 内派发具体的子命令第 684725 行的CopyModeAssignment枚举定义了 Copy Mode 内的全部子动作包括pub enum CopyModeAssignment { MoveToViewportBottom, MoveToViewportTop, MoveToViewportMiddle, MoveToScrollbackTop, MoveToScrollbackBottom, SetSelectionMode(OptionSelectionMode), ClearSelectionMode, MoveToStartOfLineContent, MoveToEndOfLineContent, MoveToStartOfLine, MoveToStartOfNextLine, MoveToSelectionOtherEnd, MoveToSelectionOtherEndHoriz, MoveBackwardWord, MoveForwardWord, MoveForwardWordEnd, MoveRight, MoveLeft, MoveUp, MoveDown, MoveByPage(NotNanf64), PageUp, PageDown, Close, PriorMatch, NextMatch, PriorMatchPage, NextMatchPage, CycleMatchType, ClearPattern, EditPattern, AcceptPattern, MoveBackwardSemanticZone, MoveForwardSemanticZone, MoveBackwardZoneOfType(SemanticType), MoveForwardZoneOfType(SemanticType), JumpForward { prev_char: bool }, JumpBackward { prev_char: bool }, JumpAgain, JumpReverse, }除了上表涉及的移动、翻页、跳转与选择动作外该枚举还包含PriorMatch/NextMatch/CycleMatchType/EditPattern/AcceptPattern等与模式搜索相关的动作说明 Copy Mode 还内置了在滚动回看中搜索、在匹配项间跳转的能力由CopyModeParams { pattern, editing_search }承载搜索状态见 wezterm-gui/src/termwindow/mod.rs。选区形态SelectionMode枚举Copy Mode 中的三种选择形态来自 config/src/keyassignment.rs 的SelectionModepub enum SelectionMode { Cell, Word, Line, SemanticZone, Block, }Cell逐字符单元格选择对应vLine整行选择对应ShiftVBlock矩形块选择对应CtrlVWord、SemanticZone多用于鼠标/语义选择场景Copy Mode 默认键表中主要使用前三种。在 wezterm-gui/src/overlay/copy.rs 中可以看到默认键表源码中SetSelectionMode与这三种模式的对应关系Space/v设置CellV/ShiftV设置LineCtrlV设置Block。当切换为Block时选区会被标记为矩形rectangularShiftOMoveToSelectionOtherEndHoriz在矩形模式下尤其有用因为矩形选区的两个对角需要分别调整行列坐标。激活流程CopyOverlay与copy_mode键表从源码调用链看ActivateCopyMode的完整处理路径是在 wezterm-gui/src/termwindow/mod.rs 中先获取当前活动窗格如果窗格上已经存在CopyOverlay说明已在 Copy Mode 中则复用并重置其参数editing_search false否则创建一个新的CopyOverlay并挂载到窗格上在窗格的状态上激活名为copy_mode的键表KeyTableArgs { name: copy_mode, ... }此后按键按该键表分发。CopyOverlay本身实现了Panetraitwezterm-gui/src/overlay/copy.rs并实现了光标渲染、选区维护set_selection_mode等以及按键分发逻辑。这也解释了为什么进入 Copy Mode 后终端标题会显示 Copy Mode、以及为什么wezterm show-keys --lua --key-table copy_mode能导出这份键表——Copy Mode 本质上就是一个覆盖在正常终端之上的特殊窗格 一张独立的 Key Table。实用技巧小结无鼠标复制长输出Ctrl-Shift-X进入 Copy Mode →GShiftG跳到滚动回看底部或g跳到顶部 →v开始选择 → 移动光标 →y复制并退出。对齐列数据的矩形选择Ctrl-Shift-X→CtrlV切换为 Block 模式 → 用ShiftO水平移动选区另一端 →y复制。查看本机真实键表运行wezterm show-keys --lua --key-table copy_mode以你安装版本的实际情况为准而不是文档中记录的可能更新的默认值。增量定制而非全量替换优先使用wezterm.gui.default_key_tables()取默认表再table.insert避免因版本升级导致键表漂移时丢失新增的默认绑定。相关参考完整说明见 copymode.md键表机制见 key-tables.md默认键表导出函数见 default_key_tables.mdshow-keys命令见 show-keys.md。【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考