Skip to content

feat(desktop): 支持成对符号包裹选中文本 - #3925

Open
Stella-xixi wants to merge 1 commit into
makecindy:mainfrom
Stella-xixi:codex/issue-3899-paired-selection
Open

feat(desktop): 支持成对符号包裹选中文本#3925
Stella-xixi wants to merge 1 commit into
makecindy:mainfrom
Stella-xixi:codex/issue-3899-paired-selection

Conversation

@Stella-xixi

@Stella-xixi Stella-xixi commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

在 Cindy 的主要文本编辑入口中加入类似 VS Code 的选区包裹行为:选中文本后输入双引号、单引号、圆括号、方括号、花括号或尖括号的左符号,会保留原文并在两侧插入配对符号,原内容继续保持选中。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:Closes 在可编辑区域输入成对符号时支持包裹选中文本 #3899
  • 本 PR 包含:共享配对规则;主聊天 Tiptap/ProseMirror 输入框;共享 textarea(含消息编辑等入口);纯文本、Markdown 和代码文件的 CodeMirror 编辑器;IME、maxlength、选区与 Windows beforeinput 回归测试。
  • 明确不包含:空选区自动补齐、输入右符号跳过、配置开关、未复用上述编辑器基座的第三方/vendor 编辑器。
  • 用户可见变化:选中内容后输入 "'([{< 时,内容被对应符号包裹而非覆盖。
  • 是否存在 breaking change:无。

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §4 Inputs。本改动只调整既有编辑器的文本输入交互,不新增或改变视觉、布局、颜色、文案与主题样式;Light/Dark 均复用现有界面。

怎么验证的

自动验证

pnpm test:unit:related
结果:通过(apps/desktop,10 个相关文件)

pnpm --filter desktop run typecheck
结果:通过

pnpm --filter desktop exec vitest run src/renderer/lib/__tests__/pairedSelection.test.ts src/renderer/components/markdown/__tests__/CodeMirrorSelectionPairing.test.ts src/renderer/__tests__/windowsSelectionReplacement.test.ts
结果:通过(3 files,22 tests)

pnpm check:dco -- --base origin/main
结果:通过(1 commit)

手工验证

未执行:当前独立 worktree 不属于运行中 Desktop dev 实例,无法在不影响宿主 checkout 的情况下做实机输入验证。

未执行的验证

  • 未在 macOS/Linux 实机验证;实现使用各编辑器的跨平台事务/input API,并显式避开 IME composing。
  • 未做视觉截图:没有视觉变化。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:编辑器输入法与选区事务

影响与回滚

  • 影响范围:Desktop 主聊天输入、复用 ListComposerTextarea 的原生 textarea,以及 PlaintextEditor 的 plain/Markdown/code 三种模式。
  • 回滚 / 降级方式:移除三个编辑器适配扩展及共享配对规则即可恢复原生选区覆盖行为。IME 组字、空选区、快捷键修饰输入、CodeMirror 多选区和不支持字符均保持原编辑器处理路径。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(本改动无需额外文档)
  • 已确认测试结果或说明未执行原因

Signed-off-by: Stella-xixi <2559689615@qq.com>
@Stella-xixi
Stella-xixi requested a review from a team as a code owner September 4, 2026 14:03
@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为 Desktop 的三类主要文本输入入口增加选区成对符号包裹能力:

  • 新增共享的成对符号映射与原生 textarea 编辑计算逻辑。
  • 为 Tiptap/ProseMirror 聊天输入框及 Windows beforeinput 兼容路径接入包裹事务。
  • 为 PlaintextEditor 的 CodeMirror 模式接入相同交互。
  • 增加 IME、maxlength、Windows 输入适配和基础选区行为测试。
  • 当前实现遗漏了 ProseMirror 与 CodeMirror 中反向选区方向的保留。

Confidence Score: 4/5

此 PR 整体可以合并,但建议先修复 ProseMirror 与 CodeMirror 包裹操作丢失反向选区方向的问题,以保持后续键盘选区操作一致。

包裹内容、IME、maxlength、Windows 输入转发和编辑器更新链路均未发现阻塞性故障;唯一确认的问题是两个编辑器适配使用排序后的范围重建选区,导致反向选区变为正向。

Files Needing Attention: apps/desktop/src/renderer/components/new-chat/SelectionPairing.ts, apps/desktop/src/renderer/components/markdown/CodeMirrorSelectionPairing.ts

Important Files Changed

