reiji-h 2 лет назад
Родитель
Сommit
fe10954ae3

+ 1 - 13
packages/editor/src/components/CodeMirrorEditor/CodeMirrorEditor.tsx

@@ -9,7 +9,7 @@ import type { ReactCodeMirrorProps } from '@uiw/react-codemirror';
 
 
 import { GlobalCodeMirrorEditorKey, AcceptedUploadFileType } from '../../consts';
 import { GlobalCodeMirrorEditorKey, AcceptedUploadFileType } from '../../consts';
 import {
 import {
-  useFileDropzone, FileDropzoneOverlay, AllEditorTheme, AllKeymap,
+  useFileDropzone, FileDropzoneOverlay, AllEditorTheme,
 } from '../../services';
 } from '../../services';
 import {
 import {
   getStrFromBol, adjustPasteData,
   getStrFromBol, adjustPasteData,
@@ -35,7 +35,6 @@ type Props = {
   onScroll?: () => void,
   onScroll?: () => void,
   indentSize?: number,
   indentSize?: number,
   editorTheme?: string,
   editorTheme?: string,
-  editorKeymap?: string,
 }
 }
 
 
 export const CodeMirrorEditor = (props: Props): JSX.Element => {
 export const CodeMirrorEditor = (props: Props): JSX.Element => {
@@ -47,7 +46,6 @@ export const CodeMirrorEditor = (props: Props): JSX.Element => {
     onScroll,
     onScroll,
     indentSize,
     indentSize,
     editorTheme,
     editorTheme,
-    editorKeymap,
   } = props;
   } = props;
 
 
   const containerRef = useRef(null);
   const containerRef = useRef(null);
@@ -161,16 +159,6 @@ export const CodeMirrorEditor = (props: Props): JSX.Element => {
   }, [codeMirrorEditor, editorTheme]);
   }, [codeMirrorEditor, editorTheme]);
 
 
 
 
-  useEffect(() => {
-
-    const keymap = editorKeymap ?? 'default';
-    const extension = AllKeymap[keymap] ?? AllKeymap.default;
-
-    const cleanupFunction = codeMirrorEditor?.appendExtensions(Prec.low(extension));
-    return cleanupFunction;
-
-  }, [codeMirrorEditor, editorKeymap]);
-
   const {
   const {
     getRootProps,
     getRootProps,
     isDragActive,
     isDragActive,

+ 12 - 2
packages/editor/src/components/CodeMirrorEditorMain.tsx

@@ -1,9 +1,10 @@
 import { useEffect } from 'react';
 import { useEffect } from 'react';
 
 
-import { type Extension } from '@codemirror/state';
+import { type Extension, Prec } from '@codemirror/state';
 import { keymap, scrollPastEnd } from '@codemirror/view';
 import { keymap, scrollPastEnd } from '@codemirror/view';
 
 
 import { GlobalCodeMirrorEditorKey, AcceptedUploadFileType } from '../consts';
 import { GlobalCodeMirrorEditorKey, AcceptedUploadFileType } from '../consts';
+import { getKeymap } from '../services';
 import { setDataLine } from '../services/extensions/setDataLine';
 import { setDataLine } from '../services/extensions/setDataLine';
 import { useCodeMirrorEditorIsolated } from '../stores';
 import { useCodeMirrorEditorIsolated } from '../stores';
 
 
@@ -66,6 +67,16 @@ export const CodeMirrorEditorMain = (props: Props): JSX.Element => {
     return cleanupFunction;
     return cleanupFunction;
   }, [codeMirrorEditor, onSave]);
   }, [codeMirrorEditor, onSave]);
 
 
+  useEffect(() => {
+
+    const keymap = editorKeymap ?? 'default';
+    const extension = getKeymap(keymap, onSave);
+
+    const cleanupFunction = codeMirrorEditor?.appendExtensions(Prec.low(extension));
+    return cleanupFunction;
+
+  }, [codeMirrorEditor, editorKeymap, onSave]);
+
 
 
   return (
   return (
     <CodeMirrorEditor
     <CodeMirrorEditor
@@ -76,7 +87,6 @@ export const CodeMirrorEditorMain = (props: Props): JSX.Element => {
       acceptedFileType={acceptedFileTypeNoOpt}
       acceptedFileType={acceptedFileTypeNoOpt}
       indentSize={indentSize}
       indentSize={indentSize}
       editorTheme={editorTheme}
       editorTheme={editorTheme}
-      editorKeymap={editorKeymap}
     />
     />
   );
   );
 };
 };

+ 13 - 5
packages/editor/src/services/keymaps/index.ts

@@ -9,9 +9,17 @@ import { vscodeKeymap } from '@replit/codemirror-vscode-keymap';
 Vim.map('jj', '<Esc>', 'insert');
 Vim.map('jj', '<Esc>', 'insert');
 Vim.map('jk', '<Esc>', 'insert');
 Vim.map('jk', '<Esc>', 'insert');
 
 
-export const AllKeymap: Record<string, Extension> = {
-  default: keymap.of(defaultKeymap),
-  vim: vim(),
-  emacs: emacs(),
-  vscode: keymap.of(vscodeKeymap),
+export const getKeymap = (keymapName: string, onSave?: () => void): Extension => {
+  switch (keymapName) {
+    case 'vim':
+      if (onSave != null) {
+        Vim.defineEx('write', 'w', onSave);
+      }
+      return vim();
+    case 'emacs':
+      return emacs();
+    case 'vscode':
+      return keymap.of(vscodeKeymap);
+  }
+  return keymap.of(defaultKeymap);
 };
 };