mirror of
				https://github.com/chylex/IntelliJ-IdeaVim.git
				synced 2025-10-31 20:17:13 +01:00 
			
		
		
		
	Compare commits
	
		
			79 Commits
		
	
	
		
			9dbe3c3363
			...
			1791692d92
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 1791692d92 | ||
|   | ba23c9ab5e | ||
|   | f96ab37bcb | ||
|   | 0da34bbb34 | ||
|   | 51e7c745ea | ||
|   | 8347251572 | ||
|   | ce8512f4e0 | ||
|   | a724a19d00 | ||
|   | 7eae7a98e8 | ||
|   | fe9566eebd | ||
|   | b69756730f | ||
|   | 6cd1a60b53 | ||
|   | 9d935e47b5 | ||
|   | a7d5372d06 | ||
|   | a575942c81 | ||
|   | 3cf6c53a8e | ||
|   | 91d86680de | ||
|   | d1d082fb99 | ||
|   | 2c634d1bf0 | ||
|   | 02a6fe4dc9 | ||
|   | 223d681526 | ||
|   | f42ef1c2fc | ||
|   | f4817b2111 | ||
|   | 6f5def0abf | ||
|   | f0fcd7f133 | ||
|   | 6115adb72e | ||
|   | bfd0b5fd91 | ||
|   | 6c0a52155b | ||
|   | c7ebce39bf | ||
|   | a0dc7a792f | ||
|   | fdb09a8f1f | ||
|   | 4ac2aa2339 | ||
|   | ebbc20692a | ||
|   | 5c82d112c9 | ||
|   | 40fd50d7f1 | ||
|   | f7b948fee2 | ||
|   | 6cdcf133bb | ||
|   | f3025757b6 | ||
|   | a49811a3f9 | ||
|   | 2ac4b265d1 | ||
|   | 46e994b563 | ||
|   | 81482bd298 | ||
|   | f1a239c085 | ||
|   | a48e38de7b | ||
|   | 0aaacee117 | ||
|   | b8373af69f | ||
|   | e99b2ee73d | ||
|   | 705022331a | ||
|   | bf62d444bf | ||
|   | 5dcff5657b | ||
|   | 7e79d5a960 | ||
|   | c1b480976d | ||
|   | ddabbe6891 | ||
|   | ffa3052b50 | ||
|   | 654ea88851 | ||
|   | 4dc7982baa | ||
|   | ae2fc1cd85 | ||
|   | 78bc8666e6 | ||
|   | 9c2de2cfc7 | ||
|   | 71e81465f3 | ||
|   | 885031e086 | ||
|   | d77c5bb5cf | ||
|   | 781bce0000 | ||
|   | a3ca1b965b | ||
|   | dd20b480a7 | ||
|   | 38292e97af | ||
|   | 46ea752164 | ||
|   | 194b744361 | ||
| b50197f7ce | |||
|   | c00703d1d0 | ||
|   | 6e12377116 | ||
|   | b0c4391ad8 | ||
|   | f43ac2538a | ||
|   | 9eaf8b5d2d | ||
|   | e365d0b07c | ||
|   | 69c273c4a5 | ||
|   | f7950e7adb | ||
|   | 7c1ae9812e | ||
|   | 5c794ac40e | 
							
								
								
									
										10
									
								
								.teamcity/_Self/Constants.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.teamcity/_Self/Constants.kt
									
									
									
									
										vendored
									
									
								
							| @@ -13,7 +13,11 @@ object Constants { | |||||||
|   const val PROPERTY_TESTS = "LATEST-EAP-SNAPSHOT" |   const val PROPERTY_TESTS = "LATEST-EAP-SNAPSHOT" | ||||||
|   const val LONG_RUNNING_TESTS = "LATEST-EAP-SNAPSHOT" |   const val LONG_RUNNING_TESTS = "LATEST-EAP-SNAPSHOT" | ||||||
|   const val QODANA_TESTS = "LATEST-EAP-SNAPSHOT" |   const val QODANA_TESTS = "LATEST-EAP-SNAPSHOT" | ||||||
|   const val RELEASE = "2021.3" |   const val RELEASE = "2022.1.3" | ||||||
|   const val RELEASE_DEV = "LATEST-EAP-SNAPSHOT" |  | ||||||
|   const val RELEASE_EAP = "LATEST-EAP-SNAPSHOT" |  | ||||||
|  |   // Use LATEST-EAP-SNAPSHOT only when we'll update the minimum version of IJ to 222+ | ||||||
|  |   // Because of some API inconcistincies, IdeaVim built on 2022+ won't run on older versions of IJ | ||||||
|  |   const val RELEASE_DEV = "2022.1.3" | ||||||
|  |   const val RELEASE_EAP = "2022.1.3" | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								.teamcity/patches/buildTypes/Build.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								.teamcity/patches/buildTypes/Build.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | package patches.buildTypes | ||||||
|  |  | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.golang | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | This patch script was generated by TeamCity on settings change in UI. | ||||||
|  | To apply the patch, create a buildType with id = 'Build' | ||||||
|  | in the root project, and delete the patch script. | ||||||
|  | */ | ||||||
|  | create(DslContext.projectId, BuildType({ | ||||||
|  |     id("Build") | ||||||
|  |     name = "IdeaVim compatibility with external plugins" | ||||||
|  |  | ||||||
|  |     vcs { | ||||||
|  |         root(DslContext.settingsRoot) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     steps { | ||||||
|  |         script { | ||||||
|  |             name = "Check" | ||||||
|  |             scriptContent = """ | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}org.jetbrains.IdeaVim-EasyMotion' [latest-IU] -team-city | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}io.github.mishkun.ideavimsneak' [latest-IU] -team-city | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}eu.theblob42.idea.whichkey' [latest-IU] -team-city | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}IdeaVimExtension' [latest-IU] -team-city | ||||||
|  |                 # Outdated java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}github.zgqq.intellij-enhance' [latest-IU] -team-city | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.github.copilot' [latest-IU] -team-city | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.github.dankinsoid.multicursor' [latest-IU] -team-city | ||||||
|  |                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.joshestein.ideavim-quickscope' [latest-IU] -team-city | ||||||
|  |             """.trimIndent() | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     triggers { | ||||||
|  |         schedule { | ||||||
|  |             schedulingPolicy = daily { | ||||||
|  |                 hour = 4 | ||||||
|  |             } | ||||||
|  |             branchFilter = "" | ||||||
|  |             triggerBuild = always() | ||||||
|  |             withPendingChangesOnly = false | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     features { | ||||||
|  |         golang { | ||||||
|  |             testFormat = "json" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | })) | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								.teamcity/patches/buildTypes/Qodana.kts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.teamcity/patches/buildTypes/Qodana.kts
									
									
									
									
										vendored
									
									
								
							| @@ -16,17 +16,12 @@ changeBuildType(RelativeId("Qodana")) { | |||||||
|     expectSteps { |     expectSteps { | ||||||
|         qodana { |         qodana { | ||||||
|             name = "Qodana" |             name = "Qodana" | ||||||
|             reportAsTests = true |  | ||||||
|             inspectionProfile = customProfile { |  | ||||||
|                 path = ".idea/inspectionProfiles/Qodana.xml" |  | ||||||
|             } |  | ||||||
|             param("clonefinder-enable", "true") |             param("clonefinder-enable", "true") | ||||||
|             param("clonefinder-languages", "Java") |             param("clonefinder-languages", "Java") | ||||||
|             param("clonefinder-languages-container", "Java Kotlin") |             param("clonefinder-languages-container", "Java Kotlin") | ||||||
|             param("clonefinder-mode", "") |             param("clonefinder-mode", "") | ||||||
|             param("clonefinder-queried-project", "src") |             param("clonefinder-queried-project", "src") | ||||||
|             param("clonefinder-reference-projects", "src") |             param("clonefinder-reference-projects", "src") | ||||||
|             param("fail-build-on-errors", "") |  | ||||||
|             param("licenseaudit-enable", "true") |             param("licenseaudit-enable", "true") | ||||||
|             param("namesAndTagsCustom", "repo.labs.intellij.net/static-analyser/qodana") |             param("namesAndTagsCustom", "repo.labs.intellij.net/static-analyser/qodana") | ||||||
|             param("report-version", "") |             param("report-version", "") | ||||||
|   | |||||||
							
								
								
									
										74
									
								
								.teamcity/patches/projects/_Self.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								.teamcity/patches/projects/_Self.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | package patches.projects | ||||||
|  |  | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.AmazonEC2CloudImage | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.AmazonEC2CloudProfile | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.Project | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.amazonEC2CloudImage | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.amazonEC2CloudProfile | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | This patch script was generated by TeamCity on settings change in UI. | ||||||
|  | To apply the patch, change the root project | ||||||
|  | accordingly, and delete the patch script. | ||||||
|  | */ | ||||||
|  | changeProject(DslContext.projectId) { | ||||||
|  |     features { | ||||||
|  |         val feature1 = find<AmazonEC2CloudImage> { | ||||||
|  |             amazonEC2CloudImage { | ||||||
|  |                 id = "PROJECT_EXT_768" | ||||||
|  |                 profileId = "amazon-48" | ||||||
|  |                 agentPoolId = "41" | ||||||
|  |                 name = "BuildAgentsIdeaVim" | ||||||
|  |                 vpcSubnetId = "subnet-58839511" | ||||||
|  |                 keyPairName = "" | ||||||
|  |                 instanceType = "c5d.xlarge" | ||||||
|  |                 securityGroups = listOf("sg-eda08696", "sg-7332cf0f") | ||||||
|  |                 useSpotInstances = true | ||||||
|  |                 instanceTags = mapOf( | ||||||
|  |                     "project" to "idea-vim" | ||||||
|  |                 ) | ||||||
|  |                 source = Source("ami-0d1a6a32faa92923e") | ||||||
|  |                 param("image-instances-limit", "") | ||||||
|  |                 param("spot-instance-price", "") | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         feature1.apply { | ||||||
|  |             profileId = "amazon-48" | ||||||
|  |             agentPoolId = "41" | ||||||
|  |             name = "BuildAgentsIdeaVim" | ||||||
|  |             vpcSubnetId = "subnet-58839511" | ||||||
|  |             keyPairName = "" | ||||||
|  |             instanceType = "c5d.xlarge" | ||||||
|  |             securityGroups = listOf("sg-eda08696", "sg-7332cf0f") | ||||||
|  |             useSpotInstances = true | ||||||
|  |             instanceTags = mapOf( | ||||||
|  |                 "project" to "idea-vim" | ||||||
|  |             ) | ||||||
|  |             source = Source("ami-0fa17ce8238eb8868") | ||||||
|  |         } | ||||||
|  |         val feature2 = find<AmazonEC2CloudProfile> { | ||||||
|  |             amazonEC2CloudProfile { | ||||||
|  |                 id = "amazon-48" | ||||||
|  |                 name = "Cloud Agents - Single Build" | ||||||
|  |                 terminateAfterBuild = true | ||||||
|  |                 terminateIdleMinutes = 15 | ||||||
|  |                 region = AmazonEC2CloudProfile.Regions.EU_WEST_DUBLIN | ||||||
|  |                 maxInstancesCount = 10 | ||||||
|  |                 authType = accessKey { | ||||||
|  |                     keyId = "credentialsJSON:dbcdb2a2-de5f-4bc9-9421-292b19e83947" | ||||||
|  |                     secretKey = "credentialsJSON:65a87fe7-0977-4af9-96f1-344f2b82d269" | ||||||
|  |                 } | ||||||
|  |                 param("agentPushPreset", "") | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         feature2.apply { | ||||||
|  |             name = "Cloud Agents - Single Build" | ||||||
|  |             terminateAfterBuild = true | ||||||
|  |             terminateIdleMinutes = 15 | ||||||
|  |             region = AmazonEC2CloudProfile.Regions.EU_WEST_DUBLIN | ||||||
|  |             maxInstancesCount = 10 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								.teamcity/patches/vcsRoots/HttpsGithubComAlexPl292IdeaVimCompatibilityRefsHeadsMaster.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								.teamcity/patches/vcsRoots/HttpsGithubComAlexPl292IdeaVimCompatibilityRefsHeadsMaster.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | package patches.vcsRoots | ||||||
|  |  | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | This patch script was generated by TeamCity on settings change in UI. | ||||||
|  | To apply the patch, create a vcsRoot with id = 'HttpsGithubComAlexPl292IdeaVimCompatibilityRefsHeadsMaster' | ||||||
|  | in the root project, and delete the patch script. | ||||||
|  | */ | ||||||
|  | create(DslContext.projectId, GitVcsRoot({ | ||||||
|  |     id("HttpsGithubComAlexPl292IdeaVimCompatibilityRefsHeadsMaster") | ||||||
|  |     name = "https://github.com/AlexPl292/IdeaVimCompatibility#refs/heads/master" | ||||||
|  |     url = "https://github.com/AlexPl292/IdeaVimCompatibility" | ||||||
|  |     branch = "refs/heads/master" | ||||||
|  |     branchSpec = "refs/heads/*" | ||||||
|  |     authMethod = password { | ||||||
|  |         userName = "AlexPl292" | ||||||
|  |         password = "credentialsJSON:43afd6e5-6ad5-4d12-a218-cf1547717a7f" | ||||||
|  |     } | ||||||
|  |     param("oauthProviderId", "PROJECT_EXT_1") | ||||||
|  |     param("useAlternates", "true") | ||||||
|  | })) | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								.teamcity/patches/vcsRoots/IdeaVimCompatibility.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.teamcity/patches/vcsRoots/IdeaVimCompatibility.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | package patches.vcsRoots | ||||||
|  |  | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||||
|  | import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | This patch script was generated by TeamCity on settings change in UI. | ||||||
|  | To apply the patch, create a vcsRoot with id = 'IdeaVimCompatibility' | ||||||
|  | in the root project, and delete the patch script. | ||||||
|  | */ | ||||||
|  | create(DslContext.projectId, GitVcsRoot({ | ||||||
|  |     id("IdeaVimCompatibility") | ||||||
|  |     name = "IdeaVimCompatibility" | ||||||
|  |     url = "git@github.com:AlexPl292/IdeaVimCompatibility.git" | ||||||
|  |     branch = "refs/heads/master" | ||||||
|  |     authMethod = uploadedKey { | ||||||
|  |         userName = "git" | ||||||
|  |         uploadedKey = "Alex Plate TeamCity key" | ||||||
|  |     } | ||||||
|  |     param("useAlternates", "true") | ||||||
|  | })) | ||||||
|  |  | ||||||
| @@ -55,6 +55,8 @@ usual beta standards. | |||||||
| * [VIM-696](https://youtrack.jetbrains.com/issue/VIM-696/vim-selection-issue-after-undo) Fix selection after undo | * [VIM-696](https://youtrack.jetbrains.com/issue/VIM-696/vim-selection-issue-after-undo) Fix selection after undo | ||||||
| * [VIM-744](https://youtrack.jetbrains.com/issue/VIM-744/Use-undoredo-with-count-modifier) Add count to undo/redo | * [VIM-744](https://youtrack.jetbrains.com/issue/VIM-744/Use-undoredo-with-count-modifier) Add count to undo/redo | ||||||
| * [VIM-1862](https://youtrack.jetbrains.com/issue/VIM-1862/Ex-commands-executed-in-keymaps-and-macros-are-added-to-the-command-history) Fix command history | * [VIM-1862](https://youtrack.jetbrains.com/issue/VIM-1862/Ex-commands-executed-in-keymaps-and-macros-are-added-to-the-command-history) Fix command history | ||||||
|  | * [VIM-2227](https://youtrack.jetbrains.com/issue/VIM-2227) Wrong behavior when deleting / changing surround with invalid character | ||||||
|  | * [VIM-2691](https://youtrack.jetbrains.com/issue/VIM-2691) Save file on :w | ||||||
|  |  | ||||||
| ### Merged PRs: | ### Merged PRs: | ||||||
| * [468](https://github.com/JetBrains/ideavim/pull/468) by [Thomas Schouten](https://github.com/PHPirates): Implement UserDataHolder for EditorDataContext | * [468](https://github.com/JetBrains/ideavim/pull/468) by [Thomas Schouten](https://github.com/PHPirates): Implement UserDataHolder for EditorDataContext | ||||||
| @@ -63,6 +65,7 @@ usual beta standards. | |||||||
| * [493](https://github.com/JetBrains/ideavim/pull/493) by [Matt Ellis](https://github.com/citizenmatt): Improvements to Commentary extension | * [493](https://github.com/JetBrains/ideavim/pull/493) by [Matt Ellis](https://github.com/citizenmatt): Improvements to Commentary extension | ||||||
| * [494](https://github.com/JetBrains/ideavim/pull/494) by [Matt Ellis](https://github.com/citizenmatt): Cleanup pre-212 CaretVisualAttributes compatibility code | * [494](https://github.com/JetBrains/ideavim/pull/494) by [Matt Ellis](https://github.com/citizenmatt): Cleanup pre-212 CaretVisualAttributes compatibility code | ||||||
| * [504](https://github.com/JetBrains/ideavim/pull/504) by [Matt Ellis](https://github.com/citizenmatt): Minor bug fixes | * [504](https://github.com/JetBrains/ideavim/pull/504) by [Matt Ellis](https://github.com/citizenmatt): Minor bug fixes | ||||||
|  | * [519](https://github.com/JetBrains/ideavim/pull/519) by [chylex](https://github.com/chylex): Fix(VIM-2227): Wrong behavior when deleting / changing surround with invalid character | ||||||
|  |  | ||||||
| ## 1.10.0, 2022-02-17 | ## 1.10.0, 2022-02-17 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ plugins { | |||||||
|     java |     java | ||||||
|     kotlin("jvm") version "1.6.21" |     kotlin("jvm") version "1.6.21" | ||||||
|  |  | ||||||
|     id("org.jetbrains.intellij") version "1.6.0" |     id("org.jetbrains.intellij") version "1.7.0-SNAPSHOT" | ||||||
|     id("org.jetbrains.changelog") version "1.3.1" |     id("org.jetbrains.changelog") version "1.3.1" | ||||||
|  |  | ||||||
|     // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle |     // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle | ||||||
| @@ -70,7 +70,7 @@ dependencies { | |||||||
|     runtimeOnly("org.antlr:antlr4-runtime:$antlrVersion") |     runtimeOnly("org.antlr:antlr4-runtime:$antlrVersion") | ||||||
|     antlr("org.antlr:antlr4:$antlrVersion") |     antlr("org.antlr:antlr4:$antlrVersion") | ||||||
|  |  | ||||||
|     implementation(project(":vim-engine")) |     api(project(":vim-engine")) | ||||||
| } | } | ||||||
|  |  | ||||||
| configurations { | configurations { | ||||||
| @@ -145,6 +145,7 @@ tasks { | |||||||
|         kotlinOptions { |         kotlinOptions { | ||||||
|             jvmTarget = javaVersion |             jvmTarget = javaVersion | ||||||
|             apiVersion = "1.5" |             apiVersion = "1.5" | ||||||
|  |             freeCompilerArgs = listOf("-Xjvm-default=all-compatibility") | ||||||
| //            allWarningsAsErrors = true | //            allWarningsAsErrors = true | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -211,6 +212,25 @@ tasks { | |||||||
|     named("compileKotlin") { |     named("compileKotlin") { | ||||||
|         dependsOn("generateGrammarSource") |         dependsOn("generateGrammarSource") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Add plugin open API sources to the plugin ZIP | ||||||
|  |     val createOpenApiSourceJar by registering(Jar::class) { | ||||||
|  |         // Java sources | ||||||
|  |         from(sourceSets.main.get().java) { | ||||||
|  |             include("**/com/maddyhome/idea/vim/**/*.java") | ||||||
|  |         } | ||||||
|  |         // Kotlin sources | ||||||
|  |         from(kotlin.sourceSets.main.get().kotlin) { | ||||||
|  |             include("**/com/maddyhome/idea/vim/**/*.kt") | ||||||
|  |         } | ||||||
|  |         destinationDirectory.set(layout.buildDirectory.dir("libs")) | ||||||
|  |         archiveClassifier.set("src") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     buildPlugin { | ||||||
|  |         dependsOn(createOpenApiSourceJar) | ||||||
|  |         from(createOpenApiSourceJar) { into("lib/src") } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| // --- Linting | // --- Linting | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								qodana.yaml
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								qodana.yaml
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | |||||||
| version: 1.0 | version: 1.0 | ||||||
| profile: | profile: | ||||||
|   name: Qodana |   name: Qodana | ||||||
|  | include: | ||||||
|  |   - name: CheckDependencyLicenses | ||||||
| exclude: | exclude: | ||||||
|   - name: MoveVariableDeclarationIntoWhen |   - name: MoveVariableDeclarationIntoWhen | ||||||
|   - name: PluginXmlValidity |   - name: PluginXmlValidity | ||||||
| @@ -9,12 +11,15 @@ exclude: | |||||||
|   - name: UnusedReturnValue |   - name: UnusedReturnValue | ||||||
|   - name: All |   - name: All | ||||||
|     paths: |     paths: | ||||||
|       - build.gradle |       - build.gradle.kts | ||||||
|       - gradle/wrapper/gradle-wrapper.properties |       - gradle/wrapper/gradle-wrapper.properties | ||||||
|       - resources/icons/youtrack.svg |       - src/main/resources/icons/youtrack.svg | ||||||
|       - src/com/maddyhome/idea/vim/ex/vimscript/VimScriptCommandHandler.java |       - src/main/java/com/maddyhome/idea/vim/helper/SearchHelper.java | ||||||
|       - src/com/maddyhome/idea/vim/helper/SearchHelper.java |       - src/main/java/com/maddyhome/idea/vim/regexp/RegExp.kt | ||||||
|       - src/com/maddyhome/idea/vim/regexp/RegExp.java |       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt | ||||||
|       - test/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt |       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/LoremText.kt | ||||||
|       - test/org/jetbrains/plugins/ideavim/propertybased/samples/LoremText.kt |       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/SimpleText.kt | ||||||
|       - test/org/jetbrains/plugins/ideavim/propertybased/samples/SimpleText.kt |       - src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptListener.java | ||||||
|  |       - src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptLexer.java | ||||||
|  |       - src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptParser.java | ||||||
|  |       - src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptVisitor.java | ||||||
| @@ -1,3 +1,13 @@ | |||||||
|  | // Set repository for snapshot versions of gradle plugin | ||||||
|  | pluginManagement { | ||||||
|  |   repositories { | ||||||
|  |     maven { | ||||||
|  |       url 'https://oss.sonatype.org/content/repositories/snapshots/' | ||||||
|  |     } | ||||||
|  |     gradlePluginPortal() | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| rootProject.name = 'IdeaVIM' | rootProject.name = 'IdeaVIM' | ||||||
| include 'vim-engine' | include 'vim-engine' | ||||||
|  |  | ||||||
|   | |||||||
| @@ -146,7 +146,7 @@ rShift: GREATER+; | |||||||
|  |  | ||||||
| letCommands: | letCommands: | ||||||
|     (WS | COLON)* range? (WS | COLON)* LET WS+ expr WS* |     (WS | COLON)* range? (WS | COLON)* LET WS+ expr WS* | ||||||
|         assignmentOperator =  (ASSIGN | PLUS_ASSIGN | MINUS_ASSIGN | STAR_ASSIGN | DIV_ASSIGN | MOD_ASSIGN | DOT_ASSIGN) |         assignmentOperator | ||||||
|         WS* expr WS* ((inline_comment NEW_LINE) | (NEW_LINE | BAR)+) |         WS* expr WS* ((inline_comment NEW_LINE) | (NEW_LINE | BAR)+) | ||||||
|     #Let1Command| |     #Let1Command| | ||||||
|  |  | ||||||
| @@ -154,6 +154,21 @@ letCommands: | |||||||
|     #Let2Command |     #Let2Command | ||||||
| ; | ; | ||||||
|  |  | ||||||
|  | assignmentOperator: | ||||||
|  |     ASSIGN | plusAssign | minusAssign | startAssign | divAssign | modAssign | dotAssign; | ||||||
|  | plusAssign: | ||||||
|  |     PLUS ASSIGN; | ||||||
|  | minusAssign: | ||||||
|  |     MINUS ASSIGN; | ||||||
|  | startAssign: | ||||||
|  |     STAR ASSIGN; | ||||||
|  | divAssign: | ||||||
|  |     DIV ASSIGN; | ||||||
|  | modAssign: | ||||||
|  |     MOD ASSIGN; | ||||||
|  | dotAssign: | ||||||
|  |     DOT ASSIGN; | ||||||
|  |  | ||||||
| shortRange: | shortRange: | ||||||
|     ((QUESTION (~QUESTION)* QUESTION?) | (DIV (~DIV)* DIV?)); |     ((QUESTION (~QUESTION)* QUESTION?) | (DIV (~DIV)* DIV?)); | ||||||
| range: | range: | ||||||
| @@ -778,12 +793,12 @@ IS_NOT_CS:              'isnot#'; | |||||||
|  |  | ||||||
| // Assignment operators | // Assignment operators | ||||||
| ASSIGN:                 '='; | ASSIGN:                 '='; | ||||||
| PLUS_ASSIGN:            '+='; | //PLUS_ASSIGN:            '+='; | ||||||
| MINUS_ASSIGN:           '-='; | //MINUS_ASSIGN:           '-='; | ||||||
| STAR_ASSIGN:            '*='; | //STAR_ASSIGN:            '*='; | ||||||
| DIV_ASSIGN:             '/='; | //DIV_ASSIGN:             '/='; | ||||||
| MOD_ASSIGN:             '%='; | //MOD_ASSIGN:             '%='; | ||||||
| DOT_ASSIGN:             '.='; | //DOT_ASSIGN:             '.='; | ||||||
|  |  | ||||||
| // Escaped chars | // Escaped chars | ||||||
| ESCAPED_QUESTION:       '\\?'; | ESCAPED_QUESTION:       '\\?'; | ||||||
|   | |||||||
| @@ -48,13 +48,13 @@ import com.maddyhome.idea.vim.group.visual.VisualMotionGroup; | |||||||
| import com.maddyhome.idea.vim.helper.MacKeyRepeat; | import com.maddyhome.idea.vim.helper.MacKeyRepeat; | ||||||
| import com.maddyhome.idea.vim.listener.VimListenerManager; | import com.maddyhome.idea.vim.listener.VimListenerManager; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimInjector; | import com.maddyhome.idea.vim.newapi.IjVimInjector; | ||||||
| import com.maddyhome.idea.vim.options.OptionService; |  | ||||||
| import com.maddyhome.idea.vim.ui.StatusBarIconFactory; | import com.maddyhome.idea.vim.ui.StatusBarIconFactory; | ||||||
| import com.maddyhome.idea.vim.ui.VimEmulationConfigurable; | import com.maddyhome.idea.vim.ui.VimEmulationConfigurable; | ||||||
| import com.maddyhome.idea.vim.ui.ex.ExEntryPanel; | import com.maddyhome.idea.vim.ui.ex.ExEntryPanel; | ||||||
| import com.maddyhome.idea.vim.vimscript.services.FunctionStorage; | import com.maddyhome.idea.vim.vimscript.services.FunctionStorage; | ||||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | ||||||
| import com.maddyhome.idea.vim.vimscript.services.VimVariableService; | import com.maddyhome.idea.vim.vimscript.services.OptionService; | ||||||
|  | import com.maddyhome.idea.vim.vimscript.services.VariableService; | ||||||
| import org.jdom.Element; | import org.jdom.Element; | ||||||
| import org.jetbrains.annotations.Nls; | import org.jetbrains.annotations.Nls; | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
| @@ -226,8 +226,8 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | |||||||
|     return (PutGroup)VimInjectorKt.getInjector().getPut(); |     return (PutGroup)VimInjectorKt.getInjector().getPut(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public static @NotNull VimVariableService getVariableService() { |   public static @NotNull VariableService getVariableService() { | ||||||
|     return ApplicationManager.getApplication().getService(VimVariableService.class); |     return ApplicationManager.getApplication().getService(VariableService.class); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public static @NotNull OptionService getOptionService() { |   public static @NotNull OptionService getOptionService() { | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ import com.maddyhome.idea.vim.group.visual.VimSelection | |||||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | import com.maddyhome.idea.vim.handler.VimActionHandler | ||||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||||
| import com.maddyhome.idea.vim.helper.MessageHelper | import com.maddyhome.idea.vim.helper.MessageHelper | ||||||
| import com.maddyhome.idea.vim.helper.commandState |  | ||||||
| import com.maddyhome.idea.vim.helper.enumSetOf | import com.maddyhome.idea.vim.helper.enumSetOf | ||||||
|  | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.ij | import com.maddyhome.idea.vim.newapi.ij | ||||||
| import java.util.* | import java.util.* | ||||||
|  |  | ||||||
| @@ -61,7 +61,7 @@ class OperatorAction : VimActionHandler.SingleExecution() { | |||||||
|  |  | ||||||
|   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { |   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||||
|     val argument = cmd.argument ?: return false |     val argument = cmd.argument ?: return false | ||||||
|     if (!editor.commandState.isDotRepeatInProgress) { |     if (!editor.vimStateMachine.isDotRepeatInProgress) { | ||||||
|       argumentCaptured = argument |       argumentCaptured = argument | ||||||
|     } |     } | ||||||
|     val range = getMotionRange(editor, context, argument, operatorArguments) |     val range = getMotionRange(editor, context, argument, operatorArguments) | ||||||
|   | |||||||
| @@ -25,14 +25,14 @@ import com.maddyhome.idea.vim.api.injector | |||||||
| import com.maddyhome.idea.vim.command.Command | import com.maddyhome.idea.vim.command.Command | ||||||
| import com.maddyhome.idea.vim.command.OperatorArguments | import com.maddyhome.idea.vim.command.OperatorArguments | ||||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | import com.maddyhome.idea.vim.handler.VimActionHandler | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.ij | import com.maddyhome.idea.vim.newapi.ij | ||||||
|  |  | ||||||
| class RepeatChangeAction : VimActionHandler.SingleExecution() { | class RepeatChangeAction : VimActionHandler.SingleExecution() { | ||||||
|   override val type: Command.Type = Command.Type.OTHER_WRITABLE |   override val type: Command.Type = Command.Type.OTHER_WRITABLE | ||||||
|  |  | ||||||
|   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { |   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||||
|     val state = editor.commandState |     val state = editor.vimStateMachine | ||||||
|     val lastCommand = VimRepeater.lastChangeCommand |     val lastCommand = VimRepeater.lastChangeCommand | ||||||
|  |  | ||||||
|     if (lastCommand == null && Extension.lastExtensionHandler == null) return false |     if (lastCommand == null && Extension.lastExtensionHandler == null) return false | ||||||
|   | |||||||
							
								
								
									
										96
									
								
								src/main/java/com/maddyhome/idea/vim/command/CommandState.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/main/java/com/maddyhome/idea/vim/command/CommandState.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package com.maddyhome.idea.vim.command | ||||||
|  |  | ||||||
|  | import com.intellij.openapi.editor.Editor | ||||||
|  | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
|  | import com.maddyhome.idea.vim.newapi.vim | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * COMPATIBILITY-LAYER: Additional class | ||||||
|  |  */ | ||||||
|  | class CommandState(private val machine: VimStateMachine) { | ||||||
|  |  | ||||||
|  |   val isOperatorPending: Boolean | ||||||
|  |     get() = machine.isOperatorPending | ||||||
|  |  | ||||||
|  |   val mode: CommandState.Mode | ||||||
|  |     get() = machine.mode.ij | ||||||
|  |  | ||||||
|  |   val commandBuilder: CommandBuilder | ||||||
|  |     get() = machine.commandBuilder | ||||||
|  |  | ||||||
|  |   val mappingState: MappingState | ||||||
|  |     get() = machine.mappingState | ||||||
|  |  | ||||||
|  |   enum class Mode { | ||||||
|  |     // Basic modes | ||||||
|  |     COMMAND, VISUAL, SELECT, INSERT, CMD_LINE, /*EX*/ | ||||||
|  |  | ||||||
|  |     // Additional modes | ||||||
|  |     OP_PENDING, REPLACE /*, VISUAL_REPLACE*/, INSERT_NORMAL, INSERT_VISUAL, INSERT_SELECT | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   enum class SubMode { | ||||||
|  |     NONE, VISUAL_CHARACTER, VISUAL_LINE, VISUAL_BLOCK | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   companion object { | ||||||
|  |     @JvmStatic | ||||||
|  |     fun getInstance(editor: Editor): CommandState { | ||||||
|  |       return CommandState(editor.vim.vimStateMachine) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | val CommandState.SubMode.engine: VimStateMachine.SubMode | ||||||
|  |   get() = when (this) { | ||||||
|  |     CommandState.SubMode.NONE -> VimStateMachine.SubMode.NONE | ||||||
|  |     CommandState.SubMode.VISUAL_CHARACTER -> VimStateMachine.SubMode.VISUAL_CHARACTER | ||||||
|  |     CommandState.SubMode.VISUAL_LINE -> VimStateMachine.SubMode.VISUAL_LINE | ||||||
|  |     CommandState.SubMode.VISUAL_BLOCK -> VimStateMachine.SubMode.VISUAL_BLOCK | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | val CommandState.Mode.engine: VimStateMachine.Mode | ||||||
|  |   get() = when (this) { | ||||||
|  |     CommandState.Mode.COMMAND -> VimStateMachine.Mode.COMMAND | ||||||
|  |     CommandState.Mode.VISUAL -> VimStateMachine.Mode.VISUAL | ||||||
|  |     CommandState.Mode.SELECT -> VimStateMachine.Mode.SELECT | ||||||
|  |     CommandState.Mode.INSERT -> VimStateMachine.Mode.INSERT | ||||||
|  |     CommandState.Mode.CMD_LINE -> VimStateMachine.Mode.CMD_LINE | ||||||
|  |     CommandState.Mode.OP_PENDING -> VimStateMachine.Mode.OP_PENDING | ||||||
|  |     CommandState.Mode.REPLACE -> VimStateMachine.Mode.REPLACE | ||||||
|  |     CommandState.Mode.INSERT_NORMAL -> VimStateMachine.Mode.INSERT_NORMAL | ||||||
|  |     CommandState.Mode.INSERT_VISUAL -> VimStateMachine.Mode.INSERT_VISUAL | ||||||
|  |     CommandState.Mode.INSERT_SELECT -> VimStateMachine.Mode.INSERT_SELECT | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | val VimStateMachine.Mode.ij: CommandState.Mode | ||||||
|  |   get() = when (this) { | ||||||
|  |     VimStateMachine.Mode.COMMAND -> CommandState.Mode.COMMAND | ||||||
|  |     VimStateMachine.Mode.VISUAL -> CommandState.Mode.VISUAL | ||||||
|  |     VimStateMachine.Mode.SELECT -> CommandState.Mode.SELECT | ||||||
|  |     VimStateMachine.Mode.INSERT -> CommandState.Mode.INSERT | ||||||
|  |     VimStateMachine.Mode.CMD_LINE -> CommandState.Mode.CMD_LINE | ||||||
|  |     VimStateMachine.Mode.OP_PENDING -> CommandState.Mode.OP_PENDING | ||||||
|  |     VimStateMachine.Mode.REPLACE -> CommandState.Mode.REPLACE | ||||||
|  |     VimStateMachine.Mode.INSERT_NORMAL -> CommandState.Mode.INSERT_NORMAL | ||||||
|  |     VimStateMachine.Mode.INSERT_VISUAL -> CommandState.Mode.INSERT_VISUAL | ||||||
|  |     VimStateMachine.Mode.INSERT_SELECT -> CommandState.Mode.INSERT_SELECT | ||||||
|  |   } | ||||||
| @@ -23,14 +23,15 @@ import com.intellij.openapi.editor.Editor | |||||||
| import com.maddyhome.idea.vim.KeyHandler | import com.maddyhome.idea.vim.KeyHandler | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.action.change.Extension | import com.maddyhome.idea.vim.action.change.Extension | ||||||
|  | import com.maddyhome.idea.vim.api.VimCaret | ||||||
|  | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
| import com.maddyhome.idea.vim.common.CommandAlias | import com.maddyhome.idea.vim.common.CommandAlias | ||||||
| import com.maddyhome.idea.vim.common.CommandAliasHandler | import com.maddyhome.idea.vim.common.CommandAliasHandler | ||||||
| import com.maddyhome.idea.vim.common.MappingMode |  | ||||||
| import com.maddyhome.idea.vim.helper.CommandLineHelper | import com.maddyhome.idea.vim.helper.CommandLineHelper | ||||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | import com.maddyhome.idea.vim.helper.EditorDataContext | ||||||
| import com.maddyhome.idea.vim.helper.TestInputModel | import com.maddyhome.idea.vim.helper.TestInputModel | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.key.MappingOwner | import com.maddyhome.idea.vim.key.MappingOwner | ||||||
| import com.maddyhome.idea.vim.key.OperatorFunction | import com.maddyhome.idea.vim.key.OperatorFunction | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| @@ -48,6 +49,21 @@ import javax.swing.KeyStroke | |||||||
| object VimExtensionFacade { | object VimExtensionFacade { | ||||||
|   /** The 'map' command for mapping keys to handlers defined in extensions. */ |   /** The 'map' command for mapping keys to handlers defined in extensions. */ | ||||||
|   @JvmStatic |   @JvmStatic | ||||||
|  |   fun putExtensionHandlerMapping( | ||||||
|  |     modes: Set<MappingMode>, | ||||||
|  |     fromKeys: List<KeyStroke>, | ||||||
|  |     pluginOwner: MappingOwner, | ||||||
|  |     extensionHandler: ExtensionHandler, | ||||||
|  |     recursive: Boolean, | ||||||
|  |   ) { | ||||||
|  |     VimPlugin.getKey().putKeyMapping(modes, fromKeys, pluginOwner, extensionHandler, recursive) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * COMPATIBILITY-LAYER: Additional method | ||||||
|  |    */ | ||||||
|  |   /** The 'map' command for mapping keys to handlers defined in extensions. */ | ||||||
|  |   @JvmStatic | ||||||
|   fun putExtensionHandlerMapping( |   fun putExtensionHandlerMapping( | ||||||
|     modes: Set<MappingMode>, |     modes: Set<MappingMode>, | ||||||
|     fromKeys: List<KeyStroke>, |     fromKeys: List<KeyStroke>, | ||||||
| @@ -129,7 +145,7 @@ object VimExtensionFacade { | |||||||
|   /** Returns a single key stroke from the user input similar to 'getchar()'. */ |   /** Returns a single key stroke from the user input similar to 'getchar()'. */ | ||||||
|   @JvmStatic |   @JvmStatic | ||||||
|   fun inputKeyStroke(editor: Editor): KeyStroke { |   fun inputKeyStroke(editor: Editor): KeyStroke { | ||||||
|     if (editor.vim.commandState.isDotRepeatInProgress) { |     if (editor.vim.vimStateMachine.isDotRepeatInProgress) { | ||||||
|       val input = Extension.consumeKeystroke() |       val input = Extension.consumeKeystroke() | ||||||
|       return input ?: error("Not enough keystrokes saved: ${Extension.lastExtensionHandler}") |       return input ?: error("Not enough keystrokes saved: ${Extension.lastExtensionHandler}") | ||||||
|     } |     } | ||||||
| @@ -137,7 +153,7 @@ object VimExtensionFacade { | |||||||
|     val key: KeyStroke? = if (ApplicationManager.getApplication().isUnitTestMode) { |     val key: KeyStroke? = if (ApplicationManager.getApplication().isUnitTestMode) { | ||||||
|       val mappingStack = KeyHandler.getInstance().keyStack |       val mappingStack = KeyHandler.getInstance().keyStack | ||||||
|       mappingStack.feedSomeStroke() ?: TestInputModel.getInstance(editor).nextKeyStroke()?.also { |       mappingStack.feedSomeStroke() ?: TestInputModel.getInstance(editor).nextKeyStroke()?.also { | ||||||
|         if (editor.vim.commandState.isRecording) { |         if (editor.vim.vimStateMachine.isRecording) { | ||||||
|           KeyHandler.getInstance().modalEntryKeys += it |           KeyHandler.getInstance().modalEntryKeys += it | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -167,12 +183,24 @@ object VimExtensionFacade { | |||||||
|     return reg.keys |     return reg.keys | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @JvmStatic | ||||||
|  |   fun getRegisterForCaret(register: Char, caret: VimCaret): List<KeyStroke>? { | ||||||
|  |     val reg = caret.registerStorage.getRegister(register) ?: return null | ||||||
|  |     return reg.keys | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** Set the current contents of the given register */ |   /** Set the current contents of the given register */ | ||||||
|   @JvmStatic |   @JvmStatic | ||||||
|   fun setRegister(register: Char, keys: List<KeyStroke?>?) { |   fun setRegister(register: Char, keys: List<KeyStroke?>?) { | ||||||
|     VimPlugin.getRegister().setKeys(register, keys?.filterNotNull() ?: emptyList()) |     VimPlugin.getRegister().setKeys(register, keys?.filterNotNull() ?: emptyList()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** Set the current contents of the given register */ | ||||||
|  |   @JvmStatic | ||||||
|  |   fun setRegisterForCaret(register: Char, caret: VimCaret, keys: List<KeyStroke?>?) { | ||||||
|  |     caret.registerStorage.setKeys(register, keys?.filterNotNull() ?: emptyList()) | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** Set the current contents of the given register */ |   /** Set the current contents of the given register */ | ||||||
|   @JvmStatic |   @JvmStatic | ||||||
|   fun setRegister(register: Char, keys: List<KeyStroke?>?, type: SelectionType) { |   fun setRegister(register: Char, keys: List<KeyStroke?>?, type: SelectionType) { | ||||||
|   | |||||||
| @@ -0,0 +1,38 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package com.maddyhome.idea.vim.extension | ||||||
|  |  | ||||||
|  | import com.intellij.openapi.actionSystem.DataContext | ||||||
|  | import com.intellij.openapi.editor.Editor | ||||||
|  | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
|  | import com.maddyhome.idea.vim.api.VimEditor | ||||||
|  | import com.maddyhome.idea.vim.newapi.ij | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * COMPATIBILITY-LAYER: Created a class, renamed original class | ||||||
|  |  */ | ||||||
|  | interface VimExtensionHandler : ExtensionHandler { | ||||||
|  |   override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|  |     execute(editor.ij, context.ij) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   fun execute(editor: Editor, context: DataContext) | ||||||
|  |  | ||||||
|  |   abstract class WithCallback : ExtensionHandler.WithCallback(), VimExtensionHandler | ||||||
|  | } | ||||||
| @@ -25,9 +25,9 @@ import com.maddyhome.idea.vim.api.VimExtensionRegistrator | |||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.ex.ExException | import com.maddyhome.idea.vim.ex.ExException | ||||||
| import com.maddyhome.idea.vim.key.MappingOwner.Plugin.Companion.remove | import com.maddyhome.idea.vim.key.MappingOwner.Plugin.Companion.remove | ||||||
|  | import com.maddyhome.idea.vim.option.ToggleOption | ||||||
| import com.maddyhome.idea.vim.options.OptionChangeListener | import com.maddyhome.idea.vim.options.OptionChangeListener | ||||||
| import com.maddyhome.idea.vim.options.OptionScope | import com.maddyhome.idea.vim.options.OptionScope | ||||||
| import com.maddyhome.idea.vim.options.ToggleOption |  | ||||||
| import com.maddyhome.idea.vim.statistic.PluginState | import com.maddyhome.idea.vim.statistic.PluginState | ||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,24 +18,21 @@ | |||||||
|  |  | ||||||
| package com.maddyhome.idea.vim.extension.argtextobj; | package com.maddyhome.idea.vim.extension.argtextobj; | ||||||
|  |  | ||||||
| import com.intellij.openapi.actionSystem.DataContext; |  | ||||||
| import com.intellij.openapi.editor.Caret; | import com.intellij.openapi.editor.Caret; | ||||||
| import com.intellij.openapi.editor.Document; | import com.intellij.openapi.editor.Document; | ||||||
| import com.intellij.openapi.editor.Editor; |  | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.api.*; | import com.maddyhome.idea.vim.api.*; | ||||||
| import com.maddyhome.idea.vim.command.*; | import com.maddyhome.idea.vim.command.*; | ||||||
| import com.maddyhome.idea.vim.common.MappingMode; | import com.maddyhome.idea.vim.command.MappingMode; | ||||||
| import com.maddyhome.idea.vim.common.TextRange; | import com.maddyhome.idea.vim.common.TextRange; | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension; | import com.maddyhome.idea.vim.extension.VimExtension; | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler; | import com.maddyhome.idea.vim.extension.ExtensionHandler; | ||||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | ||||||
| import com.maddyhome.idea.vim.helper.InlayHelperKt; | import com.maddyhome.idea.vim.helper.InlayHelperKt; | ||||||
| import com.maddyhome.idea.vim.helper.MessageHelper; | import com.maddyhome.idea.vim.helper.MessageHelper; | ||||||
| import com.maddyhome.idea.vim.helper.VimNlsSafe; | import com.maddyhome.idea.vim.helper.VimNlsSafe; | ||||||
| import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | ||||||
| import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | ||||||
| import com.maddyhome.idea.vim.newapi.IjExecutionContext; |  | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimCaret; | import com.maddyhome.idea.vim.newapi.IjVimCaret; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | ||||||
| @@ -186,7 +183,7 @@ public class VimArgTextObjExtension implements VimExtension { | |||||||
|   /** |   /** | ||||||
|    * A text object for an argument to a function definition or a call. |    * A text object for an argument to a function definition or a call. | ||||||
|    */ |    */ | ||||||
|   static class ArgumentHandler implements VimExtensionHandler { |   static class ArgumentHandler implements ExtensionHandler { | ||||||
|     final boolean isInner; |     final boolean isInner; | ||||||
|  |  | ||||||
|     ArgumentHandler(boolean isInner) { |     ArgumentHandler(boolean isInner) { | ||||||
| @@ -262,17 +259,17 @@ public class VimArgTextObjExtension implements VimExtension { | |||||||
|     public void execute(@NotNull VimEditor editor, @NotNull ExecutionContext context) { |     public void execute(@NotNull VimEditor editor, @NotNull ExecutionContext context) { | ||||||
|  |  | ||||||
|       IjVimEditor vimEditor = (IjVimEditor) editor; |       IjVimEditor vimEditor = (IjVimEditor) editor; | ||||||
|       @NotNull CommandState commandState = CommandState.getInstance(vimEditor); |       @NotNull VimStateMachine vimStateMachine = VimStateMachine.getInstance(vimEditor); | ||||||
|       int count = Math.max(1, commandState.getCommandBuilder().getCount()); |       int count = Math.max(1, vimStateMachine.getCommandBuilder().getCount()); | ||||||
|  |  | ||||||
|       final ArgumentTextObjectHandler textObjectHandler = new ArgumentTextObjectHandler(isInner); |       final ArgumentTextObjectHandler textObjectHandler = new ArgumentTextObjectHandler(isInner); | ||||||
|       //noinspection DuplicatedCode |       //noinspection DuplicatedCode | ||||||
|       if (!commandState.isOperatorPending()) { |       if (!vimStateMachine.isOperatorPending()) { | ||||||
|         vimEditor.getEditor().getCaretModel().runForEachCaret((Caret caret) -> { |         vimEditor.getEditor().getCaretModel().runForEachCaret((Caret caret) -> { | ||||||
|           final TextRange range = textObjectHandler.getRange(vimEditor, new IjVimCaret(caret), context, count, 0, null); |           final TextRange range = textObjectHandler.getRange(vimEditor, new IjVimCaret(caret), context, count, 0, null); | ||||||
|           if (range != null) { |           if (range != null) { | ||||||
|             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { |             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { | ||||||
|               if (commandState.getMode() == CommandState.Mode.VISUAL) { |               if (vimStateMachine.getMode() == VimStateMachine.Mode.VISUAL) { | ||||||
|                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); |                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||||
|               } else { |               } else { | ||||||
|                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); |                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); | ||||||
| @@ -282,7 +279,7 @@ public class VimArgTextObjExtension implements VimExtension { | |||||||
|  |  | ||||||
|         }); |         }); | ||||||
|       } else { |       } else { | ||||||
|         commandState.getCommandBuilder().completeCommandPart(new Argument(new Command(count, |         vimStateMachine.getCommandBuilder().completeCommandPart(new Argument(new Command(count, | ||||||
|                                                                                          textObjectHandler, Command.Type.MOTION, EnumSet.noneOf(CommandFlags.class)))); |                                                                                          textObjectHandler, Command.Type.MOTION, EnumSet.noneOf(CommandFlags.class)))); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -34,13 +34,14 @@ import com.maddyhome.idea.vim.api.injector | |||||||
| import com.maddyhome.idea.vim.command.Argument | import com.maddyhome.idea.vim.command.Argument | ||||||
| import com.maddyhome.idea.vim.command.Command | import com.maddyhome.idea.vim.command.Command | ||||||
| import com.maddyhome.idea.vim.command.CommandFlags | import com.maddyhome.idea.vim.command.CommandFlags | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
| import com.maddyhome.idea.vim.command.TextObjectVisualType | import com.maddyhome.idea.vim.command.TextObjectVisualType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.CommandAliasHandler | import com.maddyhome.idea.vim.common.CommandAliasHandler | ||||||
| import com.maddyhome.idea.vim.common.MappingMode |  | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
| import com.maddyhome.idea.vim.ex.ranges.Ranges | import com.maddyhome.idea.vim.ex.ranges.Ranges | ||||||
|  | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.addCommand | import com.maddyhome.idea.vim.extension.VimExtensionFacade.addCommand | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | ||||||
| @@ -48,11 +49,10 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMa | |||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMapping | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler |  | ||||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler | import com.maddyhome.idea.vim.handler.TextObjectActionHandler | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| import com.maddyhome.idea.vim.helper.PsiHelper | import com.maddyhome.idea.vim.helper.PsiHelper | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.key.OperatorFunction | import com.maddyhome.idea.vim.key.OperatorFunction | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||||
| import com.maddyhome.idea.vim.newapi.ij | import com.maddyhome.idea.vim.newapi.ij | ||||||
| @@ -63,8 +63,8 @@ class CommentaryExtension : VimExtension { | |||||||
|  |  | ||||||
|   companion object { |   companion object { | ||||||
|     fun doCommentary(editor: VimEditor, context: ExecutionContext, range: TextRange, selectionType: SelectionType, resetCaret: Boolean): Boolean { |     fun doCommentary(editor: VimEditor, context: ExecutionContext, range: TextRange, selectionType: SelectionType, resetCaret: Boolean): Boolean { | ||||||
|       val mode = editor.commandState.mode |       val mode = editor.vimStateMachine.mode | ||||||
|       if (mode !== CommandState.Mode.VISUAL) { |       if (mode !== VimStateMachine.Mode.VISUAL) { | ||||||
|         editor.ij.selectionModel.setSelection(range.startOffset, range.endOffset) |         editor.ij.selectionModel.setSelection(range.startOffset, range.endOffset) | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -82,7 +82,7 @@ class CommentaryExtension : VimExtension { | |||||||
|             injector.actionExecutor.executeAction(actions[1], context) |             injector.actionExecutor.executeAction(actions[1], context) | ||||||
|         } finally { |         } finally { | ||||||
|           // Remove the selection, if we added it |           // Remove the selection, if we added it | ||||||
|           if (mode !== CommandState.Mode.VISUAL) { |           if (mode !== VimStateMachine.Mode.VISUAL) { | ||||||
|             editor.removeSelection() |             editor.removeSelection() | ||||||
|           } |           } | ||||||
|  |  | ||||||
| @@ -129,7 +129,7 @@ class CommentaryExtension : VimExtension { | |||||||
|    * E.g. handles the `gc` in `gc_`, by setting the operator function, then invoking `g@` to receive the `_` motion to |    * E.g. handles the `gc` in `gc_`, by setting the operator function, then invoking `g@` to receive the `_` motion to | ||||||
|    * invoke the operator. This object is both the mapping handler and the operator function. |    * invoke the operator. This object is both the mapping handler and the operator function. | ||||||
|    */ |    */ | ||||||
|   private class CommentaryOperatorHandler : OperatorFunction, VimExtensionHandler { |   private class CommentaryOperatorHandler : OperatorFunction, ExtensionHandler { | ||||||
|     override val isRepeatable = true |     override val isRepeatable = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -148,11 +148,11 @@ class CommentaryExtension : VimExtension { | |||||||
|    * |    * | ||||||
|    * This object is both the `<Plug>Commentary` mapping handler and the text object handler |    * This object is both the `<Plug>Commentary` mapping handler and the text object handler | ||||||
|    */ |    */ | ||||||
|   private class CommentaryTextObjectMotionHandler : TextObjectActionHandler(), VimExtensionHandler { |   private class CommentaryTextObjectMotionHandler : TextObjectActionHandler(), ExtensionHandler { | ||||||
|     override val isRepeatable = true |     override val isRepeatable = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       val commandState = editor.commandState |       val commandState = editor.vimStateMachine | ||||||
|       val count = maxOf(1, commandState.commandBuilder.count) |       val count = maxOf(1, commandState.commandBuilder.count) | ||||||
|  |  | ||||||
|       val textObjectHandler = this |       val textObjectHandler = this | ||||||
|   | |||||||
| @@ -31,10 +31,11 @@ import com.maddyhome.idea.vim.VimPlugin | |||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
|  | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.getRegister | import com.maddyhome.idea.vim.extension.VimExtensionFacade.getRegister | ||||||
| @@ -42,7 +43,6 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMa | |||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegister | import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegister | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler |  | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| import com.maddyhome.idea.vim.helper.fileSize | import com.maddyhome.idea.vim.helper.fileSize | ||||||
| import com.maddyhome.idea.vim.helper.moveToInlayAwareLogicalPosition | import com.maddyhome.idea.vim.helper.moveToInlayAwareLogicalPosition | ||||||
| @@ -95,7 +95,7 @@ class VimExchangeExtension : VimExtension { | |||||||
|     val EXCHANGE_KEY = Key<Exchange>("exchange") |     val EXCHANGE_KEY = Key<Exchange>("exchange") | ||||||
|  |  | ||||||
|     // End mark has always greater of eq offset than start mark |     // End mark has always greater of eq offset than start mark | ||||||
|     class Exchange(val type: CommandState.SubMode, val start: Mark, val end: Mark, val text: String) { |     class Exchange(val type: VimStateMachine.SubMode, val start: Mark, val end: Mark, val text: String) { | ||||||
|       private var myHighlighter: RangeHighlighter? = null |       private var myHighlighter: RangeHighlighter? = null | ||||||
|       fun setHighlighter(highlighter: RangeHighlighter) { |       fun setHighlighter(highlighter: RangeHighlighter) { | ||||||
|         myHighlighter = highlighter |         myHighlighter = highlighter | ||||||
| @@ -112,7 +112,7 @@ class VimExchangeExtension : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class ExchangeHandler(private val isLine: Boolean) : VimExtensionHandler { |   private class ExchangeHandler(private val isLine: Boolean) : ExtensionHandler { | ||||||
|     override val isRepeatable = true |     override val isRepeatable = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -121,13 +121,13 @@ class VimExchangeExtension : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class ExchangeClearHandler : VimExtensionHandler { |   private class ExchangeClearHandler : ExtensionHandler { | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       clearExchange(editor.ij) |       clearExchange(editor.ij) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class VExchangeHandler : VimExtensionHandler { |   private class VExchangeHandler : ExtensionHandler { | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       runWriteAction { |       runWriteAction { | ||||||
|         val subMode = editor.subMode |         val subMode = editor.subMode | ||||||
| @@ -140,10 +140,10 @@ class VimExchangeExtension : VimExtension { | |||||||
|  |  | ||||||
|   private class Operator(private val isVisual: Boolean) : OperatorFunction { |   private class Operator(private val isVisual: Boolean) : OperatorFunction { | ||||||
|     fun Editor.getMarkOffset(mark: Mark) = EditorHelper.getOffset(this, mark.logicalLine, mark.col) |     fun Editor.getMarkOffset(mark: Mark) = EditorHelper.getOffset(this, mark.logicalLine, mark.col) | ||||||
|     fun CommandState.SubMode.getString() = when (this) { |     fun VimStateMachine.SubMode.getString() = when (this) { | ||||||
|       CommandState.SubMode.VISUAL_CHARACTER -> "v" |       VimStateMachine.SubMode.VISUAL_CHARACTER -> "v" | ||||||
|       CommandState.SubMode.VISUAL_LINE -> "V" |       VimStateMachine.SubMode.VISUAL_LINE -> "V" | ||||||
|       CommandState.SubMode.VISUAL_BLOCK -> "\\<C-V>" |       VimStateMachine.SubMode.VISUAL_BLOCK -> "\\<C-V>" | ||||||
|       else -> error("Invalid SubMode: $this") |       else -> error("Invalid SubMode: $this") | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -151,7 +151,7 @@ class VimExchangeExtension : VimExtension { | |||||||
|       fun highlightExchange(ex: Exchange): RangeHighlighter { |       fun highlightExchange(ex: Exchange): RangeHighlighter { | ||||||
|         val attributes = editor.colorsScheme.getAttributes(EditorColors.TEXT_SEARCH_RESULT_ATTRIBUTES) |         val attributes = editor.colorsScheme.getAttributes(EditorColors.TEXT_SEARCH_RESULT_ATTRIBUTES) | ||||||
|         val hlArea = when (ex.type) { |         val hlArea = when (ex.type) { | ||||||
|           CommandState.SubMode.VISUAL_LINE -> HighlighterTargetArea.LINES_IN_RANGE |           VimStateMachine.SubMode.VISUAL_LINE -> HighlighterTargetArea.LINES_IN_RANGE | ||||||
|           // TODO: handle other modes |           // TODO: handle other modes | ||||||
|           else -> HighlighterTargetArea.EXACT_RANGE |           else -> HighlighterTargetArea.EXACT_RANGE | ||||||
|         } |         } | ||||||
| @@ -274,7 +274,7 @@ class VimExchangeExtension : VimExtension { | |||||||
|           x.logicalLine - y.logicalLine |           x.logicalLine - y.logicalLine | ||||||
|         } |         } | ||||||
|  |  | ||||||
|       return if (x.type == CommandState.SubMode.VISUAL_BLOCK && y.type == CommandState.SubMode.VISUAL_BLOCK) { |       return if (x.type == VimStateMachine.SubMode.VISUAL_BLOCK && y.type == VimStateMachine.SubMode.VISUAL_BLOCK) { | ||||||
|         when { |         when { | ||||||
|           intersects(x, y) -> { |           intersects(x, y) -> { | ||||||
|             ExchangeCompareResult.OVERLAP |             ExchangeCompareResult.OVERLAP | ||||||
|   | |||||||
| @@ -33,21 +33,21 @@ import com.maddyhome.idea.vim.api.injector | |||||||
| import com.maddyhome.idea.vim.command.Argument | import com.maddyhome.idea.vim.command.Argument | ||||||
| import com.maddyhome.idea.vim.command.Command | import com.maddyhome.idea.vim.command.Command | ||||||
| import com.maddyhome.idea.vim.command.CommandFlags | import com.maddyhome.idea.vim.command.CommandFlags | ||||||
|  | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.MotionType | import com.maddyhome.idea.vim.command.MotionType | ||||||
| import com.maddyhome.idea.vim.command.OperatorArguments | import com.maddyhome.idea.vim.command.OperatorArguments | ||||||
| import com.maddyhome.idea.vim.common.Direction | import com.maddyhome.idea.vim.common.Direction | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade | import com.maddyhome.idea.vim.extension.VimExtensionFacade | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler |  | ||||||
| import com.maddyhome.idea.vim.handler.Motion | import com.maddyhome.idea.vim.handler.Motion | ||||||
| import com.maddyhome.idea.vim.handler.MotionActionHandler | import com.maddyhome.idea.vim.handler.MotionActionHandler | ||||||
| import com.maddyhome.idea.vim.handler.toMotionOrError | import com.maddyhome.idea.vim.handler.toMotionOrError | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| import com.maddyhome.idea.vim.helper.PsiHelper | import com.maddyhome.idea.vim.helper.PsiHelper | ||||||
| import com.maddyhome.idea.vim.helper.commandState |  | ||||||
| import com.maddyhome.idea.vim.helper.enumSetOf | import com.maddyhome.idea.vim.helper.enumSetOf | ||||||
|  | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.ij | import com.maddyhome.idea.vim.newapi.ij | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import java.util.* | import java.util.* | ||||||
| @@ -94,14 +94,14 @@ class Matchit : VimExtension { | |||||||
|     override var motionType: MotionType = MotionType.INCLUSIVE |     override var motionType: MotionType = MotionType.INCLUSIVE | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class MatchitHandler(private val reverse: Boolean) : VimExtensionHandler { |   private class MatchitHandler(private val reverse: Boolean) : ExtensionHandler { | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       val commandState = editor.commandState |       val commandState = editor.vimStateMachine | ||||||
|       val count = commandState.commandBuilder.count |       val count = commandState.commandBuilder.count | ||||||
|  |  | ||||||
|       // Reset the command count so it doesn't transfer onto subsequent commands. |       // Reset the command count so it doesn't transfer onto subsequent commands. | ||||||
|       editor.commandState.commandBuilder.resetCount() |       editor.vimStateMachine.commandBuilder.resetCount() | ||||||
|  |  | ||||||
|       // Normally we want to jump to the start of the matching pair. But when moving forward in operator |       // Normally we want to jump to the start of the matching pair. But when moving forward in operator | ||||||
|       // pending mode, we want to include the entire match. isInOpPending makes that distinction. |       // pending mode, we want to include the entire match. isInOpPending makes that distinction. | ||||||
|   | |||||||
| @@ -29,13 +29,13 @@ import com.maddyhome.idea.vim.VimPlugin | |||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
|  | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler |  | ||||||
| import com.maddyhome.idea.vim.group.MotionGroup | import com.maddyhome.idea.vim.group.MotionGroup | ||||||
| import com.maddyhome.idea.vim.group.visual.vimSetSelection | import com.maddyhome.idea.vim.group.visual.vimSetSelection | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| @@ -111,7 +111,7 @@ class VimMultipleCursorsExtension : VimExtension { | |||||||
|     putKeyMappingIfMissing(MappingMode.X, injector.parser.parseKeys("<A-p>"), owner, injector.parser.parseKeys(REMOVE_OCCURRENCE), true) |     putKeyMappingIfMissing(MappingMode.X, injector.parser.parseKeys("<A-p>"), owner, injector.parser.parseKeys(REMOVE_OCCURRENCE), true) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   abstract class WriteActionHandler : VimExtensionHandler { |   abstract class WriteActionHandler : ExtensionHandler { | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       ApplicationManager.getApplication().runWriteAction { |       ApplicationManager.getApplication().runWriteAction { | ||||||
|         executeInWriteAction(editor.ij, context.ij) |         executeInWriteAction(editor.ij, context.ij) | ||||||
| @@ -313,7 +313,7 @@ class VimMultipleCursorsExtension : VimExtension { | |||||||
|  |  | ||||||
|   private fun enterVisualMode(editor: VimEditor) { |   private fun enterVisualMode(editor: VimEditor) { | ||||||
|     // We need to reset the key handler to make sure we pick up the fact that we're in visual mode |     // We need to reset the key handler to make sure we pick up the fact that we're in visual mode | ||||||
|     VimPlugin.getVisualMotion().enterVisualMode(editor, CommandState.SubMode.VISUAL_CHARACTER) |     VimPlugin.getVisualMotion().enterVisualMode(editor, VimStateMachine.SubMode.VISUAL_CHARACTER) | ||||||
|     KeyHandler.getInstance().reset(editor) |     KeyHandler.getInstance().reset(editor) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -44,11 +44,11 @@ import com.maddyhome.idea.vim.api.VimEditor | |||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.common.CommandAlias | import com.maddyhome.idea.vim.common.CommandAlias | ||||||
| import com.maddyhome.idea.vim.common.CommandAliasHandler | import com.maddyhome.idea.vim.common.CommandAliasHandler | ||||||
| import com.maddyhome.idea.vim.common.CommandNode | import com.maddyhome.idea.vim.key.CommandNode | ||||||
| import com.maddyhome.idea.vim.common.CommandPartNode | import com.maddyhome.idea.vim.key.CommandPartNode | ||||||
| import com.maddyhome.idea.vim.common.Node | import com.maddyhome.idea.vim.key.Node | ||||||
| import com.maddyhome.idea.vim.common.RootNode | import com.maddyhome.idea.vim.key.RootNode | ||||||
| import com.maddyhome.idea.vim.common.addLeafs | import com.maddyhome.idea.vim.key.addLeafs | ||||||
| import com.maddyhome.idea.vim.ex.ranges.Ranges | import com.maddyhome.idea.vim.ex.ranges.Ranges | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.group.KeyGroup | import com.maddyhome.idea.vim.group.KeyGroup | ||||||
|   | |||||||
| @@ -23,11 +23,11 @@ import com.intellij.openapi.editor.Editor | |||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.MappingMode | ||||||
|  | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade | import com.maddyhome.idea.vim.extension.VimExtensionFacade | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler |  | ||||||
| import com.maddyhome.idea.vim.group.MotionGroup | import com.maddyhome.idea.vim.group.MotionGroup | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| import com.maddyhome.idea.vim.helper.SearchHelper | import com.maddyhome.idea.vim.helper.SearchHelper | ||||||
| @@ -45,7 +45,7 @@ class ParagraphMotion : VimExtension { | |||||||
|     putKeyMappingIfMissing(MappingMode.NXO, injector.parser.parseKeys("{"), owner, injector.parser.parseKeys("<Plug>(ParagraphPrevMotion)"), true) |     putKeyMappingIfMissing(MappingMode.NXO, injector.parser.parseKeys("{"), owner, injector.parser.parseKeys("<Plug>(ParagraphPrevMotion)"), true) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class ParagraphMotionHandler(private val count: Int) : VimExtensionHandler { |   private class ParagraphMotionHandler(private val count: Int) : ExtensionHandler { | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       editor.ij.vimForEachCaret { caret -> |       editor.ij.vimForEachCaret { caret -> | ||||||
|         val motion = moveCaretToNextParagraph(editor.ij, caret, count) |         val motion = moveCaretToNextParagraph(editor.ij, caret, count) | ||||||
|   | |||||||
| @@ -25,17 +25,17 @@ import com.maddyhome.idea.vim.api.ExecutionContext | |||||||
| import com.maddyhome.idea.vim.api.VimCaret | import com.maddyhome.idea.vim.api.VimCaret | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.command.isLine | import com.maddyhome.idea.vim.command.isLine | ||||||
| import com.maddyhome.idea.vim.common.MappingMode |  | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
|  | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade | import com.maddyhome.idea.vim.extension.VimExtensionFacade | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler |  | ||||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | import com.maddyhome.idea.vim.group.visual.VimSelection | ||||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | import com.maddyhome.idea.vim.helper.EditorDataContext | ||||||
| import com.maddyhome.idea.vim.helper.mode | import com.maddyhome.idea.vim.helper.mode | ||||||
| @@ -63,22 +63,21 @@ class ReplaceWithRegister : VimExtension { | |||||||
|     putKeyMappingIfMissing(MappingMode.X, injector.parser.parseKeys("gr"), owner, injector.parser.parseKeys(RWR_VISUAL), true) |     putKeyMappingIfMissing(MappingMode.X, injector.parser.parseKeys("gr"), owner, injector.parser.parseKeys(RWR_VISUAL), true) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class RwrVisual : VimExtensionHandler { |   private class RwrVisual : ExtensionHandler { | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       val caretsAndSelections = mutableMapOf<VimCaret, VimSelection>() |  | ||||||
|       val typeInEditor = SelectionType.fromSubMode(editor.subMode) |       val typeInEditor = SelectionType.fromSubMode(editor.subMode) | ||||||
|       editor.forEachCaret { caret -> |       editor.forEachCaret { caret -> | ||||||
|         val selectionStart = caret.selectionStart |         val selectionStart = caret.selectionStart | ||||||
|         val selectionEnd = caret.selectionEnd |         val selectionEnd = caret.selectionEnd | ||||||
|  |  | ||||||
|         caretsAndSelections += caret to VimSelection.create(selectionStart, selectionEnd - 1, typeInEditor, editor) |         val visualSelection = caret to VimSelection.create(selectionStart, selectionEnd - 1, typeInEditor, editor) | ||||||
|  |         doReplace(editor.ij, caret, PutData.VisualSelection(mapOf(visualSelection), typeInEditor)) | ||||||
|       } |       } | ||||||
|       doReplace(editor.ij, PutData.VisualSelection(caretsAndSelections, typeInEditor)) |  | ||||||
|       editor.exitVisualModeNative() |       editor.exitVisualModeNative() | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class RwrMotion : VimExtensionHandler { |   private class RwrMotion : ExtensionHandler { | ||||||
|     override val isRepeatable: Boolean = true |     override val isRepeatable: Boolean = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -87,7 +86,7 @@ class ReplaceWithRegister : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class RwrLine : VimExtensionHandler { |   private class RwrLine : ExtensionHandler { | ||||||
|     override val isRepeatable: Boolean = true |     override val isRepeatable: Boolean = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -97,11 +96,11 @@ class ReplaceWithRegister : VimExtension { | |||||||
|         val lineStart = editor.getLineStartOffset(logicalLine) |         val lineStart = editor.getLineStartOffset(logicalLine) | ||||||
|         val lineEnd = editor.getLineEndOffset(logicalLine, true) |         val lineEnd = editor.getLineEndOffset(logicalLine, true) | ||||||
|  |  | ||||||
|         caretsAndSelections += caret to VimSelection.create(lineStart, lineEnd, SelectionType.LINE_WISE, editor) |         val visualSelection = caret to VimSelection.create(lineStart, lineEnd, SelectionType.LINE_WISE, editor) | ||||||
|       } |         caretsAndSelections += visualSelection | ||||||
|  |  | ||||||
|       val visualSelection = PutData.VisualSelection(caretsAndSelections, SelectionType.LINE_WISE) |         doReplace(editor.ij, caret, PutData.VisualSelection(mapOf(visualSelection), SelectionType.LINE_WISE)) | ||||||
|       doReplace(editor.ij, visualSelection) |       } | ||||||
|  |  | ||||||
|       editor.forEachCaret { caret -> |       editor.forEachCaret { caret -> | ||||||
|         val vimStart = caretsAndSelections[caret]?.vimStart |         val vimStart = caretsAndSelections[caret]?.vimStart | ||||||
| @@ -126,13 +125,14 @@ class ReplaceWithRegister : VimExtension { | |||||||
|         ), |         ), | ||||||
|         selectionType |         selectionType | ||||||
|       ) |       ) | ||||||
|       doReplace(editor, visualSelection) |       // todo multicaret | ||||||
|  |       doReplace(editor, editor.vim.primaryCaret(), visualSelection) | ||||||
|       return true |       return true | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private fun getRange(editor: Editor): TextRange? = when (editor.vim.mode) { |     private fun getRange(editor: Editor): TextRange? = when (editor.vim.mode) { | ||||||
|       CommandState.Mode.COMMAND -> VimPlugin.getMark().getChangeMarks(editor.vim) |       VimStateMachine.Mode.COMMAND -> VimPlugin.getMark().getChangeMarks(editor.vim) | ||||||
|       CommandState.Mode.VISUAL -> editor.caretModel.primaryCaret.run { TextRange(selectionStart, selectionEnd) } |       VimStateMachine.Mode.VISUAL -> editor.caretModel.primaryCaret.run { TextRange(selectionStart, selectionEnd) } | ||||||
|       else -> null |       else -> null | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -147,8 +147,9 @@ class ReplaceWithRegister : VimExtension { | |||||||
|     @NonNls |     @NonNls | ||||||
|     private const val RWR_VISUAL = "<Plug>ReplaceWithRegisterVisual" |     private const val RWR_VISUAL = "<Plug>ReplaceWithRegisterVisual" | ||||||
|  |  | ||||||
|     private fun doReplace(editor: Editor, visualSelection: PutData.VisualSelection) { |     private fun doReplace(editor: Editor, caret: VimCaret, visualSelection: PutData.VisualSelection) { | ||||||
|       val savedRegister = VimPlugin.getRegister().lastRegister ?: return |       val lastRegisterChar = injector.registerGroup.lastRegisterChar | ||||||
|  |       val savedRegister = caret.registerStorage.getRegister(lastRegisterChar) ?: return | ||||||
|  |  | ||||||
|       var usedType = savedRegister.type |       var usedType = savedRegister.type | ||||||
|       var usedText = savedRegister.text |       var usedText = savedRegister.text | ||||||
| @@ -173,8 +174,8 @@ class ReplaceWithRegister : VimExtension { | |||||||
|         VimPlugin.getPut().putText(IjVimEditor(editor), IjExecutionContext(EditorDataContext.init(editor)), putData) |         VimPlugin.getPut().putText(IjVimEditor(editor), IjExecutionContext(EditorDataContext.init(editor)), putData) | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       VimPlugin.getRegister().saveRegister(savedRegister.name, savedRegister) |       caret.registerStorage.saveRegister(savedRegister.name, savedRegister) | ||||||
|       VimPlugin.getRegister().saveRegister(VimPlugin.getRegister().defaultRegister, savedRegister) |       caret.registerStorage.saveRegister(VimPlugin.getRegister().defaultRegister, savedRegister) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,30 +22,31 @@ import com.intellij.openapi.application.runWriteAction | |||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
|  | import com.maddyhome.idea.vim.api.VimCaret | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
|  | import com.maddyhome.idea.vim.extension.ExtensionHandler | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension | import com.maddyhome.idea.vim.extension.VimExtension | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutMapping | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.getRegister | import com.maddyhome.idea.vim.extension.VimExtensionFacade.getRegisterForCaret | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.inputKeyStroke | import com.maddyhome.idea.vim.extension.VimExtensionFacade.inputKeyStroke | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.inputString | import com.maddyhome.idea.vim.extension.VimExtensionFacade.inputString | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegister | import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegisterForCaret | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler | import com.maddyhome.idea.vim.helper.editorMode | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper |  | ||||||
| import com.maddyhome.idea.vim.helper.mode |  | ||||||
| import com.maddyhome.idea.vim.key.OperatorFunction | import com.maddyhome.idea.vim.key.OperatorFunction | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimCaret | import com.maddyhome.idea.vim.newapi.IjVimCaret | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||||
| import com.maddyhome.idea.vim.newapi.ij | import com.maddyhome.idea.vim.newapi.ij | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import com.maddyhome.idea.vim.options.helpers.ClipboardOptionHelper | import com.maddyhome.idea.vim.options.helpers.ClipboardOptionHelper | ||||||
|  | import com.maddyhome.idea.vim.put.PutData | ||||||
| import org.jetbrains.annotations.NonNls | import org.jetbrains.annotations.NonNls | ||||||
| import java.awt.event.KeyEvent | import java.awt.event.KeyEvent | ||||||
| import javax.swing.KeyStroke | import javax.swing.KeyStroke | ||||||
| @@ -80,7 +81,7 @@ class VimSurroundExtension : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class YSurroundHandler : VimExtensionHandler { |   private class YSurroundHandler : ExtensionHandler { | ||||||
|     override val isRepeatable = true |     override val isRepeatable = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -89,7 +90,7 @@ class VimSurroundExtension : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class VSurroundHandler : VimExtensionHandler { |   private class VSurroundHandler : ExtensionHandler { | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
|       val selectionStart = editor.ij.caretModel.primaryCaret.selectionStart |       val selectionStart = editor.ij.caretModel.primaryCaret.selectionStart | ||||||
|       // NB: Operator ignores SelectionType anyway |       // NB: Operator ignores SelectionType anyway | ||||||
| @@ -104,7 +105,7 @@ class VimSurroundExtension : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class CSurroundHandler : VimExtensionHandler { |   private class CSurroundHandler : ExtensionHandler { | ||||||
|     override val isRepeatable = true |     override val isRepeatable = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -115,28 +116,70 @@ class VimSurroundExtension : VimExtension { | |||||||
|       if (charTo.code == 0) return |       if (charTo.code == 0) return | ||||||
|  |  | ||||||
|       val newSurround = getOrInputPair(charTo, editor.ij) ?: return |       val newSurround = getOrInputPair(charTo, editor.ij) ?: return | ||||||
|       runWriteAction { change(editor.ij, charFrom, newSurround) } |       runWriteAction { change(editor, context, charFrom, newSurround) } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     companion object { |     companion object { | ||||||
|       fun change(editor: Editor, charFrom: Char, newSurround: Pair<String, String>?) { |       fun change(editor: VimEditor, context: ExecutionContext, charFrom: Char, newSurround: Pair<String, String>?) { | ||||||
|         // We take over the " register, so preserve it |         // Save old register values for carets | ||||||
|         val oldValue: List<KeyStroke>? = getRegister(REGISTER) |         val surroundings = editor.sortedCarets() | ||||||
|         // Extract the inner value |           .map { | ||||||
|         perform("di" + pick(charFrom), editor) |             val oldValue: List<KeyStroke>? = getRegisterForCaret(REGISTER, it) | ||||||
|         val innerValue: MutableList<KeyStroke> = getRegister(REGISTER)?.toMutableList() ?: mutableListOf() |             setRegisterForCaret(REGISTER, it, null) | ||||||
|         // Delete the surrounding |             SurroundingInfo(it, null, oldValue, null) | ||||||
|         perform("da" + pick(charFrom), editor) |           } | ||||||
|         // Insert the surrounding characters and paste |  | ||||||
|         if (newSurround != null) { |         // Delete surrounding's content | ||||||
|           innerValue.addAll(0, injector.parser.parseKeys(newSurround.first)) |         perform("di" + pick(charFrom), editor.ij) | ||||||
|           innerValue.addAll(injector.parser.parseKeys(newSurround.second)) |  | ||||||
|  |         // Add info about surrounding's inner text and location | ||||||
|  |         surroundings.forEach { | ||||||
|  |           val registerValue = getRegisterForCaret(REGISTER, it.caret) | ||||||
|  |           val innerValue = if (registerValue.isNullOrEmpty()) null else registerValue | ||||||
|  |           it.innerText = innerValue | ||||||
|  |  | ||||||
|  |           val lineEndOffset = injector.engineEditorHelper.getLineEndOffset(editor, it.caret.getLine().line, false) | ||||||
|  |           if (lineEndOffset == it.caret.offset.point) { | ||||||
|  |             it.isLineEnd = true | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Remove surrounding | ||||||
|  |         perform("da" + pick(charFrom), editor.ij) | ||||||
|  |  | ||||||
|  |         surroundings.forEach { | ||||||
|  |           if (it.innerText == null && getRegisterForCaret(REGISTER, it.caret)?.isNotEmpty() == true) { | ||||||
|  |             it.innerText = emptyList() | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           // caret should be placed at the first char of inserted text | ||||||
|  |           // the best solution would be using [ mark after the paste, but marks are not supported by multicaret | ||||||
|  |           // todo | ||||||
|  |           if (it.innerText != null) { | ||||||
|  |             it.offset = it.caret.offset.point | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         surroundings | ||||||
|  |           .filter { it.innerText != null } // we do nothing with carets that are not inside the surrounding | ||||||
|  |           .map { surrounding -> | ||||||
|  |             val innerValue = injector.parser.toPrintableString(surrounding.innerText!!) | ||||||
|  |             val text = newSurround?.let { it.first + innerValue + it.second } ?: innerValue | ||||||
|  |             val textData = PutData.TextData(text, SelectionType.CHARACTER_WISE, emptyList()) | ||||||
|  |             val putData = PutData(textData, null, 1, insertTextBeforeCaret = !surrounding.isLineEnd, rawIndent = true, caretAfterInsertedText = false) | ||||||
|  |  | ||||||
|  |             surrounding.caret to putData | ||||||
|  |           }.forEach { | ||||||
|  |             injector.put.putTextForCaret(editor, it.first, context, it.second) | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |         surroundings.forEach { | ||||||
|  |           it.restoreRegister() | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (surroundings.size == 1) { | ||||||
|  |           surroundings.first().moveCaret() | ||||||
|         } |         } | ||||||
|         pasteSurround(innerValue, editor) |  | ||||||
|         // Restore the old value |  | ||||||
|         setRegister(REGISTER, oldValue) |  | ||||||
|         // Jump back to start |  | ||||||
|         executeNormalWithoutMapping(injector.parser.parseKeys("`["), editor) |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       private fun perform(sequence: String, editor: Editor) { |       private fun perform(sequence: String, editor: Editor) { | ||||||
| @@ -144,21 +187,6 @@ class VimSurroundExtension : VimExtension { | |||||||
|           .use { executeNormalWithoutMapping(injector.parser.parseKeys("\"" + REGISTER + sequence), editor) } |           .use { executeNormalWithoutMapping(injector.parser.parseKeys("\"" + REGISTER + sequence), editor) } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       private fun pasteSurround( |  | ||||||
|         innerValue: List<KeyStroke?>, |  | ||||||
|         editor: Editor, |  | ||||||
|       ) { // This logic is direct from vim-surround |  | ||||||
|         val offset = editor.caretModel.offset |  | ||||||
|         val lineEndOffset = EditorHelper.getLineEndForOffset(editor, offset) |  | ||||||
|         val motionEndMark = VimPlugin.getMark().getMark(editor.vim, ']') |  | ||||||
|         val motionEndOffset = if (motionEndMark != null) { |  | ||||||
|           EditorHelper.getOffset(editor, motionEndMark.logicalLine, motionEndMark.col) |  | ||||||
|         } else -1 |  | ||||||
|         val pasteCommand = if (motionEndOffset == lineEndOffset && offset + 1 == lineEndOffset) "p" else "P" |  | ||||||
|         setRegister(REGISTER, innerValue) |  | ||||||
|         perform(pasteCommand, editor) |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       private fun pick(charFrom: Char) = when (charFrom) { |       private fun pick(charFrom: Char) = when (charFrom) { | ||||||
|         'a' -> '>' |         'a' -> '>' | ||||||
|         'r' -> ']' |         'r' -> ']' | ||||||
| @@ -167,7 +195,19 @@ class VimSurroundExtension : VimExtension { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private class DSurroundHandler : VimExtensionHandler { |   private data class SurroundingInfo(val caret: VimCaret, var innerText: List<KeyStroke>?, val oldRegisterContent: List<KeyStroke>?, var offset: Int?, var isLineEnd: Boolean = false) { | ||||||
|  |     fun restoreRegister() { | ||||||
|  |       setRegisterForCaret(REGISTER, caret, oldRegisterContent) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fun moveCaret() { | ||||||
|  |       if (innerText != null && offset != null) { | ||||||
|  |         caret.moveToOffset(offset!! + if (isLineEnd) 1 else 0) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private class DSurroundHandler : ExtensionHandler { | ||||||
|     override val isRepeatable = true |     override val isRepeatable = true | ||||||
|  |  | ||||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { |     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||||
| @@ -175,7 +215,7 @@ class VimSurroundExtension : VimExtension { | |||||||
|       val charFrom = getChar(editor.ij) |       val charFrom = getChar(editor.ij) | ||||||
|       if (charFrom.code == 0) return |       if (charFrom.code == 0) return | ||||||
|  |  | ||||||
|       runWriteAction { CSurroundHandler.change(editor.ij, charFrom, null) } |       runWriteAction { CSurroundHandler.change(editor, context, charFrom, null) } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -199,9 +239,9 @@ class VimSurroundExtension : VimExtension { | |||||||
|       return true |       return true | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private fun getSurroundRange(editor: Editor): TextRange? = when (editor.mode) { |     private fun getSurroundRange(editor: Editor): TextRange? = when (editor.editorMode) { | ||||||
|       CommandState.Mode.COMMAND -> VimPlugin.getMark().getChangeMarks(editor.vim) |       VimStateMachine.Mode.COMMAND -> VimPlugin.getMark().getChangeMarks(editor.vim) | ||||||
|       CommandState.Mode.VISUAL -> editor.caretModel.primaryCaret.run { TextRange(selectionStart, selectionEnd) } |       VimStateMachine.Mode.VISUAL -> editor.caretModel.primaryCaret.run { TextRange(selectionStart, selectionEnd) } | ||||||
|       else -> null |       else -> null | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -18,26 +18,22 @@ | |||||||
|  |  | ||||||
| package com.maddyhome.idea.vim.extension.textobjentire; | package com.maddyhome.idea.vim.extension.textobjentire; | ||||||
|  |  | ||||||
| import com.intellij.openapi.actionSystem.DataContext; |  | ||||||
| import com.intellij.openapi.editor.Caret; | import com.intellij.openapi.editor.Caret; | ||||||
| import com.intellij.openapi.editor.Editor; |  | ||||||
| import com.maddyhome.idea.vim.api.ExecutionContext; | import com.maddyhome.idea.vim.api.ExecutionContext; | ||||||
| import com.maddyhome.idea.vim.api.VimCaret; | import com.maddyhome.idea.vim.api.VimCaret; | ||||||
| import com.maddyhome.idea.vim.api.VimEditor; | import com.maddyhome.idea.vim.api.VimEditor; | ||||||
| import com.maddyhome.idea.vim.api.VimInjectorKt; | import com.maddyhome.idea.vim.api.VimInjectorKt; | ||||||
| import com.maddyhome.idea.vim.command.*; | import com.maddyhome.idea.vim.command.*; | ||||||
| import com.maddyhome.idea.vim.common.MappingMode; | import com.maddyhome.idea.vim.command.MappingMode; | ||||||
| import com.maddyhome.idea.vim.common.TextRange; | import com.maddyhome.idea.vim.common.TextRange; | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension; | import com.maddyhome.idea.vim.extension.VimExtension; | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler; | import com.maddyhome.idea.vim.extension.ExtensionHandler; | ||||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | ||||||
| import com.maddyhome.idea.vim.helper.InlayHelperKt; | import com.maddyhome.idea.vim.helper.InlayHelperKt; | ||||||
| import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | ||||||
| import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | ||||||
| import com.maddyhome.idea.vim.newapi.IjExecutionContext; |  | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimCaret; | import com.maddyhome.idea.vim.newapi.IjVimCaret; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import org.apache.tools.ant.taskdefs.Exec; |  | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
| import org.jetbrains.annotations.Nullable; | import org.jetbrains.annotations.Nullable; | ||||||
|  |  | ||||||
| @@ -88,7 +84,7 @@ public class VimTextObjEntireExtension implements VimExtension { | |||||||
|     putKeyMappingIfMissing(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("ie"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>textobj-entire-i"), true); |     putKeyMappingIfMissing(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("ie"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>textobj-entire-i"), true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static class EntireHandler implements VimExtensionHandler { |   static class EntireHandler implements ExtensionHandler { | ||||||
|     final boolean ignoreLeadingAndTrailing; |     final boolean ignoreLeadingAndTrailing; | ||||||
|  |  | ||||||
|     EntireHandler(boolean ignoreLeadingAndTrailing) { |     EntireHandler(boolean ignoreLeadingAndTrailing) { | ||||||
| @@ -148,17 +144,17 @@ public class VimTextObjEntireExtension implements VimExtension { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void execute(@NotNull VimEditor editor, @NotNull ExecutionContext context) { |     public void execute(@NotNull VimEditor editor, @NotNull ExecutionContext context) { | ||||||
|       @NotNull CommandState commandState = CommandState.getInstance(editor); |       @NotNull VimStateMachine vimStateMachine = VimStateMachine.getInstance(editor); | ||||||
|       int count = Math.max(1, commandState.getCommandBuilder().getCount()); |       int count = Math.max(1, vimStateMachine.getCommandBuilder().getCount()); | ||||||
|  |  | ||||||
|       final EntireTextObjectHandler textObjectHandler = new EntireTextObjectHandler(ignoreLeadingAndTrailing); |       final EntireTextObjectHandler textObjectHandler = new EntireTextObjectHandler(ignoreLeadingAndTrailing); | ||||||
|       //noinspection DuplicatedCode |       //noinspection DuplicatedCode | ||||||
|       if (!commandState.isOperatorPending()) { |       if (!vimStateMachine.isOperatorPending()) { | ||||||
|         ((IjVimEditor) editor).getEditor().getCaretModel().runForEachCaret((Caret caret) -> { |         ((IjVimEditor) editor).getEditor().getCaretModel().runForEachCaret((Caret caret) -> { | ||||||
|           final TextRange range = textObjectHandler.getRange(editor, new IjVimCaret(caret), context, count, 0, null); |           final TextRange range = textObjectHandler.getRange(editor, new IjVimCaret(caret), context, count, 0, null); | ||||||
|           if (range != null) { |           if (range != null) { | ||||||
|             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { |             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { | ||||||
|               if (commandState.getMode() == CommandState.Mode.VISUAL) { |               if (vimStateMachine.getMode() == VimStateMachine.Mode.VISUAL) { | ||||||
|                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); |                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||||
|               } else { |               } else { | ||||||
|                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); |                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); | ||||||
| @@ -168,7 +164,7 @@ public class VimTextObjEntireExtension implements VimExtension { | |||||||
|  |  | ||||||
|         }); |         }); | ||||||
|       } else { |       } else { | ||||||
|         commandState.getCommandBuilder().completeCommandPart(new Argument(new Command(count, |         vimStateMachine.getCommandBuilder().completeCommandPart(new Argument(new Command(count, | ||||||
|                                                                                          textObjectHandler, Command.Type.MOTION, |                                                                                          textObjectHandler, Command.Type.MOTION, | ||||||
|                                                                                          EnumSet.noneOf(CommandFlags.class)))); |                                                                                          EnumSet.noneOf(CommandFlags.class)))); | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -18,23 +18,20 @@ | |||||||
|  |  | ||||||
| package com.maddyhome.idea.vim.extension.textobjindent; | package com.maddyhome.idea.vim.extension.textobjindent; | ||||||
|  |  | ||||||
| import com.intellij.openapi.actionSystem.DataContext; |  | ||||||
| import com.intellij.openapi.editor.Caret; | import com.intellij.openapi.editor.Caret; | ||||||
| import com.intellij.openapi.editor.Editor; |  | ||||||
| import com.maddyhome.idea.vim.api.ExecutionContext; | import com.maddyhome.idea.vim.api.ExecutionContext; | ||||||
| import com.maddyhome.idea.vim.api.VimCaret; | import com.maddyhome.idea.vim.api.VimCaret; | ||||||
| import com.maddyhome.idea.vim.api.VimEditor; | import com.maddyhome.idea.vim.api.VimEditor; | ||||||
| import com.maddyhome.idea.vim.api.VimInjectorKt; | import com.maddyhome.idea.vim.api.VimInjectorKt; | ||||||
| import com.maddyhome.idea.vim.command.*; | import com.maddyhome.idea.vim.command.*; | ||||||
| import com.maddyhome.idea.vim.common.MappingMode; | import com.maddyhome.idea.vim.command.MappingMode; | ||||||
| import com.maddyhome.idea.vim.common.TextRange; | import com.maddyhome.idea.vim.common.TextRange; | ||||||
| import com.maddyhome.idea.vim.extension.VimExtension; | import com.maddyhome.idea.vim.extension.VimExtension; | ||||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler; | import com.maddyhome.idea.vim.extension.ExtensionHandler; | ||||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | ||||||
| import com.maddyhome.idea.vim.helper.InlayHelperKt; | import com.maddyhome.idea.vim.helper.InlayHelperKt; | ||||||
| import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | ||||||
| import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | ||||||
| import com.maddyhome.idea.vim.newapi.IjExecutionContext; |  | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimCaret; | import com.maddyhome.idea.vim.newapi.IjVimCaret; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
| @@ -86,7 +83,7 @@ public class VimIndentObject implements VimExtension { | |||||||
|     putKeyMapping(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("ii"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>textobj-indent-ii"), true); |     putKeyMapping(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("ii"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>textobj-indent-ii"), true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static class IndentObject implements VimExtensionHandler { |   static class IndentObject implements ExtensionHandler { | ||||||
|     final boolean includeAbove; |     final boolean includeAbove; | ||||||
|     final boolean includeBelow; |     final boolean includeBelow; | ||||||
|  |  | ||||||
| @@ -275,17 +272,17 @@ public class VimIndentObject implements VimExtension { | |||||||
|     @Override |     @Override | ||||||
|     public void execute(@NotNull VimEditor editor, @NotNull ExecutionContext context) { |     public void execute(@NotNull VimEditor editor, @NotNull ExecutionContext context) { | ||||||
|       IjVimEditor vimEditor = (IjVimEditor)editor; |       IjVimEditor vimEditor = (IjVimEditor)editor; | ||||||
|       @NotNull CommandState commandState = CommandState.getInstance(vimEditor); |       @NotNull VimStateMachine vimStateMachine = VimStateMachine.getInstance(vimEditor); | ||||||
|       int count = Math.max(1, commandState.getCommandBuilder().getCount()); |       int count = Math.max(1, vimStateMachine.getCommandBuilder().getCount()); | ||||||
|  |  | ||||||
|       final IndentObjectHandler textObjectHandler = new IndentObjectHandler(includeAbove, includeBelow); |       final IndentObjectHandler textObjectHandler = new IndentObjectHandler(includeAbove, includeBelow); | ||||||
|  |  | ||||||
|       if (!commandState.isOperatorPending()) { |       if (!vimStateMachine.isOperatorPending()) { | ||||||
|         ((IjVimEditor)editor).getEditor().getCaretModel().runForEachCaret((Caret caret) -> { |         ((IjVimEditor)editor).getEditor().getCaretModel().runForEachCaret((Caret caret) -> { | ||||||
|           final TextRange range = textObjectHandler.getRange(vimEditor, new IjVimCaret(caret), context, count, 0, null); |           final TextRange range = textObjectHandler.getRange(vimEditor, new IjVimCaret(caret), context, count, 0, null); | ||||||
|           if (range != null) { |           if (range != null) { | ||||||
|             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { |             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { | ||||||
|               if (commandState.getMode() == CommandState.Mode.VISUAL) { |               if (vimStateMachine.getMode() == VimStateMachine.Mode.VISUAL) { | ||||||
|                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); |                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||||
|               } else { |               } else { | ||||||
|                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); |                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); | ||||||
| @@ -295,7 +292,7 @@ public class VimIndentObject implements VimExtension { | |||||||
|  |  | ||||||
|         }); |         }); | ||||||
|       } else { |       } else { | ||||||
|         commandState.getCommandBuilder().completeCommandPart(new Argument(new Command(count, |         vimStateMachine.getCommandBuilder().completeCommandPart(new Argument(new Command(count, | ||||||
|                                                                                          textObjectHandler, Command.Type.MOTION, |                                                                                          textObjectHandler, Command.Type.MOTION, | ||||||
|                                                                                          EnumSet.noneOf(CommandFlags.class)))); |                                                                                          EnumSet.noneOf(CommandFlags.class)))); | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -39,7 +39,6 @@ import com.intellij.psi.codeStyle.CodeStyleManager; | |||||||
| import com.intellij.psi.util.PsiUtilBase; | import com.intellij.psi.util.PsiUtilBase; | ||||||
| import com.intellij.util.containers.ContainerUtil; | import com.intellij.util.containers.ContainerUtil; | ||||||
| import com.maddyhome.idea.vim.EventFacade; | import com.maddyhome.idea.vim.EventFacade; | ||||||
| import com.maddyhome.idea.vim.RegisterActions; |  | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.api.*; | import com.maddyhome.idea.vim.api.*; | ||||||
| import com.maddyhome.idea.vim.command.*; | import com.maddyhome.idea.vim.command.*; | ||||||
| @@ -107,7 +106,7 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); |       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), CommandState.Mode.INSERT); |     UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), VimStateMachine.Mode.INSERT); | ||||||
|     insertText(editor, caret, "\n" + IndentConfig.create(((IjVimEditor) editor).getEditor()).createIndentBySize(col)); |     insertText(editor, caret, "\n" + IndentConfig.create(((IjVimEditor) editor).getEditor()).createIndentBySize(col)); | ||||||
|  |  | ||||||
|     if (firstLiner) { |     if (firstLiner) { | ||||||
| @@ -123,10 +122,10 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|    * @param col    The column to indent to |    * @param col    The column to indent to | ||||||
|    */ |    */ | ||||||
|   private void insertNewLineBelow(@NotNull VimEditor editor, @NotNull VimCaret caret, int col) { |   private void insertNewLineBelow(@NotNull VimEditor editor, @NotNull VimCaret caret, int col) { | ||||||
|     if (((IjVimEditor) editor).getEditor().isOneLineMode()) return; |     if (editor.isOneLineMode()) return; | ||||||
|  |  | ||||||
|     injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); |     caret.moveToOffset(injector.getMotion().moveCaretToLineEnd(editor, caret)); | ||||||
|     UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), CommandState.Mode.INSERT); |     editor.setVimChangeActionSwitchMode(VimStateMachine.Mode.INSERT); | ||||||
|     insertText(editor, caret, "\n" + IndentConfig.create(((IjVimEditor) editor).getEditor()).createIndentBySize(col)); |     insertText(editor, caret, "\n" + IndentConfig.create(((IjVimEditor) editor).getEditor()).createIndentBySize(col)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -165,41 +164,6 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   @Override |  | ||||||
|   public @Nullable Pair<@NotNull TextRange, @NotNull SelectionType> getDeleteRangeAndType(@NotNull VimEditor editor, |  | ||||||
|                                                                         @NotNull VimCaret caret, |  | ||||||
|                                                                         @NotNull ExecutionContext context, |  | ||||||
|                                                                         final @NotNull Argument argument, |  | ||||||
|                                                                         boolean isChange, |  | ||||||
|                                                                         @NotNull OperatorArguments operatorArguments) { |  | ||||||
|     final TextRange range = |  | ||||||
|       injector.getMotion().getMotionRange(editor, caret, context, argument, operatorArguments); |  | ||||||
|     if (range == null) return null; |  | ||||||
|  |  | ||||||
|     // Delete motion commands that are not linewise become linewise if all the following are true: |  | ||||||
|     // 1) The range is across multiple lines |  | ||||||
|     // 2) There is only whitespace before the start of the range |  | ||||||
|     // 3) There is only whitespace after the end of the range |  | ||||||
|     SelectionType type; |  | ||||||
|     if (argument.getMotion().isLinewiseMotion()) { |  | ||||||
|       type = SelectionType.LINE_WISE; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       type = SelectionType.CHARACTER_WISE; |  | ||||||
|     } |  | ||||||
|     final Command motion = argument.getMotion(); |  | ||||||
|     if (!isChange && !motion.isLinewiseMotion()) { |  | ||||||
|       VimLogicalPosition start = editor.offsetToLogicalPosition(range.getStartOffset()); |  | ||||||
|       VimLogicalPosition end = editor.offsetToLogicalPosition(range.getEndOffset()); |  | ||||||
|       if (start.getLine() != end.getLine()) { |  | ||||||
|         if (!SearchHelper.anyNonWhitespace(((IjVimEditor) editor).getEditor(), range.getStartOffset(), -1) && |  | ||||||
|             !SearchHelper.anyNonWhitespace(((IjVimEditor) editor).getEditor(), range.getEndOffset(), 1)) { |  | ||||||
|           type = SelectionType.LINE_WISE; |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     return new Pair<>(range, type); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   public @Nullable Pair<@NotNull TextRange, @NotNull SelectionType> getDeleteRangeAndType2(@NotNull VimEditor editor, |   public @Nullable Pair<@NotNull TextRange, @NotNull SelectionType> getDeleteRangeAndType2(@NotNull VimEditor editor, | ||||||
| @@ -236,60 +200,6 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|     return new Pair<>(range, type); |     return new Pair<>(range, type); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Delete the range of text. |  | ||||||
|    * |  | ||||||
|    * @param editor   The editor to delete the text from |  | ||||||
|    * @param caret    The caret to be moved after deletion |  | ||||||
|    * @param range    The range to delete |  | ||||||
|    * @param type     The type of deletion |  | ||||||
|    * @param isChange Is from a change action |  | ||||||
|    * @return true if able to delete the text, false if not |  | ||||||
|    */ |  | ||||||
|   @Override |  | ||||||
|   public boolean deleteRange(@NotNull VimEditor editor, |  | ||||||
|                              @NotNull VimCaret caret, |  | ||||||
|                              @NotNull TextRange range, |  | ||||||
|                              @Nullable SelectionType type, |  | ||||||
|                              boolean isChange) { |  | ||||||
|  |  | ||||||
|     // Update the last column before we delete, or we might be retrieving the data for a line that no longer exists |  | ||||||
|     UserDataManager.setVimLastColumn(((IjVimCaret) caret).getCaret(), InlayHelperKt.getInlayAwareVisualColumn(((IjVimCaret) caret).getCaret())); |  | ||||||
|  |  | ||||||
|     boolean removeLastNewLine = removeLastNewLine(editor, range, type); |  | ||||||
|     final boolean res = deleteText(editor, range, type); |  | ||||||
|     if (removeLastNewLine) { |  | ||||||
|       int textLength = ((IjVimEditor) editor).getEditor().getDocument().getTextLength(); |  | ||||||
|       ((IjVimEditor) editor).getEditor().getDocument().deleteString(textLength - 1, textLength); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (res) { |  | ||||||
|       int pos = EditorHelper.normalizeOffset(((IjVimEditor) editor).getEditor(), range.getStartOffset(), isChange); |  | ||||||
|       if (type == SelectionType.LINE_WISE) { |  | ||||||
|         pos = VimPlugin.getMotion() |  | ||||||
|           .moveCaretToLineWithStartOfLineOption(editor, editor.offsetToLogicalPosition(pos).getLine(), |  | ||||||
|                                                 caret); |  | ||||||
|       } |  | ||||||
|       injector.getMotion().moveCaret(editor, caret, pos); |  | ||||||
|     } |  | ||||||
|     return res; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   private boolean removeLastNewLine(@NotNull VimEditor editor, @NotNull TextRange range, @Nullable SelectionType type) { |  | ||||||
|     int endOffset = range.getEndOffset(); |  | ||||||
|     int fileSize = EditorHelperRt.getFileSize(((IjVimEditor) editor).getEditor()); |  | ||||||
|     if (endOffset > fileSize) { |  | ||||||
|       if (injector.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, OptionConstants.ideastrictmodeName, OptionConstants.ideastrictmodeName)) { |  | ||||||
|         throw new IllegalStateException("Incorrect offset. File size: " + fileSize + ", offset: " + endOffset); |  | ||||||
|       } |  | ||||||
|       endOffset = fileSize; |  | ||||||
|     } |  | ||||||
|     return type == SelectionType.LINE_WISE && |  | ||||||
|            range.getStartOffset() != 0 && |  | ||||||
|            ((IjVimEditor) editor).getEditor().getDocument().getCharsSequence().charAt(endOffset - 1) != '\n' && |  | ||||||
|            endOffset == fileSize; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   public void insertLineAround(@NotNull VimEditor editor, @NotNull ExecutionContext context, int shift) { |   public void insertLineAround(@NotNull VimEditor editor, @NotNull ExecutionContext context, int shift) { | ||||||
|     com.maddyhome.idea.vim.newapi.ChangeGroupKt.insertLineAround(editor, context, shift); |     com.maddyhome.idea.vim.newapi.ChangeGroupKt.insertLineAround(editor, context, shift); | ||||||
| @@ -303,48 +213,6 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|     return com.maddyhome.idea.vim.newapi.ChangeGroupKt.deleteRange(editor, caret, range, type); |     return com.maddyhome.idea.vim.newapi.ChangeGroupKt.deleteRange(editor, caret, range, type); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Delete count characters and then enter insert mode |  | ||||||
|    * |  | ||||||
|    * @param editor The editor to change |  | ||||||
|    * @param caret  The caret to be moved |  | ||||||
|    * @param count  The number of characters to change |  | ||||||
|    * @return true if able to delete count characters, false if not |  | ||||||
|    */ |  | ||||||
|   @Override |  | ||||||
|   public boolean changeCharacters(@NotNull VimEditor editor, @NotNull VimCaret caret, int count) { |  | ||||||
|     int len = EditorHelper.getLineLength(((IjVimEditor) editor).getEditor()); |  | ||||||
|     int col = ((IjVimCaret) caret).getCaret().getLogicalPosition().column; |  | ||||||
|     if (col + count >= len) { |  | ||||||
|       return changeEndOfLine(editor, caret, 1); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     boolean res = deleteCharacter(editor, caret, count, true); |  | ||||||
|     if (res) { |  | ||||||
|       UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), CommandState.Mode.INSERT); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return res; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Delete from the cursor to the end of count - 1 lines down and enter insert mode |  | ||||||
|    * |  | ||||||
|    * @param editor The editor to change |  | ||||||
|    * @param caret  The caret to perform action on |  | ||||||
|    * @param count  The number of lines to change |  | ||||||
|    * @return true if able to delete count lines, false if not |  | ||||||
|    */ |  | ||||||
|   @Override |  | ||||||
|   public boolean changeEndOfLine(@NotNull VimEditor editor, @NotNull VimCaret caret, int count) { |  | ||||||
|     boolean res = deleteEndOfLine(editor, caret, count); |  | ||||||
|     if (res) { |  | ||||||
|       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); |  | ||||||
|       UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), CommandState.Mode.INSERT); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return res; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Delete the text covered by the motion command argument and enter insert mode |    * Delete the text covered by the motion command argument and enter insert mode | ||||||
| @@ -368,9 +236,9 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|     String id = motion.getAction().getId(); |     String id = motion.getAction().getId(); | ||||||
|     boolean kludge = false; |     boolean kludge = false; | ||||||
|     boolean bigWord = id.equals(VIM_MOTION_BIG_WORD_RIGHT); |     boolean bigWord = id.equals(VIM_MOTION_BIG_WORD_RIGHT); | ||||||
|     final CharSequence chars = ((IjVimEditor) editor).getEditor().getDocument().getCharsSequence(); |     final CharSequence chars = editor.text(); | ||||||
|     final int offset = ((IjVimCaret) caret).getCaret().getOffset(); |     final int offset = caret.getOffset().getPoint(); | ||||||
|     int fileSize = EditorHelperRt.getFileSize(((IjVimEditor) editor).getEditor()); |     int fileSize = ((int)editor.fileSize()); | ||||||
|     if (fileSize > 0 && offset < fileSize) { |     if (fileSize > 0 && offset < fileSize) { | ||||||
|       final CharacterHelper.CharacterType charType = CharacterHelper.charType(chars.charAt(offset), bigWord); |       final CharacterHelper.CharacterType charType = CharacterHelper.charType(chars.charAt(offset), bigWord); | ||||||
|       if (charType != CharacterHelper.CharacterType.WHITESPACE) { |       if (charType != CharacterHelper.CharacterType.WHITESPACE) { | ||||||
| @@ -379,24 +247,24 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|         if (wordMotions.contains(id) && lastWordChar && motion.getCount() == 1) { |         if (wordMotions.contains(id) && lastWordChar && motion.getCount() == 1) { | ||||||
|           final boolean res = deleteCharacter(editor, caret, 1, true); |           final boolean res = deleteCharacter(editor, caret, 1, true); | ||||||
|           if (res) { |           if (res) { | ||||||
|             UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), CommandState.Mode.INSERT); |             editor.setVimChangeActionSwitchMode(VimStateMachine.Mode.INSERT); | ||||||
|           } |           } | ||||||
|           return res; |           return res; | ||||||
|         } |         } | ||||||
|         switch (id) { |         switch (id) { | ||||||
|           case VIM_MOTION_WORD_RIGHT: |           case VIM_MOTION_WORD_RIGHT: | ||||||
|             kludge = true; |             kludge = true; | ||||||
|             motion.setAction(RegisterActions.findActionOrDie(VIM_MOTION_WORD_END_RIGHT)); |             motion.setAction(injector.getActionExecutor().findVimActionOrDie(VIM_MOTION_WORD_END_RIGHT)); | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|           case VIM_MOTION_BIG_WORD_RIGHT: |           case VIM_MOTION_BIG_WORD_RIGHT: | ||||||
|             kludge = true; |             kludge = true; | ||||||
|             motion.setAction(RegisterActions.findActionOrDie(VIM_MOTION_BIG_WORD_END_RIGHT)); |             motion.setAction(injector.getActionExecutor().findVimActionOrDie(VIM_MOTION_BIG_WORD_END_RIGHT)); | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|           case VIM_MOTION_CAMEL_RIGHT: |           case VIM_MOTION_CAMEL_RIGHT: | ||||||
|             kludge = true; |             kludge = true; | ||||||
|             motion.setAction(RegisterActions.findActionOrDie(VIM_MOTION_CAMEL_END_RIGHT)); |             motion.setAction(injector.getActionExecutor().findVimActionOrDie(VIM_MOTION_CAMEL_END_RIGHT)); | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| @@ -405,8 +273,8 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|  |  | ||||||
|     if (kludge) { |     if (kludge) { | ||||||
|       int cnt = operatorArguments.getCount1() * motion.getCount(); |       int cnt = operatorArguments.getCount1() * motion.getCount(); | ||||||
|       int pos1 = SearchHelper.findNextWordEnd(chars, offset, fileSize, cnt, bigWord, false); |       int pos1 = injector.getSearchHelper().findNextWordEnd(chars, offset, fileSize, cnt, bigWord, false); | ||||||
|       int pos2 = SearchHelper.findNextWordEnd(chars, pos1, fileSize, -cnt, bigWord, false); |       int pos2 = injector.getSearchHelper().findNextWordEnd(chars, pos1, fileSize, -cnt, bigWord, false); | ||||||
|       if (logger.isDebugEnabled()) { |       if (logger.isDebugEnabled()) { | ||||||
|         logger.debug("pos=" + offset); |         logger.debug("pos=" + offset); | ||||||
|         logger.debug("pos1=" + pos1); |         logger.debug("pos1=" + pos1); | ||||||
| @@ -427,11 +295,11 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (VimPlugin.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, OptionConstants.experimentalapiName, OptionConstants.experimentalapiName)) { |     if (injector.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, OptionConstants.experimentalapiName, OptionConstants.experimentalapiName)) { | ||||||
|       Pair<TextRange, SelectionType> deleteRangeAndType = |       Pair<TextRange, SelectionType> deleteRangeAndType = | ||||||
|         getDeleteRangeAndType2(editor, caret, context, argument, true, operatorArguments.withCount0(count0)); |         getDeleteRangeAndType2(editor, caret, context, argument, true, operatorArguments.withCount0(count0)); | ||||||
|       if (deleteRangeAndType == null) return false; |       if (deleteRangeAndType == null) return false; | ||||||
|       ChangeGroupKt.changeRange(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), deleteRangeAndType.getFirst(), deleteRangeAndType.getSecond(), ((IjExecutionContext) context).getContext()); |       //ChangeGroupKt.changeRange(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), deleteRangeAndType.getFirst(), deleteRangeAndType.getSecond(), ((IjExecutionContext) context).getContext()); | ||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
| @@ -442,23 +310,6 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Counts number of lines in the visual block. |  | ||||||
|    * <p> |  | ||||||
|    * The result includes empty and short lines which does not have explicit start position (caret). |  | ||||||
|    * |  | ||||||
|    * @param editor The editor the block was selected in |  | ||||||
|    * @param range  The range corresponding to the selected block |  | ||||||
|    * @return total number of lines |  | ||||||
|    */ |  | ||||||
|   public static int getLinesCountInVisualBlock(@NotNull VimEditor editor, @NotNull TextRange range) { |  | ||||||
|     final int[] startOffsets = range.getStartOffsets(); |  | ||||||
|     if (startOffsets.length == 0) return 0; |  | ||||||
|     final VimLogicalPosition firstStart = editor.offsetToLogicalPosition(startOffsets[0]); |  | ||||||
|     final VimLogicalPosition lastStart = editor.offsetToLogicalPosition(startOffsets[range.size() - 1]); |  | ||||||
|     return lastStart.getLine() - firstStart.getLine() + 1; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Toggles the case of count characters |    * Toggles the case of count characters | ||||||
|    * |    * | ||||||
| @@ -484,11 +335,11 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|                              @NotNull TextRange range, |                              @NotNull TextRange range, | ||||||
|                              boolean append, |                              boolean append, | ||||||
|                              @NotNull OperatorArguments operatorArguments) { |                              @NotNull OperatorArguments operatorArguments) { | ||||||
|     final int lines = getLinesCountInVisualBlock(editor, range); |     final int lines = VimChangeGroupBase.Companion.getLinesCountInVisualBlock(editor, range); | ||||||
|     final VimLogicalPosition startPosition = editor.offsetToLogicalPosition(range.getStartOffset()); |     final VimLogicalPosition startPosition = editor.offsetToLogicalPosition(range.getStartOffset()); | ||||||
|  |  | ||||||
|     boolean visualBlockMode = operatorArguments.getMode() == CommandState.Mode.VISUAL && |     boolean visualBlockMode = operatorArguments.getMode() == VimStateMachine.Mode.VISUAL && | ||||||
|                               operatorArguments.getSubMode() == CommandState.SubMode.VISUAL_BLOCK; |                               operatorArguments.getSubMode() == VimStateMachine.SubMode.VISUAL_BLOCK; | ||||||
|     for (Caret caret : ((IjVimEditor) editor).getEditor().getCaretModel().getAllCarets()) { |     for (Caret caret : ((IjVimEditor) editor).getEditor().getCaretModel().getAllCarets()) { | ||||||
|       final int line = startPosition.getLine(); |       final int line = startPosition.getLine(); | ||||||
|       int column = startPosition.getColumn(); |       int column = startPosition.getColumn(); | ||||||
| @@ -589,24 +440,24 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|     int col = 0; |     int col = 0; | ||||||
|     int lines = 0; |     int lines = 0; | ||||||
|     if (type == SelectionType.BLOCK_WISE) { |     if (type == SelectionType.BLOCK_WISE) { | ||||||
|       lines = getLinesCountInVisualBlock(editor, range); |       lines = VimChangeGroupBase.Companion.getLinesCountInVisualBlock(editor, range); | ||||||
|       col = editor.offsetToLogicalPosition(range.getStartOffset()).getColumn(); |       col = editor.offsetToLogicalPosition(range.getStartOffset()).getColumn(); | ||||||
|       if (UserDataManager.getVimLastColumn(((IjVimCaret) caret).getCaret()) == VimMotionGroupBase.LAST_COLUMN) { |       if (caret.getVimLastColumn() == VimMotionGroupBase.LAST_COLUMN) { | ||||||
|         col = VimMotionGroupBase.LAST_COLUMN; |         col = VimMotionGroupBase.LAST_COLUMN; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     boolean after = range.getEndOffset() >= EditorHelperRt.getFileSize(((IjVimEditor) editor).getEditor()); |     boolean after = range.getEndOffset() >= editor.fileSize(); | ||||||
|  |  | ||||||
|     final VimLogicalPosition lp = editor.offsetToLogicalPosition(VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, caret)); |     final VimLogicalPosition lp = editor.offsetToLogicalPosition(injector.getMotion().moveCaretToLineStartSkipLeading(editor, caret)); | ||||||
|  |  | ||||||
|     boolean res = deleteRange(editor, caret, range, type, true); |     boolean res = deleteRange(editor, caret, range, type, true); | ||||||
|     if (res) { |     if (res) { | ||||||
|       if (type == SelectionType.LINE_WISE) { |       if (type == SelectionType.LINE_WISE) { | ||||||
|         // Please don't use `getDocument().getText().isEmpty()` because it converts CharSequence into String |         // Please don't use `getDocument().getText().isEmpty()` because it converts CharSequence into String | ||||||
|         if (((IjVimEditor) editor).getEditor().getDocument().getTextLength() == 0) { |         if (editor.fileSize() == 0) { | ||||||
|           insertBeforeCursor(editor, context); |           insertBeforeCursor(editor, context); | ||||||
|         } |         } | ||||||
|         else if (after && !EditorHelperRt.endsWithNewLine(((IjVimEditor) editor).getEditor())) { |         else if (after && !EngineEditorHelperKt.endsWithNewLine(editor)) { | ||||||
|           insertNewLineBelow(editor, caret, lp.getColumn()); |           insertNewLineBelow(editor, caret, lp.getColumn()); | ||||||
|         } |         } | ||||||
|         else { |         else { | ||||||
| @@ -617,7 +468,7 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|         if (type == SelectionType.BLOCK_WISE) { |         if (type == SelectionType.BLOCK_WISE) { | ||||||
|           setInsertRepeat(lines, col, false); |           setInsertRepeat(lines, col, false); | ||||||
|         } |         } | ||||||
|         UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), CommandState.Mode.INSERT); |         UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), VimStateMachine.Mode.INSERT); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
| @@ -824,7 +675,7 @@ public class ChangeGroup extends VimChangeGroupBase { | |||||||
|               } |               } | ||||||
|             } |             } | ||||||
|             if (pos > wsoff) { |             if (pos > wsoff) { | ||||||
|               deleteText(editor, new TextRange(wsoff, pos), null); |               deleteText(editor, new TextRange(wsoff, pos), null, caret); | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -38,8 +38,7 @@ import com.intellij.openapi.vfs.VirtualFile; | |||||||
| import com.intellij.openapi.vfs.VirtualFileVisitor; | import com.intellij.openapi.vfs.VirtualFileVisitor; | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.api.*; | import com.maddyhome.idea.vim.api.*; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import com.maddyhome.idea.vim.common.GoalCommand; |  | ||||||
| import com.maddyhome.idea.vim.common.TextRange; | import com.maddyhome.idea.vim.common.TextRange; | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper; | import com.maddyhome.idea.vim.helper.EditorHelper; | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelperRt; | import com.maddyhome.idea.vim.helper.EditorHelperRt; | ||||||
| @@ -48,7 +47,6 @@ import com.maddyhome.idea.vim.helper.SearchHelper; | |||||||
| import com.maddyhome.idea.vim.newapi.ExecuteExtensionKt; | import com.maddyhome.idea.vim.newapi.ExecuteExtensionKt; | ||||||
| import com.maddyhome.idea.vim.newapi.IjExecutionContext; | import com.maddyhome.idea.vim.newapi.IjExecutionContext; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants; |  | ||||||
| import com.maddyhome.idea.vim.options.OptionScope; | import com.maddyhome.idea.vim.options.OptionScope; | ||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | ||||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | ||||||
| @@ -290,7 +288,7 @@ public class FileGroup extends VimFileBase { | |||||||
|     StringBuilder msg = new StringBuilder(); |     StringBuilder msg = new StringBuilder(); | ||||||
|     Document doc = editor.getDocument(); |     Document doc = editor.getDocument(); | ||||||
|  |  | ||||||
|     if (CommandState.getInstance(new IjVimEditor(editor)).getMode() != CommandState.Mode.VISUAL) { |     if (VimStateMachine.getInstance(new IjVimEditor(editor)).getMode() != VimStateMachine.Mode.VISUAL) { | ||||||
|       LogicalPosition lp = editor.getCaretModel().getLogicalPosition(); |       LogicalPosition lp = editor.getCaretModel().getLogicalPosition(); | ||||||
|       int col = editor.getCaretModel().getOffset() - doc.getLineStartOffset(lp.line); |       int col = editor.getCaretModel().getOffset() - doc.getLineStartOffset(lp.line); | ||||||
|       int endoff = doc.getLineEndOffset(lp.line); |       int endoff = doc.getLineEndOffset(lp.line); | ||||||
|   | |||||||
| @@ -37,9 +37,8 @@ import com.maddyhome.idea.vim.VimPlugin; | |||||||
| import com.maddyhome.idea.vim.action.ComplicatedKeysAction; | import com.maddyhome.idea.vim.action.ComplicatedKeysAction; | ||||||
| import com.maddyhome.idea.vim.action.VimShortcutKeyAction; | import com.maddyhome.idea.vim.action.VimShortcutKeyAction; | ||||||
| import com.maddyhome.idea.vim.api.*; | import com.maddyhome.idea.vim.api.*; | ||||||
| import com.maddyhome.idea.vim.common.MappingMode; | import com.maddyhome.idea.vim.command.MappingMode; | ||||||
| import com.maddyhome.idea.vim.common.Node; | import com.maddyhome.idea.vim.key.Node; | ||||||
| import com.maddyhome.idea.vim.common.NodesKt; |  | ||||||
| import com.maddyhome.idea.vim.ex.ExOutputModel; | import com.maddyhome.idea.vim.ex.ExOutputModel; | ||||||
| import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; | import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; | ||||||
| import com.maddyhome.idea.vim.helper.HelperKt; | import com.maddyhome.idea.vim.helper.HelperKt; | ||||||
|   | |||||||
| @@ -44,7 +44,6 @@ import com.maddyhome.idea.vim.helper.EditorHelper; | |||||||
| import com.maddyhome.idea.vim.helper.HelperKt; | import com.maddyhome.idea.vim.helper.HelperKt; | ||||||
| import com.maddyhome.idea.vim.mark.*; | import com.maddyhome.idea.vim.mark.*; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants; |  | ||||||
| import com.maddyhome.idea.vim.options.OptionScope; | import com.maddyhome.idea.vim.options.OptionScope; | ||||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | ||||||
| import org.jdom.Element; | import org.jdom.Element; | ||||||
| @@ -60,8 +59,7 @@ import static com.maddyhome.idea.vim.mark.VimMarkConstants.SAVE_FILE_MARKS; | |||||||
|  * This class contains all the mark related functionality |  * This class contains all the mark related functionality | ||||||
|  */ |  */ | ||||||
| @State(name = "VimMarksSettings", storages = { | @State(name = "VimMarksSettings", storages = { | ||||||
|   @Storage(value = "$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED) |   @Storage(value = "$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)}) | ||||||
| }) |  | ||||||
| public class MarkGroup extends VimMarkGroupBase implements PersistentStateComponent<Element> { | public class MarkGroup extends VimMarkGroupBase implements PersistentStateComponent<Element> { | ||||||
|   public void editorReleased(@NotNull EditorFactoryEvent event) { |   public void editorReleased(@NotNull EditorFactoryEvent event) { | ||||||
|     // Save off the last caret position of the file before it is closed |     // Save off the last caret position of the file before it is closed | ||||||
| @@ -127,7 +125,8 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|  |  | ||||||
|   public void saveData(@NotNull Element element) { |   public void saveData(@NotNull Element element) { | ||||||
|     Element marksElem = new Element("globalmarks"); |     Element marksElem = new Element("globalmarks"); | ||||||
|     if (!VimPlugin.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) { |     if (!VimPlugin.getOptionService() | ||||||
|  |       .isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) { | ||||||
|       for (Mark mark : globalMarks.values()) { |       for (Mark mark : globalMarks.values()) { | ||||||
|         if (!mark.isClear()) { |         if (!mark.isClear()) { | ||||||
|           Element markElem = new Element("mark"); |           Element markElem = new Element("mark"); | ||||||
| @@ -165,8 +164,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|         fileMarkElem.setAttribute("name", file); |         fileMarkElem.setAttribute("name", file); | ||||||
|         fileMarkElem.setAttribute("timestamp", Long.toString(marks.getMyTimestamp().getTime())); |         fileMarkElem.setAttribute("timestamp", Long.toString(marks.getMyTimestamp().getTime())); | ||||||
|         for (Mark mark : marks.values()) { |         for (Mark mark : marks.values()) { | ||||||
|           if (!mark.isClear() && !Character.isUpperCase(mark.getKey()) && |           if (!mark.isClear() && !Character.isUpperCase(mark.getKey()) && SAVE_FILE_MARKS.indexOf(mark.getKey()) >= 0) { | ||||||
|               SAVE_FILE_MARKS.indexOf(mark.getKey()) >= 0) { |  | ||||||
|             Element markElem = new Element("mark"); |             Element markElem = new Element("mark"); | ||||||
|             markElem.setAttribute("key", Character.toString(mark.getKey())); |             markElem.setAttribute("key", Character.toString(mark.getKey())); | ||||||
|             markElem.setAttribute("line", Integer.toString(mark.getLogicalLine())); |             markElem.setAttribute("line", Integer.toString(mark.getLogicalLine())); | ||||||
| @@ -200,14 +198,15 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|     // (see com.intellij.openapi.application.Application.runReadAction()) |     // (see com.intellij.openapi.application.Application.runReadAction()) | ||||||
|  |  | ||||||
|     Element marksElem = element.getChild("globalmarks"); |     Element marksElem = element.getChild("globalmarks"); | ||||||
|     if (marksElem != null && !VimPlugin.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) { |     if (marksElem != null && | ||||||
|  |         !VimPlugin.getOptionService() | ||||||
|  |           .isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) { | ||||||
|       List<Element> markList = marksElem.getChildren("mark"); |       List<Element> markList = marksElem.getChildren("mark"); | ||||||
|       for (Element aMarkList : markList) { |       for (Element aMarkList : markList) { | ||||||
|         Mark mark = VimMark.create(aMarkList.getAttributeValue("key").charAt(0), |         Mark mark = VimMark.create(aMarkList.getAttributeValue("key").charAt(0), | ||||||
|                                    Integer.parseInt(aMarkList.getAttributeValue("line")), |                                    Integer.parseInt(aMarkList.getAttributeValue("line")), | ||||||
|                                    Integer.parseInt(aMarkList.getAttributeValue("column")), |                                    Integer.parseInt(aMarkList.getAttributeValue("column")), | ||||||
|                                    aMarkList.getAttributeValue("filename"), |                                    aMarkList.getAttributeValue("filename"), aMarkList.getAttributeValue("protocol")); | ||||||
|                                    aMarkList.getAttributeValue("protocol")); |  | ||||||
|  |  | ||||||
|         if (mark != null) { |         if (mark != null) { | ||||||
|           globalMarks.put(mark.getKey(), mark); |           globalMarks.put(mark.getKey(), mark); | ||||||
| @@ -239,8 +238,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|         for (Element aMarkList : markList) { |         for (Element aMarkList : markList) { | ||||||
|           Mark mark = VimMark.create(aMarkList.getAttributeValue("key").charAt(0), |           Mark mark = VimMark.create(aMarkList.getAttributeValue("key").charAt(0), | ||||||
|                                      Integer.parseInt(aMarkList.getAttributeValue("line")), |                                      Integer.parseInt(aMarkList.getAttributeValue("line")), | ||||||
|                                      Integer.parseInt(aMarkList.getAttributeValue("column")), |                                      Integer.parseInt(aMarkList.getAttributeValue("column")), filename, | ||||||
|                                      filename, |  | ||||||
|                                      aMarkList.getAttributeValue("protocol")); |                                      aMarkList.getAttributeValue("protocol")); | ||||||
|  |  | ||||||
|           if (mark != null) fmarks.put(mark.getKey(), mark); |           if (mark != null) fmarks.put(mark.getKey(), mark); | ||||||
| @@ -290,6 +288,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|   public static class MarkUpdater implements DocumentListener { |   public static class MarkUpdater implements DocumentListener { | ||||||
|  |  | ||||||
|     public static MarkUpdater INSTANCE = new MarkUpdater(); |     public static MarkUpdater INSTANCE = new MarkUpdater(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Creates the listener for the supplied editor |      * Creates the listener for the supplied editor | ||||||
|      */ |      */ | ||||||
| @@ -313,8 +312,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|       Editor anEditor = getAnEditor(doc); |       Editor anEditor = getAnEditor(doc); | ||||||
|       VimInjectorKt.getInjector().getMarkGroup() |       VimInjectorKt.getInjector().getMarkGroup() | ||||||
|         .updateMarkFromDelete(anEditor == null ? null : new IjVimEditor(anEditor), |         .updateMarkFromDelete(anEditor == null ? null : new IjVimEditor(anEditor), | ||||||
|                               VimPlugin.getMark().getAllFileMarks(doc), |                               VimPlugin.getMark().getAllFileMarks(doc), event.getOffset(), event.getOldLength()); | ||||||
|                               event.getOffset(), event.getOldLength()); |  | ||||||
|       // TODO - update jumps |       // TODO - update jumps | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -361,7 +359,10 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|     @Override |     @Override | ||||||
|     public void bookmarkAdded(@NotNull BookmarkGroup group, com.intellij.ide.bookmark.@NotNull Bookmark bookmark) { |     public void bookmarkAdded(@NotNull BookmarkGroup group, com.intellij.ide.bookmark.@NotNull Bookmark bookmark) { | ||||||
|       if (!VimPlugin.isEnabled()) return; |       if (!VimPlugin.isEnabled()) return; | ||||||
|       if (!VimPlugin.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) return; |       if (!VimPlugin.getOptionService() | ||||||
|  |         .isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       if (!(bookmark instanceof LineBookmark)) return; |       if (!(bookmark instanceof LineBookmark)) return; | ||||||
|       BookmarksManager bookmarksManager = BookmarksManager.getInstance(myProject); |       BookmarksManager bookmarksManager = BookmarksManager.getInstance(myProject); | ||||||
| @@ -378,7 +379,10 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|     @Override |     @Override | ||||||
|     public void bookmarkRemoved(@NotNull BookmarkGroup group, com.intellij.ide.bookmark.@NotNull Bookmark bookmark) { |     public void bookmarkRemoved(@NotNull BookmarkGroup group, com.intellij.ide.bookmark.@NotNull Bookmark bookmark) { | ||||||
|       if (!VimPlugin.isEnabled()) return; |       if (!VimPlugin.isEnabled()) return; | ||||||
|       if (!VimPlugin.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) return; |       if (!VimPlugin.getOptionService() | ||||||
|  |         .isSet(OptionScope.GLOBAL.INSTANCE, IjVimOptionService.ideamarksName, IjVimOptionService.ideamarksName)) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       if (!(bookmark instanceof LineBookmark)) return; |       if (!(bookmark instanceof LineBookmark)) return; | ||||||
|       BookmarksManager bookmarksManager = BookmarksManager.getInstance(myProject); |       BookmarksManager bookmarksManager = BookmarksManager.getInstance(myProject); | ||||||
| @@ -387,7 +391,8 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|       if (type == null) return; |       if (type == null) return; | ||||||
|       char ch = type.getMnemonic(); |       char ch = type.getMnemonic(); | ||||||
|       if (GLOBAL_MARKS.indexOf(ch) != -1) { |       if (GLOBAL_MARKS.indexOf(ch) != -1) { | ||||||
|         FileMarks<Character, Mark> fmarks = VimPlugin.getMark().getFileMarks(((LineBookmark)bookmark).getFile().getPath()); |         FileMarks<Character, Mark> fmarks = | ||||||
|  |           VimPlugin.getMark().getFileMarks(((LineBookmark)bookmark).getFile().getPath()); | ||||||
|         fmarks.remove(ch); |         fmarks.remove(ch); | ||||||
|         VimPlugin.getMark().globalMarks.remove(ch); |         VimPlugin.getMark().globalMarks.remove(ch); | ||||||
|       } |       } | ||||||
| @@ -404,6 +409,16 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * COMPATIBILITY-LAYER: Method added | ||||||
|  |    * | ||||||
|  |    * @deprecated Please use method with VimEditor | ||||||
|  |    */ | ||||||
|  |   @Deprecated | ||||||
|  |   public void saveJumpLocation(Editor editor) { | ||||||
|  |     this.saveJumpLocation(new IjVimEditor(editor)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   private static final int SAVE_MARK_COUNT = 20; |   private static final int SAVE_MARK_COUNT = 20; | ||||||
|  |  | ||||||
|   private static final Logger logger = Logger.getInstance(MarkGroup.class.getName()); |   private static final Logger logger = Logger.getInstance(MarkGroup.class.getName()); | ||||||
|   | |||||||
| @@ -711,7 +711,7 @@ public class MotionGroup extends VimMotionGroupBase { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private static int getScrollJump(@NotNull Editor editor, int height) { |   private static int getScrollJump(@NotNull Editor editor, int height) { | ||||||
|     final EnumSet<CommandFlags> flags = CommandState.getInstance(new IjVimEditor(editor)).getExecutingCommandFlags(); |     final EnumSet<CommandFlags> flags = VimStateMachine.getInstance(new IjVimEditor(editor)).getExecutingCommandFlags(); | ||||||
|     final boolean scrollJump = !flags.contains(CommandFlags.FLAG_IGNORE_SCROLL_JUMP); |     final boolean scrollJump = !flags.contains(CommandFlags.FLAG_IGNORE_SCROLL_JUMP); | ||||||
|  |  | ||||||
|     // Default value is 1. Zero is a valid value, but we normalise to 1 - we always want to scroll at least one line |     // Default value is 1. Zero is a valid value, but we normalise to 1 - we always want to scroll at least one line | ||||||
| @@ -736,7 +736,7 @@ public class MotionGroup extends VimMotionGroupBase { | |||||||
|     final int halfWidth = getApproximateScreenWidth(editor) / 2; |     final int halfWidth = getApproximateScreenWidth(editor) / 2; | ||||||
|     final int scrollOffset = getNormalizedSideScrollOffset(editor); |     final int scrollOffset = getNormalizedSideScrollOffset(editor); | ||||||
|  |  | ||||||
|     final EnumSet<CommandFlags> flags = CommandState.getInstance(new IjVimEditor(editor)).getExecutingCommandFlags(); |     final EnumSet<CommandFlags> flags = VimStateMachine.getInstance(new IjVimEditor(editor)).getExecutingCommandFlags(); | ||||||
|     final boolean allowSidescroll = !flags.contains(CommandFlags.FLAG_IGNORE_SIDE_SCROLL_JUMP); |     final boolean allowSidescroll = !flags.contains(CommandFlags.FLAG_IGNORE_SIDE_SCROLL_JUMP); | ||||||
|     int sidescroll = ((VimInt) VimPlugin.getOptionService().getOptionValue(new OptionScope.LOCAL(new IjVimEditor(editor)), OptionConstants.sidescrollName, OptionConstants.sidescrollName)).getValue(); |     int sidescroll = ((VimInt) VimPlugin.getOptionService().getOptionValue(new OptionScope.LOCAL(new IjVimEditor(editor)), OptionConstants.sidescrollName, OptionConstants.sidescrollName)).getValue(); | ||||||
|  |  | ||||||
| @@ -1200,7 +1200,7 @@ public class MotionGroup extends VimMotionGroupBase { | |||||||
|     if (fileEditor instanceof TextEditor) { |     if (fileEditor instanceof TextEditor) { | ||||||
|       final Editor editor = ((TextEditor)fileEditor).getEditor(); |       final Editor editor = ((TextEditor)fileEditor).getEditor(); | ||||||
|       ExOutputModel.getInstance(editor).clear(); |       ExOutputModel.getInstance(editor).clear(); | ||||||
|       if (CommandState.getInstance(new IjVimEditor(editor)).getMode() == CommandState.Mode.VISUAL) { |       if (VimStateMachine.getInstance(new IjVimEditor(editor)).getMode() == VimStateMachine.Mode.VISUAL) { | ||||||
|         ModeHelper.exitVisualMode(editor); |         ModeHelper.exitVisualMode(editor); | ||||||
|         KeyHandler.getInstance().reset(new IjVimEditor(editor)); |         KeyHandler.getInstance().reset(new IjVimEditor(editor)); | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ import com.maddyhome.idea.vim.KeyHandler; | |||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.api.*; | import com.maddyhome.idea.vim.api.*; | ||||||
| import com.maddyhome.idea.vim.command.Command; | import com.maddyhome.idea.vim.command.Command; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import com.maddyhome.idea.vim.ex.ExException; | import com.maddyhome.idea.vim.ex.ExException; | ||||||
| import com.maddyhome.idea.vim.ex.InvalidCommandException; | import com.maddyhome.idea.vim.ex.InvalidCommandException; | ||||||
| import com.maddyhome.idea.vim.helper.UiHelper; | import com.maddyhome.idea.vim.helper.UiHelper; | ||||||
| @@ -90,7 +90,7 @@ public class ProcessGroup extends VimProcessGroupBase { | |||||||
|     if (editor.isOneLineMode()) return; |     if (editor.isOneLineMode()) return; | ||||||
|  |  | ||||||
|     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd); |     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd); | ||||||
|     CommandState.getInstance(editor).pushModes(CommandState.Mode.CMD_LINE, CommandState.SubMode.NONE); |     VimStateMachine.getInstance(editor).pushModes(VimStateMachine.Mode.CMD_LINE, VimStateMachine.SubMode.NONE); | ||||||
|     ExEntryPanel panel = ExEntryPanel.getInstance(); |     ExEntryPanel panel = ExEntryPanel.getInstance(); | ||||||
|     panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1); |     panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1); | ||||||
|   } |   } | ||||||
| @@ -108,7 +108,7 @@ public class ProcessGroup extends VimProcessGroupBase { | |||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       CommandState.getInstance(editor).popModes(); |       VimStateMachine.getInstance(editor).popModes(); | ||||||
|       KeyHandler.getInstance().reset(editor); |       KeyHandler.getInstance().reset(editor); | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
| @@ -119,7 +119,7 @@ public class ProcessGroup extends VimProcessGroupBase { | |||||||
|     panel.deactivate(true); |     panel.deactivate(true); | ||||||
|     boolean res = true; |     boolean res = true; | ||||||
|     try { |     try { | ||||||
|       CommandState.getInstance(editor).popModes(); |       VimStateMachine.getInstance(editor).popModes(); | ||||||
|  |  | ||||||
|       logger.debug("processing command"); |       logger.debug("processing command"); | ||||||
|  |  | ||||||
| @@ -152,11 +152,11 @@ public class ProcessGroup extends VimProcessGroupBase { | |||||||
|  |  | ||||||
|   // commands executed from map command / macro should not be added to history |   // commands executed from map command / macro should not be added to history | ||||||
|   private boolean skipHistory(VimEditor editor) { |   private boolean skipHistory(VimEditor editor) { | ||||||
|     return CommandState.getInstance(editor).getMappingState().isExecutingMap() || injector.getMacro().isExecutingMacro(); |     return VimStateMachine.getInstance(editor).getMappingState().isExecutingMap() || injector.getMacro().isExecutingMacro(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void cancelExEntry(final @NotNull VimEditor editor, boolean resetCaret) { |   public void cancelExEntry(final @NotNull VimEditor editor, boolean resetCaret) { | ||||||
|     CommandState.getInstance(editor).popModes(); |     VimStateMachine.getInstance(editor).popModes(); | ||||||
|     KeyHandler.getInstance().reset(editor); |     KeyHandler.getInstance().reset(editor); | ||||||
|     ExEntryPanel panel = ExEntryPanel.getInstance(); |     ExEntryPanel panel = ExEntryPanel.getInstance(); | ||||||
|     panel.deactivate(true, resetCaret); |     panel.deactivate(true, resetCaret); | ||||||
| @@ -165,14 +165,14 @@ public class ProcessGroup extends VimProcessGroupBase { | |||||||
|   @Override |   @Override | ||||||
|   public void startFilterCommand(@NotNull VimEditor editor, ExecutionContext context, @NotNull Command cmd) { |   public void startFilterCommand(@NotNull VimEditor editor, ExecutionContext context, @NotNull Command cmd) { | ||||||
|     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd) + "!"; |     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd) + "!"; | ||||||
|     CommandState.getInstance(editor).pushModes(CommandState.Mode.CMD_LINE, CommandState.SubMode.NONE); |     VimStateMachine.getInstance(editor).pushModes(VimStateMachine.Mode.CMD_LINE, VimStateMachine.SubMode.NONE); | ||||||
|     ExEntryPanel panel = ExEntryPanel.getInstance(); |     ExEntryPanel panel = ExEntryPanel.getInstance(); | ||||||
|     panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1); |     panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private @NotNull String getRange(Editor editor, @NotNull Command cmd) { |   private @NotNull String getRange(Editor editor, @NotNull Command cmd) { | ||||||
|     String initText = ""; |     String initText = ""; | ||||||
|     if (CommandState.getInstance(new IjVimEditor(editor)).getMode() == CommandState.Mode.VISUAL) { |     if (VimStateMachine.getInstance(new IjVimEditor(editor)).getMode() == VimStateMachine.Mode.VISUAL) { | ||||||
|       initText = "'<,'>"; |       initText = "'<,'>"; | ||||||
|     } |     } | ||||||
|     else if (cmd.getRawCount() > 0) { |     else if (cmd.getRawCount() > 0) { | ||||||
|   | |||||||
| @@ -890,6 +890,10 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | |||||||
|   @Override |   @Override | ||||||
|   public void setLastSearchPattern(@Nullable String lastSearchPattern) { |   public void setLastSearchPattern(@Nullable String lastSearchPattern) { | ||||||
|     this.lastSearch = lastSearchPattern; |     this.lastSearch = lastSearchPattern; | ||||||
|  |     if (showSearchHighlight) { | ||||||
|  |       resetIncsearchHighlights(); | ||||||
|  |       updateSearchHighlights(); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ import com.maddyhome.idea.vim.api.ExecutionContext | |||||||
| import com.maddyhome.idea.vim.api.VimCaret | import com.maddyhome.idea.vim.api.VimCaret | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState |  | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.command.isBlock | import com.maddyhome.idea.vim.command.isBlock | ||||||
| import com.maddyhome.idea.vim.command.isChar | import com.maddyhome.idea.vim.command.isChar | ||||||
| import com.maddyhome.idea.vim.command.isLine | import com.maddyhome.idea.vim.command.isLine | ||||||
| @@ -60,10 +60,14 @@ import java.awt.datatransfer.DataFlavor | |||||||
| import kotlin.math.min | import kotlin.math.min | ||||||
|  |  | ||||||
| class PutGroup : VimPutBase() { | class PutGroup : VimPutBase() { | ||||||
|   override fun putTextForCaret(editor: VimEditor, caret: VimCaret, context: ExecutionContext, data: PutData): Boolean { |   override fun putTextForCaret(editor: VimEditor, caret: VimCaret, context: ExecutionContext, data: PutData, updateVisualMarks: Boolean): Boolean { | ||||||
|     val additionalData = collectPreModificationData(editor, data) |     val additionalData = collectPreModificationData(editor, data) | ||||||
|  |     data.visualSelection?.let { deleteSelectedText(editor, data) } | ||||||
|     val processedText = processText(editor, data) ?: return false |     val processedText = processText(editor, data) ?: return false | ||||||
|     putForCaret(editor, caret, data, additionalData, context, processedText) |     putForCaret(editor, caret, data, additionalData, context, processedText) | ||||||
|  |     if (editor.primaryCaret() == caret && updateVisualMarks) { | ||||||
|  |       wrapInsertedTextWithVisualMarks(editor, data, processedText) | ||||||
|  |     } | ||||||
|     return true |     return true | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -75,7 +79,7 @@ class PutGroup : VimPutBase() { | |||||||
|     additionalData: Map<String, Any>, |     additionalData: Map<String, Any>, | ||||||
|   ) { |   ) { | ||||||
|     val visualSelection = data.visualSelection |     val visualSelection = data.visualSelection | ||||||
|     val subMode = visualSelection?.typeInEditor?.toSubMode() ?: CommandState.SubMode.NONE |     val subMode = visualSelection?.typeInEditor?.toSubMode() ?: VimStateMachine.SubMode.NONE | ||||||
|     if (OptionConstants.clipboard_ideaput in ( |     if (OptionConstants.clipboard_ideaput in ( | ||||||
|       injector.optionService |       injector.optionService | ||||||
|         .getOptionValue(OptionScope.GLOBAL, OptionConstants.clipboardName) as VimString |         .getOptionValue(OptionScope.GLOBAL, OptionConstants.clipboardName) as VimString | ||||||
| @@ -113,12 +117,14 @@ class PutGroup : VimPutBase() { | |||||||
|     val startOffsets = prepareDocumentAndGetStartOffsets(editor, caret, text.typeInRegister, data, additionalData) |     val startOffsets = prepareDocumentAndGetStartOffsets(editor, caret, text.typeInRegister, data, additionalData) | ||||||
|  |  | ||||||
|     startOffsets.forEach { startOffset -> |     startOffsets.forEach { startOffset -> | ||||||
|       val subMode = data.visualSelection?.typeInEditor?.toSubMode() ?: CommandState.SubMode.NONE |       val subMode = data.visualSelection?.typeInEditor?.toSubMode() ?: VimStateMachine.SubMode.NONE | ||||||
|       val endOffset = putTextInternal( |       val endOffset = putTextInternal( | ||||||
|         editor, caret, context, text.text, text.typeInRegister, subMode, |         editor, caret, context, text.text, text.typeInRegister, subMode, | ||||||
|         startOffset, data.count, data.indent, data.caretAfterInsertedText |         startOffset, data.count, data.indent, data.caretAfterInsertedText | ||||||
|       ) |       ) | ||||||
|  |       if (caret == editor.primaryCaret()) { | ||||||
|         VimPlugin.getMark().setChangeMarks(editor, TextRange(startOffset, endOffset)) |         VimPlugin.getMark().setChangeMarks(editor, TextRange(startOffset, endOffset)) | ||||||
|  |       } | ||||||
|       moveCaretToEndPosition( |       moveCaretToEndPosition( | ||||||
|         editor, |         editor, | ||||||
|         caret, |         caret, | ||||||
| @@ -233,7 +239,7 @@ class PutGroup : VimPutBase() { | |||||||
|     vimEditor: VimEditor, |     vimEditor: VimEditor, | ||||||
|     vimContext: ExecutionContext, |     vimContext: ExecutionContext, | ||||||
|     text: ProcessedTextData, |     text: ProcessedTextData, | ||||||
|     subMode: CommandState.SubMode, |     subMode: VimStateMachine.SubMode, | ||||||
|     data: PutData, |     data: PutData, | ||||||
|     additionalData: Map<String, Any>, |     additionalData: Map<String, Any>, | ||||||
|   ) { |   ) { | ||||||
|   | |||||||
| @@ -18,18 +18,16 @@ | |||||||
|  |  | ||||||
| package com.maddyhome.idea.vim.group.copy | package com.maddyhome.idea.vim.group.copy | ||||||
|  |  | ||||||
| import com.intellij.openapi.editor.Caret |  | ||||||
| import com.intellij.openapi.editor.Editor |  | ||||||
| import com.intellij.util.containers.ContainerUtil | import com.intellij.util.containers.ContainerUtil | ||||||
| import com.maddyhome.idea.vim.VimPlugin |  | ||||||
| import com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction | import com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction | ||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
|  | import com.maddyhome.idea.vim.api.VimCaret | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
|  | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.Argument | import com.maddyhome.idea.vim.command.Argument | ||||||
| import com.maddyhome.idea.vim.command.OperatorArguments | import com.maddyhome.idea.vim.command.OperatorArguments | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
| import com.maddyhome.idea.vim.group.MotionGroup |  | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| import com.maddyhome.idea.vim.helper.fileSize | import com.maddyhome.idea.vim.helper.fileSize | ||||||
| import com.maddyhome.idea.vim.listener.VimYankListener | import com.maddyhome.idea.vim.listener.VimYankListener | ||||||
| @@ -46,8 +44,8 @@ class YankGroup : YankGroupBase() { | |||||||
|  |  | ||||||
|   fun removeListener(listener: VimYankListener) = yankListeners.remove(listener) |   fun removeListener(listener: VimYankListener) = yankListeners.remove(listener) | ||||||
|  |  | ||||||
|   private fun notifyListeners(editor: Editor, textRange: TextRange) = yankListeners.forEach { |   private fun notifyListeners(editor: VimEditor, textRange: TextRange) = yankListeners.forEach { | ||||||
|     it.yankPerformed(editor, textRange) |     it.yankPerformed(editor.ij, textRange) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -67,32 +65,38 @@ class YankGroup : YankGroupBase() { | |||||||
|     operatorArguments: OperatorArguments |     operatorArguments: OperatorArguments | ||||||
|   ): Boolean { |   ): Boolean { | ||||||
|     val motion = argument.motion |     val motion = argument.motion | ||||||
|  |     val type = if (motion.isLinewiseMotion()) SelectionType.LINE_WISE else SelectionType.CHARACTER_WISE | ||||||
|  |  | ||||||
|     val caretModel = editor.ij.caretModel |     val nativeCaretCount = editor.nativeCarets().size | ||||||
|     if (caretModel.caretCount <= 0) return false |     if (nativeCaretCount <= 0) return false | ||||||
|  |  | ||||||
|     val ranges = ArrayList<Pair<Int, Int>>(caretModel.caretCount) |     val carretToRange = HashMap<VimCaret, TextRange>(nativeCaretCount) | ||||||
|  |     val ranges = ArrayList<Pair<Int, Int>>(nativeCaretCount) | ||||||
|  |  | ||||||
|     // This logic is from original vim |     // This logic is from original vim | ||||||
|     val startOffsets = |     val startOffsets = if (argument.motion.action is MotionDownLess1FirstNonSpaceAction) null else HashMap<VimCaret, Int>(nativeCaretCount) | ||||||
|       if (argument.motion.action is MotionDownLess1FirstNonSpaceAction) null else HashMap<Caret, Int>(caretModel.caretCount) |  | ||||||
|  |  | ||||||
|     for (caret in caretModel.allCarets) { |     for (caret in editor.nativeCarets()) { | ||||||
|       val motionRange = MotionGroup.getMotionRange(editor.ij, caret, context.ij, argument, operatorArguments) |       val motionRange = injector.motion.getMotionRange(editor, caret, context, argument, operatorArguments) | ||||||
|         ?: continue |         ?: continue | ||||||
|  |  | ||||||
|       assert(motionRange.size() == 1) |       assert(motionRange.size() == 1) | ||||||
|       ranges.add(motionRange.startOffset to motionRange.endOffset) |       ranges.add(motionRange.startOffset to motionRange.endOffset) | ||||||
|       startOffsets?.put(caret, motionRange.normalize().startOffset) |       startOffsets?.put(caret, motionRange.normalize().startOffset) | ||||||
|  |       carretToRange[caret] = TextRange(motionRange.startOffset, motionRange.endOffset) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     val type = if (motion.isLinewiseMotion()) SelectionType.LINE_WISE else SelectionType.CHARACTER_WISE |  | ||||||
|     val range = getTextRange(ranges, type) ?: return false |     val range = getTextRange(ranges, type) ?: return false | ||||||
|  |  | ||||||
|     if (range.size() == 0) return false |     if (range.size() == 0) return false | ||||||
|  |  | ||||||
|     val selectionType = if (type == SelectionType.CHARACTER_WISE && range.isMultiple) SelectionType.BLOCK_WISE else type |     return yankRange( | ||||||
|     return yankRange(editor.ij, range, selectionType, startOffsets) |       editor, | ||||||
|  |       carretToRange, | ||||||
|  |       range, | ||||||
|  |       type, | ||||||
|  |       startOffsets | ||||||
|  |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -103,19 +107,21 @@ class YankGroup : YankGroupBase() { | |||||||
|    * @return true if able to yank the lines, false if not |    * @return true if able to yank the lines, false if not | ||||||
|    */ |    */ | ||||||
|   override fun yankLine(editor: VimEditor, count: Int): Boolean { |   override fun yankLine(editor: VimEditor, count: Int): Boolean { | ||||||
|     val caretModel = editor.ij.caretModel |     val caretCount = editor.nativeCarets().size | ||||||
|     val ranges = ArrayList<Pair<Int, Int>>(caretModel.caretCount) |     val ranges = ArrayList<Pair<Int, Int>>(caretCount) | ||||||
|     for (caret in caretModel.allCarets) { |     val caretToRange = HashMap<VimCaret, TextRange>(caretCount) | ||||||
|       val start = VimPlugin.getMotion().moveCaretToLineStart(editor, caret.vim) |     for (caret in editor.nativeCarets()) { | ||||||
|       val end = min(VimPlugin.getMotion().moveCaretToLineEndOffset(editor, caret.vim, count - 1, true) + 1, editor.fileSize().toInt()) |       val start = injector.motion.moveCaretToLineStart(editor, caret) | ||||||
|  |       val end = min(injector.motion.moveCaretToLineEndOffset(editor, caret, count - 1, true) + 1, editor.fileSize().toInt()) | ||||||
|  |  | ||||||
|       if (end == -1) continue |       if (end == -1) continue | ||||||
|  |  | ||||||
|       ranges.add(start to end) |       ranges.add(start to end) | ||||||
|  |       caretToRange[caret] = TextRange(start, end) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     val range = getTextRange(ranges, SelectionType.LINE_WISE) ?: return false |     val range = getTextRange(ranges, SelectionType.LINE_WISE) ?: return false | ||||||
|     return yankRange(editor.ij, range, SelectionType.LINE_WISE, null) |     return yankRange(editor, caretToRange, range, SelectionType.LINE_WISE, null) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -129,6 +135,7 @@ class YankGroup : YankGroupBase() { | |||||||
|   override fun yankRange(editor: VimEditor, range: TextRange?, type: SelectionType, moveCursor: Boolean): Boolean { |   override fun yankRange(editor: VimEditor, range: TextRange?, type: SelectionType, moveCursor: Boolean): Boolean { | ||||||
|     range ?: return false |     range ?: return false | ||||||
|  |  | ||||||
|  |     val caretToRange = HashMap<VimCaret, TextRange>() | ||||||
|     val selectionType = if (type == SelectionType.CHARACTER_WISE && range.isMultiple) SelectionType.BLOCK_WISE else type |     val selectionType = if (type == SelectionType.CHARACTER_WISE && range.isMultiple) SelectionType.BLOCK_WISE else type | ||||||
|  |  | ||||||
|     if (type == SelectionType.LINE_WISE) { |     if (type == SelectionType.LINE_WISE) { | ||||||
| @@ -143,24 +150,25 @@ class YankGroup : YankGroupBase() { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     val caretModel = editor.ij.caretModel |  | ||||||
|     val rangeStartOffsets = range.startOffsets |     val rangeStartOffsets = range.startOffsets | ||||||
|     val rangeEndOffsets = range.endOffsets |     val rangeEndOffsets = range.endOffsets | ||||||
|  |  | ||||||
|     return if (moveCursor) { |     val startOffsets = HashMap<VimCaret, Int>(editor.nativeCarets().size) | ||||||
|       val startOffsets = HashMap<Caret, Int>(caretModel.caretCount) |  | ||||||
|     if (type == SelectionType.BLOCK_WISE) { |     if (type == SelectionType.BLOCK_WISE) { | ||||||
|         startOffsets[caretModel.primaryCaret] = range.normalize().startOffset |       startOffsets[editor.primaryCaret()] = range.normalize().startOffset | ||||||
|  |       caretToRange[editor.primaryCaret()] = range | ||||||
|     } else { |     } else { | ||||||
|         val carets = caretModel.allCarets |       for ((i, caret) in editor.nativeCarets().withIndex()) { | ||||||
|         for (i in carets.indices) { |         val textRange = TextRange(rangeStartOffsets[i], rangeEndOffsets[i]) | ||||||
|           startOffsets[carets[i]] = TextRange(rangeStartOffsets[i], rangeEndOffsets[i]).normalize().startOffset |         startOffsets[caret] = textRange.normalize().startOffset | ||||||
|  |         caretToRange[caret] = textRange | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|       yankRange(editor.ij, range, selectionType, startOffsets) |     return if (moveCursor) { | ||||||
|  |       yankRange(editor, caretToRange, range, selectionType, startOffsets) | ||||||
|     } else { |     } else { | ||||||
|       yankRange(editor.ij, range, selectionType, null) |       yankRange(editor, caretToRange, range, selectionType, null) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -192,15 +200,20 @@ class YankGroup : YankGroupBase() { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private fun yankRange( |   private fun yankRange( | ||||||
|     editor: Editor, |     editor: VimEditor, | ||||||
|  |     caretToRange: Map<VimCaret, TextRange>, | ||||||
|     range: TextRange, |     range: TextRange, | ||||||
|     type: SelectionType, |     type: SelectionType, | ||||||
|     startOffsets: Map<Caret, Int>?, |     startOffsets: Map<VimCaret, Int>?, | ||||||
|   ): Boolean { |   ): Boolean { | ||||||
|     startOffsets?.forEach { (caret, offset) -> MotionGroup.moveCaret(editor, caret, offset) } |     startOffsets?.forEach { (caret, offset) -> injector.motion.moveCaret(editor, caret, offset) } | ||||||
|  |  | ||||||
|     notifyListeners(editor, range) |     notifyListeners(editor, range) | ||||||
|  |  | ||||||
|     return VimPlugin.getRegister().storeText(editor.vim, range, type, false) |     var result = true | ||||||
|  |     for ((caret, range) in caretToRange) { | ||||||
|  |       result = caret.registerStorage.storeText(editor, range, type, false) && result | ||||||
|  |     } | ||||||
|  |     return result | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -23,9 +23,9 @@ import com.intellij.openapi.diagnostic.trace | |||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.KeyHandler | import com.maddyhome.idea.vim.KeyHandler | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | import com.maddyhome.idea.vim.helper.EditorDataContext | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.editorMode | ||||||
| import com.maddyhome.idea.vim.helper.exitSelectMode | import com.maddyhome.idea.vim.helper.exitSelectMode | ||||||
| import com.maddyhome.idea.vim.helper.exitVisualMode | import com.maddyhome.idea.vim.helper.exitVisualMode | ||||||
| import com.maddyhome.idea.vim.helper.hasVisualSelection | import com.maddyhome.idea.vim.helper.hasVisualSelection | ||||||
| @@ -35,8 +35,8 @@ import com.maddyhome.idea.vim.helper.inSelectMode | |||||||
| import com.maddyhome.idea.vim.helper.inVisualMode | import com.maddyhome.idea.vim.helper.inVisualMode | ||||||
| import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere | import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere | ||||||
| import com.maddyhome.idea.vim.helper.isTemplateActive | import com.maddyhome.idea.vim.helper.isTemplateActive | ||||||
| import com.maddyhome.idea.vim.helper.mode |  | ||||||
| import com.maddyhome.idea.vim.helper.popAllModes | import com.maddyhome.idea.vim.helper.popAllModes | ||||||
|  | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.listener.VimListenerManager | import com.maddyhome.idea.vim.listener.VimListenerManager | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| @@ -58,7 +58,7 @@ object IdeaSelectionControl { | |||||||
|     editor: Editor, |     editor: Editor, | ||||||
|     selectionSource: VimListenerManager.SelectionSource = VimListenerManager.SelectionSource.OTHER, |     selectionSource: VimListenerManager.SelectionSource = VimListenerManager.SelectionSource.OTHER, | ||||||
|   ) { |   ) { | ||||||
|     VimVisualTimer.singleTask(editor.mode) { initialMode -> |     VimVisualTimer.singleTask(editor.editorMode) { initialMode -> | ||||||
|  |  | ||||||
|       if (editor.isIdeaVimDisabledHere) return@singleTask |       if (editor.isIdeaVimDisabledHere) return@singleTask | ||||||
|  |  | ||||||
| @@ -80,13 +80,13 @@ object IdeaSelectionControl { | |||||||
|           return@singleTask |           return@singleTask | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         logger.debug("Some carets have selection. State before adjustment: ${editor.vim.commandState.toSimpleString()}") |         logger.debug("Some carets have selection. State before adjustment: ${editor.vim.vimStateMachine.toSimpleString()}") | ||||||
|  |  | ||||||
|         editor.popAllModes() |         editor.popAllModes() | ||||||
|  |  | ||||||
|         activateMode(editor, chooseSelectionMode(editor, selectionSource, true)) |         activateMode(editor, chooseSelectionMode(editor, selectionSource, true)) | ||||||
|       } else { |       } else { | ||||||
|         logger.debug("None of carets have selection. State before adjustment: ${editor.vim.commandState.toSimpleString()}") |         logger.debug("None of carets have selection. State before adjustment: ${editor.vim.vimStateMachine.toSimpleString()}") | ||||||
|         if (editor.inVisualMode) editor.exitVisualMode() |         if (editor.inVisualMode) editor.exitVisualMode() | ||||||
|         if (editor.inSelectMode) editor.exitSelectMode(false) |         if (editor.inSelectMode) editor.exitSelectMode(false) | ||||||
|  |  | ||||||
| @@ -96,7 +96,7 @@ object IdeaSelectionControl { | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       KeyHandler.getInstance().reset(editor.vim) |       KeyHandler.getInstance().reset(editor.vim) | ||||||
|       logger.debug("${editor.mode} is enabled") |       logger.debug("${editor.editorMode} is enabled") | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -110,68 +110,68 @@ object IdeaSelectionControl { | |||||||
|    * This method is created to improve user experience. It allows avoiding delay in some operations |    * This method is created to improve user experience. It allows avoiding delay in some operations | ||||||
|    *   (because [controlNonVimSelectionChange] is not executed immediately) |    *   (because [controlNonVimSelectionChange] is not executed immediately) | ||||||
|    */ |    */ | ||||||
|   fun predictMode(editor: Editor, selectionSource: VimListenerManager.SelectionSource): CommandState.Mode { |   fun predictMode(editor: Editor, selectionSource: VimListenerManager.SelectionSource): VimStateMachine.Mode { | ||||||
|     if (editor.selectionModel.hasSelection(true)) { |     if (editor.selectionModel.hasSelection(true)) { | ||||||
|       if (dontChangeMode(editor)) return editor.mode |       if (dontChangeMode(editor)) return editor.editorMode | ||||||
|       return chooseSelectionMode(editor, selectionSource, false) |       return chooseSelectionMode(editor, selectionSource, false) | ||||||
|     } else { |     } else { | ||||||
|       return chooseNonSelectionMode(editor) |       return chooseNonSelectionMode(editor) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private fun activateMode(editor: Editor, mode: CommandState.Mode) { |   private fun activateMode(editor: Editor, mode: VimStateMachine.Mode) { | ||||||
|     when (mode) { |     when (mode) { | ||||||
|       CommandState.Mode.VISUAL -> VimPlugin.getVisualMotion() |       VimStateMachine.Mode.VISUAL -> VimPlugin.getVisualMotion() | ||||||
|         .enterVisualMode(editor.vim, VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim)) |         .enterVisualMode(editor.vim, VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim)) | ||||||
|       CommandState.Mode.SELECT -> VimPlugin.getVisualMotion() |       VimStateMachine.Mode.SELECT -> VimPlugin.getVisualMotion() | ||||||
|         .enterSelectMode(editor.vim, VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim)) |         .enterSelectMode(editor.vim, VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim)) | ||||||
|       CommandState.Mode.INSERT -> VimPlugin.getChange().insertBeforeCursor( |       VimStateMachine.Mode.INSERT -> VimPlugin.getChange().insertBeforeCursor( | ||||||
|         editor.vim, |         editor.vim, | ||||||
|         EditorDataContext.init(editor).vim |         EditorDataContext.init(editor).vim | ||||||
|       ) |       ) | ||||||
|       CommandState.Mode.COMMAND -> Unit |       VimStateMachine.Mode.COMMAND -> Unit | ||||||
|       else -> error("Unexpected mode: $mode") |       else -> error("Unexpected mode: $mode") | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private fun dontChangeMode(editor: Editor): Boolean = |   private fun dontChangeMode(editor: Editor): Boolean = | ||||||
|     editor.isTemplateActive() && (IdeaRefactorModeHelper.keepMode() || editor.mode.hasVisualSelection) |     editor.isTemplateActive() && (IdeaRefactorModeHelper.keepMode() || editor.editorMode.hasVisualSelection) | ||||||
|  |  | ||||||
|   private fun chooseNonSelectionMode(editor: Editor): CommandState.Mode { |   private fun chooseNonSelectionMode(editor: Editor): VimStateMachine.Mode { | ||||||
|     val templateActive = editor.isTemplateActive() |     val templateActive = editor.isTemplateActive() | ||||||
|     if (templateActive && editor.inNormalMode || editor.inInsertMode) { |     if (templateActive && editor.inNormalMode || editor.inInsertMode) { | ||||||
|       return CommandState.Mode.INSERT |       return VimStateMachine.Mode.INSERT | ||||||
|     } |     } | ||||||
|     return CommandState.Mode.COMMAND |     return VimStateMachine.Mode.COMMAND | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private fun chooseSelectionMode( |   private fun chooseSelectionMode( | ||||||
|     editor: Editor, |     editor: Editor, | ||||||
|     selectionSource: VimListenerManager.SelectionSource, |     selectionSource: VimListenerManager.SelectionSource, | ||||||
|     logReason: Boolean, |     logReason: Boolean, | ||||||
|   ): CommandState.Mode { |   ): VimStateMachine.Mode { | ||||||
|     val selectmode = (VimPlugin.getOptionService().getOptionValue(OptionScope.LOCAL(IjVimEditor(editor)), OptionConstants.selectmodeName) as VimString).value |     val selectmode = (VimPlugin.getOptionService().getOptionValue(OptionScope.LOCAL(IjVimEditor(editor)), OptionConstants.selectmodeName) as VimString).value | ||||||
|     return when { |     return when { | ||||||
|       editor.isOneLineMode -> { |       editor.isOneLineMode -> { | ||||||
|         if (logReason) logger.debug("Enter select mode. Reason: one line mode") |         if (logReason) logger.debug("Enter select mode. Reason: one line mode") | ||||||
|         CommandState.Mode.SELECT |         VimStateMachine.Mode.SELECT | ||||||
|       } |       } | ||||||
|       selectionSource == VimListenerManager.SelectionSource.MOUSE && OptionConstants.selectmode_mouse in selectmode -> { |       selectionSource == VimListenerManager.SelectionSource.MOUSE && OptionConstants.selectmode_mouse in selectmode -> { | ||||||
|         if (logReason) logger.debug("Enter select mode. Selection source is mouse and selectMode option has mouse") |         if (logReason) logger.debug("Enter select mode. Selection source is mouse and selectMode option has mouse") | ||||||
|         CommandState.Mode.SELECT |         VimStateMachine.Mode.SELECT | ||||||
|       } |       } | ||||||
|       editor.isTemplateActive() && IdeaRefactorModeHelper.selectMode() -> { |       editor.isTemplateActive() && IdeaRefactorModeHelper.selectMode() -> { | ||||||
|         if (logReason) logger.debug("Enter select mode. Template is active and selectMode has template") |         if (logReason) logger.debug("Enter select mode. Template is active and selectMode has template") | ||||||
|         CommandState.Mode.SELECT |         VimStateMachine.Mode.SELECT | ||||||
|       } |       } | ||||||
|       selectionSource == VimListenerManager.SelectionSource.OTHER && |       selectionSource == VimListenerManager.SelectionSource.OTHER && | ||||||
|         OptionConstants.selectmode_ideaselection in (VimPlugin.getOptionService().getOptionValue(OptionScope.GLOBAL, OptionConstants.selectmodeName) as VimString).value -> { |         OptionConstants.selectmode_ideaselection in (VimPlugin.getOptionService().getOptionValue(OptionScope.GLOBAL, OptionConstants.selectmodeName) as VimString).value -> { | ||||||
|         if (logReason) logger.debug("Enter select mode. Selection source is OTHER and selectMode has refactoring") |         if (logReason) logger.debug("Enter select mode. Selection source is OTHER and selectMode has refactoring") | ||||||
|         CommandState.Mode.SELECT |         VimStateMachine.Mode.SELECT | ||||||
|       } |       } | ||||||
|       else -> { |       else -> { | ||||||
|         if (logReason) logger.debug("Enter visual mode") |         if (logReason) logger.debug("Enter visual mode") | ||||||
|         CommandState.Mode.VISUAL |         VimStateMachine.Mode.VISUAL | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ | |||||||
| package com.maddyhome.idea.vim.group.visual | package com.maddyhome.idea.vim.group.visual | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.group.visual.VimVisualTimer.mode | import com.maddyhome.idea.vim.group.visual.VimVisualTimer.mode | ||||||
| import com.maddyhome.idea.vim.group.visual.VimVisualTimer.singleTask | import com.maddyhome.idea.vim.group.visual.VimVisualTimer.singleTask | ||||||
| import com.maddyhome.idea.vim.options.OptionScope | import com.maddyhome.idea.vim.options.OptionScope | ||||||
| @@ -66,9 +66,9 @@ import javax.swing.Timer | |||||||
| object VimVisualTimer { | object VimVisualTimer { | ||||||
|  |  | ||||||
|   var swingTimer: Timer? = null |   var swingTimer: Timer? = null | ||||||
|   var mode: CommandState.Mode? = null |   var mode: VimStateMachine.Mode? = null | ||||||
|  |  | ||||||
|   inline fun singleTask(currentMode: CommandState.Mode, crossinline task: (initialMode: CommandState.Mode?) -> Unit) { |   inline fun singleTask(currentMode: VimStateMachine.Mode, crossinline task: (initialMode: VimStateMachine.Mode?) -> Unit) { | ||||||
|     swingTimer?.stop() |     swingTimer?.stop() | ||||||
|  |  | ||||||
|     if (mode == null) mode = currentMode |     if (mode == null) mode = currentMode | ||||||
| @@ -92,7 +92,7 @@ object VimVisualTimer { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   inline fun timerAction(task: (initialMode: CommandState.Mode?) -> Unit) { |   inline fun timerAction(task: (initialMode: VimStateMachine.Mode?) -> Unit) { | ||||||
|     task(mode) |     task(mode) | ||||||
|     swingTimer = null |     swingTimer = null | ||||||
|     mode = null |     mode = null | ||||||
|   | |||||||
| @@ -23,13 +23,13 @@ import com.intellij.openapi.editor.Editor | |||||||
| import com.intellij.openapi.editor.VisualPosition | import com.intellij.openapi.editor.VisualPosition | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.VimMotionGroupBase | import com.maddyhome.idea.vim.api.VimMotionGroupBase | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
|  | import com.maddyhome.idea.vim.helper.editorMode | ||||||
| import com.maddyhome.idea.vim.helper.inBlockSubMode | import com.maddyhome.idea.vim.helper.inBlockSubMode | ||||||
| import com.maddyhome.idea.vim.helper.inSelectMode | import com.maddyhome.idea.vim.helper.inSelectMode | ||||||
| import com.maddyhome.idea.vim.helper.inVisualMode | import com.maddyhome.idea.vim.helper.inVisualMode | ||||||
| import com.maddyhome.idea.vim.helper.isEndAllowed | import com.maddyhome.idea.vim.helper.isEndAllowed | ||||||
| import com.maddyhome.idea.vim.helper.mode |  | ||||||
| import com.maddyhome.idea.vim.helper.moveToInlayAwareOffset | import com.maddyhome.idea.vim.helper.moveToInlayAwareOffset | ||||||
| import com.maddyhome.idea.vim.helper.subMode | import com.maddyhome.idea.vim.helper.subMode | ||||||
| import com.maddyhome.idea.vim.helper.updateCaretsVisualAttributes | import com.maddyhome.idea.vim.helper.updateCaretsVisualAttributes | ||||||
| @@ -108,7 +108,7 @@ val Caret.vimLeadSelectionOffset: Int | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       return if (editor.subMode == CommandState.SubMode.VISUAL_LINE) { |       return if (editor.subMode == VimStateMachine.SubMode.VISUAL_LINE) { | ||||||
|         val selectionStartLine = editor.offsetToLogicalPosition(selectionStart).line |         val selectionStartLine = editor.offsetToLogicalPosition(selectionStart).line | ||||||
|         val caretLine = editor.offsetToLogicalPosition(this.offset).line |         val caretLine = editor.offsetToLogicalPosition(this.offset).line | ||||||
|         if (caretLine == selectionStartLine) { |         if (caretLine == selectionStartLine) { | ||||||
| @@ -132,8 +132,8 @@ val Caret.vimLeadSelectionOffset: Int | |||||||
|     return caretOffset |     return caretOffset | ||||||
|   } |   } | ||||||
|  |  | ||||||
| fun moveCaretOneCharLeftFromSelectionEnd(editor: Editor, predictedMode: CommandState.Mode) { | fun moveCaretOneCharLeftFromSelectionEnd(editor: Editor, predictedMode: VimStateMachine.Mode) { | ||||||
|   if (predictedMode != CommandState.Mode.VISUAL) { |   if (predictedMode != VimStateMachine.Mode.VISUAL) { | ||||||
|     if (!predictedMode.isEndAllowed) { |     if (!predictedMode.isEndAllowed) { | ||||||
|       editor.caretModel.allCarets.forEach { caret -> |       editor.caretModel.allCarets.forEach { caret -> | ||||||
|         val lineEnd = EditorHelper.getLineEndForOffset(editor, caret.offset) |         val lineEnd = EditorHelper.getLineEndForOffset(editor, caret.offset) | ||||||
| @@ -161,18 +161,18 @@ private fun setVisualSelection(selectionStart: Int, selectionEnd: Int, caret: Ca | |||||||
|   val (start, end) = if (selectionStart > selectionEnd) selectionEnd to selectionStart else selectionStart to selectionEnd |   val (start, end) = if (selectionStart > selectionEnd) selectionEnd to selectionStart else selectionStart to selectionEnd | ||||||
|   val editor = caret.editor |   val editor = caret.editor | ||||||
|   val subMode = editor.subMode |   val subMode = editor.subMode | ||||||
|   val mode = editor.mode |   val mode = editor.editorMode | ||||||
|   val vimEditor = IjVimEditor(editor) |   val vimEditor = IjVimEditor(editor) | ||||||
|   when (subMode) { |   when (subMode) { | ||||||
|     CommandState.SubMode.VISUAL_CHARACTER -> { |     VimStateMachine.SubMode.VISUAL_CHARACTER -> { | ||||||
|       val (nativeStart, nativeEnd) = charToNativeSelection(vimEditor, start, end, mode) |       val (nativeStart, nativeEnd) = charToNativeSelection(vimEditor, start, end, mode) | ||||||
|       caret.vimSetSystemSelectionSilently(nativeStart, nativeEnd) |       caret.vimSetSystemSelectionSilently(nativeStart, nativeEnd) | ||||||
|     } |     } | ||||||
|     CommandState.SubMode.VISUAL_LINE -> { |     VimStateMachine.SubMode.VISUAL_LINE -> { | ||||||
|       val (nativeStart, nativeEnd) = lineToNativeSelection(vimEditor, start, end) |       val (nativeStart, nativeEnd) = lineToNativeSelection(vimEditor, start, end) | ||||||
|       caret.vimSetSystemSelectionSilently(nativeStart, nativeEnd) |       caret.vimSetSystemSelectionSilently(nativeStart, nativeEnd) | ||||||
|     } |     } | ||||||
|     CommandState.SubMode.VISUAL_BLOCK -> { |     VimStateMachine.SubMode.VISUAL_BLOCK -> { | ||||||
|       editor.caretModel.removeSecondaryCarets() |       editor.caretModel.removeSecondaryCarets() | ||||||
|  |  | ||||||
|       // Set system selection |       // Set system selection | ||||||
| @@ -200,7 +200,7 @@ private fun setVisualSelection(selectionStart: Int, selectionEnd: Int, caret: Ca | |||||||
|           // Put right caret position for tab character |           // Put right caret position for tab character | ||||||
|           aCaret.moveToVisualPosition(visualPosition) |           aCaret.moveToVisualPosition(visualPosition) | ||||||
|         } |         } | ||||||
|         if (mode != CommandState.Mode.SELECT && |         if (mode != VimStateMachine.Mode.SELECT && | ||||||
|           !EditorHelper.isLineEmpty(editor, line, false) && |           !EditorHelper.isLineEmpty(editor, line, false) && | ||||||
|           aCaret.offset == aCaret.selectionEnd && |           aCaret.offset == aCaret.selectionEnd && | ||||||
|           aCaret.selectionEnd - 1 >= lineStartOffset && |           aCaret.selectionEnd - 1 >= lineStartOffset && | ||||||
|   | |||||||
| @@ -19,22 +19,33 @@ | |||||||
| package com.maddyhome.idea.vim.group.visual | package com.maddyhome.idea.vim.group.visual | ||||||
|  |  | ||||||
| import com.intellij.find.FindManager | import com.intellij.find.FindManager | ||||||
|  | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.VimVisualMotionGroupBase | import com.maddyhome.idea.vim.api.VimVisualMotionGroupBase | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.CommandState | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
|  | import com.maddyhome.idea.vim.command.engine | ||||||
| import com.maddyhome.idea.vim.newapi.ij | import com.maddyhome.idea.vim.newapi.ij | ||||||
|  | import com.maddyhome.idea.vim.newapi.vim | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author Alex Plate |  * @author Alex Plate | ||||||
|  */ |  */ | ||||||
| class VisualMotionGroup : VimVisualMotionGroupBase() { | class VisualMotionGroup : VimVisualMotionGroupBase() { | ||||||
|   override fun autodetectVisualSubmode(editor: VimEditor): CommandState.SubMode { |   override fun autodetectVisualSubmode(editor: VimEditor): VimStateMachine.SubMode { | ||||||
|     // IJ specific. See https://youtrack.jetbrains.com/issue/VIM-1924. |     // IJ specific. See https://youtrack.jetbrains.com/issue/VIM-1924. | ||||||
|     val project = editor.ij.project |     val project = editor.ij.project | ||||||
|     if (project != null && FindManager.getInstance(project).selectNextOccurrenceWasPerformed()) { |     if (project != null && FindManager.getInstance(project).selectNextOccurrenceWasPerformed()) { | ||||||
|       return CommandState.SubMode.VISUAL_CHARACTER |       return VimStateMachine.SubMode.VISUAL_CHARACTER | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return super.autodetectVisualSubmode(editor) |     return super.autodetectVisualSubmode(editor) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * COMPATIBILITY-LAYER: Added a method | ||||||
|  |    */ | ||||||
|  |   fun enterVisualMode(editor: Editor, subMode: CommandState.SubMode? = null): Boolean { | ||||||
|  |     return this.enterVisualMode(editor.vim, subMode?.engine) | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ package com.maddyhome.idea.vim.handler | |||||||
| import com.intellij.serviceContainer.BaseKeyedLazyInstance | import com.intellij.serviceContainer.BaseKeyedLazyInstance | ||||||
| import com.intellij.util.SmartList | import com.intellij.util.SmartList | ||||||
| import com.intellij.util.xmlb.annotations.Attribute | import com.intellij.util.xmlb.annotations.Attribute | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import javax.swing.KeyStroke | import javax.swing.KeyStroke | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ import com.intellij.openapi.editor.CaretVisualAttributes | |||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.intellij.openapi.editor.ex.EditorEx | import com.intellij.openapi.editor.ex.EditorEx | ||||||
| import com.intellij.openapi.editor.ex.EditorSettingsExternalizable | import com.intellij.openapi.editor.ex.EditorSettingsExternalizable | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import com.maddyhome.idea.vim.options.OptionChangeListener | import com.maddyhome.idea.vim.options.OptionChangeListener | ||||||
| import com.maddyhome.idea.vim.options.helpers.GuiCursorMode | import com.maddyhome.idea.vim.options.helpers.GuiCursorMode | ||||||
| @@ -75,7 +75,7 @@ object GuicursorChangeListener : OptionChangeListener<VimDataType> { | |||||||
| } | } | ||||||
|  |  | ||||||
| private fun Editor.guicursorMode(): GuiCursorMode { | private fun Editor.guicursorMode(): GuiCursorMode { | ||||||
|   if (this.vim.commandState.isReplaceCharacter) { |   if (this.vim.vimStateMachine.isReplaceCharacter) { | ||||||
|     // Can be true for NORMAL and VISUAL |     // Can be true for NORMAL and VISUAL | ||||||
|     return GuiCursorMode.REPLACE |     return GuiCursorMode.REPLACE | ||||||
|   } |   } | ||||||
| @@ -84,18 +84,18 @@ private fun Editor.guicursorMode(): GuiCursorMode { | |||||||
|   // makes much more use of SELECT than Vim does (e.g. it's the default for idearefactormode) so it makes sense for us |   // makes much more use of SELECT than Vim does (e.g. it's the default for idearefactormode) so it makes sense for us | ||||||
|   // to more visually distinguish VISUAL and SELECT. So we use INSERT; a selection and the insert caret is intuitively |   // to more visually distinguish VISUAL and SELECT. So we use INSERT; a selection and the insert caret is intuitively | ||||||
|   // the same as SELECT |   // the same as SELECT | ||||||
|   return when (mode) { |   return when (editorMode) { | ||||||
|     CommandState.Mode.COMMAND -> GuiCursorMode.NORMAL |     VimStateMachine.Mode.COMMAND -> GuiCursorMode.NORMAL | ||||||
|     CommandState.Mode.VISUAL -> GuiCursorMode.VISUAL // TODO: VISUAL_EXCLUSIVE |     VimStateMachine.Mode.VISUAL -> GuiCursorMode.VISUAL // TODO: VISUAL_EXCLUSIVE | ||||||
|     CommandState.Mode.SELECT -> GuiCursorMode.INSERT |     VimStateMachine.Mode.SELECT -> GuiCursorMode.INSERT | ||||||
|     CommandState.Mode.INSERT -> GuiCursorMode.INSERT |     VimStateMachine.Mode.INSERT -> GuiCursorMode.INSERT | ||||||
|     CommandState.Mode.OP_PENDING -> GuiCursorMode.OP_PENDING |     VimStateMachine.Mode.OP_PENDING -> GuiCursorMode.OP_PENDING | ||||||
|     CommandState.Mode.REPLACE -> GuiCursorMode.REPLACE |     VimStateMachine.Mode.REPLACE -> GuiCursorMode.REPLACE | ||||||
|     // This doesn't handle ci and cr, but we don't care - our CMD_LINE will never call this |     // This doesn't handle ci and cr, but we don't care - our CMD_LINE will never call this | ||||||
|     CommandState.Mode.CMD_LINE -> GuiCursorMode.CMD_LINE |     VimStateMachine.Mode.CMD_LINE -> GuiCursorMode.CMD_LINE | ||||||
|     CommandState.Mode.INSERT_NORMAL -> GuiCursorMode.NORMAL |     VimStateMachine.Mode.INSERT_NORMAL -> GuiCursorMode.NORMAL | ||||||
|     CommandState.Mode.INSERT_VISUAL -> GuiCursorMode.VISUAL |     VimStateMachine.Mode.INSERT_VISUAL -> GuiCursorMode.VISUAL | ||||||
|     CommandState.Mode.INSERT_SELECT -> GuiCursorMode.INSERT |     VimStateMachine.Mode.INSERT_SELECT -> GuiCursorMode.INSERT | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ class CommandLineHelper : VimCommandLineHelper { | |||||||
|  |  | ||||||
|   override fun inputString(vimEditor: VimEditor, prompt: String, finishOn: Char?): String? { |   override fun inputString(vimEditor: VimEditor, prompt: String, finishOn: Char?): String? { | ||||||
|     val editor = vimEditor.ij |     val editor = vimEditor.ij | ||||||
|     if (vimEditor.commandState.isDotRepeatInProgress) { |     if (vimEditor.vimStateMachine.isDotRepeatInProgress) { | ||||||
|       val input = Extension.consumeString() |       val input = Extension.consumeString() | ||||||
|       return input ?: error("Not enough strings saved: ${Extension.lastExtensionHandler}") |       return input ?: error("Not enough strings saved: ${Extension.lastExtensionHandler}") | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -23,89 +23,104 @@ package com.maddyhome.idea.vim.helper | |||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.CommandState | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
|  | import com.maddyhome.idea.vim.command.engine | ||||||
|  | import com.maddyhome.idea.vim.command.ij | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
|  |  | ||||||
| val Editor.isEndAllowed: Boolean | val Editor.isEndAllowed: Boolean | ||||||
|   get() = when (this.mode) { |   get() = when (this.editorMode) { | ||||||
|     CommandState.Mode.INSERT, CommandState.Mode.VISUAL, CommandState.Mode.SELECT, CommandState.Mode.INSERT_VISUAL, CommandState.Mode.INSERT_SELECT -> true |     VimStateMachine.Mode.INSERT, VimStateMachine.Mode.VISUAL, VimStateMachine.Mode.SELECT, VimStateMachine.Mode.INSERT_VISUAL, VimStateMachine.Mode.INSERT_SELECT -> true | ||||||
|     CommandState.Mode.COMMAND, CommandState.Mode.CMD_LINE, CommandState.Mode.REPLACE, CommandState.Mode.OP_PENDING, CommandState.Mode.INSERT_NORMAL -> { |     VimStateMachine.Mode.COMMAND, VimStateMachine.Mode.CMD_LINE, VimStateMachine.Mode.REPLACE, VimStateMachine.Mode.OP_PENDING, VimStateMachine.Mode.INSERT_NORMAL -> { | ||||||
|       // One day we'll use a proper insert_normal mode |       // One day we'll use a proper insert_normal mode | ||||||
|       if (this.mode.inSingleMode) true else usesVirtualSpace |       if (this.editorMode.inSingleMode) true else usesVirtualSpace | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| val CommandState.Mode.isEndAllowedIgnoringOnemore: Boolean | val VimStateMachine.Mode.isEndAllowedIgnoringOnemore: Boolean | ||||||
|   get() = when (this) { |   get() = when (this) { | ||||||
|     CommandState.Mode.INSERT, CommandState.Mode.VISUAL, CommandState.Mode.SELECT -> true |     VimStateMachine.Mode.INSERT, VimStateMachine.Mode.VISUAL, VimStateMachine.Mode.SELECT -> true | ||||||
|     CommandState.Mode.COMMAND, CommandState.Mode.CMD_LINE, CommandState.Mode.REPLACE, CommandState.Mode.OP_PENDING -> false |     VimStateMachine.Mode.COMMAND, VimStateMachine.Mode.CMD_LINE, VimStateMachine.Mode.REPLACE, VimStateMachine.Mode.OP_PENDING -> false | ||||||
|     CommandState.Mode.INSERT_NORMAL -> false |     VimStateMachine.Mode.INSERT_NORMAL -> false | ||||||
|     CommandState.Mode.INSERT_VISUAL -> true |     VimStateMachine.Mode.INSERT_VISUAL -> true | ||||||
|     CommandState.Mode.INSERT_SELECT -> true |     VimStateMachine.Mode.INSERT_SELECT -> true | ||||||
|   } |   } | ||||||
|  |  | ||||||
| val CommandState.Mode.hasVisualSelection | val VimStateMachine.Mode.hasVisualSelection | ||||||
|   get() = when (this) { |   get() = when (this) { | ||||||
|     CommandState.Mode.VISUAL, CommandState.Mode.SELECT -> true |     VimStateMachine.Mode.VISUAL, VimStateMachine.Mode.SELECT -> true | ||||||
|     CommandState.Mode.REPLACE, CommandState.Mode.CMD_LINE, CommandState.Mode.COMMAND, CommandState.Mode.INSERT, CommandState.Mode.OP_PENDING -> false |     VimStateMachine.Mode.REPLACE, VimStateMachine.Mode.CMD_LINE, VimStateMachine.Mode.COMMAND, VimStateMachine.Mode.INSERT, VimStateMachine.Mode.OP_PENDING -> false | ||||||
|     CommandState.Mode.INSERT_NORMAL -> false |     VimStateMachine.Mode.INSERT_NORMAL -> false | ||||||
|     CommandState.Mode.INSERT_VISUAL -> true |     VimStateMachine.Mode.INSERT_VISUAL -> true | ||||||
|     CommandState.Mode.INSERT_SELECT -> true |     VimStateMachine.Mode.INSERT_SELECT -> true | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | val Editor.editorMode | ||||||
|  |   get() = this.vim.vimStateMachine.mode | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * COMPATIBILITY-LAYER: New method | ||||||
|  |  */ | ||||||
| val Editor.mode | val Editor.mode | ||||||
|   get() = this.vim.commandState.mode |   get() = this.vim.vimStateMachine.mode.ij | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * COMPATIBILITY-LAYER: New method | ||||||
|  |  */ | ||||||
|  | val CommandState.Mode.isEndAllowed: Boolean | ||||||
|  |   get() = this.engine.isEndAllowed | ||||||
|  |  | ||||||
| var Editor.subMode | var Editor.subMode | ||||||
|   get() = this.vim.commandState.subMode |   get() = this.vim.vimStateMachine.subMode | ||||||
|   set(value) { |   set(value) { | ||||||
|     this.vim.commandState.subMode = value |     this.vim.vimStateMachine.subMode = value | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @get:JvmName("inNormalMode") | @get:JvmName("inNormalMode") | ||||||
| val Editor.inNormalMode | val Editor.inNormalMode | ||||||
|   get() = this.mode.inNormalMode |   get() = this.editorMode.inNormalMode | ||||||
|  |  | ||||||
| @get:JvmName("inNormalMode") | @get:JvmName("inNormalMode") | ||||||
| val CommandState.Mode.inNormalMode | val VimStateMachine.Mode.inNormalMode | ||||||
|   get() = this == CommandState.Mode.COMMAND || this == CommandState.Mode.INSERT_NORMAL |   get() = this == VimStateMachine.Mode.COMMAND || this == VimStateMachine.Mode.INSERT_NORMAL | ||||||
|  |  | ||||||
| @get:JvmName("inInsertMode") | @get:JvmName("inInsertMode") | ||||||
| val Editor.inInsertMode | val Editor.inInsertMode | ||||||
|   get() = this.mode == CommandState.Mode.INSERT || this.mode == CommandState.Mode.REPLACE |   get() = this.editorMode == VimStateMachine.Mode.INSERT || this.editorMode == VimStateMachine.Mode.REPLACE | ||||||
|  |  | ||||||
| @get:JvmName("inRepeatMode") | @get:JvmName("inRepeatMode") | ||||||
| val Editor.inRepeatMode | val Editor.inRepeatMode | ||||||
|   get() = this.vim.commandState.isDotRepeatInProgress |   get() = this.vim.vimStateMachine.isDotRepeatInProgress | ||||||
|  |  | ||||||
| @get:JvmName("inVisualMode") | @get:JvmName("inVisualMode") | ||||||
| val Editor.inVisualMode | val Editor.inVisualMode | ||||||
|   get() = this.mode.inVisualMode |   get() = this.editorMode.inVisualMode | ||||||
|  |  | ||||||
| @get:JvmName("inSelectMode") | @get:JvmName("inSelectMode") | ||||||
| val Editor.inSelectMode | val Editor.inSelectMode | ||||||
|   get() = this.mode == CommandState.Mode.SELECT || this.mode == CommandState.Mode.INSERT_SELECT |   get() = this.editorMode == VimStateMachine.Mode.SELECT || this.editorMode == VimStateMachine.Mode.INSERT_SELECT | ||||||
|  |  | ||||||
| val VimEditor.inSelectMode | val VimEditor.inSelectMode | ||||||
|   get() = this.mode == CommandState.Mode.SELECT || this.mode == CommandState.Mode.INSERT_SELECT |   get() = this.mode == VimStateMachine.Mode.SELECT || this.mode == VimStateMachine.Mode.INSERT_SELECT | ||||||
|  |  | ||||||
| @get:JvmName("inBlockSubMode") | @get:JvmName("inBlockSubMode") | ||||||
| val Editor.inBlockSubMode | val Editor.inBlockSubMode | ||||||
|   get() = this.subMode == CommandState.SubMode.VISUAL_BLOCK |   get() = this.subMode == VimStateMachine.SubMode.VISUAL_BLOCK | ||||||
|  |  | ||||||
| @get:JvmName("inSingleCommandMode") | @get:JvmName("inSingleCommandMode") | ||||||
| val Editor.inSingleCommandMode: Boolean | val Editor.inSingleCommandMode: Boolean | ||||||
|   get() = this.mode.inSingleMode |   get() = this.editorMode.inSingleMode | ||||||
|  |  | ||||||
| @get:JvmName("inSingleMode") | @get:JvmName("inSingleMode") | ||||||
| val CommandState.Mode.inSingleMode: Boolean | val VimStateMachine.Mode.inSingleMode: Boolean | ||||||
|   get() = when (this) { |   get() = when (this) { | ||||||
|     CommandState.Mode.INSERT_NORMAL, CommandState.Mode.INSERT_SELECT, CommandState.Mode.INSERT_VISUAL -> true |     VimStateMachine.Mode.INSERT_NORMAL, VimStateMachine.Mode.INSERT_SELECT, VimStateMachine.Mode.INSERT_VISUAL -> true | ||||||
|     else -> false |     else -> false | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @get:JvmName("inSingleNormalMode") | @get:JvmName("inSingleNormalMode") | ||||||
| val CommandState.Mode.inSingleNormalMode: Boolean | val VimStateMachine.Mode.inSingleNormalMode: Boolean | ||||||
|   get() = when (this) { |   get() = when (this) { | ||||||
|     CommandState.Mode.INSERT_NORMAL -> true |     VimStateMachine.Mode.INSERT_NORMAL -> true | ||||||
|     else -> false |     else -> false | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -152,6 +152,13 @@ public class EditorHelper { | |||||||
|            : VimInjectorKt.getInjector().getEngineEditorHelper().logicalLineToVisualLine(editor, count - 1) + 1; |            : VimInjectorKt.getInjector().getEngineEditorHelper().logicalLineToVisualLine(editor, count - 1) + 1; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * COMPATIBILITY-LAYER: Created a function | ||||||
|  |    */ | ||||||
|  |   public static int getVisualLineCount(final @NotNull Editor editor) { | ||||||
|  |     return getVisualLineCount(new IjVimEditor(editor)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Gets the number of actual lines in the file |    * Gets the number of actual lines in the file | ||||||
|    * |    * | ||||||
| @@ -853,7 +860,7 @@ public class EditorHelper { | |||||||
|     if (inlayAwareOffset == vimLastColumn) return vimLastColumn; |     if (inlayAwareOffset == vimLastColumn) return vimLastColumn; | ||||||
|  |  | ||||||
|     Editor editor = caret.getEditor(); |     Editor editor = caret.getEditor(); | ||||||
|     boolean isEndAllowed = CommandStateHelper.isEndAllowedIgnoringOnemore(CommandStateHelper.getMode(editor)); |     boolean isEndAllowed = CommandStateHelper.isEndAllowedIgnoringOnemore(CommandStateHelper.getEditorMode(editor)); | ||||||
|     final LogicalPosition logicalPosition = caret.getLogicalPosition(); |     final LogicalPosition logicalPosition = caret.getLogicalPosition(); | ||||||
|     int lastColumn = EditorHelper.lastColumnForLine(editor, logicalPosition.line, isEndAllowed); |     int lastColumn = EditorHelper.lastColumnForLine(editor, logicalPosition.line, isEndAllowed); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,18 +21,24 @@ package com.maddyhome.idea.vim.helper | |||||||
| import com.intellij.openapi.actionSystem.ActionGroup | import com.intellij.openapi.actionSystem.ActionGroup | ||||||
| import com.intellij.openapi.actionSystem.ActionManager | import com.intellij.openapi.actionSystem.ActionManager | ||||||
| import com.intellij.openapi.actionSystem.ActionPlaces | import com.intellij.openapi.actionSystem.ActionPlaces | ||||||
|  | import com.intellij.openapi.actionSystem.AnAction | ||||||
| import com.intellij.openapi.actionSystem.AnActionEvent | import com.intellij.openapi.actionSystem.AnActionEvent | ||||||
|  | import com.intellij.openapi.actionSystem.AnActionResult | ||||||
| import com.intellij.openapi.actionSystem.DataContext | import com.intellij.openapi.actionSystem.DataContext | ||||||
| import com.intellij.openapi.actionSystem.IdeActions | import com.intellij.openapi.actionSystem.IdeActions | ||||||
|  | import com.intellij.openapi.actionSystem.PlatformCoreDataKeys | ||||||
| import com.intellij.openapi.actionSystem.PlatformDataKeys | import com.intellij.openapi.actionSystem.PlatformDataKeys | ||||||
| import com.intellij.openapi.actionSystem.Presentation | import com.intellij.openapi.actionSystem.Presentation | ||||||
|  | import com.intellij.openapi.actionSystem.ex.ActionManagerEx | ||||||
| import com.intellij.openapi.actionSystem.ex.ActionUtil | import com.intellij.openapi.actionSystem.ex.ActionUtil | ||||||
| import com.intellij.openapi.command.CommandProcessor | import com.intellij.openapi.command.CommandProcessor | ||||||
| import com.intellij.openapi.command.UndoConfirmationPolicy | import com.intellij.openapi.command.UndoConfirmationPolicy | ||||||
| import com.intellij.openapi.components.Service | import com.intellij.openapi.components.Service | ||||||
| import com.intellij.openapi.editor.actionSystem.DocCommandGroupId | import com.intellij.openapi.editor.actionSystem.DocCommandGroupId | ||||||
|  | import com.intellij.openapi.project.IndexNotReadyException | ||||||
| import com.intellij.openapi.ui.popup.JBPopupFactory | import com.intellij.openapi.ui.popup.JBPopupFactory | ||||||
| import com.intellij.openapi.util.NlsContexts | import com.intellij.openapi.util.NlsContexts | ||||||
|  | import com.intellij.util.SlowOperations | ||||||
| import com.maddyhome.idea.vim.RegisterActions | import com.maddyhome.idea.vim.RegisterActions | ||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
| import com.maddyhome.idea.vim.api.NativeAction | import com.maddyhome.idea.vim.api.NativeAction | ||||||
| @@ -95,11 +101,48 @@ class IjActionExecutor : VimActionExecutor { | |||||||
|       popup.showInFocusCenter() |       popup.showInFocusCenter() | ||||||
|       return true |       return true | ||||||
|     } else { |     } else { | ||||||
|       ActionUtil.performActionDumbAwareWithCallbacks(ijAction, event) |       performDumbAwareWithCallbacks(ijAction, event) { ijAction.actionPerformed(event) } | ||||||
|       return true |       return true | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // This is taken directly from ActionUtil.performActionDumbAwareWithCallbacks | ||||||
|  |   // But with one check removed. With this check some actions (like `:w` doesn't work) | ||||||
|  |   // https://youtrack.jetbrains.com/issue/VIM-2691/File-is-not-saved-on-w | ||||||
|  |   private fun performDumbAwareWithCallbacks( | ||||||
|  |     action: AnAction, | ||||||
|  |     event: AnActionEvent, | ||||||
|  |     performRunnable: Runnable, | ||||||
|  |   ) { | ||||||
|  |     val project = event.project | ||||||
|  |     var indexError: IndexNotReadyException? = null | ||||||
|  |     val manager = ActionManagerEx.getInstanceEx() | ||||||
|  |     manager.fireBeforeActionPerformed(action, event) | ||||||
|  |     val component = event.getData(PlatformCoreDataKeys.CONTEXT_COMPONENT) | ||||||
|  |     var result: AnActionResult? = null | ||||||
|  |     try { | ||||||
|  |       SlowOperations.allowSlowOperations(SlowOperations.ACTION_PERFORM).use { ignore -> | ||||||
|  |         performRunnable.run() | ||||||
|  |         result = AnActionResult.PERFORMED | ||||||
|  |       } | ||||||
|  |     } catch (ex: IndexNotReadyException) { | ||||||
|  |       indexError = ex | ||||||
|  |       result = AnActionResult.failed(ex) | ||||||
|  |     } catch (ex: RuntimeException) { | ||||||
|  |       result = AnActionResult.failed(ex) | ||||||
|  |       throw ex | ||||||
|  |     } catch (ex: Error) { | ||||||
|  |       result = AnActionResult.failed(ex) | ||||||
|  |       throw ex | ||||||
|  |     } finally { | ||||||
|  |       if (result == null) result = AnActionResult.failed(Throwable()) | ||||||
|  |       manager.fireAfterActionPerformed(action, event, result!!) | ||||||
|  |     } | ||||||
|  |     if (indexError != null) { | ||||||
|  |       ActionUtil.showDumbModeWarning(project, event) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   private fun canBePerformed(event: AnActionEvent, action: ActionGroup, context: DataContext): Boolean { |   private fun canBePerformed(event: AnActionEvent, action: ActionGroup, context: DataContext): Boolean { | ||||||
|     val presentation = event.presentation |     val presentation = event.presentation | ||||||
|     return try { |     return try { | ||||||
| @@ -155,6 +198,10 @@ class IjActionExecutor : VimActionExecutor { | |||||||
|     return RegisterActions.findAction(id) |     return RegisterActions.findAction(id) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   override fun findVimActionOrDie(id: String): EditorActionHandlerBase { | ||||||
|  |     return RegisterActions.findActionOrDie(id) | ||||||
|  |   } | ||||||
|  |  | ||||||
|   override fun getAction(actionId: String): NativeAction? { |   override fun getAction(actionId: String): NativeAction? { | ||||||
|     return ActionManager.getInstance().getAction(actionId)?.let { IjNativeAction(it) } |     return ActionManager.getInstance().getAction(actionId)?.let { IjNativeAction(it) } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -143,4 +143,8 @@ class IjEditorHelper : EngineEditorHelper { | |||||||
|   override fun getLeadingWhitespace(editor: VimEditor, line: Int): String { |   override fun getLeadingWhitespace(editor: VimEditor, line: Int): String { | ||||||
|     return EditorHelper.getLeadingWhitespace(editor.ij, line) |     return EditorHelper.getLeadingWhitespace(editor.ij, line) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   override fun anyNonWhitespace(editor: VimEditor, offset: Int, dir: Int): Boolean { | ||||||
|  |     return SearchHelper.anyNonWhitespace(editor.ij, offset, dir) | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -25,9 +25,9 @@ import com.intellij.openapi.editor.Caret | |||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.command.CommandState |  | ||||||
| import com.maddyhome.idea.vim.command.OperatorArguments | import com.maddyhome.idea.vim.command.OperatorArguments | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
| import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor | import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor | ||||||
| import com.maddyhome.idea.vim.newapi.IjExecutionContext | import com.maddyhome.idea.vim.newapi.IjExecutionContext | ||||||
| @@ -39,8 +39,8 @@ import com.maddyhome.idea.vim.newapi.vim | |||||||
|  * Pop all modes, but leave editor state. E.g. editor selection is not removed. |  * Pop all modes, but leave editor state. E.g. editor selection is not removed. | ||||||
|  */ |  */ | ||||||
| fun Editor.popAllModes() { | fun Editor.popAllModes() { | ||||||
|   val commandState = this.vim.commandState |   val commandState = this.vim.vimStateMachine | ||||||
|   while (commandState.mode != CommandState.Mode.COMMAND) { |   while (commandState.mode != VimStateMachine.Mode.COMMAND) { | ||||||
|     commandState.popModes() |     commandState.popModes() | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -63,7 +63,7 @@ fun Editor.exitVisualMode() { | |||||||
|     VimPlugin.getMark().setVisualSelectionMarks(this.vim, TextRange(vimSelectionStart, primaryCaret.offset)) |     VimPlugin.getMark().setVisualSelectionMarks(this.vim, TextRange(vimSelectionStart, primaryCaret.offset)) | ||||||
|     this.caretModel.allCarets.forEach { it.vimSelectionStartClear() } |     this.caretModel.allCarets.forEach { it.vimSelectionStartClear() } | ||||||
|  |  | ||||||
|     this.vim.commandState.popModes() |     this.vim.vimStateMachine.popModes() | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -71,7 +71,7 @@ fun Editor.exitVisualMode() { | |||||||
| fun Editor.exitSelectMode(adjustCaretPosition: Boolean) { | fun Editor.exitSelectMode(adjustCaretPosition: Boolean) { | ||||||
|   if (!this.inSelectMode) return |   if (!this.inSelectMode) return | ||||||
|  |  | ||||||
|   this.vim.commandState.popModes() |   this.vim.vimStateMachine.popModes() | ||||||
|   SelectionVimListenerSuppressor.lock().use { |   SelectionVimListenerSuppressor.lock().use { | ||||||
|     this.caretModel.allCarets.forEach { |     this.caretModel.allCarets.forEach { | ||||||
|       it.removeSelection() |       it.removeSelection() | ||||||
| @@ -91,7 +91,7 @@ fun Editor.exitSelectMode(adjustCaretPosition: Boolean) { | |||||||
| fun VimEditor.exitSelectMode(adjustCaretPosition: Boolean) { | fun VimEditor.exitSelectMode(adjustCaretPosition: Boolean) { | ||||||
|   if (!this.inSelectMode) return |   if (!this.inSelectMode) return | ||||||
|  |  | ||||||
|   this.commandState.popModes() |   this.vimStateMachine.popModes() | ||||||
|   SelectionVimListenerSuppressor.lock().use { |   SelectionVimListenerSuppressor.lock().use { | ||||||
|     this.carets().forEach { vimCaret -> |     this.carets().forEach { vimCaret -> | ||||||
|       val caret = (vimCaret as IjVimCaret).caret |       val caret = (vimCaret as IjVimCaret).caret | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ import com.intellij.psi.PsiElement; | |||||||
| import com.intellij.psi.PsiFile; | import com.intellij.psi.PsiFile; | ||||||
| import com.intellij.psi.util.PsiTreeUtil; | import com.intellij.psi.util.PsiTreeUtil; | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import com.maddyhome.idea.vim.common.CharacterPosition; | import com.maddyhome.idea.vim.common.CharacterPosition; | ||||||
| import com.maddyhome.idea.vim.common.Direction; | import com.maddyhome.idea.vim.common.Direction; | ||||||
| import com.maddyhome.idea.vim.common.TextRange; | import com.maddyhome.idea.vim.common.TextRange; | ||||||
| @@ -893,8 +893,8 @@ public class SearchHelper { | |||||||
|         selectionEndWithoutNewline++; |         selectionEndWithoutNewline++; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       final CommandState.Mode mode = CommandState.getInstance(new IjVimEditor(editor)).getMode(); |       final VimStateMachine.Mode mode = VimStateMachine.getInstance(new IjVimEditor(editor)).getMode(); | ||||||
|       if (mode == CommandState.Mode.VISUAL) { |       if (mode == VimStateMachine.Mode.VISUAL) { | ||||||
|         if (closingTagTextRange.getStartOffset() == selectionEndWithoutNewline && |         if (closingTagTextRange.getStartOffset() == selectionEndWithoutNewline && | ||||||
|           openingTag.getEndOffset() == selectionStart) { |           openingTag.getEndOffset() == selectionStart) { | ||||||
|           // Special case: if the inner tag is already selected we should like isOuter is active |           // Special case: if the inner tag is already selected we should like isOuter is active | ||||||
|   | |||||||
							
								
								
									
										44
									
								
								src/main/java/com/maddyhome/idea/vim/helper/StringHelper.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/main/java/com/maddyhome/idea/vim/helper/StringHelper.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  | package com.maddyhome.idea.vim.helper | ||||||
|  |  | ||||||
|  | import com.maddyhome.idea.vim.api.injector | ||||||
|  | import java.util.* | ||||||
|  | import java.util.stream.Collectors | ||||||
|  | import javax.swing.KeyStroke | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * COMPATIBILITY-LAYER: Created a helper class | ||||||
|  |  */ | ||||||
|  | object StringHelper { | ||||||
|  |   @JvmStatic | ||||||
|  |   fun parseKeys(string: String): List<KeyStroke> { | ||||||
|  |     return injector.parser.parseKeys(string) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @JvmStatic | ||||||
|  |   fun parseKeys(vararg string: String): List<KeyStroke> { | ||||||
|  |     return Arrays.stream(string).flatMap { o: String -> injector.parser.parseKeys(o).stream() } | ||||||
|  |       .collect(Collectors.toList()) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @JvmStatic | ||||||
|  |   fun isCloseKeyStroke(stroke: KeyStroke): Boolean { | ||||||
|  |     return stroke.isCloseKeyStroke() | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -99,5 +99,6 @@ class UndoRedoHelper : UndoRedoBase() { | |||||||
|     while (check() && !changeListener.hasChanged) { |     while (check() && !changeListener.hasChanged) { | ||||||
|       action.run() |       action.run() | ||||||
|     } |     } | ||||||
|  |     vimDocument.removeChangeListener(changeListener) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -27,8 +27,9 @@ import com.intellij.openapi.editor.RangeMarker | |||||||
| import com.intellij.openapi.editor.markup.RangeHighlighter | import com.intellij.openapi.editor.markup.RangeHighlighter | ||||||
| import com.intellij.openapi.util.Key | import com.intellij.openapi.util.Key | ||||||
| import com.intellij.openapi.util.UserDataHolder | import com.intellij.openapi.util.UserDataHolder | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.api.CaretRegisterStorageBase | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.ex.ExOutputModel | import com.maddyhome.idea.vim.ex.ExOutputModel | ||||||
| import com.maddyhome.idea.vim.group.visual.VisualChange | import com.maddyhome.idea.vim.group.visual.VisualChange | ||||||
| import com.maddyhome.idea.vim.group.visual.vimLeadSelectionOffset | import com.maddyhome.idea.vim.group.visual.vimLeadSelectionOffset | ||||||
| @@ -73,11 +74,12 @@ var Caret.vimInsertStart: RangeMarker by userDataOr { | |||||||
|     this.offset |     this.offset | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  | var Caret.registerStorage: CaretRegisterStorageBase? by userDataCaretToEditor() | ||||||
|  |  | ||||||
| // ------------------ Editor | // ------------------ Editor | ||||||
| fun unInitializeEditor(editor: Editor) { | fun unInitializeEditor(editor: Editor) { | ||||||
|   editor.vimLastSelectionType = null |   editor.vimLastSelectionType = null | ||||||
|   editor.vimCommandState = null |   editor.vimStateMachine = null | ||||||
|   editor.vimMorePanel = null |   editor.vimMorePanel = null | ||||||
|   editor.vimExOutput = null |   editor.vimExOutput = null | ||||||
|   editor.vimLastHighlighters = null |   editor.vimLastHighlighters = null | ||||||
| @@ -91,7 +93,7 @@ var Editor.vimIncsearchCurrentMatchOffset: Int? by userData() | |||||||
|  * @see :help visualmode() |  * @see :help visualmode() | ||||||
|  */ |  */ | ||||||
| var Editor.vimLastSelectionType: SelectionType? by userData() | var Editor.vimLastSelectionType: SelectionType? by userData() | ||||||
| var Editor.vimCommandState: CommandState? by userData() | var Editor.vimStateMachine: VimStateMachine? by userData() | ||||||
| var Editor.vimEditorGroup: Boolean by userDataOr { false } | var Editor.vimEditorGroup: Boolean by userDataOr { false } | ||||||
| var Editor.vimLineNumbersInitialState: Boolean by userDataOr { false } | var Editor.vimLineNumbersInitialState: Boolean by userDataOr { false } | ||||||
| var Editor.vimHasRelativeLineNumbersInstalled: Boolean by userDataOr { false } | var Editor.vimHasRelativeLineNumbersInstalled: Boolean by userDataOr { false } | ||||||
| @@ -103,7 +105,7 @@ var Editor.vimTestInputModel: TestInputModel? by userData() | |||||||
|  * Checks whether a keeping visual mode visual operator action is performed on editor. |  * Checks whether a keeping visual mode visual operator action is performed on editor. | ||||||
|  */ |  */ | ||||||
| var Editor.vimKeepingVisualOperatorAction: Boolean by userDataOr { false } | var Editor.vimKeepingVisualOperatorAction: Boolean by userDataOr { false } | ||||||
| var Editor.vimChangeActionSwitchMode: CommandState.Mode? by userData() | var Editor.vimChangeActionSwitchMode: VimStateMachine.Mode? by userData() | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Function for delegated properties. |  * Function for delegated properties. | ||||||
|   | |||||||
| @@ -19,8 +19,6 @@ | |||||||
| package com.maddyhome.idea.vim.key | package com.maddyhome.idea.vim.key | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.common.Node |  | ||||||
| import com.maddyhome.idea.vim.common.addLeafs |  | ||||||
|  |  | ||||||
| fun <T> Node<T>.addLeafs(keys: String, actionHolder: T) { | fun <T> Node<T>.addLeafs(keys: String, actionHolder: T) { | ||||||
|   addLeafs(injector.parser.parseKeys(keys), actionHolder) |   addLeafs(injector.parser.parseKeys(keys), actionHolder) | ||||||
|   | |||||||
| @@ -32,16 +32,17 @@ import com.intellij.openapi.actionSystem.AnActionEvent | |||||||
| import com.intellij.openapi.actionSystem.CommonDataKeys | import com.intellij.openapi.actionSystem.CommonDataKeys | ||||||
| import com.intellij.openapi.actionSystem.DataContext | import com.intellij.openapi.actionSystem.DataContext | ||||||
| import com.intellij.openapi.actionSystem.ex.AnActionListener | import com.intellij.openapi.actionSystem.ex.AnActionListener | ||||||
|  | import com.intellij.openapi.actionSystem.impl.ProxyShortcutSet | ||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.intellij.openapi.project.DumbAwareToggleAction | import com.intellij.openapi.project.DumbAwareToggleAction | ||||||
| import com.maddyhome.idea.vim.KeyHandler | import com.maddyhome.idea.vim.KeyHandler | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.group.NotificationService | import com.maddyhome.idea.vim.group.NotificationService | ||||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | import com.maddyhome.idea.vim.helper.EditorDataContext | ||||||
| import com.maddyhome.idea.vim.helper.commandState |  | ||||||
| import com.maddyhome.idea.vim.helper.inNormalMode | import com.maddyhome.idea.vim.helper.inNormalMode | ||||||
| import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere | import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere | ||||||
|  | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants | import com.maddyhome.idea.vim.options.OptionConstants | ||||||
| import com.maddyhome.idea.vim.options.OptionScope | import com.maddyhome.idea.vim.options.OptionScope | ||||||
| @@ -70,7 +71,7 @@ object IdeaSpecifics { | |||||||
|       //region Track action id |       //region Track action id | ||||||
|       if (VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.trackactionidsName)) { |       if (VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.trackactionidsName)) { | ||||||
|         if (action !is NotificationService.ActionIdNotifier.CopyActionId && action !is NotificationService.ActionIdNotifier.StopTracking) { |         if (action !is NotificationService.ActionIdNotifier.CopyActionId && action !is NotificationService.ActionIdNotifier.StopTracking) { | ||||||
|           val id: String? = ActionManager.getInstance().getId(action) |           val id: String? = ActionManager.getInstance().getId(action) ?: (action.shortcutSet as? ProxyShortcutSet)?.actionId | ||||||
|           VimPlugin.getNotifications(dataContext.getData(CommonDataKeys.PROJECT)).notifyActionId(id) |           VimPlugin.getNotifications(dataContext.getData(CommonDataKeys.PROJECT)).notifyActionId(id) | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -88,8 +89,8 @@ object IdeaSpecifics { | |||||||
|       } |       } | ||||||
|       ) { |       ) { | ||||||
|         editor?.let { |         editor?.let { | ||||||
|           val commandState = it.vim.commandState |           val commandState = it.vim.vimStateMachine | ||||||
|           while (commandState.mode != CommandState.Mode.COMMAND) { |           while (commandState.mode != VimStateMachine.Mode.COMMAND) { | ||||||
|             commandState.popModes() |             commandState.popModes() | ||||||
|           } |           } | ||||||
|           VimPlugin.getChange().insertBeforeCursor(it.vim, dataContext.vim) |           VimPlugin.getChange().insertBeforeCursor(it.vim, dataContext.vim) | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ import com.maddyhome.idea.vim.KeyHandler | |||||||
| import com.maddyhome.idea.vim.VimKeyListener | import com.maddyhome.idea.vim.VimKeyListener | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.VimTypedActionHandler | import com.maddyhome.idea.vim.VimTypedActionHandler | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.ex.ExOutputModel | import com.maddyhome.idea.vim.ex.ExOutputModel | ||||||
| import com.maddyhome.idea.vim.group.EditorGroup | import com.maddyhome.idea.vim.group.EditorGroup | ||||||
| import com.maddyhome.idea.vim.group.FileGroup | import com.maddyhome.idea.vim.group.FileGroup | ||||||
| @@ -425,7 +425,7 @@ object VimListenerManager { | |||||||
|         ExOutputModel.getInstance(editor).clear() |         ExOutputModel.getInstance(editor).clear() | ||||||
|  |  | ||||||
|         val caretModel = editor.caretModel |         val caretModel = editor.caretModel | ||||||
|         if (editor.subMode != CommandState.SubMode.NONE) { |         if (editor.subMode != VimStateMachine.SubMode.NONE) { | ||||||
|           caretModel.removeSecondaryCarets() |           caretModel.removeSecondaryCarets() | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,11 +28,12 @@ import com.maddyhome.idea.vim.VimPlugin | |||||||
| import com.maddyhome.idea.vim.api.ExecutionContext | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
| import com.maddyhome.idea.vim.api.LineDeleteShift | import com.maddyhome.idea.vim.api.LineDeleteShift | ||||||
| import com.maddyhome.idea.vim.api.VimCaret | import com.maddyhome.idea.vim.api.VimCaret | ||||||
|  | import com.maddyhome.idea.vim.api.VimChangeGroupBase | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.VimMotionGroupBase | import com.maddyhome.idea.vim.api.VimMotionGroupBase | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState |  | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.EditorLine | import com.maddyhome.idea.vim.common.EditorLine | ||||||
| import com.maddyhome.idea.vim.common.IndentConfig | import com.maddyhome.idea.vim.common.IndentConfig | ||||||
| import com.maddyhome.idea.vim.common.OperatedRange | import com.maddyhome.idea.vim.common.OperatedRange | ||||||
| @@ -40,7 +41,6 @@ import com.maddyhome.idea.vim.common.TextRange | |||||||
| import com.maddyhome.idea.vim.common.VimRange | import com.maddyhome.idea.vim.common.VimRange | ||||||
| import com.maddyhome.idea.vim.common.including | import com.maddyhome.idea.vim.common.including | ||||||
| import com.maddyhome.idea.vim.common.offset | import com.maddyhome.idea.vim.common.offset | ||||||
| import com.maddyhome.idea.vim.group.ChangeGroup |  | ||||||
| import com.maddyhome.idea.vim.group.MotionGroup | import com.maddyhome.idea.vim.group.MotionGroup | ||||||
| import com.maddyhome.idea.vim.helper.EditorHelper | import com.maddyhome.idea.vim.helper.EditorHelper | ||||||
| import com.maddyhome.idea.vim.helper.inlayAwareVisualColumn | import com.maddyhome.idea.vim.helper.inlayAwareVisualColumn | ||||||
| @@ -62,7 +62,7 @@ fun changeRange( | |||||||
|   var col = 0 |   var col = 0 | ||||||
|   var lines = 0 |   var lines = 0 | ||||||
|   if (type === SelectionType.BLOCK_WISE) { |   if (type === SelectionType.BLOCK_WISE) { | ||||||
|     lines = ChangeGroup.getLinesCountInVisualBlock(IjVimEditor(editor), range) |     lines = VimChangeGroupBase.getLinesCountInVisualBlock(IjVimEditor(editor), range) | ||||||
|     col = editor.offsetToLogicalPosition(range.startOffset).column |     col = editor.offsetToLogicalPosition(range.startOffset).column | ||||||
|     if (caret.vimLastColumn == VimMotionGroupBase.LAST_COLUMN) { |     if (caret.vimLastColumn == VimMotionGroupBase.LAST_COLUMN) { | ||||||
|       col = VimMotionGroupBase.LAST_COLUMN |       col = VimMotionGroupBase.LAST_COLUMN | ||||||
| @@ -103,7 +103,7 @@ fun changeRange( | |||||||
|       if (type == SelectionType.BLOCK_WISE) { |       if (type == SelectionType.BLOCK_WISE) { | ||||||
|         VimPlugin.getChange().setInsertRepeat(lines, col, false) |         VimPlugin.getChange().setInsertRepeat(lines, col, false) | ||||||
|       } |       } | ||||||
|       editor.vimChangeActionSwitchMode = CommandState.Mode.INSERT |       editor.vimChangeActionSwitchMode = VimStateMachine.Mode.INSERT | ||||||
|     } |     } | ||||||
|   } else { |   } else { | ||||||
|     VimPlugin.getChange().insertBeforeCursor(editor.vim, context.vim) |     VimPlugin.getChange().insertBeforeCursor(editor.vim, context.vim) | ||||||
| @@ -158,9 +158,9 @@ fun deleteRange( | |||||||
| fun insertLineAround(editor: VimEditor, context: ExecutionContext, shift: Int) { | fun insertLineAround(editor: VimEditor, context: ExecutionContext, shift: Int) { | ||||||
|   val project = (editor as IjVimEditor).editor.project |   val project = (editor as IjVimEditor).editor.project | ||||||
|  |  | ||||||
|   VimPlugin.getChange().initInsert(editor, context, CommandState.Mode.INSERT) |   VimPlugin.getChange().initInsert(editor, context, VimStateMachine.Mode.INSERT) | ||||||
|  |  | ||||||
|   if (!CommandState.getInstance(editor).isDotRepeatInProgress) { |   if (!VimStateMachine.getInstance(editor).isDotRepeatInProgress) { | ||||||
|     for (vimCaret in editor.carets()) { |     for (vimCaret in editor.carets()) { | ||||||
|       val caret = (vimCaret as IjVimCaret).caret |       val caret = (vimCaret as IjVimCaret).caret | ||||||
|       val line = vimCaret.getLine() |       val line = vimCaret.getLine() | ||||||
|   | |||||||
| @@ -22,7 +22,10 @@ import com.intellij.openapi.editor.Caret | |||||||
| import com.intellij.openapi.editor.LogicalPosition | import com.intellij.openapi.editor.LogicalPosition | ||||||
| import com.intellij.openapi.editor.VisualPosition | import com.intellij.openapi.editor.VisualPosition | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
|  | import com.maddyhome.idea.vim.api.CaretRegisterStorage | ||||||
|  | import com.maddyhome.idea.vim.api.CaretRegisterStorageBase | ||||||
| import com.maddyhome.idea.vim.api.VimCaret | import com.maddyhome.idea.vim.api.VimCaret | ||||||
|  | import com.maddyhome.idea.vim.api.VimCaretBase | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.api.VimLogicalPosition | import com.maddyhome.idea.vim.api.VimLogicalPosition | ||||||
| import com.maddyhome.idea.vim.api.VimVisualPosition | import com.maddyhome.idea.vim.api.VimVisualPosition | ||||||
| @@ -38,13 +41,23 @@ import com.maddyhome.idea.vim.group.visual.vimSetSystemSelectionSilently | |||||||
| import com.maddyhome.idea.vim.group.visual.vimUpdateEditorSelection | import com.maddyhome.idea.vim.group.visual.vimUpdateEditorSelection | ||||||
| import com.maddyhome.idea.vim.helper.inlayAwareVisualColumn | import com.maddyhome.idea.vim.helper.inlayAwareVisualColumn | ||||||
| import com.maddyhome.idea.vim.helper.moveToInlayAwareOffset | import com.maddyhome.idea.vim.helper.moveToInlayAwareOffset | ||||||
|  | import com.maddyhome.idea.vim.helper.registerStorage | ||||||
| import com.maddyhome.idea.vim.helper.vimInsertStart | import com.maddyhome.idea.vim.helper.vimInsertStart | ||||||
| import com.maddyhome.idea.vim.helper.vimLastColumn | import com.maddyhome.idea.vim.helper.vimLastColumn | ||||||
| import com.maddyhome.idea.vim.helper.vimLastVisualOperatorRange | import com.maddyhome.idea.vim.helper.vimLastVisualOperatorRange | ||||||
| import com.maddyhome.idea.vim.helper.vimLine | import com.maddyhome.idea.vim.helper.vimLine | ||||||
| import com.maddyhome.idea.vim.helper.vimSelectionStart | import com.maddyhome.idea.vim.helper.vimSelectionStart | ||||||
|  |  | ||||||
| class IjVimCaret(val caret: Caret) : VimCaret { | class IjVimCaret(val caret: Caret) : VimCaretBase() { | ||||||
|  |   override val registerStorage: CaretRegisterStorage | ||||||
|  |     get() { | ||||||
|  |       var storage = this.caret.registerStorage | ||||||
|  |       if (storage == null) { | ||||||
|  |         storage = CaretRegisterStorageBase(editor.primaryCaret().ij == caret) | ||||||
|  |         this.caret.registerStorage = storage | ||||||
|  |       } | ||||||
|  |       return storage | ||||||
|  |     } | ||||||
|   override val editor: VimEditor |   override val editor: VimEditor | ||||||
|     get() = IjVimEditor(caret.editor) |     get() = IjVimEditor(caret.editor) | ||||||
|   override val offset: Offset |   override val offset: Offset | ||||||
|   | |||||||
| @@ -38,9 +38,9 @@ import com.maddyhome.idea.vim.api.VimLogicalPosition | |||||||
| import com.maddyhome.idea.vim.api.VimSelectionModel | import com.maddyhome.idea.vim.api.VimSelectionModel | ||||||
| import com.maddyhome.idea.vim.api.VimVisualPosition | import com.maddyhome.idea.vim.api.VimVisualPosition | ||||||
| import com.maddyhome.idea.vim.api.VirtualFile | import com.maddyhome.idea.vim.api.VirtualFile | ||||||
| import com.maddyhome.idea.vim.command.CommandState |  | ||||||
| import com.maddyhome.idea.vim.command.OperatorArguments | import com.maddyhome.idea.vim.command.OperatorArguments | ||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
|  | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.EditorLine | import com.maddyhome.idea.vim.common.EditorLine | ||||||
| import com.maddyhome.idea.vim.common.LiveRange | import com.maddyhome.idea.vim.common.LiveRange | ||||||
| import com.maddyhome.idea.vim.common.Offset | import com.maddyhome.idea.vim.common.Offset | ||||||
| @@ -72,7 +72,7 @@ class IjVimEditor(editor: Editor) : MutableLinearEditor() { | |||||||
|   val originalEditor = editor |   val originalEditor = editor | ||||||
|  |  | ||||||
|   override val lfMakesNewLine: Boolean = true |   override val lfMakesNewLine: Boolean = true | ||||||
|   override var vimChangeActionSwitchMode: CommandState.Mode? |   override var vimChangeActionSwitchMode: VimStateMachine.Mode? | ||||||
|     get() = editor.vimChangeActionSwitchMode |     get() = editor.vimChangeActionSwitchMode | ||||||
|     set(value) { |     set(value) { | ||||||
|       editor.vimChangeActionSwitchMode = value |       editor.vimChangeActionSwitchMode = value | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ package com.maddyhome.idea.vim.newapi | |||||||
| import com.intellij.openapi.components.service | import com.intellij.openapi.components.service | ||||||
| import com.intellij.openapi.components.serviceIfCreated | import com.intellij.openapi.components.serviceIfCreated | ||||||
| import com.intellij.openapi.diagnostic.Logger | import com.intellij.openapi.diagnostic.Logger | ||||||
|  | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.api.EngineEditorHelper | import com.maddyhome.idea.vim.api.EngineEditorHelper | ||||||
| import com.maddyhome.idea.vim.api.ExEntryPanel | import com.maddyhome.idea.vim.api.ExEntryPanel | ||||||
| import com.maddyhome.idea.vim.api.ExecutionContextManager | import com.maddyhome.idea.vim.api.ExecutionContextManager | ||||||
| @@ -39,7 +40,7 @@ import com.maddyhome.idea.vim.api.VimrcFileState | |||||||
| import com.maddyhome.idea.vim.api.VimscriptExecutor | import com.maddyhome.idea.vim.api.VimscriptExecutor | ||||||
| import com.maddyhome.idea.vim.api.VimscriptFunctionService | import com.maddyhome.idea.vim.api.VimscriptFunctionService | ||||||
| import com.maddyhome.idea.vim.api.VimscriptParser | import com.maddyhome.idea.vim.api.VimscriptParser | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.VimMachine | import com.maddyhome.idea.vim.common.VimMachine | ||||||
| import com.maddyhome.idea.vim.diagnostic.VimLogger | import com.maddyhome.idea.vim.diagnostic.VimLogger | ||||||
| import com.maddyhome.idea.vim.ex.ExOutputModel | import com.maddyhome.idea.vim.ex.ExOutputModel | ||||||
| @@ -63,11 +64,11 @@ import com.maddyhome.idea.vim.helper.IjEditorHelper | |||||||
| import com.maddyhome.idea.vim.helper.IjVimStringParser | import com.maddyhome.idea.vim.helper.IjVimStringParser | ||||||
| import com.maddyhome.idea.vim.helper.UndoRedoHelper | import com.maddyhome.idea.vim.helper.UndoRedoHelper | ||||||
| import com.maddyhome.idea.vim.helper.VimCommandLineHelper | import com.maddyhome.idea.vim.helper.VimCommandLineHelper | ||||||
| import com.maddyhome.idea.vim.helper.vimCommandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.history.VimHistory | import com.maddyhome.idea.vim.history.VimHistory | ||||||
| import com.maddyhome.idea.vim.macro.VimMacro | import com.maddyhome.idea.vim.macro.VimMacro | ||||||
| import com.maddyhome.idea.vim.mark.VimMarkGroup | import com.maddyhome.idea.vim.mark.VimMarkGroup | ||||||
| import com.maddyhome.idea.vim.options.OptionService | import com.maddyhome.idea.vim.vimscript.services.OptionService | ||||||
| import com.maddyhome.idea.vim.put.VimPut | import com.maddyhome.idea.vim.put.VimPut | ||||||
| import com.maddyhome.idea.vim.register.VimRegisterGroup | import com.maddyhome.idea.vim.register.VimRegisterGroup | ||||||
| import com.maddyhome.idea.vim.ui.VimRcFileState | import com.maddyhome.idea.vim.ui.VimRcFileState | ||||||
| @@ -75,7 +76,7 @@ import com.maddyhome.idea.vim.undo.VimUndoRedo | |||||||
| import com.maddyhome.idea.vim.vimscript.Executor | import com.maddyhome.idea.vim.vimscript.Executor | ||||||
| import com.maddyhome.idea.vim.vimscript.services.FunctionStorage | import com.maddyhome.idea.vim.vimscript.services.FunctionStorage | ||||||
| import com.maddyhome.idea.vim.vimscript.services.PatternService | import com.maddyhome.idea.vim.vimscript.services.PatternService | ||||||
| import com.maddyhome.idea.vim.vimscript.services.VimVariableService | import com.maddyhome.idea.vim.vimscript.services.VariableService | ||||||
| import com.maddyhome.idea.vim.yank.VimYankGroup | import com.maddyhome.idea.vim.yank.VimYankGroup | ||||||
|  |  | ||||||
| class IjVimInjector : VimInjectorBase() { | class IjVimInjector : VimInjectorBase() { | ||||||
| @@ -160,7 +161,7 @@ class IjVimInjector : VimInjectorBase() { | |||||||
|  |  | ||||||
|   override val functionService: VimscriptFunctionService |   override val functionService: VimscriptFunctionService | ||||||
|     get() = FunctionStorage |     get() = FunctionStorage | ||||||
|   override val variableService: VimVariableService |   override val variableService: VariableService | ||||||
|     get() = service() |     get() = service() | ||||||
|   override val vimrcFileState: VimrcFileState |   override val vimrcFileState: VimrcFileState | ||||||
|     get() = VimRcFileState |     get() = VimRcFileState | ||||||
| @@ -179,15 +180,23 @@ class IjVimInjector : VimInjectorBase() { | |||||||
|   override val vimStorageService: VimStorageService |   override val vimStorageService: VimStorageService | ||||||
|     get() = service() |     get() = service() | ||||||
|  |  | ||||||
|   override fun commandStateFor(editor: VimEditor): CommandState { |   override fun commandStateFor(editor: VimEditor): VimStateMachine { | ||||||
|     var res = editor.ij.vimCommandState |     var res = editor.ij.vimStateMachine | ||||||
|     if (res == null) { |     if (res == null) { | ||||||
|       res = CommandState(editor) |       res = VimStateMachine(editor) | ||||||
|       editor.ij.vimCommandState = res |       editor.ij.vimStateMachine = res | ||||||
|     } |     } | ||||||
|     return res |     return res | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   override fun commandStateFor(editor: Any): VimStateMachine { | ||||||
|  |     return when (editor) { | ||||||
|  |       is VimEditor -> this.commandStateFor(editor) | ||||||
|  |       is Editor -> this.commandStateFor(IjVimEditor(editor)) | ||||||
|  |       else -> error("Unexpected type: $editor") | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   override val engineEditorHelper: EngineEditorHelper |   override val engineEditorHelper: EngineEditorHelper | ||||||
|     get() = service<IjEditorHelper>() |     get() = service<IjEditorHelper>() | ||||||
|   override val editorGroup: VimEditorGroup |   override val editorGroup: VimEditorGroup | ||||||
|   | |||||||
| @@ -110,6 +110,17 @@ class IjVimSearchHelper : VimSearchHelper { | |||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   override fun findNextWordEnd( | ||||||
|  |     chars: CharSequence, | ||||||
|  |     pos: Int, | ||||||
|  |     size: Int, | ||||||
|  |     count: Int, | ||||||
|  |     bigWord: Boolean, | ||||||
|  |     spaceWords: Boolean, | ||||||
|  |   ): Int { | ||||||
|  |     return SearchHelper.findNextWordEnd(chars, pos, size, count, bigWord, spaceWords) | ||||||
|  |   } | ||||||
|  |  | ||||||
|   override fun findNextWord(editor: VimEditor, searchFrom: Int, count: Int, bigWord: Boolean): Int { |   override fun findNextWord(editor: VimEditor, searchFrom: Int, count: Int, bigWord: Boolean): Int { | ||||||
|     return SearchHelper.findNextWord( |     return SearchHelper.findNextWord( | ||||||
|       (editor as IjVimEditor).editor, |       (editor as IjVimEditor).editor, | ||||||
|   | |||||||
| @@ -0,0 +1,59 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package com.maddyhome.idea.vim.option | ||||||
|  |  | ||||||
|  | import com.maddyhome.idea.vim.api.injector | ||||||
|  | import com.maddyhome.idea.vim.options.OptionConstants | ||||||
|  | import com.maddyhome.idea.vim.options.OptionConstants.Companion.ignorecaseName | ||||||
|  | import com.maddyhome.idea.vim.options.OptionConstants.Companion.smartcaseName | ||||||
|  | import com.maddyhome.idea.vim.options.OptionConstants.Companion.timeoutName | ||||||
|  | import com.maddyhome.idea.vim.options.OptionConstants.Companion.timeoutlenName | ||||||
|  | import com.maddyhome.idea.vim.options.OptionScope | ||||||
|  | import com.maddyhome.idea.vim.options.helpers.KeywordOptionHelper | ||||||
|  | import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * COMPATIBILITY-LAYER: Added a class and package | ||||||
|  |  */ | ||||||
|  | object OptionsManager { | ||||||
|  |   val ignorecase: ToggleOption | ||||||
|  |     get() = (injector.optionService as IjVimOptionService).getRawOption(ignorecaseName) as ToggleOption | ||||||
|  |   val smartcase: ToggleOption | ||||||
|  |     get() = (injector.optionService as IjVimOptionService).getRawOption(smartcaseName) as ToggleOption | ||||||
|  |   val timeout: ToggleOption | ||||||
|  |     get() = (injector.optionService as IjVimOptionService).getRawOption(timeoutName) as ToggleOption | ||||||
|  |   val timeoutlen: NumberOption | ||||||
|  |     get() = (injector.optionService as IjVimOptionService).getRawOption(timeoutlenName) as NumberOption | ||||||
|  |   val iskeyword: KeywordOption | ||||||
|  |     get() = KeywordOption(KeywordOptionHelper) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class KeywordOption(val helper: KeywordOptionHelper) { | ||||||
|  |   fun toRegex(): List<String> { | ||||||
|  |     return helper.toRegex() | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | object StrictMode { | ||||||
|  |   fun fail(message: String) { | ||||||
|  |     if (injector.optionService.isSet(OptionScope.GLOBAL, OptionConstants.ideastrictmodeName)) { | ||||||
|  |       error(message) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -4,7 +4,7 @@ import com.intellij.openapi.components.Service | |||||||
| import com.intellij.openapi.components.service | import com.intellij.openapi.components.service | ||||||
| import com.intellij.util.containers.MultiMap | import com.intellij.util.containers.MultiMap | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.key.MappingOwner | import com.maddyhome.idea.vim.key.MappingOwner | ||||||
| import com.maddyhome.idea.vim.key.ToKeysMappingInfo | import com.maddyhome.idea.vim.key.ToKeysMappingInfo | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,8 +20,8 @@ package com.maddyhome.idea.vim.ui | |||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.KeyHandler | import com.maddyhome.idea.vim.KeyHandler | ||||||
| import com.maddyhome.idea.vim.api.VimEditor | import com.maddyhome.idea.vim.api.VimEditor | ||||||
| import com.maddyhome.idea.vim.helper.commandState |  | ||||||
| import com.maddyhome.idea.vim.helper.isCloseKeyStroke | import com.maddyhome.idea.vim.helper.isCloseKeyStroke | ||||||
|  | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import java.awt.KeyEventDispatcher | import java.awt.KeyEventDispatcher | ||||||
| import java.awt.KeyboardFocusManager | import java.awt.KeyboardFocusManager | ||||||
| import java.awt.Toolkit | import java.awt.Toolkit | ||||||
| @@ -62,7 +62,7 @@ object ModalEntry { | |||||||
|         } else { |         } else { | ||||||
|           return true |           return true | ||||||
|         } |         } | ||||||
|         if (editor.commandState.isRecording) { |         if (editor.vimStateMachine.isRecording) { | ||||||
|           KeyHandler.getInstance().modalEntryKeys += stroke |           KeyHandler.getInstance().modalEntryKeys += stroke | ||||||
|         } |         } | ||||||
|         if (!processor(stroke)) { |         if (!processor(stroke)) { | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ import com.intellij.util.Consumer | |||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.helper.EngineStringHelper | import com.maddyhome.idea.vim.helper.EngineStringHelper | ||||||
| import com.maddyhome.idea.vim.helper.VimNlsSafe | import com.maddyhome.idea.vim.helper.VimNlsSafe | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import com.maddyhome.idea.vim.options.OptionChangeListener | import com.maddyhome.idea.vim.options.OptionChangeListener | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants | import com.maddyhome.idea.vim.options.OptionConstants | ||||||
| @@ -70,7 +70,7 @@ object ShowCmd { | |||||||
|   fun getFullText(editor: Editor?): String { |   fun getFullText(editor: Editor?): String { | ||||||
|     if (!VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.showcmdName) || editor == null || editor.isDisposed) return "" |     if (!VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.showcmdName) || editor == null || editor.isDisposed) return "" | ||||||
|  |  | ||||||
|     val editorState = editor.vim.commandState |     val editorState = editor.vim.vimStateMachine | ||||||
|     return EngineStringHelper.toPrintableCharacters(editorState.commandBuilder.keys + editorState.mappingState.keys) |     return EngineStringHelper.toPrintableCharacters(editorState.commandBuilder.keys + editorState.mappingState.keys) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,49 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package com.maddyhome.idea.vim.vimscript.model.functions.handlers | ||||||
|  |  | ||||||
|  | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
|  | import com.maddyhome.idea.vim.api.VimEditor | ||||||
|  | import com.maddyhome.idea.vim.ex.ExException | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.VimLContext | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimList | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.expressions.Expression | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.functions.FunctionHandler | ||||||
|  |  | ||||||
|  | class JoinFunctionHandler : FunctionHandler() { | ||||||
|  |   override val name: String = "join" | ||||||
|  |   override val minimumNumberOfArguments: Int = 1 | ||||||
|  |   override val maximumNumberOfArguments: Int = 2 | ||||||
|  |  | ||||||
|  |   override fun doFunction( | ||||||
|  |     argumentValues: List<Expression>, | ||||||
|  |     editor: VimEditor, | ||||||
|  |     context: ExecutionContext, | ||||||
|  |     vimContext: VimLContext, | ||||||
|  |   ): VimDataType { | ||||||
|  |     val firstArgument = argumentValues[0].evaluate(editor, context, vimContext) | ||||||
|  |     if (firstArgument !is VimList) { | ||||||
|  |       throw ExException("E714: List required") | ||||||
|  |     } | ||||||
|  |     val secondArgument = argumentValues.getOrNull(1)?.evaluate(editor, context, vimContext) ?: VimString(" ") | ||||||
|  |     return VimString(firstArgument.values.joinToString(secondArgument.asString()) { it.toString() }) | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package com.maddyhome.idea.vim.vimscript.model.functions.handlers | ||||||
|  |  | ||||||
|  | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
|  | import com.maddyhome.idea.vim.api.VimEditor | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.VimLContext | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.expressions.Expression | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.functions.FunctionHandler | ||||||
|  | import java.util.* | ||||||
|  |  | ||||||
|  | class TolowerFunctionHandler : FunctionHandler() { | ||||||
|  |   override val name: String = "tolower" | ||||||
|  |   override val minimumNumberOfArguments: Int = 1 | ||||||
|  |   override val maximumNumberOfArguments: Int = 1 | ||||||
|  |  | ||||||
|  |   override fun doFunction( | ||||||
|  |     argumentValues: List<Expression>, | ||||||
|  |     editor: VimEditor, | ||||||
|  |     context: ExecutionContext, | ||||||
|  |     vimContext: VimLContext, | ||||||
|  |   ): VimDataType { | ||||||
|  |     val argumentString = argumentValues[0].evaluate(editor, context, vimContext).asString() | ||||||
|  |     return VimString(argumentString.lowercase(Locale.getDefault())) | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | /* | ||||||
|  |  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||||
|  |  * Copyright (C) 2003-2022 The IdeaVim authors | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package com.maddyhome.idea.vim.vimscript.model.functions.handlers | ||||||
|  |  | ||||||
|  | import com.maddyhome.idea.vim.api.ExecutionContext | ||||||
|  | import com.maddyhome.idea.vim.api.VimEditor | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.VimLContext | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.expressions.Expression | ||||||
|  | import com.maddyhome.idea.vim.vimscript.model.functions.FunctionHandler | ||||||
|  | import java.util.* | ||||||
|  |  | ||||||
|  | class ToupperFunctionHandler : FunctionHandler() { | ||||||
|  |   override val name: String = "toupper" | ||||||
|  |   override val minimumNumberOfArguments: Int = 1 | ||||||
|  |   override val maximumNumberOfArguments: Int = 1 | ||||||
|  |  | ||||||
|  |   override fun doFunction( | ||||||
|  |     argumentValues: List<Expression>, | ||||||
|  |     editor: VimEditor, | ||||||
|  |     context: ExecutionContext, | ||||||
|  |     vimContext: VimLContext, | ||||||
|  |   ): VimDataType { | ||||||
|  |     val argumentString = argumentValues[0].evaluate(editor, context, vimContext).asString() | ||||||
|  |     return VimString(argumentString.uppercase(Locale.getDefault())) | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -25,9 +25,9 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl | |||||||
| import com.intellij.codeInsight.template.impl.TemplateManagerImpl | import com.intellij.codeInsight.template.impl.TemplateManagerImpl | ||||||
| import com.intellij.openapi.editor.Editor | import com.intellij.openapi.editor.Editor | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
|  | import com.maddyhome.idea.vim.helper.editorMode | ||||||
| import com.maddyhome.idea.vim.helper.hasBlockOrUnderscoreCaret | import com.maddyhome.idea.vim.helper.hasBlockOrUnderscoreCaret | ||||||
| import com.maddyhome.idea.vim.helper.hasVisualSelection | import com.maddyhome.idea.vim.helper.hasVisualSelection | ||||||
| import com.maddyhome.idea.vim.helper.mode |  | ||||||
| import com.maddyhome.idea.vim.helper.subMode | import com.maddyhome.idea.vim.helper.subMode | ||||||
| import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor | import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| @@ -42,12 +42,12 @@ object IdeaRefactorModeHelper { | |||||||
|  |  | ||||||
|   fun correctSelection(editor: Editor) { |   fun correctSelection(editor: Editor) { | ||||||
|     val action: () -> Unit = { |     val action: () -> Unit = { | ||||||
|       if (!editor.mode.hasVisualSelection && editor.selectionModel.hasSelection()) { |       if (!editor.editorMode.hasVisualSelection && editor.selectionModel.hasSelection()) { | ||||||
|         SelectionVimListenerSuppressor.lock().use { |         SelectionVimListenerSuppressor.lock().use { | ||||||
|           editor.selectionModel.removeSelection() |           editor.selectionModel.removeSelection() | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       if (editor.mode.hasVisualSelection && editor.selectionModel.hasSelection()) { |       if (editor.editorMode.hasVisualSelection && editor.selectionModel.hasSelection()) { | ||||||
|         val autodetectedSubmode = VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim) |         val autodetectedSubmode = VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim) | ||||||
|         if (editor.subMode != autodetectedSubmode) { |         if (editor.subMode != autodetectedSubmode) { | ||||||
|           // Update the submode |           // Update the submode | ||||||
|   | |||||||
| @@ -162,7 +162,7 @@ object CommandVisitor : VimscriptBaseVisitor<Command>() { | |||||||
|     val ranges = createRange(valueAndOffset.first, valueAndOffset.second, move) |     val ranges = createRange(valueAndOffset.first, valueAndOffset.second, move) | ||||||
|     if (ranges == null) { |     if (ranges == null) { | ||||||
|       logger.warn("Could not create a range for node ${ctx.text}") |       logger.warn("Could not create a range for node ${ctx.text}") | ||||||
|       throw ExException("Could not create a range") |       throw ExException("Could not create a range ${ctx.text}") | ||||||
|     } |     } | ||||||
|     return ranges |     return ranges | ||||||
|   } |   } | ||||||
| @@ -180,7 +180,7 @@ object CommandVisitor : VimscriptBaseVisitor<Command>() { | |||||||
|   override fun visitLet1Command(ctx: VimscriptParser.Let1CommandContext): Command { |   override fun visitLet1Command(ctx: VimscriptParser.Let1CommandContext): Command { | ||||||
|     val ranges: Ranges = parseRanges(ctx.range()) |     val ranges: Ranges = parseRanges(ctx.range()) | ||||||
|     val variable: Expression = expressionVisitor.visit(ctx.expr(0)) |     val variable: Expression = expressionVisitor.visit(ctx.expr(0)) | ||||||
|     val operator = getByValue(ctx.assignmentOperator.text) |     val operator = getByValue(ctx.assignmentOperator().text) | ||||||
|     val expression: Expression = expressionVisitor.visit(ctx.expr(1)) |     val expression: Expression = expressionVisitor.visit(ctx.expr(1)) | ||||||
|     return LetCommand(ranges, variable, operator, expression, true) |     return LetCommand(ranges, variable, operator, expression, true) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString | |||||||
| import com.maddyhome.idea.vim.vimscript.model.expressions.Scope | import com.maddyhome.idea.vim.vimscript.model.expressions.Scope | ||||||
| import com.maddyhome.idea.vim.vimscript.model.expressions.Variable | import com.maddyhome.idea.vim.vimscript.model.expressions.Variable | ||||||
| 
 | 
 | ||||||
| internal class VimVariableServiceImpl : VimVariableServiceBase() { | class IjVariableService : VimVariableServiceBase() { | ||||||
|   override fun storeVariable(variable: Variable, value: VimDataType, editor: VimEditor, context: ExecutionContext, vimContext: VimLContext) { |   override fun storeVariable(variable: Variable, value: VimDataType, editor: VimEditor, context: ExecutionContext, vimContext: VimLContext) { | ||||||
|     super.storeVariable(variable, value, editor, context, vimContext) |     super.storeVariable(variable, value, editor, context, vimContext) | ||||||
| 
 | 
 | ||||||
| @@ -20,9 +20,9 @@ package com.maddyhome.idea.vim.vimscript.services | |||||||
|  |  | ||||||
| import com.intellij.openapi.application.ApplicationNamesInfo | import com.intellij.openapi.application.ApplicationNamesInfo | ||||||
| import com.maddyhome.idea.vim.api.VimOptionServiceBase | import com.maddyhome.idea.vim.api.VimOptionServiceBase | ||||||
|  | import com.maddyhome.idea.vim.option.ToggleOption | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants | import com.maddyhome.idea.vim.options.OptionConstants | ||||||
| import com.maddyhome.idea.vim.options.StringOption | import com.maddyhome.idea.vim.options.StringOption | ||||||
| import com.maddyhome.idea.vim.options.ToggleOption |  | ||||||
|  |  | ||||||
| internal class IjVimOptionService : VimOptionServiceBase() { | internal class IjVimOptionService : VimOptionServiceBase() { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,13 +26,13 @@ | |||||||
|                         serviceInterface="com.maddyhome.idea.vim.api.VimVisualMotionGroup"/> |                         serviceInterface="com.maddyhome.idea.vim.api.VimVisualMotionGroup"/> | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.YankGroup"/> |     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.YankGroup"/> | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.PutGroup"/> |     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.PutGroup"/> | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.vimscript.services.VimVariableServiceImpl" |     <applicationService serviceImplementation="com.maddyhome.idea.vim.vimscript.services.IjVariableService" | ||||||
|                         serviceInterface="com.maddyhome.idea.vim.vimscript.services.VimVariableService"/> |                         serviceInterface="com.maddyhome.idea.vim.vimscript.services.VariableService"/> | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.IjStatisticsService" |     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.IjStatisticsService" | ||||||
|                         serviceInterface="com.maddyhome.idea.vim.api.VimStatistics"/> |                         serviceInterface="com.maddyhome.idea.vim.api.VimStatistics"/> | ||||||
|  |  | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.vimscript.services.IjVimOptionService" |     <applicationService serviceImplementation="com.maddyhome.idea.vim.vimscript.services.IjVimOptionService" | ||||||
|                         serviceInterface="com.maddyhome.idea.vim.options.OptionService"/> |                         serviceInterface="com.maddyhome.idea.vim.vimscript.services.OptionService"/> | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.IjVimStorageService" |     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.IjVimStorageService" | ||||||
|                         serviceInterface="com.maddyhome.idea.vim.api.VimStorageService"/> |                         serviceInterface="com.maddyhome.idea.vim.api.VimStorageService"/> | ||||||
|     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.IjVimSystemInfoService" |     <applicationService serviceImplementation="com.maddyhome.idea.vim.group.IjVimSystemInfoService" | ||||||
|   | |||||||
| @@ -11,5 +11,8 @@ | |||||||
|     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.FuncrefFunctionHandler" name="funcref"/> |     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.FuncrefFunctionHandler" name="funcref"/> | ||||||
|     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.HasFunctionHandler" name="has"/> |     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.HasFunctionHandler" name="has"/> | ||||||
|     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.SubmatchFunctionHandler" name="submatch"/> |     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.SubmatchFunctionHandler" name="submatch"/> | ||||||
|  |     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.TolowerFunctionHandler" name="tolower"/> | ||||||
|  |     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.ToupperFunctionHandler" name="toupper"/> | ||||||
|  |     <vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.JoinFunctionHandler" name="join"/> | ||||||
|   </extensions> |   </extensions> | ||||||
| </idea-plugin> | </idea-plugin> | ||||||
| @@ -24,16 +24,15 @@ import com.intellij.openapi.project.Project; | |||||||
| import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; | import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; | ||||||
| import com.maddyhome.idea.vim.KeyHandler; | import com.maddyhome.idea.vim.KeyHandler; | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import com.maddyhome.idea.vim.group.visual.VimVisualTimer; | import com.maddyhome.idea.vim.group.visual.VimVisualTimer; | ||||||
| import com.maddyhome.idea.vim.helper.EditorDataContext; | import com.maddyhome.idea.vim.helper.EditorDataContext; | ||||||
| import com.maddyhome.idea.vim.helper.RunnableHelper; | import com.maddyhome.idea.vim.helper.RunnableHelper; | ||||||
| import com.maddyhome.idea.vim.helper.TestInputModel; | import com.maddyhome.idea.vim.helper.TestInputModel; | ||||||
| import com.maddyhome.idea.vim.newapi.IjExecutionContext; | import com.maddyhome.idea.vim.newapi.IjExecutionContext; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import com.maddyhome.idea.vim.ui.ex.ExEntryPanel; |  | ||||||
| import com.maddyhome.idea.vim.options.OptionScope; | import com.maddyhome.idea.vim.options.OptionScope; | ||||||
| import com.maddyhome.idea.vim.vimscript.services.VimVariableServiceImpl; | import com.maddyhome.idea.vim.ui.ex.ExEntryPanel; | ||||||
| import org.jetbrains.annotations.NotNull; | import org.jetbrains.annotations.NotNull; | ||||||
| import org.jetbrains.annotations.Nullable; | import org.jetbrains.annotations.Nullable; | ||||||
|  |  | ||||||
| @@ -63,7 +62,7 @@ public abstract class JavaVimTestCase extends JavaCodeInsightFixtureTestCase { | |||||||
|   @Override |   @Override | ||||||
|   protected void tearDown() throws Exception { |   protected void tearDown() throws Exception { | ||||||
|     ExEntryPanel.getInstance().deactivate(false); |     ExEntryPanel.getInstance().deactivate(false); | ||||||
|     ((VimVariableServiceImpl) VimPlugin.getVariableService()).clear(); |     VimPlugin.getVariableService().clear(); | ||||||
|     Timer swingTimer = VimVisualTimer.INSTANCE.getSwingTimer(); |     Timer swingTimer = VimVisualTimer.INSTANCE.getSwingTimer(); | ||||||
|     if (swingTimer != null) { |     if (swingTimer != null) { | ||||||
|       swingTimer.stop(); |       swingTimer.stop(); | ||||||
| @@ -107,8 +106,8 @@ public abstract class JavaVimTestCase extends JavaCodeInsightFixtureTestCase { | |||||||
|     return editor; |     return editor; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void assertMode(@NotNull CommandState.Mode expectedMode) { |   public void assertMode(@NotNull VimStateMachine.Mode expectedMode) { | ||||||
|     final CommandState.Mode mode = CommandState.getInstance(new IjVimEditor(myFixture.getEditor())).getMode(); |     final VimStateMachine.Mode mode = VimStateMachine.getInstance(new IjVimEditor(myFixture.getEditor())).getMode(); | ||||||
|     assertEquals(expectedMode, mode); |     assertEquals(expectedMode, mode); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ import com.maddyhome.idea.vim.VimPlugin | |||||||
| import com.maddyhome.idea.vim.command.SelectionType | import com.maddyhome.idea.vim.command.SelectionType | ||||||
| import com.maddyhome.idea.vim.common.CharacterPosition | import com.maddyhome.idea.vim.common.CharacterPosition | ||||||
| import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import com.maddyhome.idea.vim.register.RegisterConstants.ALTERNATE_BUFFER_REGISTER | import com.maddyhome.idea.vim.register.RegisterConstants.ALTERNATE_BUFFER_REGISTER | ||||||
| import com.maddyhome.idea.vim.register.RegisterConstants.BLACK_HOLE_REGISTER | import com.maddyhome.idea.vim.register.RegisterConstants.BLACK_HOLE_REGISTER | ||||||
| @@ -153,7 +153,7 @@ internal object NeovimTesting { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private fun assertMode(editor: Editor) { |   private fun assertMode(editor: Editor) { | ||||||
|     val ideavimState = editor.vim.commandState.toVimNotation() |     val ideavimState = editor.vim.vimStateMachine.toVimNotation() | ||||||
|     val neovimState = neovimApi.mode.get().mode |     val neovimState = neovimApi.mode.get().mode | ||||||
|     assertEquals(neovimState, ideavimState) |     assertEquals(neovimState, ideavimState) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -21,10 +21,10 @@ package org.jetbrains.plugins.ideavim | |||||||
| import com.maddyhome.idea.vim.RegisterActions.VIM_ACTIONS_EP | import com.maddyhome.idea.vim.RegisterActions.VIM_ACTIONS_EP | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.common.CommandNode | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.CommandPartNode | import com.maddyhome.idea.vim.key.CommandNode | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.key.CommandPartNode | ||||||
| import com.maddyhome.idea.vim.handler.ActionBeanClass | import com.maddyhome.idea.vim.handler.ActionBeanClass | ||||||
| import junit.framework.TestCase | import junit.framework.TestCase | ||||||
| import javax.swing.KeyStroke | import javax.swing.KeyStroke | ||||||
| @@ -33,7 +33,7 @@ class RegisterActionsTest : VimTestCase() { | |||||||
|   fun `test simple action`() { |   fun `test simple action`() { | ||||||
|     val before = "I ${c}found it in a legendary land" |     val before = "I ${c}found it in a legendary land" | ||||||
|     val after = "I f${c}ound it in a legendary land" |     val after = "I f${c}ound it in a legendary land" | ||||||
|     doTest("l", before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("l", before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION) |   @TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION) | ||||||
| @@ -44,7 +44,7 @@ class RegisterActionsTest : VimTestCase() { | |||||||
|     val keys = injector.parser.parseKeys("jklwB") // just random keys |     val keys = injector.parser.parseKeys("jklwB") // just random keys | ||||||
|     val before = "I ${c}found it in a legendary land" |     val before = "I ${c}found it in a legendary land" | ||||||
|     val after = "I jklwB${c}found it in a legendary land" |     val after = "I jklwB${c}found it in a legendary land" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) { |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) { | ||||||
|       VimPlugin.setEnabled(false) |       VimPlugin.setEnabled(false) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -54,7 +54,7 @@ class RegisterActionsTest : VimTestCase() { | |||||||
|     val keys = injector.parser.parseKeys("l") |     val keys = injector.parser.parseKeys("l") | ||||||
|     val before = "I ${c}found it in a legendary land" |     val before = "I ${c}found it in a legendary land" | ||||||
|     val after = "I f${c}ound it in a legendary land" |     val after = "I f${c}ound it in a legendary land" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) { |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) { | ||||||
|       VimPlugin.setEnabled(false) |       VimPlugin.setEnabled(false) | ||||||
|       VimPlugin.setEnabled(true) |       VimPlugin.setEnabled(true) | ||||||
|     } |     } | ||||||
| @@ -65,7 +65,7 @@ class RegisterActionsTest : VimTestCase() { | |||||||
|     val keys = injector.parser.parseKeys("l") |     val keys = injector.parser.parseKeys("l") | ||||||
|     val before = "I ${c}found it in a legendary land" |     val before = "I ${c}found it in a legendary land" | ||||||
|     val after = "I f${c}ound it in a legendary land" |     val after = "I f${c}ound it in a legendary land" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) { |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) { | ||||||
|       VimPlugin.setEnabled(false) |       VimPlugin.setEnabled(false) | ||||||
|       VimPlugin.setEnabled(true) |       VimPlugin.setEnabled(true) | ||||||
|       VimPlugin.setEnabled(true) |       VimPlugin.setEnabled(true) | ||||||
| @@ -78,7 +78,7 @@ class RegisterActionsTest : VimTestCase() { | |||||||
|     val before = "I ${c}found it in a legendary land" |     val before = "I ${c}found it in a legendary land" | ||||||
|     val after = "I f${c}ound it in a legendary land" |     val after = "I f${c}ound it in a legendary land" | ||||||
|     var motionRightAction: ActionBeanClass? = null |     var motionRightAction: ActionBeanClass? = null | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) { |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) { | ||||||
|       motionRightAction = VIM_ACTIONS_EP.extensions().filter { it.actionId == "VimPreviousTabAction" }.findFirst().get() |       motionRightAction = VIM_ACTIONS_EP.extensions().filter { it.actionId == "VimPreviousTabAction" }.findFirst().get() | ||||||
|  |  | ||||||
|       assertNotNull(getCommandNode()) |       assertNotNull(getCommandNode()) | ||||||
|   | |||||||
| @@ -24,9 +24,9 @@ import com.intellij.openapi.editor.LogicalPosition | |||||||
| import com.intellij.testFramework.EditorTestUtil | import com.intellij.testFramework.EditorTestUtil | ||||||
| import com.intellij.testFramework.fixtures.CodeInsightTestFixture | import com.intellij.testFramework.fixtures.CodeInsightTestFixture | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.TextRange | import com.maddyhome.idea.vim.common.TextRange | ||||||
| import com.maddyhome.idea.vim.helper.mode | import com.maddyhome.idea.vim.helper.editorMode | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants | import com.maddyhome.idea.vim.options.OptionConstants | ||||||
| import com.maddyhome.idea.vim.options.OptionScope | import com.maddyhome.idea.vim.options.OptionScope | ||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimInt | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimInt | ||||||
| @@ -77,10 +77,10 @@ inline fun waitAndAssert(timeInMillis: Int = 1000, condition: () -> Boolean) { | |||||||
|  |  | ||||||
| fun waitAndAssertMode( | fun waitAndAssertMode( | ||||||
|   fixture: CodeInsightTestFixture, |   fixture: CodeInsightTestFixture, | ||||||
|   mode: CommandState.Mode, |   mode: VimStateMachine.Mode, | ||||||
|   timeInMillis: Int = (VimPlugin.getOptionService().getOptionValue(OptionScope.GLOBAL, OptionConstants.visualdelayName) as VimInt).value + 1000, |   timeInMillis: Int = (VimPlugin.getOptionService().getOptionValue(OptionScope.GLOBAL, OptionConstants.visualdelayName) as VimInt).value + 1000, | ||||||
| ) { | ) { | ||||||
|   waitAndAssert(timeInMillis) { fixture.editor.mode == mode } |   waitAndAssert(timeInMillis) { fixture.editor.editorMode == mode } | ||||||
| } | } | ||||||
|  |  | ||||||
| fun assertDoesntChange(timeInMillis: Int = 1000, condition: () -> Boolean) { | fun assertDoesntChange(timeInMillis: Int = 1000, condition: () -> Boolean) { | ||||||
|   | |||||||
| @@ -50,9 +50,9 @@ import com.maddyhome.idea.vim.KeyHandler | |||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.action.VimShortcutKeyAction | import com.maddyhome.idea.vim.action.VimShortcutKeyAction | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.command.CommandState.SubMode | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.VimStateMachine.SubMode | ||||||
| import com.maddyhome.idea.vim.ex.ExException | import com.maddyhome.idea.vim.ex.ExException | ||||||
| import com.maddyhome.idea.vim.ex.ExOutputModel.Companion.getInstance | import com.maddyhome.idea.vim.ex.ExOutputModel.Companion.getInstance | ||||||
| import com.maddyhome.idea.vim.group.visual.VimVisualTimer.swingTimer | import com.maddyhome.idea.vim.group.visual.VimVisualTimer.swingTimer | ||||||
| @@ -61,9 +61,9 @@ import com.maddyhome.idea.vim.helper.EditorHelper | |||||||
| import com.maddyhome.idea.vim.helper.GuicursorChangeListener | import com.maddyhome.idea.vim.helper.GuicursorChangeListener | ||||||
| import com.maddyhome.idea.vim.helper.RunnableHelper.runWriteCommand | import com.maddyhome.idea.vim.helper.RunnableHelper.runWriteCommand | ||||||
| import com.maddyhome.idea.vim.helper.TestInputModel | import com.maddyhome.idea.vim.helper.TestInputModel | ||||||
|  | import com.maddyhome.idea.vim.helper.editorMode | ||||||
| import com.maddyhome.idea.vim.helper.getGuiCursorMode | import com.maddyhome.idea.vim.helper.getGuiCursorMode | ||||||
| import com.maddyhome.idea.vim.helper.inBlockSubMode | import com.maddyhome.idea.vim.helper.inBlockSubMode | ||||||
| import com.maddyhome.idea.vim.helper.mode |  | ||||||
| import com.maddyhome.idea.vim.helper.subMode | import com.maddyhome.idea.vim.helper.subMode | ||||||
| import com.maddyhome.idea.vim.key.MappingOwner | import com.maddyhome.idea.vim.key.MappingOwner | ||||||
| import com.maddyhome.idea.vim.key.ToKeysMappingInfo | import com.maddyhome.idea.vim.key.ToKeysMappingInfo | ||||||
| @@ -77,7 +77,6 @@ import com.maddyhome.idea.vim.ui.ex.ExEntryPanel | |||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimFuncref | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimFuncref | ||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimInt | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimInt | ||||||
| import com.maddyhome.idea.vim.vimscript.parser.errors.IdeavimErrorListener | import com.maddyhome.idea.vim.vimscript.parser.errors.IdeavimErrorListener | ||||||
| import com.maddyhome.idea.vim.vimscript.services.VimVariableServiceImpl |  | ||||||
| import org.assertj.core.api.Assertions | import org.assertj.core.api.Assertions | ||||||
| import org.junit.Assert | import org.junit.Assert | ||||||
| import java.awt.event.KeyEvent | import java.awt.event.KeyEvent | ||||||
| @@ -137,7 +136,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     } |     } | ||||||
|     SelectionVimListenerSuppressor.lock().use { myFixture.tearDown() } |     SelectionVimListenerSuppressor.lock().use { myFixture.tearDown() } | ||||||
|     ExEntryPanel.getInstance().deactivate(false) |     ExEntryPanel.getInstance().deactivate(false) | ||||||
|     (VimPlugin.getVariableService() as VimVariableServiceImpl).clear() |     VimPlugin.getVariableService().clear() | ||||||
|     VimFuncref.lambdaCounter = 0 |     VimFuncref.lambdaCounter = 0 | ||||||
|     VimFuncref.anonymousCounter = 0 |     VimFuncref.anonymousCounter = 0 | ||||||
|     IdeavimErrorListener.testLogger.clear() |     IdeavimErrorListener.testLogger.clear() | ||||||
| @@ -439,8 +438,8 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun assertMode(expectedMode: CommandState.Mode) { |   fun assertMode(expectedMode: VimStateMachine.Mode) { | ||||||
|     val mode = myFixture.editor.mode |     val mode = myFixture.editor.editorMode | ||||||
|     Assert.assertEquals(expectedMode, mode) |     Assert.assertEquals(expectedMode, mode) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -505,14 +504,14 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     before: String, |     before: String, | ||||||
|     after: String, |     after: String, | ||||||
|   ) { |   ) { | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun doTest( |   fun doTest( | ||||||
|     keys: List<String>, |     keys: List<String>, | ||||||
|     before: String, |     before: String, | ||||||
|     after: String, |     after: String, | ||||||
|     modeAfter: CommandState.Mode, |     modeAfter: VimStateMachine.Mode, | ||||||
|     subModeAfter: SubMode, |     subModeAfter: SubMode, | ||||||
|   ) { |   ) { | ||||||
|     doTest(keys.joinToString(separator = ""), before, after, modeAfter, subModeAfter) |     doTest(keys.joinToString(separator = ""), before, after, modeAfter, subModeAfter) | ||||||
| @@ -522,7 +521,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     keys: String, |     keys: String, | ||||||
|     before: String, |     before: String, | ||||||
|     after: String, |     after: String, | ||||||
|     modeAfter: CommandState.Mode, |     modeAfter: VimStateMachine.Mode, | ||||||
|     subModeAfter: SubMode, |     subModeAfter: SubMode, | ||||||
|   ) { |   ) { | ||||||
|     configureByText(before) |     configureByText(before) | ||||||
| @@ -536,7 +535,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     keys: String, |     keys: String, | ||||||
|     before: String, |     before: String, | ||||||
|     after: String, |     after: String, | ||||||
|     modeAfter: CommandState.Mode, |     modeAfter: VimStateMachine.Mode, | ||||||
|     subModeAfter: SubMode, |     subModeAfter: SubMode, | ||||||
|     fileType: FileType, |     fileType: FileType, | ||||||
|   ) { |   ) { | ||||||
| @@ -554,7 +553,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     keys: String, |     keys: String, | ||||||
|     before: String, |     before: String, | ||||||
|     after: String, |     after: String, | ||||||
|     modeAfter: CommandState.Mode, |     modeAfter: VimStateMachine.Mode, | ||||||
|     subModeAfter: SubMode, |     subModeAfter: SubMode, | ||||||
|     fileName: String, |     fileName: String, | ||||||
|   ) { |   ) { | ||||||
| @@ -568,7 +567,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     NeovimTesting.assertState(myFixture.editor, this) |     NeovimTesting.assertState(myFixture.editor, this) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   protected fun performTest(keys: String, after: String, modeAfter: CommandState.Mode, subModeAfter: SubMode) { |   protected fun performTest(keys: String, after: String, modeAfter: VimStateMachine.Mode, subModeAfter: SubMode) { | ||||||
|     typeText(injector.parser.parseKeys(keys)) |     typeText(injector.parser.parseKeys(keys)) | ||||||
|     PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue() |     PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue() | ||||||
|     @Suppress("IdeaVimAssertState") |     @Suppress("IdeaVimAssertState") | ||||||
| @@ -580,7 +579,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     keys: List<KeyStroke>, |     keys: List<KeyStroke>, | ||||||
|     before: String, |     before: String, | ||||||
|     after: String?, |     after: String?, | ||||||
|     modeAfter: CommandState.Mode, |     modeAfter: VimStateMachine.Mode, | ||||||
|     subModeAfter: SubMode, |     subModeAfter: SubMode, | ||||||
|     afterEditorInitialized: (Editor) -> Unit, |     afterEditorInitialized: (Editor) -> Unit, | ||||||
|   ) { |   ) { | ||||||
| @@ -597,7 +596,7 @@ abstract class VimTestCase : UsefulTestCase() { | |||||||
|     NeovimTesting.setRegister(register, keys, this) |     NeovimTesting.setRegister(register, keys, this) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   protected fun assertState(modeAfter: CommandState.Mode, subModeAfter: SubMode) { |   protected fun assertState(modeAfter: VimStateMachine.Mode, subModeAfter: SubMode) { | ||||||
|     assertMode(modeAfter) |     assertMode(modeAfter) | ||||||
|     assertSubMode(subModeAfter) |     assertSubMode(subModeAfter) | ||||||
|     assertCaretsVisualAttributes() |     assertCaretsVisualAttributes() | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ package org.jetbrains.plugins.ideavim.action | |||||||
| import com.intellij.codeInsight.folding.CodeFoldingManager | import com.intellij.codeInsight.folding.CodeFoldingManager | ||||||
| import com.intellij.codeInsight.folding.impl.FoldingUtil | import com.intellij.codeInsight.folding.impl.FoldingUtil | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason | import org.jetbrains.plugins.ideavim.SkipNeovimReason | ||||||
| import org.jetbrains.plugins.ideavim.TestWithoutNeovim | import org.jetbrains.plugins.ideavim.TestWithoutNeovim | ||||||
| @@ -33,8 +33,8 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   // VIM-620 |i_CTRL-O| |   // VIM-620 |i_CTRL-O| | ||||||
|   fun testInsertSingleCommandAndInserting() { |   fun testInsertSingleCommandAndInserting() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "a", "123", "<Esc>", "x"), "abc${c}d\n", "abcd12\n", CommandState.Mode.COMMAND, |       listOf("i", "<C-O>", "a", "123", "<Esc>", "x"), "abc${c}d\n", "abcd12\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -42,7 +42,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting() { |   fun testInsertSingleCommandAndNewLineInserting() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "o", "123", "<Esc>", "x"), |       listOf("i", "<C-O>", "o", "123", "<Esc>", "x"), | ||||||
|       "abc${c}d\n", "abcd\n12\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "abc${c}d\n", "abcd\n12\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -50,7 +50,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting2() { |   fun testInsertSingleCommandAndNewLineInserting2() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "v"), |       listOf("i", "<C-O>", "v"), | ||||||
|       "12${c}345", "12${s}${c}3${se}45", CommandState.Mode.INSERT_VISUAL, CommandState.SubMode.VISUAL_CHARACTER |       "12${c}345", "12${s}${c}3${se}45", VimStateMachine.Mode.INSERT_VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -58,7 +58,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting3() { |   fun testInsertSingleCommandAndNewLineInserting3() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "v", "<esc>"), |       listOf("i", "<C-O>", "v", "<esc>"), | ||||||
|       "12${c}345", "12${c}345", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "12${c}345", "12${c}345", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -66,7 +66,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting4() { |   fun testInsertSingleCommandAndNewLineInserting4() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "v", "d"), |       listOf("i", "<C-O>", "v", "d"), | ||||||
|       "12${c}345", "12${c}45", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "12${c}345", "12${c}45", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -74,7 +74,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting5() { |   fun testInsertSingleCommandAndNewLineInserting5() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "v", "<C-G>"), |       listOf("i", "<C-O>", "v", "<C-G>"), | ||||||
|       "12${c}345", "12${s}3${c}${se}45", CommandState.Mode.INSERT_SELECT, CommandState.SubMode.VISUAL_CHARACTER |       "12${c}345", "12${s}3${c}${se}45", VimStateMachine.Mode.INSERT_SELECT, VimStateMachine.SubMode.VISUAL_CHARACTER | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -82,7 +82,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting6() { |   fun testInsertSingleCommandAndNewLineInserting6() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "gh"), |       listOf("i", "<C-O>", "gh"), | ||||||
|       "12${c}345", "12${s}3${c}${se}45", CommandState.Mode.INSERT_SELECT, CommandState.SubMode.VISUAL_CHARACTER |       "12${c}345", "12${s}3${c}${se}45", VimStateMachine.Mode.INSERT_SELECT, VimStateMachine.SubMode.VISUAL_CHARACTER | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -90,7 +90,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommandAndNewLineInserting7() { |   fun testInsertSingleCommandAndNewLineInserting7() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "<C-O>", "gh", "<esc>"), |       listOf("i", "<C-O>", "gh", "<esc>"), | ||||||
|       "12${c}345", "123${c}45", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "12${c}345", "123${c}45", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -109,58 +109,58 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertSingleCommand() { |   fun testInsertSingleCommand() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("i", "def", "<C-O>", "d2h", "x"), |       listOf("i", "def", "<C-O>", "d2h", "x"), | ||||||
|       "abc$c.\n", "abcdx.\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "abc$c.\n", "abcdx.\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-321 |d| |count| |   // VIM-321 |d| |count| | ||||||
|   fun testDeleteEmptyRange() { |   fun testDeleteEmptyRange() { | ||||||
|     doTest("d0", "${c}hello\n", "hello\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("d0", "${c}hello\n", "hello\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-157 |~| |   // VIM-157 |~| | ||||||
|   fun testToggleCharCase() { |   fun testToggleCharCase() { | ||||||
|     doTest("~~", "${c}hello world\n", "HEllo world\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("~~", "${c}hello world\n", "HEllo world\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-157 |~| |   // VIM-157 |~| | ||||||
|   fun testToggleCharCaseLineEnd() { |   fun testToggleCharCaseLineEnd() { | ||||||
|     doTest("~~", "hello wor${c}ld\n", "hello worLD\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("~~", "hello wor${c}ld\n", "hello worLD\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testToggleCaseMotion() { |   fun testToggleCaseMotion() { | ||||||
|     doTest("g~w", "${c}FooBar Baz\n", "fOObAR Baz\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("g~w", "${c}FooBar Baz\n", "fOObAR Baz\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testChangeUpperCase() { |   fun testChangeUpperCase() { | ||||||
|     doTest( |     doTest( | ||||||
|       "gUw", "${c}FooBar Baz\n", "FOOBAR Baz\n", CommandState.Mode.COMMAND, |       "gUw", "${c}FooBar Baz\n", "FOOBAR Baz\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testChangeLowerCase() { |   fun testChangeLowerCase() { | ||||||
|     doTest("guw", "${c}FooBar Baz\n", "foobar Baz\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("guw", "${c}FooBar Baz\n", "foobar Baz\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testToggleCaseVisual() { |   fun testToggleCaseVisual() { | ||||||
|     doTest( |     doTest( | ||||||
|       "ve~", "${c}FooBar Baz\n", "fOObAR Baz\n", CommandState.Mode.COMMAND, |       "ve~", "${c}FooBar Baz\n", "fOObAR Baz\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testChangeUpperCaseVisual() { |   fun testChangeUpperCaseVisual() { | ||||||
|     doTest( |     doTest( | ||||||
|       "veU", "${c}FooBar Baz\n", "FOOBAR Baz\n", CommandState.Mode.COMMAND, |       "veU", "${c}FooBar Baz\n", "FOOBAR Baz\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testChangeLowerCaseVisual() { |   fun testChangeLowerCaseVisual() { | ||||||
|     doTest( |     doTest( | ||||||
|       "veu", "${c}FooBar Baz\n", "foobar Baz\n", CommandState.Mode.COMMAND, |       "veu", "${c}FooBar Baz\n", "foobar Baz\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -180,7 +180,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|    four |    four | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -198,7 +198,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|          |          | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|     assertOffset(4) |     assertOffset(4) | ||||||
|   } |   } | ||||||
| @@ -217,8 +217,8 @@ class ChangeActionTest : VimTestCase() { | |||||||
|    three |    three | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -238,7 +238,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|    three |    three | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -252,7 +252,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|       """one  |       """one  | ||||||
|  three |  three | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|     assertOffset(3) |     assertOffset(3) | ||||||
|   } |   } | ||||||
| @@ -266,16 +266,16 @@ class ChangeActionTest : VimTestCase() { | |||||||
|    three four |    three four | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       "one four\n", CommandState.Mode.COMMAND, |       "one four\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1380 |d| |w| |count| |   // VIM-1380 |d| |w| |count| | ||||||
|   fun testDeleteTwoWordsAtLastChar() { |   fun testDeleteTwoWordsAtLastChar() { | ||||||
|     doTest( |     doTest( | ||||||
|       "d2w", "on${c}e two three\n", "on${c}three\n", CommandState.Mode.COMMAND, |       "d2w", "on${c}e two three\n", "on${c}three\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -289,8 +289,8 @@ class ChangeActionTest : VimTestCase() { | |||||||
|       """foo |       """foo | ||||||
|   , baz |   , baz | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -308,8 +308,8 @@ class ChangeActionTest : VimTestCase() { | |||||||
|    baz |    baz | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -327,7 +327,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|         bar |         bar | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|     assertOffset(1) |     assertOffset(1) | ||||||
|   } |   } | ||||||
| @@ -341,7 +341,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|    two |    two | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       "two\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "two\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -349,8 +349,8 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertFromRegister() { |   fun testInsertFromRegister() { | ||||||
|     setRegister('a', "World") |     setRegister('a', "World") | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("A", ", ", "<C-R>", "a", "!"), "${c}Hello\n", "Hello, World!\n", CommandState.Mode.INSERT, |       listOf("A", ", ", "<C-R>", "a", "!"), "${c}Hello\n", "Hello, World!\n", VimStateMachine.Mode.INSERT, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -358,7 +358,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testInsertNewLineAboveFirstLine() { |   fun testInsertNewLineAboveFirstLine() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("O", "bar"), |       listOf("O", "bar"), | ||||||
|       "fo${c}o\n", "bar\nfoo\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "fo${c}o\n", "bar\nfoo\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -366,7 +366,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|   fun testVisualSelectionRightMargin() { |   fun testVisualSelectionRightMargin() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("v", "k\$d"), |       listOf("v", "k\$d"), | ||||||
|       "foo\n${c}bar\n", "fooar\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "foo\n${c}bar\n", "fooar\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -388,7 +388,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|         quux |         quux | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -409,7 +409,7 @@ class ChangeActionTest : VimTestCase() { | |||||||
|         quux |         quux | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -424,7 +424,7 @@ quux | |||||||
|       """    a 1 b 2 c 3 |       """    a 1 b 2 c 3 | ||||||
| quux | quux | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -439,7 +439,7 @@ quux | |||||||
|       """    a 1    b 2    c 3 |       """    a 1    b 2    c 3 | ||||||
| quux | quux | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -451,7 +451,7 @@ quux | |||||||
|          |          | ||||||
|         bar |         bar | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       "foo bar", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "foo bar", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -462,7 +462,7 @@ quux | |||||||
|         foo   |         foo   | ||||||
|         bar |         bar | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       "foo  bar", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "foo  bar", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -477,7 +477,7 @@ quux | |||||||
|       """    a 1 b 2 c 3 |       """    a 1 b 2 c 3 | ||||||
| quux | quux | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -492,14 +492,14 @@ quux | |||||||
|       """    a 1    b 2    c 3 |       """    a 1    b 2    c 3 | ||||||
| quux | quux | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDeleteCharVisualBlockOnLastCharOfLine() { |   fun testDeleteCharVisualBlockOnLastCharOfLine() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("<C-V>", "x"), |       listOf("<C-V>", "x"), | ||||||
|       "fo${c}o\n", "fo\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "fo${c}o\n", "fo\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -509,7 +509,7 @@ quux | |||||||
|     } |     } | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("<C-V>", "j", "x"), |       listOf("<C-V>", "j", "x"), | ||||||
|       "\n\n", "\n\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "\n\n", "\n\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -529,7 +529,7 @@ quux | |||||||
|         br |         br | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -550,7 +550,7 @@ quux | |||||||
|         br |         br | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -575,18 +575,18 @@ quux | |||||||
|  |  | ||||||
|   // |r| |   // |r| | ||||||
|   fun testReplaceOneChar() { |   fun testReplaceOneChar() { | ||||||
|     doTest("rx", "b${c}ar\n", "b${c}xr\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("rx", "b${c}ar\n", "b${c}xr\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |r| |   // |r| | ||||||
|   @VimBehaviorDiffers(originalVimAfter = "foXX${c}Xr\n") |   @VimBehaviorDiffers(originalVimAfter = "foXX${c}Xr\n") | ||||||
|   fun testReplaceMultipleCharsWithCount() { |   fun testReplaceMultipleCharsWithCount() { | ||||||
|     doTest("3rX", "fo${c}obar\n", "fo${c}XXXr\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("3rX", "fo${c}obar\n", "fo${c}XXXr\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |r| |   // |r| | ||||||
|   fun testReplaceMultipleCharsWithCountPastEndOfLine() { |   fun testReplaceMultipleCharsWithCountPastEndOfLine() { | ||||||
|     doTest("6rX", "fo${c}obar\n", "fo${c}obar\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("6rX", "fo${c}obar\n", "fo${c}obar\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |r| |   // |r| | ||||||
| @@ -604,7 +604,7 @@ quux | |||||||
|         ZZZZZz |         ZZZZZz | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -619,7 +619,7 @@ foobaz | |||||||
|     bar |     bar | ||||||
| foobaz | foobaz | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -635,20 +635,20 @@ foobaz | |||||||
|     r |     r | ||||||
| foobaz | foobaz | ||||||
| """, | """, | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |s| |   // |s| | ||||||
|   fun testReplaceOneCharWithText() { |   fun testReplaceOneCharWithText() { | ||||||
|     doTest("sxy<Esc>", "b${c}ar\n", "bx${c}yr\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("sxy<Esc>", "b${c}ar\n", "bx${c}yr\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |s| |   // |s| | ||||||
|   fun testReplaceMultipleCharsWithTextWithCount() { |   fun testReplaceMultipleCharsWithTextWithCount() { | ||||||
|     doTest( |     doTest( | ||||||
|       "3sxy<Esc>", |       "3sxy<Esc>", | ||||||
|       "fo${c}obar\n", "fox${c}yr\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "fo${c}obar\n", "fox${c}yr\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -666,13 +666,13 @@ foobaz | |||||||
|         biff |         biff | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |R| |   // |R| | ||||||
|   fun testReplaceMode() { |   fun testReplaceMode() { | ||||||
|     doTest("Rbaz<Esc>", "foo${c}bar\n", "fooba${c}z\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("Rbaz<Esc>", "foo${c}bar\n", "fooba${c}z\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |R| |i_<Insert>| |   // |R| |i_<Insert>| | ||||||
| @@ -680,7 +680,7 @@ foobaz | |||||||
|   fun testReplaceModeSwitchToInsertModeAndBack() { |   fun testReplaceModeSwitchToInsertModeAndBack() { | ||||||
|     doTest( |     doTest( | ||||||
|       "RXXX<Ins>YYY<Ins>ZZZ<Esc>", |       "RXXX<Ins>YYY<Ins>ZZZ<Esc>", | ||||||
|       "aaa${c}bbbcccddd\n", "aaaXXXYYYZZ${c}Zddd\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "aaa${c}bbbcccddd\n", "aaaXXXYYYZZ${c}Zddd\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -689,8 +689,8 @@ foobaz | |||||||
|   fun testInsertModeSwitchToReplaceModeAndBack() { |   fun testInsertModeSwitchToReplaceModeAndBack() { | ||||||
|     doTest( |     doTest( | ||||||
|       "iXXX<Ins>YYY<Ins>ZZZ<Esc>", |       "iXXX<Ins>YYY<Ins>ZZZ<Esc>", | ||||||
|       "aaa${c}bbbcccddd\n", "aaaXXXYYYZZ${c}Zcccddd\n", CommandState.Mode.COMMAND, |       "aaa${c}bbbcccddd\n", "aaaXXXYYYZZ${c}Zcccddd\n", VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -709,7 +709,7 @@ foobaz | |||||||
|         fo${c}o quux |         fo${c}o quux | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -917,17 +917,17 @@ and some text after""" | |||||||
|   fun testRepeatChangeWordDoesNotBreakNextRepeatFind() { |   fun testRepeatChangeWordDoesNotBreakNextRepeatFind() { | ||||||
|     doTest( |     doTest( | ||||||
|       "fXcfYPATATA<Esc>fX.;.", "${c}aaaaXBBBBYaaaaaaaXBBBBYaaaaaaXBBBBYaaaaaaaa\n", |       "fXcfYPATATA<Esc>fX.;.", "${c}aaaaXBBBBYaaaaaaaXBBBBYaaaaaaXBBBBYaaaaaaaa\n", | ||||||
|       "aaaaPATATAaaaaaaaPATATAaaaaaaPATATAaaaaaaaa\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       "aaaaPATATAaaaaaaaPATATAaaaaaaPATATAaaaaaaaa\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testRepeatReplace() { |   fun testRepeatReplace() { | ||||||
|     configureByText("${c}foobarbaz spam\n") |     configureByText("${c}foobarbaz spam\n") | ||||||
|     typeText(injector.parser.parseKeys("R")) |     typeText(injector.parser.parseKeys("R")) | ||||||
|     assertMode(CommandState.Mode.REPLACE) |     assertMode(VimStateMachine.Mode.REPLACE) | ||||||
|     typeText(injector.parser.parseKeys("FOO" + "<Esc>" + "l" + "2.")) |     typeText(injector.parser.parseKeys("FOO" + "<Esc>" + "l" + "2.")) | ||||||
|     assertState("FOOFOOFO${c}O spam\n") |     assertState("FOOFOOFO${c}O spam\n") | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDownMovementAfterDeletionToStart() { |   fun testDownMovementAfterDeletionToStart() { | ||||||
| @@ -941,8 +941,8 @@ and some text after""" | |||||||
|         psum dolor sit amet |         psum dolor sit amet | ||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -957,8 +957,8 @@ and some text after""" | |||||||
|         ipsum dolor sit amet |         ipsum dolor sit amet | ||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -973,8 +973,8 @@ and some text after""" | |||||||
|         ipsum dolor sit amet |         ipsum dolor sit amet | ||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -989,8 +989,8 @@ and some text after""" | |||||||
|         ipsum dolor sit amet |         ipsum dolor sit amet | ||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1005,8 +1005,8 @@ and some text after""" | |||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|         psum dolor sit amet |         psum dolor sit amet | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1021,8 +1021,8 @@ and some text after""" | |||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|         ipsum dolor sit amet |         ipsum dolor sit amet | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1040,7 +1040,7 @@ and some text after""" | |||||||
|         ${c}lorem ipsum dolor sit amet |         ${c}lorem ipsum dolor sit amet | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1059,7 +1059,7 @@ and some text after""" | |||||||
|         gaganis ${c}gaganis gaganis |         gaganis ${c}gaganis gaganis | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1075,7 +1075,7 @@ and some text after""" | |||||||
|         line 1 |         line 1 | ||||||
|         ${c}line 3 |         ${c}line 3 | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ | |||||||
| package org.jetbrains.plugins.ideavim.action; | package org.jetbrains.plugins.ideavim.action; | ||||||
|  |  | ||||||
| import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase; | import org.jetbrains.plugins.ideavim.VimTestCase; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -27,128 +27,128 @@ import org.jetbrains.plugins.ideavim.VimTestCase; | |||||||
|  */ |  */ | ||||||
| public class ChangeNumberActionTest extends VimTestCase { | public class ChangeNumberActionTest extends VimTestCase { | ||||||
|   public void testIncrementDecimalZero() { |   public void testIncrementDecimalZero() { | ||||||
|     doTest("<C-A>", "0", "1", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "0", "1", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementHexZero() { |   public void testIncrementHexZero() { | ||||||
|     doTest("<C-A>", "0x0", "0x1", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "0x0", "0x1", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementZero() { |   public void testDecrementZero() { | ||||||
|     doTest("<C-X>", "0", "-1", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-X>", "0", "-1", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementDecimal() { |   public void testIncrementDecimal() { | ||||||
|     doTest("<C-A>", "199", "200", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "199", "200", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementDecimal() { |   public void testDecrementDecimal() { | ||||||
|     doTest("<C-X>", "1000", "999", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-X>", "1000", "999", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementOctal() { |   public void testIncrementOctal() { | ||||||
|     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-A>"), "0477", "0500", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-A>"), "0477", "0500", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementOctal() { |   public void testDecrementOctal() { | ||||||
|     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-X>"), "010", "007", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-X>"), "010", "007", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementHex() { |   public void testIncrementHex() { | ||||||
|     doTest("<C-A>", "0xff", "0x100", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "0xff", "0x100", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementHex() { |   public void testDecrementHex() { | ||||||
|     doTest("<C-X>", "0xa100", "0xa0ff", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-X>", "0xa100", "0xa0ff", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementNegativeDecimal() { |   public void testIncrementNegativeDecimal() { | ||||||
|     doTest("<C-A>", "-199", "-198", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "-199", "-198", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementNegativeDecimal() { |   public void testDecrementNegativeDecimal() { | ||||||
|     doTest("<C-X>", "-1000", "-1001", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-X>", "-1000", "-1001", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementNegativeOctal() { |   public void testIncrementNegativeOctal() { | ||||||
|     // Minus isn't processed |     // Minus isn't processed | ||||||
|     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-A>"), "-0477", "-0500", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-A>"), "-0477", "-0500", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementNegativeOctal() { |   public void testDecrementNegativeOctal() { | ||||||
|     // Minus isn't processed |     // Minus isn't processed | ||||||
|     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-X>"), "-010", "-007", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-X>"), "-010", "-007", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementNegativeHex() { |   public void testIncrementNegativeHex() { | ||||||
|     doTest("<C-A>", "-0xff", "-0x100", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "-0xff", "-0x100", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementNegativeHex() { |   public void testDecrementNegativeHex() { | ||||||
|     doTest("<C-X>", "-0xa100", "-0xa0ff", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-X>", "-0xa100", "-0xa0ff", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementWithCount() { |   public void testIncrementWithCount() { | ||||||
|     doTest("123<C-A>", "456", "579", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("123<C-A>", "456", "579", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testDecrementWithCount() { |   public void testDecrementWithCount() { | ||||||
|     doTest("200<C-X>", "100", "-100", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("200<C-X>", "100", "-100", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementAlphaWithoutNumberFormatAlpha() { |   public void testIncrementAlphaWithoutNumberFormatAlpha() { | ||||||
|     doTest("<C-A>", "foo", "foo", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "foo", "foo", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementAlphaWithNumberFormatAlpha() { |   public void testIncrementAlphaWithNumberFormatAlpha() { | ||||||
|     doTest(Lists.newArrayList(":set nf=alpha<Enter>", "<C-A>"), "foo", "goo", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=alpha<Enter>", "<C-A>"), "foo", "goo", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementZWithNumberFormatAlpha() { |   public void testIncrementZWithNumberFormatAlpha() { | ||||||
|     doTest(Lists.newArrayList(":set nf=alpha<Enter>", "<C-A>"), "zzz", "zzz", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=alpha<Enter>", "<C-A>"), "zzz", "zzz", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementXInHexNumberWithNumberFormatAlphaButNotHex() { |   public void testIncrementXInHexNumberWithNumberFormatAlphaButNotHex() { | ||||||
|     doTest(Lists.newArrayList(":set nf=alpha<Enter>", "<C-A>"), "0<caret>x1", "0y1", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=alpha<Enter>", "<C-A>"), "0<caret>x1", "0y1", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementXInHexNumberWithNumberFormatHexAlpha() { |   public void testIncrementXInHexNumberWithNumberFormatHexAlpha() { | ||||||
|     doTest(Lists.newArrayList(":set nf=alpha,hex<Enter>", "<C-A>"), "0<caret>x1", "0x2", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=alpha,hex<Enter>", "<C-A>"), "0<caret>x1", "0x2", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementHexNumberWithoutNumberFormatHex() { |   public void testIncrementHexNumberWithoutNumberFormatHex() { | ||||||
|     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-A>"), "0x42", "1x42", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=octal<Enter>", "<C-A>"), "0x42", "1x42", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementOctalNumberWithoutNumberFormatOctal() { |   public void testIncrementOctalNumberWithoutNumberFormatOctal() { | ||||||
|     doTest(Lists.newArrayList(":set nf=hex<Enter>", "<C-A>"), "077", "078", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=hex<Enter>", "<C-A>"), "077", "078", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementNegativeOctalNumberWithoutNumberFormatOctal() { |   public void testIncrementNegativeOctalNumberWithoutNumberFormatOctal() { | ||||||
|     doTest(Lists.newArrayList(":set nf=hex<Enter>", "<C-A>"), "-077", "-076", CommandState.Mode.COMMAND, |     doTest(Lists.newArrayList(":set nf=hex<Enter>", "<C-A>"), "-077", "-076", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementHexPreservesCaseOfX() { |   public void testIncrementHexPreservesCaseOfX() { | ||||||
|     doTest("<C-A>", "0X88", "0X89", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "0X88", "0X89", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementHexTakesCaseFromLastLetter() { |   public void testIncrementHexTakesCaseFromLastLetter() { | ||||||
|     doTest("<C-A>", "0xaB0", "0xAB1", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |     doTest("<C-A>", "0xaB0", "0xAB1", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void testIncrementLocatesNumberOnTheSameLine() { |   public void testIncrementLocatesNumberOnTheSameLine() { | ||||||
|     doTest("<C-A>", "foo ->* bar 123\n", "foo ->* bar 12<caret>4\n", CommandState.Mode.COMMAND, |     doTest("<C-A>", "foo ->* bar 123\n", "foo ->* bar 12<caret>4\n", VimStateMachine.Mode.COMMAND, | ||||||
|            CommandState.SubMode.NONE); |            VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ package org.jetbrains.plugins.ideavim.action; | |||||||
| import com.intellij.openapi.editor.Editor; | import com.intellij.openapi.editor.Editor; | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.api.VimInjectorKt; | import com.maddyhome.idea.vim.api.VimInjectorKt; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import com.maddyhome.idea.vim.register.Register; | import com.maddyhome.idea.vim.register.Register; | ||||||
| import com.maddyhome.idea.vim.ex.ExException; | import com.maddyhome.idea.vim.ex.ExException; | ||||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | ||||||
| @@ -129,7 +129,7 @@ public class CopyActionTest extends VimTestCase { | |||||||
|   public void testStateAfterYankVisualBlock() { |   public void testStateAfterYankVisualBlock() { | ||||||
|     typeTextInFile(VimInjectorKt.getInjector().getParser().parseKeys("<C-V>" + "jl" + "y"), "<caret>foo\n" + "bar\n"); |     typeTextInFile(VimInjectorKt.getInjector().getParser().parseKeys("<C-V>" + "jl" + "y"), "<caret>foo\n" + "bar\n"); | ||||||
|     assertOffset(0); |     assertOffset(0); | ||||||
|     assertMode(CommandState.Mode.COMMAND); |     assertMode(VimStateMachine.Mode.COMMAND); | ||||||
|     assertSelection(null); |     assertSelection(null); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ | |||||||
| package org.jetbrains.plugins.ideavim.action | package org.jetbrains.plugins.ideavim.action | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.experimentalApi | import com.maddyhome.idea.vim.helper.experimentalApi | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason | import org.jetbrains.plugins.ideavim.SkipNeovimReason | ||||||
| import org.jetbrains.plugins.ideavim.TestWithoutNeovim | import org.jetbrains.plugins.ideavim.TestWithoutNeovim | ||||||
| @@ -154,7 +154,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.INSERT) |     assertMode(VimStateMachine.Mode.INSERT) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) |   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) | ||||||
| @@ -176,7 +176,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.INSERT) |     assertMode(VimStateMachine.Mode.INSERT) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) |   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) | ||||||
| @@ -198,7 +198,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.INSERT) |     assertMode(VimStateMachine.Mode.INSERT) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -255,7 +255,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       $c |       $c | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.INSERT) |     assertMode(VimStateMachine.Mode.INSERT) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) |   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) | ||||||
| @@ -274,7 +274,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) |   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) | ||||||
| @@ -294,7 +294,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) |   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) | ||||||
| @@ -315,7 +315,7 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.INSERT) |     assertMode(VimStateMachine.Mode.INSERT) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) |   @TestWithoutNeovim(reason = SkipNeovimReason.GUARDED_BLOCKS) | ||||||
| @@ -335,6 +335,6 @@ class GuardedBlocksTest : VimTestCase() { | |||||||
|       1234567890 |       1234567890 | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ package org.jetbrains.plugins.ideavim.action | |||||||
| import com.intellij.testFramework.PlatformTestUtil | import com.intellij.testFramework.PlatformTestUtil | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.helper.commandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import com.maddyhome.idea.vim.newapi.vim | import com.maddyhome.idea.vim.newapi.vim | ||||||
| import com.maddyhome.idea.vim.options.OptionConstants | import com.maddyhome.idea.vim.options.OptionConstants | ||||||
| import com.maddyhome.idea.vim.options.OptionScope | import com.maddyhome.idea.vim.options.OptionScope | ||||||
| @@ -36,7 +36,7 @@ class MacroActionTest : VimTestCase() { | |||||||
|   // |q| |   // |q| | ||||||
|   fun testRecordMacro() { |   fun testRecordMacro() { | ||||||
|     val editor = typeTextInFile(injector.parser.parseKeys("qa" + "3l" + "q"), "on<caret>e two three\n") |     val editor = typeTextInFile(injector.parser.parseKeys("qa" + "3l" + "q"), "on<caret>e two three\n") | ||||||
|     val commandState = editor.vim.commandState |     val commandState = editor.vim.vimStateMachine | ||||||
|     assertFalse(commandState.isRecording) |     assertFalse(commandState.isRecording) | ||||||
|     val registerGroup = VimPlugin.getRegister() |     val registerGroup = VimPlugin.getRegister() | ||||||
|     val register = registerGroup.getRegister('a') |     val register = registerGroup.getRegister('a') | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ package org.jetbrains.plugins.ideavim.action; | |||||||
| import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||||
| import com.maddyhome.idea.vim.VimPlugin; | import com.maddyhome.idea.vim.VimPlugin; | ||||||
| import com.maddyhome.idea.vim.api.VimInjectorKt; | import com.maddyhome.idea.vim.api.VimInjectorKt; | ||||||
| import com.maddyhome.idea.vim.command.CommandState; | import com.maddyhome.idea.vim.command.VimStateMachine; | ||||||
| import com.maddyhome.idea.vim.mark.Mark; | import com.maddyhome.idea.vim.mark.Mark; | ||||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason; | import org.jetbrains.plugins.ideavim.SkipNeovimReason; | ||||||
| @@ -148,6 +148,6 @@ public class MarkTest extends VimTestCase { | |||||||
|   // |i| |`]| |   // |i| |`]| | ||||||
|   public void testGotoLastChangePositionEnd() { |   public void testGotoLastChangePositionEnd() { | ||||||
|     doTest(Lists.newArrayList("yiw", "P", "gg", "`]"), "one two\n" + "<caret>three\n" + "four five\n", |     doTest(Lists.newArrayList("yiw", "P", "gg", "`]"), "one two\n" + "<caret>three\n" + "four five\n", | ||||||
|            "one two\n" + "thre<caret>ethree\n" + "four five\n", CommandState.Mode.COMMAND, CommandState.SubMode.NONE); |            "one two\n" + "thre<caret>ethree\n" + "four five\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,8 +19,8 @@ package org.jetbrains.plugins.ideavim.action | |||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.vimCommandState | import com.maddyhome.idea.vim.helper.vimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason | import org.jetbrains.plugins.ideavim.SkipNeovimReason | ||||||
| import org.jetbrains.plugins.ideavim.TestWithoutNeovim | import org.jetbrains.plugins.ideavim.TestWithoutNeovim | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
| @@ -31,7 +31,7 @@ import org.jetbrains.plugins.ideavim.VimTestCase | |||||||
| class MotionActionTest : VimTestCase() { | class MotionActionTest : VimTestCase() { | ||||||
|   fun testDoubleToggleVisual() { |   fun testDoubleToggleVisual() { | ||||||
|     val contents = "one tw${c}o\n" |     val contents = "one tw${c}o\n" | ||||||
|     doTest("vv", contents, contents, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("vv", contents, contents, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-198 |v_iw| |   // VIM-198 |v_iw| | ||||||
| @@ -41,8 +41,8 @@ class MotionActionTest : VimTestCase() { | |||||||
|       "viw", |       "viw", | ||||||
|       fileContents, |       fileContents, | ||||||
|       "one ${s}two${se}\n", |       "one ${s}two${se}\n", | ||||||
|       CommandState.Mode.VISUAL, |       VimStateMachine.Mode.VISUAL, | ||||||
|       CommandState.SubMode.VISUAL_CHARACTER |       VimStateMachine.SubMode.VISUAL_CHARACTER | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -50,7 +50,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|   fun testVisualMotionInnerBigWord() { |   fun testVisualMotionInnerBigWord() { | ||||||
|     val fileContents = "one tw${c}o.three four\n" |     val fileContents = "one tw${c}o.three four\n" | ||||||
|     val fileContentsAfter = "one ${s}two.thre${c}e$se four\n" |     val fileContentsAfter = "one ${s}two.thre${c}e$se four\n" | ||||||
|     doTest("viW", fileContents, fileContentsAfter, CommandState.Mode.VISUAL, CommandState.SubMode.VISUAL_CHARACTER) |     doTest("viW", fileContents, fileContentsAfter, VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER) | ||||||
|     assertSelection("two.three") |     assertSelection("two.three") | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -60,7 +60,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|      three |      three | ||||||
|       |       | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(listOf("f", "<Esc>", "<Esc>"), content, content, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(listOf("f", "<Esc>", "<Esc>"), content, content, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     assertPluginError(true) |     assertPluginError(true) | ||||||
|     assertOffset(2) |     assertOffset(2) | ||||||
|   } |   } | ||||||
| @@ -71,9 +71,9 @@ class MotionActionTest : VimTestCase() { | |||||||
|      three |      three | ||||||
|       |       | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(listOf("12", "<Esc>"), content, content, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(listOf("12", "<Esc>"), content, content, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     assertPluginError(false) |     assertPluginError(false) | ||||||
|     val vimCommandState = myFixture.editor.vimCommandState |     val vimCommandState = myFixture.editor.vimStateMachine | ||||||
|     kotlin.test.assertNotNull(vimCommandState) |     kotlin.test.assertNotNull(vimCommandState) | ||||||
|     assertEmpty(vimCommandState.commandBuilder.keys.toList()) |     assertEmpty(vimCommandState.commandBuilder.keys.toList()) | ||||||
|   } |   } | ||||||
| @@ -82,7 +82,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|   fun testLeftRightMove() { |   fun testLeftRightMove() { | ||||||
|     val before = "on${c}e two three four five six seven\n" |     val before = "on${c}e two three four five six seven\n" | ||||||
|     val after = "one two three ${c}four five six seven\n" |     val after = "one two three ${c}four five six seven\n" | ||||||
|     doTest(listOf("14l", "2h"), before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(listOf("14l", "2h"), before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |j| |k| |   // |j| |k| | ||||||
| @@ -101,7 +101,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|      four |      four | ||||||
|       |       | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(listOf("2j", "k"), before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(listOf("2j", "k"), before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.UNCLEAR) |   @TestWithoutNeovim(reason = SkipNeovimReason.UNCLEAR) | ||||||
| @@ -114,14 +114,14 @@ class MotionActionTest : VimTestCase() { | |||||||
|   fun testForwardToTab() { |   fun testForwardToTab() { | ||||||
|     val before = "on${c}e two\tthree\nfour\n" |     val before = "on${c}e two\tthree\nfour\n" | ||||||
|     val after = "one two${c}\tthree\nfour\n" |     val after = "one two${c}\tthree\nfour\n" | ||||||
|     doTest(listOf("f<Tab>"), before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(listOf("f<Tab>"), before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(reason = SkipNeovimReason.UNCLEAR) |   @TestWithoutNeovim(reason = SkipNeovimReason.UNCLEAR) | ||||||
|   fun testIllegalCharArgument() { |   fun testIllegalCharArgument() { | ||||||
|     typeTextInFile(injector.parser.parseKeys("f<Insert>"), "on${c}e two three four five six seven\n") |     typeTextInFile(injector.parser.parseKeys("f<Insert>"), "on${c}e two three four five six seven\n") | ||||||
|     assertOffset(2) |     assertOffset(2) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |F| |i_CTRL-K| |   // |F| |i_CTRL-K| | ||||||
| @@ -129,7 +129,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val before = "Hallo, Öster${c}reich!\n" |     val before = "Hallo, Öster${c}reich!\n" | ||||||
|     val after = "Hallo, ${c}Österreich!\n" |     val after = "Hallo, ${c}Österreich!\n" | ||||||
|     val keys = listOf("F<C-K>O:") |     val keys = listOf("F<C-K>O:") | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |;| |   // VIM-771 |t| |;| | ||||||
| @@ -137,7 +137,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:;") |     val keys = listOf("t:;") | ||||||
|     val before = "$c 1:a 2:b 3:c \n" |     val before = "$c 1:a 2:b 3:c \n" | ||||||
|     val after = " 1:a ${c}2:b 3:c \n" |     val after = " 1:a ${c}2:b 3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |;| |   // VIM-771 |t| |;| | ||||||
| @@ -145,7 +145,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:;") |     val keys = listOf("t:;") | ||||||
|     val before = "$c 1:a 2:b 3:c \n" |     val before = "$c 1:a 2:b 3:c \n" | ||||||
|     val after = " 1:a ${c}2:b 3:c \n" |     val after = " 1:a ${c}2:b 3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |;| |   // VIM-771 |t| |;| | ||||||
| @@ -153,7 +153,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:2;") |     val keys = listOf("t:2;") | ||||||
|     val before = "$c 1:a 2:b 3:c \n" |     val before = "$c 1:a 2:b 3:c \n" | ||||||
|     val after = " 1:a ${c}2:b 3:c \n" |     val after = " 1:a ${c}2:b 3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |;| |   // VIM-771 |t| |;| | ||||||
| @@ -161,7 +161,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:3;") |     val keys = listOf("t:3;") | ||||||
|     val before = "$c 1:a 2:b 3:c \n" |     val before = "$c 1:a 2:b 3:c \n" | ||||||
|     val after = " 1:a 2:b ${c}3:c \n" |     val after = " 1:a 2:b ${c}3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |,| |   // VIM-771 |t| |,| | ||||||
| @@ -169,7 +169,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:,,") |     val keys = listOf("t:,,") | ||||||
|     val before = " 1:a 2:b$c 3:c \n" |     val before = " 1:a 2:b$c 3:c \n" | ||||||
|     val after = " 1:${c}a 2:b 3:c \n" |     val after = " 1:${c}a 2:b 3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |,| |   // VIM-771 |t| |,| | ||||||
| @@ -177,7 +177,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:,2,") |     val keys = listOf("t:,2,") | ||||||
|     val before = " 1:a 2:b$c 3:c \n" |     val before = " 1:a 2:b$c 3:c \n" | ||||||
|     val after = " 1:${c}a 2:b 3:c \n" |     val after = " 1:${c}a 2:b 3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-771 |t| |,| |   // VIM-771 |t| |,| | ||||||
| @@ -185,7 +185,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("t:,3,") |     val keys = listOf("t:,3,") | ||||||
|     val before = " 0:_ 1:a 2:b$c 3:c \n" |     val before = " 0:_ 1:a 2:b$c 3:c \n" | ||||||
|     val after = " 0:${c}_ 1:a 2:b 3:c \n" |     val after = " 0:${c}_ 1:a 2:b 3:c \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-314 |d| |v_iB| |   // VIM-314 |d| |v_iB| | ||||||
| @@ -193,7 +193,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di{") |     val keys = listOf("di{") | ||||||
|     val before = "{foo, b${c}ar, baz}\n" |     val before = "{foo, b${c}ar, baz}\n" | ||||||
|     val after = "{}\n" |     val after = "{}\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-314 |d| |v_iB| |   // VIM-314 |d| |v_iB| | ||||||
| @@ -201,7 +201,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di{") |     val keys = listOf("di{") | ||||||
|     val before = "{foo, ${c}\"bar\", baz}\n" |     val before = "{foo, ${c}\"bar\", baz}\n" | ||||||
|     val after = "{}\n" |     val after = "{}\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_aB| |   // |d| |v_aB| | ||||||
| @@ -209,7 +209,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("da{") |     val keys = listOf("da{") | ||||||
|     val before = "x = {foo, b${c}ar, baz};\n" |     val before = "x = {foo, b${c}ar, baz};\n" | ||||||
|     val after = "x = ;\n" |     val after = "x = ;\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-261 |c| |v_iB| |   // VIM-261 |c| |v_iB| | ||||||
| @@ -238,7 +238,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("daw") |     val keys = listOf("daw") | ||||||
|     val before = "one t${c}wo three\n" |     val before = "one t${c}wo three\n" | ||||||
|     val after = "one three\n" |     val after = "one three\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_aW| |   // |d| |v_aW| | ||||||
| @@ -246,7 +246,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("daW") |     val keys = listOf("daW") | ||||||
|     val before = "one \"t${c}wo\" three\n" |     val before = "one \"t${c}wo\" three\n" | ||||||
|     val after = "one three\n" |     val after = "one three\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_is| |   // |d| |v_is| | ||||||
| @@ -254,7 +254,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("dis") |     val keys = listOf("dis") | ||||||
|     val before = "Hello World! How a${c}re you? Bye.\n" |     val before = "Hello World! How a${c}re you? Bye.\n" | ||||||
|     val after = "Hello World!  Bye.\n" |     val after = "Hello World!  Bye.\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_as| |   // |d| |v_as| | ||||||
| @@ -262,7 +262,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("das") |     val keys = listOf("das") | ||||||
|     val before = "Hello World! How a${c}re you? Bye.\n" |     val before = "Hello World! How a${c}re you? Bye.\n" | ||||||
|     val after = "Hello World! Bye.\n" |     val after = "Hello World! Bye.\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |v_as| |   // |v_as| | ||||||
| @@ -280,7 +280,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|      P$c. |      P$c. | ||||||
|       |       | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_ip| |   // |d| |v_ip| | ||||||
| @@ -302,7 +302,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     Bye. |     Bye. | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_ap| |   // |d| |v_ap| | ||||||
| @@ -323,7 +323,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     Bye. |     Bye. | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_a]| |   // |d| |v_a]| | ||||||
| @@ -336,7 +336,7 @@ class MotionActionTest : VimTestCase() { | |||||||
| ]; | ]; | ||||||
| """ | """ | ||||||
|     val after = "foo = ;\n" |     val after = "foo = ;\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_i]| |   // |d| |v_i]| | ||||||
| @@ -344,7 +344,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di]") |     val keys = listOf("di]") | ||||||
|     val before = "foo = [one, t${c}wo];\n" |     val before = "foo = [one, t${c}wo];\n" | ||||||
|     val after = "foo = [];\n" |     val after = "foo = [];\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1287 |d| |v_i(| |   // VIM-1287 |d| |v_i(| | ||||||
| @@ -352,7 +352,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di(") |     val keys = listOf("di(") | ||||||
|     val before = "(text \"with quotes(and ${c}braces)\")" |     val before = "(text \"with quotes(and ${c}braces)\")" | ||||||
|     val after = "(text \"with quotes()\")" |     val after = "(text \"with quotes()\")" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1287 |d| |v_i{| |   // VIM-1287 |d| |v_i{| | ||||||
| @@ -360,7 +360,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val before = "{\"{foo, ${c}bar\", baz}}" |     val before = "{\"{foo, ${c}bar\", baz}}" | ||||||
|     val keys = listOf("di{") |     val keys = listOf("di{") | ||||||
|     val after = "{\"{foo, ${c}bar\", baz}}" |     val after = "{\"{foo, ${c}bar\", baz}}" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1287 |d| |v_i{| |   // VIM-1287 |d| |v_i{| | ||||||
| @@ -368,7 +368,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val before = "a{\"{foo}, ${c}bar\", baz}b}" |     val before = "a{\"{foo}, ${c}bar\", baz}b}" | ||||||
|     val keys = listOf("di{") |     val keys = listOf("di{") | ||||||
|     val after = "a{$c}b}" |     val after = "a{$c}b}" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1008 |c| |v_i{| |   // VIM-1008 |c| |v_i{| | ||||||
| @@ -376,7 +376,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val before = "\"{do${c}esn't work}\"" |     val before = "\"{do${c}esn't work}\"" | ||||||
|     val keys = listOf("ci{") |     val keys = listOf("ci{") | ||||||
|     val after = "\"{$c}\"" |     val after = "\"{$c}\"" | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1008 |c| |v_i{| |   // VIM-1008 |c| |v_i{| | ||||||
| @@ -384,7 +384,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("ci{") |     val keys = listOf("ci{") | ||||||
|     val before = "'{does n${c}ot work}'" |     val before = "'{does n${c}ot work}'" | ||||||
|     val after = "'{$c}'" |     val after = "'{$c}'" | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1008 |c| |v_i{| |   // VIM-1008 |c| |v_i{| | ||||||
| @@ -392,7 +392,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val before = "<p class=\"{{ \$ctrl.so${c}meClassName }}\"></p>" |     val before = "<p class=\"{{ \$ctrl.so${c}meClassName }}\"></p>" | ||||||
|     val keys = listOf("ci{") |     val keys = listOf("ci{") | ||||||
|     val after = "<p class=\"{{$c}}\"></p>" |     val after = "<p class=\"{{$c}}\"></p>" | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_i>| |   // |d| |v_i>| | ||||||
| @@ -400,7 +400,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di>") |     val keys = listOf("di>") | ||||||
|     val before = "Foo<Foo, B${c}ar> bar\n" |     val before = "Foo<Foo, B${c}ar> bar\n" | ||||||
|     val after = "Foo<> bar\n" |     val after = "Foo<> bar\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |d| |v_a>| |   // |d| |v_a>| | ||||||
| @@ -408,7 +408,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("da>") |     val keys = listOf("da>") | ||||||
|     val before = "Foo<Foo, B${c}ar> bar\n" |     val before = "Foo<Foo, B${c}ar> bar\n" | ||||||
|     val after = "Foo bar\n" |     val after = "Foo bar\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i"| |   // VIM-132 |d| |v_i"| | ||||||
| @@ -416,7 +416,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "foo = \"bar b${c}az\";\n" |     val before = "foo = \"bar b${c}az\";\n" | ||||||
|     val after = "foo = \"\";\n" |     val after = "foo = \"\";\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_a"| |   // VIM-132 |d| |v_a"| | ||||||
| @@ -425,7 +425,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("da\"") |     val keys = listOf("da\"") | ||||||
|     val before = "foo = \"bar b${c}az\";\n" |     val before = "foo = \"bar b${c}az\";\n" | ||||||
|     val after = "foo = ;\n" |     val after = "foo = ;\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i"| |   // VIM-132 |d| |v_i"| | ||||||
| @@ -433,7 +433,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "foo = [\"one\", ${c}\"two\", \"three\"];\n" |     val before = "foo = [\"one\", ${c}\"two\", \"three\"];\n" | ||||||
|     val after = "foo = [\"one\", \"\", \"three\"];\n" |     val after = "foo = [\"one\", \"\", \"three\"];\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i"| |   // VIM-132 |d| |v_i"| | ||||||
| @@ -441,7 +441,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "foo = [\"one\", \"two${c}\", \"three\"];\n" |     val before = "foo = [\"one\", \"two${c}\", \"three\"];\n" | ||||||
|     val after = "foo = [\"one\", \"\", \"three\"];\n" |     val after = "foo = [\"one\", \"\", \"three\"];\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i"| |   // VIM-132 |d| |v_i"| | ||||||
| @@ -449,7 +449,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "foo = \"fo\\\"o b${c}ar\";\n" |     val before = "foo = \"fo\\\"o b${c}ar\";\n" | ||||||
|     val after = "foo = \"\";\n" |     val after = "foo = \"\";\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i"| |   // VIM-132 |d| |v_i"| | ||||||
| @@ -457,35 +457,35 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "f${c}oo = [\"one\", \"two\", \"three\"];\n" |     val before = "f${c}oo = [\"one\", \"two\", \"three\"];\n" | ||||||
|     val after = "foo = [\"\", \"two\", \"three\"];\n" |     val after = "foo = [\"\", \"two\", \"three\"];\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDeleteDoubleQuotedStringOddNumberOfQuotes() { |   fun testDeleteDoubleQuotedStringOddNumberOfQuotes() { | ||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "abc\"def${c}\"gh\"i" |     val before = "abc\"def${c}\"gh\"i" | ||||||
|     val after = "abc\"\"gh\"i" |     val after = "abc\"\"gh\"i" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDeleteDoubleQuotedStringBetweenEvenNumberOfQuotes() { |   fun testDeleteDoubleQuotedStringBetweenEvenNumberOfQuotes() { | ||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "abc\"def\"g${c}h\"ijk\"l" |     val before = "abc\"def\"g${c}h\"ijk\"l" | ||||||
|     val after = "abc\"def\"\"ijk\"l" |     val after = "abc\"def\"\"ijk\"l" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDeleteDoubleQuotedStringOddNumberOfQuotesOnLast() { |   fun testDeleteDoubleQuotedStringOddNumberOfQuotesOnLast() { | ||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "abcdef\"gh\"ij${c}\"kl" |     val before = "abcdef\"gh\"ij${c}\"kl" | ||||||
|     val after = "abcdef\"gh\"ij\"kl" |     val after = "abcdef\"gh\"ij\"kl" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDeleteDoubleQuotedStringEvenNumberOfQuotesOnLast() { |   fun testDeleteDoubleQuotedStringEvenNumberOfQuotesOnLast() { | ||||||
|     val keys = listOf("di\"") |     val keys = listOf("di\"") | ||||||
|     val before = "abc\"def\"gh\"ij${c}\"kl" |     val before = "abc\"def\"gh\"ij${c}\"kl" | ||||||
|     val after = "abc\"def\"gh\"\"kl" |     val after = "abc\"def\"gh\"\"kl" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |v_i"| |   // VIM-132 |v_i"| | ||||||
| @@ -493,7 +493,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("vi\"") |     val keys = listOf("vi\"") | ||||||
|     val before = "foo = [\"o${c}ne\", \"two\"];\n" |     val before = "foo = [\"o${c}ne\", \"two\"];\n" | ||||||
|     val after = "foo = [\"${s}on${c}e${se}\", \"two\"];\n" |     val after = "foo = [\"${s}on${c}e${se}\", \"two\"];\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.VISUAL, CommandState.SubMode.VISUAL_CHARACTER) |     doTest(keys, before, after, VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |c| |v_i"| |   // |c| |v_i"| | ||||||
| @@ -501,7 +501,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("ci\"") |     val keys = listOf("ci\"") | ||||||
|     val before = "foo = \"${c}\";\n" |     val before = "foo = \"${c}\";\n" | ||||||
|     val after = "foo = \"\";\n" |     val after = "foo = \"\";\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i'| |   // VIM-132 |d| |v_i'| | ||||||
| @@ -509,7 +509,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di'") |     val keys = listOf("di'") | ||||||
|     val before = "foo = 'bar b${c}az';\n" |     val before = "foo = 'bar b${c}az';\n" | ||||||
|     val after = "foo = '';\n" |     val after = "foo = '';\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_i`| |   // VIM-132 |d| |v_i`| | ||||||
| @@ -517,7 +517,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("di`") |     val keys = listOf("di`") | ||||||
|     val before = "foo = `bar b${c}az`;\n" |     val before = "foo = `bar b${c}az`;\n" | ||||||
|     val after = "foo = ``;\n" |     val after = "foo = ``;\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_a'| |   // VIM-132 |d| |v_a'| | ||||||
| @@ -526,7 +526,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("da'") |     val keys = listOf("da'") | ||||||
|     val before = "foo = 'bar b${c}az';\n" |     val before = "foo = 'bar b${c}az';\n" | ||||||
|     val after = "foo = ;\n" |     val after = "foo = ;\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-132 |d| |v_a`| |   // VIM-132 |d| |v_a`| | ||||||
| @@ -535,7 +535,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("da`") |     val keys = listOf("da`") | ||||||
|     val before = "foo = `bar b${c}az`;\n" |     val before = "foo = `bar b${c}az`;\n" | ||||||
|     val after = "foo = ;\n" |     val after = "foo = ;\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1427 |   // VIM-1427 | ||||||
| @@ -543,7 +543,7 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("d2at") |     val keys = listOf("d2at") | ||||||
|     val before = "<a><b><c>$c</c></b></a>" |     val before = "<a><b><c>$c</c></b></a>" | ||||||
|     val after = "<a></a>" |     val after = "<a></a>" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-2113 |   // VIM-2113 | ||||||
| @@ -551,14 +551,14 @@ class MotionActionTest : VimTestCase() { | |||||||
|     val keys = listOf("cit") |     val keys = listOf("cit") | ||||||
|     val before = "<a><c>$c</c></a>" |     val before = "<a><c>$c</c></a>" | ||||||
|     val after = "<a><c></c></a>" |     val after = "<a><c></c></a>" | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testDeleteToDigraph() { |   fun testDeleteToDigraph() { | ||||||
|     val keys = listOf("d/<C-K>O:<CR>") |     val keys = listOf("d/<C-K>O:<CR>") | ||||||
|     val before = "ab${c}cdÖef" |     val before = "ab${c}cdÖef" | ||||||
|     val after = "abÖef" |     val after = "abÖef" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |[(| |   // |[(| | ||||||
| @@ -801,7 +801,7 @@ two | |||||||
|     val keys = listOf("viw", "<Esc>", "0", "viw", "gv", "d") |     val keys = listOf("viw", "<Esc>", "0", "viw", "gv", "d") | ||||||
|     val before = "foo ${c}bar\n" |     val before = "foo ${c}bar\n" | ||||||
|     val after = "foo \n" |     val after = "foo \n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |CTRL-V| |   // |CTRL-V| | ||||||
| @@ -817,7 +817,7 @@ two | |||||||
|     ${s}ba${se}r |     ${s}ba${se}r | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.VISUAL, CommandState.SubMode.VISUAL_BLOCK) |     doTest(keys, before, after, VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_BLOCK) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |CTRL-V| |   // |CTRL-V| | ||||||
| @@ -833,7 +833,7 @@ two | |||||||
|     b${s}ar$se |     b${s}ar$se | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.VISUAL, CommandState.SubMode.VISUAL_BLOCK) |     doTest(keys, before, after, VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_BLOCK) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |CTRL-V| |   // |CTRL-V| | ||||||
| @@ -851,7 +851,7 @@ two | |||||||
|     a${s}b$se |     a${s}b$se | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.VISUAL, CommandState.SubMode.VISUAL_BLOCK) |     doTest(keys, before, after, VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_BLOCK) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |v_o| |   // |v_o| | ||||||
| @@ -859,7 +859,7 @@ two | |||||||
|     val keys = listOf("v", "l", "o", "l", "d") |     val keys = listOf("v", "l", "o", "l", "d") | ||||||
|     val before = "${c}foo\n" |     val before = "${c}foo\n" | ||||||
|     val after = "fo\n" |     val after = "fo\n" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-564 |g_| |   // VIM-564 |g_| | ||||||
| @@ -880,8 +880,8 @@ two | |||||||
|                 four   |                 four   | ||||||
|                  |                  | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -903,8 +903,8 @@ two | |||||||
|                 four   |                 four   | ||||||
|                  |                  | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -924,7 +924,7 @@ two | |||||||
|     bar |     bar | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // |v_>| |gv| |   // |v_>| |gv| | ||||||
| @@ -948,7 +948,7 @@ two | |||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     typeText(injector.parser.parseKeys(">")) |     typeText(injector.parser.parseKeys(">")) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|     assertState( |     assertState( | ||||||
|       """    foo |       """    foo | ||||||
|     bar |     bar | ||||||
| @@ -963,7 +963,7 @@ two | |||||||
| """ | """ | ||||||
|     ) |     ) | ||||||
|     typeText(injector.parser.parseKeys(">")) |     typeText(injector.parser.parseKeys(">")) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|     assertState( |     assertState( | ||||||
|       """        foo |       """        foo | ||||||
|         bar |         bar | ||||||
| @@ -992,7 +992,7 @@ two | |||||||
|     bar |     bar | ||||||
|      |      | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.VISUAL, CommandState.SubMode.VISUAL_CHARACTER) |     doTest(keys, before, after, VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testVisualLineSelectDown() { |   fun testVisualLineSelectDown() { | ||||||
| @@ -1006,7 +1006,7 @@ two | |||||||
|       |       | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.VISUAL) |     assertMode(VimStateMachine.Mode.VISUAL) | ||||||
|     assertSelection( |     assertSelection( | ||||||
|       """ |       """ | ||||||
|     bar |     bar | ||||||
| @@ -1029,7 +1029,7 @@ two | |||||||
|       |       | ||||||
|       """.trimIndent() |       """.trimIndent() | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.VISUAL) |     assertMode(VimStateMachine.Mode.VISUAL) | ||||||
|     assertSelection( |     assertSelection( | ||||||
|       """ |       """ | ||||||
|     bar |     bar | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -20,8 +20,8 @@ package org.jetbrains.plugins.ideavim.action | |||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.VimPlugin | import com.maddyhome.idea.vim.VimPlugin | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.MappingMode | ||||||
| import com.maddyhome.idea.vim.common.MappingMode | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.key.MappingOwner | import com.maddyhome.idea.vim.key.MappingOwner | ||||||
| import junit.framework.TestCase | import junit.framework.TestCase | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason | import org.jetbrains.plugins.ideavim.SkipNeovimReason | ||||||
| @@ -35,7 +35,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = "<C-\\><C-N>" |     val keys = "<C-\\><C-N>" | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "A Discovery" |     val after = "A Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -43,7 +43,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("i", "<C-\\><C-N>") |     val keys = listOf("i", "<C-\\><C-N>") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "A Discovery" |     val after = "A Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -51,7 +51,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("i", "<C-\\><C-N>") |     val keys = listOf("i", "<C-\\><C-N>") | ||||||
|     val before = "A Disc${c}overy" |     val before = "A Disc${c}overy" | ||||||
|     val after = "A Dis${c}covery" |     val after = "A Dis${c}covery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -59,7 +59,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("i", "<C-\\><C-N>", "3l") |     val keys = listOf("i", "<C-\\><C-N>", "3l") | ||||||
|     val before = "${c}A Discovery" |     val before = "${c}A Discovery" | ||||||
|     val after = "A D${c}iscovery" |     val after = "A D${c}iscovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -67,7 +67,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("V", "<C-\\><C-N>") |     val keys = listOf("V", "<C-\\><C-N>") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "A Discovery" |     val after = "A Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -75,7 +75,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("gH", "<C-\\><C-N>") |     val keys = listOf("gH", "<C-\\><C-N>") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "A Discovery" |     val after = "A Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -83,7 +83,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("d", "<C-\\><C-N>") |     val keys = listOf("d", "<C-\\><C-N>") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "A Discovery" |     val after = "A Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -91,7 +91,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = "d<Esc>dw" |     val keys = "d<Esc>dw" | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "Discovery" |     val after = "Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -99,7 +99,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("d", "<C-\\><C-N>", "dw") |     val keys = listOf("d", "<C-\\><C-N>", "dw") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "Discovery" |     val after = "Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -107,7 +107,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("d", "<Esc>", "dw") |     val keys = listOf("d", "<Esc>", "dw") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "Discovery" |     val after = "Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -115,7 +115,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("d", "<C-[>", "dw") |     val keys = listOf("d", "<C-[>", "dw") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "Discovery" |     val after = "Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -127,7 +127,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("d", "<C-D>", "dw") |     val keys = listOf("d", "<C-D>", "dw") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "Discovery" |     val after = "Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -135,7 +135,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = listOf("c", "<C-\\><C-N>", "another") |     val keys = listOf("c", "<C-\\><C-N>", "another") | ||||||
|     val before = "A Discovery" |     val before = "A Discovery" | ||||||
|     val after = "Another Discovery" |     val after = "Another Discovery" | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -143,7 +143,7 @@ class ResetModeActionTest : VimTestCase() { | |||||||
|     val keys = "dt<esc>D" |     val keys = "dt<esc>D" | ||||||
|     val before = "A ${c}Discovery" |     val before = "A ${c}Discovery" | ||||||
|     val after = "A " |     val after = "A " | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) |     TestCase.assertFalse(myFixture.editor.selectionModel.hasSelection()) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change | package org.jetbrains.plugins.ideavim.action.change | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason | import org.jetbrains.plugins.ideavim.SkipNeovimReason | ||||||
| import org.jetbrains.plugins.ideavim.TestWithoutNeovim | import org.jetbrains.plugins.ideavim.TestWithoutNeovim | ||||||
| @@ -43,7 +43,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test simple repeat with dollar motion`() { |   fun `test simple repeat with dollar motion`() { | ||||||
| @@ -64,7 +64,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test repeat to line end`() { |   fun `test repeat to line end`() { | ||||||
| @@ -85,7 +85,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers(description = "Different caret position") |   @VimBehaviorDiffers(description = "Different caret position") | ||||||
| @@ -107,7 +107,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 whe${c}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |                 whe${c}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||||
|                 XXXX by the torrent of a mountain pass. |                 XXXX by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test count doesn't affect repeat`() { |   fun `test count doesn't affect repeat`() { | ||||||
| @@ -128,7 +128,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(SkipNeovimReason.MULTICARET) |   @TestWithoutNeovim(SkipNeovimReason.MULTICARET) | ||||||
| @@ -150,7 +150,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where XXXXXX settled on some sodden sand |                 where XXXXXX settled on some sodden sand | ||||||
|                 ${c}XXXXXXy the torrent of a mountain pass. |                 ${c}XXXXXXy the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test line motion`() { |   fun `test line motion`() { | ||||||
| @@ -171,7 +171,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers(description = "Wrong caret position") |   @VimBehaviorDiffers(description = "Wrong caret position") | ||||||
| @@ -193,7 +193,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 ${c}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |                 ${c}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers(description = "Wrong caret position") |   @VimBehaviorDiffers(description = "Wrong caret position") | ||||||
| @@ -215,7 +215,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 |where it was settled on some sodden sand |                 |where it was settled on some sodden sand | ||||||
|                 |hard by the torrent of a mountain pass. |                 |hard by the torrent of a mountain pass. | ||||||
|                 """.trimMargin() |                 """.trimMargin() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers(description = "Wrong caret position") |   @VimBehaviorDiffers(description = "Wrong caret position") | ||||||
| @@ -237,7 +237,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 wherXXXt was settled on some sodden sand |                 wherXXXt was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers( |   @VimBehaviorDiffers( | ||||||
| @@ -271,7 +271,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 XXXXX${c}Xy the torrent of a mountain pass. |                 XXXXX${c}Xy the torrent of a mountain pass. | ||||||
|  |  | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(SkipNeovimReason.UNCLEAR) |   @TestWithoutNeovim(SkipNeovimReason.UNCLEAR) | ||||||
| @@ -293,7 +293,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|                 ${c}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |                 ${c}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||||
|                 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |                 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test repeat with count`() { |   fun `test repeat with count`() { | ||||||
| @@ -314,7 +314,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|               where it was settled on some sodden sand |               where it was settled on some sodden sand | ||||||
|               hard by the torrent of a mountain pass. |               hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test redo register feature`() { |   fun `test redo register feature`() { | ||||||
| @@ -331,7 +331,7 @@ class RepeatChangeActionTest : VimTestCase() { | |||||||
|         One |         One | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, CommandState.SubMode.NONE |       VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change | package org.jetbrains.plugins.ideavim.action.change | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| class UndoActionTest : VimTestCase() { | class UndoActionTest : VimTestCase() { | ||||||
| @@ -33,7 +33,7 @@ class UndoActionTest : VimTestCase() { | |||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     val after = before |     val after = before | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     val editor = myFixture.editor |     val editor = myFixture.editor | ||||||
|     assertFalse(editor.caretModel.primaryCaret.hasSelection()) |     assertFalse(editor.caretModel.primaryCaret.hasSelection()) | ||||||
|   } |   } | ||||||
| @@ -49,7 +49,7 @@ class UndoActionTest : VimTestCase() { | |||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     val after = before |     val after = before | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     assertFalse(hasSelection()) |     assertFalse(hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -71,7 +71,7 @@ class UndoActionTest : VimTestCase() { | |||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     assertFalse(hasSelection()) |     assertFalse(hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -88,12 +88,12 @@ class UndoActionTest : VimTestCase() { | |||||||
|     val after = """ |     val after = """ | ||||||
|                 A Discovery |                 A Discovery | ||||||
|  |  | ||||||
|                 I1 found${c} it in a legendary land |                 I1 found$c it in a legendary land | ||||||
|                 all rocks and lavender and tufted grass, |                 all rocks and lavender and tufted grass, | ||||||
|                 where it was settled on some sodden sand |                 where it was settled on some sodden sand | ||||||
|                 hard by the torrent of a mountain pass. |                 hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|     assertFalse(hasSelection()) |     assertFalse(hasSelection()) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change | package org.jetbrains.plugins.ideavim.action.change.change | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| class ChangeLineActionTest : VimTestCase() { | class ChangeLineActionTest : VimTestCase() { | ||||||
| @@ -26,14 +26,14 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|     setupChecks { |     setupChecks { | ||||||
|       this.neoVim.ignoredRegisters = setOf('1', '"') |       this.neoVim.ignoredRegisters = setOf('1', '"') | ||||||
|     } |     } | ||||||
|     doTest("cc", "", "", CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest("cc", "", "", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test on empty file with S`() { |   fun `test on empty file with S`() { | ||||||
|     setupChecks { |     setupChecks { | ||||||
|       this.neoVim.ignoredRegisters = setOf('1', '"') |       this.neoVim.ignoredRegisters = setOf('1', '"') | ||||||
|     } |     } | ||||||
|     doTest("S", "", "", CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest("S", "", "", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test on last line with S`() { |   fun `test on last line with S`() { | ||||||
| @@ -47,7 +47,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             I found it in a legendary land |             I found it in a legendary land | ||||||
|             $c |             $c | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -64,7 +64,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             $c |             $c | ||||||
|              |              | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -79,7 +79,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             I found it in a legendary land |             I found it in a legendary land | ||||||
|             $c |             $c | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -96,7 +96,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             $c |             $c | ||||||
|              |              | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -111,7 +111,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             $c |             $c | ||||||
|             all rocks and lavender and tufted grass, |             all rocks and lavender and tufted grass, | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -128,7 +128,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             $c |             $c | ||||||
|              |              | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -145,7 +145,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             all rocks and lavender and tufted grass, |             all rocks and lavender and tufted grass, | ||||||
|             $c |             $c | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -182,7 +182,7 @@ class ChangeLineActionTest : VimTestCase() { | |||||||
|             that priceless mote now dimpling the convex |             that priceless mote now dimpling the convex | ||||||
|             and limpid teardrop on a lighted slide. |             and limpid teardrop on a lighted slide. | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,18 +20,18 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change | package org.jetbrains.plugins.ideavim.action.change.change | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| class ChangeMotionActionTest : VimTestCase() { | class ChangeMotionActionTest : VimTestCase() { | ||||||
|   // VIM-515 |c| |W| |   // VIM-515 |c| |W| | ||||||
|   fun `test change big word with punctuation and alpha`() { |   fun `test change big word with punctuation and alpha`() { | ||||||
|     doTest("cW", "foo${c}(bar baz\n", "foo baz\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest("cW", "foo${c}(bar baz\n", "foo baz\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-300 |c| |w| |   // VIM-300 |c| |w| | ||||||
|   fun testChangeWordTwoWordsWithoutWhitespace() { |   fun testChangeWordTwoWordsWithoutWhitespace() { | ||||||
|     doTest("cw", "${c}\$value\n", "value\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest("cw", "${c}\$value\n", "value\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-296 |cc| |   // VIM-296 |cc| | ||||||
| @@ -39,7 +39,7 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|     doTest( |     doTest( | ||||||
|       "cc", |       "cc", | ||||||
|       "foo\n" + "${c}bar\n", |       "foo\n" + "${c}bar\n", | ||||||
|       "foo\n${c}" + "\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "foo\n${c}" + "\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -57,7 +57,7 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|         ....${c} |         ....${c} | ||||||
|         } |         } | ||||||
|       """.trimIndent().dotToSpace(), |       """.trimIndent().dotToSpace(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -66,7 +66,7 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|     doTest( |     doTest( | ||||||
|       "ccbaz", |       "ccbaz", | ||||||
|       "${c}foo\n" + "bar\n", |       "${c}foo\n" + "bar\n", | ||||||
|       "baz\n" + "bar\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "baz\n" + "bar\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -83,7 +83,7 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|         ${c} |         ${c} | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -91,23 +91,23 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|     doTest( |     doTest( | ||||||
|       "c_baz", |       "c_baz", | ||||||
|       "${c}foo\n" + "bar\n", |       "${c}foo\n" + "bar\n", | ||||||
|       "baz\n" + "bar\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "baz\n" + "bar\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-200 |c| |w| |   // VIM-200 |c| |w| | ||||||
|   fun testChangeWordAtLastChar() { |   fun testChangeWordAtLastChar() { | ||||||
|     doTest( |     doTest( | ||||||
|       "cw", "on${c}e two three\n", "on${c} two three\n", CommandState.Mode.INSERT, |       "cw", "on${c}e two three\n", "on${c} two three\n", VimStateMachine.Mode.INSERT, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-1380 |c| |w| |count| |   // VIM-1380 |c| |w| |count| | ||||||
|   fun testChangeTwoWordsAtLastChar() { |   fun testChangeTwoWordsAtLastChar() { | ||||||
|     doTest( |     doTest( | ||||||
|       "c2w", "on${c}e two three\n", "on${c} three\n", CommandState.Mode.INSERT, |       "c2w", "on${c}e two three\n", "on${c} three\n", VimStateMachine.Mode.INSERT, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -125,15 +125,15 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|    } |    } | ||||||
|     |     | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.INSERT, CommandState.SubMode.NONE |       VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-276 |c| |T| |   // VIM-276 |c| |T| | ||||||
|   fun testChangeLinesTillBackwards() { |   fun testChangeLinesTillBackwards() { | ||||||
|     doTest( |     doTest( | ||||||
|       "cT(", "if (condition) ${c}{\n" + "}\n", "if ({\n" + "}\n", CommandState.Mode.INSERT, |       "cT(", "if (condition) ${c}{\n" + "}\n", "if ({\n" + "}\n", VimStateMachine.Mode.INSERT, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -143,7 +143,7 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|     doTest( |     doTest( | ||||||
|       "cFc", |       "cFc", | ||||||
|       "if (condition) {${c}\n" + "}\n", |       "if (condition) {${c}\n" + "}\n", | ||||||
|       "if (\n" + "}\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "if (\n" + "}\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -151,7 +151,7 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|   fun testChangeLastWordInLine() { |   fun testChangeLastWordInLine() { | ||||||
|     doTest( |     doTest( | ||||||
|       "cw", |       "cw", | ||||||
|       "ab.${c}cd\n", "ab.${c}\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "ab.${c}cd\n", "ab.${c}\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -159,16 +159,16 @@ class ChangeMotionActionTest : VimTestCase() { | |||||||
|   fun testChangeLastInnerWordInLine() { |   fun testChangeLastInnerWordInLine() { | ||||||
|     doTest( |     doTest( | ||||||
|       listOf("c", "iw", "baz"), |       listOf("c", "iw", "baz"), | ||||||
|       "foo bar bo${c}o\n", "foo bar baz\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE |       "foo bar bo${c}o\n", "foo bar baz\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // VIM-421 |c| |w| |   // VIM-421 |c| |w| | ||||||
|   fun testChangeLastCharInLine() { |   fun testChangeLastCharInLine() { | ||||||
|     doTest("cw", "fo${c}o\n", "fo${c}\n", CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest("cw", "fo${c}o\n", "fo${c}\n", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun testLastSymbolInWord() { |   fun testLastSymbolInWord() { | ||||||
|     doTest("cw", "fo${c}o", "fo${c}", CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest("cw", "fo${c}o", "fo${c}", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
| package org.jetbrains.plugins.ideavim.action.change.change | package org.jetbrains.plugins.ideavim.action.change.change | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.api.injector | import com.maddyhome.idea.vim.api.injector | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | ||||||
| import org.jetbrains.plugins.ideavim.SkipNeovimReason | import org.jetbrains.plugins.ideavim.SkipNeovimReason | ||||||
| import org.jetbrains.plugins.ideavim.TestWithoutNeovim | import org.jetbrains.plugins.ideavim.TestWithoutNeovim | ||||||
| @@ -45,7 +45,7 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|             where it was settled on some sodden sand |             where it was settled on some sodden sand | ||||||
|             hard by the torrent of a mountain pass. |             hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test multiple line change in text middle`() { |   fun `test multiple line change in text middle`() { | ||||||
| @@ -65,7 +65,7 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|             where it was settled on some sodden sand |             where it was settled on some sodden sand | ||||||
|             hard by the torrent of a mountain pass. |             hard by the torrent of a mountain pass. | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers( |   @VimBehaviorDiffers( | ||||||
| @@ -97,7 +97,7 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|             ${c} |             ${c} | ||||||
|              |              | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test multiple line change till the end with two new lines`() { |   fun `test multiple line change till the end with two new lines`() { | ||||||
| @@ -123,7 +123,7 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|              |              | ||||||
|              |              | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers(description = "Wrong caret position") |   @VimBehaviorDiffers(description = "Wrong caret position") | ||||||
| @@ -145,14 +145,14 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|             wh|Hello |             wh|Hello | ||||||
|             ha|Hello |             ha|Hello | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test replace first line`() { |   fun `test replace first line`() { | ||||||
|     val keys = "VcHello<esc>" |     val keys = "VcHello<esc>" | ||||||
|     val before = "${c}A Discovery" |     val before = "${c}A Discovery" | ||||||
|     val after = "Hello" |     val after = "Hello" | ||||||
|     doTest(keys, before, after, CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @TestWithoutNeovim(SkipNeovimReason.MULTICARET) |   @TestWithoutNeovim(SkipNeovimReason.MULTICARET) | ||||||
| @@ -161,7 +161,7 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|       injector.parser.parseKeys("v2lc" + "aaa" + "<ESC>"), |       injector.parser.parseKeys("v2lc" + "aaa" + "<ESC>"), | ||||||
|       "abcd${c}ffffff${c}abcde${c}aaaa\n" |       "abcd${c}ffffff${c}abcde${c}aaaa\n" | ||||||
|     ) |     ) | ||||||
|     assertMode(CommandState.Mode.COMMAND) |     assertMode(VimStateMachine.Mode.COMMAND) | ||||||
|     assertState("abcdaa${c}afffaa${c}adeaa${c}aa\n") |     assertState("abcdaa${c}afffaa${c}adeaa${c}aa\n") | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -182,8 +182,8 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|         ba_quux_bar |         ba_quux_bar | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -204,8 +204,8 @@ class ChangeVisualActionTest : VimTestCase() { | |||||||
|         ba_quux_bar |         ba_quux_bar | ||||||
|          |          | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change | package org.jetbrains.plugins.ideavim.action.change.change | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| @@ -43,7 +43,7 @@ class ChangeVisualLinesEndActionTest : VimTestCase() { | |||||||
|             where it was settled on some sodden sand |             where it was settled on some sodden sand | ||||||
|             ${c} |             ${c} | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test last empty line`() { |   fun `test last empty line`() { | ||||||
| @@ -66,7 +66,7 @@ class ChangeVisualLinesEndActionTest : VimTestCase() { | |||||||
|             hard by the torrent of a mountain pass. |             hard by the torrent of a mountain pass. | ||||||
|             ${c} |             ${c} | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @VimBehaviorDiffers( |   @VimBehaviorDiffers( | ||||||
| @@ -99,6 +99,6 @@ class ChangeVisualLinesEndActionTest : VimTestCase() { | |||||||
|             ${c} |             ${c} | ||||||
|              |              | ||||||
|     """.trimIndent() |     """.trimIndent() | ||||||
|     doTest(keys, before, after, CommandState.Mode.INSERT, CommandState.SubMode.NONE) |     doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,16 +18,16 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change.number | package org.jetbrains.plugins.ideavim.action.change.change.number | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| class ChangeNumberDecActionTest : VimTestCase() { | class ChangeNumberDecActionTest : VimTestCase() { | ||||||
|   fun `test decrement hex to negative value`() { |   fun `test decrement hex to negative value`() { | ||||||
|     doTest("<C-X>", "0x0000", "0xffffffffffffffff", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("<C-X>", "0x0000", "0xffffffffffffffff", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test decrement hex to negative value by 10`() { |   fun `test decrement hex to negative value by 10`() { | ||||||
|     doTest("10<C-X>", "0x0005", "0xfffffffffffffffb", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("10<C-X>", "0x0005", "0xfffffffffffffffb", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test decrement oct to negative value`() { |   fun `test decrement oct to negative value`() { | ||||||
| @@ -35,13 +35,13 @@ class ChangeNumberDecActionTest : VimTestCase() { | |||||||
|       ":set nrformats+=octal<CR><C-X>", |       ":set nrformats+=octal<CR><C-X>", | ||||||
|       "00000", |       "00000", | ||||||
|       "01777777777777777777777", |       "01777777777777777777777", | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test decrement incorrect octal`() { |   fun `test decrement incorrect octal`() { | ||||||
|     doTest(":set nrformats+=octal<CR><C-X>", "008", "7", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest(":set nrformats+=octal<CR><C-X>", "008", "7", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   fun `test decrement oct to negative value by 10`() { |   fun `test decrement oct to negative value by 10`() { | ||||||
| @@ -49,8 +49,8 @@ class ChangeNumberDecActionTest : VimTestCase() { | |||||||
|       ":set nrformats+=octal<CR>10<C-X>", |       ":set nrformats+=octal<CR>10<C-X>", | ||||||
|       "00005", |       "00005", | ||||||
|       "01777777777777777777773", |       "01777777777777777777773", | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,13 +18,13 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change.number | package org.jetbrains.plugins.ideavim.action.change.change.number | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | import com.maddyhome.idea.vim.helper.VimBehaviorDiffers | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| class ChangeNumberIncActionTest : VimTestCase() { | class ChangeNumberIncActionTest : VimTestCase() { | ||||||
|   @VimBehaviorDiffers(originalVimAfter = "11X0") |   @VimBehaviorDiffers(originalVimAfter = "11X0") | ||||||
|   fun `test inc fancy number`() { |   fun `test inc fancy number`() { | ||||||
|     doTest("<C-A>", "1${c}0X0", "10X1", CommandState.Mode.COMMAND, CommandState.SubMode.NONE) |     doTest("<C-A>", "1${c}0X0", "10X1", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change.number | package org.jetbrains.plugins.ideavim.action.change.change.number | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -38,8 +38,8 @@ class ChangeVisualNumberAvalancheDecActionTest : VimTestCase() { | |||||||
|                     number 1 |                     number 1 | ||||||
|                     number 1 |                     number 1 | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -56,8 +56,8 @@ class ChangeVisualNumberAvalancheDecActionTest : VimTestCase() { | |||||||
|                     number 1 |                     number 1 | ||||||
|                     number 1 |                     number 1 | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
|  |  | ||||||
| package org.jetbrains.plugins.ideavim.action.change.change.number | package org.jetbrains.plugins.ideavim.action.change.change.number | ||||||
|  |  | ||||||
| import com.maddyhome.idea.vim.command.CommandState | import com.maddyhome.idea.vim.command.VimStateMachine | ||||||
| import org.jetbrains.plugins.ideavim.VimTestCase | import org.jetbrains.plugins.ideavim.VimTestCase | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -38,8 +38,8 @@ class ChangeVisualNumberAvalancheIncActionTest : VimTestCase() { | |||||||
|                     number 3 |                     number 3 | ||||||
|                     number 4 |                     number 4 | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -56,8 +56,8 @@ class ChangeVisualNumberAvalancheIncActionTest : VimTestCase() { | |||||||
|                     number 5 |                     number 5 | ||||||
|                     number 7 |                     number 7 | ||||||
|       """.trimIndent(), |       """.trimIndent(), | ||||||
|       CommandState.Mode.COMMAND, |       VimStateMachine.Mode.COMMAND, | ||||||
|       CommandState.SubMode.NONE |       VimStateMachine.SubMode.NONE | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user