结论:最适合改为“按仓库保存”的,是界面布局、侧栏/文件树状态和仓库工作上下文;这类数据应保存在本机 userData,以仓库为键,不建议写入仓库内 .mynote 或参与同步。
当前状态与后续建议
| 优先级 | 数据 | 当前状态 | 建议 |
|---|---|---|---|
| P0 | 侧栏、编辑区、预览区、大纲是否显示 | 已按仓库记录在本机 UI 状态 | 已完成 |
| P0 | “仓库 / 最近 / 收藏 / 文件”分区折叠状态 | 已按仓库记录在本机 UI 状态 | 已完成 |
| P0 | 文件树展开目录 | 切换时清理旧状态并恢复目标仓库目录 | 已完成 |
| P0 | 是否显示空文件夹 | 已按仓库记录在本机 UI 状态 | 已完成 |
| P0 | 文件树是否关联当前页面 | 文件树标题栏设置入口,按仓库保存 | 已完成 |
| P0 | 收藏区排序方式 | 按仓库恢复三态排序 | 已完成 |
| P0 | 全库搜索内容、大小写/全字选项 | 切换时清除旧结果并恢复目标仓库查询和选项 | 已完成 |
| P1 | 侧栏宽度、编辑/预览比例、大纲宽高 | 已按仓库记录在本机 UI 状态 | 已完成 |
| P1 | 文件树当前选中项、滚动位置 | 已按仓库记录;文件树关联当前标签开启时仍以当前标签为准 | 已完成 |
| P1 | 编辑器光标、选区、编辑区/预览区滚动位置 | 已随仓库会话、按文档记录 | 已完成 |
| P2 | 仓库导航前进/后退历史 | 切换仓库时明确清空 | 可选;如果需要长期工作上下文再加入 |
| P2 | 当前文件查找内容及选项 | 主要跟随编辑器页面内存 | 可随仓库会话或标签保存 |
对应代码位置:
- 面板显示与仓库状态写入:shell.mts
- 面板尺寸采集与恢复:layout.mts
- 侧栏分区折叠状态:sections.mts
- 文件树展开状态与渲染:tree-view.mts,窗口内存状态集中在 state.mts。
- 仓库 UI 状态切换、恢复与收藏排序:workspace.mts
- 全局普通设置:workspace-state-store.ts;仓库 UI 状态校验与持久化:repository-ui-state-store.ts。
原方案重点处理的两个问题现已解决:
expandedDirectories仍使用仓库相对路径,但切换时先清空,再恢复目标仓库的展开目录,避免同名目录串状态。- 全库搜索切换时先清理旧结果,再恢复目标仓库查询;异步结果按仓库校验,避免旧请求覆盖新界面。
已经按仓库记录的数据
这些目前基本符合预期:
- 已打开标签、活动标签、标签顺序、最近访问顺序、预览/固定状态、未保存正文:按仓库路径哈希保存恢复文件。
- 最近文件、文件收藏、大纲收藏:虽然放在应用的
workspace-state.json,但内部已经按仓库根路径分组。workspace-state-store.ts - 切换仓库后继续同步、安全自动同步:已经按仓库记录。
- 仓库身份、同步基线、同步队列、托管路径和大纲索引:已经保存在仓库
.mynote中。
建议继续保持全局的数据
以下更像用户或设备偏好,不宜随仓库变化:
- 编辑器字体大小。
- 单击文件是否启用预览标签。
- 点击大纲后是否聚焦编辑器、导航是否跳转。
- 外部冲突工具路径和参数。
- 快捷键、系统全局热键。
- 同步服务地址、账号凭据、设备身份。
- 全局自动同步间隔。
- 最近仓库列表和上次打开的仓库。
预览面板不再保留单独的全局默认设置:首次打开新仓库时显示预览,之后按仓库恢复上次的实际显示状态。
当前存储模型
本机仓库 UI 状态已经独立保存,不再通过全局 localStorage 保存这些字段:
userData/
├── workspace-state.json # 全局设置、最近仓库
├── repository-ui-state-v1.json # 按仓库保存的界面状态
└── recovery/
└── session-<仓库路径哈希>.json
repository-ui-state-v1.json 按仓库键记录如下状态;下例省略版本及诊断路径等外层元数据:
{
"repositories": {
"<repository-key>": {
"panels": {},
"layout": {},
"sidebarSections": {},
"fileTree": {
"expandedPaths": [],
"selectedPath": null,
"scrollTop": 0,
"showEmptyDirectories": true,
"linkCurrentPage": true
},
"favoriteSortMode": "file",
"workspaceSearch": {
"query": "",
"caseSensitive": false,
"wholeWord": false
}
}
}
}
替换文本不建议持久化,避免重新进入仓库时误操作。UI 状态也不建议放进 .mynote:它属于个人和设备偏好,不应被 Git 提交或同步给其他用户。
P0 实现结果
- P0 项目已经改为按仓库保存:面板显示、侧栏分区折叠、文件树展开目录、空文件夹显示、文件树关联当前页面、收藏排序,以及全库搜索内容和大小写/全字选项。
- 收藏的时间升降序和文件组织状态由同一个三态字段记录;切回文件组织也会立即写入仓库 UI 状态。
- 文件树关联入口已从全局设置对话框移到文件树标题栏的设置菜单;旧的全局
fileTreeLinked字段直接丢弃,不做迁移。 - 切换仓库时先清除旧搜索结果,再恢复目标仓库的查询和选项;异步返回的旧仓库结果不会覆盖新仓库界面。
- 替换文本和替换面板展开状态不持久化。
- 状态文件使用规范化仓库绝对路径的 SHA-256 作为仓库键,并在记录中保留规范化路径用于诊断。
- 移除失效仓库或当前仓库时,同时删除对应的仓库 UI 状态。
- 旧版全局面板、侧栏分区和空文件夹偏好会一次性迁移到升级后首次打开的仓库;写入成功后清除旧
localStorage键并记录迁移完成标记。 - Windows 当前用户的最终存储路径为
C:\Users\Administrator\AppData\Roaming\mynote-client\repository-ui-state-v1.json。 - 通用存储位置为 Electron
app.getPath('userData')/repository-ui-state-v1.json;该文件在首次打开仓库或首次修改仓库 UI 状态时创建。 - 应用保存的 JSON 文档统一使用两空格缩进和末尾 LF,便于直接查看;逐行诊断日志仍保持每行一条紧凑 JSON 记录。
P1 实现结果
- 侧栏宽度、编辑/预览比例和大纲在宽屏/窄屏时的宽高,已经按仓库记录在
repository-ui-state-v1.json的layout字段中。 - 文件树的当前选中项和滚动位置已经按仓库恢复;启用“文件树关联当前页面”时,活动标签仍会覆盖该选中项并自动定位,保持原有交互。
- 每个已恢复文档的光标、选区、编辑区横纵滚动位置、预览滚动位置和上次聚焦窗格,已经随仓库会话写入
recovery/session-<仓库路径哈希>.json。 - 旧版全局面板尺寸会一次性迁移到升级后首次打开的仓库;迁移成功后移除
mynote.panel-layout.v1,后续仓库从各自默认布局开始。 - Windows 当前用户的仓库 UI 状态路径仍为
C:\Users\Administrator\AppData\Roaming\mynote-client\repository-ui-state-v1.json;- 会话文件位于
C:\Users\Administrator\AppData\Roaming\mynote-client\recovery\session-<仓库路径哈希>.json。
- 会话文件位于
