ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

WezTerm Copy Mode 键位表深度解析:从默认键表到完全自定义的纯键盘选择方案

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中定位光标、以单元格/行/矩形方式框选文本并复制。本文以仓库中 docs/examples/default-copy-mode-key-table.markdown 提供的默认copy_mode键表为骨架逐键位拆解其动作语义并借助源码中的CopyModeAssignment枚举与键表加载机制说明如何通过key_tables.copy_mode深度定制这套 Vim 风格的按键体系。读完本文你将掌握 Copy Mode 的完整默认按键、每种动作的精确行为以及用 Lua 配置自定义/扩展现有键表的方法。Copy Mode 是什么Copy Mode 允许你仅使用键盘完成区域选择与复制其定位与 WezTerm 的 Quick Select 模式不同Quick Select 面向“快速匹配常见模式”而 Copy Mode 面向“基于键盘控制描述任意选择区域”。被高亮/选中文本的颜色可通过 外观配置中的自定义颜色 调整。通过ActivateCopyMode键分配进入 Copy Mode默认绑定为CTRL-SHIFT-X参见 config/src/keyassignment.rs 中ActivateCopyMode枚举项。进入后标签页标题会添加Copy Mode前缀标签行为改变键盘输入改为控制光标并在需要时滚动视口风格接近 Vim 编辑器。将光标移动到选择区域起点按v进入选择模式默认关闭再移动到终点按CTRL-SHIFT-CCopy即可复制到剪贴板。完整默认 copy_mode 键表逐键解读下述 Lua 代码即仓库中 docs/examples/default-copy-mode-key-table.markdown 的完整内容它定义了key_tables.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 }, }, }, }上述配置可直接放入~/.wezterm.lua或WEZTERM_CONFIG_FILE指向的配置作为return表返回。需要注意一旦你定义了copy_mode键表它将整体替换默认键表详见下文“自定义方式”所以完整复制并在此基础上修改是最稳妥的做法。CopyMode 动作全集每个动作的真实语义上面键表中出现的每个动作字符串/表都对应 config/src/keyassignment.rs 中CopyModeAssignment枚举的一个变体。该枚举即 Copy Mode 支持的全部动作集合可归纳为以下几类光标移动类动作行为默认键位MoveLeft/MoveRight/MoveUp/MoveDown向对应方向移动一个单元格/一行h/l/k/j方向键MoveForwardWord向前移动一个单词w、Tab、Alt-f、Alt-RightArrowMoveBackwardWord向后移动一个单词b、Shift-Tab、Alt-b、Alt-LeftArrowMoveForwardWordEnd移动到下一个单词的末尾eMoveToStartOfLine移动到本行行首第 0 列0、HomeMoveToStartOfLineContent移动到本行首个非空白字符处^、Alt-mMoveToEndOfLineContent移动到本行内容末尾$、EndMoveToStartOfNextLine移动到下一行行首EnterMoveByPage(f)按比例滚动正数向下、负数向上Ctrl-d(0.5)、Ctrl-u(-0.5)PageUp/PageDown上/下翻一整屏PageUp/PageDown、Ctrl-b/Ctrl-f视口与滚动缓冲区定位类动作行为默认键位MoveToScrollbackTop跳到滚动缓冲区顶部gMoveToScrollbackBottom跳到滚动缓冲区底部Shift-GMoveToViewportTop跳到视口顶部行Shift-HMoveToViewportMiddle跳到视口中间行Shift-MMoveToViewportBottom跳到视口底部行Shift-L选择模式类动作行为默认键位SetSelectionMode(Cell)开启单元格字符级选择模式v、SpaceSetSelectionMode(Line)开启整行选择模式Shift-VSetSelectionMode(Block)开启矩形块选择模式Ctrl-vSetSelectionMode(None)关闭选择模式取消框选—ClearSelectionMode清除选择模式状态—三种选择模式对应 config/src/keyassignment.rs 中的SelectionMode语义Cell适合复制任意连续片段Line适合整行提取Block矩形选择适合对齐的表格/日志列数据其中矩形选择自20220624-141144-bd1b7c5d版本起提供。选择端点跳转类动作行为默认键位MoveToSelectionOtherEnd将光标移动到选择的另一端锚点oMoveToSelectionOtherEndHoriz仅在水平方向移动选择另一端矩形选择时尤为有用Shift-OJumpForward{prev_char}向前跳转到指定字符类似 Vimf/tprev_chartrue表示落在字符前f/tJumpBackward{prev_char}向后跳转到指定字符类似 VimF/TF/TJumpAgain重复上一次字符跳转;JumpReverse反方向重复上一次字符跳转,收尾与组合动作动作行为默认键位CopyMode:Close退出 Copy Mode—CopyMode:ScrollToBottom先滚回滚动缓冲区底部作为退出时的“复位”步骤CopyTo(ClipboardAndPrimarySelection)将当前选择同时复制到剪贴板与主选择区y值得注意的是默认键表中大量使用了act.Multiple { ... }组合例如y被定义为先CopyTo再ScrollToBottomClose即“复制并退出且滚回底部”Escape、Ctrl-c、Ctrl-g、q也都通过Multiple完成“复位视口 退出”。这与 docs/copymode.md 中“y复制并退出、Esc/Ctrl-c/Ctrl-g/q退出”的说明完全对应。Copy Mode 键位速查表综合 docs/copymode.md 的按键分配表与默认键表常用操作速查如下操作键位进入 Copy ModeCtrl-Shift-X复制并退出 Copy Modey退出 Copy ModeEsc、Ctrl-c、Ctrl-g、q单元格选择v再按一次取消行选择Shift-V矩形块选择Ctrl-V移动光标方向键或h/j/k/l向前/后一个单词Alt-右方向/Alt-左方向、Alt-f/Alt-b、Tab/Shift-Tab、w/b移动到单词末尾e行首 / 行首内容 / 行尾内容0(Home) /^(Alt-m) /$(End)下一行行首Enter滚动缓冲区顶部 / 底部g/Shift-G视口顶部 / 中间 / 底部Shift-H/Shift-M/Shift-L上/下半屏Ctrl-u/Ctrl-d上/下整屏PageUp(Ctrl-b) /PageDown(Ctrl-f)跳转选择另一端点o水平方向Shift-O字符跳转 f/t 与 F/Tf/t向前、F/T向后;重复、,反向复制到剪贴板退出 Copy Mode 后Ctrl-Shift-C如何自定义 copy_mode 键表两种自定义方式自20220624-141144-bd1b7c5d版本起Copy Mode 的键位由copy_mode这个 Key Table 指定你可以通过两种方式自定义整体替换在~/.wezterm.lua中提供自己的copy_mode键表定义即上文完整配置。注意这种方式会整体替换默认表因此需要把想保留的键位一并写入。基于默认表扩展先通过wezterm.gui.default_key_tables()参见 docs/config/lua/wezterm.gui/default_key_tables.md取得当前版本的默认键表再增删条目。这在较新版本中尤其有用因为早期版本只能整体替换无法局部覆盖。查看你本机版本的默认键表文档中给出的默认键表可能比你安装的版本更新请用以下命令查看本机实际默认值wezterm show-keys --lua --key-table copy_mode键表与输入解析的底层机制从源码角度自定义之所以生效是因为键表解析发生在 GUI 层在 wezterm-gui/src/inputmap.rs 中配置加载完成后如果keys.by_name里没有copy_mode/search_mode条目会自动用overlay::copy::copy_key_table()与search_key_table()注入默认表一旦你的配置提供了同名键表注入就会被跳过你的定义成为唯一解析来源。此外Key Table 机制本身由key_tables配置项承载配合ActivateKeyTable含one_shot、timeout_milliseconds、replace_current等字段见 config/src/keyassignment.rs可构建复杂的键表激活栈Copy Mode 的进入正是ActivateCopyMode动作触发对应键表的结果。自定义实例在默认键表上添加自定义动作下面演示如何基于默认键表做局部修改——例如在保持全部默认键位不变的前提下给Ctrl-n增加“向后滚动半屏”的绑定并给Space追加CopyTo行为注意这会改变Space的原语义仅为演示Multiple的组合能力local wezterm require wezterm local act wezterm.action local config {} local copy_mode wezterm.gui.default_key_tables().copy_mode table.insert(copy_mode, { key n, mods CTRL, action act.CopyMode { MoveByPage 0.5 } }) -- 演示让 Space 先开启单元格选择再追加复制行为会覆盖默认 Space 语义 for i, entry in ipairs(copy_mode) do if entry.key Space then entry.action act.Multiple { { CopyMode { SetSelectionMode Cell } }, { CopyTo ClipboardAndPrimarySelection }, } end end config.keys { { key X, mods CTRL|SHIFT, action act.ActivateCopyMode }, } config.key_tables { copy_mode copy_mode } return config要点提示先执行table.insert前可先print(wezterm.version)确认版本支持default_key_tables()修改后的键表同样遵循键表解析规则栈顶优先匹配未命中继续向下查找见 docs/config/key-tables.md 中关于激活栈的说明若在复杂键表中被卡住可重新保存~/.wezterm.lua触发配置重载键表栈会自动清空从而恢复默认状态。常见问题与排查为什么修改了 copy_mode 后部分按键失效因为你整体替换了默认键表遗漏的键位不再生效。请基于wezterm.gui.default_key_tables().copy_mode修改或对照本文完整默认键表逐条补齐。如何确认当前键表内容运行wezterm show-keys --lua --key-table copy_mode即可输出本机生效的键表定义。进入 Copy Mode 后标题没变化Copy Mode 激活时标签标题应带Copy Mode前缀若未出现确认ActivateCopyMode绑定未被其他键分配覆盖。矩形选择不可用SetSelectionMode Block需要20220624-141144-bd1b7c5d及之后的版本旧版本请升级。参考路径默认键表示例docs/examples/default-copy-mode-key-table.markdownCopy Mode 使用文档docs/copymode.mdKey Table 机制说明docs/config/key-tables.md动作枚举源码config/src/keyassignment.rs键表默认注入逻辑wezterm-gui/src/inputmap.rs默认键表 API 文档docs/config/lua/wezterm.gui/default_key_tables.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),仅供参考
返回列表