WezTerm Quick Select 快速选择模式完全指南:正则匹配、前缀复制与源码级原理
【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm
Quick Select(快速选择)是 WezTerm 内置的一种高效文本选择模式:它会对终端当前屏幕及周边区域进行正则扫描,自动识别 URL、路径、Git 哈希、IP 地址、数字等常见模式并高亮显示,同时为每个匹配项标注一个一或两个字符的前缀标签。你只需键入该前缀即可把对应文本复制到剪贴板,键入大写形式则直接复制并粘贴。本文围绕 docs/quickselect.md 展开,结合 config/src 与 wezterm-gui/src/overlay/quickselect.rs 的源码实现,完整讲解 Quick Select 的默认行为、全部配置项、快捷键与高级用法,让你在完成本指南后能够按自己的习惯定制匹配规则、标签字母表与高亮配色。
Quick Select 是什么:一次按键完成"扫描—标注—复制"
Quick Select 模式解决的是终端里的一个高频痛点:日志、Git 输出、错误堆栈中夹杂着大量 URL、commit hash、IP 地址等"一眼就能认出、却很难用鼠标精确选中"的片段。在 WezTerm 中,你按下CTRL-SHIFT-SPACE(默认绑定)即可进入该模式:
- 终端内容会被立即扫描,与内置的默认正则集合(外加你在配置中补充的规则)进行匹配;
- 所有匹配到的文本被高亮,并从下往上依次标注上一或两个字符的标签(如
a、s、d,第一个匹配项从字母表开头取标签); - 屏幕底部出现输入提示条,显示你当前键入的内容与操作提示;
- 键入某个高亮项的前缀,该文本即被选中并复制到剪贴板,模式自动退出;
- 键入前缀的大写形式,则复制并同时粘贴(相当于"复制即用");
- 按下
ESCAPE随时取消模式。
从源码结构看,Quick Select 是通过QuickSelectOverlay(见 wezterm-gui/src/overlay/quickselect.rs)实现的:它是一个包裹在原有 pane 之上的覆盖层(overlay pane),复用 mux 层的pane.search()完成正则搜索,再把匹配结果渲染成高亮行与底部的搜索 UI。这意味着无论当前终端是本地 shell、SSH 会话还是 multiplexer 远程 pane,Quick Select 都工作在统一的 pane 抽象之上。
该功能自20210502-154244-3f7122cb版本起可用。
进入与退出:快捷键与交互一览
| 操作 | 按键 | 行为 |
|---|---|---|
| 进入 Quick Select | CTRL-SHIFT-SPACE | 扫描并高亮匹配项,显示前缀标签 |
| 复制匹配项 | 键入对应前缀(小写) | 选中并复制到剪贴板,退出模式 |
| 复制并粘贴匹配项 | 键入前缀的大写形式 | 复制并粘贴,退出模式 |
| 取消 | ESCAPE | 直接退出模式 |
QuickSelect键位分配(Key Assignment)定义在 config/src/keyassignment.rs 中,默认绑定在 docs/config/default-keys.md 所描述的默认按键表里。如果需要换一个触发键,可在keys配置中用{ key = ' ', mods = 'CTRL|SHIFT', action = wezterm.action.QuickSelect }之类的写法覆盖。
匹配规则:内置默认模式与quick_select_patterns
开箱即用的 14 种默认模式
Quick Select 自带一组内置正则,源码中硬编码在 wezterm-gui/src/overlay/quickselect.rs 的PATTERNS常量里,覆盖以下类型:
| 类别 | 正则模式(源码原文) | 匹配示例 |
|---|---|---|
| Markdown 链接 | \[[^]]*\]\(([^)]+)\) | [text](https://...) |
| URL 与远程地址 | (?:https?://\|git@\|git://\|ssh://\|ftp://\|file://)\S+ | https://example.com/x、git@github.com:... |
| diff 目标文件 | --- a/(\S+)、\+\+\+ b/(\S+) | --- a/src/main.rs |
| Docker 镜像摘要 | sha256:([0-9a-f]{64}) | sha256:9f4b4f... |
| 文件路径 | (?:[.\w\-@~]+)?(?:/+[.\w\-@]+)+ | /usr/local/bin、./src/lib.rs |
| 十六进制颜色 | #[0-9a-fA-F]{6} | #ff6b81 |
| UUID | [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} | 3f2c1b0a-... |
| IPFS CID(旧格式) | Qm[0-9a-zA-Z]{44} | QmTkV7X... |
| Git/ SHA 哈希 | [0-9a-f]{7,40} | 9f4b4f2(7~40 位) |
| IPv4 地址 | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} | 192.168.1.1 |
| IPv6 地址 | [A-f0-9:]+:+[A-f0-9:]+[%\w\d]+ | fe80::1%eth0 |
| 内存/指针地址 | 0x[0-9a-fA-F]+ | 0x7ffc2a |
| 数字 | [0-9]{4,} | 20250912(4 位及以上) |
追加自定义模式:quick_select_patterns
如果你要匹配更多类型(例如订单号、特定日志格式),可在配置中通过quick_select_patterns追加正则(见 docs/config/lua/config/quick_select_patterns.md)。该配置项自20210502-130208-bff6815d起可用,是一个正则字符串数组:
config.quick_select_patterns = { -- 匹配形如 sha1 的哈希 -- (其实这也是内置默认模式之一,这里仅作示例) '[0-9a-f]{7,40}', -- 匹配形如 PR-123 的编号 'PR%-%d+', }从 wezterm-gui/src/overlay/quickselect.rs 的构建逻辑可以看到,所有模式(用户自定义 + 内置默认)最终会被编译进同一个形如(?m)(pat1|pat2|...)的大 alternation 正则,再交由 mux 的 pane 搜索接口执行。因此:
- 若想使用捕获组,必须写成非捕获组
(?:)。因为整体正则本身会使用捕获组做分组,直接写()会让你的捕获组语义被外层结构打乱,导致匹配行为不符合预期。例如内置 Markdown URL 模式\[[^]]*\]\(([^)]+)\)之所以能"只选中 URL 部分",正是依赖这个捕获组配合外层结构的取用逻辑。 - 正则语法能力分版本:自
20230408-112425-69ae8472起,quick_select_patterns支持后向引用(backreferences)与环视断言(look around assertions,如(?<!foo:)bar);更早的版本只支持基础的 regex 语法。下面这个例子匹配字符串"bar",但当它属于"foo:bar"的一部分时除外:
config.quick_select_patterns = { "(?<!foo:)bar", }- 默认模式同样会被纳入这个大正则,但源码中
PATTERNS里的模式普遍只包含捕获组()而非常规写法,这进一步印证了"自定义模式必须用非捕获组"这一约束。
关闭内置默认模式
如果你觉得内置的 14 种模式过于嘈杂,只想保留自己定义的规则,可以关闭默认模式。对应的配置项是disable_default_quick_select_patterns(定义于 config/src/config.rs),其作用在 wezterm-gui/src/overlay/quickselect.rs 中实现:当它为true时,PATTERNS内置集合不会参与拼接:
config.disable_default_quick_select_patterns = true config.quick_select_patterns = { 'my-special-pattern-\\d+', }标签字母表:quick_select_alphabet与多字符标签生成
每个匹配项的标签由quick_select_alphabet决定(见 docs/config/lua/config/quick_select_alphabet.md)。该配置自20210502-130208-bff6815d起可用,默认值为"asdfqwerzxcvjklmiuopghtybn"。标签的分配规则是:从屏幕下方开始,第一个匹配项标注字母表第一个字符,第二个标注第二个字符,依此类推——这些字符位于 QWERTY 键盘左手与右手最容易触及的区域,方便盲打。
针对不同键盘布局的建议字母表
| 键盘布局 | 建议字母表 |
|---|---|
qwerty | "asdfqwerzxcvjklmiuopghtybn"(默认值) |
qwertz | "asdfqweryxcvjkluiopmghtzbn" |
azerty | "qsdfazerwxcvjklmuiopghtybn" |
dvorak | "aoeuqjkxpyhtnsgcrlmwvzfidb" |
colemak | "arstqwfpzxcvneioluymdhgjbk" |
上表建议字母表的设计思路是:先取左手指在 home row、top row、bottom row 上的按键,再取右手指对应位置的按键,最后才是键盘中间较难触及的字符。
多字符标签的生成算法
当匹配项数量超过字母表字符数时,系统会自动生成两字符标签。生成算法compute_labels_for_alphabet位于 wezterm-gui/src/overlay/quickselect.rs:它会从字母表末尾"借用"一个字符作为前缀,与字母表其余字符两两组合,从而把可表达数量从字母表长度(默认 26)扩展到其平方量级。配套单元测试(见同一文件的alphabet_test模块)验证了以下边界行为:
compute_labels_for_alphabet("abcd", 6)返回["a", "b", "c", "da", "db", "dc"]——先用完单字符,再启用两字符;- 默认字母表(26 字符)在匹配项多达 792 个时,标签长度依然只有 2(最多 676 个标签);
- 当字母表太短(如只有
"ab")而匹配项很多时,标签数量会被限制在可表达上限内。
因为标签是有序且前缀唯一的,所以即便屏幕上同时存在d、da、db等多个标签,你也只需键入"前缀足够区分"的那一两个字符即可命中目标——这就是文档所说"one-or-two character prefix"的由来。
高亮配色:quick_select_match_*与quick_select_label_*
Quick Select 的高亮颜色完全可以在colors配置中自定义(见 docs/config/appearance.md 的 "Colors for copy_mode and quick_select" 小节)。相关配色项定义于 config/src/color.rs,共四个:
quick_select_match_bg:匹配文本的背景色;quick_select_match_fg:匹配文本的前景色;quick_select_label_bg:前缀标签的背景色;quick_select_label_fg:前缀标签的前景色。
配置示例(取自 docs/config/appearance.md):
config.colors = { quick_select_label_bg = { Color = 'peru' }, quick_select_label_fg = { Color = '#ffffff' }, quick_select_match_bg = { AnsiColor = 'Navy' }, quick_select_match_fg = { Color = '#ffffff' }, }颜色值支持Color(十六进制或颜色名)、AnsiColor(ANSI 调色板索引 0-15,可用的名字为 Black、Maroon、Green、Olive、Navy、Purple、Teal、Silver、Grey、Red、Lime、Yellow、Blue、Fuchsia、Aqua、White)等写法。这些配置项自20220807-113146-c2fee766起可用于copy_mode与quick_select两套高亮。
源码中渲染时对这些颜色的使用与回退逻辑一致:匹配文本默认背景为黑、前景为绿;标签默认背景为黑、前景为橄榄色(Olive),并统一加粗、关闭反显(见 wezterm-gui/src/overlay/quickselect.rs)。也就是说,即使你不配置颜色,Quick Select 也有合理的默认配色。
移除原有样式:quick_select_remove_styling
自nightly版本起新增了配置项quick_select_remove_styling(见 docs/config/lua/config/quick_select_remove_styling.md,定义于 config/src/config.rs):
config.quick_select_remove_styling = true当设为true时,进入 Quick Select 前会清除 pane 内所有颜色与样式,再进行匹配与高亮。这对于输出内容本身已有大量配色(例如带语法高亮的日志、ls --color结果)的终端非常有用:它让画面先"归零"为纯文本,随后只保留 Quick Select 自己的高亮,视觉焦点更集中。默认值为false,即默认保留原有样式。
从实现看,该选项生效于渲染前对每一行执行的属性清理:line.cells_mut_for_attr_changes_only()...attrs_mut().clear()会把每个 cell 的样式属性清空(见 wezterm-gui/src/overlay/quickselect.rs),之后再叠加匹配高亮与标签。
高级用法:带参数的自定义QuickSelect绑定
QuickSelect键位分配支持参数(QuickSelectArguments,定义于 config/src/keyassignment.rs),这意味着你可以在不同按键上绑定不同行为的 Quick Select:
| 参数 | 类型 | 说明 |
|---|---|---|
alphabet | String | 覆盖全局quick_select_alphabet,为该绑定单独指定字母表 |
patterns | Vec<String> | 覆盖全局quick_select_patterns(提供时不再并入内置默认模式),为该绑定单独指定匹配规则 |
action | KeyAssignment | 选中匹配项后执行的附加动作,而非默认的复制行为 |
skip_action_on_paste | bool | 当使用大写前缀触发"复制并粘贴"时,是否跳过action的执行 |
label | String | 当设置了action时,底部提示条中用于替代 "copy" 字样的提示文字 |
scope_lines | number | 搜索范围:视口前后各扩展多少行(默认 1000 行,且不小于视口高度) |
例如,绑定一个"快速选中 URL 并交给外部程序"的按键:
config.keys = { { key = 'Q', mods = 'CTRL|SHIFT', action = wezterm.action.QuickSelectArgs { patterns = { '(?:https?://|git@|git://|ssh://|ftp://|file://)\\S+', }, label = 'open url', action = wezterm.action_callback(function(window, pane) -- 自定义处理选中的 URL local sel = window:get_selection_text_for_pane(pane) wezterm.log_info('selected: ' .. sel) end), }, }, }几点值得注意的实现细节(均可从 wezterm-gui/src/overlay/quickselect.rs 的源码得到印证):
- 搜索范围可控:
scope_lines控制pane.search()的搜索区间——从视口顶行向上、视口底行向下各延伸scope_lines行(默认 1000 行,且至少覆盖整个视口),因此 Quick Select 不仅能匹配当前屏幕,还能匹配滚动缓冲区中的文本。 - 标签按"从下往上"分配:
recompute_results对匹配结果逆序遍历,把字母表第一个字符分配给屏幕右下角附近的匹配项,与文档描述一致。 - 大小写即粘贴:底层
key_down处理中,输入字符若与当前选择串的大小写不同(即用户按下了 Shift 键入大写),paste标志位即被置位,随后走"复制并粘贴"分支(见 wezterm-gui/src/overlay/quickselect.rs)。 - 前缀过滤与回退:键入不完整前缀时,
label_matches_selection会对标签做前缀过滤,只高亮剩余候选;Backspace删除末字符、CTRL-U清空已输入前缀(见同一文件 wezterm-gui/src/overlay/quickselect.rs)。 - 方向键导航:
UpArrow/Ctrl-P与DownArrow/Ctrl-N可以在匹配项之间移动,PageUp/PageDown可以整页跳转并自动滚动视口(见 wezterm-gui/src/overlay/quickselect.rs),对于长输出中的匹配项定位非常实用。
官方运行效果
下图展示了进入 Quick Select 后的实际界面:匹配到的文本片段被高亮,每个匹配项上方有前缀标签,底部为输入提示条(截图来源 docs/screenshots/wezterm-quick-select.png)。
小结与速查
Quick Select 把"肉眼识别 → 鼠标拖选 → 右键复制"三步操作压缩成"看一眼标签 → 按一个键"。本文覆盖了它的全部配置面,汇总如下:
- 默认按键:
CTRL-SHIFT-SPACE进入;小写前缀复制、大写前缀复制并粘贴、ESCAPE取消。 - 匹配规则:内置 14 种默认正则(URL、路径、哈希、IP、UUID、数字等),用
quick_select_patterns追加、用disable_default_quick_select_patterns关闭默认;自定义正则务必使用非捕获组(?:)。 - 标签:
quick_select_alphabet调整字母表(按键盘布局选择建议值);匹配项多于字母表字符时自动生成两字符标签。 - 配色:
quick_select_match_bg/fg、quick_select_label_bg/fg四个颜色项。 - 去样式:
quick_select_remove_styling = true让高亮聚焦于匹配本身。 - 进阶:通过
QuickSelectArgs为不同按键绑定独立字母表、独立模式集合与自定义动作,并用scope_lines控制搜索深度。
这些配置与行为均可通过 docs/quickselect.md、docs/config/lua/config/quick_select_patterns.md、docs/config/lua/config/quick_select_alphabet.md、docs/config/lua/config/quick_select_remove_styling.md 以及核心实现 wezterm-gui/src/overlay/quickselect.rs 继续深入查阅。
【免费下载链接】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),仅供参考