Filename Overview
apps/desktop/src/renderer/lib/pairedSelection.ts 定义共享符号映射和原生文本控件的选区包裹计算,逻辑直接且测试覆盖主要边界。
apps/desktop/src/renderer/components/new-chat/ListComposerTextarea.tsx 在原生 textarea 键盘处理链中接入包裹行为,并正确处理 IME、maxlength 与选区方向。
apps/desktop/src/renderer/components/new-chat/SelectionPairing.ts 通过单个 ProseMirror 事务包裹 TextSelection,但重建选区时会丢失反向选择方向。
apps/desktop/src/renderer/components/markdown/CodeMirrorSelectionPairing.ts 通过单个 CodeMirror 输入事务完成包裹,同样会把反向选区改为正向。
apps/desktop/src/renderer/components/markdown/PlaintextEditor.tsx 将共享 CodeMirror 扩展接入纯文本、Markdown 和代码编辑模式。
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/renderer/components/new-chat/SelectionPairing.ts:25-28
**反向选区方向丢失**

反向选中文本并输入成对符号后,这里使用已排序的 `from``to` 重建选区,会将其强制变为正向选区。随后使用 Shift 加方向键时,选区会从另一端扩展或收缩,导致连续编辑行为不符合用户预期。CodeMirror 的适配也存在相同问题,而 textarea 路径已通过 `selectionDirection` 保留原方向;建议根据原选区的 anchor/head 重建方向,并补充反向选区测试。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(desktop): 支持成对符号包裹选中文本" | Re-trigger Greptile

Comment on lines +25 to +28
transaction.setSelection(
TextSelection.create(transaction.doc, from + input.length, to + input.length),
);
view.dispatch(transaction.scrollIntoView());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 反向选区方向丢失

反向选中文本并输入成对符号后,这里使用已排序的 fromto 重建选区,会将其强制变为正向选区。随后使用 Shift 加方向键时,选区会从另一端扩展或收缩,导致连续编辑行为不符合用户预期。CodeMirror 的适配也存在相同问题,而 textarea 路径已通过 selectionDirection 保留原方向;建议根据原选区的 anchor/head 重建方向,并补充反向选区测试。

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/components/new-chat/SelectionPairing.ts
Line: 25-28

Comment:
**反向选区方向丢失**

反向选中文本并输入成对符号后,这里使用已排序的 `from``to` 重建选区,会将其强制变为正向选区。随后使用 Shift 加方向键时,选区会从另一端扩展或收缩,导致连续编辑行为不符合用户预期。CodeMirror 的适配也存在相同问题,而 textarea 路径已通过 `selectionDirection` 保留原方向;建议根据原选区的 anchor/head 重建方向,并补充反向选区测试。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@MagicLizi

Copy link
Copy Markdown
Contributor

@Stella-xixi 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/renderer/components/new-chat/SelectionPairing.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added the touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) label Sep 4, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 改的是选中文本后输入成对符号的默认交互(主聊天、textarea、CodeMirror),属于产品行为变化,需要维护者确认后才能继续。

球不在作者这边:请等待维护者在本 PR 上 Approve。如果维护者要求修改,会走 Request Changes;改完后再 Approve 即可放行。

确认方式见讨论 issue:#3927

@MagicLizi MagicLizi added the awaiting-discussion 等待维护者讨论(review-pr) label Sep 4, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/markdown/CodeMirrorSelectionPairing.ts / apps/desktop/src/renderer/components/markdown/PlaintextEditor.tsx / apps/desktop/src/renderer/components/new-chat/ChatInput.tsx 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

缺 UI 证据不阻断合并,只是方便对照 DESIGN.md。补一张改动后截图、录屏,或把改动后界面的 HTML 贴进 description 即可。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Sep 5, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

@Stella-xixi 👋 这个 PR 现在在等维护者确认,确认之前流程不会合并它 —— 不是卡住了,也不是在等你再改一版(你推的改动流程都读到了,判的就是最新一版代码)。

  • 在拦的是:维护者确认门(产品 / UI 变更)。
  • 讨论 issue:维护者确认:PR #3925 成对符号包裹选中文本 #3927
  • 通过方式只有一个:维护者在本 PR 上 Approve。维护者觉得要改会直接 Request Changes,那时候球才回到你手里。
  • 这期间如果还有 review 意见没处理完、CI 没过,照常修就行,不影响这条等待。

这条是流程自动发的状态提醒(同一版代码只发一次),不用回复。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

在可编辑区域输入成对符号时支持包裹选中文本

2 participants