Skip to content

Commit 1681df6

Browse files
committed
fix: 修复撤销时会影响非当前文档的问题
1 parent 6777a96 commit 1681df6

2 files changed

Lines changed: 37 additions & 2 deletions

File tree

src/main/menu.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,26 @@ export default function createMenu() {
3838
{
3939
label: "编辑",
4040
submenu: [
41-
{ label: "撤销", accelerator: "CmdOrCtrl+Z", role: "undo" },
42-
{ label: "重做", accelerator: "Shift+CmdOrCtrl+Z", role: "redo" },
41+
// 撤销/重做由 ProseMirror 的 history 插件通过 keymap 处理(每个编辑器实例独立)
42+
// 不使用 Electron 的 role: "undo"/"redo",否则会调用浏览器原生撤销,
43+
// 在多 Tab(v-show)模式下可能影响非当前文档
44+
// registerAccelerator: false 仅在菜单中显示快捷键,不实际注册,让按键事件传到渲染进程
45+
{
46+
label: "撤销",
47+
accelerator: "CmdOrCtrl+Z",
48+
registerAccelerator: false,
49+
click: () => {
50+
getFocusedWindow()?.webContents.send("editor:undo");
51+
},
52+
},
53+
{
54+
label: "重做",
55+
accelerator: "Shift+CmdOrCtrl+Z",
56+
registerAccelerator: false,
57+
click: () => {
58+
getFocusedWindow()?.webContents.send("editor:redo");
59+
},
60+
},
4361
{ label: "剪切", accelerator: "CmdOrCtrl+X", role: "cut" },
4462
{ label: "复制", accelerator: "CmdOrCtrl+C", role: "copy" },
4563
{ label: "粘贴", accelerator: "CmdOrCtrl+V", role: "paste" },

src/renderer/components/editor/MilkupEditor.vue

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
type ImagePasteMethod,
1414
setGlobalMermaidDefaultMode,
1515
} from "@/core";
16+
import { undo, redo } from "prosemirror-history";
1617
import { uploadImage } from "@/renderer/services/api";
1718
import { AIService } from "@/renderer/services/ai";
1819
import { useAIConfig } from "@/renderer/hooks/useAIConfig";
@@ -278,6 +279,8 @@ onUnmounted(() => {
278279
emitter.off("sourceView:toggle", handleSourceViewToggle);
279280
emitter.off("outline:scrollTo", handleOutlineScrollTo);
280281
emitter.off("editor:reload", handleEditorReload);
282+
window.electronAPI.removeListener?.("editor:undo", handleMenuUndo);
283+
window.electronAPI.removeListener?.("editor:redo", handleMenuRedo);
281284
});
282285
283286
// 处理源码模式切换事件(仅活跃编辑器响应)
@@ -302,6 +305,20 @@ function handleOutlineScrollTo(pos: unknown) {
302305
}
303306
emitter.on("outline:scrollTo", handleOutlineScrollTo);
304307
308+
// 处理菜单栏的撤销/重做(仅活跃编辑器响应)
309+
function handleMenuUndo() {
310+
if (!props.isActive || !editor) return;
311+
const view = editor.view;
312+
undo(view.state, view.dispatch.bind(view));
313+
}
314+
function handleMenuRedo() {
315+
if (!props.isActive || !editor) return;
316+
const view = editor.view;
317+
redo(view.state, view.dispatch.bind(view));
318+
}
319+
window.electronAPI.on?.("editor:undo", handleMenuUndo);
320+
window.electronAPI.on?.("editor:redo", handleMenuRedo);
321+
305322
// 处理编辑器重载事件(仅活跃编辑器响应)
306323
function handleEditorReload() {
307324
if (!props.isActive || !containerRef.value) return;

0 commit comments

Comments
 (0)