结论:最适合改为“按仓库保存”的,是界面布局、侧栏/文件树状态和仓库工作上下文;这类数据应保存在本机 userData,以仓库为键,不建议写入仓库内 .mynote 或参与同步。
建议清单
| 优先级 | 数据 | 当前状态 | 建议 |
|---|---|---|---|
| P0 | 侧栏、编辑区、预览区、大纲是否显示 | 全局 localStorage,所有仓库共用 |
按仓库保存 |
| P0 | “仓库 / 最近 / 收藏 / 文件”分区折叠状态 | 全局 localStorage |
按仓库保存 |
| P0 | 文件树展开目录 | 仅内存,而且切换仓库时没有清理,路径相同的目录可能串状态 | 按仓库保存并在切换时恢复 |
| P0 | 是否显示空文件夹 | 当前混在全局 settings 中 |
按仓库保存 |
| P0 | 文件树是否关联当前页面 | 当前混在全局 settings 中 |
移到文件树设置并按仓库保存 |
| P0 | 收藏区排序方式 | 切换仓库时直接重置 | 按仓库保存 |
| P0 | 全库搜索内容、大小写/全字选项 | 当前切换仓库可能保留旧搜索界面 | 至少切换时隔离;可以按仓库恢复查询和选项 |
| P1 | 侧栏宽度、编辑/预览比例、大纲宽高 | 已按仓库记录在本机 UI 状态 | 已完成 |
| P1 | 文件树当前选中项、滚动位置 | 已按仓库记录;文件树关联当前标签开启时仍以当前标签为准 | 已完成 |
| P1 | 编辑器光标、选区、编辑区/预览区滚动位置 | 已随仓库会话、按文档记录 | 已完成 |
| P2 | 仓库导航前进/后退历史 | 切换仓库时明确清空 | 可选;如果需要长期工作上下文再加入 |
| P2 | 当前文件查找内容及选项 | 主要跟随编辑器页面内存 | 可随仓库会话或标签保存 |
对应代码位置:
- 面板显示状态目前是单一全局键:shell.js
- 面板尺寸目前也是单一全局键:layout.mjs
- 侧栏分区折叠状态同样全局:sections.mjs
- 文件树展开状态只有一个共享
Set:core.js - 收藏排序在仓库切换时重置:workspace.js
- 所有普通设置当前只有一个全局
settings对象:workspace-state-store.js
有两个值得优先处理的现状:
expandedDirectories使用仓库相对路径作为键,直接切换仓库时没有清空;两个仓库都有docs/时,展开状态可能相互影响。- 全库搜索只在“清空仓库”时清理,直接从仓库 A 切到 B 时,旧查询或旧结果可能暂时留在界面上。
已经按仓库记录的数据
这些目前基本符合预期:
- 已打开标签、活动标签、标签顺序、最近访问顺序、预览/固定状态、未保存正文:按仓库路径哈希保存恢复文件。recovery-store.js、store.mjs
- 最近文件、文件收藏、大纲收藏:虽然放在应用的
workspace-state.json,但内部已经按仓库根路径分组。workspace-state-store.js - 切换仓库后继续同步、安全自动同步:已经按仓库记录。
- 仓库身份、同步基线、同步队列、托管路径和大纲索引:已经保存在仓库
.mynote中。local.js、managed-path-store.js、outline-index-store.js
建议继续保持全局的数据
以下更像用户或设备偏好,不宜随仓库变化:
- 编辑器字体大小。
- 单击文件是否启用预览标签。
- 点击大纲后是否聚焦编辑器、导航是否跳转。
- 外部冲突工具路径和参数。
- 快捷键、系统全局热键。
- 同步服务地址、账号凭据、设备身份。
- 全局自动同步间隔。
- 最近仓库列表和上次打开的仓库。
预览面板不再保留单独的全局默认设置:首次打开新仓库时显示预览,之后按仓库恢复上次的实际显示状态。
推荐存储模型
建议新增独立的本机仓库 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 状态时创建。
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。
