You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CopyQ脚本执行paste()后剪贴板无法可靠恢复的问题排查

CopyQ脚本paste()后剪贴板内容无法可靠恢复的问题解决

问题重现

需求为插入时间戳,但执行脚本后原剪贴板数据丢失,操作步骤如下:

  • 保存剪贴板内容:var textBackup = clipboard();
  • 生成时间戳:var format = 'yyyy-MMdd-HHmm'; var dateTime = dateString(format);
  • 复制时间戳:copy(dateTime); copySelection(dateTime);
  • 粘贴时间戳:paste();
  • 尝试恢复剪贴板:copySelection(textBackup); clipboard(textBackup);

问题:执行paste()后原剪贴板内容无法可靠恢复,添加固定延迟的忙等待也间歇性失效,使用CopyQ 10.0.0版本。

核心原因

  1. 异步操作的竞态条件:paste()是异步触发系统粘贴逻辑,脚本不会等待粘贴完成就执行后续恢复代码。此时系统剪贴板可能仍在处理粘贴的同步流程,导致恢复操作被覆盖。
  2. 错误的延迟方式:忙等待循环无法准确判断粘贴操作的完成状态,固定延迟无法适配不同系统、不同应用的粘贴处理速度,必然出现间歇性失效。
  3. 备份不完整:仅备份剪贴板内容,未备份选中区域(selection()),恢复时状态不一致可能引发隐性问题。

解决方案

修改后的可靠脚本

// 1. 完整备份剪贴板和选中区域
var textBackup = clipboard();
var selectionBackup = selection();

// 2. 生成时间戳
var format = 'yyyy-MMdd-HHmm';
var dateTime = dateString(format);

// 3. 替换剪贴板和选中区域为时间戳
copy(dateTime);
copySelection(dateTime);

// 4. 执行粘贴并等待操作彻底完成
paste();
waitForPaste(); // 关键API:等待粘贴操作结束

// 5. 恢复原有剪贴板和选中区域
clipboard(textBackup);
copySelection(selectionBackup);

关键优化点

  • 使用waitForPaste():CopyQ内置的异步等待函数,能精准判断粘贴操作的完成状态,彻底解决时序问题。
  • 完整备份/恢复:同时处理剪贴板(clipboard())和选中区域(selection()),确保系统剪贴板状态完全还原。
  • 避免忙等待:替换低效且不可靠的忙等待循环,改用官方提供的同步API。

额外注意事项

  • 若使用Wayland桌面环境,需确保CopyQ已获取剪贴板访问权限。
  • 避免在快速切换窗口的场景下执行脚本,防止系统剪贴板状态异常。

内容的提问来源于stack exchange,提问作者SL5net

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:21:05