diff --git a/.gitignore b/.gitignore
index 262575f36..9ade12664 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,9 +27,6 @@
 # Generated by gradle task "generateGrammarSource"
 vim-engine/src/main/java/com/maddyhome/idea/vim/parser/generated
 vim-engine/src/main/java/com/maddyhome/idea/vim/regexp/parser/generated
-# Generated JSONs for lazy classloading
-/vim-engine/src/main/resources/ksp-generated
-/src/main/resources/ksp-generated
 
 # Created by github automation
 settings.xml
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0af8553b7..19b6fc2b6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -62,12 +62,16 @@ for a few days or send it to a friend for testing.
 If you are looking for:
 
 - Vim commands (`w`, `<C-O>`, `p`, etc.):
-    - Any particular command: `engine_commands.json` + `intellij_commands.json` (this files are generated during compilation, please run `gradle build` to generate them manually).
+    - Any particular command:
+      - [Commands common for Fleet and IdeaVim](vim-engine/src/main/resources/ksp-generated/engine_commands.json)
+      - [IdeaVim only commands](src/main/resources/ksp-generated/intellij_commands.json)
     - How commands are executed in common: `EditorActionHandlerBase`.
     - Key mapping: `KeyHandler.handleKey()`.
 
 - Ex commands (`:set`, `:s`, `:nohlsearch`):
-    - Any particular ex command: package `com.maddyhome.idea.vim.ex.handler`.
+    - Any particular command:
+        - [Commands common for Fleet and IdeaVim](vim-engine/src/main/resources/ksp-generated/engine_ex_commands.json)
+        - [IdeaVim only commands](src/main/resources/ksp-generated/intellij_ex_commands.json)
     - Vim script grammar: `Vimscript.g4`.
     - Vim script parsing: package `com.maddyhome.idea.vim.vimscript.parser`.
     - Vim script executor: `Executor`.
