ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WezTerm 配置指南:SelectTextAtMouseCursor 鼠标选区动作详解

WezTerm 配置指南:SelectTextAtMouseCursor 鼠标选区动作详解 WezTerm 配置指南SelectTextAtMouseCursor 鼠标选区动作详解【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermSelectTextAtMouseCursor是 WezTerm 中负责在鼠标指针所在位置发起文本选区的核心动作通过Cell、Word、Line、SemanticZone与Block五种模式精确控制选区的粒度。本文将基于官方文档并结合仓库源码讲解该动作的完整语义、默认绑定、mouse_bindings配置方法以及各模式背后的实现原理帮助你按需定制点击、双击、三击乃至矩形块状选择的行为。一、动作语义从鼠标位置发起选区SelectTextAtMouseCursor会在当前鼠标光标所在的位置发起一次文本选择。它与配套动作ExtendSelectionToMouseCursor从鼠标位置扩展已有选区一起构成了 WezTerm 鼠标选区的完整动作族定义于 config/src/keyassignment.rsSelectTextAtMouseCursor(SelectionMode), ExtendSelectionToMouseCursor(SelectionMode), OpenLinkAtMouseCursor, ClearSelection, CompleteSelection(ClipboardCopyDestination), CompleteSelectionOrOpenLinkAtMouseCursor(ClipboardCopyDestination),从该枚举定义可以看出选区动作和打开超链接、完成选区复制到剪贴板等动作相邻它们通常配合在mouse_bindings中形成一个完整的按下-选择-复制流程。完整的动作注册与命令元数据名称、说明文字可在 wezterm-gui/src/commands.rs 中查看。二、五种选区模式SelectTextAtMouseCursor接受一个模式参数SelectionMode取值范围在 config/src/keyassignment.rs 中定义pub enum SelectionMode { Cell, // 单元格 Word, // 单词 Line, // 整行 SemanticZone, // 语义区域 Block, // 矩形块 }各模式含义如下模式选区范围版本说明Cell从鼠标所在单元格开始选择是最基础的字符级选区自动作引入即支持Word选中鼠标所在位置的整个单词自动作引入即支持Line选中鼠标所在位置的整行包含逻辑行换行自动作引入即支持SemanticZone选中鼠标所在位置周围的语义区域如整条命令输出20210203-095643-70a364eb版本起支持Block矩形块状选区20220624-141144-bd1b7c5d版本起支持其中SemanticZone与Block是文档中标注的两种扩展模式分别解决了按语义整块选取与矩形纵向选取两类需求。三、默认鼠标绑定三击选行、双击选词SelectTextAtMouseCursor并非需要手动配置才能使用——WezTerm 的默认鼠标映射就大量使用了该动作。在 wezterm-gui/src/inputmap.rs 中可以找到以下内置绑定// 三击左键选择整行 MouseEventTrigger::Down { streak: 3, button: MouseButton::Left } SelectTextAtMouseCursor(SelectionMode::Line), // 双击左键选择单词 MouseEventTrigger::Down { streak: 2, button: MouseButton::Left } SelectTextAtMouseCursor(SelectionMode::Word), // 单击左键以单元格发起选区 MouseEventTrigger::Down { streak: 1, button: MouseButton::Left } SelectTextAtMouseCursor(SelectionMode::Cell), // Alt 单击左键矩形块选择 MouseEventTrigger::Down { streak: 1, button: MouseButton::Left } (mods: ALT) SelectTextAtMouseCursor(SelectionMode::Block),从默认绑定可见 WezTerm 对选中粒度的完整覆盖单击左键单元格级选区起点通常配合拖拽扩展双击左键按selection_word_boundary规则选中整个单词三击左键选中整行注意是逻辑行见下文实现原理Alt 单击矩形块选择块内纵向列选常用于对齐文本的批量复制。这些默认绑定同样会呈现在wezterm show-keys的输出中详见 docs/cli/show-keys.md。若你希望完全接管鼠标行为可参考 disable_default_mouse_bindings 关闭默认绑定后自定义。四、自定义配置示例4.1 配置入口mouse_bindingsSelectTextAtMouseCursor通常在mouse_bindings中作为动作使用配置键包括事件event、动作action与修饰键mods。完整的事件定义如Down/Drag及其streak连击次数、button按钮可在 config/src/keyassignment.rs 的MouseEventTrigger枚举中找到。4.2 文档示例三击选中整段命令输出官方文档给出的经典用例是将三击左键绑定为SemanticZone模式这样点击命令输出区域中的任意字符即可自动选中整条命令输出前提是 shell 已配置语义区域config.mouse_bindings { { event { Down { streak 3, button Left } }, action wezterm.action.SelectTextAtMouseCursor SemanticZone, mods NONE, }, }配置要点event中的streak 3表示连续点击第 3 次触发action使用wezterm.action.SelectTextAtMouseCursor SemanticZone模式参数以字符串形式传入mods NONE表示不需要任何修饰键直接三击触发。注意三击在默认绑定中对应Line模式上面的示例会用SemanticZone覆盖默认行为。实际使用中应确认是否与你的需求一致。4.3 结合复制动作的完整流程SelectTextAtMouseCursor只负责发起选择将选区写入剪贴板还需要CompleteSelection或CompleteSelectionOrOpenLinkAtMouseCursor配合。例如三击选中语义区域后立即复制config.mouse_bindings { { event { Down { streak 3, button Left } }, action wezterm.action.SelectTextAtMouseCursor SemanticZone, mods NONE, }, { event { Up { streak 3, button Left } }, action wezterm.action.CompleteSelection ClipboardAndPrimarySelection, mods NONE, }, }关于复制目标剪贴板 / 主选择区的完整参数见 CompleteSelection。五、源码实现五种模式各做了什么在 wezterm-gui/src/termwindow/selection.rs 中select_text_at_mouse_cursor首先读取该 pane 内记录的鼠标终端坐标mouse_terminal_coords若坐标不存在则直接返回随后按模式分别处理match mode { SelectionMode::Line { let selection_range SelectionRange::line_around(SelectionCoordinate::x_y(x, y), **pane); // 记录选区 origin / rangerectangular false } SelectionMode::Word { let selection_range SelectionRange::word_around(SelectionCoordinate::x_y(x, y), **pane); // 同上 } SelectionMode::SemanticZone { let selection_range SelectionRange::zone_around(SelectionCoordinate::x_y(x, y), **pane); // 同上 } SelectionMode::Cell | SelectionMode::Block { // begin() 发起选区Block 模式设置 rectangular true } } self.selection(pane.pane_id()).seqno pane.get_current_seqno();关键点Cell / Block调用selection.begin()以鼠标坐标作为选区起点后续拖拽由ExtendSelectionToMouseCursor或拖动逻辑接管只有Block会将rectangular置为true启用矩形选区Line / Word / SemanticZone直接计算出一个完整选区范围写入selection因此触发时不需要拖拽即可看到完整选中效果。5.1Line模式基于逻辑行line_around的实现位于 wezterm-gui/src/selection.rs。它通过pane.get_logical_lines(start.y..start.y 1)获取鼠标所在行的逻辑行选区从逻辑行首行第 0 列延伸到最后一行的usize::max_value()列pub fn line_around(start: SelectionCoordinate, pane: dyn Pane) - Self { for logical in pane.get_logical_lines(start.y..start.y 1) { if logical.contains_y(start.y) { return Self { start: SelectionCoordinate::x_y(0, logical.first_row), end: SelectionCoordinate::x_y(usize::max_value(), logical.first_row (logical.physical_lines.len() - 1) as StableRowIndex), }; } } ... }这意味着当一行文本因窗口宽度发生**自动折行wrap**时三击选中的是整个逻辑行跨越多条物理屏幕行而不是单条显示行。这与终端语义中对一行的定义一致。5.2Word模式受selection_word_boundary控制word_aroundwezterm-gui/src/selection.rs先将物理坐标转换为逻辑行内的逻辑坐标再调用compute_double_click_range(start_idx, is_double_click_word)计算双击单词的范围最后把逻辑区间映射回物理坐标。其中is_double_click_word的判定规则与配置项 selection_word_boundary 相关——该配置定义了哪些字符被认为是单词边界直接决定双击选词时单词的边界落在哪里。5.3SemanticZone模式依赖 shell 集成zone_aroundwezterm-gui/src/selection.rs调用pane.get_semantic_zones()获取当前 pane 的语义区域列表然后以鼠标坐标在列表中做二分查找命中后返回该区域的完整范围let zones match pane.get_semantic_zones() { ... }; if let Ok(idx) zones.binary_search_by(|zone| find_zone(start, zone)) { let zone zones[idx]; Self { start: SelectionCoordinate::x_y(zone.start_x, zone.start_y), end: SelectionCoordinate::x_y(zone.end_x, zone.end_y), } }SemanticZone模式只有在该 pane 提供语义区域数据时才有意义。语义区域由Shell Integrationshell 集成注入的 OSC 转义序列定义——例如 zsh/bash/fish 的集成脚本会在命令提示符与命令输出之间标记边界。因此想让三击选中整条命令输出生效前提是 shell 已按 Shell Integration 文档配置好集成脚本。若get_semantic_zones()返回错误或未命中任何区域zone_around会退化为基础坐标的单点选区见源码中的 fallback 分支。六、版本演进从 changelog 中可以还原该动作的演进脉络SemanticZone模式加入SelectTextAtMouseCursor开始支持语义区域使一键选取完整输入/输出区域成为可能见 docs/changelog.mdBlock模式加入同时ExtendSelectionToMouseCursor也接受Block模式并新增按住ALT拖拽左键进行矩形块选择的默认行为见 docs/changelog.md。七、总结SelectTextAtMouseCursor是理解 WezTerm 鼠标选区体系的关键入口五种模式Cell/Word/Line/SemanticZone/Block覆盖了从字符、单词、整行到语义块、矩形块的完整粒度需求默认绑定已内置单击/双击/三击与Alt单击的常用行为且streak机制让多击事件可被精细定制SemanticZone模式依赖 Shell Integration 提供语义区域数据配置前需先完成 shell 集成与 ExtendSelectionToMouseCursor、CompleteSelection 等动作组合即可构建从按下、扩展到复制的完整鼠标交互流程。结合 mouse_bindings 配置页与上述源码分析你可以在wezterm.lua中按需覆写或新增绑定让选择、复制流程完全贴合自己的操作习惯。【免费下载链接】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),仅供参考
返回列表