Skip to content

编辑区背景灰色并增添光标,客户端快捷键cmd+S原地保存编辑文本 - #6

Open
Blacad wants to merge 1 commit into
lodebar2026:mainfrom
Blacad:main
Open

编辑区背景灰色并增添光标,客户端快捷键cmd+S原地保存编辑文本#6
Blacad wants to merge 1 commit into
lodebar2026:mainfrom
Blacad:main

Conversation

@Blacad

@Blacad Blacad commented Sep 1, 2026

Copy link
Copy Markdown

外观:
左侧光标:
左侧光标
右侧光标:
右侧光标
快捷键(文本diff显示客户端可以直接快捷键原地保存)和编辑显示:
文本diff显示客户端可以直接快捷键原地保存

@lodebar2026

Copy link
Copy Markdown
Owner

感谢 PR,方向是对的:脏标记 + Cmd/Ctrl+S 原地保存、源码↔谱面光标联动、编辑区配色,这三件事都值得做。我把分支合到当前 main 试了一遍:只有 3 处冲突src/layout/painter.ts 2 处、src/styles.css 1 处,都是两边各加各的,机械合并即可),合完 npx tsc --noEmit 通过。所以「陈旧」不是障碍,问题在内容。

下面按「该拿掉的 / 该返工的 / 小事」列一下。

该拿掉的

  1. examples/1.jpwabc 是误提交(新目录、700 字节 UTF-16LE 的测试文件),请删除。
  2. src-tauri/src/lib.rs 混进了整文件 rustfmt 重排(import 顺序、merged.objects.insert 折行、Options<'_> 等),与本 PR 无关的 diff 噪声,请从这个 PR 里剥掉。
  3. write_file_cmd 这一层建议删掉。 src-tauri/capabilities/default.json 里已经有 fs:allow-write-file$HOME/**$DESKTOP/**$DOCUMENT/**$DOWNLOAD/** 的 scope;主干的 saveFile() 本来就是「有 filePath 且在 Tauri 里就 writeTo(filePath) 原地写回」,并不会弹第二次另存为对话框——PR 里给的理由在现状下不成立。而新命令有两个实际代价:它绕过了 fs:scope 白名单(任意绝对路径都能写),并且 Array.from(bytes) 把二进制变成 JSON 数字数组过 IPC。如果你在实际使用中确实碰到 plugin-fs 写盘失败,请贴一下具体报错和路径,我们对症处理,而不是整条另开原生通道。

该返工的(编辑光标那部分)

  1. buildJpwCursorTargets 的映射太脆。 现在是「第 N 个 Note token ↔ parts[0] 的第 N 个 Chord」的纯序号对齐。休止符是 Chord(rest=true),这条确实能对上;但 Jpwabc.g4Note 还覆盖倚音 {6,} 与和音,多 .Voice(四声部)时又只取 parts[0]——任何一处不是严格 1:1,后面就整体错位,而且错位没有任何信号,光标只是静默指错音符。稳妥的做法是在排版时把源码 offset 带进 Chord/NoteEntry(OMR 那条路的 meta 映射已有先例),而不是靠序号对齐。
  2. 每次按键都是全量重建候选。 PuPainter.highlightEditingAt 每次遍历 noteItems/syllableItems 两个 Map 建数组再 filter + sort_syncEditorState 每次 getElementById。长谱上等于每次移动光标一次 O(n),该缓存。
  3. 光标 <line> 被 append 进音符组内部,成了页面 DOM 的子节点。当前导出走页面树、不走 DOM,所以风险低;但把 UI 装饰塞进内容组不干净,建议放到独立的覆盖层。

小事

  • navigator.platform 已废弃。
  • Mod-s 在 CodeMirror keymap 和 window keydown 两处都绑了;_saveTask 去重挡住了双写,但两份逻辑最好收成一处。
  • _setSaveFeedback 直接改按钮 textContent,和 _syncEditorState 的 class/title 是两套互不知情的状态机(「保存中…」期间若 _syncEditorState 触发不会重置文本)。
  • 没有跑仓库约定的回归:改渲染要 npm run build && node shot.mjs,样式也该截一张看看。

顺带表扬一处

openPath 里把 .abc 补进白名单(/\.(xml|musicxml|abc)$/i)是个真 bug 修——原本拖入 .abc 会把 filePath 设成 .abc 路径,后面保存就写错文件了。这条我们要。

建议的落地方式

拆成三个 PR,各自 rebase 到当前 main:

  • A. 保存能力:快捷键 + 脏标记 + 保存按钮状态 + .abc 白名单修正。去掉 write_file_cmd 和 rustfmt 噪声之后,这个可以直接合,价值最高。
  • B. 编辑区外观:可以合,--editor-bg / --editor-gutter 跟主干色板对齐一下。
  • C. 编辑光标:映射改成携带源码 offset 之后再合。

拆好之后我这边优先看 A。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants