Skip to content

Commit 4a12f92

Browse files
authored
add vim mode setting to playground (#1076)
* add vim mode setting to playground * use rescript core option instead of belt
1 parent e109191 commit 4a12f92

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

src/Playground.res

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
%%raw(`
22
if (typeof window !== "undefined" && typeof window.navigator !== "undefined") {
33
require("codemirror/mode/javascript/javascript");
4+
require("codemirror/keymap/vim");
45
require("codemirror/addon/scroll/simplescrollbars");
56
require("plugins/cm-rescript-mode");
67
require("plugins/cm-reason-mode");
@@ -839,8 +840,10 @@ module Settings = {
839840
~setConfig: Api.Config.t => unit,
840841
~editorCode: React.ref<string>,
841842
~config: Api.Config.t,
843+
~keyMapState: (CodeMirror.KeyMap.t, (CodeMirror.KeyMap.t => CodeMirror.KeyMap.t) => unit),
842844
) => {
843845
let {Api.Config.warn_flags: warn_flags} = config
846+
let (keyMap, setKeyMap) = keyMapState
844847

845848
let availableTargetLangs = Api.Version.availableLanguages(readyState.selected.apiVersion)
846849

@@ -975,6 +978,19 @@ module Settings = {
975978
} else {
976979
React.null
977980
}}
981+
<div className="mt-6">
982+
<div className=titleClass> {React.string("Use Vim Keymap")} </div>
983+
<ToggleSelection
984+
values=[CodeMirror.KeyMap.Default, CodeMirror.KeyMap.Vim]
985+
toLabel={enabled =>
986+
switch enabled {
987+
| CodeMirror.KeyMap.Vim => "On"
988+
| CodeMirror.KeyMap.Default => "Off"
989+
}}
990+
selected=keyMap
991+
onChange={value => setKeyMap(_ => value)}
992+
/>
993+
</div>
978994
<div className="mt-6">
979995
<div className=titleClass> {React.string("Module-System")} </div>
980996
<ToggleSelection
@@ -1183,6 +1199,7 @@ module OutputPanel = {
11831199
~compilerDispatch,
11841200
~compilerState: CompilerManagerHook.state,
11851201
~editorCode: React.ref<string>,
1202+
~keyMapState: (CodeMirror.KeyMap.t, (CodeMirror.KeyMap.t => CodeMirror.KeyMap.t) => unit),
11861203
~currentTab: tab,
11871204
) => {
11881205
let output =
@@ -1223,7 +1240,9 @@ module OutputPanel = {
12231240
let config = ready.selected.config
12241241
let setConfig = config => compilerDispatch(UpdateConfig(config))
12251242

1226-
<Settings readyState=ready dispatch=compilerDispatch editorCode setConfig config />
1243+
<Settings
1244+
readyState=ready dispatch=compilerDispatch editorCode setConfig config keyMapState
1245+
/>
12271246
| SetupFailed(msg) => <div> {React.string("Setup failed: " ++ msg)} </div>
12281247
| Init => <div> {React.string("Initalizing Playground...")} </div>
12291248
}
@@ -1459,6 +1478,22 @@ let make = (~versions: array<string>) => {
14591478
(),
14601479
)
14611480

1481+
let overlayState = React.useState(() => false)
1482+
1483+
let windowWidth = CodeMirror.useWindowWidth()
1484+
1485+
let (keyMap, setKeyMap) = React.useState(() => {
1486+
Dom.Storage2.localStorage
1487+
->Dom.Storage2.getItem("vimMode")
1488+
->Option.map(CodeMirror.KeyMap.fromString)
1489+
->Option.getOr(CodeMirror.KeyMap.Default)
1490+
})
1491+
1492+
React.useEffect1(() => {
1493+
Dom.Storage2.localStorage->Dom.Storage2.setItem("vimMode", CodeMirror.KeyMap.toString(keyMap))
1494+
None
1495+
}, [keyMap])
1496+
14621497
// The user can focus an error / warning on a specific line & column
14631498
// which is stored in this ref and triggered by hover / click states
14641499
// in the CodeMirror editor
@@ -1820,6 +1855,7 @@ let make = (~versions: array<string>) => {
18201855
}}
18211856
onMarkerFocus={rowCol => setFocusedRowCol(_prev => Some(rowCol))}
18221857
onMarkerFocusLeave={_ => setFocusedRowCol(_ => None)}
1858+
keyMap
18231859
/>
18241860
</div>
18251861
// Separator
@@ -1849,7 +1885,9 @@ let make = (~versions: array<string>) => {
18491885
<div
18501886
ref={ReactDOM.Ref.domRef((Obj.magic(subPanelRef): React.ref<Nullable.t<Dom.element>>))}
18511887
className="overflow-auto">
1852-
<OutputPanel currentTab compilerDispatch compilerState editorCode />
1888+
<OutputPanel
1889+
currentTab compilerDispatch compilerState editorCode keyMapState={(keyMap, setKeyMap)}
1890+
/>
18531891
</div>
18541892
</div>
18551893
</div>

src/components/CodeMirror.res

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@
88
This file is providing the core functionality and logic of our CodeMirror instances.
99
*/
1010

11+
module KeyMap = {
12+
type t = Default | Vim
13+
let toString = (keyMap: t) =>
14+
switch keyMap {
15+
| Default => "default"
16+
| Vim => "vim"
17+
}
18+
19+
let fromString = (str: string) =>
20+
switch str {
21+
| "vim" => Vim
22+
| _ => Default
23+
}
24+
}
25+
1126
let useWindowWidth: unit => int = %raw(` () => {
1227
const isClient = typeof window === 'object';
1328
@@ -62,6 +77,7 @@ module CM = {
6277
lineWrapping?: bool,
6378
fixedGutter?: bool,
6479
scrollbarStyle?: string,
80+
keyMap?: string,
6581
}
6682
}
6783

@@ -527,6 +543,7 @@ let make = // props relevant for the react wrapper
527543
~readOnly=false,
528544
~lineNumbers=true,
529545
~scrollbarStyle="native",
546+
~keyMap=KeyMap.Default,
530547
~lineWrapping=false,
531548
): React.element => {
532549
let inputElement = React.useRef(Nullable.null)
@@ -536,7 +553,7 @@ let make = // props relevant for the react wrapper
536553
let windowWidth = useWindowWidth()
537554
let (onMouseOver, onMouseOut, onMouseMove) = useHoverTooltip(~cmStateRef, ~cmRef, ())
538555

539-
React.useEffect(() =>
556+
React.useEffect(() => {
540557
switch inputElement.current->Nullable.toOption {
541558
| Some(input) =>
542559
let options = {
@@ -548,6 +565,7 @@ let make = // props relevant for the react wrapper
548565
readOnly,
549566
lineNumbers,
550567
scrollbarStyle,
568+
keyMap: KeyMap.toString(keyMap),
551569
}
552570
let cm = CM.fromTextArea(input, options)
553571

@@ -590,7 +608,7 @@ let make = // props relevant for the react wrapper
590608
Some(cleanup)
591609
| None => None
592610
}
593-
, [])
611+
}, [keyMap])
594612

595613
React.useEffect(() => {
596614
cmStateRef.current.hoverHints = hoverHints

src/components/CodeMirror.resi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
module KeyMap: {
2+
type t = Default | Vim
3+
let toString: t => string
4+
let fromString: string => t
5+
}
6+
17
module Error: {
28
type kind = [#Error | #Warning]
39

@@ -36,6 +42,7 @@ module CM: {
3642
lineWrapping?: bool,
3743
fixedGutter?: bool,
3844
scrollbarStyle?: string,
45+
keyMap?: string,
3946
}
4047
}
4148
}
@@ -59,5 +66,6 @@ let make: (
5966
~readOnly: bool=?,
6067
~lineNumbers: bool=?,
6168
~scrollbarStyle: string=?,
69+
~keyMap: KeyMap.t=?,
6270
~lineWrapping: bool=?,
6371
) => React.element

0 commit comments

Comments
 (0)