From 40e3e903b6dac0f6f43cc9174b793b58d4fe5170 Mon Sep 17 00:00:00 2001 From: nic <139033898+dicnunz@users.noreply.github.com> Date: Fri, 8 May 2026 22:17:53 -0400 Subject: [PATCH] Fix Vim Ctrl-C copy shortcut --- .../editor/components/CodeMirrorEditor.tsx | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/cloud/lib/editor/components/CodeMirrorEditor.tsx b/src/cloud/lib/editor/components/CodeMirrorEditor.tsx index ab594f5397..e46bcbbd43 100644 --- a/src/cloud/lib/editor/components/CodeMirrorEditor.tsx +++ b/src/cloud/lib/editor/components/CodeMirrorEditor.tsx @@ -16,6 +16,33 @@ interface EditorProps { onYTextChange?: (event: YEvent, ytext: YText) => void } +const defaultExtraKeys: CodeMirror.KeyMap = { + Enter: 'newlineAndIndentContinueMarkdownList', + Tab: 'indentMore', + 'Ctrl-C': (cm: CodeMirror.Editor) => { + if (cm.getOption('keyMap') === 'vim') { + document.execCommand('copy') + } + return CodeMirror.Pass + }, +} + +function buildEditorConfig( + config: CodeMirror.EditorConfiguration +): CodeMirror.EditorConfiguration { + if (typeof config.extraKeys === 'string') { + return config + } + + return { + ...config, + extraKeys: { + ...defaultExtraKeys, + ...config.extraKeys, + }, + } +} + const CodeMirrorEditor = ({ config = {}, realtime, @@ -35,13 +62,10 @@ const CodeMirrorEditor = ({ useEffectOnce(() => { if (editorRootRef.current != null) { - editorRef.current = CodeMirror(editorRootRef.current, { - extraKeys: { - Enter: 'newlineAndIndentContinueMarkdownList', - Tab: 'indentMore', - }, - ...config, - }) + editorRef.current = CodeMirror( + editorRootRef.current, + buildEditorConfig(config) + ) editorRef.current.on('keydown', (cm, event) => { if (cm.state.vim && cm.state.vim.insertMode) { @@ -76,7 +100,7 @@ const CodeMirrorEditor = ({ useEffect(() => { if (editorRef.current != null) { - Object.entries(config).forEach(([key, val]) => { + Object.entries(buildEditorConfig(config)).forEach(([key, val]) => { editorRef.current!.setOption( key as keyof CodeMirror.EditorConfiguration, val