Skip to content

[0840] AI diff 功能初步实现#3976

Open
AXeonV wants to merge 7 commits into
mainfrom
ty/0840
Open

[0840] AI diff 功能初步实现#3976
AXeonV wants to merge 7 commits into
mainfrom
ty/0840

Conversation

@AXeonV

@AXeonV AXeonV commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

[0840] AI Suggestion 功能初步实现

1 相关文档

  • 0834 - 自动补全初步实现

2 任务相关的代码文件

  • TeXmacs/progs/generic/generic-kbd.scm — 注册 kbd-tab 键盘钩子以引入 diff-text 模块
  • TeXmacs/progs/generic/diff-text.scm — 新增 diff-text 模块,实现富文本 AST 树级递归修改生成、自愈式双重重载按键拦截及鼠标环境自适应检测逻辑
  • src/Edit/editor.hpp / src/Edit/Interface/edit_interface.hpp — 添加 show_diff_popup/hide_diff_popup 的编辑器接口声明
  • src/Edit/Interface/edit_mouse.cpp — 实现编辑器接口转调至 Qt 侧简易部件弹窗接口
  • src/Scheme/Glue/glue_editor.lua — 为 show_diff_popup/hide_diff_popup 注册 Scheme 与 C++ 黏合绑定
  • src/Plugins/Qt/QTMUserPromptPopup.hpp / QTMUserPromptPopup.cpp — 重构基类 QTMUserPromptPopup 支持子类自定义按钮文本(“接受 Enter”/“拒绝 Backspace”),并实现派生子类 QTMDiffTextPopup
  • src/Plugins/Qt/qt_simple_widget.hpp / qt_simple_widget.cpp — 管理 diffTextPopup 弹窗实例的生命周期、显示隐藏与滚动
  • src/Plugins/Qt/QTMWidget.cpp — 增加滚动事件监听,确保页面滚动时差异对比弹窗同步跟随滚动

3 如何测试

3.1 确定性测试(单元测试)

xmake b stem
xmake r stem

3.2 非确定性测试(交互验证)

  1. 使用商业版(xmake f --is_community=false && xmake b stem)构建 MoganSTEM
  2. 打开 TeXmacs\tests\tmu\0840.tmu
  3. 选中一个段落,按下 tab 触发一个 AI Suggestion 的 demo(随机删除一些 the,插入一些 a,大写一些单词)
  4. 选中多个段落,按下 tab 也会触发 AI Suggestion,逻辑相同
  5. 鼠标可以在不同的 version-both 节点间跳转,弹窗会自动贴合光标位置
  6. 也可以通过键盘移动光标到不同的 version-both 节点,弹窗会自动贴合光标位置
  7. 光标进入 version-both 节点后,可以通过快捷键 Enter/Backspace 来同意或拒绝当前的差异对比,会立刻生效
  8. 也可以通过鼠标点击弹窗上的按钮来同意或拒绝当前的差异对比,会立刻生效
  9. 使用社区版(xmake f --is_community=true && xmake b stem)构建 MoganSTEM,上述功能不被触发

4 What

在自动补全框架下进一步设计并实现了基于富文本 AST 对照的差异对比预览(Diff Text)交互系统:

  • 支持对多段落、富文本及数学公式等复杂节点在保留原有排版骨架的前提下进行细粒度字符比对。
  • 实现一处一处跳转确认的冲突决策(Conflict-by-conflict)流转。
  • 引入无状态自愈式全局监听器,支持弹窗位置随光标的移动而自动贴合、隐藏和显示。
  • 在 C++ 侧重构了气泡弹窗,支持在子类中自定义采纳和拒绝的快捷键文案。

5 How

  1. 树级递归建议生成
    diff-text.scm 中,设计 demo-suggest 函数递归扫描选区树,保持原有树节点拓扑外壳,仅在叶子文本节点上应用随机的删除、增加与大写变换逻辑。
  2. 编辑器级删除与插入
    在同意(accept-diff)或拒绝(reject-diff)时,通过 tree-remove! 在位移除当前的 version-both 节点,并在光标前执行 (insert ...) 原地写入纯文本内容。
  3. 逐处跳转与弹窗自适应
    通过在 keyboard-press 增加双重函数重载分发,区分高优先级决策按键拦截(回车/退格)与低优先级常驻事件监听。当光标被流转至下一处或通过鼠标、方向键位移至 version-both 节点内部时,延迟调用 diff-check-popup。在其中先隐后显,确保弹窗位置始终自适应贴合最新光标。
  4. 自定义按钮文案
    重构基类 QTMUserPromptPopup 构造函数接收 acceptTextrejectText 参数,并在子类 QTMGhostTextPopupQTMDiffTextPopup 中调用基构造函数定义特定的提示文案。

Copilot AI review requested due to automatic review settings July 16, 2026 05:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@AXeonV AXeonV changed the title [0840] AI Suggestion 功能初步实现 [0840] AI diff 功能初步实现 Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants