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

详细文档(docs-mynote-client)

dev

misc

ipconfig getifaddr en0 mkcert install mkcert 192.168.0.223 daaijinxiaodeMacBook-Pro-2.local localhost 127.0.0.1 daaijinxiaodeMacBook-Pro-2.local

unset MYNOTE_SYNC_ENCRYPTION_KEY unset MYNOTE_SYNC_TLS_KEY MYNOTE_SYNC_TLS_CERT unset MYNOTE_SYNC_DATA MYNOTE_SYNC_HOST

export MYNOTE_SYNC_SMTP_HOST='smtp.163.com' export MYNOTE_SYNC_SMTP_PORT='465' export MYNOTE_SYNC_SMTP_SECURE='true' export MYNOTE_SYNC_SMTP_USER='cyb.3@163.com' export MYNOTE_SYNC_SMTP_PASS='BLTweRb7kfgE3w5z' export MYNOTE_SYNC_SMTP_FROM='admin cyb.3@163.com'

MYNOTE_SYNC_DEV=1
MYNOTE_SYNC_DATA="$PWD/.sync-data"
MYNOTE_SYNC_HOST="0.0.0.0"
MYNOTE_SYNC_PORT="8787"
MYNOTE_SYNC_TLS_KEY="$PWD/192.168.0.223+3-key.pem"
MYNOTE_SYNC_TLS_CERT="$PWD/192.168.0.223+3.pem"
npm run sync-server

https://192.168.0.223:8787/health

mkcert -CAROOT

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "/Users/daaijinxiao/Library/Application Support/mkcert/rootca.pem"

windows:

  • Import-Certificate -FilePath "E:\uninote\rootCA.pem" -CertStoreLocation Cert:\LocalMachine\Root

admin

cd /Users/daaijinxiao/Desktop/prjs/mynote-client

read -s 'admin_password?设置管理员密码(至少 12 个字符):'
export MYNOTE_ADMIN_PASSWORD_HASH="$(printf '%s' "$admin_password" | node scripts/admin-password-hash.js)"
unset admin_password
export MYNOTE_ADMIN_USERNAME=admin
export MYNOTE_ADMIN_ORIGIN=http://127.0.0.1:5173

# 再启动 server

admin qwer09870987

dev ai log

加一个环境变量控制是否需要强制 HTTPS,默认为 true,可以改为 false。 MYNOTE_SYNC_FORCE_HTTPS=false # 允许非回环 HTTP 局域网联调时,服务端和客户端都需要设置为 false: MYNOTE_SYNC_FORCE_HTTPS=false npm run dev

快捷键 & 热键

详细说明:

  • 快捷键参考

  • keyboard-mvp

  • settings-keyboard

  • 快捷键要精确判断,比如 cmd + f 是搜索,但 shift 再加上就不要触发了

  • Tooltip 的提示,Command/Control 要根据不同的平台显示不同的值

    • codex://threads/01a0a280-de16-7571-861d-1f2763474ba5

允许热键注册失败;热键注册失败不要阻止保存

  • codex://threads/01a10c7f-62b5-7ed3-8f33-e44e359915e8
  • 保存失败:全局热键 Control+Alt+v 注册失败,可能已被系统或其他应用占用
  • 同时任意一个热键注册失败也不要阻止其他热键继续注册。
  • 列表页和修改页都要处理

快捷键配置 keyboard settings

  • 快捷键设置:MVP

  • 精确命令定位配置:Command Palette 命令面板

  • 平台覆盖 默认留空,点击“禁用此平台”,应该是切换 checkbox

    • fix: apply input mode to platform shortcuts df17ca0
  • 按 ESC 或者 Enter 都应该保持上一级页面的聚焦的元素,现在 Esc 会保持,但 Enter 没有保持。

  • 配置对话框保持固定高度

  • 配置快捷键默认采用按键录制方式,但可以切换为手动输入

  • 取消重新录制的按钮,超时或者用户已经输入了两段快捷键,则自动启动重新录制

  • Enter 可作为快捷键,但仅限于第二段;第一段时直接保存当前配置,关闭对话框

编辑 JSON 旁边增加一个按钮:默认 JSon,弹出显示所有的默认快捷键 Json 配置,供用户查看、复制

  • 将中文描述文案也带上
  • 支持定位文件(系统自带的 explorer/finder 打开)
  • appdata/User/keybindings.json
  • 外部编辑会立即加载并重新卸载、注册

热键也支持可配置。

  • 查看平台旁边加一个checkbox:启用热键,取消选择后注销所有的热键
  • 快捷键、热键分开配置,通过一个radio box切换,再在 快捷键设置 旁边加一个 热键设置 入口

过滤的内容如果被 "" 包裹,则只与快捷键匹配,如 "ctrl d"

  • codex://threads/01a0cc4a-d23f-7d50-a166-f49247182f4c ef9963c

过滤支持拼音搜索 codex://threads/01a0d1a3-323f-70a1-bed9-525afa1105e6

优化

快捷键设置:

  • codex://threads/01a0fcac-73d8-7be1-a8ea-87c3e93b0dc8
  • 允许仅设置特定平台的。
  • 再加一个 ctrl、cmd 自动转换的辅助按钮(在切换为手动输入旁边):如果当前是 Windows 平台,则将用户输入的 Control 转为 Command 填入到 mac 平台快捷键;如果是 Mac 平台则将 Command 转为 Control 填入到 Windows 平台快捷键。
  • 编辑、add等按钮快捷键
  • 为列表的第一条记录的按钮绑定快捷键:
  • 修改:alt+e, 删除: alt+d, 添加: alt+a, 恢复默认: alt+r
  • 要能够快捷键连续操作,不能失去焦点

chord 单字符输入法问题

cmd + k t 这种快捷键,当输入法开启时,第二部分会被输入法拦截

热键、快捷键分离

  • codex://threads/01a1200d-7c55-7060-8039-3cc364a65caf
  • codex://threads/01a12334-abef-7cb2-a49d-cd8b8e2ad9df
  • 将热键和快捷键分开,配置中心编辑 json 时也根据当前的选择做区分。
  • 热键用户配置改为存到 User\hotkeybindings.json
  • 不兼容老版本

编辑 & 预览 & 大纲

详细说明:功能说明 FEATURES §3

预览页面的搜索框,当焦点没有在搜索框时, Esc 也要能够关闭搜索框。

编辑器:支持 tab 输入

ctrl + g: 跳转行号

没有修改时,修改标记应该清除? 不是简单的看 undo buffer

ctrl + ↑↓ 滚动视图,但不移动caret

  • 每次滚动一行,长按连续滚动,光标和选区保持不变。
  • scroll with ctrl arrows without moving caret 0382c88

基础编辑

  • 剪切复制等要可撤销
  • ctrl + x 没有任何选择时,剪切当前行;ctrl + c 复制行
  • 包含图片的文本要跟随调整路径

编辑高亮

  • 当前行高亮 Commit: 5584087e48a9726b8d1b66c12a07a84dff715e53 feat: highlight active editor line

  • 高亮 caret 归属的文档范围:比如当 caret 在 aaaa 上时,先找到其所归属的大纲 #a,然后将整个这一范围全部高亮。再比如,当 caret 在 b1 上时,先找到其归属的大纲节点 ##b1(而不是 #b),再把整个范围高亮 bb93164

# a
aaaa
# b
bbb
## b1
b1b1

语法高亮 围栏代码块 fenced code block

编辑器 12583cc codex://threads/01a09b42-dbc0-73a0-9f80-dfb52acd933e

  • 1-6级标题
  • 各种语法高亮

预览也支持

  • 5dc94ae codex://threads/01a09b4f-dfac-7003-a0a4-ccacca060022
  • 预览界面也要支持各种语言的语法高亮
    • 展示语言类型,并提供一个复制按钮
    • codex://threads/01a09f00-9de8-7b60-b91b-2b21360cb09b

编辑器支持右键菜单

  • codex://threads/01a0eaf1-057a-76e2-9e84-3364693516d6

资源清理

  • codex://threads/01a10b82-3e86-79e0-8eb0-ec00151838da
  • 添加右键菜单,清理对应资源:将选中的内容对应的所有图片、音频等资源删除
  • 没有选择时清理全部
  • 都要弹窗确认,复用文件树的回收站删除方式

图片复制

  • codex://threads/01a10721-a1c1-7330-94be-f65ab6d0a863
  • 编辑器检测到当前 caret 所处的位置是图片时,右键菜单可以复制当前图片到剪贴板
  • 也可以直接使用 Control/Command+c 复制。
  • 预览页面支持右键菜单复制

HTML paste, 当我从 VS Code 这种 IDE 编辑器里面复制代码过来时,也会识别成 HTML,有什么办法可以屏蔽这种情况吗?

  • codex://threads/01a105db-9399-73d3-ba80-aee8ca1605f4
  // VS Code supplies syntax-highlighted HTML alongside the original source.
  // Let CodeMirror paste the plain text, preserving indentation and Markdown
  // syntax. Checking the format needs no metadata parsing; without source text,
  // retain the normal HTML/image fallback rather than discard the clipboard.
  if (Array.from(event.clipboardData?.types || []).includes('vscode-editor-data')
    && event.clipboardData.getData('text/plain')) return;

