From 3069b14e9c73dbd77bc7ef3f706c09c10063402a Mon Sep 17 00:00:00 2001 From: Roipoussiere Date: Fri, 9 Jun 2023 13:41:40 +0200 Subject: [PATCH 1/6] enable autocompletion --- packages/react/src/components/CodeMirror6.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/react/src/components/CodeMirror6.jsx b/packages/react/src/components/CodeMirror6.jsx index ebe3dd11..95f30cd4 100644 --- a/packages/react/src/components/CodeMirror6.jsx +++ b/packages/react/src/components/CodeMirror6.jsx @@ -7,7 +7,7 @@ import strudelTheme from '../themes/strudel-theme'; import './style.css'; import { useCallback } from 'react'; import { autocompletion } from '@codemirror/autocomplete'; -//import { strudelAutocomplete } from './Autocomplete'; +import { strudelAutocomplete } from './Autocomplete'; import { vim } from '@replit/codemirror-vim'; import { emacs } from '@replit/codemirror-emacs'; @@ -93,8 +93,7 @@ const staticExtensions = [ highlightField, flashField, // javascriptLanguage.data.of({ autocomplete: strudelAutocomplete }), - // autocompletion({ override: [strudelAutocomplete] }), - autocompletion({ override: [] }), // wait for https://github.com/uiwjs/react-codemirror/pull/458 + autocompletion({ override: [strudelAutocomplete] }), ]; export default function CodeMirror({ From a9ad3a56ad52d84efa1f8eec12ea50d627e06503 Mon Sep 17 00:00:00 2001 From: Roipoussiere Date: Fri, 9 Jun 2023 14:30:20 +0200 Subject: [PATCH 2/6] autocomplete: avoid tabs overlapping --- packages/react/src/components/style.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/react/src/components/style.css b/packages/react/src/components/style.css index 6d5d0805..d61c6619 100644 --- a/packages/react/src/components/style.css +++ b/packages/react/src/components/style.css @@ -24,3 +24,7 @@ .cm-theme-light { width: 100%; } + +footer { + z-index: 0 !important; +} From 6f04a1b8fabde2c6e0a140136f0da8b224458d68 Mon Sep 17 00:00:00 2001 From: Roipoussiere Date: Fri, 9 Jun 2023 14:52:07 +0200 Subject: [PATCH 3/6] autocomplete: add vanilla js completion --- packages/react/src/components/CodeMirror6.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/react/src/components/CodeMirror6.jsx b/packages/react/src/components/CodeMirror6.jsx index 95f30cd4..920ed367 100644 --- a/packages/react/src/components/CodeMirror6.jsx +++ b/packages/react/src/components/CodeMirror6.jsx @@ -2,7 +2,7 @@ import React, { useMemo } from 'react'; import _CodeMirror from '@uiw/react-codemirror'; import { EditorView, Decoration } from '@codemirror/view'; import { StateField, StateEffect } from '@codemirror/state'; -import { javascript } from '@codemirror/lang-javascript'; +import { javascript, javascriptLanguage } from '@codemirror/lang-javascript'; import strudelTheme from '../themes/strudel-theme'; import './style.css'; import { useCallback } from 'react'; @@ -92,8 +92,7 @@ const staticExtensions = [ javascript(), highlightField, flashField, - // javascriptLanguage.data.of({ autocomplete: strudelAutocomplete }), - autocompletion({ override: [strudelAutocomplete] }), + javascriptLanguage.data.of({ autocomplete: strudelAutocomplete }), ]; export default function CodeMirror({ From 2d2d0cabb3ab66c3ba119e09e4af06ee9fa74b47 Mon Sep 17 00:00:00 2001 From: Roipoussiere Date: Fri, 9 Jun 2023 16:38:48 +0200 Subject: [PATCH 4/6] Add option in settings to enable autocompletion --- packages/react/src/components/CodeMirror6.jsx | 11 ++++++++++- website/src/repl/Footer.jsx | 17 +++++++++++++++-- website/src/repl/Repl.jsx | 10 +++++++++- website/src/settings.mjs | 2 ++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/react/src/components/CodeMirror6.jsx b/packages/react/src/components/CodeMirror6.jsx index 920ed367..99e224b9 100644 --- a/packages/react/src/components/CodeMirror6.jsx +++ b/packages/react/src/components/CodeMirror6.jsx @@ -103,6 +103,7 @@ export default function CodeMirror({ theme, keybindings, isLineNumbersDisplayed, + isAutoCompletionEnabled, fontSize = 18, fontFamily = 'monospace', options, @@ -114,12 +115,14 @@ export default function CodeMirror({ }, [onChange], ); + const handleOnCreateEditor = useCallback( (view) => { onViewChanged?.(view); }, [onViewChanged], ); + const handleOnUpdate = useCallback( (viewUpdate) => { if (viewUpdate.selectionSet && onSelectionChange) { @@ -128,6 +131,7 @@ export default function CodeMirror({ }, [onSelectionChange], ); + const extensions = useMemo(() => { let bindings = { vim, @@ -138,6 +142,11 @@ export default function CodeMirror({ } return staticExtensions; }, [keybindings]); + + const setAutoCompletion = isAutoCompletionEnabled => isAutoCompletionEnabled ? + javascriptLanguage.data.of({ autocomplete: strudelAutocomplete }) : + autocompletion({ override: [] }) + return (
<_CodeMirror @@ -146,7 +155,7 @@ export default function CodeMirror({ onChange={handleOnChange} onCreateEditor={handleOnCreateEditor} onUpdate={handleOnUpdate} - extensions={extensions} + extensions={[ ...extensions, setAutoCompletion(isAutoCompletionEnabled) ]} basicSetup={{ lineNumbers: isLineNumbersDisplayed }} />
diff --git a/website/src/repl/Footer.jsx b/website/src/repl/Footer.jsx index c31e167a..191159c9 100644 --- a/website/src/repl/Footer.jsx +++ b/website/src/repl/Footer.jsx @@ -364,7 +364,15 @@ const fontFamilyOptions = { }; function SettingsTab({ scheduler }) { - const { theme, keybindings, isLineNumbersDisplayed, fontSize, fontFamily } = useSettings(); + const { + theme, + keybindings, + isLineNumbersDisplayed, + isAutoCompletionEnabled, + fontSize, + fontFamily + } = useSettings(); + return (
{/* @@ -406,7 +414,7 @@ function SettingsTab({ scheduler }) { />
-
+
settingsMap.setKey('isLineNumbersDisplayed', cbEvent.target.checked)} value={isLineNumbersDisplayed} /> + settingsMap.setKey('isAutoCompletionEnabled', cbEvent.target.checked)} + value={isAutoCompletionEnabled} + />