【Bug】PreviewConfirm 模式下润色文本重复插入(嵌套重叠)

オープン
#1,014 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
半日
初心者へのやさしさ
62/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
静か
技術スタック
rust, tauri
領域
desktop-dev

調査の方向性

Find confirm_selection_polish_preview in the Rust/Tauri backend and see where it calls validate_selection_insertion_target before the Ctrl+V paste; that Ctrl+C re-read is what breaks the selection in most Windows apps. The change is to validate only the target window's HWND on the PreviewConfirm path, leaving the full Ctrl+C check in DirectReplace, since reactivate_selection_insertion_target already restores focus and the active selection. Confirm by setting the output mode to PreviewConfirm, polishing a selection in an Electron/QT or rich-text app on Windows, and checking the text replaces the selection exactly once.

索引モデルが issue の本文から書いたものです。

説明

问题描述

在使用 PreviewConfirm 输出模式(先预览润色结果、用户确认后再插入)时,最终插入目标应用的文本会出现重复:原始润色内容出现一次,且同样的内容还会嵌套在第一段文字的末尾几个字中间,形成"结尾重叠"的效果。

复现步骤

  1. 在设置中将"选区润色输出模式"设为 PreviewConfirm(预览确认)
  2. 在任意 Windows 应用(尤其是 Electron / Chromium 内核、QT、富文本编辑器)中选中一段文字
  3. 触发选区润色快捷键,等待润色完成后在预览窗口点击"确认替换"
  4. 观察目标应用中插入的文本

实际现象

插入文本出现两遍,第二遍嵌套在第一遍末尾数个字中间,例如:

润色后的完整内容润色后的完整内容整内容

(示意:前半段完整,后半段从某处开始重复)

期望现象

目标应用中只出现一遍润色后的文本,完整替换原来的选中内容。

根本原因分析

confirm_selection_polish_preview 在执行 Ctrl+V 粘贴之前,会调用 validate_selection_insertion_target。该函数在 Windows 上会向目标应用发送一次真实的 Ctrl+C 按键,以重新读取当前选区文本进行校验。

这次 Ctrl+C 会破坏许多 Windows 应用的活动选区状态,导致随后的 Ctrl+V 无法正确替换选中文本,而是在光标所在位置插入,从而产生嵌套重复的效果。

修复方案

在 PreviewConfirm 路径中,改用仅校验窗口身份(HWND)的验证函数,跳过 Ctrl+C 重读步骤。

理由:

  • 用户已在预览窗口明确确认了替换操作,无需再次读取选区内容
  • reactivate_selection_insertion_target 已经恢复了目标窗口的焦点和活动选区
  • HWND 校验足以检测用户在预览期间是否切换了应用窗口

DirectReplace 路径(无预览直接替换)仍保留完整的 Ctrl+C 校验逻辑,因为 LLM 调用期间用户有可能已经移动或改变了选区。

环境

  • 操作系统:Windows
  • 受影响模式:SelectionPolishOutputMode::PreviewConfirm
主要言語
Rust
スター
3.7k
フォーク
349
平均マージ
2日 14時間
マージ済み PR(30日)
97

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

Open-Less/openless のほかの issue

Open-Less/openless の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。