html paste 提示优化

  • 用户在每次粘贴时检查用户的配置,默认提示
  • 提示显示用 toast 提示:当前文本包含 HTML 格式,会尝试自动转为 Markdown 格式(文案需要润色下)。然后用户点击 Toast 或者 Toast 下面的查看更多按钮,显示一个确认对话框。对话框的选项有:不再提示,继续提示 再增加一个选项,转到设置。点击之后跳转设置界面,可以对该选选项进行配置,默认是启用。
  • 这里当检测到除了默认的 txt、 html 类型,还包括其他类型,比如说这种 vscode-editor-data 的,则在提示框里面追加一个选项,"vscode-editor-data"类型不转换,如果有多个,则显示多个按钮;点击之后将这个配置追加到不转换的过滤配置里面, “vscode-editor-data”作为所有用户的默认配置,在配置界面可设置
  • if (Array.from(event.clipboardData?.types || []).includes('vscode-editor-data')
  • 默认包含 vscode-editor-data 这句提示不要
  • 再加一个选项:禁用转换

选择操作

  • 选中文本块处理,一, Tab 键缩进两空格, Shift Tab 键反向缩进两空格,2,转换为列表,在每一行的前面添加'- '。
  • 有选择并且聚焦时,esc键取消选择

列表切换 toggle list

  • 在edit菜单中加一个入口、显示快捷键
  • 如果没有选择,则将当前行切换;cmd palette 总是展示

fenced code 围栏包裹

  • codex://threads/01a0c826-f6c1-7a21-b9c2-a584bb3e1b6c
  • 菜单支持

悬浮工具条,加入常用编辑操作 float toolbar

  • codex://threads/01a0cc19-b4bb-7c91-8ace-a78fe4ccfb29
  • 支持现有链接解析、编辑回显
  • 3. Markdown 编辑与预览
  • 顶部时避免遮挡标签 codex://threads/01a0fc9e-6412-71c3-910c-dd2bcf80474a

错别字、润色、标点 语音输入

  • codex://threads/01a0eaee-b926-7052-b0ef-e4ba2a35b784
  • 调用ai,修改输入法的错误?
  • 修改错别字: 入口编辑菜单/命令面板,触发后将用户选择的文本调用deepseek进行错别字修改.
  • propmt 也独立出来,便于调整
  • 增加一段提示词:加入必要的标点符号
  • 修改后显示一个弹窗,用差异比较组件来比较两个文本的差异,也是逐行比较,并且支持行内差异高亮。如果没有任何修改,则直接toast提示,不用弹窗。

视图切换 编辑-预览 三态切换 三段式控件

  • codex://threads/01a09f39-355d-7462-b415-f8108caab2ac

宽度调整、比列记录

当编辑和预览任意只显示其中一个界面时,则宽度调整为占据另外一个隐藏的界面。

  • expand lone editor or preview panel bcfdcc83
  • 恢复双界面时保留原分栏比例。

编辑、预览记录比列;侧栏、大纲记录绝对值

样式

编辑器:鼠标放滚动条时,没有变成常规的形状,还是编辑的插入形状 3e5e1d3

同步滚动

  • 编辑器和预览页面的同步滚动相差较大,当关闭编辑器后,预览界面的定位就正常了
  • 50b632b 预览从隐藏状态恢复时,立即按编辑区当前位置同步滚动。

仅显示预览页面时也支持大纲定位

Commit: 400e1ce06761978756425c717aff477cde31b691 fix: align editor and preview scrolling

Commit: 810013527b342b716b932fa40759e0a3335a9122 fix: keep outline jumps aligned

大纲高亮,同步滚动

当大纲的高亮不在视图内时,滚动到视图内 71e1729

  • 滚动到中间 codex://threads/01a0cdbe-f342-70d1-8414-0b764eaad991

大纲跟随,双向,根据焦点区分编辑或者预览 6af2a92

页面内搜索 && 高亮

3.4 页面内查找

编辑、预览:搜索匹配要全部高亮,当前匹配独立高亮

  • blur 保持高亮

类似 vscode 的 Commit: 5a2432aa687c76fc36923408b487b65c89894835

  • zoom
  • 同时支持水平、垂直滚动
  • esc 关闭;焦点在编辑器内即可

当预览页搜索框显示并有搜索结果时,在编辑界面任意修改,编辑页和预览页都会滚动到顶部。 3b06672

  • 所搜结果实时刷新不要滚动

f3 在没有打开搜索框时也要响应

  • caret 位置改变后,再次点击 F3,要根据最新的位置计算下一个。
  • codex://threads/01a0bc9d-52a5-77c0-9e5f-5ef2b1879200

编辑器搜索:如果上下一个匹配已经在视图中了,就不要滚动视图了

  • codex://threads/01a0bcca-f3d9-7592-8d41-8896698947aa
  • TODO: 编辑器搜索:如果改变搜索条件后,当前匹配已经在视图中了,就不要滚动视图了
    • codex://threads/01a0fd2d-5fb3-7fe0-b15d-4e7d93ed328a

codex://threads/01a0f4f0-fa1d-7ec0-9fd4-444b1f09e84d

  • 每次重新聚焦页内搜索框,要重新根据 caret 的位置重新计算当前匹配的 index。
  • 搜索框文本变化时,也是根据当前位置重新计算,不要回到第一个。

页面内替换

实现:replace in current file b7b0be1

  • 支持替换当前匹配及全部匹配
  • 复用大小写、全字匹配选项
  • 替换内容按字面量处理
  • Windows/Linux:Ctrl+H
  • macOS:Cmd+Option+F
  • 预览模式触发时自动显示编辑区

other

  • tab order 调整:从 src 直接跳转到 替换内容,再按 tab,才跳转到 查找选项
  • 焦点在替换为输入框时,回车执行一次替换后焦点要保持在此输入框。
  • 全部替换快捷键:win:ctrl alt enter,mac:cmd enter

显示行号

Commit: 8a8353f617ec397f8bb1f147492da1372cce2569

链接跳转

  • 编辑器内部跳转
  • 预览页面跳转
  • Ctrl 加鼠标hover,如果是链接时, cursor 需要设置 dfeb6e9
  • Alt + E 作为此打开链接(如果当前 caret 处于链接)的快捷键。 dfeb6e9

链接跳转失败,弹出对话框,点击确定后, caret 丢失。无法继续编辑。

  • see window.alert window.confirm 等全部用替换

预览时,链接跳转没有跳到对应的标题

  • codex://threads/01a0d1e4-9cde-7d83-afb4-3d5d9fbf291c

codex:// 链接跳转

识别这种链接,跳转codex,相当于,eg:windows 直接在运行中输入执行

chrome://

识别 chrome 链接并打开,chrome://extensions/?id=jlalnhjkfiogoeonamcnngdndjbneina 参考 codex

  • chrome 限制,不行

Link to mirror:链接本地映射

  • doc-crawler
  • codex://threads/01a0c4fe-3889-79e2-86c5-e18d99c95fb4
  • 默认情况下,如果一个链接经过计算之后存在本地文件,则跳转到本地文件
  • 需要配置一个 host,这个 host 配置到 .mynote 下 config 文件,这个文件的格式参考 .git 下面的 config。eg:
[mirror]
  host = https://react.dev/learn
  • 配置细节

  • 编辑和预览的情况下,都通过 shift 键抑制这种映射。比如在编辑界面, Ctrl + Shift + 点击链接,都不做映射,直接进行原始链接跳转。

  • 快捷键的情况下怎么处理?需要新增一个快捷键

back、forward navigation 前后导航

feat: add editor navigation history 077e5c0

  • 1、主菜单中加一个go,将这两个命令放其下面
  • 2、点击大纲的跳转也应该加入历史

收藏、前后导航的 location 的行号都要动态计算,避免编辑造成的位置偏移 61d01bb

通过 quick open 大纲跳转的,alt + ← 返回位置不对,通过大纲面板点击跳转的是对的

  • codex://threads/01a0ca07-0ddf-76a1-a14d-3a748c738744

caret 位置下方显示输入法的状态,跟随 caret。可配置,默认false

  • codex://threads/01a0ad89-03bc-7650-b27a-99fe8dcce80c
  • TODO: 兼容其他平台

html paste

/Users/daaijinxiao/Desktop/prjs/pjkit/tools/doc-crawler/doc-crawler.js 参考这个文件实现:当编辑器粘贴时,如果发现时html格式,则转为markdown格式

  • codex://threads/01a0fd3e-6529-7540-a44a-7416ce7d75c5
  • 增加粘贴为纯文本右键菜单
  • 图片下载到了项目外了? docs/html-paste.md:
  • 增加下载外部图片右键菜单,尝试将外部的图片下载,最终给出结果提示。
    • 要有进度提示
    • 可以手动终止

录音与语音附件支持

  • codex://threads/01a10a3f-6ced-7951-ad35-68ca172dee3e
  • 录音

语音转文字批量转换

大纲

大纲搜索

see quick open & 搜索匹配算法

仅收藏中搜索 @! 495db9b

cache and search document outlines e5f2dd8

大纲数据缓存 & 搜索

  • 保存到 .mynote
  • 修改时更新
  • 同时需要记录索引数据对应的文件的修改时间,因为文件可以在外部被修改。每次启动 APP 后,检查是否有外部修改,如果有则更新索引数据。
  • 可以手动触发全部更新
  • 同时需要记录索引数据对应的文件的修改时间,因为文件可以在外部被修改。每次启动 APP 后,检查是否有外部修改,如果有,则更新索引数据。
  • 大纲查询,复用 Quick Open 界面,如果以 @ 开头则在全部的索引数据中搜索;如果以 @@ 开头则在当前文件的大纲数据中搜索。
  • 拼音搜索支持
  • 搜索时匹配的字符高亮

在大纲搜索的过程当中,后台会刷新索引?导致当前选择的项被重置到第一个。

搜索(全文、当前文件)支持全字匹配、大小写敏感选项

大纲的条目带上大纲的级别。比如一级大纲不加空格,二级大纲加两个空格。以此类推 d4791cc

整体提升、降低级别

  • 处理目标为用户选择的整行,如果用户选择的不是整行,则扩展为整行。
  • 将每个大纲节点提升或者降低一级。但要保证原有的级别嵌套关系,如原有的 A 是一级, B 是二级则不能执行整体提升级别。同理最低级别为六级,当 A 为五级, B 为六级,也也不能整体降低级别。
  • 已实现整行扩展及大纲级别整体升降,遇到一级/六级标题时整批阻止;支持 ATX、Setext,并忽略代码围栏。
  • codex://threads/01a0c946-8216-7611-8848-8a826ff3b00f
  • editor.promoteHeadingLevels
  • editor.demoteHeadingLevels
  • 编辑菜单入口

大纲面板功能

  • codex://threads/01a0ce7e-7f42-7551-abbe-aaf640e0c8cd

顶部增加

  • 全部折叠、全部展开
  • 再加一个过滤框,用户可以输入过滤字符串。同样支持拼音过滤
    • 支持记录历史。参见搜索部分
  • 支持命令面板

复制大纲

  • 复制为 Markdown 格式,复制完整的大纲内容,以 Markdown 格式复制到剪贴板;复制纯文本格式,以纯文本格式复制大纲用缩进表示级别。

大纲树操作

  • 大纲同样支持手动折叠、展开
  • 焦点在大纲时,ctrl/cmd + f 定位到大纲过滤框

new

  • codex://threads/01a0d7d0-70e2-73e1-8186-55cf53522424
  • 1、双击文本也切换折叠展开状态
  • 2、将文件名作为根节点
  • 3、新增功能:递归折叠、展开
  • 折叠展开后大纲不要滚动到底部
  • 也支持命令面板

cross reference 交叉引用 & 复制引用(大纲)

  • cross-ref.md
  • 链接跳转
  • 在 Quick Open 快捷插入引用
  • E:\codex\codex-sessions\2026\09\10\rollout-2026-09-10T08-20-06-01a088af-a0e2-7db0-9503-3ca9661e2899.md
  • 74ba7c2 feat: expand repository reference copying
  • 5cc539f feat: copy outline links with navigation history
  • 标题失效也检查:批量检查当前仓库的 broken links 失效链接
  • 快捷键改为 ctrl/cmd alt c
  • 左侧树菜单页的上下文菜单也加入。如果当前选择的文件没有打开,则退化为只复制文件的引用,
  • 复制引用:仅复制文件引用,不带大纲。
  • 如果大纲是中文,不要用 URL 编码转义 codex://threads/01a09f3c-9dbf-7f92-b81b-9932b8a26a2e

引用查找

引用、搜索结果的逐项遍历

codex://threads/01a0c835-81dd-77e2-86d2-2bd382c6a884

  • Shift+F12 查找光标所属标题的引用;没有所属标题或文件未打开时,回退为文件引用查找。标题归属沿用“复制引用(大纲)”规则。
  • 新增 workspace.findFileReferences、workspace.findHeadingReferences 命令;未保存的新文档、仓库外文件、文件夹和搜索结果不提供目标查找命令。

收藏

云同步

扩展当前的收藏,现在是收藏文件,加入大纲收藏,收藏的展示为比如说 A 文件下收藏了 A1 A2 A3 三个大纲,则将 A1 A2 A3 展示到 A 下面。并记录下收藏时间。默认情况下按文件组织收藏,如果切换为按时间排序就可以按时间升序或者降序排序,第一次点击按时间排序的按钮时,按时间降序。第二次按时间升序,再次点击恢复到按文件组织。

  • 大纲收藏
  • 文件阻止 & 时间排序
  • 大纲收藏:同时支持命令面板、大纲右键菜单,快捷键:alt f,触发后切换收藏
    • 大纲栏触发的收藏有时会导致滚动条滚动

收藏按时间展示时,文件路径和修改时间显示到第二行。 52c114a

  • codex://threads/01a08fe0-8a59-7501-b023-47e9bc261891

收藏整理

  • 失效后点击时 fallback to 行号
  • 整理:出给全部的失效列表,每个给出根据最新的文档重新计算的 大纲 title,再给出两个选择:更新 title,取消收藏。
    • 可以全选批量操作。
  • 编辑高亮 查找最近的大纲算法
  • codex://threads/01a0be5e-b550-7272-8323-64df67491656
  • codex://threads/01a0be96-44f3-72e3-9fdd-1a9c9a286612
  • 每次点击整理时,精确匹配的都要更新最新的行号并存储(这样一旦失效,偏差不会太远)
  • 列表支持双击跳转;整理按钮支持命令面板

与 .git 共存

先 clone 再移动 .mynote 到 .git 同级目录

相关:阶段 2 桌面笔记库设计与验证

同步

详细文档:同步流程与代码位置、托管同步 Beta

  • 同步过程输出进度
  • 重新登录后不会全部重新拉取,状态要能够全部立即从本地恢复
  • 与上一版本相比,正文内容无变化。这种应该忽略,不要增加一个版本 9915d64

同步中心

  • 打开同步中心 alt + s

状态简要

待处理:1 这个改为 待推送/待拉取:x/y,当x/y 任意一个不为0时,高亮显示

  • 蓝色高亮条目表示待拉取(同步到本地)的版本 - 从这里就能得到待拉取的数量

同步中心:远端游标等状态不是远端最新的,需要刷新

  • codex://threads/01a0ba4c-5ae4-7983-b834-1df45c598e33

再次打开时恢复上次滚动的位置

b342efe codex://threads/01a09459-94f5-7491-9fc2-d49b6d6cb775

模块点击滚动到顶部

点击远端仓库等任何一个模块,就将这个模块滚动到顶部,便于查看内容。诊断日志模块因此不再需要折叠展开

  • 限制在只有点击任意模块的标题部分,点击模块内部不要滚动。

Commit: 6e465b8e7a5bfc540dc7cf0ede824705e0e1cac3 feat: scroll sync modules into view

auto-merge 自动合并

f684639c88b3a0f039da4b2f0ca5cd2f62971a99

就在当前文件旁边生成,如 a.md.base, a.md.local, ..., 如果成功合并,则删除这些临时文件;否则保留这些临时文件。其中任何一个特殊文件存在,则在文件树中以特定标记提示用户,用户手动解决完冲突之后可以在右键菜单中选择解决完成,自动帮用户删除这些临时文件。其他按此计划执行

只合并最终版本

保持 protocolVersion: 1,但不兼容旧分页 v1。
服务端一次返回 cursor 后每个 fileId 的最终版本。
中间版本仍保留在版本历史中。
客户端基于共同基线只执行一次三方合并。
整批成功后一次性推进 cursor,支持中断重试和路径互换。
新客户端会拒绝旧分页 v1 响应。
.mynoteignore 继续遵循“只影响新文件”的规则。

Commit: 4c14c9af63ec0adaaa151a525329015bd2574a55 feat: compact v1 sync pull snapshots

外部工具解决冲突:beyond compare

增加一个右键菜单:外部工具解决冲突,在设置界面设置外部工具路径以及参数, 如:/Applications/Beyond Compare.app/Contents/MacOS/BCompare %local %remote %base %merged,其中 %是占位符,分别传入对应的文件路径,启动外部程序合并

参数例子:"/Applications/Beyond Compare.app/Contents/MacOS/BCompare" /Users/daaijinxiao/Desktop/cyb/r1/2.md.local /Users/daaijinxiao/Desktop/cyb/r1/2.md.remote /Users/daaijinxiao/Desktop/cyb/r1/2.md.base /Users/daaijinxiao/Desktop/cyb/r1/2.md

beyond compare 启动了,但并没有进入合并界面,而是起始页面:要用 bcomp

冲突

当前文件如果处于冲突状态,同时在标签栏标记出来;

有任何文件处理冲突状态,阻止后续同步;

  • 点击同步按钮,提示冲突
  • 左上角仓库名显示冲突标记

后台自动同步

【分析自动同步实现机制 - TraeCode】https://share.traecontent.cn/share/.1HWCKQEDFSCSC?enter_from=pc

再增加一个选项,当前仓库是否后台自动同步,默认为 false,当勾选时,不管此仓库是否为当前仓库都会自动同步,前提是全局的自动同步开关是开启状态。

  • 全局的自动同步开关是开启状态时,当前仓库一定自动同步

当因为安全的自动同步启用导致无法自动同步时,左侧面板仓库区也展示为警告状态。

  • tooltip 显示警告原因

安全的自动同步(无需合并时)

切换仓库后仍自动同步 开启时,才可选择(有效),如果选择了,当仅有推送或者拉取的内容时才自动同步(一定不会有冲突)。

改为独立选项,因为 切换仓库后仍自动同步 即使没开启,全局开启了并且为当前仓库时,也会自动同步,此时 安全的自动同步 就有意义

Commit: b7c568a9b8b0a76110056e0546686972d3b511bc fix: make safe auto sync repository independent

待同步(推送)内容

查看待同步的内容,包含文件列表和diff,可以考虑和最近版本的复用

Commit: 2f14da7aa9cdbc571a56ddb6db0a7ae8fdd59d8b feat: preview pending sync changes

最近版本列表

最近版本列表,点击显示这个版本的详细信息,包括但不限于修改时间,动作(删除、新增、修改。。。),diff内容,修改设备名等

  • 当展开细节时,头部固定不跟随滚动,考虑sticky样式
  • 最近版本 旁边增加一个选项,显示简洁差异,默认勾选,只显示变化附近的行
  • 再增加一个选项:自动换行,控制差异文本框的自动换行
  • 待拉取(同步到本地)的条目高亮

Commit: 9ffb68f7b13ecea1a0875bc89ea2a9f64a30e431 feat: add compact sync diff option

Commit: e52e62ac53ec7711a6d7672d9d907202db6ac520 feat: show detailed sync version history

整体恢复

点击后将本地所有文件恢复到某个版本(类似 git reset hard)。

  • 建议在关闭自动同步的情况下使用

定位到文件

7f4d7ad e327493

  • codex://threads/01a09415-4d08-7f32-bc77-ece7d4cb43dc
  • codex://threads/01a0a386-f6d4-7df1-a4be-649f2ba23c6e
  • 自动关闭同步中心、显示侧栏、展开父目录并选中/聚焦文件。
  • 删除或本地不存在的文件不显示该操作。

详细日志

诊断日志旁边加一个选项:详细输出,默认false,启用后输出更多详细信息 支持“粘底”特性

增加详细的同步日志,包括同步触发的时间,本地版本,远端版本。然后如果一个文件有冲突则将此文件的详细情况也记录

  • codex://threads/01a0b3bd-a94e-79b1-ba3b-61f43911ddb8
  • 日志不要存到 state.json, 存入独立的logs文件夹,每天一个文件 如 2026/09/19.log

同步速度优化

f401757 codex://threads/01a09b62-7a09-7600-b197-1353363e7a0d

同步正在编辑的文件

  • codex://threads/01a0ba21-dd35-7142-8c7f-140283544305

简单方案

  • 跳过此文件
  • toast 提示 & 仓库警告标示
  • save 后再同步

不好处理的地方

  • 竞态:同步时继续编辑
  • 后台三方合并,如有冲突不好处理。

merge-bases 需要清理

  • codex://threads/01a0c17b-4fe2-75b1-b61b-3d0f341c2bf9
  • 复用项目已有的 history-v1 版本正文作为三方合并基线,缺失时仅在真正发生冲突时向现有历史 API 按需取一次;停止写入 merge-bases,

仓库管理

详细说明:阶段 2 桌面笔记库设计与验证

打开笔记库

第一次打开本地库时,不要在远端立即创建对应仓库

  • codex://threads/01a0c91a-20a0-79c3-91a9-8c9c8dc1ba10

open in vscode

  • new window 2647943
  • feat: expose VS Code open command 796707d

远端仓库列表

新增一个列表界面,展示当前用户所有的仓库,然后可以克隆指定的仓库到本地。

  • clone到本地,当选择的文件夹不为空时,新建一个 repo name or repo-id 的文件夹
  • 文件数仅统计markdown文件

用户可以手动修改仓库名

  • 用户手动改名后,显示为 name(repo-id) 这个形式;否则显示为 repo-id 远端仓库可以删除,默认的名字为本地显示的名字

本地仓库详情

可以修改本地名称,但不要实际修改文件夹名

84b00cd6c3e1dd2696931c16e92eb80735585953 fix: keep local repository names separate from folders

移除仓库:仓库详情按钮后面增加一个按钮:从仓库列表中移除当前仓库。需要用户二次确认,同时删除根目录下的 .mynote 文件夹

批量检查当前仓库的 broken links 失效链接

see 多文件搜索/替换

  • 功能实现类似

文件管理

file-tree.md

详细说明:阶段 2 桌面笔记库设计与验证

.app 这种文件不需要解析内部的结构和同步内部内容;左侧文件树结构也不需要解析

MAX_TREE_FILES 这个控制的应该是实际需要同步的文件数量(包含图片等),而不是已经访问过的文件数量。比如有的项目文件非常多,但是 Markdown 文件却很少,是需要要支持的

新建文件-保存,初始保存路径为当前项目根目录

文件搜索: quick open

搜索历史

实现类似vscode 的快捷打开文件面板,快捷键为 ctrl/cmd + p

中文等输入法正在组合文字时,Enter 和方向键由输入法处理,不会误选并打开文件。

Commit: 429b7cae611c2bff2a76a3eec5ab7c1cfd52dfdd fix quick open IME enter handling

Quick open 支持限定项,冒号作为识别特征:

  • codex://threads/01a0cca4-a7b6-7160-a672-c4936699c2d1

比如 p:ABC,则需要匹配的项同时满足路径包含 ABC 这个字符串。如果有空格用引号包裹,eg:p:"abc efg", 标示“与”关系。现在我需要一个类似这样的过滤表达式支持,有哪些成熟的方案?

输入 匹配 不匹配及原因
p:docs f:plan docs/ABC plan.md archive/ABC plan.md:路径不含 docs
p:archive f:plan archive/ABC plan.md docs/ABC plan.md:路径不含 archive
p:"abc efg" docs/abc efg.md docs/ABC plan.md:路径不含连续的 abc efg
p:docs p:ABC f:plan docs/ABC plan.md docs/abc efg.md:文件名不含 plan
f:docs 无 docs 只在目录名中,不在这些文件名中

在 Quick Open 快捷插入引用

  • 搜索结果中, Ctrl 加回车,则在编辑器的当前位置插入这一条的引用,包括文件和大纲的
  • codex://threads/01a0f68d-4eb1-76d0-a95f-cc7f773d4786
  • workspace 拆分

find/search/replace in files 多文件搜索/替换

see 搜索 common

search open in editor: alt + enter 快捷键 7c38307

search open in editor: 高亮全部的匹配结果 d1b07ef

add workspace search editor a595c95

顶部修改查询条件:support dynamic search editor queries 4bad5d

  • feat: add replace in files e0dd68a

引用、搜索结果的逐项遍历

  • codex://threads/01a0f684-d7db-73b0-a71e-77ebbbbbf6f3
  • codex://threads/01a0faf3-326f-77c3-ad0e-f4313db95024
  • codex://threads/01a0fb73-0b17-7b60-ba50-aab1b16ed8ec
  • 两个来源都要能够指示当前遍历到的位置。遍历的时候,如果一个文件有多个结果,每个结果都要遍历到。
  • f4, shift + f4

标签管理

  • 已打开的文件当前打开的仓库关联,切换仓库后切换已打开的文件。如果没有打开任何仓库,则不记录已打开文件。
  • 全部关闭、关闭其他等常规操作。
  • ctrl + tab 切换标签
    • ↑↓按键时,消息不要传递到编辑器或者预览,造成其滚动
    • codex://threads/01a0ca0b-5445-77c3-aa2d-f81e30c0592d
  • 切换到上下一个标签:mac:cmd shift + [/], win: ctrl pagedown/up
    • mac: 当出现切换界面之后,上下键可以用来选择,而不是触发系统的窗口管理功能。 - 无法截获系统快捷键
  • 跳转之后,关闭页面,应该回到跳转前的页面而不是旁边的页面
    • codex://threads/01a0de43-d105-7871-9397-03789b5a5781

Commit: 0eddea1f321d58f812335ebea7e16eaaa98dac27 feat: add tab management interactions

标签隔离、独立,不共享

编辑页面在多标签中不要共享,这样会造成切换标签后位置滚动到了底部,并且undo、redo buffer 被清空

Commit: ee8d0ffa043783487f3c6bd16d322c1d37a29c4a fix: isolate editor state per tab

pinned/normal/preview tab/editor

preview-editor.md

  • 转换
  • pinned:不被全部关闭
  • normal:不会降级
  • require repeat close for pinned editors

alt + 数字跳转到对应的tab,1-based

复制(相对)路径 copy (relative) path

dc22331

  • 左侧文件树、tab 菜单同时支持

定位文件 reveal in file explorer

shift + alt + R;同时在左侧文件树和tab上下文菜单中加入 12f1e9c

  • 定位文件(系统自带的 explorer/finder 打开)

单文件历史

查看指定文件的历史,从 同步中心 最近版本 模块抽取公共代码。命令面板也要支持

  • dde5dc6 codex://threads/01a093fd-8d05-7a52-a7a0-c44baa3f3d66
  • rename?

cyb仓库,docs-mac/mynote-client.md 这个文件,最近一天的修改为什么是整个文件?

  • codex://threads/01a0bc73-6412-7ed2-a5ae-d6b8f6fb41f2
  • 处理删除后重新创建

save 另存历史版本

codex://threads/01a0f850-2f50-7e83-b6ce-d871c27cbf44

  • 网络不通或者没有登录时依然可用。

打包文件

检索打包

deepseek 根据仓库内容的问答

  • for deepseek 等 ai 提问
  • codex://threads/01a0c832-fbac-7f12-845b-bf823e15da96
  • 左侧文件树工具条时间过滤按钮旁边加一个打包按钮,弹出对话框。同样展示文件数,然后每个文件或者文件夹旁边都展示一个复选框,默认全部勾选。
  • 点击文件夹的复选框,切换自身以及递归切换子孙的选中状
  • 然后点击打包,将所有选中的文件读取出来。
  • 按钮旁边加一个复选框,默认选择,如果选择了则在每个文件内容的头部插入文件的相对路径。加一个 prefix 在文件名前:“// ======= "
  • 支持命令面板
  • 增加全选、取消全选、全部折叠、展开;点击文件夹切换折叠展开;刷新
  • 2.3 文件操作
  • 每行加入行号 codex://threads/01a0d17c-9752-7000-af06-80c32e7740e4
  • UI 调整 codex://threads/01a0e247-dce2-79d3-9ede-f01b03acb7d2
  • codex://threads/01a0f4f9-0757-7aa2-9bc3-2447ea523bde
    • 复制允许大小超过1M & 另存为导出
    • 打包文件对话框关闭时隐藏,再次打开时不要重建UI
    • 打包晃动:重建了 textarea

期望的回答方式:

# 标题

| 编号 | 规则 | 原文出处 |
| --- | --- | --- |
| R1 | xxx 描述 | `FEATURES.md:207` |
。。。

打包大小统计

刷新按钮旁边加一个checkbox,是否统计文件大小,默认选择,选择了文件、文件夹都展示大小

  • codex://threads/01a10022-2d77-7de0-874d-2aedc2ff3886
  • 再汇总一个总的大小,放这个checkbox后面
  • 单位全部统一为KB,每3位用逗号分隔
  • 统计的是选择的文件的大小,选择变化后要重新计算。

应用筛选前要先刷新

  • codex://threads/01a111bc-5124-7191-85bf-a97d88676994

文件过滤器

  • codex://threads/01a0c83b-8206-78a2-9eb7-85738ec45170

  • codex://threads/01a0c982-79d2-7f31-898d-ce963dc5abfc

  • codex://threads/01a0c9d5-0292-7f71-b0ed-5c6f303452ce

  • codex://threads/01a0c9ef-d17e-7683-92a8-7649a402e210

  • 文件筛选预设与打包

    • 配置写入应用用户数据目录的 repository-ui-state-v1.json,按笔记库隔离
  • 构建

    • 同一构建命令也将已安装的 ignore 单文件模块包装为浏览器 ESM,并复制其许可证,供文件筛选使用。 scripts/renderer/build-editor.js
    • 说明 codex://threads/01a0cc01-7c60-7721-b9fb-8bf05d0ca90a

TODO: 筛选逻辑显得复杂,需要优化,参考更多的筛选器

过滤器、预设 公共提取优化

  • codex://threads/01a118de-1fd7-7140-8074-9d033aecf3e3
  • codex://threads/01a118fd-ff15-7cc3-a00f-b2c6440a631c
  • codex://threads/01a114ab-474d-7dd1-9e22-45b9288324fe
    • 删除“预设名称、文件名包含、所在目录”,保留扩展名,新增“包含规则(每行一条)”,留空不限
  • codex://threads/01a114d4-7ef3-7a51-8c22-bada742afaff
    • 灰色边框固定可见

同时支持包含过滤以及排除过滤

  • codex://threads/01a114ab-474d-7dd1-9e22-45b9288324fe

.mynoteignore

  • 详细说明:阶段 2 桌面笔记库设计与验证
  • .mynoteignore 准入规则
  • codex://threads/01a0e362-6065-7503-a5d3-874691feab1d
  • 支持 ignore,类似于 .gitignore 配置文件用
  • 也需要同步
  • 改为:已经加入管理的文件不受其影响,只影响新文件是否加入同步管理和在左侧文件树中显式
  • Commit: 02b97d5b8738ee675203742f1551609ac0017d90
  • fix: preserve managed files across ignore rules

mermaid 流程图

  • 长文本能够正常显示

Commit: af56c6d9c28e29d533eb4cdb37bf25c90cbdbc66 fix: preserve full Mermaid node labels

Mermaid 图表渲染失败:Could not find a suitable point for the given distance 复现路径:cyb 仓库。关闭预览,重启app。打开 docs-mynote-client/docs/sync-flow.md,打开预览,报错。

  • 另外发现的现象:每次点击tab标签页,预览页都会重绘、晃动。
  • codex://threads/01a0a0a0-3407-7722-b385-2f7fbfd13e64

server export tool

相关:托管同步 Beta(原始库导出)

script 文件夹下实现一个小的 Node js 工具,这个工具接收第一个参数是用户 ID, 第二个参数是仓库的名字或者 ID, 第三个参数是输出路径 这个工具直接在服务器端执行,可以不需要密码直接访问仓库数据。 如果已经clone了,则同步数据到最新

export MYNOTE_SYNC_DATA='/srv/mynote-sync'
export MYNOTE_SYNC_ENCRYPTION_KEY='<与同步服务相同的密钥>'
npm run sync-export -- '<用户 ID>' '<仓库名称或 ID>' '/srv/exports/target-repository'

export MYNOTE_SYNC_DATA='/Users/daaijinxiao/Desktop/prjs/mynote-client/.sync-data'
export MYNOTE_SYNC_ENCRYPTION_KEY='f9aCPmdePImx1gLHliyofK605qTqnOMOZ/lKQqp6xHk='
npm run sync-export -- '81b412e1-ff41-4e1e-9aa6-ba6adced2d54' 'dcd91689-6d5e-4626-8174-f050b09227db' '/Users/daaijinxiao/Desktop/cyb/export-r1'

问题记录

退出差异模式后大纲没有更新,还是上一个文档的大纲。

当其他设备有修改时,文件历史和同步中心的版本详情都没有加载显示最新的修改。但文件编辑器中的内容却是最新的。

同步中心 最近版本 差异框中选择的内容要支持复制,mac下不行

按修改时间过滤 弹窗 点击 比较整个文件树 也需要记录状态

  • codex://threads/01a0be39-0df1-7322-8705-bb56b907da73

windows, 移除当前仓库,或者新 clone 后,仓库下拉框不能点击展开

这个发现确认了真正根因:Windows 下关闭 window.confirm / window.alert 后,Chromium 会暂时抑制原生下拉弹窗,应用失焦再聚焦才恢复。

  • 移除仓库改用应用内确认框,不再调用 window.confirm。
  • clone 成功改用非阻塞通知,不再调用 window.alert。
  • Electron 完整流程已通过,移除后无需切换焦点即可命中仓库选择器。
  • Lint、仓库测试和 Windows 打包通过。

40c0d8f8f2f4758e46a30de559b5535575469a26

Commit: 1b5e274ce87f24595b7a2a7e633b4351d4fd20ac

Commit: 8bcca53ba05078de566ffaf2f318f765483abbe5

几个 滚动到顶部 的问题

  • codex://threads/01a0a2f6-8fb1-7570-9730-8b651d01f248
  • cyb 仓库,quick open 查找 "@ 文件树比较",没有定位,滚动到顶部
  • 切换到其他标签页并移动一下 caret 再切换回上一个标签页。也会滚动到顶部,但 caret 还保持了之前的位置。
  • 非必现:切换到某个标签页,然后回车。也会滚动到顶部。
  • chatgpt-sessions 这个仓库,quick open 输入 "@==", 然后选择 "== 冒号英文。。。",没有跳转到对应位置,caret位置是对的(此文件是新打开的)

alt + pagedown/up,连续几次,会输出一个字符到编辑器

  • codex://threads/01a0a393-3639-7e42-bcfc-33604c6ddd8c
  • alt + pagedown 两次,产生一个 '!'

编辑器:alt + n 跳转下一处差异失效(中文输入法时)

  • codex://threads/01a0bf15-a93c-7d60-8ccd-688a7574edec
  • macOS Option+N/P 即使被识别为重音组合输入,也会正常触发差异导航。
  • 阻止快捷键产生的延迟组合字符写入编辑器。

Windows Alt + 左右键前后导航时,有时候导航完成,Alt 键松开时,焦点会定位到菜单。

  • codex://threads/01a0f12a-7c8a-7352-883a-1910cef9850f

ctrl alt + c,复制大纲后有时也会出现

  • codex://threads/01a0f545-fbba-78d2-bfc6-823bab4f518c
  • windows 下 ctrl + alt 的组合,某个键会出现此问题,alt + pageup/down 也会。再 codex 修改的基础上,简单的处理:只要组合键包含 alt,就在下次 alt up 时 preventDefault
    • webContents 的 before-input-event 中识别 keyUp 并拦截
<--cs_begin
E:\uninote\mynote-client\src\main\chord-input.js
        // Windows may activate the native menu when Alt is released after an
        // application shortcut. Consume only that Alt release.
        if (platform === 'win32') {
          if (input.type === 'keyDown' && (input.key === 'Alt' || /^Alt(?:Left|Right)$/.test(input.code || ''))) {
            // A new Alt press starts a fresh cycle after any lost keyup.
            altShortcut.delete(contents);
          } else if (input.type === 'keyDown' && input.alt && !/^Alt(?:Left|Right)$/.test(input.code || '')) {
            altShortcut.add(contents);
          }
          if (input.type === 'keyUp' && (input.key === 'Alt' || /^Alt(?:Left|Right)$/.test(input.code || ''))) {
            if (altShortcut.delete(contents)) event.preventDefault();
          }
        }
--cs_end>

编辑时连续切换视图,再回到编辑界面, caret 丢失,无法再编辑。

  • codex://threads/01a0ad80-9f06-7241-9688-d69565e045e2

未登录时,新建的文件的标题不能收藏,需要关闭后重新打开才行

排查 cb.mb 为什么没有被 .mynoteignore 排除

  • codex://threads/01a10fb1-4a43-7171-bc68-e44b8a08577b
  • 我先删除了 cb.md, managed path 里面也删除了,我再添加的 cb.md, 还是会被纳入进去。

已经修改热键了,但还是报默认热键注册失败

  • codex://threads/01a110ab-16b3-7303-97e8-f86d5cebcc61

编辑预览并排时,编辑器每输入一个字符都会向上滚动

  • codex://threads/01a11196-660f-7783-b5e7-fc8e1ddde358

搜索 common

匹配算法,拼音支持

see 3.4 编辑、预览与大纲面板

匹配高亮,可以不连续

禁用/启用拼音搜索,默认开启

  • 入口菜单。命令面板,状态栏显示是否开启。
  • 全局控制,所有使用拼音搜索的地方都由这个地方控制。

大小写敏感、全字匹配

搜索(全文、当前文件)支持全字匹配、大小写敏感选项 991cc15

大纲搜索,@pinned 为什么匹配 “在预览旁边再增加一个大纲按钮,选中的时候显示大纲面板,大纲面板的内容从笔记的内容当中自动提取大纲节点。”?

Commit: d99945e857d31ed4d556fb092fd3e33bac6400e5 by 豆包 fix: drop subsequence fallback on full-pinyin quick-open aliases

原因是大纲搜索支持拼音模糊匹配,而且允许字母不连续。我用这条原文复现了命中。

  • @ 只表示“搜索整个笔记库的大纲”,实际搜索词是 pinned,不是“已固定”筛选条件。

  • 标题会转换成全拼和拼音首字母参与搜索。

  • “旁边再增加一个大……”的全拼中,恰好能依次找到 p i n n e d:

    【p】angb【i】a【n】zaize【n】gjiayig【e】【d】a…

当前算法只要求字母顺序一致,间隔再远也只扣分,不排除结果,因此长中文标题容易出现这种意外命中。

对应逻辑在 quick-open-search.js。这次只定位原因,未修改代码。

搜索历史

  • codex://threads/01a0cbf3-9600-7703-a952-491e86dcc5e0
  • 记录输入的历史,通过↑↓切换,并告诉我存储的位置。
  • 历史位于 Electron userData/Local Storage,键为 mynote.page-find-history.v1、mynote.workspace-search-history.v1。
  • quick open 和 命令面板也支持历史记录(类似搜索的历史记录),在用户点击选择或者enter按下选择时记录,ctrl/cmd + ↑↓ 选择。
    • 也加入placeholder提示
    • codex://threads/01a0cd88-7a01-7ce2-904e-a44bea5ac55f
    • ctrl ↑↓,可配置

快捷键带入选择文本

  • codex://threads/01a0cbf3-9600-7703-a952-491e86dcc5e0
  • 通过快捷键触发/激活的搜索(页内、in files),如果有选择,则将选择的文本带入输入框

文档链接

给这份精炼文档(/Users/daaijinxiao/Desktop/cyb/cyb/docs-mac/mynote-client.md)添加链接指向细节文档,位置在 /Users/daaijinxiao/Desktop/cyb/cyb/docs-mynote-client 下面

窗口管理

Ctrl/Command+Shift+S 系统级热键切换主窗口显示状态:当主窗口处于显示状态并且不是激活状态时,要bring to top,而不是隐藏 改为最小化而非隐藏

  • window.toggleVisibility

ctrl + shift + alt + s(win/mac 相同): 在当前已打开的窗口中切换

  • mac 原生可以用 cmd + `, windows 可以用 ctrl + 点击窗口图标实现
  • 注意,这个是快捷键,不是热键,所以这个需求有问题:当只有一个窗口的时候,功能同 alt+Shift+S

优化

  • codex://threads/01a0ecf9-8ecc-7711-a645-3b838a3d4a5e
  • 设为主窗口,这个命令改为切换此主窗口,入口:Window 菜单以及命令面板。没有设置时窗口选择的算法保持不变。
  • mac: 改为隐藏窗口(现在是最小化),和 alt + h 等效

支持新建窗口,打开不同的笔记库

    • s 变为控制最后题词激活的窗口

实现 vscode 类似的 file - open recent 功能

  • 统一 ctrl + r
  • 数量无限制

新打开(或切换)窗口后,如果当前标签是编辑器,则聚焦 d92545

windows:npm start 启动后,窗口没有激活,处于终端窗口后面

  • codex://threads/01a0f505-de68-7c60-b752-a6df348fb9fb
<--cs_begin
E:\uninote\mynote-client\src\main\window.js
  if (platform === 'win32' && startupActivation) {
    try {
      const user32 = (koffi || require('koffi')).load('user32.dll');
      native = {
        foreground: user32.func('void * __stdcall GetForegroundWindow()'),
        activate: user32.func('bool __stdcall SetForegroundWindow(void *hWnd)'),
        key: user32.func('void __stdcall keybd_event(uint8_t key, uint8_t scan, uint32_t flags, uintptr_t extra)')
      };
      launchForeground = native.foreground();
    } catch (error) { console.warn('Windows 启动窗口前台状态不可用', error); }
  }
--cs_end>

启动时恢复上次关闭时打开的多个仓库(窗口)

  • f07e4a3 codex://threads/01a093dd-c241-76c2-8762-60b385e1c045
  • 需要 exit 方式的退出才行,一次性关闭多个窗口的不行

window.alert window.confirm 等全部用替换

Commit: c3becb391d440028bfd75eb738a7805366b88dbb fix: replace native confirmations with application dialogs

这个会导致点击后编辑器失去焦点,无法编辑。必须切换其他窗口再切换来才可以(windows)

Command Palette 命令面板

  • 搜索历史
  • feat: add searchable command palette with keyboard navigation 23e899
  • 显示快捷键
  • Command Palette 显示后再关闭,textarea或者 input的caret要恢复 55ffa92
    • quick open 面板同样处理 6eb7747
  • 在每个条目的最右侧加入一个设置图标,点击之后打开快捷键设置界面,并定位当前条目的快捷键配置。
    • ctrl/cmd + enter

查找哪些命令没有包含在 command pallete 中?

  • vscode open

命令面板也支持拼音搜索,复用之前的匹配算法

  • codex://threads/01a0c85b-c743-73a1-b605-3e7a7b71b4b5

命令面板底部加一个 Checkbox 隐藏不可用命令,默认关闭。此时不可用命令颜色更灰一些(置灰),当用户选择了不可用命令时,提示用户不可用的原因。

  • codex://threads/01a0cc43-8787-7b63-9b45-a4a73e59a31d
  • 仅简单的显式不满足的 when 条件

命令面板记录的历史命令需要重启后也能够恢复,现在重启后就全部丢失了。

  • codex://threads/01a0fce1-3cd0-7c60-a86d-fedbf9d13efe
  • 与历史工具条共享记录
    • 忽略固定项,不要固定,总是根据历史排序 codex://threads/01a10026-561b-7d40-b895-b3cca2924368

命令面板历史记录工具条

  • 命令历史工具条
  • codex://threads/01a0d398-3cb0-7872-bbe8-744a516e1811
  • codex://threads/01a0d3c2-9ad5-7df0-b4b5-957d03a209a9
  • codex://threads/01a0d7b1-528f-7fd3-8210-b2aee0a979ce
  • 每次访问一个命令面板中的命令,就形成一条历史记录工具条,插入到第一条。
  • 为现有的命令面板当中的所有命令自动生成一个 emoji 图标,便于用户快速找到对应的历史记录。
  • 用户也可以自定义 emoji 图标。
  • 每条记录可以 PIN 到最左边。
  • 按下快捷键(alt+shift+h)之后,后面紧跟的数字按键对应历史记录当中的命令。
  • 工具条跟随鼠标。在鼠标停止移动一秒后出现在鼠标的正上方居中位置,但鼠标移动的过程当中不跟随移动。可以点击关闭按钮隐藏工具条,再通过菜单栏或者命令面板显示。
    • 提示 & 不再提示
    • 显式时菜单状态加√
  • 存储到 appdata
  • 在关闭按钮旁加一个pin按钮,默认选择,选择后固定工具条位置,始终显示不隐藏,不随鼠标移动
    • 初始位置在顶部正中,可以拖动位置

menu 菜单

工具栏增加对应的菜单,添加对应的快捷键(参考vscode惯用的快捷键) 72ec4c3 5fe24e1 2f0126f codex://threads/01a09468-74cf-7fa3-ac33-6bf25631d01f

menu-file

exit

ctrl/cmd + q, 并加入命令面板

menu-view

zoom in/out

  • fix: route zoom shortcuts through application keybindings a8be378

自动换行 word wrap

入口菜单和快捷键参考 VS Code。

  • codex://threads/01a09f1e-5e05-7503-bcf0-6766fa3c4775

状态栏

5.3 状态栏

  • 显示 caret 所处的行列,如果有选择再加上选择的长度

侧栏 sidebar

侧栏分区优化:每个分区都可以折叠展开。分区的标题文字字体加大,参考第一个分区的样式。 599ddc7

repo ui state data 仓库界面状态数据

repo-data.md

  • E:\codex\codex-sessions\2026\09\11\rollout-2026-09-11T09-11-05-01a08e04-aa7e-7ee1-a093-7bd6bef4298e.md
  • 存 appdata 下而非 localStorage
    • /Users/daaijinxiao/Library/Application Support/mynote-client
  • p0 694843e
  • p1 1e9ab9

527295 codex://threads/01a08fe0-8a59-7501-b023-47e9bc261891

  • 时间排序、文件组织也记录
  • 文件树关联当前页面 从设置中迁移过来

tooltip 300ms 原生替换

  • 579b0e8 codex://threads/01a09edf-a751-7051-8749-0fec8e70a331
  • 全局覆盖现有及动态 Tooltip
  • 键盘聚焦时立即显示
  • 自动避开窗口边缘
  • 避免与原生 title 提示重复

设置 settings

设置广播 1aff41f

  • 任一窗口保存普通设置后,主进程立即广播给所有窗口。
  • 其他窗口无需打开设置界面,字号、文件树关联等设置就会立即生效。
  • 之后打开设置界面会加载最新值。
  • 已打开且正在编辑的设置草稿不会被其他窗口覆盖。
  • 保留“显示空文件夹”等仓库级设置,不受全局广播影响。

这个改为可配置

  • const MAX_TREE_FILES = 10000;
  • codex://threads/01a0c920-3bf4-7543-96d0-58aef7f492b0

云同步

收藏、快捷键配置等

时间过滤 & 差异 diff

左侧文件树分区增加一个时间过滤功能:默认不过滤,用户点击后弹出一个界面可以输入一个日期。也可以下拉选择最近一天、最近七天、最近一个月、最近两个月、最近三个月、最近半年,也可以通过日历指定日期,再加上一个重置按钮,用户指定时间后按此时间对展示的文件进行过滤,比如用户输入的 7 天。则只展示最近 7 天有修改的文件。 文件的修改时间从仓库里面查询,以及文件实际的修改时间,二者选最老的。

过滤面板加入一个文件差异选项。

  • 默认选择“不显示差异”

  • 选择“同上”则在编辑器中,用淡绿色高亮最近指定天数有改动的行。

  • 选择“其他”则另外展示一套时间选择。选项同上,用于用户独立指定文件差异的时间

  • 选择“同上”则显示的每个文件展示与指定的时间的版本的差异,考虑复用同步中心的差异展示模块。

    • 是在编辑器中
  • 截止时间早于首个历史版本时,以空内容作为基线,差异为整篇

  • 系统中所有时间格式化显示从 2026/9/12 8:19:56 调整为 2026-09-12 08:19:56 这种格式

fix: 传入显示的时间,却不返回对应的版本的问题。误差在 1 秒以内的版本都可以被视为“在截止时间之前”,因为 UI 传入的时间是秒级精度的 0cb4a1c

文件修改时间

  • codex://threads/01a0c26a-eef4-7710-8bb0-e85f686898b2
  • 明确一下,系统中所有的文件修改时间,都统一为:从 mynote 仓库历史中获取到的最近修改时间(如果只有新增历史,取新增时间),以及文件实际的修改时间,二者选最老的。提取为函数,便于以后统一修改算法
  • 修改:文件第一次加入时,记录其文件本身的修改时间。获取时如果文件只有新增记录,则取这个时间。
  • 状态栏显示文件修改时间 codex://threads/01a0c32e-9933-7b20-97f0-0f5935f3a839
<--cs_begin
E:\uninote\mynote-client\src\main\mynote-file-times.js
/** Use one policy everywhere a user-facing file modification time is needed. */
function effectiveFileModifiedAt(historyModifiedAt, diskModifiedAt) {
--cs_end>

时间、时间差解析

自定义天数可以接收任意字符串。如果是数值单位为天,但可以指定其他单位,如 h 时是小时,标准的时间间隔。还可以指定时间点:2025-3-1 12:0, 用当前时区转为时间戳再计算

  • a9137f1 codex://threads/01a09568-7045-7082-8f06-736e85ea532a
  • 纯数字仍按天计算:0.5、.5、1e1
  • 单位间隔:ms、s、m、h、d、w
  • 支持组合:1d 12h、2h30m
  • 支持 ISO 8601:PT1H30M
  • 支持本地时间点:2025-3-1 12:0,按当前系统时区转换
  • 文件过滤和文件差异过滤均支持

修改时间不需要依赖 git,用 mynote 仓库中的历史版本时间

.. codex://threads/01a09511-4ab0-7021-8dee-c833f39c7415

  • test-diff 这个仓库,README.md 这个文件的修改时间应该是回退到文件时间,但最近一天却没有过滤掉?并且此时的差异应该为空,即没有任何差异块

  • 两个边界:没有可用 mynote 历史时间时必须真正回退到文件时间;目标时间之前没有历史版本时,差异基线应视为当前内容,从而显示零个差异块。

  • 日历控件无法显示,点击无效果。

  • 用户可以手动指定时间段,输入可以为小数,比如 0.5 就是半天。

上、下一处差异定位

  • 过滤选择也要记录并恢复
  • 编辑器:定位到上、下一处差异,快捷键:alt + n/p
  • 所有相邻的差异算一处,要跳过相邻的差异
  • 不要循环折返
  • go 菜单中加入入口

切换差异模式

codex://threads/01a09590-ea5e-78b0-a156-4a740a890ed1

  • 进入差异模式时,关闭预览、大纲窗口,最大化编辑器,编辑器进入只读模式。
    • 仅当前文件进入
    • 状态要持久化
  • 参考同步中心的差异化模块。但做以下优化:
    • 修改行紧邻显示:当一行修改后,第一行显示老的版本。第二行显示新的版本
    • 即将以前的整块先显示老的版本,再显示新的版本,改为逐行显示,删除的行没有新行,增加的行没有老行。
    • 同步中心也改为这种差异显示方式
  • 快捷键:alt + shift + d

alt + n/p 失效,无法跳转

  • 07e3635 codex://threads/01a09900-8937-76e3-84ac-623d853b61d5
  • 同步隐藏编辑器的光标位置,退出差异模式后位置保持一致。

Ctrl/Command 加双击,切换回编辑页面,并定位到双击的行号。

  • codex://threads/01a09f4a-b69e-7813-9106-c704920fa77a

差异模式界面,alt + n/p 时,如果只有一处差异,需要能够滚动到视图

  • codex://threads/01a09f4a-b69e-7813-9106-c704920fa77a

上一处下一处差异要基于当前视图的位置,而不是程序记住的上一处下一处的索引。

  • codex://threads/01a0e872-d8b5-7043-9aa4-2bac8f78047e

相似度匹配

像这种对应的行没有对应上: 老版本: a b

新版本: a' c b'

差异应该显示为:

- a
+ a'
+ c
- b
+ b'

而不是:

- a
+ a'
- b
+ c
+ b'

这种应该匹配,并且计算查差异:

  • 第二段按下时重新检查上下文;不匹配时结束等待,当前按键继续交给原控件。
  • 第二段按下时重新检查上下文;下一次可识别的非修饰键由 Chord 独占,不匹配或上下文失效时结束等待并阻止该按键进入原控件或输入法。
  • codex://threads/01a0a294-d7e3-7530-851c-6c30d5fc6e87

差异行分块差异 highlight inline diff changes

差异对比优化:对于匹配的行要标识出增删部分,删除的要用高亮的红色块标识出来,增加的要用高亮的绿色块标识出来

  • 剪贴板图片
  • 0cfb823 codex://threads/01a0a294-d7e3-7530-851c-6c30d5fc6e87

大文件差异算法优化

6dbfaff codex://threads/01a095ce-686e-7cb2-b99f-d62a456073eb

行相似度/匹配算法优化 2026-10-1

codex://threads/01a0f330-0a8c-71b3-8518-8c00dae60fba

mynote结果,没有将vscode对比的两行进行对比:

  … 已省略 71 个未变化行 …
  # 文件筛选与差异 && 文件树差异 迁移
  - 不需要迁移 git head 比较
  - codex://threads/01a0e7c4-1da6-70e3-aff3-69c1cf9b2e0f
− - TODO: 考虑预览页面的差异高亮:参考当前行高亮算法计算对应的预览页部分

+ # 预览页面的差异高亮:参考 pc 版本当前行高亮算法计算对应的预览页部分
+ - codex://threads/01a0f13d-6289-7ac0-b110-f57744844184
+
  # 性能优化
  - [收藏卡顿优化](/docs-mac/mynote-mobile.md#收藏卡顿优化)

vscode的结果: 剪贴板图片

与 git HEAD 版本比较

文件差异的选项加入一个 Git HEAD 选择时将当前文件与 Git HEAD 对应的版本进行比较。

  • ..edc34f0 codex://threads/01a095ee-61ef-7d20-b2e1-0f2425469332
  • 作为默认值
  • git commit 更新后,或者其他变化,差异的基线文件也要跟随变化。
  • 支持老版本 git

git HEAD 比较模式时,新增的文件应该是全部行高亮,基线版本应该是空。

  • codex://threads/01a0fa7f-c1c0-79b0-aa47-a673a32f45f5

单文件历史和版本详情都加入与当前版本比较的功能。

codex://threads/01a0964d-19ac-7451-9744-538833e9633d

  • 单文件历史与同步中心版本详情均可切换:
    • 与上一版本比较
    • 与当前版本比较
  • 按文件 ID 跟踪重命名后的当前路径。
  • 当前文件已删除时,显示完整删除差异。
  • 每次切换到当前版本都会重新读取,避免展示旧缓存。

文件树比较

mobile 优化尝试

  • codex://threads/01a0a011-327a-77e2-992f-77cdd613e833
  • 在时间过滤对话框底部加入一个按钮,点击后根据当前用户指定的时间计算得到的版本,将此版本与当前版本针对整个文件树进行差异计算。
  • 生成的差异显示在一个新的对话框当中,类似于文件历史对话框,每一条记录标题行展示文件相对路径。展开后显示当前文件的差异。
  • 顶部加入两个按钮,全部折叠,全部展开,默认全部展开。
  • 每个标题栏增加一个按钮:跳转到对应的文件
  • 在 View 中再加入另外一个入口,可以直接打开对话框。并且对话框关闭或者跳转后只是隐藏,对话框再次打开后直接显示上次的内容。快捷键:ctrl/cmd + alt + d
  • 可以在对话框中直接重新设置时间

也支持 git HEAD

  • codex://threads/01a0bc4b-ce1f-7661-8821-402f3d144923
  • codex://threads/01a0bdf3-e42d-7470-bc61-05bb8c882cb2

历史版本本地保存

每次同步时都将所有的历史版本记录同步到本地,差异比较时从本地获取版本,不要做任何服务器请求,即使当前还有未同步内容。

  • 857194c codex://threads/01a0960c-f672-7740-b05d-9a281ac883ce

log

终端和开发者工具:

  • [mynote:file-diff:renderer]:请求、缓存命中、差异行数、差异块数及耗时。
  • [mynote:file-diff:main]:目标时间、历史 revision、基线来源及内容长度。
  • [mynote:file-diff:history]:仓库 ID、文件 ID 和历史版本查询结果。
  • 不会输出笔记正文。

差异参数便捷切换

按修改时间过滤,文件差异选择框旁边加一个按钮,每点击一次就依次切换选项,并支持命令面板触发以及快捷键配置。

  • 7d6a682 codex://threads/01a0be43-f71e-7140-bd24-b8fd0f1e2307
  • 每次切换后都要加载上次的状态,比如选的是其他-自定义时间-3天,则再次切换到其他时,也要设置为3天
  • 不要弹窗,直接应用生效,更新编辑器视图
  • 状态栏显式当前的选项,如:当前差异参数:其他-自定义时间-3天
  • workspace.cycleFileDifferenceMode

other

  • 文件差异选其他,差异时间选指定时间,输入框超出范围看不到。

CodeMirror 迁移

misc

json 保存时统一格式化,便于查看

如:repository-ui-state-v1.json

  • codex://threads/01a0ca0d-6b4d-7af3-9c52-90d7a8bcb9df

createElement 改造

  • codex://threads/01a0cc53-9cd6-7390-abdf-0f8a74d22ae7
  • 用缩进表示嵌套关系。
  • innerHTML 方式的没有处理
  • TODO: 数据驱动的方式重构

userData/appData

  • '/Users/daaijinxiao/Library/Application Support/mynote-client'
  • 'C:\Users\Administrator\AppData\Roaming\mynote-client'

调用关系输出

https://chat.deepseek.com/a/chat/s/d051d85c-1d68-475f-a695-51fa631a4aa8

点击"应用筛选"按钮
  → filterForm 'submit' 事件
    → event.preventDefault()
    → filters.read()                     // 读取表单,校验时间,生成 selection
      → readTime()                        // 校验时间表达式
    → applyFilter(selection)
      → busy = true
      → update()                          // 禁用控件
      → refreshNodes()                    // 主进程重新扫描磁盘,返回最新 tree
      → renderFilter(selection, persist)
        → createFileMatcher(filter)       // 编译 include/exclude
        → resolveFilterTime(timeFilter)   // 解析时间 cutoff
        → matchingTreePaths(...)          // 遍历计算 visible/count/total
        → createPackTree(...)             // 重建可见节点树
        → render(tree, list)              // 递归重建 DOM 与 inputs
        → invalidate()                    // 清空输出/回答
          → update()                      // 刷新计数与控件
        → rememberFilter(selection)       // 持久化选择
      → finally: busy = false; update()   // 恢复控件

导入导出

export/save as html & txt

  • codex://threads/01a0d657-8031-77b2-84a4-dac9bd89a19d
  • codex://threads/01a0d6c2-8be6-7c62-bffb-c94ab413f5d0
  • codex://threads/01a0d6ff-a5dd-7da2-a493-f6b8564e779f
  • 保存时导出 HTML 与纯文本
  • 支持嵌套、继承 parent 配置
  • 同步时的修改也需要自动导出
[export]
    html_root = ../fh-html
    css_root = ../fh-css
    txt_root = ../fh-txt
    publish_root = /clinet
    extra_js = ../fh-html/js/index.js;...
    extra_css = ../fh-html/css/index.css

html 版本

  • .mynote/config,html_root 配置项,如果配置了,则每次保存时另存一份 HTML 版本到指定的文件夹下
  • 还可以配置一个 publish_root,如果配置了,表示发布到服务器的根目录,所有的生成的链接要加上这个根目录。
    • HTML 内容要保持和预览的版本一致,除了链接的调整

txt 版本

  • .mynote/config,txt_root 配置项,如果配置了,则每次保存时另存一份 txt(innerText,不是 md 的文本) 版本到指定的文件夹下

支持 extra_js/extra_css 配置。设置了额外注入 js/css。

  • 支持多个配置,用 ':' 分隔

支持 extra_js_content/extra_css_conent 配置。设置了直接以内容注入 js/css

使用配置:

[export]
    html_root = X:\sh\html\client
    css_root = X:\sh\html\client\__css
    txt_root = X:\sh\src_txt_sep\client
    publish_root = /client
    extra_js = /__res/client.js;/__res/util.js

导出为PDF/word

codex://threads/01a10fff-622e-7f33-b500-d253d89c4463

deepseek 根据仓库内容的问答

  • codex://threads/01a0de70-21a4-77d0-9c4e-8518d79a043c
  • 打包文件界面加一个提问功能,加一个 TextArea。用于用户输入问题,再加一个按钮,点击之后将这个问题发送给 deepseek, 返回一个查询命令
  • 然后用这个查询命令在用户选择的文件范围内进行查询,这个查询命令只输出命中的文件列表。
  • 然后再将这个过滤之后的文件列表对应的文件进行打包
  • 最后将用户的问题将以及打包的内容发送给 deepseek,得到 deepseek 的回答后显示到界面。
  • 将每一步的提示词集中存到 app data 下面的配置文件中,便于手动调整。
  • 结果文本框默认折叠,当收到第一个回答时才展开。用户还是可以手动折叠展开
  • Deepseek API key 单独保存,不参与云同步。

缓存问题

截图中的 0 命中不能单独证明缓存失效:DeepSeek 的缓存自动建立,只在后续请求复用已持久化的相同前缀时命中,且不保证每次命中。DeepSeek 缓存说明
已将回答请求改为“文件内容在前、问题在后”,方便对同一批文件继续提问时复用前缀;终端也会逐次显示 hitTokens 和 missTokens。

向 DeepSeek 提问/查询打包/选择文件提问/选择文件打包

  • codex://threads/01a0e225-7fef-7371-8276-9f1bf526d09b
  • 灵活组合,避免不必要的请求发送

tests smoke

  • 开发验证

  • Electron 冒烟测试

  • 时间、pass汇总

  • 2026-10-03T15:36:14.7424124Z codex://threads/01a10267-b994-7e50-821a-85be364afc08 分离文件内容与提问内容

  • 2026-10-03T07:13:42.2334231Z codex://threads/01a1009c-5d6d-7dd0-b677-a6ccf7607274 屏蔽测试中的 libpng 警告

  • 2026-10-03T05:25:42.1187895Z codex://threads/01a10039-6ae9-7310-9eab-f8378be7af05 Fix failing smoke suites

  • 2026-10-03T03:52:39.8144153Z codex://threads/01a0ffe3-d335-7e33-a54f-b01383304695 定位树拖拽烟测入口

  • 2026-10-03T03:32:44.8161786Z codex://threads/01a0ffd2-00e6-7a93-b91f-19bb5bb3dec9 判断 Electron smoke 测试结果

  • 2026-10-03T03:18:36.6566796Z codex://threads/01a0ffc4-6e91-7ef0-854d-cffe9842efaf 修复 HTML 粘贴冒烟测试

如果 package.json 中没有的,这样:

npm run test:smoke -- command-palette

  const source = fs.readFileSync(path.join(root, 'test/electron-smoke.js'), 'utf8');
  for (const [, flag] of source.matchAll(/process\.argv\.includes\('(--[\w-]+-only)'\)/g)) {
    suites.set(flag.slice(2, -5), ['test/electron-smoke.js', flag]);
  }

鼠标工具

  • codex://threads/01a10c6e-a2d3-7bd0-a582-518abbc70361
  • codex://threads/01a10f09-3c3b-74a3-a5f7-96ecf5735877
    • 方案二:ctrl/cmd alt 监听鼠标移动,变化则阻止
      • 方案三 TODO: ctrl/cmd alt shift 只要形状变化就阻止,有的自定义形状难以监控,每次重启都会变化

在菜单项 View/片段管理器下面加一个鼠标位置微调。同片段管理器一样,同时支持命令面板和热键触发。触发之后获取当前鼠标的形状。如果不是左右移动的鼠标形状,就是左右调整大小的形状。则执行以下操作:

  1. 先做每次移动 5 个像素。
  2. 然后检查鼠标形状是否变成了左右拖动。
  3. 如果是,则停止。
  4. 如果不是,继续将当前鼠标位置往左移 5 个像素。
  5. 重复循环 10 次。
  6. 如果还是没有鼠标拖动的形状,则回到最初的位置,向右每次一动 5 个像素。
  7. 也是循环 10 次。
  8. 直到循环完成,或者遇到鼠标形状变为活动形状位置。
  • 日志输出一下每次移动之后获取到的鼠标形状。

  • 完成后如果没有找到目标,则回到最初位置

  • 增加相关的配置项

    • 步长和步数,就是每一步移动的像素值和总共移动多少步
    • 特定的 handle 值,以分号分隔,除了预定的以外,遇到配置的也停止。要分水平、垂直分别配置
  • 默认步长改为了 3 像素

日志整理、统一存放

  • codex://threads/01a10c2f-04a9-7ad1-898a-22261f40d01a
  • 整理一下现在系统当中都有哪些地方用到了日志,分别是怎么使用的。是否有统一的日志记录
  • 所有的日志都放到一个文件里面,还是按天分隔,沿用现有的分类前缀来区分日志类型
  • 所有的日志除了控制台的那一份输出不动以外,额外再输出到这个统一的日志文件里面。
  • 客户端日志额外汇总到 userData/logs/YYYY/MM/DD.log,保留现有分类前缀、控制台输出和同步日志。

npm start 后,通过 file/exit 退出,窗口关闭了,但进程还在;通过关闭窗口的方式退出就是正常的

  • exit 不退出问题 codex://threads/01a10c9c-5afe-7981-845a-0983250e30a4

剪贴板收集器

  • codex://threads/01a10b82-be44-7c43-ba07-9ffde6d0552a
  • 共享收集器,全应用只有一个收集目标
  • 指定一个收集文件,任意库的文件
    • 建议将此文件先加入 .mynoteignore,再新建
  • 切换后需要重新启动
  • 是否插入分隔符以及日期时间可以配置,默认都插入。

code snippet迁移

  • codex://threads/01a11488-0ee6-7041-a41d-a1631b7496ba

你说的流程在 FindHelper 的 PasteToAnyEx() 中:通过 SelForm 确定目标笔记 → 向外部编辑器发送复制文件路径快捷键 → 发送复制命令获取选中代码 → 读取剪贴板 → 包装成路径代码块并插入。这个采集、插入流程上次未包含。

  • 新增“检查代码片段”“整理代码片段”“比较代码片段”命令,接入编辑菜单、命令面板及现有快捷键配置,默认不分配快捷键。
  • codex://threads/01a11ee0-4715-71d3-8065-1b27db67b87d
    • edit-比较代码片段 下面新增菜单项 editor.insertCodeSnippetComment, 在当前caret位置插入注释标示:"//.,,",后面加一个换行符,默认快捷键:alt+i

类型识别

  • codex://threads/01a11fab-fdd5-7641-82d6-8b7cb1173188
  • 这种要能够识别出js类型
function switchTarget() {
  if (busy) return;
  target.value = target.value === 'current' ? 'temporary' : 'current';
  target.textContent = target.value === 'temporary' ? '临时笔记' : '当前笔记';
}

菜单索引

  • codex://threads/01a11a38-18a8-73c2-87fe-ad1856508403
  • 新增菜单:帮助-菜单索引,点击后将所有的菜单输出到类似文件查找的结果当中,用缩进表示层级,并解释每个菜单项的意义
  • TODO: 同时输出菜单命令ID

邮箱注册

misc

mynote-mobile

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