Skip to content

Commit f492385

Browse files
committed
add vim mode setting to playground
1 parent f09a3f0 commit f492385

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

src/Playground.res

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
%%raw(`
1313
if (typeof window !== "undefined" && typeof window.navigator !== "undefined") {
1414
require("codemirror/mode/javascript/javascript");
15+
require("codemirror/keymap/vim");
1516
require("codemirror/addon/scroll/simplescrollbars");
1617
require("plugins/cm-rescript-mode");
1718
require("plugins/cm-reason-mode");
@@ -1005,8 +1006,10 @@ module Settings = {
10051006
~setConfig: Api.Config.t => unit,
10061007
~editorCode: React.ref<string>,
10071008
~config: Api.Config.t,
1009+
~keyMapState: (CodeMirror.KeyMap.t, (CodeMirror.KeyMap.t => CodeMirror.KeyMap.t) => unit),
10081010
) => {
10091011
let {Api.Config.warn_flags: warn_flags} = config
1012+
let (keyMap, setKeyMap) = keyMapState
10101013

10111014
let availableTargetLangs = Api.Version.availableLanguages(readyState.selected.apiVersion)
10121015

@@ -1085,6 +1088,19 @@ module Settings = {
10851088
onChange=onTargetLangSelect
10861089
/>
10871090
</div>
1091+
<div className="mt-6">
1092+
<div className=titleClass> {React.string("Vim")} </div>
1093+
<ToggleSelection
1094+
values=[CodeMirror.KeyMap.Default, CodeMirror.KeyMap.Vim]
1095+
toLabel={enabled =>
1096+
switch enabled {
1097+
| CodeMirror.KeyMap.Vim => "On"
1098+
| CodeMirror.KeyMap.Default => "Off"
1099+
}}
1100+
selected=keyMap
1101+
onChange={value => setKeyMap(_ => value)}
1102+
/>
1103+
</div>
10881104
<div className="mt-6">
10891105
<div className=titleClass> {React.string("Module-System")} </div>
10901106
<ToggleSelection
@@ -1279,6 +1295,7 @@ module OutputPanel = {
12791295
~compilerDispatch,
12801296
~compilerState: CompilerManagerHook.state,
12811297
~editorCode: React.ref<string>,
1298+
~keyMapState: (CodeMirror.KeyMap.t, (CodeMirror.KeyMap.t => CodeMirror.KeyMap.t) => unit),
12821299
) => {
12831300
/*
12841301
We need the prevState to understand different
@@ -1370,7 +1387,9 @@ module OutputPanel = {
13701387
let config = ready.selected.config
13711388
let setConfig = config => compilerDispatch(UpdateConfig(config))
13721389

1373-
<Settings readyState=ready dispatch=compilerDispatch editorCode setConfig config />
1390+
<Settings
1391+
readyState=ready dispatch=compilerDispatch editorCode setConfig config keyMapState
1392+
/>
13741393
| SetupFailed(msg) => <div> {React.string("Setup failed: " ++ msg)} </div>
13751394
| Init => <div> {React.string("Initalizing Playground...")} </div>
13761395
}
@@ -1565,6 +1584,18 @@ let default = () => {
15651584

15661585
let windowWidth = CodeMirror.useWindowWidth()
15671586

1587+
let (keyMap, setKeyMap) = React.useState(() => {
1588+
Dom.Storage2.localStorage
1589+
->Dom.Storage2.getItem("vimMode")
1590+
->Belt.Option.map(CodeMirror.KeyMap.fromString)
1591+
->Belt.Option.getWithDefault(CodeMirror.KeyMap.Default)
1592+
})
1593+
1594+
React.useEffect1(() => {
1595+
Dom.Storage2.localStorage->Dom.Storage2.setItem("vimMode", CodeMirror.KeyMap.toString(keyMap))
1596+
None
1597+
}, [keyMap])
1598+
15681599
// The user can focus an error / warning on a specific line & column
15691600
// which is stored in this ref and triggered by hover / click states
15701601
// in the CodeMirror editor
@@ -1712,13 +1743,16 @@ let default = () => {
17121743
}}
17131744
onMarkerFocus={rowCol => setFocusedRowCol(_prev => Some(rowCol))}
17141745
onMarkerFocusLeave={_ => setFocusedRowCol(_ => None)}
1746+
keyMap
17151747
/>
17161748
</div>
17171749
</div>
17181750
<div
17191751
className="relative w-full overflow-x-hidden h-screen lg:h-auto lg:w-1/2"
17201752
style={ReactDOM.Style.make(~maxWidth=windowWidth > 1024 ? "56rem" : "100%", ())}>
1721-
<OutputPanel compilerDispatch compilerState editorCode />
1753+
<OutputPanel
1754+
compilerDispatch compilerState editorCode keyMapState={(keyMap, setKeyMap)}
1755+
/>
17221756
<div className="absolute bottom-0 w-full">
17231757
<Statusbar
17241758
actionIndicatorKey={Belt.Int.toString(actionCount)} state=compilerState

src/components/CodeMirror.res

Lines changed: 21 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(j` () => {
1227
const isClient = typeof window === 'object';
1328
@@ -69,6 +84,8 @@ module CM = {
6984
fixedGutter: bool,
7085
@optional
7186
scrollbarStyle: string,
87+
@optional
88+
keyMap: string,
7289
}
7390
}
7491

@@ -597,6 +614,7 @@ let make = // props relevant for the react wrapper
597614
~readOnly=false,
598615
~lineNumbers=true,
599616
~scrollbarStyle="overlay",
617+
~keyMap=KeyMap.Default,
600618
~lineWrapping=false,
601619
): React.element => {
602620
let inputElement = React.useRef(Js.Nullable.null)
@@ -606,7 +624,7 @@ let make = // props relevant for the react wrapper
606624
let windowWidth = useWindowWidth()
607625
let (onMouseOver, onMouseOut, onMouseMove) = useHoverTooltip(~cmStateRef, ~cmRef, ())
608626

609-
React.useEffect0(() =>
627+
React.useEffect1(() => {
610628
switch inputElement.current->Js.Nullable.toOption {
611629
| Some(input) =>
612630
let options = CM.Options.t(
@@ -617,6 +635,7 @@ let make = // props relevant for the react wrapper
617635
~fixedGutter=false,
618636
~readOnly,
619637
~lineNumbers,
638+
~keyMap=KeyMap.toString(keyMap),
620639
~scrollbarStyle,
621640
(),
622641
)
@@ -659,7 +678,7 @@ let make = // props relevant for the react wrapper
659678
Some(cleanup)
660679
| None => None
661680
}
662-
)
681+
}, [keyMap])
663682

664683
React.useEffect1(() => {
665684
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

@@ -38,6 +44,7 @@ module CM: {
3844
~lineWrapping: bool=?,
3945
~fixedGutter: bool=?,
4046
~scrollbarStyle: string=?,
47+
~keyMap: string=?,
4148
unit,
4249
) => t
4350
}
@@ -62,5 +69,6 @@ let make: (
6269
~readOnly: bool=?,
6370
~lineNumbers: bool=?,
6471
~scrollbarStyle: string=?,
72+
~keyMap: KeyMap.t=?,
6573
~lineWrapping: bool=?,
6674
) => React.element

0 commit comments

Comments
 (0)