WezTermCopyTo(destination)配置详解:把选区复制到系统剪贴板与主选择缓冲
【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm
CopyTo(destination)是 WezTerm 中用于将当前选区文本复制到指定剪贴板缓冲区的按键分配(KeyAssignment)。本指南以docs/config/lua/keyassignment/CopyTo.md为核心,讲解Clipboard、PrimarySelection、ClipboardAndPrimarySelection三种目标缓冲区的语义与适用平台,给出可直接复制的 Lua 配置,并结合仓库源码说明其底层执行链路,帮助你按平台习惯定制复制行为。
CopyTo 是什么
在 WezTerm 的按键分配系统中,CopyTo(destination)的作用是把当前选中的文本写入指定的剪贴板缓冲区。它最常见的用法是绑定到快捷键:先通过鼠标或 Copy Mode 选中文本,再触发该动作完成复制。
从源码看,CopyTo是 config/src/keyassignment.rs 中KeyAssignment枚举的一个变体,携带一个ClipboardCopyDestination参数:
// config/src/keyassignment.rs pub enum KeyAssignment { // ... CopyTo(ClipboardCopyDestination), // ... }ClipboardCopyDestination的定义如下(config/src/keyassignment.rs):
pub enum ClipboardCopyDestination { Clipboard, PrimarySelection, ClipboardAndPrimarySelection, } impl_lua_conversion_dynamic!(ClipboardCopyDestination);由于该类型实现了FromDynamic/ToDynamic的 Lua 转换(impl_lua_conversion_dynamic!),你才能在 Lua 配置中直接写wezterm.action.CopyTo 'Clipboard'这样的字符串形式。
destination 的三种取值
destination参数决定选中文本被写入哪个剪贴板缓冲区,可选值如下:
| 取值 | 含义 | 适用平台 |
|---|---|---|
Clipboard | 复制到系统剪贴板(clipboard),即常规的“复制到剪贴板” | 所有平台 |
PrimarySelection | 复制到主选择缓冲区(primary selection) | 仅 X11 及部分 Wayland 系统 |
ClipboardAndPrimarySelection | 同时复制到剪贴板与主选择缓冲区 | 所有平台 |
这里需要区分两个容易混淆的概念:
- 系统剪贴板(Clipboard):由 Ctrl+C / Ctrl+V 这类组合键读写,显式地“复制—粘贴”,内容不会随选择消失而丢失。
- 主选择缓冲区(PrimarySelection):源自 X11 的传统机制,文本随鼠标选中即时生效,通常通过鼠标中键粘贴,不依赖显式复制动作。
在 Wayland 上,主选择支持取决于合成器实现:自 WezTerm 版本20220319-142410-0fcdea07起,只要 Wayland 合成器支持primary-selection-unstable-v1协议或较旧的 Gtk primary selection 协议,PrimarySelection也能正常工作(见原文档的since标注)。
值得注意的默认值:ClipboardCopyDestination的Default实现是ClipboardAndPrimarySelection(config/src/keyassignment.rs)。这意味着凡是“默认复制到何处”依赖该类型的动作(例如后面会提到的CharSelectArguments的copy_to字段),在不显式指定时都会同时写入剪贴板和主选择缓冲区。
基础配置示例
将CopyTo绑定到快捷键的最简配置如下(与 docs/config/lua/keyassignment/CopyTo.md 中的示例一致):
local wezterm = require 'wezterm' local config = {} config.keys = { { key = 'C', mods = 'CTRL', action = wezterm.action.CopyTo 'ClipboardAndPrimarySelection', }, } return config在这个配置中:
key = 'C'配合mods = 'CTRL'表示 Ctrl+C;wezterm.action.CopyTo 'ClipboardAndPrimarySelection'会覆盖 WezTerm 默认的复制行为,将选区同时写入系统剪贴板和主选择缓冲区;- 在 X11 桌面环境中,这样配置后,中键粘贴和 Ctrl+V 都能取到刚复制的文本。
如果只想使用常规系统剪贴板,把动作改为wezterm.action.CopyTo 'Clipboard'即可;如果是在 Linux 上希望选区仅对主选择生效(例如完全不依赖剪贴板管理器),则使用wezterm.action.CopyTo 'PrimarySelection'。
底层执行链路:CopyTo 被触发后发生了什么
在 GUI 端,CopyTo的按键分配由 wezterm-gui/src/termwindow/mod.rs 中的perform_key_assignment处理:
CopyTo(dest) => { let text = self.selection_text(pane); self.copy_to_clipboard(*dest, text); }执行流程分两步:
- 调用
self.selection_text(pane)取出当前 pane 的选中文本; - 调用
self.copy_to_clipboard(*dest, text),按dest指定的目标缓冲区写入剪贴板。
也就是说,CopyTo只负责“把当前选区写出去”,它本身不改变选区状态,也没有弹出任何确认界面——是一个干净利落的动作,非常适合直接绑到快捷键上。
从复制模式的角度看,CopyTo与CompleteSelection是同一族的能力:CompleteSelection(ClipboardCopyDestination)同样携带目标缓冲区参数(config/src/keyassignment.rs),区别在于CompleteSelection除了复制外还会结束当前的鼠标选择动作,而CopyTo纯粹执行复制。在 Copy Mode 中,WezTerm 默认就把CopyTo(ClipboardAndPrimarySelection)作为复制键的动作之一(见 wezterm-gui/src/overlay/copy.rs 附近的默认键表定义)。
在 Command Palette 中的呈现
CopyTo也出现在 WezTerm 的命令面板(Command Palette)中。wezterm-gui/src/commands.rs 为三种目标缓冲区分别注册了命令项:
CopyTo(ClipboardCopyDestination::PrimarySelection)→ 显示为 Copy to Primary Selection;CopyTo(ClipboardCopyDestination::Clipboard)→ 显示为 Copy to Clipboard;CopyTo(ClipboardCopyDestination::ClipboardAndPrimarySelection)→ 显示为 Copy to Clipboard and Primary Selection。
同时,在 wezterm-gui/src/commands.rs 附近,默认的命令列表中还预置了CopyTo(PrimarySelection)与CopyTo(Clipboard)两个条目。这意味着即使你不在config.keys里显式配置,也可以通过命令面板按名称搜索并执行“Copy to Clipboard”等动作,方便在忘记快捷键时兜底使用。
与其他剪贴板相关动作的关系
CopyTo属于 WezTerm 剪贴板动作家族的一部分,理解它与相邻动作的区别有助于选择合适的绑定:
| 动作 | 作用 | 典型用途 |
|---|---|---|
CopyTo(destination) | 将当前选区写入指定缓冲区 | 覆盖默认复制行为,一键同时复制到剪贴板与主选择 |
CompleteSelection(destination) | 复制选区并结束选择动作 | 鼠标/复制模式中的“复制即结束”体验 |
CopyTextTo { text, destination } | 将指定的任意文本写入缓冲区 | 脚本或自定义动作中复制固定字符串 |
PasteFrom(source) | 从指定缓冲区粘贴 | 用快捷键从中键缓冲区粘贴文本 |
其中CopyTextTo与CopyTo共用同一个ClipboardCopyDestination类型与copy_to_clipboard底层实现(wezterm-gui/src/termwindow/mod.rs),只是文本来源不同:前者来自显式传入的text字段,后者来自当前选区。
小结
CopyTo(destination)把当前选区复制到指定缓冲区,destination支持Clipboard、PrimarySelection、ClipboardAndPrimarySelection三种取值,其中PrimarySelection仅适用于 X11 与支持 primary selection 协议的 Wayland 系统。- 通过
config.keys绑定快捷键即可覆盖默认复制行为;不配置时也能从命令面板中找到对应的 Copy 命令。 - 源码层面,该动作由
perform_key_assignment中selection_text与copy_to_clipboard两步完成(wezterm-gui/src/termwindow/mod.rs),语义明确、无额外副作用,适合直接作为快捷键动作。 - 如果你的日常使用以 Linux 为主且习惯中键粘贴,
ClipboardAndPrimarySelection是最贴近桌面习惯的默认选择。
【免费下载链接】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),仅供参考