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

Specify which commands perform mode change

We need this for undo subsystem. Mode change is not something that we want to be a separate entity in the undo log

P.S. It's not a full list of such commands, e.g. <ESC> for leaving insert mode is missing. It is because <ESC> may insert some text after visual block mode, I'll figure out a solution for this later
This commit is contained in:
filipp 2024-11-22 13:27:11 +02:00 committed by Alex Pláte
parent eae3fb3ebe
commit cccb23d9ee
13 changed files with 21 additions and 12 deletions

View File

@ -14,14 +14,18 @@ import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.OperatorArguments
import com.maddyhome.idea.vim.handler.VimActionHandler
import com.maddyhome.idea.vim.helper.enumSetOf
import com.maddyhome.idea.vim.undo.VimKeyBasedUndoService
import com.maddyhome.idea.vim.undo.VimTimestampBasedUndoService
import java.util.EnumSet
@CommandOrMotion(keys = ["<C-G>u"], modes = [Mode.INSERT])
class BreakUndoSequenceAction : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_UNDO_AWARE)
override fun execute(
editor: VimEditor,

View File

@ -19,7 +19,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
@CommandOrMotion(keys = ["a"], modes = [Mode.NORMAL])
class InsertAfterCursorAction : ChangeEditorActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.INSERT
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(
editor: VimEditor,

View File

@ -19,7 +19,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
@CommandOrMotion(keys = ["A"], modes = [Mode.NORMAL])
class InsertAfterLineEndAction : ChangeEditorActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.INSERT
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(
editor: VimEditor,

View File

@ -21,7 +21,7 @@ import org.jetbrains.annotations.Contract
@CommandOrMotion(keys = ["i", "<Insert>"], modes = [Mode.NORMAL])
class InsertBeforeCursorAction : ChangeEditorActionHandler.SingleExecution() {
@get:Contract(pure = true)
override val type: Command.Type = Command.Type.INSERT
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(
editor: VimEditor,

View File

@ -19,7 +19,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
@CommandOrMotion(keys = ["I"], modes = [Mode.NORMAL])
class InsertBeforeFirstNonBlankAction : ChangeEditorActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.INSERT
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(
editor: VimEditor,

View File

@ -22,7 +22,7 @@ import java.util.*
@CommandOrMotion(keys = [":"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
class ExEntryAction : VimActionHandler.SingleExecution() {
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_START_EX)
override val type: Command.Type = Command.Type.OTHER_READONLY
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean {
if (editor.isOneLineMode()) return false

View File

@ -25,7 +25,7 @@ import java.util.*
@CommandOrMotion(keys = ["<Esc>", "<C-[>", "<C-C>"], modes = [Mode.CMD_LINE])
class LeaveCommandLineAction : VimActionHandler.SingleExecution() {
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_END_EX)
override val type: Command.Type = Command.Type.OTHER_READONLY
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean {
val argument = cmd.argument as? Argument.ExString ?: return true

View File

@ -14,12 +14,16 @@ import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.OperatorArguments
import com.maddyhome.idea.vim.handler.VimActionHandler
import com.maddyhome.idea.vim.helper.enumSetOf
import java.util.EnumSet
@CommandOrMotion(keys = ["<Insert>"], modes = [Mode.CMD_LINE])
class ToggleInsertModeAction : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_UNDO_AWARE)
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean {
val commandLine = injector.commandLine.getActiveCommandLine() ?: return false

View File

@ -21,7 +21,7 @@ import java.util.*
@CommandOrMotion(keys = ["/"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
class SearchEntryFwdAction : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
override val type: Command.Type = Command.Type.MODE_CHANGE
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_START_EX, CommandFlags.FLAG_SAVE_JUMP)
override fun execute( editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean {
@ -32,7 +32,7 @@ class SearchEntryFwdAction : VimActionHandler.SingleExecution() {
@CommandOrMotion(keys = ["?"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
class SearchEntryRevAction : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
override val type: Command.Type = Command.Type.MODE_CHANGE
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_START_EX, CommandFlags.FLAG_SAVE_JUMP)
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean {

View File

@ -25,7 +25,7 @@ import com.maddyhome.idea.vim.helper.exitVisualMode
*/
@CommandOrMotion(keys = ["<Esc>", "<C-[>", "<C-C>"], modes = [Mode.VISUAL])
class VisualExitModeAction : VimActionHandler.ConditionalMulticaret() {
override val type: Command.Type = Command.Type.OTHER_READONLY
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun runAsMulticaret(
editor: VimEditor,
context: ExecutionContext,

View File

@ -21,7 +21,7 @@ import com.maddyhome.idea.vim.options.OptionConstants
@CommandOrMotion(keys = ["<C-q>", "<C-v>"], modes = [Mode.NORMAL, Mode.VISUAL])
class VisualToggleBlockModeAction : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_READONLY
override val type: Command.Type = Command.Type.MODE_CHANGE
override fun execute(
editor: VimEditor,

View File

@ -93,11 +93,12 @@ data class Command(
*/
OTHER_SELF_SYNCHRONIZED,
MODE_CHANGE,
;
val isRead: Boolean
get() = when (this) {
MOTION, COPY, OTHER_READONLY -> true
MOTION, COPY, OTHER_READONLY, MODE_CHANGE -> true
else -> false
}

View File

@ -146,7 +146,7 @@ abstract class EditorActionHandlerBase(private val myRunForEachCaret: Boolean) {
if (editor.mode == Mode.INSERT) return // typing handles undo on its own
if (command.flags.contains(CommandFlags.FLAG_UNDO_AWARE)) return
if (command.type == Command.Type.MOTION) {
if (command.type == Command.Type.MOTION || command.type == Command.Type.MODE_CHANGE) {
undo.setMergeUndoKey()
} else {
undo.updateNonMergeUndoKey()