From e01e9a4cb5e9080397c667707dd97bb882f2f414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Thu, 15 Oct 2026 02:12:11 -0400 Subject: [PATCH] R6.1 round 3 fixes, ticked: component f1771b3 Co-Authored-By: Claude Opus 5.5 (1M context) --- Cargo.lock | 2 +- Cargo.toml | 2 +- agents.md | 4 ++-- scripts/fetch-references.sh | 2 +- tasks/TASKS.md | 2 +- tasks/reviews/R6.1-r3.md | 9 +++++++++ 6 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 tasks/reviews/R6.1-r3.md diff --git a/Cargo.lock b/Cargo.lock index e6ebeb6..60474c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1923,7 +1923,7 @@ dependencies = [ [[package]] name = "ely-gpui-component" version = "0.1.1" -source = "git+https://git.zacharyzhang.com/ZacharyZhang-NY/Ely-GPUI-Components?rev=2b6bd1d36951713e61763bcd9572bbd42464dd7d#2b6bd1d36951713e61763bcd9572bbd42464dd7d" +source = "git+https://git.zacharyzhang.com/ZacharyZhang-NY/Ely-GPUI-Components?rev=f1771b3880fbea0aae35d5d0a7ecd2b446032906#f1771b3880fbea0aae35d5d0a7ecd2b446032906" dependencies = [ "alacritty_terminal", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index ff7c60f..bda42c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ jiff = "0.2" anyhow = "1" directories = "6" dunce = "1" -ely-gpui-component = { git = "https://git.zacharyzhang.com/ZacharyZhang-NY/Ely-GPUI-Components", rev = "2b6bd1d36951713e61763bcd9572bbd42464dd7d" } +ely-gpui-component = { git = "https://git.zacharyzhang.com/ZacharyZhang-NY/Ely-GPUI-Components", rev = "f1771b3880fbea0aae35d5d0a7ecd2b446032906" } env_logger = "0.11" gpui = { package = "gpui-pre", version = "=0.3.8", default-features = false, features = ["stacker"] } gpui_platform = { package = "gpui-pre-platform", version = "=0.3.8", features = ["font-kit", "wayland", "x11"] } diff --git a/agents.md b/agents.md index bf7a878..41f4f50 100644 --- a/agents.md +++ b/agents.md @@ -40,7 +40,7 @@ site/ 官网(Vite 8、pnpm、TypeScript,无框架;等轴 SVG 积木 ## 组件映射 -依赖 `ely-gpui-component`(pin 2b6bd1d,gpui 为 crates.io 的 `gpui-pre` =0.3.8)。名字取自 `reference/Ely-GPUI-Components/src`。gpui 用法规则见该仓库 `AGENTS.md`。`tests/scripts/agents_md.py` 核对下表每个名字都是组件库公开项。 +依赖 `ely-gpui-component`(pin f1771b3,gpui 为 crates.io 的 `gpui-pre` =0.3.8)。名字取自 `reference/Ely-GPUI-Components/src`。gpui 用法规则见该仓库 `AGENTS.md`。`tests/scripts/agents_md.py` 核对下表每个名字都是组件库公开项。 | 需要 | 用 | | --- | --- | @@ -296,4 +296,4 @@ cargo run -p ely-doc 启动一个应用(ElyDoc 先 cargo build -p ely - 2026-10-14:ElyMark 的右键菜单(R4.10)。项、次序与显隐规则取自 Typora 1.14.10 的 `resources/window.html`(`#context-menu` 与其子菜单)与 `frame.js` 的显隐函数,记在 `.work/R4.10/typora-context-menu.txt`。菜单在 `view/menu.rs`,`MarkView` 自持(`ely_office::menu::Offer` 与 `ContextMenu::manual`):可视模式由组件的 `DocumentEvent::Pointed` 开在指针处,源码与预览由视图自己的右键开。剪切、复制、粘贴、删除所选范围为图标行,按下即把其键交回菜单打开前的焦点(`dispatch_keystroke`),与键盘同一路径;无选区时剪切、复制、删除灰显。其余项经各自的动作,显示所绑的键。组件 013f142、1b5fb07:文本框与代码编辑器右键落在选区里时保留选区,否则把插入点移到所点处;可视模式打开的块右键不写回、不关闭,目标在后台按全文读出(块外的引用定义照样解析);`MarkdownDocument::delete_image`(删除图片,一步撤销,无图片即 `EditRefusal::NoImage`);可视无块时 Ctrl+V 粘贴文字(原只收图片,文字被丢弃)。复制为 HTML 代码的图片照原地址(`Pictures::Written`,同 Typora),复制为富文本照旧内嵌。“编辑”菜单的复制项照 Typora 次序:纯文本、Markdown、HTML 代码、富文本。Typora 有而不做的:缩进与减少缩进行(可视只在打开的块里有)、复制表格、代码自动缩进、图片上传、缩放、移动与语法切换、拼写、表情复制、检查元素。gpui 的测试只发按下,菜单在 Enter 松开时选中,测试另发松开(`blocks/context.rs` 的 `choose`)。第 1 轮后:右键的目标按所点的字节读(组件 79e94f7),保留的选区只供剪贴板,删除图片删所点的那张;三种“复制为”在后台转换,界面线程只写剪贴板,新的复制取代未完成的旧复制(`Desk::copying`);`ely_office::menu::Offer` 只在首次绘制时把请求交给宿主(宿主按元素存的“已开”记录随标签切走而丢,切回会重开),ElyDoc、ElyTable、ElyShow 同受其益。第 2 轮后:转换完成时剪贴板已不是开始时的内容(此后有任何复制,含编辑器自己的 Ctrl+C)即丢弃这次结果,同内容的再次写入分不出;打开的块里只认最后一次右键(组件 2b8bd9f),所点字节对回所画字节的读法逐段只对齐一次(原逐字重读,8000 字的段落要近 2 秒)。第 3 轮后:剪贴板的比对另含其 HTML(gpui 读剪贴板不含 HTML,纯文字相同而富文本不同的后来复制原被盖掉;`ely_platform::clipboard::html`);组件的计时测试改用 `web_time::Instant`(组件 e07fd34)。 - 2026-10-14(用户报:整个软件中文显示问题很多):中文显示(R4.13)。Windows 上 gpui 以用户区域(本机为 en-US)排版全部文字,DirectWrite 按日文为汉字选回退字体,日文字体缺的简体字再落到另一字体,同一个词里字形与粗细不一(ElyTree 的“打开仓库”:“打开”粗、“仓库”细)。`vendor/gpui-pre-windows` 的 `text_locale`:用户区域不是中日韩时,改用 Windows 语言列表(WinRT `GlobalizationPreferences::Languages`,Win32 的界面语言只给 en-US)里第一个中日韩语言排版(日志 `text: laid out as …`);在 Windows 上打中文须把中文加进该列表,所以它就是用户读的汉字。只换排版的区域,字体族名与字体列表仍按用户区域。读不出语言列表即记警告、照用户区域。Ely 的界面语言是中文时(设置或 `ELY_LOCALE`),`ely_ui::i18n::install_as` 经 `gpui_windows::set_text_language` 让排版随它,不论 Windows 区域(日文区域下“打开仓库”原为 Yu Gothic UI 600 与 Microsoft JhengHei UI 700 两种字);语言下次启动生效,故启动时设一次。组件库 6df9ab0:Ely 用到的组件里写死的英文(下拉的“Choose…”、清除、关闭、移除、取消固定的提示,公式补全的“No suggestions”,设置里字号的重置提示与示例句)改走内建中英目录。a4bf696:查找框(计数、三个选项与上下一处的提示、替换与全部替换)、排序与筛选(添加规则、满足全部或任一、条件、升降序、添加排序)、密码框的显示与隐藏提示同此;筛选条件以目录键为值(`Test::key`);ElyMark 的删除图片按右键所点的字节(`delete_image(at)`)。仍为英文的是内核的文字(LibreOffice 界面语言固定英文:幻灯片占位“Click to add Title”、母版“Default”、配色名、数字格式代码“General”、函数名),以及启动失败对话框(出现在读入语言之前,中英并列)。 - 2026-10-14(用户定:dmg 不再显示未公证):macOS 发布以 Developer ID Application 证书签名、经 `notarytool` 公证并钉票。证书与公证凭据(`xcrun notarytool store-credentials`,App 专用密码只在钥匙串里)装在构建用的 Mac 上;发布流程的 macOS 任务从仓库变量 `ELY_SIGN_IDENTITY`(证书全名)与 `ELY_NOTARY_PROFILE`(凭据名)取得,`ci.sh` 在 macOS 上缺任一即失败,不出未公证的包。本机手动出包同样设这两个变量再跑 `packaging/macos/release.sh`。 -- 2026-10-15(用户报:ElyMark 点表格整个表格变成源码,应在格内编辑;用户定:格内显示该格原文):表格单元格编辑(R6.1)。组件库 2594b3f:可视模式按下表格只打开所按的那一格,在格内原位以单行输入框显示该格的 Markdown 原文(`**粗体**` 带记号),表格其余照常画出;按在格内文字上即落在所按的字,按在格内空白落在格末;以表格边缘、键盘或上下键从邻块进入的表格块打开其首格或末格;Tab、Shift+Tab 到下一格、上一格(跨行),上下键到上下一格,越出表格即到邻块;回车与 Esc 写回,写回为一步撤销;格内键入的 `|` 写回时转义为 `\|`(表格编辑读到的也是转义后的文字);格开着时做表格编辑(插删行列、整理等)先写回该格再执行,格随之关闭。列表、引用里的表格同此。表格绘制移入组件 `render/table.rs`,按格的空白处也带出所按的格(`Place::Cell`)。第 1 轮后(组件库 6a3f348):开着的格里的按下只给其输入框,插入点落在所按处、仍是一步撤销;格末单数的反斜杠写回时补成一对,不吞下一格的竖线;查找在可视模式里打开匹配所在的格并选中,跨格的匹配转到其行;格开着时右键所按的字节随格内键入的竖线换算;在未开的格的空白处右键,目标为该格末尾。第 2 轮后(组件库 2b6bd1d):格末的反斜杠只在紧接竖线时补成一对(`| a\ |` 的反斜杠后是空格,原样写回,只打开不键入不改一个字节);改首格后仍认得所在表格(无外侧竖线的表格首格始于块首,原被当作写掉了块),Tab 与按邻格照常;开着的格的空白处左键把插入点移到格末、右键以格末为目标,都不写回,仍是一步撤销。 +- 2026-10-15(用户报:ElyMark 点表格整个表格变成源码,应在格内编辑;用户定:格内显示该格原文):表格单元格编辑(R6.1)。组件库 2594b3f:可视模式按下表格只打开所按的那一格,在格内原位以单行输入框显示该格的 Markdown 原文(`**粗体**` 带记号),表格其余照常画出;按在格内文字上即落在所按的字,按在格内空白落在格末;以表格边缘、键盘或上下键从邻块进入的表格块打开其首格或末格;Tab、Shift+Tab 到下一格、上一格(跨行),上下键到上下一格,越出表格即到邻块;回车与 Esc 写回,写回为一步撤销;格内键入的 `|` 写回时转义为 `\|`(表格编辑读到的也是转义后的文字);格开着时做表格编辑(插删行列、整理等)先写回该格再执行,格随之关闭。列表、引用里的表格同此。表格绘制移入组件 `render/table.rs`,按格的空白处也带出所按的格(`Place::Cell`)。第 1 轮后(组件库 6a3f348):开着的格里的按下只给其输入框,插入点落在所按处、仍是一步撤销;格末单数的反斜杠写回时补成一对,不吞下一格的竖线;查找在可视模式里打开匹配所在的格并选中,跨格的匹配转到其行;格开着时右键所按的字节随格内键入的竖线换算;在未开的格的空白处右键,目标为该格末尾。第 2 轮后(组件库 2b6bd1d):格末的反斜杠只在紧接竖线时补成一对(`| a\ |` 的反斜杠后是空格,原样写回,只打开不键入不改一个字节);改首格后仍认得所在表格(无外侧竖线的表格首格始于块首,原被当作写掉了块),Tab 与按邻格照常;开着的格的空白处左键把插入点移到格末、右键以格末为目标,都不写回,仍是一步撤销。第 3 轮后(组件库 f1771b3,最后一轮,修完不再审查):无外侧竖线的行里清空首格或末格时写回一个竖线(`| | beta`、`alpha | |`),列数不变;插入点照写回的转义文字报出(键入竖线后不再落在多字节字中间);改过一格后右键邻格照常给出目标;长文(后台解析)里改格后 Tab 等到解析完成再打开下一格。 diff --git a/scripts/fetch-references.sh b/scripts/fetch-references.sh index 969ff87..83f6f12 100755 --- a/scripts/fetch-references.sh +++ b/scripts/fetch-references.sh @@ -36,7 +36,7 @@ fetch() { # name url rev [sparse paths...] echo "fetch $name $rev" } -fetch Ely-GPUI-Components https://git.zacharyzhang.com/ZacharyZhang-NY/Ely-GPUI-Components.git 2b6bd1d36951713e61763bcd9572bbd42464dd7d +fetch Ely-GPUI-Components https://git.zacharyzhang.com/ZacharyZhang-NY/Ely-GPUI-Components.git f1771b3880fbea0aae35d5d0a7ecd2b446032906 fetch zed https://github.com/zed-industries/zed.git 1a28cff4b409169bac058bca40dfbfeb7621d19b fetch libreoffice-core https://github.com/LibreOffice/core.git 8221e31b3ac356a1623c672912a3d2b492f7e3d1 \ include/LibreOfficeKit libreofficekit desktop/source/lib desktop/inc \ diff --git a/tasks/TASKS.md b/tasks/TASKS.md index 991359e..5729cd7 100644 --- a/tasks/TASKS.md +++ b/tasks/TASKS.md @@ -259,7 +259,7 @@ ## R6 0.1.5 重发前的修复(用户 2026-10-15 报:ElyMark 点表格整表变成源码;级联菜单斜移到子菜单时被路过的项抢走,七个应用同此;最近列表不能清除。用户定:先删 Gitea 上 v0.1.5 的全部文件,修好后在修复的提交上重打 v0.1.5;单元格编辑显示该格原文) -- [ ] R6.1 ElyMark 表格单元格编辑:可视模式按下表格只打开所按的那一格(单行输入框,显示该格的 Markdown 原文,表格其余照常显示),按格内文字落在所按的字,按格内空白落在格末;写回为一步撤销,格内键入的 `|` 写回时转义;Tab、Shift+Tab 到下一格、上一格;Esc 与失焦写回(组件库 `MarkdownDocument`) +- [x] R6.1 ElyMark 表格单元格编辑:可视模式按下表格只打开所按的那一格(单行输入框,显示该格的 Markdown 原文,表格其余照常显示),按格内文字落在所按的字,按格内空白落在格末;写回为一步撤销,格内键入的 `|` 写回时转义;Tab、Shift+Tab 到下一格、上一格;Esc 与失焦写回(组件库 `MarkdownDocument`) - [ ] R6.2 级联菜单的悬停意图(`menus` 的 `ContextMenu`、`MenuBar` 共用的面板):菜单面板挡住其下的元素(原先子菜单盖在父菜单上时,父菜单被盖住的行照收悬停,“底层”的项弹出自己的子菜单);子菜单右侧放不下即开在父菜单左侧,不盖父菜单;悬停子菜单项延时打开;指针在“当前位置与子菜单上下两角”的三角区内移动时不切换路过的项,停下超过延时才切换 - [ ] R6.3 ElyMark 侧栏清除最近列表:核对 98692cb 已做到(文件页能清空最近列表),随本次发布 - [ ] R6.4 重发 0.1.5:删去 v0.1.5 的标签与发布,在修复的提交上重打;Windows、WSL2 的 Linux、Mac mini 本机建(签名、公证)并上传;本机装上 diff --git a/tasks/reviews/R6.1-r3.md b/tasks/reviews/R6.1-r3.md new file mode 100644 index 0000000..a213f70 --- /dev/null +++ b/tasks/reviews/R6.1-r3.md @@ -0,0 +1,9 @@ +FAIL + +1. `reference/Ely-GPUI-Components/src/documents/document/mod.rs:249` — [P1] `text()` now escapes a cell's typed pipes, but `caret()` still indexes that result with the raw input offset (`document/place.rs:28`). In `| alpha | beta |\n| --- | --- |\n| c | d |\n`, replace `alpha` with `|中` and leave the cell open: reading the caret panics because byte 6 lies inside `中`. ElyMark's ten-second session persistence calls this through `MarkView::place`, so ordinary cell input can crash the application. ASCII text after a pipe also reports the wrong column. Map the caret through the same escaping transformation as the snapshot and commit; add Unicode and ASCII caret regressions. Both `review_r3_caret_after_pipe_*` probes fail in `.work/R6.1-r3/probes-verified.log`. + +2. `reference/Ely-GPUI-Components/src/documents/document/edit.rs:238` — [P2] Replacing only a cell's content does not preserve empty edge cells when the row omits outer pipes. Open `alpha | beta\n--- | ---\nc | d\n`, select all of `alpha`, delete it and press Esc: the header becomes ` | beta`, which has one cell, and the entire table becomes a paragraph. Clearing `beta` also destroys the table; clearing `c` moves `d` into the first column. This changes neighboring structure rather than just the edited cell (R6.1, PRD §14.3). Preserve the required row delimiters when an edge cell becomes empty, keeping snapshot and commit consistent and undo atomic. The three `review_r3_clear_bare_*` probes fail in `.work/R6.1-r3/probes-verified.log`. + +3. `reference/Ely-GPUI-Components/src/documents/document/point.rs:190` — [P2] Right-clicking another cell after typing commits the active cell, then discards the press because the whole table differs from its pre-commit drawing. Open `alpha` in `| alpha | beta |\n| --- | --- |\n| c | d |\n`, append `X`, then right-click `beta`'s padding: no `DocumentEvent::Pointed` is emitted, so ElyMark shows no context menu (MARK-16). Resolve the pressed cell against the committed table instead of rejecting every change elsewhere in that table, and add the dirty-neighbor regression. `review_r3_right_click_neighbor_after_edit` fails while the no-edit control passes in `.work/R6.1-r3/probes-verified.log`. + +4. `reference/Ely-GPUI-Components/src/documents/document/lists.rs:241` — [P2] Cell navigation loses its destination when committing starts an asynchronous parse. Put the table from entry 3 at the start of a document followed by a fenced block containing 131072 `x` characters. Open `alpha`, type `X`, then press Tab: the edit is committed, but `open()` returns at `edit.rs:80` while parsing, and no cell opens even after parsing finishes. Tab therefore stops working after edits in supported visual documents above 128 KiB. Retain the requested destination and open it once the matching parse completes; cover asynchronous cell navigation. `review_r3_tab_after_edit_in_long_document` fails and its no-edit control passes in `.work/R6.1-r3/long-document.log` and `.work/R6.1-r3/probes-verified.log`.