diff --git a/annotation-processors/src/main/kotlin/com/intellij/vim/processors/CommandOrMotionProcessor.kt b/annotation-processors/src/main/kotlin/com/intellij/vim/processors/CommandOrMotionProcessor.kt
index b5922b692..c3a62ad0f 100644
--- a/annotation-processors/src/main/kotlin/com/intellij/vim/processors/CommandOrMotionProcessor.kt
+++ b/annotation-processors/src/main/kotlin/com/intellij/vim/processors/CommandOrMotionProcessor.kt
@@ -37,7 +37,8 @@ class CommandOrMotionProcessor(private val environment: SymbolProcessorEnvironme
     Files.createDirectories(generatedDirPath)
 
     val filePath = generatedDirPath.resolve(environment.options["commands_file"]!!)
-    val fileContent = json.encodeToString(commands)
+    val sortedCommands = commands.sortedWith(compareBy({ it.keys }, { it.`class` }))
+    val fileContent = json.encodeToString(sortedCommands)
     filePath.writeText(fileContent)
 
     return emptyList()
diff --git a/annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExCommandProcessor.kt b/annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExCommandProcessor.kt
index 4dd3e6adb..f1418a234 100644
--- a/annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExCommandProcessor.kt
+++ b/annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExCommandProcessor.kt
@@ -37,7 +37,8 @@ class ExCommandProcessor(private val environment: SymbolProcessorEnvironment): S
     Files.createDirectories(generatedDirPath)
 
     val filePath = generatedDirPath.resolve(environment.options["ex_commands_file"]!!)
-    val fileContent = json.encodeToString(commandToClass)
+    val sortedCommandToClass = commandToClass.toList().sortedWith(compareBy({ it.first }, { it.second })).toMap()
+    val fileContent = json.encodeToString(sortedCommandToClass)
     filePath.writeText(fileContent)
 
     return emptyList()
diff --git a/annotation-processors/src/main/kotlin/com/intellij/vim/processors/VimscriptFunctionProcessor.kt b/annotation-processors/src/main/kotlin/com/intellij/vim/processors/VimscriptFunctionProcessor.kt
index 5a8fa4f91..84815d3f6 100644
--- a/annotation-processors/src/main/kotlin/com/intellij/vim/processors/VimscriptFunctionProcessor.kt
+++ b/annotation-processors/src/main/kotlin/com/intellij/vim/processors/VimscriptFunctionProcessor.kt
@@ -37,7 +37,8 @@ class VimscriptFunctionProcessor(private val environment: SymbolProcessorEnviron
     Files.createDirectories(generatedDirPath)
 
     val filePath = generatedDirPath.resolve(environment.options["vimscript_functions_file"]!!)
-    val fileContent = json.encodeToString(nameToClass)
+    val sortedNameToClass = nameToClass.toList().sortedWith(compareBy({ it.first }, { it.second })).toMap()
+    val fileContent = json.encodeToString(sortedNameToClass)
     filePath.writeText(fileContent)
 
     return emptyList()
diff --git a/src/main/resources/ksp-generated/intellij_commands.json b/src/main/resources/ksp-generated/intellij_commands.json
new file mode 100644
index 000000000..460a2d16f
--- /dev/null
+++ b/src/main/resources/ksp-generated/intellij_commands.json
@@ -0,0 +1,92 @@
+[
+    {
+        "keys": ".",
+        "class": "com.maddyhome.idea.vim.action.change.RepeatChangeAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<BS>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorBackSpace",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-H>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorBackSpace",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-I>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorTab",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-L>",
+        "class": "com.maddyhome.idea.vim.action.RedrawAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<Del>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorDelete",
+        "modes": "I"
+    },
+    {
+        "keys": "<Down>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorDown",
+        "modes": "I"
+    },
+    {
+        "keys": "<Tab>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorTab",
+        "modes": "I"
+    },
+    {
+        "keys": "<Up>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorUp",
+        "modes": "I"
+    },
+    {
+        "keys": "<kDown>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorDown",
+        "modes": "I"
+    },
+    {
+        "keys": "<kUp>",
+        "class": "com.maddyhome.idea.vim.action.editor.VimEditorUp",
+        "modes": "I"
+    },
+    {
+        "keys": "J",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesSpacesAction",
+        "modes": "N"
+    },
+    {
+        "keys": "J",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesSpacesAction",
+        "modes": "X"
+    },
+    {
+        "keys": "K",
+        "class": "com.maddyhome.idea.vim.action.editor.VimQuickJavaDoc",
+        "modes": "N"
+    },
+    {
+        "keys": "g@",
+        "class": "com.maddyhome.idea.vim.action.change.OperatorAction",
+        "modes": "N"
+    },
+    {
+        "keys": "g@",
+        "class": "com.maddyhome.idea.vim.action.change.VisualOperatorAction",
+        "modes": "X"
+    },
+    {
+        "keys": "gJ",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gJ",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesAction",
+        "modes": "X"
+    }
+]
\ No newline at end of file
diff --git a/src/main/resources/ksp-generated/intellij_ex_commands.json b/src/main/resources/ksp-generated/intellij_ex_commands.json
new file mode 100644
index 000000000..ef7df2d2e
--- /dev/null
+++ b/src/main/resources/ksp-generated/intellij_ex_commands.json
@@ -0,0 +1,9 @@
+{
+    "!": "com.maddyhome.idea.vim.vimscript.model.commands.CmdFilterCommand",
+    "actionl[ist]": "com.maddyhome.idea.vim.vimscript.model.commands.ActionListCommand",
+    "b[uffer]": "com.maddyhome.idea.vim.vimscript.model.commands.BufferCommand",
+    "buffers": "com.maddyhome.idea.vim.vimscript.model.commands.BufferListCommand",
+    "files": "com.maddyhome.idea.vim.vimscript.model.commands.BufferListCommand",
+    "h[elp]": "com.maddyhome.idea.vim.vimscript.model.commands.HelpCommand",
+    "ls": "com.maddyhome.idea.vim.vimscript.model.commands.BufferListCommand"
+}
\ No newline at end of file
diff --git a/src/main/resources/ksp-generated/intellij_vimscript_functions.json b/src/main/resources/ksp-generated/intellij_vimscript_functions.json
new file mode 100644
index 000000000..d98b4874e
--- /dev/null
+++ b/src/main/resources/ksp-generated/intellij_vimscript_functions.json
@@ -0,0 +1,6 @@
+{
+    "col": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.ColFunctionHandler",
+    "has": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.HasFunctionHandler",
+    "line": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.LineFunctionHandler",
+    "submatch": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.SubmatchFunctionHandler"
+}
\ No newline at end of file
diff --git a/vim-engine/src/main/resources/ksp-generated/engine_commands.json b/vim-engine/src/main/resources/ksp-generated/engine_commands.json
new file mode 100644
index 000000000..7aae0c740
--- /dev/null
+++ b/vim-engine/src/main/resources/ksp-generated/engine_commands.json
@@ -0,0 +1,2007 @@
+[
+    {
+        "keys": "!",
+        "class": "com.maddyhome.idea.vim.action.change.change.FilterMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "!",
+        "class": "com.maddyhome.idea.vim.action.change.change.FilterVisualLinesAction",
+        "modes": "X"
+    },
+    {
+        "keys": "#",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchWholeWordBackwardAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "$",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "%",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionPercentOrMatchAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "&",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeLastSearchReplaceAction",
+        "modes": "N"
+    },
+    {
+        "keys": "'",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "'",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineAction",
+        "modes": "N"
+    },
+    {
+        "keys": "(",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": ")",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "*",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchWholeWordForwardAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "+",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": ",",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharReverseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "-",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionUpFirstNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "/",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchEntryFwdAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "0",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": ":",
+        "class": "com.maddyhome.idea.vim.action.ex.ExEntryAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": ";",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<",
+        "class": "com.maddyhome.idea.vim.action.change.shift.ShiftLeftMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<",
+        "class": "com.maddyhome.idea.vim.action.change.shift.ShiftLeftVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<BS>",
+        "class": "com.maddyhome.idea.vim.action.ex.DeletePreviousCharAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<BS>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionBackspaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<BS>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectDeleteAction",
+        "modes": "S"
+    },
+    {
+        "keys": "<C-2>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertExitAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-6>",
+        "class": "com.maddyhome.idea.vim.action.file.FilePreviousAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-@>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertExitAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-A>",
+        "class": "com.maddyhome.idea.vim.action.change.change.number.ChangeNumberIncAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-A>",
+        "class": "com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberIncAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<C-A>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-B>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveCaretToLineStart",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-B>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-C>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-C>",
+        "class": "com.maddyhome.idea.vim.action.ex.LeaveCommandLineAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-C>",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<C-D>",
+        "class": "com.maddyhome.idea.vim.action.change.shift.ShiftLeftLinesAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-D>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageDownAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-Down>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.CtrlDownAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-E>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertCharacterBelowCursorAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-E>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveCaretToLineEnd",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-E>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineDownAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-End>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-End>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-F>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-G>",
+        "class": "com.maddyhome.idea.vim.action.file.FileGetFileInfoAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-G>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectToggleVisualMode",
+        "modes": "XS"
+    },
+    {
+        "keys": "<C-G>u",
+        "class": "com.maddyhome.idea.vim.action.change.BreakUndoSequenceAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-H>",
+        "class": "com.maddyhome.idea.vim.action.ex.DeletePreviousCharAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-H>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionBackspaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-Home>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-Home>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-I>",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-J>",
+        "class": "com.maddyhome.idea.vim.action.ex.ProcessExEntryAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-K>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertCompletedDigraphAction",
+        "modes": "IC"
+    },
+    {
+        "keys": "<C-Left>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveToPreviousWordAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionBigWordLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordLeftInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-M>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertEnterAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-M>",
+        "class": "com.maddyhome.idea.vim.action.ex.ProcessExEntryAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-M>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-N>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryDownAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-N>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownCtrlNAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-N>",
+        "class": "com.maddyhome.idea.vim.action.window.LookupDownAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-O>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertSingleCommandAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-O>",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-P>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryUpAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-P>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionUpCtrlPAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-P>",
+        "class": "com.maddyhome.idea.vim.action.window.LookupUpAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-Q>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertCompletedLiteralAction",
+        "modes": "IC"
+    },
+    {
+        "keys": "<C-R>",
+        "class": "com.maddyhome.idea.vim.action.change.RedoAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-R>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertRegisterAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-R>",
+        "class": "com.maddyhome.idea.vim.action.ex.InsertRegisterAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-Right>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveToNextWordAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionBigWordRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordRightInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-S-2>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertExitAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-S-6>",
+        "class": "com.maddyhome.idea.vim.action.file.FilePreviousAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-T>",
+        "class": "com.maddyhome.idea.vim.action.change.shift.ShiftRightLinesAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-T>",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-U>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertDeleteInsertedTextAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-U>",
+        "class": "com.maddyhome.idea.vim.action.ex.DeleteToCaretAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-U>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageUpAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-Up>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.CtrlUpAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-V>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertCompletedLiteralAction",
+        "modes": "IC"
+    },
+    {
+        "keys": "<C-W>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertDeletePreviousWordAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-W>",
+        "class": "com.maddyhome.idea.vim.action.ex.DeletePrevWordAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-W><C-H>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowLeftAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-J>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowDownAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-K>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowUpAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-L>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowRightAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-O>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowOnlyAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-S>",
+        "class": "com.maddyhome.idea.vim.action.window.HorizontalSplitAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-V>",
+        "class": "com.maddyhome.idea.vim.action.window.VerticalSplitAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><C-W>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowNextAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><Down>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowDownAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><Left>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowLeftAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><Right>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowRightAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W><Up>",
+        "class": "com.maddyhome.idea.vim.action.window.WindowUpAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>S",
+        "class": "com.maddyhome.idea.vim.action.window.HorizontalSplitAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>W",
+        "class": "com.maddyhome.idea.vim.action.window.WindowPrevAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>c",
+        "class": "com.maddyhome.idea.vim.action.window.CloseWindowAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>h",
+        "class": "com.maddyhome.idea.vim.action.window.WindowLeftAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>j",
+        "class": "com.maddyhome.idea.vim.action.window.WindowDownAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>k",
+        "class": "com.maddyhome.idea.vim.action.window.WindowUpAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>l",
+        "class": "com.maddyhome.idea.vim.action.window.WindowRightAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>o",
+        "class": "com.maddyhome.idea.vim.action.window.WindowOnlyAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>s",
+        "class": "com.maddyhome.idea.vim.action.window.HorizontalSplitAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>v",
+        "class": "com.maddyhome.idea.vim.action.window.VerticalSplitAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-W>w",
+        "class": "com.maddyhome.idea.vim.action.window.WindowNextAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-X>",
+        "class": "com.maddyhome.idea.vim.action.change.change.number.ChangeNumberDecAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-X>",
+        "class": "com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberDecAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<C-Y>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertCharacterAboveCursorAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-Y>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineUpAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<C-[>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-[>",
+        "class": "com.maddyhome.idea.vim.action.ex.LeaveCommandLineAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<C-[>",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<C-\\><C-N>",
+        "class": "com.maddyhome.idea.vim.action.ResetModeAction",
+        "modes": "NXSOIC"
+    },
+    {
+        "keys": "<C-]>",
+        "class": "com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "<C-^>",
+        "class": "com.maddyhome.idea.vim.action.file.FilePreviousAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<C-kLeft>",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordLeftInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-kRight>",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordRightInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<C-q>",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "<C-v>",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "<CR>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertEnterAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<CR>",
+        "class": "com.maddyhome.idea.vim.action.ex.ProcessExEntryAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<CR>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.EnterNormalAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<DEL>",
+        "class": "com.maddyhome.idea.vim.action.ex.DeleteNextCharAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<DEL>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectDeleteAction",
+        "modes": "S"
+    },
+    {
+        "keys": "<Del>",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteCharacterAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<Del>",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<Down>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryDownFilterAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<Down>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionArrowDownAction",
+        "modes": "NXSO"
+    },
+    {
+        "keys": "<End>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveCaretToLineEnd",
+        "modes": "C"
+    },
+    {
+        "keys": "<End>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionEndAction",
+        "modes": "NXSO"
+    },
+    {
+        "keys": "<End>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Enter>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectEnterAction",
+        "modes": "S"
+    },
+    {
+        "keys": "<Esc>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Esc>",
+        "class": "com.maddyhome.idea.vim.action.ex.LeaveCommandLineAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<Esc>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectEscapeAction",
+        "modes": "S"
+    },
+    {
+        "keys": "<Esc>",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction",
+        "modes": "X"
+    },
+    {
+        "keys": "<Home>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveCaretToLineStart",
+        "modes": "C"
+    },
+    {
+        "keys": "<Home>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnInsertModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Home>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionHomeAction",
+        "modes": "NXS"
+    },
+    {
+        "keys": "<Insert>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertBeforeCursorAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<Insert>",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Insert>",
+        "class": "com.maddyhome.idea.vim.action.ex.ToggleInsertModeAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<Left>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveCaretLeftAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionArrowLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLeftInsertModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionLeftAction",
+        "modes": "S"
+    },
+    {
+        "keys": "<PageDown>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryDownAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<PageDown>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<PageDown>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownInsertModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<PageUp>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryUpAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<PageUp>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<PageUp>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpInsertModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Right>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveCaretRightAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionArrowRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionRightInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionRightAction",
+        "modes": "S"
+    },
+    {
+        "keys": "<S-Down>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryDownAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<S-Down>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionShiftDownAction",
+        "modes": "INXS"
+    },
+    {
+        "keys": "<S-End>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionShiftEndAction",
+        "modes": "INXS"
+    },
+    {
+        "keys": "<S-Home>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionShiftHomeAction",
+        "modes": "INXS"
+    },
+    {
+        "keys": "<S-Left>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveToPreviousWordAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<S-Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionShiftLeftAction",
+        "modes": "INXS"
+    },
+    {
+        "keys": "<S-Right>",
+        "class": "com.maddyhome.idea.vim.action.ex.MoveToNextWordAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<S-Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionShiftRightAction",
+        "modes": "INXS"
+    },
+    {
+        "keys": "<S-Up>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryUpAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<S-Up>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionShiftUpAction",
+        "modes": "INXS"
+    },
+    {
+        "keys": "<Space>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<Tab>",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<Undo>",
+        "class": "com.maddyhome.idea.vim.action.change.UndoAction",
+        "modes": "N"
+    },
+    {
+        "keys": "<Up>",
+        "class": "com.maddyhome.idea.vim.action.ex.HistoryUpFilterAction",
+        "modes": "C"
+    },
+    {
+        "keys": "<Up>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionArrowUpAction",
+        "modes": "NXSO"
+    },
+    {
+        "keys": "<kDown>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionArrowDownAction",
+        "modes": "NXSO"
+    },
+    {
+        "keys": "<kLeft>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionArrowLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<kLeft>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLeftInsertModeAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<kRight>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionArrowRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "<kRight>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionRightInsertAction",
+        "modes": "I"
+    },
+    {
+        "keys": "<kUp>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionArrowUpAction",
+        "modes": "NXSO"
+    },
+    {
+        "keys": "=",
+        "class": "com.maddyhome.idea.vim.action.change.change.AutoIndentLinesVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "=",
+        "class": "com.maddyhome.idea.vim.action.change.shift.AutoIndentMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": ">",
+        "class": "com.maddyhome.idea.vim.action.change.shift.ShiftRightMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": ">",
+        "class": "com.maddyhome.idea.vim.action.change.shift.ShiftRightVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "?",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchEntryRevAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "@",
+        "class": "com.maddyhome.idea.vim.action.macro.PlaybackRegisterAction",
+        "modes": "N"
+    },
+    {
+        "keys": "A",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertAfterLineEndAction",
+        "modes": "N"
+    },
+    {
+        "keys": "A",
+        "class": "com.maddyhome.idea.vim.action.change.insert.VisualBlockAppendAction",
+        "modes": "X"
+    },
+    {
+        "keys": "B",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionBigWordLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "C",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeEndOfLineAction",
+        "modes": "N"
+    },
+    {
+        "keys": "C",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesEndAction",
+        "modes": "X"
+    },
+    {
+        "keys": "D",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteEndOfLineAction",
+        "modes": "N"
+    },
+    {
+        "keys": "D",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesEndAction",
+        "modes": "X"
+    },
+    {
+        "keys": "E",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "F",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLeftMatchCharAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "G",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "H",
+        "class": "com.maddyhome.idea.vim.action.motion.screen.MotionFirstScreenLineAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "H",
+        "class": "com.maddyhome.idea.vim.action.motion.screen.MotionOpPendingFirstScreenLineAction",
+        "modes": "O"
+    },
+    {
+        "keys": "I",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertBeforeFirstNonBlankAction",
+        "modes": "N"
+    },
+    {
+        "keys": "I",
+        "class": "com.maddyhome.idea.vim.action.change.insert.VisualBlockInsertAction",
+        "modes": "X"
+    },
+    {
+        "keys": "L",
+        "class": "com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "L",
+        "class": "com.maddyhome.idea.vim.action.motion.screen.MotionOpPendingLastScreenLineAction",
+        "modes": "O"
+    },
+    {
+        "keys": "M",
+        "class": "com.maddyhome.idea.vim.action.motion.screen.MotionMiddleScreenLineAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "N",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchAgainPreviousAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "O",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertNewLineAboveAction",
+        "modes": "N"
+    },
+    {
+        "keys": "O",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsBlockAction",
+        "modes": "X"
+    },
+    {
+        "keys": "P",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorAction",
+        "modes": "N"
+    },
+    {
+        "keys": "P",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextBeforeCursorAction",
+        "modes": "X"
+    },
+    {
+        "keys": "R",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeReplaceAction",
+        "modes": "N"
+    },
+    {
+        "keys": "R",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesAction",
+        "modes": "X"
+    },
+    {
+        "keys": "S",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeLineAction",
+        "modes": "N"
+    },
+    {
+        "keys": "S",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesAction",
+        "modes": "X"
+    },
+    {
+        "keys": "T",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLeftTillMatchCharAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "U",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "V",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualToggleLineModeAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "W",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionBigWordRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "X",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteCharacterLeftAction",
+        "modes": "N"
+    },
+    {
+        "keys": "X",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesAction",
+        "modes": "X"
+    },
+    {
+        "keys": "Y",
+        "class": "com.maddyhome.idea.vim.action.copy.YankLineAction",
+        "modes": "N"
+    },
+    {
+        "keys": "Y",
+        "class": "com.maddyhome.idea.vim.action.copy.YankVisualLinesAction",
+        "modes": "X"
+    },
+    {
+        "keys": "ZQ",
+        "class": "com.maddyhome.idea.vim.action.file.FileSaveCloseAction",
+        "modes": "N"
+    },
+    {
+        "keys": "ZZ",
+        "class": "com.maddyhome.idea.vim.action.file.FileSaveCloseAction",
+        "modes": "N"
+    },
+    {
+        "keys": "[(",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenOpenAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[M",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[P",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction",
+        "modes": "N"
+    },
+    {
+        "keys": "[P",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextBeforeCursorNoIndentAction",
+        "modes": "X"
+    },
+    {
+        "keys": "[[",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[]",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[b",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionCamelLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[m",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[p",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction",
+        "modes": "N"
+    },
+    {
+        "keys": "[p",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextAfterCursorNoIndentAction",
+        "modes": "X"
+    },
+    {
+        "keys": "[s",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionMisspelledWordPreviousAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[w",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionCamelRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "[{",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceOpenAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "])",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenCloseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]M",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionMethodNextEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]P",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction",
+        "modes": "N"
+    },
+    {
+        "keys": "]P",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextBeforeCursorNoIndentAction",
+        "modes": "X"
+    },
+    {
+        "keys": "][",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]]",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]b",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionCamelEndLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]m",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionMethodNextStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]p",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextAfterCursorNoIndentAction",
+        "modes": "N"
+    },
+    {
+        "keys": "]p",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextAfterCursorNoIndentAction",
+        "modes": "X"
+    },
+    {
+        "keys": "]s",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionMisspelledWordNextAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]w",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionCamelEndRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "]}",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceCloseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "^",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionFirstNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "_",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "`",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "`",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkAction",
+        "modes": "N"
+    },
+    {
+        "keys": "a",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertAfterCursorAction",
+        "modes": "N"
+    },
+    {
+        "keys": "a\"",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockDoubleQuoteAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a'",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockSingleQuoteAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a(",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a)",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a<",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockAngleAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a>",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockAngleAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "aB",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "aW",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBigWordAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a[",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBracketAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a]",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBracketAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a`",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBackQuoteAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "ab",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "ap",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterParagraphAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "as",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterSentenceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "at",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockTagAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "aw",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterWordAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a{",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "a}",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "b",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "c",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "c",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "d",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "d",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "e",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordEndRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "f",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionRightMatchCharAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g#",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchWordBackwardAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g$",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastScreenColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g&",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeLastGlobalSearchReplaceAction",
+        "modes": "N"
+    },
+    {
+        "keys": "g'",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineNoSaveJumpAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "g'",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineNoSaveJumpAction",
+        "modes": "N"
+    },
+    {
+        "keys": "g(",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g)",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextEndAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g*",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchWordForwardAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g0",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g8",
+        "class": "com.maddyhome.idea.vim.action.file.FileGetHexAction",
+        "modes": "N"
+    },
+    {
+        "keys": "g<C-A>",
+        "class": "com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheIncAction",
+        "modes": "X"
+    },
+    {
+        "keys": "g<C-G>",
+        "class": "com.maddyhome.idea.vim.action.file.FileGetLocationInfoAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "g<C-X>",
+        "class": "com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheDecAction",
+        "modes": "X"
+    },
+    {
+        "keys": "g<C-h>",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectEnableBlockModeAction",
+        "modes": "N"
+    },
+    {
+        "keys": "g<Down>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownNotLineWiseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g<End>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastScreenColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g<Home>",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g<Up>",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionUpNotLineWiseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gD",
+        "class": "com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "gE",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gH",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectEnableLineModeAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gI",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertLineStartAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gN",
+        "class": "com.maddyhome.idea.vim.action.motion.gn.GnPreviousTextObject",
+        "modes": "O"
+    },
+    {
+        "keys": "gN",
+        "class": "com.maddyhome.idea.vim.action.motion.gn.VisualSelectPreviousSearch",
+        "modes": "NX"
+    },
+    {
+        "keys": "gP",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorActionMoveCursor",
+        "modes": "N"
+    },
+    {
+        "keys": "gP",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextBeforeCursorMoveCursorAction",
+        "modes": "X"
+    },
+    {
+        "keys": "gT",
+        "class": "com.maddyhome.idea.vim.action.window.tabs.PreviousTabAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gU",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "g^",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g_",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLastNonSpaceAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "g`",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkNoSaveJumpAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "g`",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkNoSaveJumpAction",
+        "modes": "N"
+    },
+    {
+        "keys": "ga",
+        "class": "com.maddyhome.idea.vim.action.file.FileGetAsciiAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gd",
+        "class": "com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "ge",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordEndLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gg",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gh",
+        "class": "com.maddyhome.idea.vim.action.motion.select.SelectEnableCharacterModeAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gi",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertAtPreviousInsertAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gj",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownNotLineWiseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gk",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionUpNotLineWiseAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gm",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionMiddleColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gn",
+        "class": "com.maddyhome.idea.vim.action.motion.gn.GnNextTextObject",
+        "modes": "O"
+    },
+    {
+        "keys": "gn",
+        "class": "com.maddyhome.idea.vim.action.motion.gn.VisualSelectNextSearch",
+        "modes": "NX"
+    },
+    {
+        "keys": "go",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionNthCharacterAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gp",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextAfterCursorActionMoveCursor",
+        "modes": "N"
+    },
+    {
+        "keys": "gp",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextAfterCursorMoveCursorAction",
+        "modes": "X"
+    },
+    {
+        "keys": "gq",
+        "class": "com.maddyhome.idea.vim.action.change.change.ReformatCodeMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gq",
+        "class": "com.maddyhome.idea.vim.action.change.change.ReformatCodeVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "gt",
+        "class": "com.maddyhome.idea.vim.action.window.tabs.NextTabAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "gu",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gv",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualSelectPreviousAction",
+        "modes": "N"
+    },
+    {
+        "keys": "gv",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction",
+        "modes": "X"
+    },
+    {
+        "keys": "g~",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "h",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "i",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertBeforeCursorAction",
+        "modes": "N"
+    },
+    {
+        "keys": "i\"",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockDoubleQuoteAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i'",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockSingleQuoteAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i(",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i)",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i<lt>",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockAngleAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i>",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockAngleAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "iB",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "iW",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBigWordAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i[",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBracketAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i]",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBracketAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i`",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBackQuoteAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "ib",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "ip",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerParagraphAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "is",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerSentenceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "it",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockTagAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "iw",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerWordAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i{",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "i}",
+        "class": "com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction",
+        "modes": "XO"
+    },
+    {
+        "keys": "j",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionDownAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "k",
+        "class": "com.maddyhome.idea.vim.action.motion.updown.MotionUpAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "l",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "m",
+        "class": "com.maddyhome.idea.vim.action.motion.mark.MotionMarkAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "n",
+        "class": "com.maddyhome.idea.vim.action.motion.search.SearchAgainNextAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "o",
+        "class": "com.maddyhome.idea.vim.action.change.insert.InsertNewLineBelowAction",
+        "modes": "N"
+    },
+    {
+        "keys": "o",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsAction",
+        "modes": "X"
+    },
+    {
+        "keys": "p",
+        "class": "com.maddyhome.idea.vim.action.copy.PutTextAfterCursorAction",
+        "modes": "N"
+    },
+    {
+        "keys": "p",
+        "class": "com.maddyhome.idea.vim.action.copy.PutVisualTextAfterCursorAction",
+        "modes": "X"
+    },
+    {
+        "keys": "q",
+        "class": "com.maddyhome.idea.vim.action.macro.ToggleRecordingAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "r",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCharacterAction",
+        "modes": "N"
+    },
+    {
+        "keys": "r",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeVisualCharacterAction",
+        "modes": "X"
+    },
+    {
+        "keys": "s",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCharactersAction",
+        "modes": "N"
+    },
+    {
+        "keys": "s",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "t",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionRightTillMatchCharAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "u",
+        "class": "com.maddyhome.idea.vim.action.change.UndoAction",
+        "modes": "N"
+    },
+    {
+        "keys": "u",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "v",
+        "class": "com.maddyhome.idea.vim.action.motion.visual.VisualToggleCharacterModeAction",
+        "modes": "NX"
+    },
+    {
+        "keys": "w",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionWordRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "x",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteCharacterRightAction",
+        "modes": "N"
+    },
+    {
+        "keys": "x",
+        "class": "com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "y",
+        "class": "com.maddyhome.idea.vim.action.copy.YankMotionAction",
+        "modes": "N"
+    },
+    {
+        "keys": "y",
+        "class": "com.maddyhome.idea.vim.action.copy.YankVisualAction",
+        "modes": "X"
+    },
+    {
+        "keys": "z+",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLinePageStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "z-",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "z.",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "z<CR>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "z<Left>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "z<Right>",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zC",
+        "class": "com.maddyhome.idea.vim.action.fold.VimCollapseRegionRecursively",
+        "modes": "NX"
+    },
+    {
+        "keys": "zH",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfWidthRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zL",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfWidthLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zM",
+        "class": "com.maddyhome.idea.vim.action.fold.VimCollapseAllRegions",
+        "modes": "NX"
+    },
+    {
+        "keys": "zO",
+        "class": "com.maddyhome.idea.vim.action.fold.VimExpandRegionRecursively",
+        "modes": "NX"
+    },
+    {
+        "keys": "zR",
+        "class": "com.maddyhome.idea.vim.action.fold.VimExpandAllRegions",
+        "modes": "NX"
+    },
+    {
+        "keys": "z^",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLinePageStartAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zb",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zc",
+        "class": "com.maddyhome.idea.vim.action.fold.VimCollapseRegion",
+        "modes": "NX"
+    },
+    {
+        "keys": "ze",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zh",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnRightAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zl",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnLeftAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zo",
+        "class": "com.maddyhome.idea.vim.action.fold.VimExpandRegion",
+        "modes": "NX"
+    },
+    {
+        "keys": "zs",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zt",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "zz",
+        "class": "com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "{",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionParagraphPreviousAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "|",
+        "class": "com.maddyhome.idea.vim.action.motion.leftright.MotionColumnAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "}",
+        "class": "com.maddyhome.idea.vim.action.motion.text.MotionParagraphNextAction",
+        "modes": "NXO"
+    },
+    {
+        "keys": "~",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleCharacterAction",
+        "modes": "N"
+    },
+    {
+        "keys": "~",
+        "class": "com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleVisualAction",
+        "modes": "X"
+    }
+]
\ No newline at end of file
diff --git a/vim-engine/src/main/resources/ksp-generated/engine_ex_commands.json b/vim-engine/src/main/resources/ksp-generated/engine_ex_commands.json
new file mode 100644
index 000000000..4d0b8f7cc
--- /dev/null
+++ b/vim-engine/src/main/resources/ksp-generated/engine_ex_commands.json
@@ -0,0 +1,129 @@
+{
+    "&": "com.maddyhome.idea.vim.vimscript.model.commands.SubstituteCommand",
+    "<": "com.maddyhome.idea.vim.vimscript.model.commands.ShiftLeftCommand",
+    ">": "com.maddyhome.idea.vim.vimscript.model.commands.ShiftRightCommand",
+    "@": "com.maddyhome.idea.vim.vimscript.model.commands.RepeatCommand",
+    "N[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.PreviousFileCommand",
+    "P[rint]": "com.maddyhome.idea.vim.vimscript.model.commands.PrintCommand",
+    "Plug[in]": "com.maddyhome.idea.vim.vimscript.model.commands.PlugCommand",
+    "action": "com.maddyhome.idea.vim.vimscript.model.commands.ActionCommand",
+    "argu[ment]": "com.maddyhome.idea.vim.vimscript.model.commands.SelectFileCommand",
+    "as[cii]": "com.maddyhome.idea.vim.vimscript.model.commands.AsciiCommand",
+    "bd[elete]": "com.maddyhome.idea.vim.vimscript.model.commands.BufferCloseCommand",
+    "bn[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.NextFileCommand",
+    "bp[revious]": "com.maddyhome.idea.vim.vimscript.model.commands.PreviousFileCommand",
+    "bro[wse]": "com.maddyhome.idea.vim.vimscript.model.commands.EditFileCommand",
+    "cal[l]": "com.maddyhome.idea.vim.vimscript.model.commands.CallCommand",
+    "cle[arjumps]": "com.maddyhome.idea.vim.vimscript.model.commands.ClearJumpsCommand",
+    "clo[se]": "com.maddyhome.idea.vim.vimscript.model.commands.QuitCommand",
+    "cm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "cmapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "cno[remap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "co[py]": "com.maddyhome.idea.vim.vimscript.model.commands.CopyTextCommand",
+    "com[mand]": "com.maddyhome.idea.vim.vimscript.model.commands.CmdCommand",
+    "comc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.CmdClearCommand",
+    "cu[nmap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "d[elete]": "com.maddyhome.idea.vim.vimscript.model.commands.DeleteLinesCommand",
+    "delc[ommand]": "com.maddyhome.idea.vim.vimscript.model.commands.DelCmdCommand",
+    "delf[unction]": "com.maddyhome.idea.vim.vimscript.model.commands.DelfunctionCommand",
+    "delm[arks]": "com.maddyhome.idea.vim.vimscript.model.commands.DeleteMarksCommand",
+    "dig[raphs]": "com.maddyhome.idea.vim.vimscript.model.commands.DigraphCommand",
+    "dis[play]": "com.maddyhome.idea.vim.vimscript.model.commands.RegistersCommand",
+    "e[dit]": "com.maddyhome.idea.vim.vimscript.model.commands.EditFileCommand",
+    "ec[ho]": "com.maddyhome.idea.vim.vimscript.model.commands.EchoCommand",
+    "exe[cute]": "com.maddyhome.idea.vim.vimscript.model.commands.ExecuteCommand",
+    "exi[t]": "com.maddyhome.idea.vim.vimscript.model.commands.WriteQuitCommand",
+    "f[ile]": "com.maddyhome.idea.vim.vimscript.model.commands.FileCommand",
+    "fin[d]": "com.maddyhome.idea.vim.vimscript.model.commands.FindFileCommand",
+    "fir[st]": "com.maddyhome.idea.vim.vimscript.model.commands.SelectFirstFileCommand",
+    "g[lobal]": "com.maddyhome.idea.vim.vimscript.model.commands.GlobalCommand",
+    "go[to]": "com.maddyhome.idea.vim.vimscript.model.commands.GotoCharacterCommand",
+    "hi[de]": "com.maddyhome.idea.vim.vimscript.model.commands.QuitCommand",
+    "his[tory]": "com.maddyhome.idea.vim.vimscript.model.commands.HistoryCommand",
+    "im[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "imapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "ino[remap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "iu[nmap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "j[oin]": "com.maddyhome.idea.vim.vimscript.model.commands.JoinLinesCommand",
+    "ju[mps]": "com.maddyhome.idea.vim.vimscript.model.commands.JumpsCommand",
+    "k": "com.maddyhome.idea.vim.vimscript.model.commands.MarkCommand",
+    "la[st]": "com.maddyhome.idea.vim.vimscript.model.commands.SelectLastFileCommand",
+    "let": "com.maddyhome.idea.vim.vimscript.model.commands.LetCommand",
+    "lm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "lmapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "ln[oremap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "lockv[ar]": "com.maddyhome.idea.vim.vimscript.model.commands.LockVarCommand",
+    "lu[nmap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "m[ove]": "com.maddyhome.idea.vim.vimscript.model.commands.MoveTextCommand",
+    "ma[rk]": "com.maddyhome.idea.vim.vimscript.model.commands.MarkCommand",
+    "map": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "mapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "marks": "com.maddyhome.idea.vim.vimscript.model.commands.MarksCommand",
+    "n[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.NextFileCommand",
+    "nm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "nmapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "nn[oremap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "no[map]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "no[remap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "noh[lsearch]": "com.maddyhome.idea.vim.vimscript.model.commands.NoHLSearchCommand",
+    "norm[al]": "com.maddyhome.idea.vim.vimscript.model.commands.NormalCommand",
+    "nun[map]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "om[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "omapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "on[ly]": "com.maddyhome.idea.vim.vimscript.model.commands.OnlyCommand",
+    "ono[remap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "ou[nmap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "p[rint]": "com.maddyhome.idea.vim.vimscript.model.commands.PrintCommand",
+    "pa[ckadd]": "com.maddyhome.idea.vim.vimscript.model.commands.PackaddCommand",
+    "prev[ious]": "com.maddyhome.idea.vim.vimscript.model.commands.PreviousFileCommand",
+    "pu[t]": "com.maddyhome.idea.vim.vimscript.model.commands.PutLinesCommand",
+    "q[uit]": "com.maddyhome.idea.vim.vimscript.model.commands.QuitCommand",
+    "qa[ll]": "com.maddyhome.idea.vim.vimscript.model.commands.ExitCommand",
+    "quita[ll]": "com.maddyhome.idea.vim.vimscript.model.commands.ExitCommand",
+    "red[o]": "com.maddyhome.idea.vim.vimscript.model.commands.RedoCommand",
+    "reg[isters]": "com.maddyhome.idea.vim.vimscript.model.commands.RegistersCommand",
+    "s[ubstitute]": "com.maddyhome.idea.vim.vimscript.model.commands.SubstituteCommand",
+    "se[t]": "com.maddyhome.idea.vim.vimscript.model.commands.SetCommand",
+    "setg[lobal]": "com.maddyhome.idea.vim.vimscript.model.commands.SetglobalCommand",
+    "sethandler": "com.maddyhome.idea.vim.vimscript.model.commands.SetHandlerCommand",
+    "setl[ocal]": "com.maddyhome.idea.vim.vimscript.model.commands.SetlocalCommand",
+    "sh[ell]": "com.maddyhome.idea.vim.vimscript.model.commands.ShellCommand",
+    "smap": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "smapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "snor[emap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "so[urce]": "com.maddyhome.idea.vim.vimscript.model.commands.SourceCommand",
+    "sor[t]": "com.maddyhome.idea.vim.vimscript.model.commands.SortCommand",
+    "sp[lit]": "com.maddyhome.idea.vim.vimscript.model.commands.SplitCommand",
+    "sunm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "t": "com.maddyhome.idea.vim.vimscript.model.commands.CopyTextCommand",
+    "tabN[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.PreviousTabCommand",
+    "tabc[lose]": "com.maddyhome.idea.vim.vimscript.model.commands.TabCloseCommand",
+    "tabm[ove]": "com.maddyhome.idea.vim.vimscript.model.commands.TabMoveCommand",
+    "tabn[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.NextTabCommand",
+    "tabo[nly]": "com.maddyhome.idea.vim.vimscript.model.commands.TabOnlyCommand",
+    "tabp[revious]": "com.maddyhome.idea.vim.vimscript.model.commands.PreviousTabCommand",
+    "u[ndo]": "com.maddyhome.idea.vim.vimscript.model.commands.UndoCommand",
+    "unlo[ckvar]": "com.maddyhome.idea.vim.vimscript.model.commands.UnlockVarCommand",
+    "unm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "v[global]": "com.maddyhome.idea.vim.vimscript.model.commands.GlobalCommand",
+    "vm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "vmapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "vn[oremap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "vs[plit]": "com.maddyhome.idea.vim.vimscript.model.commands.SplitCommand",
+    "vu[nmap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "wN[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.WritePreviousFileCommand",
+    "w[rite]": "com.maddyhome.idea.vim.vimscript.model.commands.WriteCommand",
+    "wa[ll]": "com.maddyhome.idea.vim.vimscript.model.commands.WriteAllCommand",
+    "wn[ext]": "com.maddyhome.idea.vim.vimscript.model.commands.WriteNextFileCommand",
+    "wp[revious]": "com.maddyhome.idea.vim.vimscript.model.commands.WritePreviousFileCommand",
+    "wq": "com.maddyhome.idea.vim.vimscript.model.commands.WriteQuitCommand",
+    "wqa[ll]": "com.maddyhome.idea.vim.vimscript.model.commands.ExitCommand",
+    "x[it]": "com.maddyhome.idea.vim.vimscript.model.commands.WriteQuitCommand",
+    "xa[ll]": "com.maddyhome.idea.vim.vimscript.model.commands.ExitCommand",
+    "xm[ap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "xmapc[lear]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand",
+    "xn[oremap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand",
+    "xu[nmap]": "com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand",
+    "y[ank]": "com.maddyhome.idea.vim.vimscript.model.commands.YankLinesCommand",
+    "~": "com.maddyhome.idea.vim.vimscript.model.commands.SubstituteCommand"
+}
\ No newline at end of file
diff --git a/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json b/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json
new file mode 100644
index 000000000..ff5db2972
--- /dev/null
+++ b/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json
@@ -0,0 +1,14 @@
+{
+    "abs": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.AbsFunctionHandler",
+    "empty": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.EmptyFunctionHandler",
+    "exists": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.ExistsFunctionHandler",
+    "funcref": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.FuncrefFunctionHandler",
+    "function": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.FunctionFunctionHandler",
+    "get": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.GetFunctionHandler",
+    "join": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.JoinFunctionHandler",
+    "len": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.LenFunctionHandler",
+    "sin": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.SinFunctionHandler",
+    "split": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.SplitFunctionHandler",
+    "tolower": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.TolowerFunctionHandler",
+    "toupper": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.ToupperFunctionHandler"
+}
\ No newline at end of file