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版本。
核心原因
- 异步操作的竞态条件:
paste()是异步触发系统粘贴逻辑,脚本不会等待粘贴完成就执行后续恢复代码。此时系统剪贴板可能仍在处理粘贴的同步流程,导致恢复操作被覆盖。 - 错误的延迟方式:忙等待循环无法准确判断粘贴操作的完成状态,固定延迟无法适配不同系统、不同应用的粘贴处理速度,必然出现间歇性失效。
- 备份不完整:仅备份剪贴板内容,未备份选中区域(
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
相关产品推荐
相关产品推荐

