ARTICLE DETAIL

资讯详情

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

WezTerm 鼠标选择复制指南:掌握 CompleteSelection 动作与剪贴板目标配置

WezTerm 鼠标选择复制指南:掌握 CompleteSelection 动作与剪贴板目标配置 WezTerm 鼠标选择复制指南掌握 CompleteSelection 动作与剪贴板目标配置【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm完成一次鼠标拖拽选择后WezTerm 需要显式执行“提交选择并复制”的动作这个动作就是CompleteSelection。它负责把当前激活中的选择区域标记为关闭并把选区文本复制到指定的剪贴板缓冲区行为与直接执行Copy动作完全一致。阅读本文后你将掌握CompleteSelection的参数语义、三种剪贴板目标的区别以及如何通过mouse_bindings或keys把它绑定到自己的操作习惯上并了解其在源码中的完整实现链路。CompleteSelection是什么CompleteSelection是 WezTerm 中的一个键位动作KeyAssignment用于完成一次正处于进行中的文本选择过程。其核心语义为将选择范围标记为关闭the selection range is marked closed将选中的文本复制出去行为等同于执行Copy动作。自版本20210203-095643-70a364eb起CompleteSelection必须携带一个目标参数用于指明选区文本将被写入哪个剪贴板缓冲区。从该版本开始它的行为与 CopyTo 等价——即不再存在独立的“默认复制到任意缓冲区”行为复制去向完全由调用者决定。从源码定义可以看到CompleteSelection与CompleteSelectionOrOpenLinkAtMouseCursor在动作枚举中都被声明为携带ClipboardCopyDestination参数见 config/src/keyassignment.rs#L594-L595CompleteSelection(ClipboardCopyDestination), CompleteSelectionOrOpenLinkAtMouseCursor(ClipboardCopyDestination),与CompleteSelectionOrOpenLinkAtMouseCursor的区别WezTerm 还有一个关系密切的孪生动作CompleteSelectionOrOpenLinkAtMouseCursor对应文档 CompleteSelectionOrOpenLinkAtMouseCursor.md。两者在鼠标场景下行为互补CompleteSelection无条件完成选择并复制即使鼠标没有停留在选区上CompleteSelectionOrOpenLinkAtMouseCursor如果鼠标悬停在某个超链接上则优先打开链接否则才执行“完成选择并复制”的逻辑。二者在实现上共享同一套选择文本提取与剪贴板写入路径详见下文“底层实现”一节。剪贴板目标参数destination详解CompleteSelection的目标参数取值与CopyTo完全一致对应源码中 config/src/keyassignment.rs#L312-L324 的ClipboardCopyDestination枚举取值含义Clipboard复制到系统剪贴板Clipboard常规的CtrlC粘贴目标PrimarySelection复制到主选择缓冲区Primary Selection仅适用于 X11 以及部分支持该协议的 Wayland 系统ClipboardAndPrimarySelection同时复制到系统剪贴板与主选择缓冲区两点补充说明枚举的Default实现是ClipboardAndPrimarySelection即默认绑定中复制动作会同时写入两个缓冲区自版本20220319-142410-0fcdea07起PrimarySelection在 Wayland 上也得到支持前提是系统实现了 primary-selection-unstable-v1 或更老的 Gtk primary selection 协议详见 CopyTo.md。关于已弃用的Copy动作在更早的版本中WezTerm 提供独立的Copy动作。如今 Copy.md 已明确指出Copy动作已被移除请改用CopyTo。因此在新配置中应当统一使用带目的地参数的CompleteSelection/CopyTo/CompleteSelectionOrOpenLinkAtMouseCursor。配置示例把左键单击改为“只选择、不打开链接”原文档给出的典型场景是默认的左键单击Up事件、streak 1、button Left既会完成选择也会在悬停于超链接上时打开链接并且默认写入PrimarySelection以及 Clipboard。如果你希望改变这一默认行为——左键释放时只提交选择绝不打开链接同时把文本写入系统剪贴板而不是主选择缓冲区可以这样覆盖mouse_bindingsconfig.mouse_bindings { -- 修改默认的左键单击行为 -- 只提交文本选择不打开超链接 -- 并把选区写入 Clipboard而不是默认绑定中的 PrimarySelection { event { Up { streak 1, button Left } }, mods NONE, action wezterm.action.CompleteSelection Clipboard, }, }这段配置的要点event使用Up { streak 1, button Left }精确匹配“单击左键并释放”这一事件mods NONE表示不带任何修饰键Shift、Ctrl、Alt 等action直接使用wezterm.action.CompleteSelection Clipboard把目的地指定为系统剪贴板。默认绑定与这个示例的差异从源码 wezterm-gui/src/inputmap.rs#L189-L202 可以看到WezTerm 默认把“无修饰键、单击左键释放”绑定为CompleteSelectionOrOpenLinkAtMouseCursor(ClipboardCopyDestination::ClipboardAndPrimarySelection)也就是说默认行为是“若鼠标下有链接则打开链接否则完成选择且同时写入 Clipboard 与 PrimarySelection”。这与示例配置形成鲜明对比行为默认绑定示例配置悬停在链接上时打开链接只提交选择不打开链接复制目的地Clipboard PrimarySelection仅 Clipboard使用的动作CompleteSelectionOrOpenLinkAtMouseCursorCompleteSelection因此上文的mouse_bindings示例实际上是“更保守”的选择语义它彻底禁用了鼠标单击打开链接的行为并把复制去向收敛到系统剪贴板一个通道。在keys中把 CompleteSelection 绑定到键盘CompleteSelection不仅用于鼠标事件也可以绑定到普通键盘按键。由于动作本身“完成当前选择并复制”把它绑定到某个快捷键可以让你在键盘选中文本后一键提交复制。例如config.keys { { key Enter, mods CTRL, action wezterm.action.CompleteSelection Clipboard, }, }同样地你也可以沿用CopyTo的经典写法把它与复制模式配合使用参考 CopyTo.md 中的CtrlC示例config.keys { { key C, mods CTRL, action wezterm.action.CopyTo ClipboardAndPrimarySelection, }, }注意键盘快捷键与鼠标绑定使用的是两个不同的配置表keys与mouse_bindings动作枚举是共通的因此CompleteSelection在两张表中都可以使用。底层实现从动作触发到剪贴板写入在 WezTerm 源码中CompleteSelection的动作分派位于 wezterm-gui/src/termwindow/mod.rs#L2847-L2854CompleteSelection(dest) { let text self.selection_text(pane); if !text.is_empty() { self.copy_to_clipboard(*dest, text); let window self.window.as_ref().unwrap(); window.invalidate(); } }整个调用链可以拆解为三步提取选区文本调用selection_text(pane)从当前窗格取出选中的文本内容。该函数定义于 wezterm-gui/src/termwindow/selection.rs#L66-L110它会对选择范围做normalize()归一化逐行遍历get_logical_lines拼接文本对于由换行wrapped连接的逻辑行只有最后一个物理行才做行尾空白修剪trim_end从而保持复制出的文本与屏幕上看到的内容一致且支持矩形选择rectangular场景。写入剪贴板调用copy_to_clipboard(*dest, text)实现位于 wezterm-gui/src/termwindow/clipboard.rs#L10-L24。它把ClipboardCopyDestination枚举映射为窗口系统层的Clipboard/PrimarySelection通道Clipboard→ 只写入系统剪贴板PrimarySelection→ 只写入主选择缓冲区ClipboardAndPrimarySelection→ 两个通道都调用set_clipboard写入。刷新界面调用window.invalidate()让窗口重绘使选择高亮区域及时清除。对照之下CompleteSelectionOrOpenLinkAtMouseCursor的实现wezterm-gui/src/termwindow/mod.rs#L2837-L2846多了一步分支如果selection_text返回的文本非空则走相同的“复制 重绘”路径否则调用do_open_link_at_mouse_cursor打开鼠标下方的链接。这正是两个动作在语义上的本质差异所在。此外在命令面板Command Palette中CompleteSelection也有对应的菜单项定义见 wezterm-gui/src/commands.rs#L1788-L1799命令说明会根据绑定的destination动态生成“Completes text selection using the mouse, and copies to …”的描述方便你确认每个面板条目写入的目标缓冲区。常见问题与排查建议为什么配置后单击选择没有复制检查mouse_bindings中的事件是否精确匹配了你的操作event需写成{ Up { streak 1, button Left } }mods与你的按键修饰一致。鼠标事件的匹配规则可参考 keys.md 同目录的文档体系以及仓库中的MouseEventTrigger定义。为什么在 Wayland 下PrimarySelection无效PrimarySelection仅在 X11 与实现了 primary selection 协议如 primary-selection-unstable-v1的 Wayland 合成器上可用。若不确定使用Clipboard或ClipboardAndPrimarySelection更稳妥。想恢复“单击打开链接”的默认行为不要把CompleteSelection绑到该事件上改用CompleteSelectionOrOpenLinkAtMouseCursor或者干脆不覆盖默认绑定。如何验证配置生效修改wezterm.lua后执行wezterm ls-fonts、wezterm show-keys等命令即可查看当前加载的键位绑定鼠标行为则可直接拖拽一段文本、单击左键实测复制目标在支持xclip/wl-paste的环境下可直接查看两个缓冲区内容差异。小结CompleteSelection是 WezTerm 鼠标/键盘选择流程中的收尾动作它把进行中的选择关闭并按指定的ClipboardCopyDestination目标完成复制。掌握了它你就可以精准控制“单击左键是否打开链接”“选区复制到系统剪贴板还是主选择缓冲区”等日常体验细节同时也能通过CompleteSelectionOrOpenLinkAtMouseCursor在两个语义之间自由切换。相关的完整实现与默认绑定分别位于 config/src/keyassignment.rs、wezterm-gui/src/inputmap.rs 与 wezterm-gui/src/termwindow/mod.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),仅供参考
返回列表