R6.3 done: round 3 fix, hard links join the recent list
An explicit open checks the session registry by file identity, so a hard link to a shown file joins the list. Ticked after round 3. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
030ecfcff6
commit
39ff567226
5 files changed
+13
-9
No files matched your search
@@ -298,3 +298,4 @@ cargo run -p ely-doc 启动一个应用(ElyDoc 先 cargo build -p ely
|
||||
- 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 与按邻格照常;开着的格的空白处左键把插入点移到格末、右键以格末为目标,都不写回,仍是一步撤销。第 3 轮后(组件库 f1771b3,最后一轮,修完不再审查):无外侧竖线的行里清空首格或末格时写回一个竖线(`| | beta`、`alpha | |`),列数不变;插入点照写回的转义文字报出(键入竖线后不再落在多字节字中间);改过一格后右键邻格照常给出目标;长文(后台解析)里改格后 Tab 等到解析完成再打开下一格。
|
||||
- 2026-10-15(用户报:二级菜单选不到,往子菜单移动时经过下面的项会弹出它们的子菜单,七个应用都如此;用户定照桌面系统的悬停意图做:安全三角加打开与关闭的延时):级联菜单(R6.2,组件库 d4fdb69,`ContextMenu`、`DropdownMenu`、`MenuBar` 共用的面板)。菜单面板挡住其下的元素(原先子菜单被挤回、盖在父菜单上时,被盖住的父菜单行照收悬停);子菜单右侧放不下且左侧放得下即开在所在行的左侧,从右滑入,不盖父菜单的行(两侧都放不下时贴窗口边,仍被面板挡住);指针停在有子菜单的行上 150 毫秒才打开;子菜单开着时,指针落在“上一位置与子菜单近侧上下两角”构成的三角形里的另一行,等 300 毫秒,指针仍在该行才切换,其间到达子菜单即作废;三角形外的行即刻标记。键盘与按下照旧即刻打开。实现在组件 `menus::aim`。第 1 轮后(组件库 5a53c08):指针离开一行(到边距、分隔线、禁用的行或菜单外)即作废其延时,回到该行重新计时;菜单在别处重开即忘掉旧的悬停;图标按钮行同样受三角形保护。
|
||||
- 2026-10-15(用户报:ElyMark 的最近列表清不掉):侧栏“清除最近文件”(R6.3,98692cb)写空 `recent.json`(`ely_files::recent::clear`),失败即提示。会话恢复的标签不把文件加回列表(`Desk::remembered` 预先记下),清空在重启后照旧;显式打开照样加入,已开着的文件(按文件身份,含硬链接,`Sessions::is_open`)只切到该标签,也加入列表。
|
||||
@@ -17,7 +17,7 @@ impl Desk {
|
||||
return self.open_folder(path, cx);
|
||||
}
|
||||
// A shown file only takes focus; the list still learns.
|
||||
let shown = self.tab_of(&path).is_some();
|
||||
let shown = self.core.sessions.is_open(&path).unwrap_or(false);
|
||||
self.open_file(path.clone(), cx);
|
||||
if shown {
|
||||
self.remember(&path, cx);
|
||||
|
||||
@@ -472,19 +472,19 @@ mod window {
|
||||
assert!(desk.read_with(cx, |desk, _| desk.recent.is_empty()));
|
||||
let list = data.path().join("recent.json");
|
||||
assert_eq!(std::fs::read_to_string(&list).expect("the list"), "[]");
|
||||
// Explicit opens still join it, the restored file too.
|
||||
// Explicit opens still join it: the restored file, a link.
|
||||
let alias = files.path().join("alias.md");
|
||||
std::fs::hard_link(&a, &alias).expect("a hard link");
|
||||
open(&desk, &a, cx);
|
||||
open(&desk, &alias, cx);
|
||||
open(&desk, &b, cx);
|
||||
assert_eq!(names(&desk, cx), ["a.md", "b.md"]);
|
||||
let real = |path: &std::path::Path| dunce::canonicalize(path).expect("real");
|
||||
let (a, b) = (real(&a), real(&b));
|
||||
assert_eq!(
|
||||
desk.read_with(cx, |desk, _| desk.recent.clone()),
|
||||
[b.clone(), a.clone()]
|
||||
);
|
||||
let want = [real(&b), real(&alias), real(&a)];
|
||||
assert_eq!(desk.read_with(cx, |desk, _| desk.recent.clone()), want);
|
||||
let kept: Vec<std::path::PathBuf> =
|
||||
serde_json::from_str(&std::fs::read_to_string(&list).expect("the list"))
|
||||
.expect("a list");
|
||||
assert_eq!(kept, [b, a]);
|
||||
assert_eq!(kept, want);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -261,5 +261,5 @@
|
||||
|
||||
- [x] R6.1 ElyMark 表格单元格编辑:可视模式按下表格只打开所按的那一格(单行输入框,显示该格的 Markdown 原文,表格其余照常显示),按格内文字落在所按的字,按格内空白落在格末;写回为一步撤销,格内键入的 `|` 写回时转义;Tab、Shift+Tab 到下一格、上一格;Esc 与失焦写回(组件库 `MarkdownDocument`)
|
||||
- [x] R6.2 级联菜单的悬停意图(`menus` 的 `ContextMenu`、`MenuBar` 共用的面板):菜单面板挡住其下的元素(原先子菜单盖在父菜单上时,父菜单被盖住的行照收悬停,“底层”的项弹出自己的子菜单);子菜单右侧放不下即开在父菜单左侧,不盖父菜单;悬停子菜单项延时打开;指针在“当前位置与子菜单上下两角”的三角区内移动时不切换路过的项,停下超过延时才切换
|
||||
- [ ] R6.3 ElyMark 侧栏清除最近列表:核对 98692cb 已做到(文件页能清空最近列表),随本次发布
|
||||
- [x] R6.3 ElyMark 侧栏清除最近列表:核对 98692cb 已做到(文件页能清空最近列表),随本次发布;会话恢复的标签不把文件加回列表,显式打开(含已开着的文件与其硬链接)照样加入
|
||||
- [ ] R6.4 重发 0.1.5:删去 v0.1.5 的标签与发布,在修复的提交上重打;Windows、WSL2 的 Linux、Mac mini 本机建(签名、公证)并上传;本机装上
|
||||
@@ -0,0 +1,3 @@
|
||||
FAIL
|
||||
|
||||
- apps/ely-mark/src/places.rs:20 — [P2] Explicitly reopening a restored file through a hard link still leaves recent history empty. Create `original.md` and its hard link `alias.md`, open `original.md`, click **Clear Recent Files**, quit, restart with its tab restored, then choose `alias.md` through Open. `tab_of` compares canonical paths and returns false, whereas the session registry recognizes the file identity and focuses the existing tab; neither path records the explicit open. The sidebar and `recent.json` both remain empty. The GPUI dialog probe reproduced this twice (`.work/R6.3-r3/probes.log`, `.work/R6.3-r3/hardlink-isolated.log`), although all 99 ely-files and 141 ElyMark tests pass and the round-2 same-path case is fixed. Base history updates on the successful open/session result, including identity-based reuse, while retaining suppression for automatic restoration. Add a hard-link reopen regression asserting both displayed and persisted history.
|
||||
Reference in new issue
Block a user