mirror of
https://github.com/chylex/IntelliJ-IdeaVim.git
synced 2025-05-25 09:34:08 +02:00
Add LazyVimCommand and CommandProvider
This commit is contained in:
parent
30165f5047
commit
fe6c1ae452
annotation-processors/src/main/kotlin/com/intellij/vim/processors
src/main/java/com/maddyhome/idea/vim
action
group
handler
newapi
vim-engine/src/main/kotlin/com/maddyhome/idea/vim
@ -56,5 +56,5 @@ class CommandOrMotionProcessor(private val environment: SymbolProcessorEnvironme
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
private data class CommandBean(val keys: String, val `class`: String, val modes: String)
|
data class CommandBean(val keys: String, val `class`: String, val modes: String)
|
||||||
}
|
}
|
@ -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.action
|
||||||
|
|
||||||
|
public object IntellijCommandProvider : CommandProvider {
|
||||||
|
override val exCommandListFileName: String = "intellij_commands.json"
|
||||||
|
}
|
@ -35,6 +35,7 @@ public open class GlobalIjOptions(scope: OptionAccessScope) : OptionsPropertiesB
|
|||||||
public var unifyjumps: Boolean by optionProperty(IjOptions.unifyjumps)
|
public var unifyjumps: Boolean by optionProperty(IjOptions.unifyjumps)
|
||||||
public var exCommandAnnotation: Boolean by optionProperty(IjOptions.exCommandAnnotation)
|
public var exCommandAnnotation: Boolean by optionProperty(IjOptions.exCommandAnnotation)
|
||||||
public var vimscriptFunctionAnnotation: Boolean by optionProperty(IjOptions.vimscriptFunctionAnnotation)
|
public var vimscriptFunctionAnnotation: Boolean by optionProperty(IjOptions.vimscriptFunctionAnnotation)
|
||||||
|
public var commandOrMotionAnnotation: Boolean by optionProperty(IjOptions.commandOrMotionAnnotation)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,6 +84,7 @@ public object IjOptions {
|
|||||||
public val trackactionids: ToggleOption = addOption(ToggleOption("trackactionids", GLOBAL, "tai", false))
|
public val trackactionids: ToggleOption = addOption(ToggleOption("trackactionids", GLOBAL, "tai", false))
|
||||||
public val unifyjumps: ToggleOption = addOption(ToggleOption("unifyjumps", GLOBAL, "unifyjumps", true))
|
public val unifyjumps: ToggleOption = addOption(ToggleOption("unifyjumps", GLOBAL, "unifyjumps", true))
|
||||||
public val vimscriptFunctionAnnotation: ToggleOption = addOption(ToggleOption("vimscriptfunctionannotation", GLOBAL, "vimscriptfunctionannotation", true))
|
public val vimscriptFunctionAnnotation: ToggleOption = addOption(ToggleOption("vimscriptfunctionannotation", GLOBAL, "vimscriptfunctionannotation", true))
|
||||||
|
public val commandOrMotionAnnotation: ToggleOption = addOption(ToggleOption("commandormotionannotation", GLOBAL, "commandormotionannotation", true))
|
||||||
public val visualdelay: UnsignedNumberOption = addOption(UnsignedNumberOption("visualdelay", GLOBAL, "visualdelay", 100))
|
public val visualdelay: UnsignedNumberOption = addOption(UnsignedNumberOption("visualdelay", GLOBAL, "visualdelay", 100))
|
||||||
|
|
||||||
// This needs to be Option<out VimDataType> so that it can work with derived option types, such as NumberOption, which
|
// This needs to be Option<out VimDataType> so that it can work with derived option types, such as NumberOption, which
|
||||||
|
@ -38,7 +38,7 @@ import javax.swing.KeyStroke
|
|||||||
* So, all actions are loaded on demand, including classes in classloader.
|
* So, all actions are loaded on demand, including classes in classloader.
|
||||||
*/
|
*/
|
||||||
@Deprecated(message = "Please use CommandOrMotion annotation")
|
@Deprecated(message = "Please use CommandOrMotion annotation")
|
||||||
@ScheduledForRemoval(inVersion = "2.7.0")
|
@ScheduledForRemoval(inVersion = "2.9.0")
|
||||||
internal class ActionBeanClass : BaseKeyedLazyInstance<EditorActionHandlerBase>() {
|
internal class ActionBeanClass : BaseKeyedLazyInstance<EditorActionHandlerBase>() {
|
||||||
@Attribute("implementation")
|
@Attribute("implementation")
|
||||||
var implementation: String? = null
|
var implementation: String? = null
|
||||||
|
@ -11,7 +11,10 @@ package com.maddyhome.idea.vim.newapi
|
|||||||
import com.maddyhome.idea.vim.api.VimActionsInitiator
|
import com.maddyhome.idea.vim.api.VimActionsInitiator
|
||||||
import com.maddyhome.idea.vim.handler.ActionBeanClass
|
import com.maddyhome.idea.vim.handler.ActionBeanClass
|
||||||
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase
|
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase
|
||||||
|
import org.jetbrains.annotations.ApiStatus
|
||||||
|
|
||||||
|
@Deprecated(message = "Please use CommandOrMotion annotation")
|
||||||
|
@ApiStatus.ScheduledForRemoval(inVersion = "2.9.0")
|
||||||
internal class IjVimActionsInitiator(val bean: ActionBeanClass) : VimActionsInitiator {
|
internal class IjVimActionsInitiator(val bean: ActionBeanClass) : VimActionsInitiator {
|
||||||
override fun getInstance(): EditorActionHandlerBase = bean.instance
|
override fun getInstance(): EditorActionHandlerBase = bean.instance
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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.action
|
||||||
|
|
||||||
|
import com.intellij.vim.processors.CommandOrMotionProcessor
|
||||||
|
import com.maddyhome.idea.vim.action.change.LazyVimCommand
|
||||||
|
import com.maddyhome.idea.vim.api.injector
|
||||||
|
import com.maddyhome.idea.vim.command.MappingMode
|
||||||
|
import kotlinx.serialization.ExperimentalSerializationApi
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import kotlinx.serialization.json.decodeFromStream
|
||||||
|
import java.io.InputStream
|
||||||
|
|
||||||
|
public interface CommandProvider {
|
||||||
|
public val exCommandListFileName: String
|
||||||
|
|
||||||
|
@OptIn(ExperimentalSerializationApi::class)
|
||||||
|
public fun getCommands(): Collection<LazyVimCommand> {
|
||||||
|
val classLoader = this.javaClass.classLoader
|
||||||
|
val commands: List<CommandOrMotionProcessor.CommandBean> = Json.decodeFromStream(getFile())
|
||||||
|
return commands
|
||||||
|
.groupBy { it.`class` }
|
||||||
|
.map {
|
||||||
|
val keys = it.value.map { bean -> injector.parser.parseKeys(bean.keys) }.toSet()
|
||||||
|
val modes = it.value.first().modes.map { mode -> MappingMode.parseModeChar(mode) }.toSet()
|
||||||
|
LazyVimCommand(
|
||||||
|
keys,
|
||||||
|
modes,
|
||||||
|
it.key,
|
||||||
|
classLoader
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getFile(): InputStream {
|
||||||
|
return object {}.javaClass.classLoader.getResourceAsStream(exCommandListFileName)
|
||||||
|
?: throw RuntimeException("Failed to fetch ex commands from ${javaClass.name}")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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.action
|
||||||
|
|
||||||
|
public object EngineCommandProvider : CommandProvider {
|
||||||
|
override val exCommandListFileName: String = "engine_commands.json"
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* 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.action.change
|
||||||
|
|
||||||
|
import com.maddyhome.idea.vim.command.MappingMode
|
||||||
|
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase
|
||||||
|
import com.maddyhome.idea.vim.vimscript.model.LazyInstance
|
||||||
|
import javax.swing.KeyStroke
|
||||||
|
|
||||||
|
public class LazyVimCommand(
|
||||||
|
public val keys: Set<List<KeyStroke>>,
|
||||||
|
public val modes: Set<MappingMode>,
|
||||||
|
className: String,
|
||||||
|
classLoader: ClassLoader,
|
||||||
|
) : LazyInstance<EditorActionHandlerBase>(className, classLoader) {
|
||||||
|
public val actionId: String = EditorActionHandlerBase.getActionId(className)
|
||||||
|
}
|
@ -7,6 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.maddyhome.idea.vim.command
|
package com.maddyhome.idea.vim.command
|
||||||
|
|
||||||
|
import com.maddyhome.idea.vim.ex.ExException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,5 +72,18 @@ public enum class MappingMode {
|
|||||||
public val NVO: EnumSet<MappingMode> = EnumSet.of(NORMAL, VISUAL, OP_PENDING, SELECT)
|
public val NVO: EnumSet<MappingMode> = EnumSet.of(NORMAL, VISUAL, OP_PENDING, SELECT)
|
||||||
public val INV: EnumSet<MappingMode> = EnumSet.of(INSERT, NORMAL, VISUAL, SELECT)
|
public val INV: EnumSet<MappingMode> = EnumSet.of(INSERT, NORMAL, VISUAL, SELECT)
|
||||||
public val ALL: EnumSet<MappingMode> = EnumSet.allOf(MappingMode::class.java)
|
public val ALL: EnumSet<MappingMode> = EnumSet.allOf(MappingMode::class.java)
|
||||||
|
|
||||||
|
// This method is used only for single modes, not groups of them (V is not supported)
|
||||||
|
internal fun parseModeChar(char: Char): MappingMode {
|
||||||
|
return when (char.uppercaseChar()) {
|
||||||
|
'N' -> NORMAL
|
||||||
|
'X' -> VISUAL
|
||||||
|
'S' -> SELECT
|
||||||
|
'O' -> OP_PENDING
|
||||||
|
'I' -> INSERT
|
||||||
|
'C' -> CMD_LINE
|
||||||
|
else -> throw ExException("Unexpected mode for char $char")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user