Uninote
Uninote
用户根目录
brdr
common
programming
docs
后端试题
问题讨论

结论:最适合改为“按仓库保存”的,是界面布局、侧栏/文件树状态和仓库工作上下文;这类数据应保存在本机 userData,以仓库为键,不建议写入仓库内 .mynote 或参与同步。

建议清单

优先级 数据 当前状态 建议
P0 侧栏、编辑区、预览区、大纲是否显示 全局 localStorage,所有仓库共用 按仓库保存
P0 “仓库 / 最近 / 收藏 / 文件”分区折叠状态 全局 localStorage 按仓库保存
P0 文件树展开目录 仅内存,而且切换仓库时没有清理,路径相同的目录可能串状态 按仓库保存并在切换时恢复
P0 是否显示空文件夹 当前混在全局 settings 按仓库保存
P0 文件树是否关联当前页面 当前混在全局 settings 移到文件树设置并按仓库保存
P0 收藏区排序方式 切换仓库时直接重置 按仓库保存
P0 全库搜索内容、大小写/全字选项 当前切换仓库可能保留旧搜索界面 至少切换时隔离;可以按仓库恢复查询和选项
P1 侧栏宽度、编辑/预览比例、大纲宽高 已按仓库记录在本机 UI 状态 已完成
P1 文件树当前选中项、滚动位置 已按仓库记录;文件树关联当前标签开启时仍以当前标签为准 已完成
P1 编辑器光标、选区、编辑区/预览区滚动位置 已随仓库会话、按文档记录 已完成
P2 仓库导航前进/后退历史 切换仓库时明确清空 可选;如果需要长期工作上下文再加入
P2 当前文件查找内容及选项 主要跟随编辑器页面内存 可随仓库会话或标签保存

对应代码位置:

有两个值得优先处理的现状:

  • expandedDirectories 使用仓库相对路径作为键,直接切换仓库时没有清空;两个仓库都有 docs/ 时,展开状态可能相互影响。
  • 全库搜索只在“清空仓库”时清理,直接从仓库 A 切到 B 时,旧查询或旧结果可能暂时留在界面上。

已经按仓库记录的数据

这些目前基本符合预期:

  • 已打开标签、活动标签、标签顺序、最近访问顺序、预览/固定状态、未保存正文:按仓库路径哈希保存恢复文件。recovery-store.jsstore.mjs
  • 最近文件、文件收藏、大纲收藏:虽然放在应用的 workspace-state.json,但内部已经按仓库根路径分组。workspace-state-store.js
  • 切换仓库后继续同步、安全自动同步:已经按仓库记录。
  • 仓库身份、同步基线、同步队列、托管路径和大纲索引:已经保存在仓库 .mynote 中。local.jsmanaged-path-store.jsoutline-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.jsonlayout 字段中。
  • 文件树的当前选中项和滚动位置已经按仓库恢复;启用“文件树关联当前页面”时,活动标签仍会覆盖该选中项并自动定位,保持原有交互。
  • 每个已恢复文档的光标、选区、编辑区横纵滚动位置、预览滚动位置和上次聚焦窗格,已经随仓库会话写入 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

preview-editor

测试

点赞(0) 阅读(1) 举报
目录
标题