diff --git a/frontend/src/lib/components/editor/Editor.svelte b/frontend/src/lib/components/editor/Editor.svelte index 40749f8..b9610ad 100644 --- a/frontend/src/lib/components/editor/Editor.svelte +++ b/frontend/src/lib/components/editor/Editor.svelte @@ -127,10 +127,7 @@ } }); - // enable vim mode if preference is enabled - if (localVimMode) { - initializeVimMode(); - } + // vim mode will be initialized by reactive statement if needed editor.getModel().onDidChangeContent((e) => { if (previewRenderDelayID) { @@ -145,10 +142,8 @@ return () => { document.body.classList.remove('overflow-hidden'); - if (vimModeInstance && vimModeInstance.dispose) { - vimModeInstance.dispose(); - vimModeInstance = null; - } + // properly cleanup vim mode first + destroyVimMode(); if (editor) { editor.dispose(); monaco.editor.getModels().forEach((model) => model.dispose()); @@ -174,8 +169,12 @@ const destroyVimMode = () => { if (vimModeInstance) { - // use official monaco-vim dispose method - vimModeInstance.dispose(); + try { + // use official monaco-vim dispose method + vimModeInstance.dispose(); + } catch (e) { + console.warn('Error disposing vim mode:', e); + } // clear vim status bar if (vimStatusBar) { @@ -193,13 +192,22 @@ localVimMode = $vimModeEnabled; } - // Watch for vim mode changes after initial load + // debounce vim mode changes to prevent race conditions + let vimModeTimeout = null; + + // Watch for vim mode changes and editor initialization $: if (editor && typeof localVimMode === 'boolean') { - if (localVimMode && !vimModeInstance) { - initializeVimMode(); - } else if (!localVimMode && vimModeInstance) { - destroyVimMode(); + if (vimModeTimeout) { + clearTimeout(vimModeTimeout); } + vimModeTimeout = setTimeout(() => { + if (localVimMode && !vimModeInstance) { + initializeVimMode(); + } else if (!localVimMode && vimModeInstance) { + destroyVimMode(); + } + vimModeTimeout = null; + }, 100); } const selectPreviewDomain = () => { diff --git a/frontend/src/lib/components/editor/SimpleCodeEditor.svelte b/frontend/src/lib/components/editor/SimpleCodeEditor.svelte index bbd6b94..153f78e 100644 --- a/frontend/src/lib/components/editor/SimpleCodeEditor.svelte +++ b/frontend/src/lib/components/editor/SimpleCodeEditor.svelte @@ -94,10 +94,7 @@ wordBasedSuggestions: 'off' }); - // enable vim mode if preference is enabled - if (localVimMode) { - initializeVimMode(); - } + // vim mode will be initialized by reactive statement if needed // Update value when editor content changes editor.getModel().onDidChangeContent(() => { @@ -106,10 +103,8 @@ return () => { cleanup(); - if (vimModeInstance && vimModeInstance.dispose) { - vimModeInstance.dispose(); - vimModeInstance = null; - } + // properly cleanup vim mode first + destroyVimMode(); }; }); @@ -133,8 +128,12 @@ const destroyVimMode = () => { if (vimModeInstance) { - // use official monaco-vim dispose method - vimModeInstance.dispose(); + try { + // use official monaco-vim dispose method + vimModeInstance.dispose(); + } catch (e) { + console.warn('Error disposing vim mode:', e); + } // clear vim status bar if (vimStatusBar) { @@ -152,13 +151,22 @@ localVimMode = $vimModeEnabled; } + // debounce vim mode changes to prevent race conditions + let vimModeTimeout = null; + // Watch for vim mode changes $: if (editor && typeof localVimMode === 'boolean') { - if (localVimMode && !vimModeInstance) { - initializeVimMode(); - } else if (!localVimMode && vimModeInstance) { - destroyVimMode(); + if (vimModeTimeout) { + clearTimeout(vimModeTimeout); } + vimModeTimeout = setTimeout(() => { + if (localVimMode && !vimModeInstance) { + initializeVimMode(); + } else if (!localVimMode && vimModeInstance) { + destroyVimMode(); + } + vimModeTimeout = null; + }, 100); } let showExample = false;