1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-05-04 16:34:02 +02:00

Support lazy ex command classloading

This commit is contained in:
filipp 2023-05-06 22:35:14 +03:00
parent 74237365f1
commit ee704f53c7
13 changed files with 230 additions and 601 deletions

View File

@ -1 +1,2 @@
com.intellij.vim.providers.VimscriptFunctionProcessorProvider
com.intellij.vim.providers.VimscriptFunctionProcessorProvider
com.intellij.vim.providers.ExCommandProcessorProvider

View File

@ -1 +0,0 @@
com.intellij.vim.providers.ExCommandProcessorProvider

View File

@ -0,0 +1,13 @@
/*
* Copyright 2003-2023 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
* https://opensource.org/licenses/MIT.
*/
package com.maddyhome.idea.vim.vimscript.model.commands
public object IntellijExCommandProvider : ExCommandProvider {
override val exCommandsFileName: String = "intellij_ex_commands.yaml"
}

View File

@ -11,6 +11,9 @@ package com.maddyhome.idea.vim.vimscript.parser
import com.intellij.openapi.diagnostic.logger
import com.maddyhome.idea.vim.vimscript.model.Script
import com.maddyhome.idea.vim.vimscript.model.commands.Command
import com.maddyhome.idea.vim.vimscript.model.commands.EngineExCommandProvider
import com.maddyhome.idea.vim.vimscript.model.commands.ExCommandTree
import com.maddyhome.idea.vim.vimscript.model.commands.IntellijExCommandProvider
import com.maddyhome.idea.vim.vimscript.model.expressions.Expression
import com.maddyhome.idea.vim.vimscript.parser.errors.IdeavimErrorListener
import com.maddyhome.idea.vim.vimscript.parser.generated.VimscriptLexer
@ -30,6 +33,12 @@ internal object VimscriptParser : com.maddyhome.idea.vim.api.VimscriptParser {
private const val MAX_NUMBER_OF_TRIES = 5
private var tries = 0
private var deletionInfo: DeletionInfo = DeletionInfo()
override val exCommands = ExCommandTree()
init {
EngineExCommandProvider.getCommands().forEach { exCommands.addCommand(it.key, it.value) }
IntellijExCommandProvider.getCommands().forEach { exCommands.addCommand(it.key, it.value) }
}
override fun parse(script: String): Script {
val preprocessedText = uncommentIdeaVimIgnore(getTextWithoutErrors(script))

View File

@ -9,92 +9,26 @@
package com.maddyhome.idea.vim.vimscript.parser.visitors
import com.intellij.openapi.diagnostic.logger
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.common.TextRange
import com.maddyhome.idea.vim.ex.ExException
import com.maddyhome.idea.vim.ex.ranges.Range
import com.maddyhome.idea.vim.ex.ranges.Range.Companion.createRange
import com.maddyhome.idea.vim.ex.ranges.Ranges
import com.maddyhome.idea.vim.vimscript.model.commands.ActionCommand
import com.maddyhome.idea.vim.vimscript.model.commands.ActionListCommand
import com.maddyhome.idea.vim.vimscript.model.commands.AsciiCommand
import com.maddyhome.idea.vim.vimscript.model.commands.BufferCloseCommand
import com.maddyhome.idea.vim.vimscript.model.commands.BufferCommand
import com.maddyhome.idea.vim.vimscript.model.commands.BufferListCommand
import com.maddyhome.idea.vim.vimscript.model.commands.CallCommand
import com.maddyhome.idea.vim.vimscript.model.commands.CmdClearCommand
import com.maddyhome.idea.vim.vimscript.model.commands.CmdCommand
import com.maddyhome.idea.vim.vimscript.model.commands.CmdFilterCommand
import com.maddyhome.idea.vim.vimscript.model.commands.Command
import com.maddyhome.idea.vim.vimscript.model.commands.CopyTextCommand
import com.maddyhome.idea.vim.vimscript.model.commands.DelCmdCommand
import com.maddyhome.idea.vim.vimscript.model.commands.DeleteLinesCommand
import com.maddyhome.idea.vim.vimscript.model.commands.DeleteMarksCommand
import com.maddyhome.idea.vim.vimscript.model.commands.DelfunctionCommand
import com.maddyhome.idea.vim.vimscript.model.commands.DigraphCommand
import com.maddyhome.idea.vim.vimscript.model.commands.DumpLineCommand
import com.maddyhome.idea.vim.vimscript.model.commands.EchoCommand
import com.maddyhome.idea.vim.vimscript.model.commands.EditFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.ExecuteCommand
import com.maddyhome.idea.vim.vimscript.model.commands.ExitCommand
import com.maddyhome.idea.vim.vimscript.model.commands.FileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.FindClassCommand
import com.maddyhome.idea.vim.vimscript.model.commands.FindFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.FindSymbolCommand
import com.maddyhome.idea.vim.vimscript.model.commands.GlobalCommand
import com.maddyhome.idea.vim.vimscript.model.commands.GoToLineCommand
import com.maddyhome.idea.vim.vimscript.model.commands.GotoCharacterCommand
import com.maddyhome.idea.vim.vimscript.model.commands.HelpCommand
import com.maddyhome.idea.vim.vimscript.model.commands.HistoryCommand
import com.maddyhome.idea.vim.vimscript.model.commands.JoinLinesCommand
import com.maddyhome.idea.vim.vimscript.model.commands.JumpsCommand
import com.maddyhome.idea.vim.vimscript.model.commands.LetCommand
import com.maddyhome.idea.vim.vimscript.model.commands.LockVarCommand
import com.maddyhome.idea.vim.vimscript.model.commands.MarkCommand
import com.maddyhome.idea.vim.vimscript.model.commands.MarksCommand
import com.maddyhome.idea.vim.vimscript.model.commands.MoveTextCommand
import com.maddyhome.idea.vim.vimscript.model.commands.NextFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.NextTabCommand
import com.maddyhome.idea.vim.vimscript.model.commands.NoHLSearchCommand
import com.maddyhome.idea.vim.vimscript.model.commands.NormalCommand
import com.maddyhome.idea.vim.vimscript.model.commands.OnlyCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PackaddCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PlugCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PreviousFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PreviousTabCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PrintCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PromptFindCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PromptReplaceCommand
import com.maddyhome.idea.vim.vimscript.model.commands.PutLinesCommand
import com.maddyhome.idea.vim.vimscript.model.commands.QuitCommand
import com.maddyhome.idea.vim.vimscript.model.commands.RedoCommand
import com.maddyhome.idea.vim.vimscript.model.commands.RegistersCommand
import com.maddyhome.idea.vim.vimscript.model.commands.RepeatCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SelectFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SelectFirstFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SelectLastFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SetCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SetHandlerCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SetLocalCommand
import com.maddyhome.idea.vim.vimscript.model.commands.ShellCommand
import com.maddyhome.idea.vim.vimscript.model.commands.ShiftLeftCommand
import com.maddyhome.idea.vim.vimscript.model.commands.ShiftRightCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SortCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SourceCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SplitCommand
import com.maddyhome.idea.vim.vimscript.model.commands.SplitType
import com.maddyhome.idea.vim.vimscript.model.commands.SubstituteCommand
import com.maddyhome.idea.vim.vimscript.model.commands.TabCloseCommand
import com.maddyhome.idea.vim.vimscript.model.commands.TabMoveCommand
import com.maddyhome.idea.vim.vimscript.model.commands.TabOnlyCommand
import com.maddyhome.idea.vim.vimscript.model.commands.UndoCommand
import com.maddyhome.idea.vim.vimscript.model.commands.UnknownCommand
import com.maddyhome.idea.vim.vimscript.model.commands.UnlockVarCommand
import com.maddyhome.idea.vim.vimscript.model.commands.WriteAllCommand
import com.maddyhome.idea.vim.vimscript.model.commands.WriteCommand
import com.maddyhome.idea.vim.vimscript.model.commands.WriteNextFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.WritePreviousFileCommand
import com.maddyhome.idea.vim.vimscript.model.commands.WriteQuitCommand
import com.maddyhome.idea.vim.vimscript.model.commands.YankLinesCommand
import com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand
import com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand
import com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand
@ -338,536 +272,7 @@ internal object CommandVisitor : VimscriptBaseVisitor<Command>() {
return TextRange(startOffset, endOffset)
}
// todo I am ashamed of that
private val commands = mutableMapOf(
"delf" to DelfunctionCommand::class,
"delfu" to DelfunctionCommand::class,
"delfun" to DelfunctionCommand::class,
"delfunc" to DelfunctionCommand::class,
"delfunct" to DelfunctionCommand::class,
"delfuncti" to DelfunctionCommand::class,
"delfunctio" to DelfunctionCommand::class,
"delfunction" to DelfunctionCommand::class,
"action" to ActionCommand::class,
"actionlist" to ActionListCommand::class,
"as" to AsciiCommand::class,
"asc" to AsciiCommand::class,
"asci" to AsciiCommand::class,
"ascii" to AsciiCommand::class,
"b" to BufferCommand::class,
"bu" to BufferCommand::class,
"buf" to BufferCommand::class,
"buff" to BufferCommand::class,
"buffe" to BufferCommand::class,
"buffer" to BufferCommand::class,
"bd" to BufferCloseCommand::class,
"bde" to BufferCloseCommand::class,
"bdel" to BufferCloseCommand::class,
"bdele" to BufferCloseCommand::class,
"bdelet" to BufferCloseCommand::class,
"bdelete" to BufferCloseCommand::class,
"ls" to BufferListCommand::class,
"files" to BufferListCommand::class,
"buffers" to BufferListCommand::class,
"cal" to CallCommand::class,
"call" to CallCommand::class,
"cla" to FindClassCommand::class,
"clas" to FindClassCommand::class,
"class" to FindClassCommand::class,
"com" to CmdCommand::class,
"comm" to CmdCommand::class,
"comma" to CmdCommand::class,
"comman" to CmdCommand::class,
"command" to CmdCommand::class,
"!" to CmdFilterCommand::class,
"comc" to CmdClearCommand::class,
"comcl" to CmdClearCommand::class,
"comcle" to CmdClearCommand::class,
"comclea" to CmdClearCommand::class,
"comclear" to CmdClearCommand::class,
"t" to CopyTextCommand::class,
"co" to CopyTextCommand::class,
"cop" to CopyTextCommand::class,
"copy" to CopyTextCommand::class,
"delc" to DelCmdCommand::class,
"delco" to DelCmdCommand::class,
"delcom" to DelCmdCommand::class,
"delcomm" to DelCmdCommand::class,
"delcomma" to DelCmdCommand::class,
"delcomman" to DelCmdCommand::class,
"delcommand" to DelCmdCommand::class,
"d" to DeleteLinesCommand::class,
"de" to DeleteLinesCommand::class,
"del" to DeleteLinesCommand::class,
"dele" to DeleteLinesCommand::class,
"delet" to DeleteLinesCommand::class,
"delete" to DeleteLinesCommand::class,
"delm" to DeleteMarksCommand::class,
"delma" to DeleteMarksCommand::class,
"delmar" to DeleteMarksCommand::class,
"delmark" to DeleteMarksCommand::class,
"delmarks" to DeleteMarksCommand::class,
"dig" to DigraphCommand::class,
"digr" to DigraphCommand::class,
"digra" to DigraphCommand::class,
"digrap" to DigraphCommand::class,
"digraph" to DigraphCommand::class,
"digraphs" to DigraphCommand::class,
"dump" to DumpLineCommand::class,
"dumpl" to DumpLineCommand::class,
"dumpli" to DumpLineCommand::class,
"dumplin" to DumpLineCommand::class,
"dumpline" to DumpLineCommand::class,
"ec" to EchoCommand::class,
"ech" to EchoCommand::class,
"echo" to EchoCommand::class,
"e" to EditFileCommand::class,
"ed" to EditFileCommand::class,
"edi" to EditFileCommand::class,
"edit" to EditFileCommand::class,
"bro" to EditFileCommand::class,
"brow" to EditFileCommand::class,
"brows" to EditFileCommand::class,
"browse" to EditFileCommand::class,
"wqa" to ExitCommand::class,
"wqal" to ExitCommand::class,
"wqall" to ExitCommand::class,
"qa" to ExitCommand::class,
"qal" to ExitCommand::class,
"qall" to ExitCommand::class,
"xa" to ExitCommand::class,
"xal" to ExitCommand::class,
"xall" to ExitCommand::class,
"quita" to ExitCommand::class,
"quital" to ExitCommand::class,
"quitall" to ExitCommand::class,
"f" to FileCommand::class,
"fi" to FileCommand::class,
"fil" to FileCommand::class,
"file" to FileCommand::class,
"fin" to FindFileCommand::class,
"find" to FindFileCommand::class,
"sym" to FindSymbolCommand::class,
"symb" to FindSymbolCommand::class,
"symbo" to FindSymbolCommand::class,
"symbol" to FindSymbolCommand::class,
"g" to GlobalCommand::class,
"gl" to GlobalCommand::class,
"glo" to GlobalCommand::class,
"glob" to GlobalCommand::class,
"globa" to GlobalCommand::class,
"global" to GlobalCommand::class,
"v" to GlobalCommand::class,
"vg" to GlobalCommand::class,
"vgl" to GlobalCommand::class,
"vglo" to GlobalCommand::class,
"vglob" to GlobalCommand::class,
"vgloba" to GlobalCommand::class,
"vglobal" to GlobalCommand::class,
"go" to GotoCharacterCommand::class,
"got" to GotoCharacterCommand::class,
"goto" to GotoCharacterCommand::class,
"h" to HelpCommand::class,
"he" to HelpCommand::class,
"hel" to HelpCommand::class,
"help" to HelpCommand::class,
"his" to HistoryCommand::class,
"hist" to HistoryCommand::class,
"histo" to HistoryCommand::class,
"histor" to HistoryCommand::class,
"history" to HistoryCommand::class,
"j" to JoinLinesCommand::class,
"jo" to JoinLinesCommand::class,
"joi" to JoinLinesCommand::class,
"join" to JoinLinesCommand::class,
"ju" to JumpsCommand::class,
"jum" to JumpsCommand::class,
"jump" to JumpsCommand::class,
"jumps" to JumpsCommand::class,
"let" to LetCommand::class,
"k" to MarkCommand::class,
"ma" to MarkCommand::class,
"mar" to MarkCommand::class,
"mark" to MarkCommand::class,
"marks" to MarksCommand::class,
"m" to MoveTextCommand::class,
"mo" to MoveTextCommand::class,
"mov" to MoveTextCommand::class,
"move" to MoveTextCommand::class,
"n" to NextFileCommand::class,
"ne" to NextFileCommand::class,
"nex" to NextFileCommand::class,
"next" to NextFileCommand::class,
"bn" to NextFileCommand::class,
"bne" to NextFileCommand::class,
"bnex" to NextFileCommand::class,
"bnext" to NextFileCommand::class,
"tabn" to NextTabCommand::class,
"tabne" to NextTabCommand::class,
"tabnex" to NextTabCommand::class,
"tabnext" to NextTabCommand::class,
"noh" to NoHLSearchCommand::class,
"nohl" to NoHLSearchCommand::class,
"nohls" to NoHLSearchCommand::class,
"nohlse" to NoHLSearchCommand::class,
"nohlsea" to NoHLSearchCommand::class,
"nohlsear" to NoHLSearchCommand::class,
"nohlsearc" to NoHLSearchCommand::class,
"nohlsearch" to NoHLSearchCommand::class,
"norm" to NormalCommand::class,
"norma" to NormalCommand::class,
"normal" to NormalCommand::class,
"on" to OnlyCommand::class,
"onl" to OnlyCommand::class,
"only" to OnlyCommand::class,
"pa" to PackaddCommand::class,
"pac" to PackaddCommand::class,
"pack" to PackaddCommand::class,
"packa" to PackaddCommand::class,
"packad" to PackaddCommand::class,
"packadd" to PackaddCommand::class,
"Plug" to PlugCommand::class,
"Plugi" to PlugCommand::class,
"Plugin" to PlugCommand::class,
"N" to PreviousFileCommand::class,
"Ne" to PreviousFileCommand::class,
"Nex" to PreviousFileCommand::class,
"Next" to PreviousFileCommand::class,
"prev" to PreviousFileCommand::class,
"previ" to PreviousFileCommand::class,
"previo" to PreviousFileCommand::class,
"previou" to PreviousFileCommand::class,
"previous" to PreviousFileCommand::class,
"bp" to PreviousFileCommand::class,
"bpr" to PreviousFileCommand::class,
"bpre" to PreviousFileCommand::class,
"bprev" to PreviousFileCommand::class,
"bprevi" to PreviousFileCommand::class,
"bprevio" to PreviousFileCommand::class,
"bpreviou" to PreviousFileCommand::class,
"bprevious" to PreviousFileCommand::class,
"tabp" to PreviousTabCommand::class,
"tabpr" to PreviousTabCommand::class,
"tabpre" to PreviousTabCommand::class,
"tabprev" to PreviousTabCommand::class,
"tabprevi" to PreviousTabCommand::class,
"tabprevio" to PreviousTabCommand::class,
"tabpreviou" to PreviousTabCommand::class,
"tabprevious" to PreviousTabCommand::class,
"tabN" to PreviousTabCommand::class,
"tabNe" to PreviousTabCommand::class,
"tabNex" to PreviousTabCommand::class,
"tabNext" to PreviousTabCommand::class,
"p" to PrintCommand::class,
"pr" to PrintCommand::class,
"pri" to PrintCommand::class,
"prin" to PrintCommand::class,
"print" to PrintCommand::class,
"P" to PrintCommand::class,
"Pr" to PrintCommand::class,
"Pri" to PrintCommand::class,
"Prin" to PrintCommand::class,
"Print" to PrintCommand::class,
"pro" to PromptFindCommand::class,
"prom" to PromptFindCommand::class,
"promp" to PromptFindCommand::class,
"prompt" to PromptFindCommand::class,
"promptf" to PromptFindCommand::class,
"promptfi" to PromptFindCommand::class,
"promptfin" to PromptFindCommand::class,
"promptfind" to PromptFindCommand::class,
"promptr" to PromptReplaceCommand::class,
"promptre" to PromptReplaceCommand::class,
"promptrep" to PromptReplaceCommand::class,
"promptrepl" to PromptReplaceCommand::class,
"promptrepla" to PromptReplaceCommand::class,
"promptreplac" to PromptReplaceCommand::class,
"promptreplace" to PromptReplaceCommand::class,
"pu" to PutLinesCommand::class,
"put" to PutLinesCommand::class,
"q" to QuitCommand::class,
"qu" to QuitCommand::class,
"qui" to QuitCommand::class,
"quit" to QuitCommand::class,
"clo" to QuitCommand::class,
"clos" to QuitCommand::class,
"close" to QuitCommand::class,
"hid" to QuitCommand::class,
"hide" to QuitCommand::class,
"red" to RedoCommand::class,
"redo" to RedoCommand::class,
"di" to RegistersCommand::class,
"dis" to RegistersCommand::class,
"disp" to RegistersCommand::class,
"displ" to RegistersCommand::class,
"displa" to RegistersCommand::class,
"display" to RegistersCommand::class,
"exe" to ExecuteCommand::class,
"exec" to ExecuteCommand::class,
"execu" to ExecuteCommand::class,
"execut" to ExecuteCommand::class,
"execute" to ExecuteCommand::class,
"reg" to RegistersCommand::class,
"regi" to RegistersCommand::class,
"regis" to RegistersCommand::class,
"regist" to RegistersCommand::class,
"registe" to RegistersCommand::class,
"register" to RegistersCommand::class,
"registers" to RegistersCommand::class,
"@" to RepeatCommand::class,
"argu" to SelectFileCommand::class,
"argum" to SelectFileCommand::class,
"argume" to SelectFileCommand::class,
"argumen" to SelectFileCommand::class,
"argument" to SelectFileCommand::class,
"fir" to SelectFirstFileCommand::class,
"firs" to SelectFirstFileCommand::class,
"first" to SelectFirstFileCommand::class,
"la" to SelectLastFileCommand::class,
"las" to SelectLastFileCommand::class,
"last" to SelectLastFileCommand::class,
"se" to SetCommand::class,
"set" to SetCommand::class,
"setl" to SetLocalCommand::class,
"setlo" to SetLocalCommand::class,
"setloc" to SetLocalCommand::class,
"setloca" to SetLocalCommand::class,
"setlocal" to SetLocalCommand::class,
"sethandler" to SetHandlerCommand::class,
"sh" to ShellCommand::class,
"she" to ShellCommand::class,
"shel" to ShellCommand::class,
"shell" to ShellCommand::class,
"sor" to SortCommand::class,
"sort" to SortCommand::class,
"sp" to SplitCommand::class,
"spl" to SplitCommand::class,
"spli" to SplitCommand::class,
"split" to SplitCommand::class,
"vs" to SplitCommand::class,
"vsp" to SplitCommand::class,
"vspl" to SplitCommand::class,
"vspli" to SplitCommand::class,
"vsplit" to SplitCommand::class,
"so" to SourceCommand::class,
"sou" to SourceCommand::class,
"sour" to SourceCommand::class,
"sourc" to SourceCommand::class,
"source" to SourceCommand::class,
"~" to SubstituteCommand::class,
"&" to SubstituteCommand::class,
"s" to SubstituteCommand::class,
"su" to SubstituteCommand::class,
"sub" to SubstituteCommand::class,
"subs" to SubstituteCommand::class,
"subst" to SubstituteCommand::class,
"substi" to SubstituteCommand::class,
"substit" to SubstituteCommand::class,
"substitu" to SubstituteCommand::class,
"substitut" to SubstituteCommand::class,
"substitute" to SubstituteCommand::class,
"tabc" to TabCloseCommand::class,
"tabcl" to TabCloseCommand::class,
"tabclo" to TabCloseCommand::class,
"tabclos" to TabCloseCommand::class,
"tabclose" to TabCloseCommand::class,
"tabm" to TabMoveCommand::class,
"tabmo" to TabMoveCommand::class,
"tabmov" to TabMoveCommand::class,
"tabmove" to TabMoveCommand::class,
"tabo" to TabOnlyCommand::class,
"tabon" to TabOnlyCommand::class,
"tabonl" to TabOnlyCommand::class,
"tabonly" to TabOnlyCommand::class,
"u" to UndoCommand::class,
"un" to UndoCommand::class,
"und" to UndoCommand::class,
"undo" to UndoCommand::class,
"wa" to WriteAllCommand::class,
"wal" to WriteAllCommand::class,
"wall" to WriteAllCommand::class,
"w" to WriteCommand::class,
"wr" to WriteCommand::class,
"wri" to WriteCommand::class,
"writ" to WriteCommand::class,
"write" to WriteCommand::class,
"wn" to WriteNextFileCommand::class,
"wne" to WriteNextFileCommand::class,
"wnex" to WriteNextFileCommand::class,
"wnext" to WriteNextFileCommand::class,
"wN" to WritePreviousFileCommand::class,
"wNe" to WritePreviousFileCommand::class,
"wNex" to WritePreviousFileCommand::class,
"wNext" to WritePreviousFileCommand::class,
"wp" to WritePreviousFileCommand::class,
"wpr" to WritePreviousFileCommand::class,
"wpre" to WritePreviousFileCommand::class,
"wprev" to WritePreviousFileCommand::class,
"wprevi" to WritePreviousFileCommand::class,
"wprevio" to WritePreviousFileCommand::class,
"wpreviou" to WritePreviousFileCommand::class,
"wprevious" to WritePreviousFileCommand::class,
"wq" to WriteQuitCommand::class,
"x" to WriteQuitCommand::class,
"xi" to WriteQuitCommand::class,
"xit" to WriteQuitCommand::class,
"exi" to WriteQuitCommand::class,
"exit" to WriteQuitCommand::class,
"y" to YankLinesCommand::class,
"ya" to YankLinesCommand::class,
"yan" to YankLinesCommand::class,
"yank" to YankLinesCommand::class,
"map" to MapCommand::class,
"nm" to MapCommand::class,
"vm" to MapCommand::class,
"xm" to MapCommand::class,
"om" to MapCommand::class,
"im" to MapCommand::class,
"cm" to MapCommand::class,
"nma" to MapCommand::class,
"vma" to MapCommand::class,
"xma" to MapCommand::class,
"oma" to MapCommand::class,
"ima" to MapCommand::class,
"cma" to MapCommand::class,
"nmap" to MapCommand::class,
"vmap" to MapCommand::class,
"xmap" to MapCommand::class,
"omap" to MapCommand::class,
"imap" to MapCommand::class,
"cmap" to MapCommand::class,
"no" to MapCommand::class,
"nn" to MapCommand::class,
"vn" to MapCommand::class,
"xn" to MapCommand::class,
"ono" to MapCommand::class,
"ino" to MapCommand::class,
"cno" to MapCommand::class,
"nno" to MapCommand::class,
"vno" to MapCommand::class,
"xno" to MapCommand::class,
"nor" to MapCommand::class,
"nnor" to MapCommand::class,
"vnor" to MapCommand::class,
"xnor" to MapCommand::class,
"onor" to MapCommand::class,
"inor" to MapCommand::class,
"cnor" to MapCommand::class,
"nore" to MapCommand::class,
"nnore" to MapCommand::class,
"vnore" to MapCommand::class,
"xnore" to MapCommand::class,
"onore" to MapCommand::class,
"inore" to MapCommand::class,
"cnore" to MapCommand::class,
"norem" to MapCommand::class,
"nnorem" to MapCommand::class,
"vnorem" to MapCommand::class,
"xnorem" to MapCommand::class,
"onorem" to MapCommand::class,
"inorem" to MapCommand::class,
"cnorem" to MapCommand::class,
"norema" to MapCommand::class,
"nnorema" to MapCommand::class,
"vnorema" to MapCommand::class,
"xnorema" to MapCommand::class,
"onorema" to MapCommand::class,
"inorema" to MapCommand::class,
"cnorema" to MapCommand::class,
"noremap" to MapCommand::class,
"nnoremap" to MapCommand::class,
"vnoremap" to MapCommand::class,
"xnoremap" to MapCommand::class,
"onoremap" to MapCommand::class,
"inoremap" to MapCommand::class,
"cnoremap" to MapCommand::class,
"mapc" to MapClearCommand::class,
"nmapc" to MapClearCommand::class,
"vmapc" to MapClearCommand::class,
"xmapc" to MapClearCommand::class,
"smapc" to MapClearCommand::class,
"omapc" to MapClearCommand::class,
"imapc" to MapClearCommand::class,
"cmapc" to MapClearCommand::class,
"mapcl" to MapClearCommand::class,
"nmapcl" to MapClearCommand::class,
"vmapcl" to MapClearCommand::class,
"xmapcl" to MapClearCommand::class,
"smapcl" to MapClearCommand::class,
"omapcl" to MapClearCommand::class,
"imapcl" to MapClearCommand::class,
"cmapcl" to MapClearCommand::class,
"mapcle" to MapClearCommand::class,
"nmapcle" to MapClearCommand::class,
"vmapcle" to MapClearCommand::class,
"xmapcle" to MapClearCommand::class,
"smapcle" to MapClearCommand::class,
"omapcle" to MapClearCommand::class,
"imapcle" to MapClearCommand::class,
"cmapcle" to MapClearCommand::class,
"mapclea" to MapClearCommand::class,
"nmapclea" to MapClearCommand::class,
"vmapclea" to MapClearCommand::class,
"xmapclea" to MapClearCommand::class,
"smapclea" to MapClearCommand::class,
"omapclea" to MapClearCommand::class,
"imapclea" to MapClearCommand::class,
"cmapclea" to MapClearCommand::class,
"mapclear" to MapClearCommand::class,
"nmapclear" to MapClearCommand::class,
"vmapclear" to MapClearCommand::class,
"xmapclear" to MapClearCommand::class,
"smapclear" to MapClearCommand::class,
"omapclear" to MapClearCommand::class,
"imapclear" to MapClearCommand::class,
"cmapclear" to MapClearCommand::class,
"vu" to UnMapCommand::class,
"xu" to UnMapCommand::class,
"ou" to UnMapCommand::class,
"iu" to UnMapCommand::class,
"cu" to UnMapCommand::class,
"nun" to UnMapCommand::class,
"vun" to UnMapCommand::class,
"xun" to UnMapCommand::class,
"oun" to UnMapCommand::class,
"iun" to UnMapCommand::class,
"cun" to UnMapCommand::class,
"unm" to UnMapCommand::class,
"nunm" to UnMapCommand::class,
"vunm" to UnMapCommand::class,
"xunm" to UnMapCommand::class,
"sunm" to UnMapCommand::class,
"ounm" to UnMapCommand::class,
"iunm" to UnMapCommand::class,
"cunm" to UnMapCommand::class,
"unma" to UnMapCommand::class,
"nunma" to UnMapCommand::class,
"vunma" to UnMapCommand::class,
"xunma" to UnMapCommand::class,
"sunma" to UnMapCommand::class,
"ounma" to UnMapCommand::class,
"iunma" to UnMapCommand::class,
"cunma" to UnMapCommand::class,
"unmap" to UnMapCommand::class,
"nunmap" to UnMapCommand::class,
"vunmap" to UnMapCommand::class,
"xunmap" to UnMapCommand::class,
"sunmap" to UnMapCommand::class,
"ounmap" to UnMapCommand::class,
"iunmap" to UnMapCommand::class,
"cunmap" to UnMapCommand::class,
"lockv" to LockVarCommand::class,
"lockva" to LockVarCommand::class,
"lockvar" to LockVarCommand::class,
"unlo" to UnlockVarCommand::class,
"unloc" to UnlockVarCommand::class,
"unlock" to UnlockVarCommand::class,
"unlockv" to UnlockVarCommand::class,
"unlockva" to UnlockVarCommand::class,
"unlockvar" to UnlockVarCommand::class,
)
private fun getCommandByName(commandName: String): KClass<out Command> {
return commands[commandName]!!
return injector.vimscriptParser.exCommands.getCommand(commandName)?.getKClass() ?: UnknownCommand::class
}
}

View File

@ -0,0 +1,9 @@
# This file was automatically generated by [com.intellij.vim.processor.EXCommandProcessor].
# If you are going to change it, you are probably doing something wrong, as your changes will be overridden by the next `gradle kspKotlin` run.
actionl[ist]: com.maddyhome.idea.vim.vimscript.model.commands.ActionListCommand
b[uffer]: com.maddyhome.idea.vim.vimscript.model.commands.BufferCommand
ls,files,buffers: com.maddyhome.idea.vim.vimscript.model.commands.BufferListCommand
'!': com.maddyhome.idea.vim.vimscript.model.commands.CmdFilterCommand
g[lobal],vg[lobal]: com.maddyhome.idea.vim.vimscript.model.commands.GlobalCommand
h[elp]: com.maddyhome.idea.vim.vimscript.model.commands.HelpCommand

View File

@ -10,9 +10,11 @@ package com.maddyhome.idea.vim.api
import com.maddyhome.idea.vim.vimscript.model.Script
import com.maddyhome.idea.vim.vimscript.model.commands.Command
import com.maddyhome.idea.vim.vimscript.model.commands.ExCommandTree
import com.maddyhome.idea.vim.vimscript.model.expressions.Expression
public interface VimscriptParser {
public val exCommands: ExCommandTree
public fun parse(script: String): Script
public fun parseCommand(command: String): Command?

View File

@ -67,12 +67,12 @@ public fun String.removeAsciiColorCodes(): String {
return this.replace("\u001B\\[[;\\d]*m".toRegex(), "")
}
internal fun String.indexOfOrNull(char: Char, startIndex: Int): Int? {
internal fun String.indexOfOrNull(char: Char, startIndex: Int = 0): Int? {
val index = this.indexOf(char, startIndex)
return if (index < 0) null else index
}
internal fun String.lastIndexOfOrNull(char: Char, startIndex: Int, endIndex: Int): Int? {
internal fun String.lastIndexOfOrNull(char: Char, startIndex: Int = 0, endIndex: Int = length): Int? {
if (startIndex < 0 || endIndex > this.length) return null
var i = endIndex - 1
while (i >= startIndex) {

View File

@ -0,0 +1,13 @@
/*
* Copyright 2003-2023 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
* https://opensource.org/licenses/MIT.
*/
package com.maddyhome.idea.vim.vimscript.model.commands
public object EngineExCommandProvider : ExCommandProvider {
override val exCommandsFileName: String = "engine_ex_commands.yaml"
}

View File

@ -0,0 +1,28 @@
/*
* Copyright 2003-2023 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
* https://opensource.org/licenses/MIT.
*/
package com.maddyhome.idea.vim.vimscript.model.commands
import org.yaml.snakeyaml.Yaml
import java.io.InputStream
public interface ExCommandProvider {
public val exCommandsFileName: String
public fun getCommands(): Map<String, LazyExCommandInstance> {
val yaml = Yaml()
val classLoader = this.javaClass.classLoader
val commandToClass: Map<String, String> = yaml.load(getFile())
return commandToClass.entries.associate { it.key to LazyExCommandInstance(it.value, classLoader) }
}
private fun getFile(): InputStream {
return object {}.javaClass.classLoader.getResourceAsStream(exCommandsFileName)
?: throw RuntimeException("Failed to fetch ex-commands for ${javaClass.name}")
}
}

View File

@ -0,0 +1,57 @@
/*
* Copyright 2003-2023 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
* https://opensource.org/licenses/MIT.
*/
package com.maddyhome.idea.vim.vimscript.model.commands
import com.intellij.vim.model.LazyInstance
import com.maddyhome.idea.vim.helper.indexOfOrNull
import com.maddyhome.idea.vim.helper.lastIndexOfOrNull
// TODO do we really need a tree structure here?
public class ExCommandTree {
private val abbrevToCommand = mutableMapOf<String, String>()
private val commandToInstance = mutableMapOf<String, LazyExCommandInstance>()
public fun addCommand(commandsPattern: String, lazyInstance: LazyExCommandInstance) {
val subCommands = parseCommandPattern(commandsPattern)
for ((requiredPart, optionalPart) in subCommands) {
val fullCommand = requiredPart + optionalPart
commandToInstance[fullCommand] = lazyInstance
for (i in (0 .. optionalPart.length)) {
abbrevToCommand[requiredPart + optionalPart.substring(0, i)] = fullCommand
}
}
}
public fun getCommand(command: String): LazyExCommandInstance? {
return abbrevToCommand[command]?.let { commandToInstance[it] }
}
private fun parseCommandPattern(commandsPattern: String): List<Pair<String, String>> {
val result = mutableListOf<Pair<String, String>>()
val commands = commandsPattern.split(",")
for (command in commands) {
val leftBraceIndex = command.indexOfOrNull('[')
val rightBraceIndex = command.indexOfOrNull(']')
if (
(leftBraceIndex == null && rightBraceIndex != null) ||
(leftBraceIndex != null && rightBraceIndex == null) ||
(leftBraceIndex != null && rightBraceIndex != null && leftBraceIndex > rightBraceIndex) ||
(leftBraceIndex != null && leftBraceIndex != command.lastIndexOfOrNull('[')) ||
(rightBraceIndex != null && rightBraceIndex != command.lastIndexOfOrNull(']'))
) {
throw RuntimeException("Invalid ex-command pattern $commandsPattern")
}
val primaryPart = command.substring(0, leftBraceIndex ?: command.length)
val optionalPart = if (leftBraceIndex != null && rightBraceIndex != null) command.substring(leftBraceIndex + 1, rightBraceIndex) else ""
result.add(Pair(primaryPart, optionalPart))
}
return result
}
}

View File

@ -0,0 +1,18 @@
/*
* Copyright 2003-2023 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
* https://opensource.org/licenses/MIT.
*/
package com.maddyhome.idea.vim.vimscript.model.commands
import kotlin.reflect.KClass
public class LazyExCommandInstance(private val className: String, private val classLoader: ClassLoader) {
public fun getKClass(): KClass<out Command> {
@Suppress("UNCHECKED_CAST")
return classLoader.loadClass(className).kotlin as KClass<out Command>
}
}

View File

@ -0,0 +1,75 @@
# This file was automatically generated by [com.intellij.vim.processor.EXCommandProcessor].
# If you are going to change it, you are probably doing something wrong, as your changes will be overridden by the next `gradle kspKotlin` run.
action: com.maddyhome.idea.vim.vimscript.model.commands.ActionCommand
as[cii]: com.maddyhome.idea.vim.vimscript.model.commands.AsciiCommand
bd[elete]: com.maddyhome.idea.vim.vimscript.model.commands.BufferCloseCommand
cal[l]: com.maddyhome.idea.vim.vimscript.model.commands.CallCommand
comc[lear]: com.maddyhome.idea.vim.vimscript.model.commands.CmdClearCommand
com[mand]: com.maddyhome.idea.vim.vimscript.model.commands.CmdCommand
t,co[py]: com.maddyhome.idea.vim.vimscript.model.commands.CopyTextCommand
delc[ommand]: com.maddyhome.idea.vim.vimscript.model.commands.DelCmdCommand
d[elete]: com.maddyhome.idea.vim.vimscript.model.commands.DeleteLinesCommand
delm[arks]: com.maddyhome.idea.vim.vimscript.model.commands.DeleteMarksCommand
delf[unction]: com.maddyhome.idea.vim.vimscript.model.commands.DelfunctionCommand
dig[raphs]: com.maddyhome.idea.vim.vimscript.model.commands.DigraphCommand
dump[line]: com.maddyhome.idea.vim.vimscript.model.commands.DumpLineCommand
ec[ho]: com.maddyhome.idea.vim.vimscript.model.commands.EchoCommand
e[dit],bro[wse]: com.maddyhome.idea.vim.vimscript.model.commands.EditFileCommand
exe[cute]: com.maddyhome.idea.vim.vimscript.model.commands.ExecuteCommand
qa[ll],xa[ll],wqa[ll],quita[ll]: com.maddyhome.idea.vim.vimscript.model.commands.ExitCommand
f[ile]: com.maddyhome.idea.vim.vimscript.model.commands.FileCommand
cla[ss]: com.maddyhome.idea.vim.vimscript.model.commands.FindClassCommand
fin[d]: com.maddyhome.idea.vim.vimscript.model.commands.FindFileCommand
sym[bol]: com.maddyhome.idea.vim.vimscript.model.commands.FindSymbolCommand
go[to]: com.maddyhome.idea.vim.vimscript.model.commands.GotoCharacterCommand
his[tory]: com.maddyhome.idea.vim.vimscript.model.commands.HistoryCommand
j[oin]: com.maddyhome.idea.vim.vimscript.model.commands.JoinLinesCommand
ju[mps]: com.maddyhome.idea.vim.vimscript.model.commands.JumpsCommand
let: com.maddyhome.idea.vim.vimscript.model.commands.LetCommand
lockv[ar]: com.maddyhome.idea.vim.vimscript.model.commands.LockVarCommand
unlo[ckvar]: com.maddyhome.idea.vim.vimscript.model.commands.UnlockVarCommand
k,ma[rks]: com.maddyhome.idea.vim.vimscript.model.commands.MarkCommand
m[ove]: com.maddyhome.idea.vim.vimscript.model.commands.MoveTextCommand
n[ext],bn[ext]: com.maddyhome.idea.vim.vimscript.model.commands.NextFileCommand
tabn[ext]: com.maddyhome.idea.vim.vimscript.model.commands.NextTabCommand
noh[lsearch]: com.maddyhome.idea.vim.vimscript.model.commands.NoHLSearchCommand
norm[al]: com.maddyhome.idea.vim.vimscript.model.commands.NormalCommand
on[ly]: com.maddyhome.idea.vim.vimscript.model.commands.OnlyCommand
pa[ckadd]: com.maddyhome.idea.vim.vimscript.model.commands.PackaddCommand
Plug[in]: com.maddyhome.idea.vim.vimscript.model.commands.PlugCommand
prev[ious],bp[revious],N[ext]: com.maddyhome.idea.vim.vimscript.model.commands.PreviousFileCommand
tabp[previous],tabN[ext]: com.maddyhome.idea.vim.vimscript.model.commands.PreviousTabCommand
p[rint],P[rint]: com.maddyhome.idea.vim.vimscript.model.commands.PrintCommand
pro[mptfind]: com.maddyhome.idea.vim.vimscript.model.commands.PromptFindCommand
promptr[eplace]: com.maddyhome.idea.vim.vimscript.model.commands.PromptReplaceCommand
pu[t]: com.maddyhome.idea.vim.vimscript.model.commands.PutLinesCommand
q[uit],clo[se],hi[de]: com.maddyhome.idea.vim.vimscript.model.commands.QuitCommand
red[o]: com.maddyhome.idea.vim.vimscript.model.commands.RedoCommand
dis[play],reg[isters]: com.maddyhome.idea.vim.vimscript.model.commands.RegistersCommand
'@': com.maddyhome.idea.vim.vimscript.model.commands.RepeatCommand
argu[ment]: com.maddyhome.idea.vim.vimscript.model.commands.SelectFileCommand
fir[st]: com.maddyhome.idea.vim.vimscript.model.commands.SelectFirstFileCommand
la[st]: com.maddyhome.idea.vim.vimscript.model.commands.SelectLastFileCommand
se[t]: com.maddyhome.idea.vim.vimscript.model.commands.SetCommand
setl[ocal]: com.maddyhome.idea.vim.vimscript.model.commands.SetLocalCommand
sethandler: com.maddyhome.idea.vim.vimscript.model.commands.SetHandlerCommand
sh[ell]: com.maddyhome.idea.vim.vimscript.model.commands.ShellCommand
sor[t]: com.maddyhome.idea.vim.vimscript.model.commands.SortCommand
so[urce]: com.maddyhome.idea.vim.vimscript.model.commands.SourceCommand
sp[lit],vs[plit]: com.maddyhome.idea.vim.vimscript.model.commands.SplitCommand
~,&,s[ubstitute]: com.maddyhome.idea.vim.vimscript.model.commands.SubstituteCommand
tabc[lose]: com.maddyhome.idea.vim.vimscript.model.commands.TabCloseCommand
tabm[ove]: com.maddyhome.idea.vim.vimscript.model.commands.TabMoveCommand
tabo[nly]: com.maddyhome.idea.vim.vimscript.model.commands.TabOnlyCommand
u[ndo]: com.maddyhome.idea.vim.vimscript.model.commands.UndoCommand
wa[ll]: com.maddyhome.idea.vim.vimscript.model.commands.WriteAllCommand
w[rite]: com.maddyhome.idea.vim.vimscript.model.commands.WriteCommand
wn[ext]: com.maddyhome.idea.vim.vimscript.model.commands.WriteNextFileCommand
wp[revious],wN[ext]: com.maddyhome.idea.vim.vimscript.model.commands.WritePreviousFileCommand
wq,x[it],exi[t]: com.maddyhome.idea.vim.vimscript.model.commands.WriteQuitCommand
y[ank]: com.maddyhome.idea.vim.vimscript.model.commands.YankLinesCommand
mapc[lear],nmapc[lear],vmapc[lear],xmapc[lear],smapc[lear],omapc[lear],mapc[lear],imapc[lear],lmapc[lear],cmapc[lear]: com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapClearCommand
? map,nm[ap],vm[ap],xm[ap],smap,om[ap],im[ap],lm[ap],cm[ap],no[map],nn[oremap],vn[oremap],xn[oremap],snor[emap],ono[remap],no[remap],ino[remap],ln[oremap],cno[remap]
: com.maddyhome.idea.vim.vimscript.model.commands.mapping.MapCommand
unm[ap],nun[map],vu[nmap],xu[nmap],sunm[ap],ou[nmap],unm[ap],iu[nmap],lu[nmap],cu[nmap]: com.maddyhome.idea.vim.vimscript.model.commands.mapping.UnMapCommand