1
- // Desc: Main JavaScript file for the Vimbin web app
2
1
document . addEventListener ( "DOMContentLoaded" , function ( ) {
3
2
// Function to get the preferred theme (dark, light, or system default)
4
3
function getPreferredTheme ( ) {
5
- // If the browser doesn't support the prefers-color-scheme media query, return the default theme
6
- if ( ! window . matchMedia ) {
7
- return "default" ;
8
- }
4
+ return window . matchMedia ?. ( "( prefers-color-scheme: dark)" ) ?. matches
5
+ ? "catppuccin"
6
+ : "default" ;
7
+ }
9
8
10
- if ( window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ) {
11
- return "catppuccin" ;
12
- }
9
+ // Function to set the theme based on the initial color scheme
10
+ function setThemeBasedOnColorScheme ( ) {
11
+ const preferredTheme = getPreferredTheme ( ) ;
12
+ console . log ( `Setting theme to '${ preferredTheme } '` ) ;
13
13
14
- if ( window . matchMedia ( "(prefers-color-scheme: light)" ) . matches ) {
15
- return "default" ;
16
- }
17
-
18
- return "default" ;
14
+ editor . setOption ( "theme" , preferredTheme ) ;
19
15
}
20
16
21
17
// Function to update Vim mode display
22
18
function updateVimMode ( vimEvent , vimModeElement ) {
23
- const mode = vimEvent . mode ;
24
- const sub = vimEvent . subMode ;
25
-
19
+ const { mode, subMode } = vimEvent ;
20
+
21
+ console . log ( `VIM mode '${ mode } ', subMode '${ subMode } '` ) ;
22
+
23
+ // Mapping of mode to corresponding text and class
24
+ const modeMap = {
25
+ normal : { text : "NORMAL" , class : "normal" } ,
26
+ insert : { text : "INSERT" , class : "insert" } ,
27
+ visual : {
28
+ text : subMode === "" ? "VISUAL" : "V-LINE" ,
29
+ class : subMode === "" ? "visual" : "visual-line" ,
30
+ } ,
31
+ unknown : { text : "UNKNOWN" , class : "unknown" } ,
32
+ } ;
33
+
34
+ // Remove all existing classes
26
35
vimModeElement . classList . remove (
27
- "normal" ,
28
- "insert" ,
29
- "visual" ,
30
- "visual-line" ,
36
+ ...Object . values ( modeMap ) . map ( ( entry ) => entry . class ) ,
31
37
) ;
32
38
33
- switch ( mode ) {
34
- case "normal" :
35
- vimModeElement . innerText = "NORMAL" ;
36
- vimModeElement . classList . add ( "normal" ) ;
37
- break ;
38
- case "insert" :
39
- vimModeElement . innerText = "INSERT" ;
40
- vimModeElement . classList . add ( "insert" ) ;
41
- break ;
42
- case "visual" :
43
- if ( sub === "" ) {
44
- vimModeElement . innerText = "VISUAL" ;
45
- vimModeElement . classList . add ( "visual" ) ;
46
- break ;
47
- }
48
- vimModeElement . innerText = "V-LINE" ;
49
- vimModeElement . classList . add ( "visual-line" ) ;
50
- break ;
51
- default :
52
- vimModeElement . innerText = "UNKNOWN" ;
53
- vimModeElement . classList . add ( "unknown" ) ;
54
- }
39
+ // Update text and add corresponding class
40
+ const { text, class : modeClass } = modeMap [ mode ] || modeMap . unknown ;
41
+ vimModeElement . innerText = text ;
42
+ vimModeElement . classList . add ( modeClass ) ;
55
43
}
56
44
57
45
// Function to show relative line numbers
@@ -118,7 +106,7 @@ document.addEventListener("DOMContentLoaded", function () {
118
106
}
119
107
120
108
statusElement . innerText = status ;
121
- statusElement . classList . remove ( "isError" , "noChanges" ) ; // Remove all classes
109
+ statusElement . classList . remove ( "isError" , "noChanges" ) ;
122
110
123
111
if ( isError ) {
124
112
statusElement . classList . add ( "isError" ) ;
@@ -146,11 +134,10 @@ document.addEventListener("DOMContentLoaded", function () {
146
134
matchBrackets : true ,
147
135
showCursorWhenSelecting : true ,
148
136
theme : getPreferredTheme ( ) ,
149
- lineWrapping : true , // Optional: enable line wrapping if desired
137
+ lineWrapping : true ,
150
138
} ) ;
151
139
152
140
editor . on ( "cursorActivity" , showRelativeLines ) ;
153
- editor . focus ( ) ;
154
141
155
142
// Custom vim Ex commands
156
143
CodeMirror . Vim . defineEx ( "x" , "" , function ( ) {
@@ -165,17 +152,13 @@ document.addEventListener("DOMContentLoaded", function () {
165
152
CodeMirror . commands . save = saveContent ;
166
153
167
154
// Listen for changes in the prefers-color-scheme media query
168
- window . matchMedia ( "(prefers-color-scheme: dark)" ) . addListener ( ( e ) => {
169
- if ( e . matches ) {
170
- editor . setOption ( "theme" , "catppuccin" ) ;
171
- } else {
172
- editor . setOption ( "theme" , "default" ) ;
173
- }
174
- } ) ;
175
-
176
- window . matchMedia ( "(prefers-color-scheme: light)" ) . addListener ( ( e ) => {
177
- if ( e . matches ) {
178
- editor . setOption ( "theme" , "default" ) ;
179
- }
180
- } ) ;
155
+ window
156
+ . matchMedia ( "(prefers-color-scheme: dark)" )
157
+ . addListener ( setThemeBasedOnColorScheme ) ;
158
+ window
159
+ . matchMedia ( "(prefers-color-scheme: light)" )
160
+ . addListener ( setThemeBasedOnColorScheme ) ;
161
+
162
+ // Focus editor
163
+ editor . focus ( ) ;
181
164
} ) ;
0 commit comments