WezTerm Copy Mode 完全指南:用 Vim 风格键盘操作完成滚动缓冲区选择与复制 📅 发布时间:2026/9/13 13:51:10 👁 浏览次数: WezTerm Copy Mode 完全指南用 Vim 风格键盘操作完成滚动缓冲区选择与复制【免费下载链接】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 内置的纯键盘选择机制进入后无需触碰鼠标或触控板即可用类似 Vim 的光标移动方式在滚动缓冲区scrollback中漫游、圈选区域并复制到剪贴板。本文以 docs/copymode.md 为主线完整讲解 Copy Mode 的进入方式、默认按键体系、三种选择模式、默认键表结构并结合 config/src/keyassignment.rs 中的CopyModeAssignment枚举说明每个操作在底层如何实现最后给出通过copy_mode键表自定义按键的完整 Lua 配置方案。读完本文你将能熟练用CtrlShiftX进入复制模式完成跨屏选择并掌握按需改造这套键表的全部方法。什么是 Copy ModeCopy Mode 允许你只使用键盘就能完成文本选择而不必伸手去碰鼠标或触控板。它由 WezTerm 的ActivateCopyMode键分配触发默认绑定为CtrlShiftX。与 Quick Select 的关系Copy Mode 与 Quick Select 模式 类似但定位不同。Quick Select 面向快速选中并复制常见模式如 URL、数字、路径等预设 pattern而 Copy Mode 完全面向通过键盘控制来描述一段任意的选择区域。二者互为补充一个按模式匹配一个按光标控制。高亮颜色可配置进入 Copy Mode 后被高亮/选中的文本颜色可以通过 外观配置中的自定义颜色 进行调整与终端其余配色体系共用同一套颜色定义。进入后的行为变化当 Copy Mode 激活时终端会发生两个可见变化标签页标题加前缀标签标题前会加上Copy Mode字样提示你当前处于复制模式。键盘行为接管标签页行为被切换键盘输入不再发送给终端程序而是控制光标在滚动缓冲区中移动需要时视口会自动滚动整体操作风格与 Vim 编辑器非常相似。从源码层面看这一动作对应 keyassignment.rs 中的ActivateCopyMode动作而模式内每个具体操作则是KeyAssignment::CopyMode(CopyModeAssignment)枚举的实例见 config/src/keyassignment.rs。基本操作流程一次典型的纯键盘选择与复制流程如下按CtrlShiftX进入 Copy Mode使用移动按键如h/j/k/l或方向键把光标移动到选区起点按v切换选择模式默认处于关闭状态再次移动光标到选区终点光标扫过的区域即被高亮按默认的CtrlShiftC即常规Copy动作将该区域复制到剪贴板。复制完成后按q或Esc即可退出 Copy Mode回到正常终端输入。三种选择模式Copy Mode 支持按单元格、按行、按矩形块三种选择维度通过v系列按键切换选择模式触发按键说明单元格选择Cellv默认模式按单个单元格精确圈选适合复制一段连续文本行选择LineShiftV以整行为单位选择适合复制命令输出中的完整行矩形/块选择BlockCtrlV自 20220624-141144-bd1b7c5d 版本起矩形区域选择适合对齐的列数据、表格等这三个取值对应CopyModeAssignment::SetSelectionMode(OptionSelectionMode)的三种SelectionModeCell、Line、Block。默认键表中可以看到它们的完整绑定docs/examples/default-copy-mode-key-table.markdown{ key v, mods NONE, action act.CopyMode { SetSelectionMode Cell } }, { key V, mods SHIFT, action act.CopyMode { SetSelectionMode Line } }, { key v, mods CTRL, action act.CopyMode { SetSelectionMode Block } },在矩形Block选择模式下ShiftO可以在选区的左右两个端点之间水平跳跃MoveToSelectionOtherEndHoriz方便从矩形的一角快速跳到另一角。默认按键分配全表下表是 Copy Mode 内置的完整默认按键体系。凡是同一动作对应多个按键的它们完全等价你可以按习惯任选其一方向键组适合新手、hjkl组适合 Vim 用户动作按键分配进入复制模式CtrlShiftX复制并退出复制模式y退出复制模式EscCtrlCCtrlGq单元格选择v行选择ShiftV矩形选择CtrlV自 20220624-141144-bd1b7c5d 起向左移动←/h向下移动↓/j向上移动↑/k向右移动→/l前进一个单词Alt→/AltF/Tab/w后退一个单词Alt←/AltB/ShiftTab/b前进到单词末尾e自 20230320-124340-559cb7b0 起移动到本行行首0/Home移动到下一行行首Enter移动到本行行尾$/End移动到缩进行的内容起始处AltM/^移动到滚动缓冲区底部ShiftG移动到滚动缓冲区顶部g移动到视口顶部ShiftH移动到视口中间ShiftM移动到视口底部ShiftL向上翻一屏PageUp/CtrlB向上翻半屏CtrlU自 20230320-124340-559cb7b0 起向下翻一屏PageDown/CtrlF向下翻半屏CtrlD自 20230320-124340-559cb7b0 起跳到选区另一端o水平跳到选区另一端ShiftO矩形模式下很有用底层操作枚举上表中的每一行动作在源码层面都对应CopyModeAssignment枚举的一个变体config/src/keyassignment.rs。完整的操作集合如下供你对照默认键表理解视口与滚动缓冲区跳转MoveToViewportTop/MoveToViewportMiddle/MoveToViewportBottom、MoveToScrollbackTop/MoveToScrollbackBottom、PageUp/PageDown/MoveByPage(f64)CtrlU/CtrlD即MoveByPage 0.5与-0.5行内定位MoveToStartOfLine、MoveToStartOfNextLine、MoveToStartOfLineContent跳过行首缩进对应^/AltM、MoveToEndOfLineContent对应$/End逐格移动MoveLeft/MoveRight/MoveUp/MoveDown单词移动MoveForwardWord、MoveBackwardWord、MoveForwardWordEnd选区控制SetSelectionMode(OptionSelectionMode)、ClearSelectionMode、MoveToSelectionOtherEnd对应o、MoveToSelectionOtherEndHoriz对应ShiftO字符跳跃类似 Vim f/F/t/TJumpForward { prev_char }、JumpBackward { prev_char }、JumpAgain、JumpReverse——默认键表中f/Fprev_charfalse跳到目标字符之前t/Tprev_chartrue跳到目标字符之后,与;用于反向/重复上次跳跃语义区域移动MoveBackwardSemanticZone/MoveForwardSemanticZone/MoveBackwardZoneOfType/MoveForwardZoneOfType按语义区域如命令、注释、空白等跳跃关闭Close。值得注意的是CopyModeAssignment同时服务于Copy Mode与Search ModePriorMatch/NextMatch/PriorMatchPage/NextMatchPage/CycleMatchType/ClearPattern/EditPattern/AcceptPattern等变体是搜索模式专用的匹配跳转操作但两者共享同一套键表/动作基础设施可在 docs/cli/show-keys.md 的输出示例中同时看到copy_mode与search_mode两个键表。自定义 Copy Mode 键分配自 20220624-141144-bd1b7c5d 版本起Copy Mode 的按键分配不再是写死的而是由名为copy_mode的 Key Table键表统一管理你可以通过配置提供自己的定义来覆盖它。Key Table 机制速览键表Key Table是 WezTerm 除默认keys之外的命名按键集合详见 Key Tables 文档用key_tables配置项定义命名键表配合ActivateKeyTable动作即可实现强大的键盘自定义如 leader 键前缀、模式化操作每个 GUI 窗口维护一个键表激活栈ActivateKeyTable压栈支持one_shot、timeout_milliseconds、replace_current等字段PopKeyTable显式弹栈ClearKeyTableStack清空整个栈配置重载时栈也会被清空可作为卡在奇怪模式里时的脱困手段自 20220624-141144-bd1b7c5d 起按键解析会从栈顶向下逐层查找匹配因此键表激活可以叠加在既有按键之上而不是只查栈顶一层。用 default_key_tables() 增量扩展copy_mode是一个内置键表你无需从零编写全部条目。wezterm.gui.default_key_tables()函数自 20221119-145034-49b9839f 起详见 default_key_tables 文档返回无配置文件时的默认键表集合可以拿到默认的copy_mode表再增量修改。例如为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 版本中只能整体替换整个键表、无法只覆盖其中一部分default_key_tables()的出现解决了这一痛点。注意wezterm.gui仅存在于 GUI 运行时因此代码中用if wezterm.gui then做了保护避免在非 GUI 上下文如wezterm cli或 mux server加载时报错。查看你当前版本的键表由于文档中的示例基于撰写时的版本、可能比你本机版本更新最权威的查看方式是直接运行 CLI 命令wezterm show-keys --lua --key-table copy_modewezterm show-keys自 20220624-141144-bd1b7c5d 起见 show-keys 命令文档会基于你的配置文件打印出完整按键分配包括默认键表、各命名键表如copy_mode、search_mode以及鼠标绑定加上--lua时以 Lua 表形式输出便于直接粘贴进配置。其普通输出大致形如Key Table: copy_mode -------------------- Tab - CopyMode(MoveForwardWord) SHIFT Tab - CopyMode(MoveBackwardWord) SHIFT $ - CopyMode(MoveToEndOfLineContent) ...完整默认 copy_mode 键表可直接复制使用下面是文档构建时 WezTerm 的完整默认copy_mode键表docs/examples/default-copy-mode-key-table.markdown。如果你想从默认值出发做整体改造把它作为起点并修改所需条目即可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、CtrlC、q、CtrlG等退出方式并非单纯Close而是act.Multiple组合——先ScrollToBottom再Close保证退出后视口回到最新内容符合直觉y的复制目标y执行的是CopyTo ClipboardAndPrimarySelection组合动作即同时写入系统剪贴板与主选择缓冲区Primary Selection然后回到滚动缓冲区底部并退出复制模式半屏翻页CtrlU/CtrlD通过MoveByPage 0.5 / -0.5实现而非独立的翻页动作字符跳跃f/F/t/T与,/;对应JumpForward/JumpBackward/JumpReverse/JumpAgain其中prev_char字段控制跳跃落点位于目标字符之前还是之后键盘大小写单字母键如G、H、L、M、O、T、V默认同时注册了NONE与SHIFT两种修饰组合确保大写锁定状态下的行为一致。复制到哪CopyTo 与剪贴板目标复制动作本身由CopyTo(destination)键分配完成详见 CopyTo 文档其目标参数有三种取值目标含义Clipboard复制到系统剪贴板各平台通用PrimarySelection复制到主选择缓冲区仅 X11 及部分 Wayland 系统ClipboardAndPrimarySelection同时写入剪贴板与主选择缓冲区在默认的copy_mode键表中y键绑定的正是CopyTo ClipboardAndPrimarySelection。主选择Primary Selection在 Wayland 上的支持取决于合成器是否实现了primary-selection-unstable-v1协议或旧的 Gtk 主选择协议。历史上曾有一个Copy动作但已在 20230320-124340-559cb7b0 版本中被移除现在应统一使用CopyTo。实用技巧小结快速选取长输出进入 Copy Mode 后先用g跳到滚动缓冲区顶部、ShiftG跳到底部配合CtrlU/CtrlD半屏滚动或CtrlB/CtrlF整屏翻页能很快定位到目标区域处理对齐的列数据CtrlV切换矩形选择配合ShiftO在矩形两端水平跳转可以干净地截取表格中的某一列复制行首无缩进文本^/AltMMoveToStartOfLineContent跳过的行首空白避免把缩进空格一并复制出去增量改键想加一个新键位如Backspace向左移动时优先用wezterm.gui.default_key_tables()取默认表再table.insert而不是手写整张键表排查当前按键任何时候想确认自己版本下某个键绑定了什么运行wezterm show-keys --lua --key-table copy_mode即可拿到权威结果。【免费下载链接】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),仅供参考