详细文档(docs-mynote-client)
- 项目总览 README
- 功能说明(含快捷键)FEATURES
- 技术架构 tech-arch
- 同步流程与代码位置 sync-flow
- 阶段 0 工程基线
- 阶段 1 可靠性设计与验证
- 阶段 2 桌面笔记库设计与验证
- 阶段 5 托管同步 Beta
dev
- 28488238@qq.com
- https://192.168.0.223:8787
- qwer0987qw
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
快捷键 & 热键
详细说明:
-
快捷键要精确判断,比如 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
-
精确命令定位配置: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 这种快捷键,当输入法开启时,第二部分会被输入法拦截
- 71b4d3e codex://threads/01a09a76-d18d-7473-9502-56b8e3c2efb0
- win:codex://threads/01a09df3-5539-74a3-aeb7-09f8c2f0f303
- e75bddd 最终 win/mac 合并版本
- alt + pagedown/up,连续几次,会输出一个字符到编辑器
热键、快捷键分离
- 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
页面内搜索 && 高亮
编辑、预览:搜索匹配要全部高亮,当前匹配独立高亮
- 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 直接在运行中输入执行
- codex://threads/01a0a85a-d805-7202-b23a-d2e1138364f7
- open in vscode
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
-
配置细节
- https://react.dev/learn/creating-a-react-app 则映射到 creating-a-react-app.md,编辑器中打开此文件
- 映射算法参见:E:\projects\pjkit\tools\doc-crawler\doc-crawler.js
- 可以不配置,走老的逻辑
-
编辑和预览的情况下,都通过 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
- 录音
语音转文字批量转换
- codex://threads/01a10a40-1c93-76a0-9f0b-4a109a2501fd
- 语音识别、豆包语音转文字
- 重复插入 codex://threads/01a11134-b885-7522-9d99-dcf01c517ee7
大纲
大纲搜索
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.promoteHeadingLevelseditor.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 同级目录
同步
- 同步过程输出进度
- 重新登录后不会全部重新拉取,状态要能够全部立即从本地恢复
- 与上一版本相比,正文内容无变化。这种应该忽略,不要增加一个版本 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 失效链接
- feat: reveal files in system explorer 12f1e9c 2.5 失效链接检查
see 多文件搜索/替换
- 功能实现类似
文件管理
详细说明:阶段 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", 标示“与”关系。现在我需要一个类似这样的过滤表达式支持,有哪些成熟的方案?
- https://docs.github.com/en/search-github/github-code-search/understanding-github-code-search-syntax#organization-and-user-qualifiers
- p: 完整路径
- f: 文件名
@、@!、@@也需要支持
| 输入 | 匹配 | 不匹配及原因 |
|---|---|---|
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
- 转换
- pinned:不被全部关闭
- normal:不会降级
- require repeat close for pinned editors
alt + 数字跳转到对应的tab,1-based
- codex://threads/01a0c933-34f0-70d2-827c-7a7f677686a4
- alt + pagedown/up,连续几次,会输出一个字符到编辑器
复制(相对)路径 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
- 网络不通或者没有登录时依然可用。
打包文件
- 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
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
状态栏
- 显示 caret 所处的行列,如果有选择再加上选择的长度
侧栏 sidebar
侧栏分区优化:每个分区都可以折叠展开。分区的标题文字字体加大,参考第一个分区的样式。 599ddc7
repo ui state data 仓库界面状态数据
- 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
云同步
收藏、快捷键配置等
-
codex://threads/01a0de57-c159-7a63-a5ac-883807274555
-
codex://threads/01a0edc7-f521-7651-ae25-393943916924
-
codex://threads/01a0edda-ed76-7b33-a093-387e5cc207b4
-
codex://threads/01a0ef69-878c-7f73-a8dd-0d3ce5a42c12
-
用户手动触发同步时,也同步账户数据
时间过滤 & 差异 diff
- eaa3b98 codex://threads/01a094ae-29ed-7583-9b8f-7279346478ac
- 文件过滤器
- 4.2.1 文件筛选、差异与打包模块
- 文件筛选与打包
左侧文件树分区增加一个时间过滤功能:默认不过滤,用户点击后弹出一个界面可以输入一个日期。也可以下拉选择最近一天、最近七天、最近一个月、最近两个月、最近三个月、最近半年,也可以通过日历指定日期,再加上一个重置按钮,用户指定时间后按此时间对展示的文件进行过滤,比如用户输入的 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 跟踪重命名后的当前路径。
- 当前文件已删除时,显示完整删除差异。
- 每次切换到当前版本都会重新读取,避免展示旧缓存。
文件树比较
- 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 迁移
- codex://threads/01a09a2e-c4e6-78c1-84ce-88c2010f6508
- codemirror-migration.md
- 2026-9-13
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
-
时间、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 只要形状变化就阻止,有的自定义形状难以监控,每次重启都会变化
- 方案二:ctrl/cmd alt 监听鼠标移动,变化则阻止
在菜单项 View/片段管理器下面加一个鼠标位置微调。同片段管理器一样,同时支持命令面板和热键触发。触发之后获取当前鼠标的形状。如果不是左右移动的鼠标形状,就是左右调整大小的形状。则执行以下操作:
- 先做每次移动 5 个像素。
- 然后检查鼠标形状是否变成了左右拖动。
- 如果是,则停止。
- 如果不是,继续将当前鼠标位置往左移 5 个像素。
- 重复循环 10 次。
- 如果还是没有鼠标拖动的形状,则回到最初的位置,向右每次一动 5 个像素。
- 也是循环 10 次。
- 直到循环完成,或者遇到鼠标形状变为活动形状位置。
-
日志输出一下每次移动之后获取到的鼠标形状。
-
完成后如果没有找到目标,则回到最初位置
-
增加相关的配置项
- 步长和步数,就是每一步移动的像素值和总共移动多少步
- 特定的 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
邮箱注册
- codex://threads/01a10ffd-739d-7240-b210-59f224738c39
- codex://threads/01a123ce-eef2-78d0-a059-b77af343ab5c
- 2.1 SMTP 与邮箱验证码注册
