mirror of
				https://github.com/chylex/IntelliJ-IdeaVim.git
				synced 2025-10-31 20:17:13 +01:00 
			
		
		
		
	Compare commits
	
		
			224 Commits
		
	
	
		
			9f469d0eb2
			...
			customized
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8a9d9af1bb | |||
| b52c331adf | |||
| dca254219a | |||
| c50b8cb5cd | |||
| 09a86c204d | |||
| afcbdf3326 | |||
| 663c92e1c5 | |||
| d9674494f5 | |||
|   | 943ddeb5ab | ||
|   | 216a3fedd0 | ||
|   | 7b8c335a5b | ||
|   | 8e8efe4862 | ||
|   | e64dc3cc1c | ||
|   | c833691cf6 | ||
|   | ba5e2e8613 | ||
|   | b154e31a28 | ||
|   | 322b888dc5 | ||
|   | 42eefb763b | ||
|   | 27be351636 | ||
|   | 8b20287f93 | ||
|   | 50a7bdb34d | ||
|   | dcac3be0da | ||
|   | ec121fb327 | ||
|   | ccb260b6a7 | ||
|   | c994511ea5 | ||
|   | fb5177633a | ||
|   | b15fde59d1 | ||
|   | 1958974c73 | ||
|   | 00b1b0fea4 | ||
|   | 743b978e6f | ||
|   | cbabd8b76e | ||
|   | 1fd877c597 | ||
|   | 4f64ed07b1 | ||
|   | 4e537b0466 | ||
|   | 2b1198dfd9 | ||
|   | 8db23fba43 | ||
|   | 0451487549 | ||
|   | a16faa97ec | ||
|   | dbf626a53e | ||
|   | 27cc767ec4 | ||
|   | 8d2d08a12b | ||
|   | 7c91d97440 | ||
|   | 0eb7b53801 | ||
|   | 510e31584e | ||
|   | 0efedd7fa5 | ||
|   | 01a32705e4 | ||
|   | 05c1b82bcf | ||
|   | cf04796010 | ||
|   | fd7e66e144 | ||
|   | ceaf290f5e | ||
|   | 5df9ae57ce | ||
|   | 04ed7d413f | ||
|   | f543835921 | ||
|   | 8ae35160e7 | ||
|   | 75516a7217 | ||
|   | 8783fc89e6 | ||
|   | fd0819ca30 | ||
|   | 650b925251 | ||
|   | fd3e32eaa8 | ||
|   | a8bebb88b1 | ||
|   | 3294a74979 | ||
|   | db95804eeb | ||
|   | 15bfc00ddb | ||
|   | 18580e431f | ||
|   | 98624d8701 | ||
|   | 3c03a15831 | ||
|   | 9710a7bfc1 | ||
|   | 34426ae32d | ||
|   | c2f98ee317 | ||
|   | 4df2abba82 | ||
|   | c3cd207b2b | ||
|   | 4f6053f767 | ||
|   | 5578fbdd4f | ||
|   | 84a6c40e13 | ||
|   | 3e91004660 | ||
|   | ac1d334bf1 | ||
|   | 368c840177 | ||
|   | c3a2fd736c | ||
|   | 741987f40b | ||
|   | 375b025e22 | ||
|   | 7324ee5e8d | ||
|   | 54c2299654 | ||
|   | b2cfb6d6ed | ||
|   | e8a11b8f79 | ||
|   | f16890f9a7 | ||
|   | e881bec45d | ||
|   | 18eea7ca2d | ||
|   | 316410a561 | ||
|   | 76a1a190f6 | ||
|   | c243ae9cef | ||
|   | 2722ee63cc | ||
|   | 22e7fa1cf3 | ||
|   | 101dc355ba | ||
|   | f5f3d0b827 | ||
|   | 53cb5d1fe9 | ||
|   | 0978ca616f | ||
|   | bbf42c0a28 | ||
|   | 7df04c6e2e | ||
|   | d3386c8097 | ||
|   | 309197781e | ||
|   | 5a3ee970a0 | ||
|   | 7cbe63e484 | ||
|   | 5342b02091 | ||
|   | 7eeca57135 | ||
|   | 2162985e4a | ||
|   | 5d53f4c13a | ||
|   | 7de2c2692d | ||
|   | 1b9df35a1d | ||
|   | d5d39797bb | ||
|   | 829a228d79 | ||
|   | 4c589c9610 | ||
|   | b9fc58ec45 | ||
|   | 193a84dafd | ||
|   | 3880a33208 | ||
|   | 2edf897e39 | ||
|   | 27d1170c75 | ||
|   | 11c850a41e | ||
|   | ff4ee06a1f | ||
|   | 0549f32d6e | ||
|   | c5ab3490b3 | ||
|   | 50ba1a1c4e | ||
|   | ee45d2fb38 | ||
|   | a94822b79a | ||
|   | b5aba454ae | ||
|   | a49631e986 | ||
|   | bb31b5f2d3 | ||
|   | 8ad08d466e | ||
|   | ab31183a93 | ||
|   | 3257cc82dc | ||
|   | ef73733596 | ||
|   | 4b45d4cf09 | ||
|   | e0b3e1db24 | ||
|   | e0b51d653a | ||
|   | c17ebbf4d7 | ||
|   | 44a26d59a4 | ||
|   | 6b8f81f7eb | ||
|   | 9a4b9419eb | ||
|   | 89548d132a | ||
|   | 45dbb2cd3b | ||
|   | a95203e2c9 | ||
|   | a79fc4980e | ||
|   | 1240781503 | ||
|   | 0875c61bc9 | ||
|   | da60a1c393 | ||
|   | 785f29abf8 | ||
|   | 2a3e96b891 | ||
|   | f1f6dd4c60 | ||
|   | b8a8403dc3 | ||
|   | ab5eb9c401 | ||
|   | 74b7fc9f77 | ||
|   | ca87316691 | ||
|   | cae61587da | ||
|   | 0238d0bf2e | ||
|   | 5be575a078 | ||
|   | 36fbbbf4ae | ||
|   | a87ab3c558 | ||
|   | 75e22a2080 | ||
|   | 6c89799bfb | ||
|   | e0d9a8d0db | ||
|   | 3208f6a1bd | ||
|   | d525be33cf | ||
|   | 64136f0b93 | ||
|   | 238203cf35 | ||
|   | 6b354467ab | ||
|   | 10444e5995 | ||
|   | 42f6ca11db | ||
|   | eed094103d | ||
|   | 5051bcd607 | ||
|   | 74e2bb2d87 | ||
|   | a4a6331935 | ||
|   | 3939144128 | ||
|   | 7791c0b7be | ||
|   | 2cfbff5cf6 | ||
|   | b734153253 | ||
|   | 3df637b265 | ||
|   | ea220d2514 | ||
|   | 8bb75fc376 | ||
|   | d461fe555d | ||
|   | 0bd25f2506 | ||
|   | 2355435275 | ||
|   | cc04ef5869 | ||
|   | 521d8a605d | ||
|   | 3bff1b1ba5 | ||
|   | 15192652f0 | ||
|   | 85873202ca | ||
|   | 706bde03f9 | ||
|   | f855f5f429 | ||
|   | cce557e82a | ||
|   | 7f7d8bd771 | ||
|   | 9a95093b44 | ||
|   | ddf7bbdd31 | ||
|   | 994a811efa | ||
|   | 06efa46f32 | ||
|   | 66778a060c | ||
|   | c9697d6cc8 | ||
|   | b801daa240 | ||
|   | d2f42d67c7 | ||
|   | cb9d750db9 | ||
|   | 0b966c4497 | ||
|   | 0774a822aa | ||
|   | 7e0cdce7ea | ||
|   | e2ed963af5 | ||
|   | 4781d29d67 | ||
|   | f5b6ca50f4 | ||
|   | 05852b07c6 | ||
|   | 689aa4cf95 | ||
|   | 56aad9200a | ||
|   | ac69c0d9c6 | ||
|   | 860592291f | ||
|   | 113597333c | ||
|   | a83d71aa39 | ||
|   | 93299ae843 | ||
|   | 4300cf5330 | ||
|   | 92d08377ce | ||
|   | 19a6284023 | ||
|   | 45908f2a84 | ||
|   | 8648220e21 | ||
|   | 68e285b514 | ||
|   | 5153a42b69 | ||
|   | 42feed710c | ||
|   | 9d049b06c3 | ||
|   | 1105529e91 | ||
|   | 49c1f11503 | ||
|   | f54fd84de3 | 
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| * text=auto eol=lf | ||||
							
								
								
									
										39
									
								
								.github/workflows/closeYoutrackOnCommit.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								.github/workflows/closeYoutrackOnCommit.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| name: Close YouTrack on commit | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 300 | ||||
|       - name: Set up JDK 11 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
|           java-version: '11' | ||||
|           distribution: 'adopt' | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
|  | ||||
|       - uses: nrwl/last-successful-commit-action@v1 | ||||
|         id: last_successful_commit | ||||
|         with: | ||||
|           branch: 'master' | ||||
|           workflow_id: 'closeYoutrackOnCommit.yml' | ||||
|           github_token: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Update YouTrack | ||||
|         run: ./gradlew updateYoutrackOnCommit | ||||
|         env: | ||||
|           SUCCESS_COMMIT: ${{ steps.last_successful_commit.outputs.commit_hash }} | ||||
|           YOUTRACK_TOKEN: ${{ secrets.YOUTRACK_TOKEN }} | ||||
| @@ -1,10 +1,12 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
| 
 | ||||
| name: Update Changelog On PR (Test) | ||||
| name: Testing CI integrations | ||||
| 
 | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   schedule: | ||||
|     - cron: '0 5 * * *' | ||||
| 
 | ||||
| jobs: | ||||
|   build: | ||||
| @@ -14,7 +16,7 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 50 | ||||
|           fetch-depth: 300 | ||||
|       - name: Set up JDK 11 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
| @@ -23,18 +25,8 @@ jobs: | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
| 
 | ||||
|       - name: Update authors | ||||
|         id: update_authors | ||||
|         run: ./gradlew updateMergedPr -PprId=525 | ||||
|       - name: Run tests | ||||
|         run: ./gradlew integrationsTest | ||||
|         env: | ||||
|           YOUTRACK_TOKEN: ${{ secrets.YOUTRACK_TOKEN }} | ||||
|           GITHUB_OAUTH: ${{ secrets.MERGE_PR }} | ||||
| 
 | ||||
| #      - name: Commit changes | ||||
| #        uses: stefanzweifel/git-auto-commit-action@v4 | ||||
| #        with: | ||||
| #          branch: master | ||||
| #          commit_message: Update changelog  after merging PR | ||||
| #          commit_user_name: Alex Plate | ||||
| #          commit_user_email: aleksei.plate@jetbrains.com | ||||
| #          commit_author: Alex Plate <aleksei.plate@jetbrains.com> | ||||
| #          file_pattern: CHANGES.md | ||||
							
								
								
									
										35
									
								
								.github/workflows/kover.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								.github/workflows/kover.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| name: Kover | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 300 | ||||
|       - name: Set up JDK 11 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
|           java-version: '11' | ||||
|           distribution: 'adopt' | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
|  | ||||
|       - name: Run tests | ||||
|         run: ./gradlew koverXmlReport | ||||
|  | ||||
|  | ||||
|       # Upload Kover report to CodeCov | ||||
|       - uses: codecov/codecov-action@v3 | ||||
|         with: | ||||
|           files: ${{ github.workspace }}/build/reports/kover/xml/report.xml | ||||
							
								
								
									
										42
									
								
								.github/workflows/syncDoc.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								.github/workflows/syncDoc.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| # This workflow syncs changes from the docs folder of IdeaVim to the IdeaVim.wiki repository | ||||
|  | ||||
| name: Sync docs | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - name: Fetch origin repo | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           path: origin | ||||
|  | ||||
|       - name: Fetch docs repo | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           repository: JetBrains/ideavim.wiki | ||||
|           path: docs | ||||
|  | ||||
|       - name: Sync docs | ||||
|         id: update_authors | ||||
|         run: cp -a origin/doc/. docs | ||||
|  | ||||
|       - name: Commit changes | ||||
|         uses: stefanzweifel/git-auto-commit-action@v4 | ||||
|         with: | ||||
|           branch: master | ||||
|           repository: docs | ||||
|           commit_message: Update docs | ||||
|           commit_user_name: Alex Plate | ||||
|           commit_user_email: aleksei.plate@jetbrains.com | ||||
|           commit_author: Alex Plate <aleksei.plate@jetbrains.com> | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -9,6 +9,7 @@ | ||||
| !/.idea/fileTemplates | ||||
| !/.idea/runConfigurations | ||||
| !/.idea/codeStyles | ||||
| !/.idea/vcs.xml | ||||
|  | ||||
| **/build/ | ||||
| **/out/ | ||||
|   | ||||
							
								
								
									
										2
									
								
								.idea/copyright/IdeaVim.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/copyright/IdeaVim.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| <component name="CopyrightManager"> | ||||
|   <copyright> | ||||
|     <option name="notice" value="IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
Copyright (C) 2003-&#36;today.year 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/>." /> | ||||
|     <option name="notice" value="Copyright 2003-2022 The IdeaVim authors

Use of this source code is governed by an MIT-style
license that can be found in the LICENSE.txt file or at
https://opensource.org/licenses/MIT." /> | ||||
|     <option name="myName" value="IdeaVim" /> | ||||
|   </copyright> | ||||
| </component> | ||||
							
								
								
									
										14
									
								
								.idea/inspectionProfiles/Qodana.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								.idea/inspectionProfiles/Qodana.xml
									
									
									
										generated
									
									
									
								
							| @@ -33,9 +33,11 @@ | ||||
|       <option name="ignoreToString" value="false" /> | ||||
|       <option name="nonNlsCommentPattern" value="NON-NLS" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="MagicConstant" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="MissortedModifiers" enabled="true" level="WARNING" enabled_by_default="true"> | ||||
|       <option name="m_requireAnnotationsFirst" value="true" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="SameParameterValue" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="SameReturnValue" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false"> | ||||
|       <option name="processCode" value="true" /> | ||||
| @@ -44,5 +46,17 @@ | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="SuperTearDownInFinally" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="UnstableApiUsage" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="unused" enabled="false" level="WARNING" enabled_by_default="false" checkParameterExcludingHierarchy="false"> | ||||
|       <option name="LOCAL_VARIABLE" value="true" /> | ||||
|       <option name="FIELD" value="true" /> | ||||
|       <option name="METHOD" value="true" /> | ||||
|       <option name="CLASS" value="true" /> | ||||
|       <option name="PARAMETER" value="true" /> | ||||
|       <option name="REPORT_PARAMETER_FOR_PUBLIC_METHODS" value="true" /> | ||||
|       <option name="ADD_MAINS_TO_ENTRIES" value="true" /> | ||||
|       <option name="ADD_APPLET_TO_ENTRIES" value="true" /> | ||||
|       <option name="ADD_SERVLET_TO_ENTRIES" value="true" /> | ||||
|       <option name="ADD_NONJAVA_TO_ENTRIES" value="true" /> | ||||
|     </inspection_tool> | ||||
|   </profile> | ||||
| </component> | ||||
							
								
								
									
										2
									
								
								.idea/scopes/Copyright.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/scopes/Copyright.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,3 +1,3 @@ | ||||
| <component name="DependencyValidationManager"> | ||||
|   <scope name="Copyright" pattern="(file[IdeaVIM.main]:*/||file[IdeaVIM.test]:*/)&&!file[IdeaVIM.main]:resources//*" /> | ||||
|   <scope name="Copyright" pattern="file:*/&&!file:.github//*&&!file:.idea//*&&!file:.teamcity//*&&!file:assets//*&&!file:config//*&&!file:doc//*&&!file:gradle//*&&!file:gradlew&&!file:gradlew.bat&&!file:src/main/resources//*&&!file:antlr//*&&!file:java/com/maddyhome/idea/vim/regexp/RegExp.kt" /> | ||||
| </component> | ||||
							
								
								
									
										16
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="IssueNavigationConfiguration"> | ||||
|     <option name="links"> | ||||
|       <list> | ||||
|         <IssueNavigationLink> | ||||
|           <option name="issueRegexp" value="[A-Z]+\-\d+" /> | ||||
|           <option name="linkRegexp" value="https://youtrack.jetbrains.com/issue/$0" /> | ||||
|         </IssueNavigationLink> | ||||
|       </list> | ||||
|     </option> | ||||
|   </component> | ||||
|   <component name="VcsDirectoryMappings"> | ||||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										4
									
								
								.teamcity/_Self/Constants.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.teamcity/_Self/Constants.kt
									
									
									
									
										vendored
									
									
								
							| @@ -5,8 +5,8 @@ object Constants { | ||||
|   const val EAP_CHANNEL = "eap" | ||||
|   const val DEV_CHANNEL = "Dev" | ||||
|  | ||||
|   const val VERSION = "1.11.1" | ||||
|   const val DEV_VERSION = "1.12.0" | ||||
|   const val VERSION = "2.0.0" | ||||
|   const val DEV_VERSION = "2.1.0" | ||||
|  | ||||
|   const val GITHUB_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val NVIM_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   | ||||
							
								
								
									
										12
									
								
								.teamcity/_Self/Project.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.teamcity/_Self/Project.kt
									
									
									
									
										vendored
									
									
								
							| @@ -11,15 +11,7 @@ import _Self.buildTypes.TestsForIntelliJEAP | ||||
| import _Self.subprojects.GitHub | ||||
| import _Self.subprojects.OldTests | ||||
| import _Self.subprojects.Releases | ||||
| import _Self.vcsRoots.Branch_181 | ||||
| import _Self.vcsRoots.Branch_183 | ||||
| import _Self.vcsRoots.Branch_191_193 | ||||
| import _Self.vcsRoots.Branch_201 | ||||
| import _Self.vcsRoots.Branch_202 | ||||
| import _Self.vcsRoots.Branch_203_212 | ||||
| import _Self.vcsRoots.Branch_213_221 | ||||
| import _Self.vcsRoots.Branch_Release | ||||
| import _Self.vcsRoots.GitHubPullRequest | ||||
| import _Self.vcsRoots.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.Project | ||||
|  | ||||
| object Project : Project({ | ||||
| @@ -35,12 +27,12 @@ object Project : Project({ | ||||
|   vcsRoot(Branch_202) | ||||
|   vcsRoot(Branch_203_212) | ||||
|   vcsRoot(Branch_213_221) | ||||
|   vcsRoot(Branch_222) | ||||
|   vcsRoot(Branch_Release) | ||||
|   vcsRoot(GitHubPullRequest) | ||||
|  | ||||
|   // Builds | ||||
|   buildType(TestsForIntelliJEAP) | ||||
|   buildType(TestsForIntelliJ20222) | ||||
|  | ||||
|   buildType(PropertyBased) | ||||
|   buildType(LongRunning) | ||||
|   | ||||
							
								
								
									
										1
									
								
								.teamcity/_Self/buildTypes/ActiveTests.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.teamcity/_Self/buildTypes/ActiveTests.kt
									
									
									
									
										vendored
									
									
								
							| @@ -55,4 +55,3 @@ sealed class ActiveTests(buildName: String, ijVersion: String) : BuildType({ | ||||
| }) | ||||
|  | ||||
| object TestsForIntelliJEAP : ActiveTests("Tests for IntelliJ Latest EAP", "LATEST-EAP-SNAPSHOT") | ||||
| object TestsForIntelliJ20222 : ActiveTests("Tests for IntelliJ 2022.2", "2022.2.1") | ||||
|   | ||||
							
								
								
									
										57
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs | ||||
|  | ||||
| sealed class TestsForIntelliJ_222_branch(private val version: String) : BuildType({ | ||||
|   name = "Tests for IntelliJ $version" | ||||
|  | ||||
|   params { | ||||
|     param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false") | ||||
|     param("env.ORG_GRADLE_PROJECT_legacyNoJavaPlugin", "true") | ||||
|     param("env.ORG_GRADLE_PROJECT_ideaVersion", "IC-$version") | ||||
|     param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false") | ||||
|   } | ||||
|  | ||||
|   vcs { | ||||
|     root(_Self.vcsRoots.Branch_222) | ||||
|  | ||||
|     checkoutMode = CheckoutMode.AUTO | ||||
|   } | ||||
|  | ||||
|   steps { | ||||
|     gradle { | ||||
|       tasks = "clean test" | ||||
|       buildFile = "" | ||||
|       enableStacktrace = true | ||||
|       param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   triggers { | ||||
|     vcs { | ||||
|       branchFilter = "" | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   failureConditions { | ||||
|     failOnMetricChange { | ||||
|       metric = BuildFailureOnMetric.MetricType.TEST_COUNT | ||||
|       threshold = 20 | ||||
|       units = BuildFailureOnMetric.MetricUnit.PERCENTS | ||||
|       comparison = BuildFailureOnMetric.MetricComparison.LESS | ||||
|       compareTo = build { | ||||
|         buildRule = lastSuccessful() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
|  | ||||
| object TestsForIntelliJ20222 : TestsForIntelliJ_222_branch("2022.2.3") | ||||
							
								
								
									
										2
									
								
								.teamcity/_Self/subprojects/OldTests.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.teamcity/_Self/subprojects/OldTests.kt
									
									
									
									
										vendored
									
									
								
							| @@ -12,6 +12,7 @@ import _Self.buildTypes.TestsForIntelliJ20203 | ||||
| import _Self.buildTypes.TestsForIntelliJ20211 | ||||
| import _Self.buildTypes.TestsForIntelliJ20212 | ||||
| import _Self.buildTypes.TestsForIntelliJ20213 | ||||
| import _Self.buildTypes.TestsForIntelliJ20222 | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.Project | ||||
|  | ||||
| object OldTests : Project({ | ||||
| @@ -30,4 +31,5 @@ object OldTests : Project({ | ||||
|   buildType(TestsForIntelliJ20211) | ||||
|   buildType(TestsForIntelliJ20212) | ||||
|   buildType(TestsForIntelliJ20213) | ||||
|   buildType(TestsForIntelliJ20222) | ||||
| }) | ||||
|   | ||||
							
								
								
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.vcsRoots | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||
|  | ||||
| object Branch_222 : GitVcsRoot({ | ||||
|   id("HttpsGithubComJetBrainsIdeavimBranch222") | ||||
|   name = "https://github.com/JetBrains/ideavim (branch 222)" | ||||
|   url = "https://github.com/JetBrains/ideavim.git" | ||||
|   branch = "222" | ||||
| }) | ||||
							
								
								
									
										65
									
								
								.teamcity/patches/buildTypes/IdeaVimCompatibility.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								.teamcity/patches/buildTypes/IdeaVimCompatibility.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| package patches.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.ScriptBuildStep | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script | ||||
| 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 buildType with id = 'IdeaVimCompatibility' | ||||
| accordingly, and delete the patch script. | ||||
| */ | ||||
| changeBuildType(RelativeId("IdeaVimCompatibility")) { | ||||
|     vcs { | ||||
|         remove(DslContext.settingsRoot.id!!) | ||||
|     } | ||||
|  | ||||
|     expectSteps { | ||||
|         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() | ||||
|         } | ||||
|     } | ||||
|     steps { | ||||
|         update<ScriptBuildStep>(0) { | ||||
|             name = "Load Verifier" | ||||
|             clearConditions() | ||||
|             scriptContent = """ | ||||
|                 mkdir verifier1 | ||||
|                 curl -f -L -o verifier1/verifier-cli-dev-all-1.jar "https://packages.jetbrains.team/files/p/ideavim/plugin-verifier/verifier-cli-dev-all-1.jar" | ||||
|             """.trimIndent() | ||||
|         } | ||||
|         insert(1) { | ||||
|             script { | ||||
|                 name = "Check" | ||||
|                 scriptContent = """ | ||||
|                     # We use a custom build of verifier that downloads IdeaVim from dev channel | ||||
|                     # To create a custom build: Download plugin verifier repo, add an if that switches to dev channel for IdeaVim repo | ||||
|                     # At the moment it's com.jetbrains.pluginverifier.repository.repositories.marketplace.MarketplaceRepository#getLastCompatibleVersionOfPlugin | ||||
|                     # Build using gradlew :intellij-plugin-verifier:verifier-cli:shadowJar | ||||
|                     # Upload verifier-cli-dev-all.jar artifact to the repo in IdeaVim space repo | ||||
|                      | ||||
|                     java --version | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}org.jetbrains.IdeaVim-EasyMotion' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}io.github.mishkun.ideavimsneak' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}eu.theblob42.idea.whichkey' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.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 verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}com.github.copilot' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}com.github.dankinsoid.multicursor' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}com.joshestein.ideavim-quickscope' [latest-IU] -team-city | ||||
|                 """.trimIndent() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										50
									
								
								.teamcity/patches/buildTypes/Qodana.kts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								.teamcity/patches/buildTypes/Qodana.kts
									
									
									
									
										vendored
									
									
								
							| @@ -4,6 +4,12 @@ import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.Qodana | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.qodana | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.ScheduleTrigger | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.VcsTrigger | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
|  | ||||
| /* | ||||
| @@ -41,8 +47,8 @@ changeBuildType(RelativeId("Qodana")) { | ||||
|         update<Qodana>(1) { | ||||
|             clearConditions() | ||||
|             reportAsTests = true | ||||
|             argumentsCommandDocker = "-e QODANA_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJvcmdhbml6YXRpb24iOiIzUFZrQSIsInByb2plY3QiOiIzN1FlQSIsInRva2VuIjoiM0t2bXoifQ.uohp81tM7iAfvvB6k8faarfpV-OjusAaEbWQ8iNrOgs" | ||||
|             argumentsEntryPointDocker = "--baseline qodana.sarif.json" | ||||
|             additionalDockerArguments = "-e QODANA_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJvcmdhbml6YXRpb24iOiIzUFZrQSIsInByb2plY3QiOiIzN1FlQSIsInRva2VuIjoiM0t2bXoifQ.uohp81tM7iAfvvB6k8faarfpV-OjusAaEbWQ8iNrOgs" | ||||
|             additionalQodanaArguments = "--baseline qodana.sarif.json" | ||||
|             param("clonefinder-languages", "") | ||||
|             param("collect-anonymous-statistics", "") | ||||
|             param("licenseaudit-enable", "") | ||||
| @@ -52,4 +58,44 @@ changeBuildType(RelativeId("Qodana")) { | ||||
|             param("clonefinder-reference-projects", "") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     triggers { | ||||
|         val trigger1 = find<VcsTrigger> { | ||||
|             vcs { | ||||
|                 branchFilter = "" | ||||
|             } | ||||
|         } | ||||
|         trigger1.apply { | ||||
|             enabled = false | ||||
|  | ||||
|         } | ||||
|         val trigger2 = find<ScheduleTrigger> { | ||||
|             schedule { | ||||
|                 schedulingPolicy = weekly { | ||||
|                     dayOfWeek = ScheduleTrigger.DAY.Tuesday | ||||
|                 } | ||||
|                 branchFilter = "" | ||||
|                 triggerBuild = always() | ||||
|             } | ||||
|         } | ||||
|         trigger2.apply { | ||||
|             enabled = false | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     failureConditions { | ||||
|         val feature1 = find<BuildFailureOnMetric> { | ||||
|             failOnMetricChange { | ||||
|                 metric = BuildFailureOnMetric.MetricType.QODANA_TOTAL_PROBLEMS_COUNT | ||||
|                 threshold = 0 | ||||
|                 units = BuildFailureOnMetric.MetricUnit.DEFAULT_UNIT | ||||
|                 comparison = BuildFailureOnMetric.MetricComparison.MORE | ||||
|                 compareTo = value() | ||||
|             } | ||||
|         } | ||||
|         feature1.apply { | ||||
|             param("metricKey", "QodanaProblemsNew") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										48
									
								
								.teamcity/patches/buildTypes/Release.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								.teamcity/patches/buildTypes/Release.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| package patches.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.GradleBuildStep | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| 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 buildType with id = 'Release' | ||||
| accordingly, and delete the patch script. | ||||
| */ | ||||
| changeBuildType(RelativeId("Release")) { | ||||
|     params { | ||||
|         add { | ||||
|             password("env.ORG_GRADLE_PROJECT_youtrackToken", "credentialsJSON:3cd3e867-282c-451f-b958-bc95d56a8450", display = ParameterDisplay.HIDDEN) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     expectSteps { | ||||
|         gradle { | ||||
|             tasks = "clean publishPlugin slackNotification" | ||||
|             buildFile = "" | ||||
|             enableStacktrace = true | ||||
|             param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|         } | ||||
|     } | ||||
|     steps { | ||||
|         update<GradleBuildStep>(0) { | ||||
|             clearConditions() | ||||
|             tasks = "clean publishPlugin" | ||||
|         } | ||||
|         insert(1) { | ||||
|             gradle { | ||||
|                 name = "Run Integrations" | ||||
|                 tasks = "releaseActions" | ||||
|                 param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|             } | ||||
|         } | ||||
|         insert(2) { | ||||
|             gradle { | ||||
|                 name = "Slack Notification" | ||||
|                 tasks = "slackNotification" | ||||
|                 param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										50
									
								
								.teamcity/patches/projects/_Self.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								.teamcity/patches/projects/_Self.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| 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.Project | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.amazonEC2CloudImage | ||||
| 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-0fa17ce8238eb8868") | ||||
|                 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-07c529efaddafcf86") | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								AUTHORS.md
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								AUTHORS.md
									
									
									
									
									
								
							| @@ -165,7 +165,7 @@ Contributors: | ||||
|     | ||||
|   Pavel Fatin | ||||
| * [![icon][mail]](mailto:tietyt@gmail.com) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github-off]](https://github.com/DanKaplanSES) | ||||
|     | ||||
|   tieTYT | ||||
| * [![icon][mail]](mailto:nickgieschen@gmail.com) | ||||
| @@ -185,7 +185,7 @@ Contributors: | ||||
|     | ||||
|   Vladimir Parfinenko | ||||
| * [![icon][mail]](mailto:hassmann@hwdev.de) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github-off]](https://github.com/lumie1337) | ||||
|     | ||||
|   Florian Hassmann | ||||
| * [![icon][mail]](mailto:jpalus@fastmail.com) | ||||
| @@ -193,7 +193,7 @@ Contributors: | ||||
|     | ||||
|   Jan Palus | ||||
| * [![icon][mail]](mailto:kpetrov@ripe.net) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github-off]](https://github.com/constpetrov) | ||||
|     | ||||
|   Konstantin Petrov | ||||
| * [![icon][mail]](mailto:ya-ikmik2012@yandex.ru) | ||||
| @@ -220,10 +220,6 @@ Contributors: | ||||
|   [![icon][github]](https://github.com/johngrib) | ||||
|     | ||||
|   John Grib | ||||
| * [![icon][mail]](mailto:hild@b4mad.net) | ||||
|   [![icon][github-off]](#) | ||||
|     | ||||
|   Marcel Hild | ||||
| * [![icon][mail]](mailto:vedranb@gmail.com) | ||||
|   [![icon][github]](https://github.com/vedran) | ||||
|     | ||||
| @@ -319,10 +315,6 @@ Contributors: | ||||
|   [![icon][github]](https://github.com/angelbot) | ||||
|     | ||||
|   John Weigel | ||||
| * [![icon][mail]](mailto:kevinz@weghst.com) | ||||
|   [![icon][github]](https://github.com/kevin70) | ||||
|     | ||||
|   kk | ||||
| * [![icon][mail]](mailto:runforprogram@163.com) | ||||
|   [![icon][github]](https://github.com/runforprogram) | ||||
|     | ||||
| @@ -455,6 +447,26 @@ Contributors: | ||||
|   [![icon][github]](https://github.com/lippfi) | ||||
|     | ||||
|   lippfi | ||||
| * [![icon][mail]](mailto:3237686+Runinho@users.noreply.github.com) | ||||
|   [![icon][github]](https://github.com/Runinho) | ||||
|     | ||||
|   Runinho | ||||
| * [![icon][mail]](mailto:me@yuhaowen.com) | ||||
|   [![icon][github]](https://github.com/adaext) | ||||
|     | ||||
|   Ada | ||||
|  | ||||
| Previous contributors: | ||||
|  | ||||
| * [![icon][mail]](mailto:hild@b4mad.net) | ||||
|   [![icon][github-off]](#) | ||||
|     | ||||
|   Marcel Hild | ||||
| * [![icon][mail]](mailto:kevinz@weghst.com) | ||||
|   [![icon][github]](https://github.com/kevin70) | ||||
|     | ||||
|   kk | ||||
|  | ||||
|                          | ||||
| If you are a contributor and your name is not listed here, feel free to | ||||
| contact the maintainers. | ||||
|   | ||||
							
								
								
									
										24
									
								
								CHANGES.md
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								CHANGES.md
									
									
									
									
									
								
							| @@ -25,6 +25,26 @@ usual beta standards. | ||||
|  | ||||
| ## To Be Released | ||||
|  | ||||
| ### Fixes: | ||||
| * [VIM-2797](https://youtrack.jetbrains.com/issue/VIM-2797) Introduce variable to mute default argtextobj mappings | ||||
| * [VIM-758](https://youtrack.jetbrains.com/issue/VIM-758) Support d mappings | ||||
| * [VIM-2577](https://youtrack.jetbrains.com/issue/VIM-2577) Fix paste at the end of notebook cell | ||||
| * [VIM-2813](https://youtrack.jetbrains.com/issue/VIM-2813) Migrate update checker to VimStandalonePluginUpdateChecker | ||||
|  | ||||
| ### Merged PRs: | ||||
| * [558](https://github.com/JetBrains/ideavim/pull/558) by [Matt Ellis](https://github.com/citizenmatt): Fix incorrect normalising for trailing inlay | ||||
| * [554](https://github.com/JetBrains/ideavim/pull/554) by [Matt Ellis](https://github.com/citizenmatt): Refactor "last column" calculations | ||||
| * [553](https://github.com/JetBrains/ideavim/pull/553) by [Matt Ellis](https://github.com/citizenmatt): Rearrange and rename some code in engine | ||||
| * [560](https://github.com/JetBrains/ideavim/pull/560) by [Runinho](https://github.com/Runinho): Fix(VIM-2577) paste not working at end of notebook cell | ||||
| * [571](https://github.com/JetBrains/ideavim/pull/571) by [Ada](https://github.com/adaext): Remove the redundant quotation mark at the end of "packadd matchit" command | ||||
|  | ||||
| ## 2.0.0, 2022-11-01 | ||||
|  | ||||
| ### Changes: | ||||
| * IdeaVim changes license from GPL-2.0 or later to MIT. [VIM-2782](https://youtrack.jetbrains.com/issue/VIM-2782) | ||||
|  | ||||
| ## 1.12.0, 2022-11-01 | ||||
|  | ||||
| ### Fixes: | ||||
| * [VIM-1758](https://youtrack.jetbrains.com/issue/VIM-1758) Commentary plugin in rider | ||||
| * [VIM-1903](https://youtrack.jetbrains.com/issue/VIM-1903) Autoindent now works in rider | ||||
| @@ -33,6 +53,10 @@ usual beta standards. | ||||
| * [VIM-2718](https://youtrack.jetbrains.com/issue/VIM-2718) Fixed case where the primary caret was changed | ||||
| * [VIM-2766](https://youtrack.jetbrains.com/issue/VIM-2766) Move NERDTree update to background thread | ||||
| * [VIM-2768](https://youtrack.jetbrains.com/issue/VIM-2768) Refactor listeners | ||||
| * [VIM-2776](https://youtrack.jetbrains.com/issue/VIM-2776) Use filename index for file search | ||||
|  | ||||
| ### Merged PRs: | ||||
| * [550](https://github.com/JetBrains/ideavim/pull/550) by [Matt Ellis](https://github.com/citizenmatt): Fix(VIM-2778) Remove override of editor scroll setting | ||||
|  | ||||
| ## 1.11.0, 2022-08-09 | ||||
|  | ||||
|   | ||||
							
								
								
									
										352
									
								
								LICENSE.txt
									
									
									
									
									
								
							
							
						
						
									
										352
									
								
								LICENSE.txt
									
									
									
									
									
								
							| @@ -1,339 +1,21 @@ | ||||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|                        Version 2, June 1991 | ||||
| MIT License | ||||
|  | ||||
|  Copyright (C) 1989, 1991 Free Software Foundation, Inc., | ||||
|  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
| Copyright (c) 2003-present The IdeaVim authors | ||||
|  | ||||
|                             Preamble | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| License is intended to guarantee your freedom to share and change free | ||||
| software--to make sure the software is free for all its users.  This | ||||
| General Public License applies to most of the Free Software | ||||
| Foundation's software and to any other program whose authors commit to | ||||
| using it.  (Some other Free Software Foundation software is covered by | ||||
| the GNU Lesser General Public License instead.)  You can apply it to | ||||
| your programs, too. | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| this service if you wish), that you receive source code or can get it | ||||
| if you want it, that you can change the software or use pieces of it | ||||
| in new free programs; and that you know you can do these things. | ||||
|  | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| anyone to deny you these rights or to ask you to surrender the rights. | ||||
| These restrictions translate to certain responsibilities for you if you | ||||
| distribute copies of the software, or if you modify it. | ||||
|  | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must give the recipients all the rights that | ||||
| you have.  You must make sure that they, too, receive or can get the | ||||
| source code.  And you must show them these terms so they know their | ||||
| rights. | ||||
|  | ||||
|   We protect your rights with two steps: (1) copyright the software, and | ||||
| (2) offer you this license which gives you legal permission to copy, | ||||
| distribute and/or modify the software. | ||||
|  | ||||
|   Also, for each author's protection and ours, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| software.  If the software is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original, so | ||||
| that any problems introduced by others will not reflect on the original | ||||
| authors' reputations. | ||||
|  | ||||
|   Finally, any free program is threatened constantly by software | ||||
| patents.  We wish to avoid the danger that redistributors of a free | ||||
| program will individually obtain patent licenses, in effect making the | ||||
| program proprietary.  To prevent this, we have made it clear that any | ||||
| patent must be licensed for everyone's free use or not licensed at all. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
|   0. This License applies to any program or other work which contains | ||||
| a notice placed by the copyright holder saying it may be distributed | ||||
| under the terms of this General Public License.  The "Program", below, | ||||
| refers to any such program or work, and a "work based on the Program" | ||||
| means either the Program or any derivative work under copyright law: | ||||
| that is to say, a work containing the Program or a portion of it, | ||||
| either verbatim or with modifications and/or translated into another | ||||
| language.  (Hereinafter, translation is included without limitation in | ||||
| the term "modification".)  Each licensee is addressed as "you". | ||||
|  | ||||
| Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running the Program is not restricted, and the output from the Program | ||||
| is covered only if its contents constitute a work based on the | ||||
| Program (independent of having been made by running the Program). | ||||
| Whether that is true depends on what the Program does. | ||||
|  | ||||
|   1. You may copy and distribute verbatim copies of the Program's | ||||
| source code as you receive it, in any medium, provided that you | ||||
| conspicuously and appropriately publish on each copy an appropriate | ||||
| copyright notice and disclaimer of warranty; keep intact all the | ||||
| notices that refer to this License and to the absence of any warranty; | ||||
| and give any other recipients of the Program a copy of this License | ||||
| along with the Program. | ||||
|  | ||||
| You may charge a fee for the physical act of transferring a copy, and | ||||
| you may at your option offer warranty protection in exchange for a fee. | ||||
|  | ||||
|   2. You may modify your copy or copies of the Program or any portion | ||||
| of it, thus forming a work based on the Program, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) You must cause the modified files to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
|  | ||||
|     b) You must cause any work that you distribute or publish, that in | ||||
|     whole or in part contains or is derived from the Program or any | ||||
|     part thereof, to be licensed as a whole at no charge to all third | ||||
|     parties under the terms of this License. | ||||
|  | ||||
|     c) If the modified program normally reads commands interactively | ||||
|     when run, you must cause it, when started running for such | ||||
|     interactive use in the most ordinary way, to print or display an | ||||
|     announcement including an appropriate copyright notice and a | ||||
|     notice that there is no warranty (or else, saying that you provide | ||||
|     a warranty) and that users may redistribute the program under | ||||
|     these conditions, and telling the user how to view a copy of this | ||||
|     License.  (Exception: if the Program itself is interactive but | ||||
|     does not normally print such an announcement, your work based on | ||||
|     the Program is not required to print an announcement.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Program, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Program, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote it. | ||||
|  | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Program. | ||||
|  | ||||
| In addition, mere aggregation of another work not based on the Program | ||||
| with the Program (or with a work based on the Program) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
|  | ||||
|   3. You may copy and distribute the Program (or a work based on it, | ||||
| under Section 2) in object code or executable form under the terms of | ||||
| Sections 1 and 2 above provided that you also do one of the following: | ||||
|  | ||||
|     a) Accompany it with the complete corresponding machine-readable | ||||
|     source code, which must be distributed under the terms of Sections | ||||
|     1 and 2 above on a medium customarily used for software interchange; or, | ||||
|  | ||||
|     b) Accompany it with a written offer, valid for at least three | ||||
|     years, to give any third party, for a charge no more than your | ||||
|     cost of physically performing source distribution, a complete | ||||
|     machine-readable copy of the corresponding source code, to be | ||||
|     distributed under the terms of Sections 1 and 2 above on a medium | ||||
|     customarily used for software interchange; or, | ||||
|  | ||||
|     c) Accompany it with the information you received as to the offer | ||||
|     to distribute corresponding source code.  (This alternative is | ||||
|     allowed only for noncommercial distribution and only if you | ||||
|     received the program in object code or executable form with such | ||||
|     an offer, in accord with Subsection b above.) | ||||
|  | ||||
| The source code for a work means the preferred form of the work for | ||||
| making modifications to it.  For an executable work, complete source | ||||
| code means all the source code for all modules it contains, plus any | ||||
| associated interface definition files, plus the scripts used to | ||||
| control compilation and installation of the executable.  However, as a | ||||
| special exception, the source code distributed need not include | ||||
| anything that is normally distributed (in either source or binary | ||||
| form) with the major components (compiler, kernel, and so on) of the | ||||
| operating system on which the executable runs, unless that component | ||||
| itself accompanies the executable. | ||||
|  | ||||
| If distribution of executable or object code is made by offering | ||||
| access to copy from a designated place, then offering equivalent | ||||
| access to copy the source code from the same place counts as | ||||
| distribution of the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   4. You may not copy, modify, sublicense, or distribute the Program | ||||
| except as expressly provided under this License.  Any attempt | ||||
| otherwise to copy, modify, sublicense or distribute the Program is | ||||
| void, and will automatically terminate your rights under this License. | ||||
| However, parties who have received copies, or rights, from you under | ||||
| this License will not have their licenses terminated so long as such | ||||
| parties remain in full compliance. | ||||
|  | ||||
|   5. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Program or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Program (or any work based on the | ||||
| Program), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Program or works based on it. | ||||
|  | ||||
|   6. Each time you redistribute the Program (or any work based on the | ||||
| Program), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute or modify the Program subject to | ||||
| these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties to | ||||
| this License. | ||||
|  | ||||
|   7. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Program at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Program by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Program. | ||||
|  | ||||
| If any portion of this section is held invalid or unenforceable under | ||||
| any particular circumstance, the balance of the section is intended to | ||||
| apply and the section as a whole is intended to apply in other | ||||
| circumstances. | ||||
|  | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system, which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
|  | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   8. If the distribution and/or use of the Program is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Program under this License | ||||
| may add an explicit geographical distribution limitation excluding | ||||
| those countries, so that distribution is permitted only in or among | ||||
| countries not thus excluded.  In such case, this License incorporates | ||||
| the limitation as if written in the body of this License. | ||||
|  | ||||
|   9. The Free Software Foundation may publish revised and/or new versions | ||||
| of the General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
| Each version is given a distinguishing version number.  If the Program | ||||
| specifies a version number of this License which applies to it and "any | ||||
| later version", you have the option of following the terms and conditions | ||||
| either of that version or of any later version published by the Free | ||||
| Software Foundation.  If the Program does not specify a version number of | ||||
| this License, you may choose any version ever published by the Free Software | ||||
| Foundation. | ||||
|  | ||||
|   10. If you wish to incorporate parts of the Program into other free | ||||
| programs whose distribution conditions are different, write to the author | ||||
| to ask for permission.  For software which is copyrighted by the Free | ||||
| Software Foundation, write to the Free Software Foundation; we sometimes | ||||
| make exceptions for this.  Our decision will be guided by the two goals | ||||
| of preserving the free status of all derivatives of our free software and | ||||
| of promoting the sharing and reuse of software generally. | ||||
|  | ||||
|                             NO WARRANTY | ||||
|  | ||||
|   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||
| REPAIR OR CORRECTION. | ||||
|  | ||||
|   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGES. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| convey the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     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, write to the Free Software Foundation, Inc., | ||||
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
| If the program is interactive, make it output a short notice like this | ||||
| when it starts in an interactive mode: | ||||
|  | ||||
|     Gnomovision version 69, Copyright (C) year name of author | ||||
|     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
|  | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, the commands you use may | ||||
| be called something other than `show w' and `show c'; they could even be | ||||
| mouse-clicks or menu items--whatever suits your program. | ||||
|  | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the program, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
|  | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||
|   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||
|  | ||||
|   <signature of Ty Coon>, 1 April 1989 | ||||
|   Ty Coon, President of Vice | ||||
|  | ||||
| This General Public License does not permit incorporating your program into | ||||
| proprietary programs.  If your program is a subroutine library, you may | ||||
| consider it more useful to permit linking proprietary applications with the | ||||
| library.  If this is what you want to do, use the GNU Lesser General | ||||
| Public License instead of this License. | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|   | ||||
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							| @@ -9,6 +9,7 @@ IdeaVim | ||||
| [![Rating][plugin-rating-svg]][plugin-repo] | ||||
| [![Version][plugin-version-svg]][plugin-repo] | ||||
| [![Gitter][gitter-svg]][gitter] | ||||
| [](https://codecov.io/gh/JetBrains/ideavim) | ||||
| [![Twitter][twitter-svg]][twitter] | ||||
|  | ||||
| IdeaVim is a Vim engine for JetBrains IDEs. | ||||
| @@ -364,8 +365,13 @@ is the full list of synonyms. | ||||
| License | ||||
| ------- | ||||
|  | ||||
| IdeaVim is licensed under the terms of the GNU Public License version 2 | ||||
| or any later version. | ||||
| IdeaVim is licensed under the MIT license. | ||||
|  | ||||
| Third-party components and licenses are listed in [ThirdPartyLicenses.md](ThirdPartyLicenses.md). | ||||
|  | ||||
| All releases before 2.0.0 were licensed under terms of GPL-2.0 or later. | ||||
| The last commit before switch to MIT is 05852b07c6090ad40fde7d3cafe0b074604f7ac5. | ||||
| You can read more about the license change here: https://github.com/JetBrains/ideavim/discussions/543 | ||||
|  | ||||
|  | ||||
| <!-- Badges --> | ||||
|   | ||||
							
								
								
									
										84
									
								
								ThirdPartyLicenses.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								ThirdPartyLicenses.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| IdeaVim project is licensed under MIT license except the following parts of it: | ||||
|  | ||||
| File [RegExp.kt](src/main/java/com/maddyhome/idea/vim/regexp/RegExp.kt) is licensed under Vim License. | ||||
|  | ||||
| ``` | ||||
| VIM LICENSE | ||||
|  | ||||
| I)  There are no restrictions on distributing unmodified copies of Vim except | ||||
|     that they must include this license text.  You can also distribute | ||||
|     unmodified parts of Vim, likewise unrestricted except that they must | ||||
|     include this license text.  You are also allowed to include executables | ||||
|     that you made from the unmodified Vim sources, plus your own usage | ||||
|     examples and Vim scripts. | ||||
|  | ||||
| II) It is allowed to distribute a modified (or extended) version of Vim, | ||||
|     including executables and/or source code, when the following four | ||||
|     conditions are met: | ||||
|     1) This license text must be included unmodified. | ||||
|     2) The modified Vim must be distributed in one of the following five ways: | ||||
|        a) If you make changes to Vim yourself, you must clearly describe in | ||||
|           the distribution how to contact you.  When the maintainer asks you | ||||
|           (in any way) for a copy of the modified Vim you distributed, you | ||||
|           must make your changes, including source code, available to the | ||||
|           maintainer without fee.  The maintainer reserves the right to | ||||
|           include your changes in the official version of Vim.  What the | ||||
|           maintainer will do with your changes and under what license they | ||||
|           will be distributed is negotiable.  If there has been no negotiation | ||||
|           then this license, or a later version, also applies to your changes. | ||||
|           The current maintainer is Bram Moolenaar <Bram@vim.org>.  If this | ||||
|           changes it will be announced in appropriate places (most likely | ||||
|           vim.sf.net, www.vim.org and/or comp.editors). When it is completely | ||||
|           impossible to contact the maintainer, the obligation to send him | ||||
|           your changes ceases.  Once the maintainer has confirmed that he has | ||||
|           received your changes they will not have to be sent again. | ||||
|        b) If you have received a modified Vim that was distributed as | ||||
|           mentioned under a) you are allowed to further distribute it | ||||
|           unmodified, as mentioned at I).  If you make additional changes the | ||||
|           text under a) applies to those changes. | ||||
|        c) Provide all the changes, including source code, with every copy of | ||||
|           the modified Vim you distribute.  This may be done in the form of a | ||||
|           context diff.  You can choose what license to use for new code you | ||||
|           add.  The changes and their license must not restrict others from | ||||
|           making their own changes to the official version of Vim. | ||||
|        d) When you have a modified Vim which includes changes as mentioned | ||||
|           under c), you can distribute it without the source code for the | ||||
|           changes if the following three conditions are met: | ||||
|           - The license that applies to the changes permits you to distribute | ||||
|             the changes to the Vim maintainer without fee or restriction, and | ||||
|             permits the Vim maintainer to include the changes in the official | ||||
|             version of Vim without fee or restriction. | ||||
|           - You keep the changes for at least three years after last | ||||
|             distributing the corresponding modified Vim.  When the maintainer | ||||
|             or someone who you distributed the modified Vim to asks you (in | ||||
|             any way) for the changes within this period, you must make them | ||||
|             available to him. | ||||
|           - You clearly describe in the distribution how to contact you.  This | ||||
|             contact information must remain valid for at least three years | ||||
|             after last distributing the corresponding modified Vim, or as long | ||||
|             as possible. | ||||
|        e) When the GNU General Public License (GPL) applies to the changes, | ||||
|           you can distribute the modified Vim under the GNU GPL version 2 or | ||||
|           any later version. | ||||
|     3) A message must be added, at least in the output of the ":version" | ||||
|        command and in the intro screen, such that the user of the modified Vim | ||||
|        is able to see that it was modified.  When distributing as mentioned | ||||
|        under 2)e) adding the message is only required for as far as this does | ||||
|        not conflict with the license used for the changes. | ||||
|     4) The contact information as required under 2)a) and 2)d) must not be | ||||
|        removed or changed, except that the person himself can make | ||||
|        corrections. | ||||
|  | ||||
| III) If you distribute a modified version of Vim, you are encouraged to use | ||||
|      the Vim license for your changes and make them available to the | ||||
|      maintainer, including the source code.  The preferred way to do this is | ||||
|      by e-mail or by uploading the files to a server and e-mailing the URL. | ||||
|      If the number of changes is small (e.g., a modified Makefile) e-mailing a | ||||
|      context diff will do.  The e-mail address to be used is | ||||
|      <maintainer@vim.org> | ||||
|  | ||||
| IV)  It is not allowed to remove this license from the distribution of the Vim | ||||
|      sources, parts of it or from a modified version.  You may use this | ||||
|      license for previous Vim releases instead of the license that they came | ||||
|      with, at your option. | ||||
| ``` | ||||
							
								
								
									
										380
									
								
								build.gradle.kts
									
									
									
									
									
								
							
							
						
						
									
										380
									
								
								build.gradle.kts
									
									
									
									
									
								
							| @@ -1,5 +1,35 @@ | ||||
| /* | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| import dev.feedforward.markdownto.DownParser | ||||
| import io.ktor.client.* | ||||
| import io.ktor.client.call.* | ||||
| import io.ktor.client.engine.cio.* | ||||
| import io.ktor.client.plugins.auth.* | ||||
| import io.ktor.client.plugins.auth.providers.* | ||||
| import io.ktor.client.plugins.contentnegotiation.* | ||||
| import io.ktor.client.request.* | ||||
| import io.ktor.http.* | ||||
| import io.ktor.serialization.kotlinx.json.* | ||||
| import kotlinx.coroutines.runBlocking | ||||
| import kotlinx.serialization.json.Json | ||||
| import kotlinx.serialization.json.JsonArray | ||||
| import kotlinx.serialization.json.JsonObject | ||||
| import kotlinx.serialization.json.addJsonObject | ||||
| import kotlinx.serialization.json.buildJsonObject | ||||
| import kotlinx.serialization.json.jsonArray | ||||
| import kotlinx.serialization.json.jsonObject | ||||
| import kotlinx.serialization.json.jsonPrimitive | ||||
| import kotlinx.serialization.json.put | ||||
| import kotlinx.serialization.json.putJsonArray | ||||
| import kotlinx.serialization.json.putJsonObject | ||||
| import org.eclipse.jgit.api.Git | ||||
| import org.eclipse.jgit.lib.RepositoryBuilder | ||||
| import org.intellij.markdown.ast.getTextInNode | ||||
| import java.net.HttpURLConnection | ||||
| import java.net.URL | ||||
| @@ -11,11 +41,17 @@ buildscript { | ||||
|     } | ||||
|  | ||||
|     dependencies { | ||||
|         classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21") | ||||
|         classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20") | ||||
|         classpath("com.github.AlexPl292:mark-down-to-slack:1.1.2") | ||||
|         classpath("org.eclipse.jgit:org.eclipse.jgit:6.1.0.202203080745-r") | ||||
|         classpath("org.kohsuke:github-api:1.305") | ||||
|  | ||||
|         classpath("io.ktor:ktor-client-core:2.1.3") | ||||
|         classpath("io.ktor:ktor-client-cio:2.1.3") | ||||
|         classpath("io.ktor:ktor-client-auth:2.1.3") | ||||
|         classpath("io.ktor:ktor-client-content-negotiation:2.1.3") | ||||
|         classpath("io.ktor:ktor-serialization-kotlinx-json:2.1.3") | ||||
|  | ||||
|         // This comes from the changelog plugin | ||||
| //        classpath("org.jetbrains:markdown:0.3.1") | ||||
|     } | ||||
| @@ -24,13 +60,16 @@ buildscript { | ||||
| plugins { | ||||
|     antlr | ||||
|     java | ||||
|     kotlin("jvm") version "1.6.21" | ||||
|     kotlin("jvm") version "1.7.20" | ||||
|  | ||||
|     id("org.jetbrains.intellij") version "1.10.0-SNAPSHOT" | ||||
|     id("org.jetbrains.intellij") version "1.11.1-SNAPSHOT" | ||||
|     id("org.jetbrains.changelog") version "1.3.1" | ||||
|  | ||||
|     // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle | ||||
|     id("org.jlleitschuh.gradle.ktlint") version "10.3.0" | ||||
|  | ||||
|     id("org.jetbrains.kotlinx.kover") version "0.6.1" | ||||
|     id("com.dorongold.task-tree") version "2.1.0" | ||||
| } | ||||
|  | ||||
| // Import variables from gradle.properties file | ||||
| @@ -46,6 +85,7 @@ val publishChannels: String by project | ||||
| val publishToken: String by project | ||||
|  | ||||
| val slackUrl: String by project | ||||
| val youtrackToken: String by project | ||||
|  | ||||
| repositories { | ||||
|     mavenCentral() | ||||
| @@ -174,7 +214,7 @@ java { | ||||
|  | ||||
| kotlin { | ||||
|     jvmToolchain { | ||||
|         (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(javaVersion)) | ||||
|         languageVersion.set(JavaLanguageVersion.of(javaVersion)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -232,9 +272,13 @@ tasks { | ||||
|     named("compileKotlin") { | ||||
|         dependsOn("generateGrammarSource") | ||||
|     } | ||||
|     named("compileTestKotlin") { | ||||
|         dependsOn("generateTestGrammarSource") | ||||
|     } | ||||
|  | ||||
|     // Add plugin open API sources to the plugin ZIP | ||||
|     val createOpenApiSourceJar by registering(Jar::class) { | ||||
|         dependsOn("generateGrammarSource") | ||||
|         // Java sources | ||||
|         from(sourceSets.main.get().java) { | ||||
|             include("**/com/maddyhome/idea/vim/**/*.java") | ||||
| @@ -254,7 +298,7 @@ tasks { | ||||
|  | ||||
|     // Don't forget to update plugin.xml | ||||
|     patchPluginXml { | ||||
|         sinceBuild.set("222") | ||||
|         sinceBuild.set("223.7401.7") | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -300,6 +344,22 @@ tasks.register("getUnreleasedChangelog") { | ||||
|     } | ||||
| } | ||||
|  | ||||
| // --- Kover | ||||
|  | ||||
| koverMerged { | ||||
|     enable() | ||||
| } | ||||
|  | ||||
| kover { | ||||
|     instrumentation { | ||||
|         // set of test tasks names to exclude from instrumentation. The results of their execution will not be presented in the report | ||||
|         excludeTasks += "testPropertyBased" | ||||
|         excludeTasks += "testLongRunning" | ||||
|         excludeTasks += "testWithNeovim" | ||||
|         excludeTasks += "testUi" | ||||
|     } | ||||
| } | ||||
|  | ||||
| // --- Slack notification | ||||
|  | ||||
| tasks.register("slackNotification") { | ||||
| @@ -364,6 +424,7 @@ tasks.register("updateAuthors") { | ||||
|             "aleksei.plate@TeamCity", | ||||
|             "alex.plate@192.168.0.109", | ||||
|             "nikita.koshcheev@TeamCity", | ||||
|             "TeamCity@TeamCity", | ||||
|         ) | ||||
|         updateAuthors(uncheckedEmails) | ||||
|     } | ||||
| @@ -388,6 +449,82 @@ tasks.register("updateChangelog") { | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("updateYoutrackOnCommit") { | ||||
|     doLast { | ||||
|         updateYoutrackOnCommit() | ||||
|     } | ||||
| } | ||||
|  | ||||
| val vimProjectId = "22-43" | ||||
| val fixVersionsFieldId = "123-285" | ||||
| val fixVersionsFieldType = "VersionProjectCustomField" | ||||
| val fixVersionsElementType = "VersionBundleElement" | ||||
|  | ||||
| tasks.register("releaseActions") { | ||||
|     group = "other" | ||||
|     doLast { | ||||
|         val tickets = getYoutrackTicketsByQuery("%23%7BReady+To+Release%7D") | ||||
|         if (tickets.isNotEmpty()) { | ||||
|             println("Updating statuses for tickets: $tickets") | ||||
|             setYoutrackStatus(tickets, "Fixed") | ||||
|             if (!checkReleaseVersionExists(version.toString())) { | ||||
|                 addReleaseToYoutrack(version.toString()) | ||||
|             } else { | ||||
|                 println("Version $version is already exists in YouTrack") | ||||
|             } | ||||
|             setYoutrackFixVersion(tickets, version.toString()) | ||||
|         } else { | ||||
|             println("No tickets to update statuses") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("integrationsTest") { | ||||
|     group = "other" | ||||
|     doLast { | ||||
|         val testTicketId = "VIM-2784" | ||||
|  | ||||
|         // YouTrack set to Ready To Release on Fix commit | ||||
|         setYoutrackStatus(listOf(testTicketId), "Ready To Release") | ||||
|         if ("Ready To Release" != getYoutrackStatus(testTicketId)) { | ||||
|             error("Ticket status was not updated") | ||||
|         } | ||||
|         setYoutrackStatus(listOf(testTicketId), "Open") | ||||
|  | ||||
|         // Check YouTrack requests | ||||
|         val prevStatus = getYoutrackStatus(testTicketId) | ||||
|         setYoutrackStatus(listOf(testTicketId), "Ready To Release") | ||||
|         val tickets = getYoutrackTicketsByQuery("%23%7BReady+To+Release%7D") | ||||
|         if (testTicketId !in tickets) { | ||||
|             error("Test ticket is not found in request") | ||||
|         } | ||||
|         setYoutrackStatus(listOf(testTicketId), prevStatus) | ||||
|  | ||||
|         // Check adding and removing release | ||||
|         guard(!checkReleaseVersionExists("TEST_VERSION")) { "Test version already exists" } | ||||
|         val versionId = addReleaseToYoutrack("TEST_VERSION") | ||||
|         guard(checkReleaseVersionExists("TEST_VERSION")) { "Test version isn't created" } | ||||
|         setYoutrackStatus(listOf(testTicketId), "Fixed") | ||||
|         setYoutrackFixVersion(listOf(testTicketId), "TEST_VERSION") | ||||
|         deleteVersionById(versionId) | ||||
|         setYoutrackStatus(listOf(testTicketId), "Open") | ||||
|         guard(!checkReleaseVersionExists("TEST_VERSION")) { "Test version isn't deleted" } | ||||
|  | ||||
|         updateMergedPr(525) | ||||
|         // TODO: test Ticket parsing | ||||
|         // TODO: test Update CHANGES | ||||
|         // TODO: test Update AUTHORS | ||||
|         // TODO: test Slack notification | ||||
|         // TODO: Add a comment on EAP release | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun guard(check: Boolean, ifWrong: () -> String) { | ||||
|     if (!check) { | ||||
|         error(ifWrong()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("testUpdateChangelog") { | ||||
|     group = "verification" | ||||
|     description = "This is a task to manually assert the correctness of the update tasks" | ||||
| @@ -404,37 +541,152 @@ tasks.register("testUpdateChangelog") { | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun addReleaseToYoutrack(name: String): String { | ||||
|     val client = httpClient() | ||||
|     println("Creating new release version in YouTrack: $name") | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.post("https://youtrack.jetbrains.com/api/admin/projects/$vimProjectId/customFields/$fixVersionsFieldId/bundle/values?fields=id,name") { | ||||
|             contentType(ContentType.Application.Json) | ||||
|             accept(ContentType.Application.Json) | ||||
|             val request = buildJsonObject { | ||||
|                 put("name", name) | ||||
|                 put("\$type", fixVersionsElementType) | ||||
|             } | ||||
|             setBody(request) | ||||
|         } | ||||
|         response.body<JsonObject>().getValue("id").jsonPrimitive.content | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun checkReleaseVersionExists(name: String): Boolean { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.get("https://youtrack.jetbrains.com/api/admin/projects/$vimProjectId/customFields/$fixVersionsFieldId/bundle/values?fields=id,name&query=$name") | ||||
|         response.body<JsonArray>().isNotEmpty() | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun deleteVersionById(id: String) { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     runBlocking { | ||||
|         client.delete("https://youtrack.jetbrains.com/api/admin/projects/$vimProjectId/customFields/$fixVersionsFieldId/bundle/values/$id") | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun updateYoutrackOnCommit() { | ||||
|     println("Start updating youtrack") | ||||
|     println(projectDir) | ||||
|  | ||||
|     val newFixes = changes() | ||||
|     val newTickets = newFixes.map { it.id } | ||||
|     println("Set new status for $newTickets") | ||||
|     setYoutrackStatus(newTickets, "Ready To Release") | ||||
| } | ||||
|  | ||||
| fun getYoutrackTicketsByQuery(query: String): Set<String> { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.get("https://youtrack.jetbrains.com/api/issues/?fields=idReadable&query=project:VIM+$query") | ||||
|         response.body<JsonArray>().mapTo(HashSet()) { it.jsonObject.getValue("idReadable").jsonPrimitive.content } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun setYoutrackStatus(tickets: Collection<String>, status: String) { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     runBlocking { | ||||
|         for (ticket in tickets) { | ||||
|             println("Try to set $ticket to $status") | ||||
|             val response = client.post("https://youtrack.jetbrains.com/api/issues/$ticket?fields=customFields(id,name,value(id,name))") { | ||||
|                 contentType(ContentType.Application.Json) | ||||
|                 accept(ContentType.Application.Json) | ||||
|                 val request = buildJsonObject { | ||||
|                     putJsonArray("customFields") { | ||||
|                         addJsonObject { | ||||
|                             put("name", "State") | ||||
|                             put("\$type", "SingleEnumIssueCustomField") | ||||
|                             putJsonObject("value") { | ||||
|                                 put("name", status) | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 setBody(request) | ||||
|             } | ||||
|             println(response) | ||||
|             println(response.body<String>()) | ||||
|             if (!response.status.isSuccess()) { | ||||
|                 error("Request failed. $ticket, ${response.body<String>()}") | ||||
|             } | ||||
|             val finalState = response.body<JsonObject>()["customFields"]!!.jsonArray | ||||
|                 .single { it.jsonObject["name"]!!.jsonPrimitive.content == "State" } | ||||
|                 .jsonObject["value"]!! | ||||
|                 .jsonObject["name"]!! | ||||
|                 .jsonPrimitive.content | ||||
|             if (finalState != status) { | ||||
|                 error("Ticket $ticket is not updated! Expected status $status, but actually $finalState") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun setYoutrackFixVersion(tickets: Collection<String>, version: String) { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     runBlocking { | ||||
|         for (ticket in tickets) { | ||||
|             println("Try to set fix version $version for $ticket") | ||||
|             val response = client.post("https://youtrack.jetbrains.com/api/issues/$ticket?fields=customFields(id,name,value(id,name))") { | ||||
|                 contentType(ContentType.Application.Json) | ||||
|                 accept(ContentType.Application.Json) | ||||
|                 val request = buildJsonObject { | ||||
|                     putJsonArray("customFields") { | ||||
|                         addJsonObject { | ||||
|                             put("name", "Fix versions") | ||||
|                             put("\$type", "MultiVersionIssueCustomField") | ||||
|                             putJsonArray("value") { | ||||
|                                 addJsonObject { put("name", version) } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 setBody(request) | ||||
|             } | ||||
|             println(response) | ||||
|             println(response.body<String>()) | ||||
|             if (!response.status.isSuccess()) { | ||||
|                 error("Request failed. $ticket, ${response.body<String>()}") | ||||
|             } | ||||
|             val finalState = response.body<JsonObject>()["customFields"]!!.jsonArray | ||||
|                 .single { it.jsonObject["name"]!!.jsonPrimitive.content == "Fix versions" } | ||||
|                 .jsonObject["value"]!! | ||||
|                 .jsonArray[0] | ||||
|                 .jsonObject["name"]!! | ||||
|                 .jsonPrimitive.content | ||||
|             if (finalState != version) { | ||||
|                 error("Ticket $ticket is not updated! Expected fix version $version, but actually $finalState") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun getYoutrackStatus(ticket: String): String { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.get("https://youtrack.jetbrains.com/api/issues/$ticket/customFields/123-129?fields=value(name)") | ||||
|         response.body<JsonObject>()["value"]!!.jsonObject.getValue("name").jsonPrimitive.content | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun updateChangelog() { | ||||
|     println("Start update authors") | ||||
|     println(projectDir) | ||||
|     val repository = org.eclipse.jgit.lib.RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = org.eclipse.jgit.api.Git(repository) | ||||
|     val lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!! | ||||
|     val messages = git.log().call() | ||||
|         .takeWhile { | ||||
|             !it.id.name.equals(lastSuccessfulCommit, ignoreCase = true) | ||||
|         } | ||||
|         .map { it.shortMessage } | ||||
|  | ||||
|     // Collect fixes | ||||
|     val newFixes = mutableListOf<Change>() | ||||
|     println("Last successful commit: $lastSuccessfulCommit") | ||||
|     println("Amount of commits: ${messages.size}") | ||||
|     println("Start emails processing") | ||||
|     for (message in messages) { | ||||
|         println("Processing '$message'...") | ||||
|         val lowercaseMessage = message.toLowerCase() | ||||
|         val regex = "^fix\\((vim-\\d+)\\):".toRegex() | ||||
|         val findResult = regex.find(lowercaseMessage) | ||||
|         if (findResult != null) { | ||||
|             println("Message matches") | ||||
|             val value = findResult.groups[1]!!.value.toUpperCase() | ||||
|             val shortMessage = message.drop(findResult.range.last + 1).trim() | ||||
|             newFixes += Change(value, shortMessage) | ||||
|         } else { | ||||
|             println("Message doesn't match") | ||||
|         } | ||||
|     } | ||||
|     val newFixes = changes() | ||||
|  | ||||
|     // Update changes file | ||||
|     val changesFile = File("$projectDir/CHANGES.md") | ||||
| @@ -460,8 +712,8 @@ fun updateChangelog() { | ||||
| fun updateAuthors(uncheckedEmails: Set<String>) { | ||||
|     println("Start update authors") | ||||
|     println(projectDir) | ||||
|     val repository = org.eclipse.jgit.lib.RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = org.eclipse.jgit.api.Git(repository) | ||||
|     val repository = RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = Git(repository) | ||||
|     val lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!! | ||||
|     val hashesAndEmailes = git.log().call() | ||||
|         .takeWhile { | ||||
| @@ -537,7 +789,9 @@ data class Author(val name: String, val url: String, val mail: String) | ||||
| data class Change(val id: String, val text: String) | ||||
|  | ||||
| fun updateMergedPr(number: Int) { | ||||
|     val gitHub = org.kohsuke.github.GitHub.connect() | ||||
|     val token = System.getenv("GITHUB_OAUTH") | ||||
|     println("Token size: ${token.length}") | ||||
|     val gitHub = org.kohsuke.github.GitHubBuilder().withOAuthToken(token).build() | ||||
|     println("Connecting to the repo...") | ||||
|     val repository = gitHub.getRepository("JetBrains/ideavim") | ||||
|     println("Getting pull requests...") | ||||
| @@ -632,3 +886,57 @@ val sections = listOf( | ||||
|     "### Fixes:", | ||||
|     "### Merged PRs:", | ||||
| ) | ||||
|  | ||||
| fun changes(): List<Change> { | ||||
|     val repository = RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = Git(repository) | ||||
|     val lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!! | ||||
|     val messages = git.log().call() | ||||
|         .takeWhile { | ||||
|             !it.id.name.equals(lastSuccessfulCommit, ignoreCase = true) | ||||
|         } | ||||
|         .map { it.shortMessage } | ||||
|  | ||||
|     // Collect fixes | ||||
|     val newFixes = mutableListOf<Change>() | ||||
|     println("Last successful commit: $lastSuccessfulCommit") | ||||
|     println("Amount of commits: ${messages.size}") | ||||
|     println("Start emails processing") | ||||
|     for (message in messages) { | ||||
|         println("Processing '$message'...") | ||||
|         val lowercaseMessage = message.toLowerCase() | ||||
|         val regex = "^fix\\((vim-\\d+)\\):".toRegex() | ||||
|         val findResult = regex.find(lowercaseMessage) | ||||
|         if (findResult != null) { | ||||
|             println("Message matches") | ||||
|             val value = findResult.groups[1]!!.value.toUpperCase() | ||||
|             val shortMessage = message.drop(findResult.range.last + 1).trim() | ||||
|             newFixes += Change(value, shortMessage) | ||||
|         } else { | ||||
|             println("Message doesn't match") | ||||
|         } | ||||
|     } | ||||
|     return newFixes | ||||
| } | ||||
|  | ||||
| fun httpClient(): HttpClient { | ||||
|     return HttpClient(CIO) { | ||||
|         expectSuccess = true | ||||
|         install(Auth) { | ||||
|             bearer { | ||||
|                 loadTokens { | ||||
|                     val accessToken = youtrackToken.ifBlank { System.getenv("YOUTRACK_TOKEN")!! } | ||||
|                     BearerTokens(accessToken, "") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         install(ContentNegotiation) { | ||||
|             json( | ||||
|                 Json { | ||||
|                     prettyPrint = true | ||||
|                     isLenient = true | ||||
|                 } | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,248 +0,0 @@ | ||||
| Emulated Vim Plugins | ||||
| -------------------- | ||||
|  | ||||
| IdeaVim extensions emulate plugins of the original Vim. In order to use | ||||
| IdeaVim extensions, you have to enable them via this command in your `~/.ideavimrc`: | ||||
|  | ||||
| ``` | ||||
| Plug '<extension-github-reference>' | ||||
| ``` | ||||
|  | ||||
| If you reuse your existing `.vimrc` file using `source ~/.vimrc`, IdeaVim can parse and enable plugins that are defined | ||||
| using [vim-plug](https://github.com/junegunn/vim-plug) or [vundle](https://github.com/VundleVim/Vundle.vim). | ||||
| No additional set commands in `~/.ideavimrc` are required.   | ||||
| If you'd like to disable some plugin that's enabled in `.vimrc`, you can use `set no<extension-name>` | ||||
| in `~/.ideavimrc`. E.g. `set nosurround`. | ||||
|  | ||||
| Available extensions: | ||||
|  | ||||
| ## easymotion | ||||
|  | ||||
| * Setup: | ||||
|     * Install [IdeaVim-EasyMotion](https://plugins.jetbrains.com/plugin/13360-ideavim-easymotion/) | ||||
|       and [AceJump](https://plugins.jetbrains.com/plugin/7086-acejump/) plugins. | ||||
|     * `Plug 'easymotion/vim-easymotion'` | ||||
|     * <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plug 'https://github.com/easymotion/vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>set easymotion</code> | ||||
|       </details> | ||||
| * Emulates [vim-easymotion](https://github.com/easymotion/vim-easymotion) | ||||
| * Commands: All commands with the mappings are supported. See the [full list of supported commands](https://github.com/AlexPl292/IdeaVim-EasyMotion#supported-commands). | ||||
|  | ||||
| ## NERDTree | ||||
| * Setup: `Plug 'preservim/nerdtree'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/preservim/nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>set NERDTree</code> | ||||
|       </details> | ||||
| * Emulates [NERDTree](https://github.com/preservim/nerdtree) | ||||
| * Commands: [[see here|NERDTree-support]] | ||||
|  | ||||
| ## surround | ||||
|  | ||||
| * Setup: `Plug 'tpope/vim-surround'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/tpope/vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=1697'</code> | ||||
|       <br/> | ||||
|       <code>set surround</code> | ||||
|       </details> | ||||
| * Emulates [vim-surround](https://github.com/tpope/vim-surround) | ||||
| * Commands: `ys`, `cs`, `ds`, `S` | ||||
|  | ||||
| ## multiple-cursors | ||||
|  | ||||
| * Setup: `Plug 'terryma/vim-multiple-cursors'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/terryma/vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>set multiple-cursors</code> | ||||
|       </details> | ||||
| * Emulates [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors) | ||||
| * Commands: `<A-n>`, `<A-x>`, `<A-p>`, `g<A-n>` | ||||
|  | ||||
| ## commentary | ||||
|  | ||||
| * Setup: `Plug 'tpope/vim-commentary'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/tpope/vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=3695'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'tomtom/tcomment_vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'tcomment_vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=1173'</code> | ||||
|       <br/> | ||||
|       <code>set commentary</code> | ||||
|       </details> | ||||
| * Emulates [commentary.vim](https://github.com/tpope/vim-commentary) | ||||
| * Commands: `gcc`, `gc + motion`, `v_gc` | ||||
| * By [Daniel Leong](https://github.com/dhleong) | ||||
|  | ||||
| ## ReplaceWithRegister | ||||
|  | ||||
| * Setup: `Plug 'vim-scripts/ReplaceWithRegister'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/vim-scripts/ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2703'</code> | ||||
|       <br/> | ||||
|       <code>set ReplaceWithRegister</code> | ||||
|       </details> | ||||
| * Emulates [ReplaceWithRegister](https://github.com/vim-scripts/ReplaceWithRegister) | ||||
| * Commands: `gr`, `grr` | ||||
| * By [igrekster](https://github.com/igrekster) | ||||
|  | ||||
| ## argtextobj | ||||
|  | ||||
| * Setup: | ||||
|     * `Plug 'vim-scripts/argtextobj.vim'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/vim-scripts/argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2699'</code> | ||||
|       <br/> | ||||
|       <code>set argtextobj</code> | ||||
|       </details> | ||||
|     * By default, only the arguments inside parenthesis are considered. To extend the functionality | ||||
|       to other types of brackets, set `g:argtextobj_pairs` variable to a comma-separated | ||||
|       list of colon-separated pairs (same as VIM's `matchpairs` option), like | ||||
|       `let g:argtextobj_pairs="(:),{:},<:>"`. The order of pairs matters when | ||||
|       handling symbols that can also be operators: `func(x << 5, 20) >> 17`. To handle | ||||
|       this syntax parenthesis, must come before angle brackets in the list. | ||||
| * Emulates [argtextobj.vim](https://www.vim.org/scripts/script.php?script_id=2699) | ||||
| * Additional text objects: `aa`, `ia` | ||||
|  | ||||
| ## exchange | ||||
|  | ||||
| * Setup: `Plug 'tommcdo/vim-exchange'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/tommcdo/vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>set exchange</code> | ||||
|       </details> | ||||
| * Emulates [vim-exchange](https://github.com/tommcdo/vim-exchange) | ||||
| * Commands: `cx`, `cxx`, `X`, `cxc` | ||||
| * By [fan-tom](https://github.com/fan-tom) | ||||
|  | ||||
| ## textobj-entire | ||||
|  | ||||
| * Setup: `Plug 'kana/vim-textobj-entire'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/kana/vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2610'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-entire</code> | ||||
|       </details> | ||||
| * Emulates [vim-textobj-entire](https://github.com/kana/vim-textobj-entire) | ||||
| * Additional text objects: `ae`, `ie` | ||||
| * By [Alexandre Grison](https://github.com/agrison) | ||||
|  | ||||
| ## highlightedyank | ||||
|  | ||||
| * Setup: | ||||
|     * `Plug 'machakann/vim-highlightedyank'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/machakann/vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>set highlightedyank</code> | ||||
|       </details> | ||||
|     * if you want to optimize highlight duration, assign a time in milliseconds:   | ||||
|       `let g:highlightedyank_highlight_duration = "1000"`   | ||||
|       A negative number makes the highlight persistent.   | ||||
|       `let g:highlightedyank_highlight_duration = "-1"` | ||||
|     * if you want to change background color of highlight you can provide the rgba of the color you want e.g.   | ||||
|       `let g:highlightedyank_highlight_color = "rgba(160, 160, 160, 155)"` | ||||
| * Emulates [vim-highlightedyank](https://github.com/machakann/vim-highlightedyank) | ||||
| * By [KostkaBrukowa](https://github.com/KostkaBrukowa) | ||||
|  | ||||
| ## vim-paragraph-motion | ||||
|  | ||||
| * Setup: `Plug 'dbakker/vim-paragraph-motion'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/dbakker/vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>set vim-paragraph-motion</code> | ||||
|       </details> | ||||
| * Emulates [vim-paragraph-motion](https://github.com/dbakker/vim-paragraph-motion) | ||||
|  | ||||
| ## vim-indent-object | ||||
|  | ||||
| * Setup: `Plug 'michaeljsmith/vim-indent-object'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/michaeljsmith/vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-indent</code> | ||||
|       </details> | ||||
| * Emulates [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object) | ||||
| * Additional text objects: `ai`, `ii`, `aI` | ||||
| * By [Shrikant Sharat Kandula](https://github.com/sharat87) | ||||
|  | ||||
| ## matchit.vim | ||||
|  | ||||
| * Setup: `packadd matchit` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'vim-matchit'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'chrisbra/matchit'</code> | ||||
|       <br/> | ||||
|       <code>set matchit</code> | ||||
|       </details> | ||||
| * Emulates [matchit.vim](https://github.com/chrisbra/matchit) | ||||
| * Currently works for HTML/XML and ruby | ||||
| * By [Martin Yzeiri](https://github.com/myzeiri) | ||||
| @@ -1,6 +1,6 @@ | ||||
| Welcome to the IdeaVim wiki! | ||||
|  | ||||
| - List of emulated plugins: [[plugins|Emulated-plugins]] | ||||
| - Examples of `ideajoin` option (also known as "smart join"): [["ideajoin" examples|"ideajoin"-examples]] | ||||
| - List of "set" commands: [["set" commands|"set"-commands]] | ||||
| - List of IdeaVim plugins: [[plugins|IdeaVim Plugins]] | ||||
| - Examples of `ideajoin` option (also known as "smart join"): [["ideajoin" examples|ideajoin-examples]] | ||||
| - List of "set" commands: [["set" commands|set-commands]] | ||||
| - Docs about "select" mode in vim: [[select mode|Select-mode]] | ||||
|   | ||||
							
								
								
									
										383
									
								
								doc/IdeaVim Plugins.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										383
									
								
								doc/IdeaVim Plugins.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,383 @@ | ||||
| IdeaVim Plugins | ||||
| -------------------- | ||||
|  | ||||
| IdeaVim plugins work like the original Vim plugins. If you want to turn of any of them, you have to enable it via this command in your `~/.ideavimrc`: | ||||
|  | ||||
| ``` | ||||
| Plug '<plugin-github-reference>' | ||||
| ``` | ||||
|  | ||||
| If you reuse your existing `.vimrc` file using `source ~/.vimrc`, IdeaVim can parse and enable plugins that are defined | ||||
| using [vim-plug](https://github.com/junegunn/vim-plug) or [vundle](https://github.com/VundleVim/Vundle.vim). | ||||
| No additional set commands in `~/.ideavimrc` are required.   | ||||
| If you'd like to disable some plugin that's enabled in `.vimrc`, you can use `set no<extension-name>` | ||||
| in `~/.ideavimrc`. E.g. `set nosurround`. | ||||
|  | ||||
| Available plugins: | ||||
|  | ||||
| <details> | ||||
| <summary><h2>easymotion</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-easymotion](https://github.com/easymotion/vim-easymotion). | ||||
|     | ||||
| ### Setup: | ||||
| - Install [IdeaVim-EasyMotion](https://plugins.jetbrains.com/plugin/13360-ideavim-easymotion/) | ||||
|       and [AceJump](https://plugins.jetbrains.com/plugin/7086-acejump/) plugins. | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'easymotion/vim-easymotion'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'easymotion/vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/easymotion/vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>set easymotion</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| All commands with the mappings are supported. See the [full list of supported commands](https://github.com/AlexPl292/IdeaVim-EasyMotion#supported-commands). | ||||
|  | ||||
| </details> | ||||
|  | ||||
|  | ||||
| <details> | ||||
| <summary><h2>sneak</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-sneak](https://github.com/justinmk/vim-sneak). | ||||
|     | ||||
| ### Setup: | ||||
| - Install [IdeaVim-sneak](https://plugins.jetbrains.com/plugin/15348-ideavim-sneak) plugin. | ||||
| - Add the following command to `~/.ideavimrc`: `set sneak` | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| See the [docs](https://github.com/Mishkun/ideavim-sneak#usage) | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>NERDTree</h2></summary> | ||||
|     | ||||
| Original plugin: [NERDTree](https://github.com/preservim/nerdtree). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'preservim/nerdtree'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'preservim/nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/preservim/nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>set NERDTree</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| [[See here|NERDTree-support]]. | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>surround</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-surround](https://github.com/tpope/vim-surround). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'tpope/vim-surround'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'tpope/vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=1697'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>set surround</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/tpope/vim-surround/blob/master/doc/surround.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>multiple-cursors</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'terryma/vim-multiple-cursors'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'terryma/vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/terryma/vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>set multiple-cursors</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/terryma/vim-multiple-cursors/blob/master/doc/multiple_cursors.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>commentary</h2></summary> | ||||
|  | ||||
| By [Daniel Leong](https://github.com/dhleong)   | ||||
| Original plugin: [commentary.vim](https://github.com/tpope/vim-commentary). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'tpope/vim-commentary'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'tpope/vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/tpope/vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'tcomment_vim'</code> | ||||
|       <br/> | ||||
|       <code>set commentary</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/tpope/vim-commentary/blob/master/doc/commentary.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>ReplaceWithRegister</h2></summary> | ||||
|     | ||||
| By [igrekster](https://github.com/igrekster)   | ||||
| Original plugin: [ReplaceWithRegister](https://github.com/vim-scripts/ReplaceWithRegister). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'vim-scripts/ReplaceWithRegister'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'vim-scripts/ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2703'</code> | ||||
|       <br/> | ||||
|       <code>set ReplaceWithRegister</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/vim-scripts/ReplaceWithRegister/blob/master/doc/ReplaceWithRegister.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>argtextobj</h2></summary> | ||||
|  | ||||
| Original plugin: [argtextobj.vim](https://www.vim.org/scripts/script.php?script_id=2699). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'vim-scripts/argtextobj.vim'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'vim-scripts/argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/vim-scripts/argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2699'</code> | ||||
|       <br/> | ||||
|       <code>set argtextobj</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| By default, only the arguments inside parenthesis are considered. To extend the functionality | ||||
|       to other types of brackets, set `g:argtextobj_pairs` variable to a comma-separated | ||||
|       list of colon-separated pairs (same as VIM's `matchpairs` option), like | ||||
|       `let g:argtextobj_pairs="(:),{:},<:>"`. The order of pairs matters when | ||||
|       handling symbols that can also be operators: `func(x << 5, 20) >> 17`. To handle | ||||
|       this syntax parenthesis, must come before angle brackets in the list. | ||||
|     | ||||
| https://www.vim.org/scripts/script.php?script_id=2699 | ||||
|  | ||||
| </details> | ||||
|     | ||||
|  | ||||
| <details> | ||||
| <summary><h2>exchange</h2></summary> | ||||
|  | ||||
| By [fan-tom](https://github.com/fan-tom)   | ||||
| Original plugin: [vim-exchange](https://github.com/tommcdo/vim-exchange). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'tommcdo/vim-exchange'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'tommcdo/vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/tommcdo/vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>set exchange</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/tommcdo/vim-exchange/blob/master/doc/exchange.txt | ||||
|  | ||||
| </details> | ||||
|     | ||||
| <details> | ||||
| <summary><h2>textobj-entire</h2></summary> | ||||
|  | ||||
| By [Alexandre Grison](https://github.com/agrison)   | ||||
| Original plugin: [vim-textobj-entire](https://github.com/kana/vim-textobj-entire). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'kana/vim-textobj-entire'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'kana/vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2610'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-entire</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/kana/vim-textobj-entire/blob/master/doc/textobj-entire.txt | ||||
|  | ||||
| </details> | ||||
|     | ||||
| <details> | ||||
| <summary><h2>highlightedyank</h2></summary> | ||||
|  | ||||
| By [KostkaBrukowa](https://github.com/KostkaBrukowa)   | ||||
| Original plugin: [vim-highlightedyank](https://github.com/machakann/vim-highlightedyank). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'machakann/vim-highlightedyank'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'machakann/vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/machakann/vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>set highlightedyank</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| If you want to optimize highlight duration, assign a time in milliseconds:   | ||||
|       `let g:highlightedyank_highlight_duration = "1000"`   | ||||
|       A negative number makes the highlight persistent.   | ||||
|     | ||||
| If you want to change background color of highlight you can provide the rgba of the color you want e.g.   | ||||
|       `let g:highlightedyank_highlight_color = "rgba(160, 160, 160, 155)"` | ||||
|     | ||||
| https://github.com/machakann/vim-highlightedyank/blob/master/doc/highlightedyank.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>vim-paragraph-motion</h2></summary> | ||||
|  | ||||
| Original plugin: [vim-paragraph-motion](https://github.com/dbakker/vim-paragraph-motion). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'dbakker/vim-paragraph-motion'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'dbakker/vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/dbakker/vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>set vim-paragraph-motion</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/dbakker/vim-paragraph-motion#vim-paragraph-motion | ||||
|  | ||||
| </details> | ||||
|     | ||||
| <details> | ||||
| <summary><h2>vim-indent-object</h2></summary> | ||||
|  | ||||
| By [Shrikant Sharat Kandula](https://github.com/sharat87)   | ||||
| Original plugin: [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'michaeljsmith/vim-indent-object'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'michaeljsmith/vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/michaeljsmith/vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-indent</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/michaeljsmith/vim-indent-object/blob/master/doc/indent-object.txt | ||||
|  | ||||
| </details> | ||||
|     | ||||
|     | ||||
| <details> | ||||
| <summary><h2>matchit.vim</h2></summary> | ||||
|  | ||||
| By [Martin Yzeiri](https://github.com/myzeiri) | ||||
| Original plugin: [matchit.vim](https://github.com/chrisbra/matchit). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `packadd matchit` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plug 'vim-matchit'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'chrisbra/matchit'</code> | ||||
|       <br/> | ||||
|       <code>set matchit</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/adelarsq/vim-matchit/blob/master/doc/matchit.txt | ||||
|  | ||||
| </details> | ||||
| @@ -1,6 +1,6 @@ | ||||
| # NERDTree | ||||
|  | ||||
| IdeaVim supports emulation of the NERDTree plugin. Update your `~/.ideavimrc` to turn it on: | ||||
| IdeaVim supports the NERDTree plugin. Update your `~/.ideavimrc` to turn it on: | ||||
| ```vim | ||||
| Plug 'preservim/nerdtree` | ||||
| ``` | ||||
|   | ||||
| @@ -1,20 +1,31 @@ | ||||
| # | ||||
| # Copyright 2003-2022 The IdeaVim authors | ||||
| # | ||||
| # Use of this source code is governed by an MIT-style | ||||
| # license that can be found in the LICENSE.txt file or at | ||||
| # https://opensource.org/licenses/MIT. | ||||
| # | ||||
|  | ||||
| # suppress inspection "UnusedProperty" for whole file | ||||
|  | ||||
| ideaVersion=LATEST-EAP-SNAPSHOT | ||||
| ideaVersion=2022.3 | ||||
| downloadIdeaSources=true | ||||
| instrumentPluginCode=true | ||||
| version=SNAPSHOT | ||||
| version=chylex-14 | ||||
| javaVersion=17 | ||||
| remoteRobotVersion=0.11.15 | ||||
| antlrVersion=4.10.1 | ||||
|  | ||||
|  | ||||
| # Please don't forget to update kotlin version in buildscript section | ||||
| kotlinVersion=1.6.21 | ||||
| kotlinVersion=1.7.20 | ||||
| publishToken=token | ||||
| publishChannels=eap | ||||
|  | ||||
| slackUrl= | ||||
| youtrackToken= | ||||
|  | ||||
| # Gradle settings | ||||
| org.gradle.jvmargs='-Dfile.encoding=UTF-8' | ||||
|  | ||||
| # Disable warning from gradle-intellij-plugin. Kotlin stdlib is included as compileOnly, so the warning is unnecessary | ||||
| kotlin.stdlib.default.dependency=false | ||||
							
								
								
									
										11
									
								
								qodana.yaml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								qodana.yaml
									
									
									
									
									
								
							| @@ -19,7 +19,10 @@ exclude: | ||||
|       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt | ||||
|       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/LoremText.kt | ||||
|       - src/test/java/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 | ||||
|       - src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated | ||||
|       - src/main/java/com/maddyhome/idea/vim/package-info.java | ||||
| dependencyIgnores: | ||||
|   - name: "acejump" | ||||
|   - name: "icu4j" | ||||
|   - name: "antlr-runtime" | ||||
|   - name: "javax.json" | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim; | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim; | ||||
|  | ||||
| @@ -41,7 +31,6 @@ import com.maddyhome.idea.vim.config.migration.ApplicationConfigurationMigrator; | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionRegistrar; | ||||
| import com.maddyhome.idea.vim.group.*; | ||||
| import com.maddyhome.idea.vim.group.copy.PutGroup; | ||||
| import com.maddyhome.idea.vim.group.copy.YankGroup; | ||||
| import com.maddyhome.idea.vim.group.visual.VisualMotionGroup; | ||||
| import com.maddyhome.idea.vim.helper.MacKeyRepeat; | ||||
| import com.maddyhome.idea.vim.listener.VimListenerManager; | ||||
| @@ -52,6 +41,7 @@ import com.maddyhome.idea.vim.vimscript.services.FunctionStorage; | ||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | ||||
| import com.maddyhome.idea.vim.vimscript.services.OptionService; | ||||
| import com.maddyhome.idea.vim.vimscript.services.VariableService; | ||||
| import com.maddyhome.idea.vim.yank.YankGroupBase; | ||||
| import org.jdom.Element; | ||||
| import org.jetbrains.annotations.Nls; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| @@ -199,10 +189,6 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|     return ((WindowGroup)VimInjectorKt.getInjector().getWindow()); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull TabService getTabService() { | ||||
|     return ApplicationManager.getApplication().getService(TabService.class); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull EditorGroup getEditor() { | ||||
|     return ApplicationManager.getApplication().getService(EditorGroup.class); | ||||
|   } | ||||
| @@ -215,8 +201,8 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|     return (VisualMotionGroup)VimInjectorKt.getInjector().getVisualMotionGroup(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull YankGroup getYank() { | ||||
|     return (YankGroup)VimInjectorKt.getInjector().getYank(); | ||||
|   public static @NotNull YankGroupBase getYank() { | ||||
|     return (YankGroupBase)VimInjectorKt.getInjector().getYank(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull PutGroup getPut() { | ||||
| @@ -303,12 +289,8 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|     VimInjectorKt.getInjector().getMessages().clearError(); | ||||
|   } | ||||
|  | ||||
|   public static void showMode(String msg) { | ||||
|     VimInjectorKt.getInjector().getMessages().showMode(msg); | ||||
|   } | ||||
|  | ||||
|   public static void showMessage(@Nls(capitalization = Nls.Capitalization.Sentence) @Nullable String msg) { | ||||
|     VimInjectorKt.getInjector().getMessages().showStatusBarMessage(msg); | ||||
|     VimInjectorKt.getInjector().getMessages().showStatusBarMessage(null, msg); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull VimPlugin getInstance() { | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.action | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action | ||||
|  | ||||
| @@ -154,6 +144,10 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|  | ||||
|       if ((keyCode == KeyEvent.VK_TAB || keyCode == KeyEvent.VK_ENTER) && editor.appCodeTemplateCaptured()) return false | ||||
|        | ||||
|       if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) return false | ||||
|       if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN) return false | ||||
|       if (keyCode == KeyEvent.VK_HOME || keyCode == KeyEvent.VK_END) return false | ||||
|  | ||||
|       if (editor.inInsertMode) { | ||||
|         if (keyCode == KeyEvent.VK_TAB) { | ||||
|           // TODO: This stops VimEditorTab seeing <Tab> in insert mode and correctly scrolling the view | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change.delete | ||||
|  | ||||
| @@ -28,8 +18,28 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.options.OptionScope | ||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService | ||||
|  | ||||
| class DeleteJoinLinesAction : ChangeEditorActionHandler.SingleExecution() { | ||||
| class DeleteJoinLinesAction : ChangeEditorActionHandler.ConditionalSingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.DELETE | ||||
|   override fun runAsMulticaret( | ||||
|     editor: VimEditor, | ||||
|     context: ExecutionContext, | ||||
|     cmd: Command, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return !injector.optionService.isSet(OptionScope.LOCAL(editor), IjVimOptionService.ideajoinName) | ||||
|   } | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: VimEditor, | ||||
|     caret: VimCaret, | ||||
|     context: ExecutionContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     injector.editorGroup.notifyIdeaJoin(editor) | ||||
|  | ||||
|     return injector.changeGroup.deleteJoinLines(editor, caret, operatorArguments.count1, false, operatorArguments) | ||||
|   } | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: VimEditor, | ||||
| @@ -38,17 +48,6 @@ class DeleteJoinLinesAction : ChangeEditorActionHandler.SingleExecution() { | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     if (editor.isOneLineMode()) return false | ||||
|     if (injector.optionService.isSet(OptionScope.LOCAL(editor), IjVimOptionService.ideajoinName)) { | ||||
|     return injector.changeGroup.joinViaIdeaByCount(editor, context, operatorArguments.count1) | ||||
|   } | ||||
|     injector.editorGroup.notifyIdeaJoin(editor) | ||||
|     val res = arrayOf(true) | ||||
|     editor.forEachNativeCaret( | ||||
|       { caret: VimCaret -> | ||||
|         if (!injector.changeGroup.deleteJoinLines(editor, caret, operatorArguments.count1, false, operatorArguments)) res[0] = false | ||||
|       }, | ||||
|       true | ||||
|     ) | ||||
|     return res[0] | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change.delete | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change.delete | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change.delete | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.action.editor | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.ex | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.internal | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.action.internal | ||||
| @@ -25,8 +15,10 @@ import com.intellij.openapi.actionSystem.CommonDataKeys | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.intellij.openapi.editor.VisualPosition | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.api.lineLength | ||||
| import com.maddyhome.idea.vim.api.visualLineToBufferLine | ||||
| import com.maddyhome.idea.vim.helper.VimNlsSafe | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
| import java.util.* | ||||
| import kotlin.math.max | ||||
|  | ||||
| @@ -38,17 +30,18 @@ class AddInlineInlaysAction : AnAction() { | ||||
|   override fun actionPerformed(e: AnActionEvent) { | ||||
|     val dataContext = e.dataContext | ||||
|     val editor = getEditor(dataContext) ?: return | ||||
|     val vimEditor = editor.vim | ||||
|     val inlayModel = editor.inlayModel | ||||
|     val currentVisualLine = editor.caretModel.primaryCaret.visualPosition.line | ||||
|     var i = random.nextInt(10) | ||||
|     val lineLength = EditorHelper.getLineLength(editor, EditorHelper.visualLineToLogicalLine(editor, currentVisualLine)) | ||||
|     val lineLength = vimEditor.lineLength(vimEditor.visualLineToBufferLine(currentVisualLine)) | ||||
|     while (i < lineLength) { | ||||
|       val relatesToPrecedingText = random.nextInt(10) > 7 | ||||
|  | ||||
|       @VimNlsSafe | ||||
|       val text = "a".repeat(max(1, random.nextInt(7))) | ||||
|  | ||||
|       val offset = EditorHelper.visualPositionToOffset(editor, VisualPosition(currentVisualLine, i)) | ||||
|       val offset = editor.visualPositionToOffset(VisualPosition(currentVisualLine, i)) | ||||
|       // We don't need a custom renderer, just use the standard parameter hint renderer | ||||
|       inlayModel.addInlineElement( | ||||
|         offset, | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.command | ||||
|   | ||||
| @@ -1,35 +1,25 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.common | ||||
|  | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.intellij.openapi.editor.LogicalPosition | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper.getLineStartOffset | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
|  | ||||
| class CharacterPosition(line: Int, col: Int) : LogicalPosition(line, col) { | ||||
|   fun toOffset(editor: Editor) = getLineStartOffset(editor, line) + column | ||||
|   fun toOffset(editor: Editor) = editor.vim.getLineStartOffset(line) + column | ||||
|  | ||||
|   companion object { | ||||
|     fun fromOffset(editor: Editor, offset: Int): CharacterPosition { | ||||
|       // logical position "expands" tabs | ||||
|       val logicalPosition = editor.offsetToLogicalPosition(offset) | ||||
|       val lineStartOffset = getLineStartOffset(editor, logicalPosition.line) | ||||
|       val lineStartOffset = editor.vim.getLineStartOffset(logicalPosition.line) | ||||
|       return CharacterPosition(logicalPosition.line, offset - lineStartOffset) | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.common | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.config | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.config.migration | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.config.migration | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| @file:Suppress("ClassName") | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.ex | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.ex.vimscript; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.extension | ||||
|  | ||||
| @@ -23,6 +13,7 @@ import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.KeyHandler | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.action.change.Extension | ||||
| import com.maddyhome.idea.vim.api.ImmutableVimCaret | ||||
| import com.maddyhome.idea.vim.api.VimCaret | ||||
| import com.maddyhome.idea.vim.command.MappingMode | ||||
| import com.maddyhome.idea.vim.command.SelectionType | ||||
| @@ -198,7 +189,7 @@ object VimExtensionFacade { | ||||
|  | ||||
|   /** Set the current contents of the given register */ | ||||
|   @JvmStatic | ||||
|   fun setRegisterForCaret(register: Char, caret: VimCaret, keys: List<KeyStroke?>?) { | ||||
|   fun setRegisterForCaret(register: Char, caret: ImmutableVimCaret, keys: List<KeyStroke?>?) { | ||||
|     caret.registerStorage.setKeys(caret, register, keys?.filterNotNull() ?: emptyList()) | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.extension | ||||
|  | ||||
|   | ||||
| @@ -1,32 +1,20 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.argtextobj; | ||||
|  | ||||
| import com.intellij.openapi.editor.Caret; | ||||
| import com.intellij.openapi.editor.Document; | ||||
| import com.maddyhome.idea.vim.VimPlugin; | ||||
| import com.maddyhome.idea.vim.api.*; | ||||
| import com.maddyhome.idea.vim.command.*; | ||||
| import com.maddyhome.idea.vim.command.MappingMode; | ||||
| import com.maddyhome.idea.vim.common.TextRange; | ||||
| import com.maddyhome.idea.vim.extension.VimExtension; | ||||
| import com.maddyhome.idea.vim.extension.ExtensionHandler; | ||||
| import com.maddyhome.idea.vim.extension.VimExtension; | ||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | ||||
| import com.maddyhome.idea.vim.helper.InlayHelperKt; | ||||
| import com.maddyhome.idea.vim.helper.MessageHelper; | ||||
| @@ -36,6 +24,7 @@ import com.maddyhome.idea.vim.listener.VimListenerSuppressor; | ||||
| import com.maddyhome.idea.vim.newapi.IjVimCaret; | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString; | ||||
| import kotlin.Unit; | ||||
| import org.jetbrains.annotations.Nls; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| import org.jetbrains.annotations.Nullable; | ||||
| @@ -45,8 +34,7 @@ import java.util.Deque; | ||||
| import java.util.EnumSet; | ||||
|  | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping; | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMapping; | ||||
| import static com.maddyhome.idea.vim.group.visual.VisualGroupKt.vimSetSelection; | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing; | ||||
|  | ||||
| /** | ||||
|  * @author igrekster | ||||
| @@ -65,9 +53,8 @@ public class VimArgTextObjExtension implements VimExtension { | ||||
|     putExtensionHandlerMapping(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("<Plug>InnerArgument"), getOwner(), new VimArgTextObjExtension.ArgumentHandler(true), false); | ||||
|     putExtensionHandlerMapping(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("<Plug>OuterArgument"), getOwner(), new VimArgTextObjExtension.ArgumentHandler(false), false); | ||||
|  | ||||
|     putKeyMapping(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("ia"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>InnerArgument"), true); | ||||
|     putKeyMapping(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("aa"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>OuterArgument"), true); | ||||
|  | ||||
|     putKeyMappingIfMissing(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("ia"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>InnerArgument"), true); | ||||
|     putKeyMappingIfMissing(MappingMode.XO, VimInjectorKt.getInjector().getParser().parseKeys("aa"), getOwner(), VimInjectorKt.getInjector().getParser().parseKeys("<Plug>OuterArgument"), true); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @@ -174,8 +161,8 @@ public class VimArgTextObjExtension implements VimExtension { | ||||
|   @Nullable | ||||
|   private static String bracketPairsVariable() { | ||||
|     final Object value = VimPlugin.getVariableService().getGlobalVariableValue("argtextobj_pairs"); | ||||
|     if (value instanceof VimString) { | ||||
|       return ((VimString)value).getValue(); | ||||
|     if (value instanceof VimString vimValue) { | ||||
|       return vimValue.getValue(); | ||||
|     } | ||||
|     return null; | ||||
|   } | ||||
| @@ -206,7 +193,7 @@ public class VimArgTextObjExtension implements VimExtension { | ||||
|       @Nullable | ||||
|       @Override | ||||
|       public TextRange getRange(@NotNull VimEditor editor, | ||||
|                                 @NotNull VimCaret caret, | ||||
|                                 @NotNull ImmutableVimCaret caret, | ||||
|                                 @NotNull ExecutionContext context, | ||||
|                                 int count, | ||||
|                                 int rawCount, | ||||
| @@ -265,18 +252,18 @@ public class VimArgTextObjExtension implements VimExtension { | ||||
|       final ArgumentTextObjectHandler textObjectHandler = new ArgumentTextObjectHandler(isInner); | ||||
|       //noinspection DuplicatedCode | ||||
|       if (!vimStateMachine.isOperatorPending()) { | ||||
|         vimEditor.getEditor().getCaretModel().runForEachCaret((Caret caret) -> { | ||||
|           final TextRange range = textObjectHandler.getRange(vimEditor, new IjVimCaret(caret), context, count, 0, null); | ||||
|         editor.forEachNativeCaret((VimCaret caret) -> { | ||||
|           final TextRange range = textObjectHandler.getRange(editor, caret, context, count, 0, null); | ||||
|           if (range != null) { | ||||
|             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { | ||||
|               if (vimStateMachine.getMode() == VimStateMachine.Mode.VISUAL) { | ||||
|                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||
|                 com.maddyhome.idea.vim.group.visual.EngineVisualGroupKt.vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||
|               } else { | ||||
|                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); | ||||
|                 InlayHelperKt.moveToInlayAwareOffset(((IjVimCaret)caret).getCaret(), range.getStartOffset()); | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|  | ||||
|           return Unit.INSTANCE; | ||||
|         }); | ||||
|       } else { | ||||
|         vimStateMachine.getCommandBuilder().completeCommandPart(new Argument(new Command(count, | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.extension.commentary | ||||
|  | ||||
| @@ -29,8 +19,9 @@ import com.intellij.psi.PsiWhiteSpace | ||||
| import com.intellij.psi.util.PsiTreeUtil | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimCaret | ||||
| import com.maddyhome.idea.vim.api.ImmutableVimCaret | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.getLineEndOffset | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| @@ -51,12 +42,12 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMapping | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.PsiHelper | ||||
| import com.maddyhome.idea.vim.helper.vimStateMachine | ||||
| import com.maddyhome.idea.vim.key.OperatorFunction | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
| import java.util.* | ||||
|  | ||||
| class CommentaryExtension : VimExtension { | ||||
| @@ -200,7 +191,7 @@ class CommentaryExtension : VimExtension { | ||||
|  | ||||
|     override fun getRange( | ||||
|       editor: VimEditor, | ||||
|       caret: VimCaret, | ||||
|       caret: ImmutableVimCaret, | ||||
|       context: ExecutionContext, | ||||
|       count: Int, | ||||
|       rawCount: Int, | ||||
| @@ -211,14 +202,14 @@ class CommentaryExtension : VimExtension { | ||||
|       val file = PsiHelper.getFile(nativeEditor) ?: return null | ||||
|       val lastLine = editor.lineCount() | ||||
|  | ||||
|       var startLine = caret.getLogicalPosition().line | ||||
|       var startLine = caret.getBufferPosition().line | ||||
|       while (startLine > 0 && isCommentLine(file, nativeEditor, startLine - 1)) startLine-- | ||||
|       var endLine = caret.getLogicalPosition().line - 1 | ||||
|       var endLine = caret.getBufferPosition().line - 1 | ||||
|       while (endLine < lastLine && isCommentLine(file, nativeEditor, endLine + 1)) endLine++ | ||||
|  | ||||
|       if (startLine <= endLine) { | ||||
|         val startOffset = EditorHelper.getLineStartOffset(nativeEditor, startLine) | ||||
|         val endOffset = EditorHelper.getLineStartOffset(nativeEditor, endLine + 1) | ||||
|         val startOffset = editor.getLineStartOffset(startLine) | ||||
|         val endOffset = editor.getLineStartOffset(endLine + 1) | ||||
|         return TextRange(startOffset, endOffset) | ||||
|       } | ||||
|  | ||||
| @@ -227,8 +218,8 @@ class CommentaryExtension : VimExtension { | ||||
|  | ||||
|     // Check all leaf nodes in the given line are whitespace, comments, or are owned by comments | ||||
|     private fun isCommentLine(file: PsiFile, editor: Editor, logicalLine: Int): Boolean { | ||||
|       val startOffset = EditorHelper.getLineStartOffset(editor, logicalLine) | ||||
|       val endOffset = EditorHelper.getLineEndOffset(editor, logicalLine, true) | ||||
|       val startOffset = editor.vim.getLineStartOffset(logicalLine) | ||||
|       val endOffset = editor.vim.getLineEndOffset(logicalLine, true) | ||||
|       val startElement = file.findElementAt(startOffset) ?: return false | ||||
|       var next: PsiElement? = startElement | ||||
|       while (next != null && next.textRange.startOffset <= endOffset) { | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.exchange | ||||
| @@ -29,6 +19,7 @@ import com.intellij.openapi.util.Key | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.getOffset | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.command.MappingMode | ||||
| import com.maddyhome.idea.vim.command.SelectionType | ||||
| @@ -42,7 +33,6 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMa | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegister | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.fileSize | ||||
| import com.maddyhome.idea.vim.helper.moveToInlayAwareLogicalPosition | ||||
| import com.maddyhome.idea.vim.helper.moveToInlayAwareOffset | ||||
| @@ -50,6 +40,7 @@ import com.maddyhome.idea.vim.helper.subMode | ||||
| import com.maddyhome.idea.vim.key.OperatorFunction | ||||
| import com.maddyhome.idea.vim.mark.Mark | ||||
| import com.maddyhome.idea.vim.mark.VimMarkConstants | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
| import org.jetbrains.annotations.NonNls | ||||
| @@ -138,7 +129,7 @@ class VimExchangeExtension : VimExtension { | ||||
|   } | ||||
|  | ||||
|   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) = IjVimEditor(this).getOffset(mark.line, mark.col) | ||||
|     fun VimStateMachine.SubMode.getString() = when (this) { | ||||
|       VimStateMachine.SubMode.VISUAL_CHARACTER -> "v" | ||||
|       VimStateMachine.SubMode.VISUAL_LINE -> "V" | ||||
| @@ -217,19 +208,19 @@ class VimExchangeExtension : VimExtension { | ||||
|         if (reverse) { | ||||
|           primaryCaret.moveToInlayAwareOffset(editor.getMarkOffset(ex1.start)) | ||||
|         } else { | ||||
|           if (ex1.start.logicalLine == ex2.start.logicalLine) { | ||||
|           if (ex1.start.line == ex2.start.line) { | ||||
|             val horizontalOffset = ex1.end.col - ex2.end.col | ||||
|             primaryCaret.moveToInlayAwareLogicalPosition( | ||||
|               LogicalPosition( | ||||
|                 ex1.start.logicalLine, | ||||
|                 ex1.start.line, | ||||
|                 ex1.start.col - horizontalOffset | ||||
|               ) | ||||
|             ) | ||||
|           } else if (ex1.end.logicalLine - ex1.start.logicalLine != ex2.end.logicalLine - ex2.start.logicalLine) { | ||||
|             val verticalOffset = ex1.end.logicalLine - ex2.end.logicalLine | ||||
|           } else if (ex1.end.line - ex1.start.line != ex2.end.line - ex2.start.line) { | ||||
|             val verticalOffset = ex1.end.line - ex2.end.line | ||||
|             primaryCaret.moveToInlayAwareLogicalPosition( | ||||
|               LogicalPosition( | ||||
|                 ex1.start.logicalLine - verticalOffset, | ||||
|                 ex1.start.line - verticalOffset, | ||||
|                 ex1.start.col | ||||
|               ) | ||||
|             ) | ||||
| @@ -262,16 +253,16 @@ class VimExchangeExtension : VimExtension { | ||||
|  | ||||
|     private fun compareExchanges(x: Exchange, y: Exchange): ExchangeCompareResult { | ||||
|       fun intersects(x: Exchange, y: Exchange) = | ||||
|         x.end.logicalLine < y.start.logicalLine || | ||||
|           x.start.logicalLine > y.end.logicalLine || | ||||
|         x.end.line < y.start.line || | ||||
|           x.start.line > y.end.line || | ||||
|           x.end.col < y.start.col || | ||||
|           x.start.col > y.end.col | ||||
|  | ||||
|       fun comparePos(x: Mark, y: Mark): Int = | ||||
|         if (x.logicalLine == y.logicalLine) { | ||||
|         if (x.line == y.line) { | ||||
|           x.col - y.col | ||||
|         } else { | ||||
|           x.logicalLine - y.logicalLine | ||||
|           x.line - y.line | ||||
|         } | ||||
|  | ||||
|       return if (x.type == VimStateMachine.SubMode.VISUAL_BLOCK && y.type == VimStateMachine.SubMode.VISUAL_BLOCK) { | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.highlightedyank | ||||
| @@ -31,15 +21,15 @@ import com.intellij.openapi.editor.markup.TextAttributes | ||||
| import com.intellij.openapi.util.Disposer | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.VimProjectService | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.common.TextRange | ||||
| import com.maddyhome.idea.vim.extension.VimExtension | ||||
| import com.maddyhome.idea.vim.helper.MessageHelper | ||||
| import com.maddyhome.idea.vim.helper.VimNlsSafe | ||||
| import com.maddyhome.idea.vim.listener.VimInsertListener | ||||
| import com.maddyhome.idea.vim.listener.VimYankListener | ||||
| import com.maddyhome.idea.vim.options.OptionConstants | ||||
| import com.maddyhome.idea.vim.options.OptionScope | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
| import com.maddyhome.idea.vim.options.helpers.StrictMode | ||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString | ||||
| import org.jetbrains.annotations.NonNls | ||||
| import java.awt.Color | ||||
| @@ -101,8 +91,8 @@ class VimHighlightedYank : VimExtension, VimYankListener, VimInsertListener { | ||||
|     VimPlugin.getChange().removeInsertListener(this) | ||||
|   } | ||||
|  | ||||
|   override fun yankPerformed(editor: Editor, range: TextRange) { | ||||
|     highlightHandler.highlightYankRange(editor, range) | ||||
|   override fun yankPerformed(editor: VimEditor, range: TextRange) { | ||||
|     highlightHandler.highlightYankRange(editor.ij, range) | ||||
|   } | ||||
|  | ||||
|   override fun insertModeStarted(editor: Editor) { | ||||
| @@ -139,18 +129,12 @@ class VimHighlightedYank : VimExtension, VimYankListener, VimInsertListener { | ||||
|  | ||||
|     fun clearAllYankHighlighters() { | ||||
|       yankHighlighters.forEach { highlighter -> | ||||
|         editor?.markupModel?.removeHighlighter(highlighter) ?: failIfStrictMode("Highlighters without an editor") | ||||
|         editor?.markupModel?.removeHighlighter(highlighter) ?: StrictMode.fail("Highlighters without an editor") | ||||
|       } | ||||
|  | ||||
|       yankHighlighters.clear() | ||||
|     } | ||||
|  | ||||
|     private fun failIfStrictMode(value: String) { | ||||
|       if (injector.optionService.isSet(OptionScope.GLOBAL, OptionConstants.ideastrictmodeName)) { | ||||
|         error(value) | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     private fun highlightSingleRange(editor: Editor, range: ClosedRange<Int>) { | ||||
|       val highlighter = editor.markupModel.addRangeHighlighter( | ||||
|         range.start, | ||||
| @@ -173,7 +157,7 @@ class VimHighlightedYank : VimExtension, VimYankListener, VimInsertListener { | ||||
|         Executors.newSingleThreadScheduledExecutor().schedule( | ||||
|           { | ||||
|             ApplicationManager.getApplication().invokeLater { | ||||
|               editor?.markupModel?.removeHighlighter(highlighter) ?: failIfStrictMode("Highlighters without an editor") | ||||
|               editor?.markupModel?.removeHighlighter(highlighter) ?: StrictMode.fail("Highlighters without an editor") | ||||
|             } | ||||
|           }, | ||||
|           timeout, TimeUnit.MILLISECONDS | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.matchit | ||||
| @@ -27,9 +17,13 @@ import com.intellij.psi.util.PsiTreeUtil | ||||
| import com.intellij.psi.util.elementType | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimCaret | ||||
| import com.maddyhome.idea.vim.api.ImmutableVimCaret | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.getLineEndForOffset | ||||
| import com.maddyhome.idea.vim.api.getLineEndOffset | ||||
| import com.maddyhome.idea.vim.api.getLineStartForOffset | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.api.normalizeOffset | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| @@ -48,6 +42,7 @@ import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.PsiHelper | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import com.maddyhome.idea.vim.helper.vimStateMachine | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
| import java.util.* | ||||
| @@ -79,7 +74,7 @@ class Matchit : VimExtension { | ||||
|  | ||||
|     override fun getOffset( | ||||
|       editor: VimEditor, | ||||
|       caret: VimCaret, | ||||
|       caret: ImmutableVimCaret, | ||||
|       context: ExecutionContext, | ||||
|       argument: Argument?, | ||||
|       operatorArguments: OperatorArguments, | ||||
| @@ -123,7 +118,7 @@ class Matchit : VimExtension { | ||||
|       } else { | ||||
|         editor.forEachCaret { caret -> | ||||
|           VimPlugin.getMark().saveJumpLocation(editor) | ||||
|           injector.motion.moveCaret(editor, caret, getMatchitOffset(editor.ij, caret.ij, count, isInOpPending, reverse)) | ||||
|           caret.moveToOffset(getMatchitOffset(editor.ij, caret.ij, count, isInOpPending, reverse)) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -233,7 +228,7 @@ private object FileTypePatterns { | ||||
|     } else if (fileTypeName == "CMakeLists.txt" || fileName == "CMakeLists") { | ||||
|       this.cMakePatterns | ||||
|     } else { | ||||
|       return null | ||||
|       this.htmlPatterns | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -326,7 +321,7 @@ private fun getMatchitOffset(editor: Editor, caret: Caret, count: Int, isInOpPen | ||||
|   var caretOffset = caret.offset | ||||
|  | ||||
|   // Handle the case where visual mode has brought the cursor past the end of the line. | ||||
|   val lineEndOffset = EditorHelper.getLineEndOffset(editor, caret.logicalPosition.line, true) | ||||
|   val lineEndOffset = editor.vim.getLineEndOffset(caret.logicalPosition.line, true) | ||||
|   if (caretOffset > 0 && caretOffset == lineEndOffset) { | ||||
|     caretOffset-- | ||||
|   } | ||||
| @@ -359,7 +354,7 @@ private fun getMatchitOffset(editor: Editor, caret: Caret, count: Int, isInOpPen | ||||
|   } | ||||
|  | ||||
|   if (motion >= 0) { | ||||
|     motion = EditorHelper.normalizeOffset(editor, motion, false) | ||||
|     motion = editor.vim.normalizeOffset(motion, false) | ||||
|   } | ||||
|  | ||||
|   return motion | ||||
| @@ -374,8 +369,8 @@ private fun findMatchingPair( | ||||
| ): Int { | ||||
|   // For better performance, we limit our search to the current line. This way we don't have to scan the entire file | ||||
|   // to determine if we're on a pattern or not. The original plugin behaves the same way. | ||||
|   val currentLineStart = EditorHelper.getLineStartForOffset(editor, caretOffset) | ||||
|   val currentLineEnd = EditorHelper.getLineEndForOffset(editor, caretOffset) | ||||
|   val currentLineStart = IjVimEditor(editor).getLineStartForOffset(caretOffset) | ||||
|   val currentLineEnd = IjVimEditor(editor).getLineEndForOffset(caretOffset) | ||||
|   val currentLineChars = editor.document.charsSequence.subSequence(currentLineStart, currentLineEnd) | ||||
|   val offset = caretOffset - currentLineStart | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.multiplecursors | ||||
| @@ -28,6 +18,7 @@ import com.maddyhome.idea.vim.KeyHandler | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.getText | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.command.MappingMode | ||||
| import com.maddyhome.idea.vim.command.VimStateMachine | ||||
| @@ -38,7 +29,6 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMa | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||
| import com.maddyhome.idea.vim.group.MotionGroup | ||||
| import com.maddyhome.idea.vim.group.visual.vimSetSelection | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.MessageHelper | ||||
| import com.maddyhome.idea.vim.helper.SearchHelper | ||||
| import com.maddyhome.idea.vim.helper.SearchOptions | ||||
| @@ -167,12 +157,12 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|             for (line in startPosition.line + 1..startPosition.line + lines) { | ||||
|               newPositions.add(VisualPosition(line, startPosition.column)) | ||||
|             } | ||||
|             MotionGroup.moveCaret(editor, caret, selectionStart) | ||||
|             caret.vim.moveToOffset(selectionStart) | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         if (newPositions.size > 0) { | ||||
|           editor.exitVisualMode() | ||||
|           editor.vim.exitVisualMode() | ||||
|           newPositions.forEach { editor.caretModel.addCaret(it, true) ?: return } | ||||
|           editor.updateCaretsVisualAttributes() | ||||
|           return | ||||
| @@ -205,7 +195,7 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|  | ||||
|         // Always work on the text in the last visual selection range, so we work with any changed text, even if it's no | ||||
|         // longer selected | ||||
|         val pattern = EditorHelper.getText(editor, lastSelection) | ||||
|         val pattern = editor.vim.getText(lastSelection) | ||||
|  | ||||
|         val primaryCaret = editor.caretModel.primaryCaret | ||||
|         val nextOffset = findNextOccurrence(editor, primaryCaret.offset, pattern, wholeWord) | ||||
| @@ -238,7 +228,7 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|       } else { | ||||
|         val range = SearchHelper.findWordUnderCursor(editor, primaryCaret) ?: return | ||||
|         if (range.startOffset > primaryCaret.offset) return | ||||
|         EditorHelper.getText(editor, range) | ||||
|         IjVimEditor(editor).getText(range) | ||||
|       } | ||||
|  | ||||
|       if (!editor.inVisualMode) { | ||||
| @@ -250,7 +240,7 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|       val matches = SearchHelper.findAll(editor, pattern, 0, -1, false) | ||||
|       for (match in matches) { | ||||
|         if (match.contains(primaryCaret.offset)) { | ||||
|           MotionGroup.moveCaret(editor, primaryCaret, match.startOffset) | ||||
|           primaryCaret.vim.moveToOffset(match.startOffset) | ||||
|           selectText(primaryCaret, text, match.startOffset) | ||||
|         } else { | ||||
|           val caret = editor.caretModel.addCaret(editor.offsetToVisualPosition(match.startOffset), true) ?: return | ||||
| @@ -287,7 +277,7 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|       val caret = editor.caretModel.primaryCaret | ||||
|       if (caret.selectedText == null) return | ||||
|       if (!editor.caretModel.removeCaret(caret)) { | ||||
|         editor.exitVisualMode() | ||||
|         editor.vim.exitVisualMode() | ||||
|       } | ||||
|       MotionGroup.scrollCaretIntoView(caret.editor) | ||||
|     } | ||||
| @@ -295,7 +285,7 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|  | ||||
|   private fun selectText(caret: Caret, text: String, offset: Int): TextRange? { | ||||
|     if (text.isEmpty()) return null | ||||
|     caret.vimSetSelection(offset, offset + text.length - 1, true) | ||||
|     caret.vim.vimSetSelection(offset, offset + text.length - 1, true) | ||||
|     MotionGroup.scrollCaretIntoView(caret.editor) | ||||
|     return TextRange(caret.selectionStart, caret.selectionEnd) | ||||
|   } | ||||
| @@ -307,7 +297,7 @@ class VimMultipleCursorsExtension : VimExtension { | ||||
|     enterVisualMode(editor.vim) | ||||
|  | ||||
|     // Select the word under the caret, moving the caret to the end of the selection | ||||
|     caret.vimSetSelection(range.startOffset, range.endOffsetInclusive, true) | ||||
|     caret.vim.vimSetSelection(range.startOffset, range.endOffsetInclusive, true) | ||||
|     return TextRange(caret.selectionStart, caret.selectionEnd) | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.nerdtree | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.nerdtree | ||||
| @@ -24,6 +14,7 @@ import com.intellij.openapi.actionSystem.ActionManager | ||||
| import com.intellij.openapi.actionSystem.ActionUpdateThread | ||||
| import com.intellij.openapi.actionSystem.AnActionEvent | ||||
| import com.intellij.openapi.actionSystem.CommonDataKeys | ||||
| import com.intellij.openapi.actionSystem.PlatformDataKeys | ||||
| import com.intellij.openapi.application.ApplicationManager | ||||
| import com.intellij.openapi.diagnostic.logger | ||||
| import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx | ||||
| @@ -146,7 +137,7 @@ class NerdTree : VimExtension { | ||||
|  | ||||
|   class IjCommandHandler(private val actionId: String) : CommandAliasHandler { | ||||
|     override fun execute(command: String, ranges: Ranges, editor: VimEditor, context: ExecutionContext) { | ||||
|       callAction(actionId, context) | ||||
|       callAction(editor, actionId, context) | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -157,7 +148,7 @@ class NerdTree : VimExtension { | ||||
|       if (toolWindow.isVisible) { | ||||
|         toolWindow.hide() | ||||
|       } else { | ||||
|         callAction("ActivateProjectToolWindow", context) | ||||
|         callAction(editor, "ActivateProjectToolWindow", context) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| @@ -219,7 +210,7 @@ class NerdTree : VimExtension { | ||||
|  | ||||
|           val action = nextNode.actionHolder | ||||
|           when (action) { | ||||
|             is NerdAction.ToIj -> callAction(action.name, e.dataContext.vim) | ||||
|             is NerdAction.ToIj -> callAction(null, action.name, e.dataContext.vim) | ||||
|             is NerdAction.Code -> e.project?.let { action.action(it, e.dataContext, e) } | ||||
|           } | ||||
|         } | ||||
| @@ -240,14 +231,14 @@ class NerdTree : VimExtension { | ||||
|         e.presentation.isEnabled = false | ||||
|         return | ||||
|       } | ||||
|       e.presentation.isEnabled = !speedSearchIsHere(project) | ||||
|       e.presentation.isEnabled = !speedSearchIsHere(e) | ||||
|     } | ||||
|  | ||||
|     override fun getActionUpdateThread() = ActionUpdateThread.EDT | ||||
|     override fun getActionUpdateThread() = ActionUpdateThread.BGT | ||||
|  | ||||
|     private fun speedSearchIsHere(project: Project): Boolean { | ||||
|       val component = ProjectView.getInstance(project).currentProjectViewPane.tree ?: return false | ||||
|       return SpeedSearchSupply.getSupply(component) != null | ||||
|     private fun speedSearchIsHere(e: AnActionEvent): Boolean { | ||||
|       val searchText = e.getData(PlatformDataKeys.SPEED_SEARCH_TEXT) | ||||
|       return !searchText.isNullOrEmpty() | ||||
|     } | ||||
|  | ||||
|     companion object { | ||||
| @@ -357,7 +348,7 @@ class NerdTree : VimExtension { | ||||
|         currentWindow?.split(SwingConstants.VERTICAL, true, file, true) | ||||
|  | ||||
|         // FIXME: 22.01.2021 This solution bouncing a bit | ||||
|         callAction("ActivateProjectToolWindow", context.vim) | ||||
|         callAction(null, "ActivateProjectToolWindow", context.vim) | ||||
|       } | ||||
|     ) | ||||
|     registerCommand( | ||||
| @@ -368,7 +359,7 @@ class NerdTree : VimExtension { | ||||
|         val currentWindow = splitters.currentWindow | ||||
|         currentWindow?.split(SwingConstants.HORIZONTAL, true, file, true) | ||||
|  | ||||
|         callAction("ActivateProjectToolWindow", context.vim) | ||||
|         callAction(null, "ActivateProjectToolWindow", context.vim) | ||||
|       } | ||||
|     ) | ||||
|     registerCommand( | ||||
| @@ -506,20 +497,17 @@ class NerdTree : VimExtension { | ||||
|  | ||||
|     private val LOG = logger<NerdTree>() | ||||
|  | ||||
|     fun callAction(name: String, context: ExecutionContext) { | ||||
|     fun callAction(editor: VimEditor?, name: String, context: ExecutionContext) { | ||||
|       val action = ActionManager.getInstance().getAction(name) ?: run { | ||||
|         VimPlugin.showMessage(MessageHelper.message("action.not.found.0", name)) | ||||
|         return | ||||
|       } | ||||
|       val application = ApplicationManager.getApplication() | ||||
|       if (application.isUnitTestMode) { | ||||
|         injector.actionExecutor.executeAction(action.vim, context) | ||||
|         injector.actionExecutor.executeAction(editor, action.vim, context) | ||||
|       } else { | ||||
|         runAfterGotFocus { | ||||
|           injector.actionExecutor.executeAction( | ||||
|             action.vim, | ||||
|             context, | ||||
|           ) | ||||
|           injector.actionExecutor.executeAction(editor, action.vim, context) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.paragraphmotion | ||||
| @@ -23,16 +13,16 @@ 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.api.injector | ||||
| import com.maddyhome.idea.vim.api.normalizeOffset | ||||
| 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.VimExtensionFacade | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing | ||||
| import com.maddyhome.idea.vim.group.MotionGroup | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.SearchHelper | ||||
| import com.maddyhome.idea.vim.helper.vimForEachCaret | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
|  | ||||
| class ParagraphMotion : VimExtension { | ||||
|   override fun getName(): String = "vim-paragraph-motion" | ||||
| @@ -50,7 +40,7 @@ class ParagraphMotion : VimExtension { | ||||
|       editor.ij.vimForEachCaret { caret -> | ||||
|         val motion = moveCaretToNextParagraph(editor.ij, caret, count) | ||||
|         if (motion >= 0) { | ||||
|           MotionGroup.moveCaret(editor.ij, caret, motion) | ||||
|           caret.vim.moveToOffset(motion) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -58,7 +48,7 @@ class ParagraphMotion : VimExtension { | ||||
|     fun moveCaretToNextParagraph(editor: Editor, caret: Caret, count: Int): Int { | ||||
|       var res = SearchHelper.findNextParagraph(editor, caret, count, true) | ||||
|       res = if (res >= 0) { | ||||
|         EditorHelper.normalizeOffset(editor, res, true) | ||||
|         editor.vim.normalizeOffset(res, true) | ||||
|       } else { | ||||
|         -1 | ||||
|       } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.replacewithregister | ||||
| @@ -21,8 +11,9 @@ package com.maddyhome.idea.vim.extension.replacewithregister | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimCaret | ||||
| import com.maddyhome.idea.vim.api.ImmutableVimCaret | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.getLineEndOffset | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.command.MappingMode | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| @@ -39,6 +30,7 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | ||||
| import com.maddyhome.idea.vim.helper.editorMode | ||||
| import com.maddyhome.idea.vim.helper.exitVisualMode | ||||
| import com.maddyhome.idea.vim.helper.mode | ||||
| import com.maddyhome.idea.vim.helper.subMode | ||||
| import com.maddyhome.idea.vim.helper.vimStateMachine | ||||
| @@ -75,7 +67,7 @@ class ReplaceWithRegister : VimExtension { | ||||
|         val visualSelection = caret to VimSelection.create(selectionStart, selectionEnd - 1, typeInEditor, editor) | ||||
|         doReplace(editor.ij, caret, PutData.VisualSelection(mapOf(visualSelection), typeInEditor)) | ||||
|       } | ||||
|       editor.exitVisualModeNative() | ||||
|       editor.exitVisualMode() | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -92,9 +84,9 @@ class ReplaceWithRegister : VimExtension { | ||||
|     override val isRepeatable: Boolean = true | ||||
|  | ||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||
|       val caretsAndSelections = mutableMapOf<VimCaret, VimSelection>() | ||||
|       val caretsAndSelections = mutableMapOf<ImmutableVimCaret, VimSelection>() | ||||
|       editor.forEachCaret { caret -> | ||||
|         val logicalLine = caret.getLogicalPosition().line | ||||
|         val logicalLine = caret.getBufferPosition().line | ||||
|         val lineStart = editor.getLineStartOffset(logicalLine) | ||||
|         val lineEnd = editor.getLineEndOffset(logicalLine, true) | ||||
|  | ||||
| @@ -150,7 +142,7 @@ class ReplaceWithRegister : VimExtension { | ||||
|     @NonNls | ||||
|     private const val RWR_VISUAL = "<Plug>ReplaceWithRegisterVisual" | ||||
|  | ||||
|     private fun doReplace(editor: Editor, caret: VimCaret, visualSelection: PutData.VisualSelection) { | ||||
|     private fun doReplace(editor: Editor, caret: ImmutableVimCaret, visualSelection: PutData.VisualSelection) { | ||||
|       val lastRegisterChar = injector.registerGroup.lastRegisterChar | ||||
|       val savedRegister = caret.registerStorage.getRegister(caret, lastRegisterChar) ?: return | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.extension.surround | ||||
|  | ||||
| @@ -22,7 +12,9 @@ import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimCaret | ||||
| import com.maddyhome.idea.vim.api.VimChangeGroup | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.getLineEndOffset | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.command.MappingMode | ||||
| import com.maddyhome.idea.vim.command.SelectionType | ||||
| @@ -39,6 +31,7 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissin | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegisterForCaret | ||||
| import com.maddyhome.idea.vim.helper.editorMode | ||||
| import com.maddyhome.idea.vim.helper.runWithEveryCaretAndRestore | ||||
| import com.maddyhome.idea.vim.key.OperatorFunction | ||||
| import com.maddyhome.idea.vim.newapi.IjVimCaret | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||
| @@ -84,22 +77,20 @@ class VimSurroundExtension : VimExtension { | ||||
|     override val isRepeatable = true | ||||
|  | ||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||
|       setOperatorFunction(Operator()) | ||||
|       setOperatorFunction(Operator(supportsMultipleCursors = false)) // TODO | ||||
|       executeNormalWithoutMapping(injector.parser.parseKeys("g@"), editor.ij) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private class VSurroundHandler : ExtensionHandler { | ||||
|     override fun execute(editor: VimEditor, context: ExecutionContext) { | ||||
|       val selectionStart = editor.ij.caretModel.primaryCaret.selectionStart | ||||
|       // NB: Operator ignores SelectionType anyway | ||||
|       if (!Operator().apply(editor, context, SelectionType.CHARACTER_WISE)) { | ||||
|       if (!Operator(supportsMultipleCursors = true).apply(editor, context, SelectionType.CHARACTER_WISE)) { | ||||
|         return | ||||
|       } | ||||
|       runWriteAction { | ||||
|         // Leave visual mode | ||||
|         executeNormalWithoutMapping(injector.parser.parseKeys("<Esc>"), editor.ij) | ||||
|         editor.ij.caretModel.moveToOffset(selectionStart) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| @@ -120,6 +111,10 @@ class VimSurroundExtension : VimExtension { | ||||
|  | ||||
|     companion object { | ||||
|       fun change(editor: VimEditor, context: ExecutionContext, charFrom: Char, newSurround: Pair<String, String>?) { | ||||
|         editor.ij.runWithEveryCaretAndRestore { changeAtCaret(editor, context, charFrom, newSurround) } | ||||
|       } | ||||
|        | ||||
|       fun changeAtCaret(editor: VimEditor, context: ExecutionContext, charFrom: Char, newSurround: Pair<String, String>?) { | ||||
|         // Save old register values for carets | ||||
|         val surroundings = editor.sortedCarets() | ||||
|           .map { | ||||
| @@ -137,7 +132,7 @@ class VimSurroundExtension : VimExtension { | ||||
|           val innerValue = if (registerValue.isNullOrEmpty()) null else registerValue | ||||
|           it.innerText = innerValue | ||||
|  | ||||
|           val lineEndOffset = injector.engineEditorHelper.getLineEndOffset(editor, it.caret.getLine().line, false) | ||||
|           val lineEndOffset = editor.getLineEndOffset(it.caret.getLine().line, false) | ||||
|           if (lineEndOffset == it.caret.offset.point) { | ||||
|             it.isLineEnd = true | ||||
|           } | ||||
| @@ -218,27 +213,45 @@ class VimSurroundExtension : VimExtension { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private class Operator : OperatorFunction { | ||||
|   private class Operator(private val supportsMultipleCursors: Boolean) : OperatorFunction { | ||||
|     override fun apply(vimEditor: VimEditor, context: ExecutionContext, selectionType: SelectionType): Boolean { | ||||
|       val editor = vimEditor.ij | ||||
|       val c = getChar(editor) | ||||
|       if (c.code == 0) return true | ||||
|  | ||||
|       val pair = getOrInputPair(c, editor) ?: return false | ||||
|       // XXX: Will it work with line-wise or block-wise selections? | ||||
|       val range = getSurroundRange(editor) ?: return false | ||||
|  | ||||
|       runWriteAction { | ||||
|         val change = VimPlugin.getChange() | ||||
|         val leftSurround = pair.first | ||||
|         val primaryCaret = editor.caretModel.primaryCaret | ||||
|         change.insertText(IjVimEditor(editor), IjVimCaret(primaryCaret), range.startOffset, leftSurround) | ||||
|         change.insertText(IjVimEditor(editor), IjVimCaret(primaryCaret), range.endOffset + leftSurround.length, pair.second) | ||||
|         if (supportsMultipleCursors) { | ||||
|           editor.runWithEveryCaretAndRestore { | ||||
|             applyOnce(editor, change, pair) | ||||
|           } | ||||
|         } | ||||
|         else { | ||||
|           applyOnce(editor, change, pair) | ||||
|           // Jump back to start | ||||
|           executeNormalWithoutMapping(injector.parser.parseKeys("`["), editor) | ||||
|         } | ||||
|       } | ||||
|       return true | ||||
|     } | ||||
|      | ||||
|     private fun applyOnce(editor: Editor, change: VimChangeGroup, pair: Pair<String, String>) { | ||||
|       // XXX: Will it work with line-wise or block-wise selections? | ||||
|       val range = getSurroundRange(editor) | ||||
|       if (range != null) { | ||||
|         val primaryCaret = editor.caretModel.primaryCaret | ||||
|         change.insertText(IjVimEditor(editor), IjVimCaret(primaryCaret), range.startOffset, pair.first) | ||||
|         change.insertText( | ||||
|           IjVimEditor(editor), | ||||
|           IjVimCaret(primaryCaret), | ||||
|           range.endOffset + pair.first.length, | ||||
|           pair.second | ||||
|         ) | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     private fun getSurroundRange(editor: Editor): TextRange? = when (editor.editorMode) { | ||||
|       VimStateMachine.Mode.COMMAND -> VimPlugin.getMark().getChangeMarks(editor.vim) | ||||
|       VimStateMachine.Mode.VISUAL -> editor.caretModel.primaryCaret.run { TextRange(selectionStart, selectionEnd) } | ||||
|   | ||||
| @@ -1,28 +1,15 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.textobjentire; | ||||
|  | ||||
| import com.intellij.openapi.editor.Caret; | ||||
| 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.VimInjectorKt; | ||||
| import com.maddyhome.idea.vim.api.*; | ||||
| import com.maddyhome.idea.vim.command.*; | ||||
| import com.maddyhome.idea.vim.command.MappingMode; | ||||
| import com.maddyhome.idea.vim.common.TextRange; | ||||
| @@ -41,7 +28,6 @@ import java.util.EnumSet; | ||||
|  | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping; | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing; | ||||
| import static com.maddyhome.idea.vim.group.visual.VisualGroupKt.vimSetSelection; | ||||
|  | ||||
| /** | ||||
|  * Port of vim-entire: | ||||
| @@ -106,7 +92,7 @@ public class VimTextObjEntireExtension implements VimExtension { | ||||
|       @Nullable | ||||
|       @Override | ||||
|       public TextRange getRange(@NotNull VimEditor editor, | ||||
|                                 @NotNull VimCaret caret, | ||||
|                                 @NotNull ImmutableVimCaret caret, | ||||
|                                 @NotNull ExecutionContext context, | ||||
|                                 int count, | ||||
|                                 int rawCount, | ||||
| @@ -155,7 +141,7 @@ public class VimTextObjEntireExtension implements VimExtension { | ||||
|           if (range != null) { | ||||
|             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { | ||||
|               if (vimStateMachine.getMode() == VimStateMachine.Mode.VISUAL) { | ||||
|                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||
|                 com.maddyhome.idea.vim.group.visual.EngineVisualGroupKt.vimSetSelection(new IjVimCaret(caret), range.getStartOffset(), range.getEndOffset() - 1, true); | ||||
|               } else { | ||||
|                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); | ||||
|               } | ||||
|   | ||||
| @@ -1,33 +1,20 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.extension.textobjindent; | ||||
|  | ||||
| import com.intellij.openapi.editor.Caret; | ||||
| 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.VimInjectorKt; | ||||
| import com.maddyhome.idea.vim.api.*; | ||||
| import com.maddyhome.idea.vim.command.*; | ||||
| import com.maddyhome.idea.vim.command.MappingMode; | ||||
| import com.maddyhome.idea.vim.common.TextRange; | ||||
| import com.maddyhome.idea.vim.extension.VimExtension; | ||||
| import com.maddyhome.idea.vim.extension.ExtensionHandler; | ||||
| import com.maddyhome.idea.vim.extension.VimExtension; | ||||
| import com.maddyhome.idea.vim.group.visual.EngineVisualGroupKt; | ||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | ||||
| import com.maddyhome.idea.vim.helper.InlayHelperKt; | ||||
| import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor; | ||||
| @@ -41,7 +28,6 @@ import java.util.EnumSet; | ||||
|  | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putExtensionHandlerMapping; | ||||
| import static com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMapping; | ||||
| import static com.maddyhome.idea.vim.group.visual.VisualGroupKt.vimSetSelection; | ||||
|  | ||||
| /** | ||||
|  * Port of vim-indent-object: | ||||
| @@ -109,7 +95,7 @@ public class VimIndentObject implements VimExtension { | ||||
|       @Nullable | ||||
|       @Override | ||||
|       public TextRange getRange(@NotNull VimEditor editor, | ||||
|                                 @NotNull VimCaret caret, | ||||
|                                 @NotNull ImmutableVimCaret caret, | ||||
|                                 @NotNull ExecutionContext context, | ||||
|                                 int count, | ||||
|                                 int rawCount, | ||||
| @@ -283,7 +269,7 @@ public class VimIndentObject implements VimExtension { | ||||
|           if (range != null) { | ||||
|             try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { | ||||
|               if (vimStateMachine.getMode() == VimStateMachine.Mode.VISUAL) { | ||||
|                 vimSetSelection(caret, range.getStartOffset(), range.getEndOffset() - 1, true); | ||||
|                 EngineVisualGroupKt.vimSetSelection(new IjVimCaret(caret), range.getStartOffset(), range.getEndOffset() - 1, true); | ||||
|               } else { | ||||
|                 InlayHelperKt.moveToInlayAwareOffset(caret, range.getStartOffset()); | ||||
|               } | ||||
|   | ||||
| @@ -1,24 +1,13 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.group; | ||||
|  | ||||
| import com.google.common.base.Splitter; | ||||
| import com.google.common.collect.ImmutableSet; | ||||
| import com.google.common.collect.Lists; | ||||
| import com.intellij.codeInsight.actions.AsyncActionExecutionService; | ||||
| import com.intellij.openapi.Disposable; | ||||
| @@ -28,7 +17,6 @@ import com.intellij.openapi.application.ApplicationManager; | ||||
| import com.intellij.openapi.command.CommandProcessor; | ||||
| import com.intellij.openapi.command.UndoConfirmationPolicy; | ||||
| import com.intellij.openapi.diagnostic.Logger; | ||||
| import com.intellij.openapi.editor.Caret; | ||||
| import com.intellij.openapi.editor.Document; | ||||
| import com.intellij.openapi.editor.Editor; | ||||
| import com.intellij.openapi.editor.LogicalPosition; | ||||
| @@ -45,7 +33,6 @@ import com.intellij.psi.codeStyle.CodeStyleManager; | ||||
| import com.intellij.psi.util.PsiUtilBase; | ||||
| import com.intellij.util.containers.ContainerUtil; | ||||
| import com.maddyhome.idea.vim.EventFacade; | ||||
| import com.maddyhome.idea.vim.VimPlugin; | ||||
| import com.maddyhome.idea.vim.api.*; | ||||
| import com.maddyhome.idea.vim.command.*; | ||||
| import com.maddyhome.idea.vim.common.IndentConfig; | ||||
| @@ -68,80 +55,27 @@ import kotlin.Pair; | ||||
| import kotlin.Unit; | ||||
| import kotlin.jvm.functions.Function0; | ||||
| import kotlin.text.StringsKt; | ||||
| import org.jetbrains.annotations.NonNls; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| import org.jetbrains.annotations.Nullable; | ||||
| import org.jetbrains.annotations.TestOnly; | ||||
|  | ||||
| import java.math.BigInteger; | ||||
| import java.util.*; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.Comparator; | ||||
| import java.util.List; | ||||
|  | ||||
| import static com.maddyhome.idea.vim.api.VimInjectorKt.injector; | ||||
| import static com.maddyhome.idea.vim.mark.VimMarkConstants.MARK_CHANGE_POS; | ||||
|  | ||||
| /** | ||||
|  * Provides all the insert/replace related functionality | ||||
|  */ | ||||
| public class ChangeGroup extends VimChangeGroupBase { | ||||
|  | ||||
|   public static final String VIM_MOTION_BIG_WORD_RIGHT = "VimMotionBigWordRightAction"; | ||||
|   public static final String VIM_MOTION_WORD_RIGHT = "VimMotionWordRightAction"; | ||||
|   public static final String VIM_MOTION_CAMEL_RIGHT = "VimMotionCamelRightAction"; | ||||
|   private static final String VIM_MOTION_WORD_END_RIGHT = "VimMotionWordEndRightAction"; | ||||
|   private static final String VIM_MOTION_BIG_WORD_END_RIGHT = "VimMotionBigWordEndRightAction"; | ||||
|   private static final String VIM_MOTION_CAMEL_END_RIGHT = "VimMotionCamelEndRightAction"; | ||||
|   private static final ImmutableSet<String> wordMotions = ImmutableSet.of(VIM_MOTION_WORD_RIGHT, VIM_MOTION_BIG_WORD_RIGHT, VIM_MOTION_CAMEL_RIGHT); | ||||
|  | ||||
|   @NonNls private static final String HEX_START = "0x"; | ||||
|   @NonNls private static final String MAX_HEX_INTEGER = "ffffffffffffffff"; | ||||
|  | ||||
|   private final List<VimInsertListener> insertListeners = ContainerUtil.createLockFreeCopyOnWriteList(); | ||||
|  | ||||
|   private long lastShownTime = 0L; | ||||
|  | ||||
|   /** | ||||
|    * Inserts a new line above the caret position | ||||
|    * | ||||
|    * @param editor The editor to insert into | ||||
|    * @param caret  The caret to insert above | ||||
|    * @param col    The column to indent to | ||||
|    */ | ||||
|   private void insertNewLineAbove(@NotNull VimEditor editor, @NotNull VimCaret caret, int col) { | ||||
|     if (((IjVimEditor) editor).getEditor().isOneLineMode()) return; | ||||
|  | ||||
|     boolean firstLiner = false; | ||||
|     if (((IjVimCaret) caret).getCaret().getVisualPosition().line == 0) { | ||||
|       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineStart(editor, | ||||
|                                                                                       caret)); | ||||
|       firstLiner = true; | ||||
|     } | ||||
|     else { | ||||
|       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().getVerticalMotionOffset(editor, caret, -1)); | ||||
|       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); | ||||
|     } | ||||
|  | ||||
|     UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), VimStateMachine.Mode.INSERT); | ||||
|     insertText(editor, caret, "\n" + IndentConfig.create(((IjVimEditor) editor).getEditor()).createIndentBySize(col)); | ||||
|  | ||||
|     if (firstLiner) { | ||||
|       injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().getVerticalMotionOffset(editor, caret, -1)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Inserts a new line below the caret position | ||||
|    * | ||||
|    * @param editor The editor to insert into | ||||
|    * @param caret  The caret to insert after | ||||
|    * @param col    The column to indent to | ||||
|    */ | ||||
|   private void insertNewLineBelow(@NotNull VimEditor editor, @NotNull VimCaret caret, int col) { | ||||
|     if (editor.isOneLineMode()) return; | ||||
|  | ||||
|     caret.moveToOffset(injector.getMotion().moveCaretToLineEnd(editor, caret)); | ||||
|     editor.setVimChangeActionSwitchMode(VimStateMachine.Mode.INSERT); | ||||
|     insertText(editor, caret, "\n" + IndentConfig.create(((IjVimEditor) editor).getEditor()).createIndentBySize(col)); | ||||
|   } | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -200,15 +134,18 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     } | ||||
|     final Command motion = argument.getMotion(); | ||||
|     if (!isChange && !motion.isLinewiseMotion()) { | ||||
|       VimLogicalPosition start = editor.offsetToLogicalPosition(range.getStartOffset()); | ||||
|       VimLogicalPosition end = editor.offsetToLogicalPosition(range.getEndOffset()); | ||||
|       BufferPosition start = editor.offsetToBufferPosition(range.getStartOffset()); | ||||
|       BufferPosition end = editor.offsetToBufferPosition(range.getEndOffset()); | ||||
|       if (start.getLine() != end.getLine()) { | ||||
|         if (!SearchHelper.anyNonWhitespace(((IjVimEditor) editor).getEditor(), range.getStartOffset(), -1) && | ||||
|             !SearchHelper.anyNonWhitespace(((IjVimEditor) editor).getEditor(), range.getEndOffset(), 1)) { | ||||
|         int offset1 = range.getStartOffset(); | ||||
|         if (!EngineEditorHelperKt.anyNonWhitespace(editor, offset1, -1)) { | ||||
|           int offset = range.getEndOffset(); | ||||
|           if (!EngineEditorHelperKt.anyNonWhitespace(editor, offset, 1)) { | ||||
|             type = SelectionType.LINE_WISE; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     return new Pair<>(range, type); | ||||
|   } | ||||
|  | ||||
| @@ -235,93 +172,6 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|    * @param argument The motion command | ||||
|    * @return true if able to delete the text, false if not | ||||
|    */ | ||||
|   @Override | ||||
|   public boolean changeMotion(@NotNull VimEditor editor, | ||||
|                               @NotNull VimCaret caret, | ||||
|                               @NotNull ExecutionContext context, | ||||
|                               @NotNull Argument argument, | ||||
|                               @NotNull OperatorArguments operatorArguments) { | ||||
|     int count0 = operatorArguments.getCount0(); | ||||
|     // Vim treats cw as ce and cW as cE if cursor is on a non-blank character | ||||
|     final Command motion = argument.getMotion(); | ||||
|  | ||||
|     String id = motion.getAction().getId(); | ||||
|     boolean kludge = false; | ||||
|     boolean bigWord = id.equals(VIM_MOTION_BIG_WORD_RIGHT); | ||||
|     final CharSequence chars = editor.text(); | ||||
|     final int offset = caret.getOffset().getPoint(); | ||||
|     int fileSize = ((int)editor.fileSize()); | ||||
|     if (fileSize > 0 && offset < fileSize) { | ||||
|       final CharacterHelper.CharacterType charType = CharacterHelper.charType(chars.charAt(offset), bigWord); | ||||
|       if (charType != CharacterHelper.CharacterType.WHITESPACE) { | ||||
|         final boolean lastWordChar = | ||||
|           offset >= fileSize - 1 || CharacterHelper.charType(chars.charAt(offset + 1), bigWord) != charType; | ||||
|         if (wordMotions.contains(id) && lastWordChar && motion.getCount() == 1) { | ||||
|           final boolean res = deleteCharacter(editor, caret, 1, true, operatorArguments); | ||||
|           if (res) { | ||||
|             editor.setVimChangeActionSwitchMode(VimStateMachine.Mode.INSERT); | ||||
|           } | ||||
|           return res; | ||||
|         } | ||||
|         switch (id) { | ||||
|           case VIM_MOTION_WORD_RIGHT: | ||||
|             kludge = true; | ||||
|             motion.setAction(injector.getActionExecutor().findVimActionOrDie(VIM_MOTION_WORD_END_RIGHT)); | ||||
|  | ||||
|             break; | ||||
|           case VIM_MOTION_BIG_WORD_RIGHT: | ||||
|             kludge = true; | ||||
|             motion.setAction(injector.getActionExecutor().findVimActionOrDie(VIM_MOTION_BIG_WORD_END_RIGHT)); | ||||
|  | ||||
|             break; | ||||
|           case VIM_MOTION_CAMEL_RIGHT: | ||||
|             kludge = true; | ||||
|             motion.setAction(injector.getActionExecutor().findVimActionOrDie(VIM_MOTION_CAMEL_END_RIGHT)); | ||||
|  | ||||
|             break; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (kludge) { | ||||
|       int cnt = operatorArguments.getCount1() * motion.getCount(); | ||||
|       int pos1 = injector.getSearchHelper().findNextWordEnd(chars, offset, fileSize, cnt, bigWord, false); | ||||
|       int pos2 = injector.getSearchHelper().findNextWordEnd(chars, pos1, fileSize, -cnt, bigWord, false); | ||||
|       if (logger.isDebugEnabled()) { | ||||
|         logger.debug("pos=" + offset); | ||||
|         logger.debug("pos1=" + pos1); | ||||
|         logger.debug("pos2=" + pos2); | ||||
|         logger.debug("count=" + operatorArguments.getCount1()); | ||||
|         logger.debug("arg.count=" + motion.getCount()); | ||||
|       } | ||||
|       if (pos2 == offset) { | ||||
|         if (operatorArguments.getCount1() > 1) { | ||||
|           count0--; | ||||
|         } | ||||
|         else if (motion.getCount() > 1) { | ||||
|           motion.setCount(motion.getCount() - 1); | ||||
|         } | ||||
|         else { | ||||
|           motion.setFlags(EnumSet.noneOf(CommandFlags.class)); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (injector.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, OptionConstants.experimentalapiName, OptionConstants.experimentalapiName)) { | ||||
|       Pair<TextRange, SelectionType> deleteRangeAndType = | ||||
|         getDeleteRangeAndType2(editor, caret, context, argument, true, operatorArguments.withCount0(count0)); | ||||
|       if (deleteRangeAndType == null) return false; | ||||
|       //ChangeGroupKt.changeRange(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), deleteRangeAndType.getFirst(), deleteRangeAndType.getSecond(), ((IjExecutionContext) context).getContext()); | ||||
|       return true; | ||||
|     } | ||||
|     else { | ||||
|       Pair<TextRange, SelectionType> deleteRangeAndType = | ||||
|         getDeleteRangeAndType(editor, caret, context, argument, true, operatorArguments.withCount0(count0)); | ||||
|       if (deleteRangeAndType == null) return false; | ||||
|       return changeRange(editor, caret, deleteRangeAndType.getFirst(), deleteRangeAndType.getSecond(), context, | ||||
|                          operatorArguments); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Toggles the case of count characters | ||||
| @@ -333,12 +183,12 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|    */ | ||||
|   @Override | ||||
|   public boolean changeCaseToggleCharacter(@NotNull VimEditor editor, @NotNull VimCaret caret, int count) { | ||||
|     final int offset = VimPlugin.getMotion().getOffsetOfHorizontalMotion(editor, caret, count, true); | ||||
|     final int offset = injector.getMotion().getOffsetOfHorizontalMotion(editor, caret, count, true); | ||||
|     if (offset == -1) { | ||||
|       return false; | ||||
|     } | ||||
|     changeCase(editor, ((IjVimCaret) caret).getCaret().getOffset(), offset, CharacterHelper.CASE_TOGGLE); | ||||
|     injector.getMotion().moveCaret(editor, caret, EditorHelper.normalizeOffset(((IjVimEditor) editor).getEditor(), offset, false)); | ||||
|     changeCase(editor, editor.currentCaret().getOffset().getPoint(), offset, CharacterHelper.CASE_TOGGLE); | ||||
|     caret.moveToOffset(EngineEditorHelperKt.normalizeOffset(editor, offset, false)); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
| @@ -349,11 +199,11 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|                              boolean append, | ||||
|                              @NotNull OperatorArguments operatorArguments) { | ||||
|     final int lines = VimChangeGroupBase.Companion.getLinesCountInVisualBlock(editor, range); | ||||
|     final VimLogicalPosition startPosition = editor.offsetToLogicalPosition(range.getStartOffset()); | ||||
|     final BufferPosition startPosition = editor.offsetToBufferPosition(range.getStartOffset()); | ||||
|  | ||||
|     boolean visualBlockMode = operatorArguments.getMode() == VimStateMachine.Mode.VISUAL && | ||||
|                               operatorArguments.getSubMode() == VimStateMachine.SubMode.VISUAL_BLOCK; | ||||
|     for (Caret caret : ((IjVimEditor) editor).getEditor().getCaretModel().getAllCarets()) { | ||||
|     for (VimCaret caret : editor.carets()) { | ||||
|       final int line = startPosition.getLine(); | ||||
|       int column = startPosition.getColumn(); | ||||
|       if (!visualBlockMode) { | ||||
| @@ -361,20 +211,20 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|       } | ||||
|       else if (append) { | ||||
|         column += range.getMaxLength(); | ||||
|         if (UserDataManager.getVimLastColumn(caret) == VimMotionGroupBase.LAST_COLUMN) { | ||||
|         if (caret.getVimLastColumn() == VimMotionGroupBase.LAST_COLUMN) { | ||||
|           column = VimMotionGroupBase.LAST_COLUMN; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       final int lineLength = EditorHelper.getLineLength(((IjVimEditor) editor).getEditor(), line); | ||||
|       final int lineLength = EngineEditorHelperKt.lineLength(editor, line); | ||||
|       if (column < VimMotionGroupBase.LAST_COLUMN && lineLength < column) { | ||||
|         final String pad = EditorHelper.pad(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), line, column); | ||||
|         final int offset = ((IjVimEditor) editor).getEditor().getDocument().getLineEndOffset(line); | ||||
|         insertText(editor, new IjVimCaret(caret), offset, pad); | ||||
|         final int offset = editor.getLineEndOffset(line); | ||||
|         insertText(editor, caret, offset, pad); | ||||
|       } | ||||
|  | ||||
|       if (visualBlockMode || !append) { | ||||
|         InlayHelperKt.moveToInlayAwareLogicalPosition(caret, new LogicalPosition(line, column)); | ||||
|         InlayHelperKt.moveToInlayAwareLogicalPosition(((IjVimCaret)caret).getCaret(), new LogicalPosition(line, column)); | ||||
|       } | ||||
|       if (visualBlockMode) { | ||||
|         setInsertRepeat(lines, column, append); | ||||
| @@ -407,7 +257,7 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     for (int i = ends.length - 1; i >= 0; i--) { | ||||
|       changeCase(editor, starts[i], ends[i], type); | ||||
|     } | ||||
|     injector.getMotion().moveCaret(editor, caret, range.getStartOffset()); | ||||
|     caret.moveToOffset(range.getStartOffset()); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
| @@ -425,9 +275,9 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|       end = start; | ||||
|       start = t; | ||||
|     } | ||||
|     end = EditorHelper.normalizeOffset(((IjVimEditor) editor).getEditor(), end); | ||||
|     end = EngineEditorHelperKt.normalizeOffset(editor, end, true); | ||||
|  | ||||
|     CharSequence chars = ((IjVimEditor) editor).getEditor().getDocument().getCharsSequence(); | ||||
|     CharSequence chars = editor.text(); | ||||
|     StringBuilder sb = new StringBuilder(); | ||||
|     for (int i = start; i < end; i++) { | ||||
|       sb.append(CharacterHelper.changeCase(chars.charAt(i), type)); | ||||
| @@ -435,68 +285,10 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     replaceText(editor, start, end, sb.toString()); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Deletes the range of text and enters insert mode | ||||
|    * | ||||
|    * @param editor            The editor to change | ||||
|    * @param caret             The caret to be moved after range deletion | ||||
|    * @param range             The range to change | ||||
|    * @param type              The type of the range | ||||
|    * @param operatorArguments | ||||
|    * @return true if able to delete the range, false if not | ||||
|    */ | ||||
|   @Override | ||||
|   public boolean changeRange(@NotNull VimEditor editor, | ||||
|                              @NotNull VimCaret caret, | ||||
|                              @NotNull TextRange range, | ||||
|                              @NotNull SelectionType type, | ||||
|                              @Nullable ExecutionContext context, | ||||
|                              @NotNull OperatorArguments operatorArguments) { | ||||
|     int col = 0; | ||||
|     int lines = 0; | ||||
|     if (type == SelectionType.BLOCK_WISE) { | ||||
|       lines = VimChangeGroupBase.Companion.getLinesCountInVisualBlock(editor, range); | ||||
|       col = editor.offsetToLogicalPosition(range.getStartOffset()).getColumn(); | ||||
|       if (caret.getVimLastColumn() == VimMotionGroupBase.LAST_COLUMN) { | ||||
|         col = VimMotionGroupBase.LAST_COLUMN; | ||||
|       } | ||||
|     } | ||||
|     boolean after = range.getEndOffset() >= editor.fileSize(); | ||||
|  | ||||
|     final VimLogicalPosition lp = editor.offsetToLogicalPosition(injector.getMotion().moveCaretToLineStartSkipLeading(editor, caret)); | ||||
|  | ||||
|     boolean res = deleteRange(editor, caret, range, type, true, operatorArguments); | ||||
|     if (res) { | ||||
|       if (type == SelectionType.LINE_WISE) { | ||||
|         // Please don't use `getDocument().getText().isEmpty()` because it converts CharSequence into String | ||||
|         if (editor.fileSize() == 0) { | ||||
|           insertBeforeCursor(editor, context); | ||||
|         } | ||||
|         else if (after && !EngineEditorHelperKt.endsWithNewLine(editor)) { | ||||
|           insertNewLineBelow(editor, caret, lp.getColumn()); | ||||
|         } | ||||
|         else { | ||||
|           insertNewLineAbove(editor, caret, lp.getColumn()); | ||||
|         } | ||||
|       } | ||||
|       else { | ||||
|         if (type == SelectionType.BLOCK_WISE) { | ||||
|           setInsertRepeat(lines, col, false); | ||||
|         } | ||||
|         UserDataManager.setVimChangeActionSwitchMode(((IjVimEditor) editor).getEditor(), VimStateMachine.Mode.INSERT); | ||||
|       } | ||||
|     } | ||||
|     else { | ||||
|       insertBeforeCursor(editor, context); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   private void restoreCursor(@NotNull VimEditor editor, @NotNull VimCaret caret, int startLine) { | ||||
|     if (!caret.equals(editor.primaryCaret())) { | ||||
|       ((IjVimEditor) editor).getEditor().getCaretModel().addCaret( | ||||
|         ((IjVimEditor) editor).getEditor().offsetToVisualPosition(VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, startLine)), false); | ||||
|         ((IjVimEditor) editor).getEditor().offsetToVisualPosition(injector.getMotion().moveCaretToLineStartSkipLeading(editor, startLine)), false); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -542,14 +334,15 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|   private boolean reformatCodeRange(@NotNull VimEditor editor, @NotNull VimCaret caret, @NotNull TextRange range) { | ||||
|     int[] starts = range.getStartOffsets(); | ||||
|     int[] ends = range.getEndOffsets(); | ||||
|     final int firstLine = editor.offsetToLogicalPosition(range.getStartOffset()).getLine(); | ||||
|     final int firstLine = editor.offsetToBufferPosition(range.getStartOffset()).getLine(); | ||||
|     for (int i = ends.length - 1; i >= 0; i--) { | ||||
|       final int startOffset = EditorHelper.getLineStartForOffset(((IjVimEditor) editor).getEditor(), starts[i]); | ||||
|       final int endOffset = EditorHelper.getLineEndForOffset(((IjVimEditor) editor).getEditor(), ends[i] - (startOffset == ends[i] ? 0 : 1)); | ||||
|       final int startOffset = EngineEditorHelperKt.getLineStartForOffset(editor, starts[i]); | ||||
|       final int offset = ends[i] - (startOffset == ends[i] ? 0 : 1); | ||||
|       final int endOffset = EngineEditorHelperKt.getLineEndForOffset(editor, offset); | ||||
|       reformatCode(editor, startOffset, endOffset); | ||||
|     } | ||||
|     final int newOffset = VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, firstLine); | ||||
|     injector.getMotion().moveCaret(editor, caret, newOffset); | ||||
|     final int newOffset = injector.getMotion().moveCaretToLineStartSkipLeading(editor, firstLine); | ||||
|     caret.moveToOffset(newOffset); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
| @@ -580,8 +373,8 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|                               @NotNull VimCaret caret, | ||||
|                               @NotNull ExecutionContext context, | ||||
|                               @NotNull TextRange range) { | ||||
|     final int startOffset = injector.getEngineEditorHelper().getLineStartForOffset(editor, range.getStartOffset()); | ||||
|     final int endOffset = injector.getEngineEditorHelper().getLineEndForOffset(editor, range.getEndOffset()); | ||||
|     final int startOffset = EngineEditorHelperKt.getLineStartForOffset(editor, range.getStartOffset()); | ||||
|     final int endOffset = EngineEditorHelperKt.getLineEndForOffset(editor, range.getEndOffset()); | ||||
|  | ||||
|     Editor ijEditor = ((IjVimEditor)editor).getEditor(); | ||||
|     VisualModeHelperKt.vimSetSystemSelectionSilently(ijEditor.getSelectionModel(), startOffset, endOffset); | ||||
| @@ -590,14 +383,14 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     Function0<Unit> actionExecution = () -> { | ||||
|       NativeAction joinLinesAction = VimInjectorKt.getInjector().getNativeActionManager().getIndentLines(); | ||||
|       if (joinLinesAction != null) { | ||||
|         VimInjectorKt.getInjector().getActionExecutor().executeAction(joinLinesAction, context); | ||||
|         VimInjectorKt.getInjector().getActionExecutor().executeAction(editor, joinLinesAction, context); | ||||
|       } | ||||
|       return null; | ||||
|     }; | ||||
|     Function0<Unit> afterAction = () -> { | ||||
|       final int firstLine = editor.offsetToLogicalPosition(Math.min(startOffset, endOffset)).getLine(); | ||||
|       final int newOffset = VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, firstLine); | ||||
|       injector.getMotion().moveCaret(editor, caret, newOffset); | ||||
|       final int firstLine = editor.offsetToBufferPosition(Math.min(startOffset, endOffset)).getLine(); | ||||
|       final int newOffset = injector.getMotion().moveCaretToLineStartSkipLeading(editor, firstLine); | ||||
|       caret.moveToOffset(newOffset); | ||||
|       restoreCursor(editor, caret, ((IjVimCaret)caret).getCaret().getLogicalPosition().line); | ||||
|       return null; | ||||
|     }; | ||||
| @@ -617,8 +410,8 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|                           int lines, | ||||
|                           int dir, | ||||
|                           @NotNull OperatorArguments operatorArguments) { | ||||
|     int start = ((IjVimCaret) caret).getCaret().getOffset(); | ||||
|     int end = VimPlugin.getMotion().moveCaretToLineEndOffset(editor, caret, lines - 1, true); | ||||
|     int start = caret.getOffset().getPoint(); | ||||
|     int end = injector.getMotion().moveCaretToRelativeLineEnd(editor, caret, lines - 1, true); | ||||
|     indentRange(editor, caret, context, new TextRange(start, end), 1, dir, operatorArguments); | ||||
|   } | ||||
|  | ||||
| @@ -636,23 +429,6 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Replace text in the editor | ||||
|    * | ||||
|    * @param editor The editor to replace text in | ||||
|    * @param start  The start offset to change | ||||
|    * @param end    The end offset to change | ||||
|    * @param str    The new text | ||||
|    */ | ||||
|   @Override | ||||
|   public void replaceText(@NotNull VimEditor editor, int start, int end, @NotNull String str) { | ||||
|     ((IjVimEditor) editor).getEditor().getDocument().replaceString(start, end, str); | ||||
|  | ||||
|     final int newEnd = start + str.length(); | ||||
|     VimPlugin.getMark().setChangeMarks(editor, new TextRange(start, newEnd)); | ||||
|     VimPlugin.getMark().setMark(editor, MARK_CHANGE_POS, newEnd); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void indentRange(@NotNull VimEditor editor, | ||||
|                           @NotNull VimCaret caret, | ||||
| @@ -665,40 +441,40 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|       logger.debug("count=" + count); | ||||
|     } | ||||
|  | ||||
|     // Update the last column before we indent, or we might be retrieving the data for a line that no longer exists | ||||
|     UserDataManager.setVimLastColumn(((IjVimCaret) caret).getCaret(), InlayHelperKt.getInlayAwareVisualColumn(((IjVimCaret) caret).getCaret())); | ||||
|     // Remember the current caret column | ||||
|     final int intendedColumn = caret.getVimLastColumn(); | ||||
|  | ||||
|     IndentConfig indentConfig = IndentConfig.create(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext()); | ||||
|  | ||||
|     final int sline = editor.offsetToLogicalPosition(range.getStartOffset()).getLine(); | ||||
|     final VimLogicalPosition endLogicalPosition = editor.offsetToLogicalPosition(range.getEndOffset()); | ||||
|     final int sline = editor.offsetToBufferPosition(range.getStartOffset()).getLine(); | ||||
|     final BufferPosition endLogicalPosition = editor.offsetToBufferPosition(range.getEndOffset()); | ||||
|     final int eline = | ||||
|       endLogicalPosition.getColumn() == 0 ? Math.max(endLogicalPosition.getLine() - 1, 0) : endLogicalPosition.getLine(); | ||||
|  | ||||
|     if (range.isMultiple()) { | ||||
|       final int from = editor.offsetToLogicalPosition(range.getStartOffset()).getColumn(); | ||||
|       final int from = editor.offsetToBufferPosition(range.getStartOffset()).getColumn(); | ||||
|       if (dir == 1) { | ||||
|         // Right shift blockwise selection | ||||
|         final String indent = indentConfig.createIndentByCount(count); | ||||
|  | ||||
|         for (int l = sline; l <= eline; l++) { | ||||
|           int len = EditorHelper.getLineLength(((IjVimEditor) editor).getEditor(), l); | ||||
|           int len = EngineEditorHelperKt.lineLength(editor, l); | ||||
|           if (len > from) { | ||||
|             VimLogicalPosition spos = new VimLogicalPosition(l, from, false); | ||||
|             BufferPosition spos = new BufferPosition(l, from, false); | ||||
|             insertText(editor, caret, spos, indent); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       else { | ||||
|         // Left shift blockwise selection | ||||
|         CharSequence chars = ((IjVimEditor) editor).getEditor().getDocument().getCharsSequence(); | ||||
|         CharSequence chars = editor.text(); | ||||
|         for (int l = sline; l <= eline; l++) { | ||||
|           int len = EditorHelper.getLineLength(((IjVimEditor) editor).getEditor(), l); | ||||
|           int len = EngineEditorHelperKt.lineLength(editor, l); | ||||
|           if (len > from) { | ||||
|             VimLogicalPosition spos = new VimLogicalPosition(l, from, false); | ||||
|             VimLogicalPosition epos = new VimLogicalPosition(l, from + indentConfig.getTotalIndent(count) - 1, false); | ||||
|             int wsoff = editor.logicalPositionToOffset(spos); | ||||
|             int weoff = editor.logicalPositionToOffset(epos); | ||||
|             BufferPosition spos = new BufferPosition(l, from, false); | ||||
|             BufferPosition epos = new BufferPosition(l, from + indentConfig.getTotalIndent(count) - 1, false); | ||||
|             int wsoff = editor.bufferPositionToOffset(spos); | ||||
|             int weoff = editor.bufferPositionToOffset(epos); | ||||
|             int pos; | ||||
|             for (pos = wsoff; pos <= weoff; pos++) { | ||||
|               if (CharacterHelper.charType(chars.charAt(pos), false) != CharacterHelper.CharacterType.WHITESPACE) { | ||||
| @@ -715,10 +491,10 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     else { | ||||
|       // Shift non-blockwise selection | ||||
|       for (int l = sline; l <= eline; l++) { | ||||
|         final int soff = injector.getEngineEditorHelper().getLineStartOffset(editor, l); | ||||
|         final int eoff = injector.getEngineEditorHelper().getLineEndOffset(editor, l, true); | ||||
|         final int woff = VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, l); | ||||
|         final int col = ((IjVimEditor) editor).getEditor().offsetToVisualPosition(woff).getColumn(); | ||||
|         final int soff = editor.getLineStartOffset(l); | ||||
|         final int eoff = EngineEditorHelperKt.getLineEndOffset(editor, l, true); | ||||
|         final int woff = injector.getMotion().moveCaretToLineStartSkipLeading(editor, l); | ||||
|         final int col = editor.offsetToVisualPosition(woff).getColumn(); | ||||
|         final int limit = Math.max(0, col + dir * indentConfig.getTotalIndent(count)); | ||||
|         if (col > 0 || soff != eoff) { | ||||
|           final String indent = indentConfig.createIndentBySize(limit); | ||||
| @@ -729,14 +505,15 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|  | ||||
|     if (!CommandStateHelper.inInsertMode(((IjVimEditor) editor).getEditor())) { | ||||
|       if (!range.isMultiple()) { | ||||
|         injector.getMotion().moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineWithStartOfLineOption(editor, sline, caret)); | ||||
|         // The caret has moved, so reset the intended column before trying to get the expected offset | ||||
|         VimCaret newCaret = caret.setVimLastColumnAndGetCaret(intendedColumn); | ||||
|         final int offset = injector.getMotion().moveCaretToLineWithStartOfLineOption(editor, sline, caret); | ||||
|         newCaret.moveToOffset(offset); | ||||
|       } | ||||
|       else { | ||||
|         injector.getMotion().moveCaret(editor, caret, range.getStartOffset()); | ||||
|         caret.moveToOffset(range.getStartOffset()); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     UserDataManager.setVimLastColumn(((IjVimCaret) caret).getCaret(), caret.getVisualPosition().getColumn()); | ||||
|   } | ||||
|  | ||||
|  | ||||
| @@ -756,8 +533,8 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     final int startOffset = ((IjVimEditor) editor).getEditor().getDocument().getLineStartOffset(startLine); | ||||
|     final int endOffset = ((IjVimEditor) editor).getEditor().getDocument().getLineEndOffset(endLine); | ||||
|     final int startOffset = editor.getLineStartOffset(startLine); | ||||
|     final int endOffset = editor.getLineEndOffset(endLine); | ||||
|  | ||||
|     return sortTextRange(editor, startOffset, endOffset, lineComparator); | ||||
|   } | ||||
| @@ -816,17 +593,17 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     String nf = ((VimString) VimPlugin.getOptionService().getOptionValue(new OptionScope.LOCAL(editor), OptionConstants.nrformatsName, OptionConstants.nrformatsName)).getValue(); | ||||
|     String nf = ((VimString) injector.getOptionService().getOptionValue(new OptionScope.LOCAL(editor), OptionConstants.nrformatsName, OptionConstants.nrformatsName)).getValue(); | ||||
|     boolean alpha = nf.contains("alpha"); | ||||
|     boolean hex = nf.contains("hex"); | ||||
|     boolean octal = nf.contains("octal"); | ||||
|  | ||||
|     @NotNull List<Pair<TextRange, SearchHelper.NumberType>> numberRanges = | ||||
|     @NotNull List<Pair<TextRange, NumberType>> numberRanges = | ||||
|       SearchHelper.findNumbersInRange(((IjVimEditor) editor).getEditor(), selectedRange, alpha, hex, octal); | ||||
|  | ||||
|     List<String> newNumbers = new ArrayList<>(); | ||||
|     for (int i = 0; i < numberRanges.size(); i++) { | ||||
|       Pair<TextRange, SearchHelper.NumberType> numberRange = numberRanges.get(i); | ||||
|       Pair<TextRange, NumberType> numberRange = numberRanges.get(i); | ||||
|       int iCount = avalanche ? (i + 1) * count : count; | ||||
|       String newNumber = changeNumberInRange(editor, numberRange, iCount, alpha, hex, octal); | ||||
|       newNumbers.add(newNumber); | ||||
| @@ -834,7 +611,7 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|  | ||||
|     for (int i = newNumbers.size() - 1; i >= 0; i--) { | ||||
|       // Replace text bottom up. In other direction ranges will be desynchronized after inc numbers like 99 | ||||
|       Pair<TextRange, SearchHelper.NumberType> rangeToReplace = numberRanges.get(i); | ||||
|       Pair<TextRange, NumberType> rangeToReplace = numberRanges.get(i); | ||||
|       String newNumber = newNumbers.get(i); | ||||
|       replaceText(editor, rangeToReplace.getFirst().getStartOffset(), rangeToReplace.getFirst().getEndOffset(), newNumber); | ||||
|     } | ||||
| @@ -846,12 +623,12 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|  | ||||
|   @Override | ||||
|   public boolean changeNumber(final @NotNull VimEditor editor, @NotNull VimCaret caret, final int count) { | ||||
|     final String nf = ((VimString) VimPlugin.getOptionService().getOptionValue(new OptionScope.LOCAL(editor), OptionConstants.nrformatsName, OptionConstants.nrformatsName)).getValue(); | ||||
|     final String nf = ((VimString) injector.getOptionService().getOptionValue(new OptionScope.LOCAL(editor), OptionConstants.nrformatsName, OptionConstants.nrformatsName)).getValue(); | ||||
|     final boolean alpha = nf.contains("alpha"); | ||||
|     final boolean hex = nf.contains("hex"); | ||||
|     final boolean octal = nf.contains("octal"); | ||||
|  | ||||
|     @Nullable Pair<TextRange, SearchHelper.NumberType> range = | ||||
|     @Nullable Pair<TextRange, NumberType> range = | ||||
|       SearchHelper.findNumberUnderCursor(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), alpha, hex, octal); | ||||
|     if (range == null) { | ||||
|       logger.debug("no number on line"); | ||||
| @@ -884,14 +661,14 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     strokes.add(chars); | ||||
|   } | ||||
|  | ||||
|   public @Nullable String changeNumberInRange(final @NotNull VimEditor editor, | ||||
|                                               Pair<TextRange, SearchHelper.NumberType> range, | ||||
|   private @Nullable String changeNumberInRange(final @NotNull VimEditor editor, | ||||
|                                               Pair<TextRange, NumberType> range, | ||||
|                                               final int count, | ||||
|                                               boolean alpha, | ||||
|                                               boolean hex, | ||||
|                                               boolean octal) { | ||||
|     String text = EditorHelper.getText(((IjVimEditor) editor).getEditor(), range.getFirst()); | ||||
|     SearchHelper.NumberType numberType = range.getSecond(); | ||||
|     String text = EngineEditorHelperKt.getText(editor, range.getFirst()); | ||||
|     NumberType numberType = range.getSecond(); | ||||
|     if (logger.isDebugEnabled()) { | ||||
|       logger.debug("found range " + range); | ||||
|       logger.debug("text=" + text); | ||||
| @@ -902,7 +679,7 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|     } | ||||
|  | ||||
|     char ch = text.charAt(0); | ||||
|     if (hex && SearchHelper.NumberType.HEX.equals(numberType)) { | ||||
|     if (hex && NumberType.HEX.equals(numberType)) { | ||||
|       if (!text.toLowerCase().startsWith(HEX_START)) { | ||||
|         throw new RuntimeException("Hex number should start with 0x: " + text); | ||||
|       } | ||||
| @@ -928,7 +705,7 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|  | ||||
|       number = text.substring(0, 2) + number; | ||||
|     } | ||||
|     else if (octal && SearchHelper.NumberType.OCT.equals(numberType) && text.length() > 1) { | ||||
|     else if (octal && NumberType.OCT.equals(numberType) && text.length() > 1) { | ||||
|       if (!text.startsWith("0")) throw new RuntimeException("Oct number should start with 0: " + text); | ||||
|       BigInteger num = new BigInteger(text, 8).add(BigInteger.valueOf(count)); | ||||
|  | ||||
| @@ -938,14 +715,14 @@ public class ChangeGroup extends VimChangeGroupBase { | ||||
|       number = num.toString(8); | ||||
|       number = "0" + StringsKt.padStart(number, text.length() - 1, '0'); | ||||
|     } | ||||
|     else if (alpha && SearchHelper.NumberType.ALPHA.equals(numberType)) { | ||||
|     else if (alpha && NumberType.ALPHA.equals(numberType)) { | ||||
|       if (!Character.isLetter(ch)) throw new RuntimeException("Not alpha number : " + text); | ||||
|       ch += count; | ||||
|       if (Character.isLetter(ch)) { | ||||
|         number = String.valueOf(ch); | ||||
|       } | ||||
|     } | ||||
|     else if (SearchHelper.NumberType.DEC.equals(numberType)) { | ||||
|     else if (NumberType.DEC.equals(numberType)) { | ||||
|       if (ch != '-' && !Character.isDigit(ch)) throw new RuntimeException("Not dec number : " + text); | ||||
|       boolean pad = ch == '0'; | ||||
|       int len = text.length(); | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
| @@ -59,10 +49,8 @@ import static com.maddyhome.idea.vim.helper.CaretVisualAttributesHelperKt.update | ||||
|  */ | ||||
| @State(name = "VimEditorSettings", storages = {@Storage(value = "$APP_CONFIG$/vim_settings.xml")}) | ||||
| public class EditorGroup implements PersistentStateComponent<Element>, VimEditorGroup { | ||||
|   private static final boolean REFRAIN_FROM_SCROLLING_VIM_VALUE = true; | ||||
|   public static final @NonNls String EDITOR_STORE_ELEMENT = "editor"; | ||||
|  | ||||
|   private boolean isRefrainFromScrolling = false; | ||||
|   private Boolean isKeyRepeat = null; | ||||
|  | ||||
|   private final CaretListener myLineNumbersCaretListener = new CaretListener() { | ||||
| @@ -219,7 +207,6 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor | ||||
|   } | ||||
|  | ||||
|   public void editorCreated(@NotNull Editor editor) { | ||||
|     isRefrainFromScrolling = editor.getSettings().isRefrainFromScrolling(); | ||||
|     DocumentManager.INSTANCE.addListeners(editor.getDocument()); | ||||
|     VimPlugin.getKey().registerRequiredShortcutKeys(new IjVimEditor(editor)); | ||||
|  | ||||
| @@ -232,14 +219,12 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor | ||||
|       KeyHandler.getInstance().reset(new IjVimEditor(editor)); | ||||
|     } | ||||
|     updateCaretsVisualAttributes(editor); | ||||
|     editor.getSettings().setRefrainFromScrolling(REFRAIN_FROM_SCROLLING_VIM_VALUE); | ||||
|   } | ||||
|  | ||||
|   public void editorDeinit(@NotNull Editor editor, boolean isReleased) { | ||||
|     deinitLineNumbers(editor, isReleased); | ||||
|     UserDataManager.unInitializeEditor(editor); | ||||
|     VimPlugin.getKey().unregisterShortcutKeys(new IjVimEditor(editor)); | ||||
|     editor.getSettings().setRefrainFromScrolling(isRefrainFromScrolling); | ||||
|     DocumentManager.INSTANCE.removeListeners(editor.getDocument()); | ||||
|     CaretVisualAttributesHelperKt.removeCaretsVisualAttributes(editor); | ||||
|   } | ||||
| @@ -309,8 +294,8 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor | ||||
|         return lineNumber; | ||||
|       } | ||||
|       else { | ||||
|         final int visualLine = EditorHelper.logicalLineToVisualLine(editor, lineNumber - 1); | ||||
|         final int currentVisualLine = EditorHelper.logicalLineToVisualLine(editor, caretLine); | ||||
|         final int visualLine = new IjVimEditor(editor).bufferLineToVisualLine(lineNumber - 1); | ||||
|         final int currentVisualLine = new IjVimEditor(editor).bufferLineToVisualLine(caretLine); | ||||
|         return Math.abs(currentVisualLine - visualLine); | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
| @@ -33,11 +23,11 @@ import com.intellij.openapi.fileTypes.FileType; | ||||
| import com.intellij.openapi.fileTypes.FileTypeManager; | ||||
| import com.intellij.openapi.project.Project; | ||||
| import com.intellij.openapi.roots.ProjectRootManager; | ||||
| import com.intellij.openapi.util.Ref; | ||||
| import com.intellij.openapi.vfs.LocalFileSystem; | ||||
| import com.intellij.openapi.vfs.VfsUtilCore; | ||||
| import com.intellij.openapi.vfs.VirtualFile; | ||||
| import com.intellij.openapi.vfs.VirtualFileVisitor; | ||||
| import com.intellij.psi.search.FilenameIndex; | ||||
| import com.intellij.psi.search.GlobalSearchScope; | ||||
| import com.intellij.psi.search.ProjectScope; | ||||
| import com.maddyhome.idea.vim.VimPlugin; | ||||
| import com.maddyhome.idea.vim.api.*; | ||||
| import com.maddyhome.idea.vim.command.VimStateMachine; | ||||
| @@ -56,6 +46,7 @@ import org.jetbrains.annotations.NotNull; | ||||
| import org.jetbrains.annotations.Nullable; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.Collection; | ||||
|  | ||||
| public class FileGroup extends VimFileBase { | ||||
|   public boolean openFile(@NotNull String filename, @NotNull ExecutionContext context) { | ||||
| @@ -107,44 +98,44 @@ public class FileGroup extends VimFileBase { | ||||
|       found = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(dir, homefile)); | ||||
|     } | ||||
|     else { | ||||
|       ProjectRootManager prm = ProjectRootManager.getInstance(project); | ||||
|       VirtualFile[] roots = prm.getContentRoots(); | ||||
|       for (int i = 0; i < roots.length; i++) { | ||||
|         if (logger.isDebugEnabled()) { | ||||
|           logger.debug("root[" + i + "] = " + roots[i].getPath()); | ||||
|         } | ||||
|         found = findFile(roots[i], filename); | ||||
|         if (found != null) { | ||||
|           break; | ||||
|         } | ||||
|       } | ||||
|       found = LocalFileSystem.getInstance().findFileByIoFile(new File(filename)); | ||||
|  | ||||
|       if (found == null) { | ||||
|         found = LocalFileSystem.getInstance().findFileByIoFile(new File(filename)); | ||||
|         found = findByNameInContentRoots(filename, project); | ||||
|         if (found == null) { | ||||
|           found = findByNameInProject(filename, project); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return found; | ||||
|   } | ||||
|  | ||||
|   private @Nullable VirtualFile findFile(@NotNull VirtualFile root, @NotNull String filename) { | ||||
|     VirtualFile res = root.findFileByRelativePath(filename); | ||||
|     if (res != null) { | ||||
|       return res; | ||||
|   @Nullable | ||||
|   private VirtualFile findByNameInContentRoots(@NotNull String filename, @NotNull Project project) { | ||||
|     VirtualFile found = null; | ||||
|     ProjectRootManager prm = ProjectRootManager.getInstance(project); | ||||
|     VirtualFile[] roots = prm.getContentRoots(); | ||||
|     for (int i = 0; i < roots.length; i++) { | ||||
|       if (logger.isDebugEnabled()) { | ||||
|         logger.debug("root[" + i + "] = " + roots[i].getPath()); | ||||
|       } | ||||
|     final Ref<VirtualFile> result = Ref.create(); | ||||
|     final VirtualFileVisitor<Object> visitor = new VirtualFileVisitor<>() { | ||||
|       @Override | ||||
|       public boolean visitFile(@NotNull VirtualFile file) { | ||||
|         if (file.getName().equals(filename)) { | ||||
|           result.set(file); | ||||
|           return false; | ||||
|       found = roots[i].findFileByRelativePath(filename); | ||||
|       if (found != null) { | ||||
|         break; | ||||
|       } | ||||
|         return true; | ||||
|     } | ||||
|     }; | ||||
|     VfsUtilCore.visitChildrenRecursively(root, visitor); | ||||
|     return result.get(); | ||||
|     return found; | ||||
|   } | ||||
|  | ||||
|   @Nullable | ||||
|   private static VirtualFile findByNameInProject(@NotNull String filename, @NotNull Project project) { | ||||
|     GlobalSearchScope projectScope = ProjectScope.getProjectScope(project); | ||||
|     Collection<VirtualFile> names = FilenameIndex.getVirtualFilesByName(filename, projectScope); | ||||
|     if (!names.isEmpty()) { | ||||
|       return names.stream().findFirst().get(); | ||||
|     } | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @@ -319,7 +310,7 @@ public class FileGroup extends VimFileBase { | ||||
|       } | ||||
|  | ||||
|       int lline = editor.getCaretModel().getLogicalPosition().line; | ||||
|       int total = EditorHelper.getLineCount(editor); | ||||
|       int total = new IjVimEditor(editor).lineCount(); | ||||
|  | ||||
|       msg.append("; Line ").append(lline + 1).append(" of ").append(total); | ||||
|  | ||||
| @@ -364,7 +355,7 @@ public class FileGroup extends VimFileBase { | ||||
|         word = cp.getCount(); | ||||
|       } | ||||
|  | ||||
|       int total = EditorHelper.getLineCount(editor); | ||||
|       int total = new IjVimEditor(editor).lineCount(); | ||||
|  | ||||
|       msg.append(lines).append(" of ").append(total).append(" Lines"); | ||||
|  | ||||
| @@ -416,7 +407,7 @@ public class FileGroup extends VimFileBase { | ||||
|     } | ||||
|  | ||||
|     int lline = editor.getCaretModel().getLogicalPosition().line; | ||||
|     int total = EditorHelper.getLineCount(editor); | ||||
|     int total = new IjVimEditor(editor).lineCount(); | ||||
|     int pct = (int)((float)lline / (float)total * 100f + 0.5); | ||||
|  | ||||
|     msg.append("line ").append(lline + 1).append(" of ").append(total); | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
|   | ||||
| @@ -1,37 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,40 +1,25 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
|  | ||||
| import com.intellij.openapi.application.ApplicationManager; | ||||
| import com.intellij.openapi.command.CommandProcessor; | ||||
| import com.intellij.openapi.diagnostic.Logger; | ||||
| import com.intellij.openapi.progress.ProcessCanceledException; | ||||
| import com.intellij.openapi.progress.ProgressManager; | ||||
| import com.intellij.openapi.progress.util.PotemkinProgress; | ||||
| import com.intellij.openapi.project.Project; | ||||
| import com.maddyhome.idea.vim.KeyHandler; | ||||
| import com.maddyhome.idea.vim.VimPlugin; | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext; | ||||
| import com.maddyhome.idea.vim.api.VimEditor; | ||||
| import com.maddyhome.idea.vim.helper.MessageHelper; | ||||
| import com.maddyhome.idea.vim.key.KeyStack; | ||||
| import com.maddyhome.idea.vim.macro.VimMacroBase; | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor; | ||||
| import com.maddyhome.idea.vim.options.OptionConstants; | ||||
| import com.maddyhome.idea.vim.options.OptionScope; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
|  | ||||
| import javax.swing.*; | ||||
| @@ -61,32 +46,6 @@ public class MacroGroup extends VimMacroBase { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     if (VimPlugin.getOptionService().isSet(OptionScope.GLOBAL.INSTANCE, OptionConstants.ideadelaymacroName, OptionConstants.ideadelaymacroName)) { | ||||
|       // This took a while to get just right. The original approach has a loop that made a runnable for each | ||||
|       // character. It worked except for one case - if the macro had a complete ex command, the editor did not | ||||
|       // end up with the focus and I couldn't find anyway to get it to have focus. This approach was the only | ||||
|       // solution. This makes the most sense now (of course it took hours of trial and error to come up with | ||||
|       // this one). Each key gets added, one at a time, to the event queue. If a given key results in other | ||||
|       // events getting queued, they get queued before the next key, just what would happen if the user was typing | ||||
|       // the keys one at a time. With the old loop approach, all the keys got queued, then any events they caused | ||||
|       // were queued - after the keys. This is what caused the problem. | ||||
|       final Runnable run = () -> { | ||||
|         // Handle one keystroke then queue up the next key | ||||
|         if (keyStack.hasStroke()) { | ||||
|           KeyHandler.getInstance().handleKey(editor, keyStack.feedStroke(), context); | ||||
|         } | ||||
|         if (keyStack.hasStroke()) { | ||||
|           playbackKeys(editor, context, cnt, total); | ||||
|         } | ||||
|         else { | ||||
|           keyStack.resetFirst(); | ||||
|           playbackKeys(editor, context, cnt + 1, total); | ||||
|         } | ||||
|       }; | ||||
|  | ||||
|       ApplicationManager.getApplication().invokeLater(() -> CommandProcessor.getInstance() | ||||
|         .executeCommand(project, run, MessageHelper.message("command.name.vim.macro.playback"), null)); | ||||
|     } else { | ||||
|     PotemkinProgress potemkinProgress = | ||||
|       new PotemkinProgress(MessageHelper.message("progress.title.macro.execution"), project, null, | ||||
|                            MessageHelper.message("stop")); | ||||
| @@ -114,4 +73,3 @@ public class MacroGroup extends VimMacroBase { | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
| @@ -131,7 +121,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | ||||
|         if (!mark.isClear()) { | ||||
|           Element markElem = new Element("mark"); | ||||
|           markElem.setAttribute("key", Character.toString(mark.getKey())); | ||||
|           markElem.setAttribute("line", Integer.toString(mark.getLogicalLine())); | ||||
|           markElem.setAttribute("line", Integer.toString(mark.getLine())); | ||||
|           markElem.setAttribute("column", Integer.toString(mark.getCol())); | ||||
|           markElem.setAttribute("filename", StringUtil.notNullize(mark.getFilename())); | ||||
|           markElem.setAttribute("protocol", StringUtil.notNullize(mark.getProtocol(), "file")); | ||||
| @@ -167,7 +157,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | ||||
|           if (!mark.isClear() && !Character.isUpperCase(mark.getKey()) && SAVE_FILE_MARKS.indexOf(mark.getKey()) >= 0) { | ||||
|             Element markElem = new Element("mark"); | ||||
|             markElem.setAttribute("key", Character.toString(mark.getKey())); | ||||
|             markElem.setAttribute("line", Integer.toString(mark.getLogicalLine())); | ||||
|             markElem.setAttribute("line", Integer.toString(mark.getLine())); | ||||
|             markElem.setAttribute("column", Integer.toString(mark.getCol())); | ||||
|             fileMarkElem.addContent(markElem); | ||||
|           } | ||||
| @@ -180,7 +170,7 @@ public class MarkGroup extends VimMarkGroupBase implements PersistentStateCompon | ||||
|     Element jumpsElem = new Element("jumps"); | ||||
|     for (Jump jump : jumps) { | ||||
|       Element jumpElem = new Element("jump"); | ||||
|       jumpElem.setAttribute("line", Integer.toString(jump.getLogicalLine())); | ||||
|       jumpElem.setAttribute("line", Integer.toString(jump.getLine())); | ||||
|       jumpElem.setAttribute("column", Integer.toString(jump.getCol())); | ||||
|       jumpElem.setAttribute("filename", StringUtil.notNullize(jump.getFilepath())); | ||||
|       jumpsElem.addContent(jumpElem); | ||||
|   | ||||
| @@ -1,25 +1,14 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.group; | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext; | ||||
| import com.intellij.openapi.editor.*; | ||||
| import com.intellij.openapi.editor.ex.util.EditorUtil; | ||||
| import com.intellij.openapi.fileEditor.FileEditor; | ||||
| import com.intellij.openapi.fileEditor.FileEditorManagerEvent; | ||||
| import com.intellij.openapi.fileEditor.TextEditor; | ||||
| @@ -39,7 +28,6 @@ import com.maddyhome.idea.vim.command.*; | ||||
| import com.maddyhome.idea.vim.common.TextRange; | ||||
| import com.maddyhome.idea.vim.ex.ExOutputModel; | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection; | ||||
| import com.maddyhome.idea.vim.group.visual.VisualGroupKt; | ||||
| import com.maddyhome.idea.vim.handler.Motion; | ||||
| import com.maddyhome.idea.vim.handler.MotionActionHandler; | ||||
| import com.maddyhome.idea.vim.handler.TextObjectActionHandler; | ||||
| @@ -76,123 +64,6 @@ import static java.lang.Math.min; | ||||
|  */ | ||||
| public class MotionGroup extends VimMotionGroupBase { | ||||
|  | ||||
|   public @Nullable TextRange getMotionRange(@NotNull VimEditor editor, | ||||
|                                             @NotNull VimCaret caret, | ||||
|                                             ExecutionContext context, | ||||
|                                             @NotNull Argument argument, | ||||
|                                             @NotNull OperatorArguments operatorArguments) { | ||||
|     return getMotionRange(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), ((IjExecutionContext) context).getContext(), argument, operatorArguments); | ||||
|   } | ||||
|   /** | ||||
|    * This helper method calculates the complete range a motion will move over taking into account whether | ||||
|    * the motion is FLAG_MOT_LINEWISE or FLAG_MOT_CHARACTERWISE (FLAG_MOT_INCLUSIVE or FLAG_MOT_EXCLUSIVE). | ||||
|    * | ||||
|    * @param editor   The editor the motion takes place in | ||||
|    * @param caret    The caret the motion takes place on | ||||
|    * @param context  The data context | ||||
|    * @param argument Any argument needed by the motion | ||||
|    * @param operatorArguments | ||||
|    * @return The motion's range | ||||
|    */ | ||||
|   public static @Nullable TextRange getMotionRange(@NotNull Editor editor, | ||||
|                                                    @NotNull Caret caret, | ||||
|                                                    DataContext context, | ||||
|                                                    @NotNull Argument argument, | ||||
|                                                    @NotNull OperatorArguments operatorArguments) { | ||||
|     int start; | ||||
|     int end; | ||||
|     if (argument.getType() == Argument.Type.OFFSETS) { | ||||
|       final VimSelection offsets = argument.getOffsets().get(new IjVimCaret(caret)); | ||||
|       if (offsets == null) return null; | ||||
|  | ||||
|       final Pair<Integer, Integer> nativeStartAndEnd = offsets.getNativeStartAndEnd(); | ||||
|       start = nativeStartAndEnd.getFirst(); | ||||
|       end = nativeStartAndEnd.getSecond(); | ||||
|     } | ||||
|     else { | ||||
|       final Command cmd = argument.getMotion(); | ||||
|       // Normalize the counts between the command and the motion argument | ||||
|       int cnt = cmd.getCount() * operatorArguments.getCount1(); | ||||
|       int raw = operatorArguments.getCount0() == 0 && cmd.getRawCount() == 0 ? 0 : cnt; | ||||
|       if (cmd.getAction() instanceof MotionActionHandler) { | ||||
|         MotionActionHandler action = (MotionActionHandler)cmd.getAction(); | ||||
|  | ||||
|         // This is where we are now | ||||
|         start = caret.getOffset(); | ||||
|  | ||||
|         // Execute the motion (without moving the cursor) and get where we end | ||||
|         Motion motion = | ||||
|           action.getHandlerOffset(new IjVimEditor(editor), new IjVimCaret(caret), new IjExecutionContext(context), cmd.getArgument(), operatorArguments.withCount0(raw)); | ||||
|  | ||||
|         // Invalid motion | ||||
|         if (Motion.Error.INSTANCE.equals(motion)) return null; | ||||
|         if (Motion.NoMotion.INSTANCE.equals(motion)) return null; | ||||
|         end = ((Motion.AbsoluteOffset)motion).getOffset(); | ||||
|  | ||||
|         // If inclusive, add the last character to the range | ||||
|         if (action.getMotionType() == MotionType.INCLUSIVE && end < EditorHelperRt.getFileSize(editor)) { | ||||
|           if (start > end) { | ||||
|             start++; | ||||
|           } | ||||
|           else { | ||||
|             end++; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       else if (cmd.getAction() instanceof TextObjectActionHandler) { | ||||
|         TextObjectActionHandler action = (TextObjectActionHandler)cmd.getAction(); | ||||
|  | ||||
|         TextRange range = action.getRange(new IjVimEditor(editor), new IjVimCaret(caret), new IjExecutionContext(context), cnt, raw, cmd.getArgument()); | ||||
|  | ||||
|         if (range == null) return null; | ||||
|  | ||||
|         start = range.getStartOffset(); | ||||
|         end = range.getEndOffset(); | ||||
|  | ||||
|         if (cmd.isLinewiseMotion()) end--; | ||||
|       } | ||||
|       else { | ||||
|         throw new RuntimeException( | ||||
|           "Commands doesn't take " + cmd.getAction().getClass().getSimpleName() + " as an operator"); | ||||
|       } | ||||
|  | ||||
|       // Normalize the range | ||||
|       if (start > end) { | ||||
|         int t = start; | ||||
|         start = end; | ||||
|         end = t; | ||||
|       } | ||||
|  | ||||
|       // If we are a linewise motion we need to normalize the start and stop then move the start to the beginning | ||||
|       // of the line and move the end to the end of the line. | ||||
|       if (cmd.isLinewiseMotion()) { | ||||
|         if (caret.getLogicalPosition().line != getLineCount(editor) - 1) { | ||||
|           start = getLineStartForOffset(editor, start); | ||||
|           end = min(getLineEndForOffset(editor, end) + 1, EditorHelperRt.getFileSize(editor)); | ||||
|         } | ||||
|         else { | ||||
|           start = getLineStartForOffset(editor, start); | ||||
|           end = getLineEndForOffset(editor, end); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // This is a kludge for dw, dW, and d[w. Without this kludge, an extra newline is operated when it shouldn't be. | ||||
|     String text = editor.getDocument().getCharsSequence().subSequence(start, end).toString(); | ||||
|     final int lastNewLine = text.lastIndexOf('\n'); | ||||
|     if (lastNewLine > 0) { | ||||
|       String id = argument.getMotion().getAction().getId(); | ||||
|       if (id.equals(VIM_MOTION_WORD_RIGHT) || | ||||
|           id.equals(VIM_MOTION_BIG_WORD_RIGHT) || | ||||
|           id.equals(VIM_MOTION_CAMEL_RIGHT)) { | ||||
|         if (!SearchHelper.anyNonWhitespace(editor, end, -1)) { | ||||
|           end = start + lastNewLine; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return new TextRange(start, end); | ||||
|   } | ||||
|  | ||||
|   public static @Nullable TextRange getMotionRange2(@NotNull Editor editor, | ||||
|                                                     @NotNull Caret caret, | ||||
| @@ -270,7 +141,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       String text = editor.getDocument().getCharsSequence().subSequence(start, end).toString(); | ||||
|       final int lastNewLine = text.lastIndexOf('\n'); | ||||
|       if (lastNewLine > 0) { | ||||
|         if (!SearchHelper.anyNonWhitespace(editor, end, -1)) { | ||||
|         if (!EngineEditorHelperKt.anyNonWhitespace(new IjVimEditor(editor), end, -1)) { | ||||
|           end = start + lastNewLine; | ||||
|         } | ||||
|       } | ||||
| @@ -285,14 +156,16 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     final int topVisualLine = getVisualLineAtTopOfScreen(editor); | ||||
|     final int bottomVisualLine = getVisualLineAtBottomOfScreen(editor); | ||||
|     final int caretVisualLine = editor.getCaretModel().getVisualPosition().line; | ||||
|     final int lastVisualLine = EditorHelper.getVisualLineCount(new IjVimEditor(editor)) - 1; | ||||
|     @NotNull final VimEditor editor1 = new IjVimEditor(editor); | ||||
|     final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1; | ||||
|  | ||||
|     final int newVisualLine; | ||||
|     if (caretVisualLine < topVisualLine + scrollOffset) { | ||||
|       newVisualLine = normalizeVisualLine(editor, topVisualLine + scrollOffset); | ||||
|       newVisualLine = EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(editor), topVisualLine + scrollOffset); | ||||
|     } | ||||
|     else if (bottomVisualLine < lastVisualLine && caretVisualLine > bottomVisualLine - scrollOffset) { | ||||
|       newVisualLine = normalizeVisualLine(editor, bottomVisualLine - scrollOffset); | ||||
|       newVisualLine = | ||||
|         EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(editor), bottomVisualLine - scrollOffset); | ||||
|     } | ||||
|     else { | ||||
|       newVisualLine = caretVisualLine; | ||||
| @@ -302,12 +175,12 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|  | ||||
|     final int oldColumn = editor.getCaretModel().getVisualPosition().column; | ||||
|     int col = oldColumn; | ||||
|     if (col >= getLineLength(editor) - 1) { | ||||
|     if (col >= EngineEditorHelperKt.lineLength(new IjVimEditor(editor), new IjVimEditor(editor).currentCaret().getBufferPosition().getLine()) - 1) { | ||||
|       col = UserDataManager.getVimLastColumn(editor.getCaretModel().getPrimaryCaret()); | ||||
|     } | ||||
|  | ||||
|     final int leftVisualColumn = getVisualColumnAtLeftOfScreen(editor, newVisualLine); | ||||
|     final int rightVisualColumn = getVisualColumnAtRightOfScreen(editor, newVisualLine); | ||||
|     final int leftVisualColumn = getVisualColumnAtLeftOfDisplay(editor, newVisualLine); | ||||
|     final int rightVisualColumn = getVisualColumnAtRightOfDisplay(editor, newVisualLine); | ||||
|     int caretColumn = col; | ||||
|     int newColumn = caretColumn; | ||||
|  | ||||
| @@ -323,11 +196,11 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       col = newColumn; | ||||
|     } | ||||
|  | ||||
|     newColumn = normalizeVisualColumn(editor, newVisualLine, newColumn, CommandStateHelper.isEndAllowed(editor)); | ||||
|     newColumn = EngineEditorHelperKt.normalizeVisualColumn(new IjVimEditor(editor), newVisualLine, newColumn, CommandStateHelper.isEndAllowed(editor)); | ||||
|  | ||||
|     if (newVisualLine != caretVisualLine || newColumn != oldColumn) { | ||||
|       int offset = visualPositionToOffset(editor, new VisualPosition(newVisualLine, newColumn)); | ||||
|       moveCaret(editor, editor.getCaretModel().getPrimaryCaret(), offset); | ||||
|       int offset = editor.visualPositionToOffset(new VisualPosition(newVisualLine, newColumn)); | ||||
|       new IjVimCaret(editor.getCaretModel().getPrimaryCaret()).moveToOffset(offset); | ||||
|  | ||||
|       UserDataManager.setVimLastColumn(editor.getCaretModel().getPrimaryCaret(), col); | ||||
|     } | ||||
| @@ -350,7 +223,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       targetCaretVisualLine = down ? caretVisualLine + scrollOption : caretVisualLine - scrollOption; | ||||
|     } | ||||
|  | ||||
|     return EditorHelper.normalizeVisualLine(editor, targetCaretVisualLine); | ||||
|     return EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(editor), targetCaretVisualLine); | ||||
|   } | ||||
|  | ||||
|   private static int getScrollOption(int rawCount) { | ||||
| @@ -372,43 +245,9 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     return normalizeSideScrollOffset(editor, sideScrollOffset); | ||||
|   } | ||||
|  | ||||
|   public void moveCaret(@NotNull VimEditor editor, @NotNull VimCaret caret, int offset) { | ||||
|     moveCaret(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), offset); | ||||
|   } | ||||
|  | ||||
|   public static void moveCaret(@NotNull Editor editor, @NotNull Caret caret, int offset) { | ||||
|     if (offset < 0 || offset > editor.getDocument().getTextLength() || !caret.isValid()) return; | ||||
|  | ||||
|     if (CommandStateHelper.inBlockSubMode(editor)) { | ||||
|       VisualGroupKt.vimMoveBlockSelectionToOffset(editor, offset); | ||||
|       Caret primaryCaret = editor.getCaretModel().getPrimaryCaret(); | ||||
|       UserDataManager.setVimLastColumn(primaryCaret, primaryCaret.getVisualPosition().column); | ||||
|       scrollCaretIntoView(editor); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     // Make sure to always reposition the caret, even if the offset hasn't changed. We might need to reposition due to | ||||
|     // changes in surrounding text, especially with inline inlays. | ||||
|     final int oldOffset = caret.getOffset(); | ||||
|     InlayHelperKt.moveToInlayAwareOffset(caret, offset); | ||||
|     if (oldOffset != offset) { | ||||
|       UserDataManager.setVimLastColumn(caret, InlayHelperKt.getInlayAwareVisualColumn(caret)); | ||||
|     } | ||||
|  | ||||
|     // Similarly, always make sure the caret is positioned within the view. Adding or removing text could move the caret | ||||
|     // position relative to the view, without changing offset. | ||||
|     if (caret == editor.getCaretModel().getPrimaryCaret()) { | ||||
|       scrollCaretIntoView(editor); | ||||
|     } | ||||
|  | ||||
|     if (CommandStateHelper.inVisualMode(editor) || CommandStateHelper.inSelectMode(editor)) { | ||||
|       VisualGroupKt.vimMoveSelectionToCaret(caret); | ||||
|     } | ||||
|     else { | ||||
|       ModeHelper.exitVisualMode(editor); | ||||
|     } | ||||
|  | ||||
|     AppCodeTemplates.onMovement(editor, caret, oldOffset < offset); | ||||
|   @Override | ||||
|   public void onAppCodeMovement(@NotNull VimEditor editor, @NotNull VimCaret caret, int offset, int oldOffset) { | ||||
|     AppCodeTemplates.onMovement(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret(), oldOffset < offset); | ||||
|   } | ||||
|  | ||||
|   private @Nullable Editor selectEditor(@NotNull Editor editor, @NotNull Mark mark) { | ||||
| @@ -432,7 +271,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public int moveCaretToMatchingPair(@NotNull VimEditor editor, @NotNull VimCaret caret) { | ||||
|   public int moveCaretToMatchingPair(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret) { | ||||
|     int pos = SearchHelper.findMatchingPairOnCurrentLine(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret()); | ||||
|     if (pos >= 0) { | ||||
|       return pos; | ||||
| @@ -478,70 +317,26 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * This moves the caret to the end of the next/previous word/WORD. | ||||
|    * | ||||
|    * @param editor  The editor to move in | ||||
|    * @param caret   The caret to be moved | ||||
|    * @param count   The number of words to skip | ||||
|    * @param bigWord If true then find WORD, if false then find word | ||||
|    * @return position | ||||
|    */ | ||||
|   public Motion moveCaretToNextWordEnd(@NotNull Editor editor, @NotNull Caret caret, int count, boolean bigWord) { | ||||
|     if ((caret.getOffset() == 0 && count < 0) || | ||||
|         (caret.getOffset() >= EditorHelperRt.getFileSize(editor) - 1 && count > 0)) { | ||||
|       return Motion.Error.INSTANCE; | ||||
|     } | ||||
|  | ||||
|     // If we are doing this move as part of a change command (e.q. cw), we need to count the current end of | ||||
|     // word if the cursor happens to be on the end of a word already. If this is a normal move, we don't count | ||||
|     // the current word. | ||||
|     int pos = SearchHelper.findNextWordEnd(editor, caret, count, bigWord); | ||||
|     if (pos == -1) { | ||||
|       if (count < 0) { | ||||
|         return new Motion.AbsoluteOffset(moveCaretToLineStart(new IjVimEditor(editor), 0)); | ||||
|       } | ||||
|       else { | ||||
|         return new Motion.AbsoluteOffset(moveCaretToLineEnd(new IjVimEditor(editor), getLineCount(editor) - 1, false)); | ||||
|       } | ||||
|     } | ||||
|     else { | ||||
|       return new Motion.AbsoluteOffset(pos); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public int moveCaretToNextSentenceStart(@NotNull Editor editor, @NotNull Caret caret, int count) { | ||||
|     int res = SearchHelper.findNextSentenceStart(editor, caret, count, false, true); | ||||
|     if (res >= 0) { | ||||
|       res = normalizeOffset(editor, res, true); | ||||
|     } | ||||
|     else { | ||||
|       res = -1; | ||||
|     } | ||||
|  | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollLineToFirstScreenLine(@NotNull VimEditor editor, int rawCount, boolean start) { | ||||
|   public boolean scrollCurrentLineToDisplayTop(@NotNull VimEditor editor, int rawCount, boolean start) { | ||||
|     scrollLineToScreenLocation(((IjVimEditor)editor).getEditor(), ScreenLocation.TOP, rawCount, start); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollLineToMiddleScreenLine(@NotNull VimEditor editor, int rawCount, boolean start) { | ||||
|   public boolean scrollCurrentLineToDisplayMiddle(@NotNull VimEditor editor, int rawCount, boolean start) { | ||||
|     scrollLineToScreenLocation(((IjVimEditor)editor).getEditor(), ScreenLocation.MIDDLE, rawCount, start); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollLineToLastScreenLine(@NotNull VimEditor editor, int rawCount, boolean start) { | ||||
|   public boolean scrollCurrentLineToDisplayBottom(@NotNull VimEditor editor, int rawCount, boolean start) { | ||||
|     scrollLineToScreenLocation(((IjVimEditor)editor).getEditor(), ScreenLocation.BOTTOM, rawCount, start); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollCaretColumnToFirstScreenColumn(@NotNull VimEditor vimEditor) { | ||||
|   public boolean scrollCaretColumnToDisplayLeftEdge(@NotNull VimEditor vimEditor) { | ||||
|     Editor editor = ((IjVimEditor)vimEditor).getEditor(); | ||||
|     final VisualPosition caretVisualPosition = editor.getCaretModel().getVisualPosition(); | ||||
|     final int scrollOffset = getNormalizedSideScrollOffset(editor); | ||||
| @@ -552,13 +347,13 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollCaretColumnToLastScreenColumn(@NotNull VimEditor editor) { | ||||
|   public boolean scrollCaretColumnToDisplayRightEdge(@NotNull VimEditor editor) { | ||||
|     Editor ijEditor = ((IjVimEditor)editor).getEditor(); | ||||
|     final VisualPosition caretVisualPosition = ijEditor.getCaretModel().getVisualPosition(); | ||||
|     final int scrollOffset = getNormalizedSideScrollOffset(ijEditor); | ||||
|     // TODO: Should the offset be applied to visual columns? This includes inline inlays and folds | ||||
|     final int column = | ||||
|       normalizeVisualColumn(ijEditor, caretVisualPosition.line, caretVisualPosition.column + scrollOffset, false); | ||||
|       EngineEditorHelperKt.normalizeVisualColumn(editor, caretVisualPosition.line, caretVisualPosition.column + scrollOffset, false); | ||||
|     scrollColumnToRightOfScreen(ijEditor, caretVisualPosition.line, column); | ||||
|     return true; | ||||
|   } | ||||
| @@ -586,7 +381,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|  | ||||
|     final int topLine = getVisualLineAtTopOfScreen(editor); | ||||
|     final int bottomLine = getVisualLineAtBottomOfScreen(editor); | ||||
|     final int lastLine = EditorHelper.getVisualLineCount(new IjVimEditor(editor)) - 1; | ||||
|     @NotNull final VimEditor editor2 = new IjVimEditor(editor); | ||||
|     final int lastLine = EngineEditorHelperKt.getVisualLineCount(editor2) - 1; | ||||
|  | ||||
|     // We need the non-normalised value here, so we can handle cases such as so=999 to keep the current line centred | ||||
|     final int scrollOffset = ((VimInt) VimPlugin.getOptionService().getOptionValue(new OptionScope.LOCAL(new IjVimEditor(editor)), OptionConstants.scrolloffName, OptionConstants.scrolloffName)).getValue(); | ||||
| @@ -662,7 +458,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         // the line heights of the lines above and below caretLine (up to scrolloff or end of file). | ||||
|         // Our implementation ignores soft wrap line heights. Folds already have a line height of 1. | ||||
|         final int usedAbove = caretLine - newTopLine; | ||||
|         final int usedBelow = min(scrollOffset, getVisualLineCount(new IjVimEditor(editor)) - caretLine); | ||||
|         @NotNull final VimEditor editor1 = new IjVimEditor(editor); | ||||
|         final int usedBelow = min(scrollOffset, EngineEditorHelperKt.getVisualLineCount(editor1) - caretLine); | ||||
|         final int used = 1 + usedAbove + usedBelow; | ||||
|         if (used > height) { | ||||
|           scrollVisualLineToMiddleOfScreen(editor, caretLine, false); | ||||
| @@ -696,7 +493,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         // The minus one is for the current line | ||||
|         //noinspection UnnecessaryLocalVariable | ||||
|         final int usedAbove = scrolledAbove; | ||||
|         final int usedBelow = min(getVisualLineCount(new IjVimEditor(editor)) - caretLine, usedAbove - 1); | ||||
|         @NotNull final VimEditor editor1 = new IjVimEditor(editor); | ||||
|         final int usedBelow = min(EngineEditorHelperKt.getVisualLineCount(editor1) - caretLine, usedAbove - 1); | ||||
|         final int used = min(height + 1, usedAbove + usedBelow); | ||||
|  | ||||
|         // If we've expanded more than a screen full, redraw with the cursor in the middle of the screen. If we're going | ||||
| @@ -731,8 +529,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   private static void scrollCaretIntoViewHorizontally(@NotNull Editor editor, @NotNull VisualPosition position) { | ||||
|     final int currentVisualLeftColumn = getVisualColumnAtLeftOfScreen(editor, position.line); | ||||
|     final int currentVisualRightColumn = getVisualColumnAtRightOfScreen(editor, position.line); | ||||
|     final int currentVisualLeftColumn = getVisualColumnAtLeftOfDisplay(editor, position.line); | ||||
|     final int currentVisualRightColumn = getVisualColumnAtRightOfDisplay(editor, position.line); | ||||
|     final int caretColumn = position.column; | ||||
|  | ||||
|     final int halfWidth = getApproximateScreenWidth(editor) / 2; | ||||
| @@ -759,7 +557,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         } | ||||
|         else { | ||||
|           scrollColumnToRightOfScreen(editor, position.line, | ||||
|                                       normalizeVisualColumn(editor, position.line, currentVisualRightColumn + diff, | ||||
|                                       EngineEditorHelperKt.normalizeVisualColumn(new IjVimEditor(editor), position.line, currentVisualRightColumn + diff, | ||||
|                                                             false)); | ||||
|         } | ||||
|       } | ||||
| @@ -767,8 +565,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public int moveCaretToFirstScreenLine(@NotNull VimEditor editor, | ||||
|                                         @NotNull VimCaret caret, | ||||
|   public int moveCaretToFirstDisplayLine(@NotNull VimEditor editor, | ||||
|                                          @NotNull ImmutableVimCaret caret, | ||||
|                                          int count, | ||||
|                                          boolean normalizeToScreen) { | ||||
|     return moveCaretToScreenLocation(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret(), | ||||
| @@ -776,8 +574,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public int moveCaretToLastScreenLine(@NotNull VimEditor editor, | ||||
|                                        @NotNull VimCaret caret, | ||||
|   public int moveCaretToLastDisplayLine(@NotNull VimEditor editor, | ||||
|                                         @NotNull ImmutableVimCaret caret, | ||||
|                                         int count, | ||||
|                                         boolean normalizeToScreen) { | ||||
|     return moveCaretToScreenLocation(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret(), | ||||
| @@ -785,13 +583,13 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public int moveCaretToMiddleScreenLine(@NotNull VimEditor editor, @NotNull VimCaret caret) { | ||||
|   public int moveCaretToMiddleDisplayLine(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret) { | ||||
|     return moveCaretToScreenLocation(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret(), | ||||
|                                      ScreenLocation.MIDDLE, 0, false); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollLine(@NotNull VimEditor editor, int lines) { | ||||
|   public boolean scrollLines(@NotNull VimEditor editor, int lines) { | ||||
|     assert lines != 0 : "lines cannot be 0"; | ||||
|     Editor ijEditor = ((IjVimEditor)editor).getEditor(); | ||||
|  | ||||
| @@ -814,10 +612,10 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     final Mark mark = VimPlugin.getMark().getFileMark(editor, ch); | ||||
|     if (mark == null) return -1; | ||||
|  | ||||
|     final int line = mark.getLogicalLine(); | ||||
|     final int line = mark.getLine(); | ||||
|     return toLineStart | ||||
|            ? moveCaretToLineStartSkipLeading(editor, line) | ||||
|            : editor.logicalPositionToOffset(new VimLogicalPosition(line, mark.getCol(), false)); | ||||
|            : editor.bufferPositionToOffset(new BufferPosition(line, mark.getCol(), false)); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
| @@ -828,17 +626,17 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     final VirtualFile vf = getVirtualFile(((IjVimEditor)editor).getEditor()); | ||||
|     if (vf == null) return -1; | ||||
|  | ||||
|     final int line = mark.getLogicalLine(); | ||||
|     final int line = mark.getLine(); | ||||
|     if (vf.getPath().equals(mark.getFilename())) { | ||||
|       return toLineStart | ||||
|              ? moveCaretToLineStartSkipLeading(editor, line) | ||||
|              : editor.logicalPositionToOffset(new VimLogicalPosition(line, mark.getCol(), false)); | ||||
|              : editor.bufferPositionToOffset(new BufferPosition(line, mark.getCol(), false)); | ||||
|     } | ||||
|  | ||||
|     final Editor selectedEditor = selectEditor(((IjVimEditor)editor).getEditor(), mark); | ||||
|     if (selectedEditor != null) { | ||||
|       for (Caret caret : selectedEditor.getCaretModel().getAllCarets()) { | ||||
|         moveCaret(selectedEditor, caret, toLineStart | ||||
|         new IjVimCaret(caret).moveToOffset(toLineStart | ||||
|                                            ? moveCaretToLineStartSkipLeading(new IjVimEditor(selectedEditor), line) | ||||
|                                            : selectedEditor.logicalPositionToOffset( | ||||
|                                              new LogicalPosition(line, mark.getCol()))); | ||||
| @@ -861,8 +659,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       return -1; | ||||
|     } | ||||
|  | ||||
|     final VimLogicalPosition lp = new VimLogicalPosition(jump.getLogicalLine(), jump.getCol(), false); | ||||
|     final LogicalPosition lpnative = new LogicalPosition(jump.getLogicalLine(), jump.getCol(), false); | ||||
|     final BufferPosition lp = new BufferPosition(jump.getLine(), jump.getCol(), false); | ||||
|     final LogicalPosition lpnative = new LogicalPosition(jump.getLine(), jump.getCol(), false); | ||||
|     final String fileName = jump.getFilepath(); | ||||
|     if (!vf.getPath().equals(fileName)) { | ||||
|       final VirtualFile newFile = | ||||
| @@ -876,8 +674,9 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         if (spot == -1) { | ||||
|           VimPlugin.getMark().addJump(editor, false); | ||||
|         } | ||||
|         moveCaret(newEditor, newEditor.getCaretModel().getCurrentCaret(), | ||||
|                   normalizeOffset(newEditor, newEditor.logicalPositionToOffset(lpnative), false)); | ||||
|         new IjVimCaret(newEditor.getCaretModel().getCurrentCaret()).moveToOffset( | ||||
|           EngineEditorHelperKt.normalizeOffset(new IjVimEditor(newEditor), newEditor.logicalPositionToOffset(lpnative), | ||||
|                                                false)); | ||||
|       } | ||||
|  | ||||
|       return -2; | ||||
| @@ -887,38 +686,29 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         VimPlugin.getMark().addJump(editor, false); | ||||
|       } | ||||
|  | ||||
|       return editor.logicalPositionToOffset(lp); | ||||
|       return editor.bufferPositionToOffset(lp); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public @NotNull Motion moveCaretToMiddleColumn(@NotNull VimEditor editor, @NotNull VimCaret caret) { | ||||
|   public @NotNull Motion moveCaretToCurrentDisplayLineMiddle(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret) { | ||||
|     final int width = getApproximateScreenWidth(((IjVimEditor)editor).getEditor()) / 2; | ||||
|     final int len = getLineLength(((IjVimEditor)editor).getEditor()); | ||||
|     final int len = EngineEditorHelperKt.lineLength(editor, editor.currentCaret().getBufferPosition().getLine()); | ||||
|  | ||||
|     return moveCaretToColumn(editor, caret, max(0, min(len - 1, width)), false); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public Motion moveCaretToColumn(@NotNull VimEditor editor, @NotNull VimCaret caret, int count, boolean allowEnd) { | ||||
|     int line = caret.getLine().getLine(); | ||||
|     int pos = normalizeColumn(((IjVimEditor)editor).getEditor(), line, count, allowEnd); | ||||
|  | ||||
|     return new Motion.AbsoluteOffset(editor.logicalPositionToOffset(new VimLogicalPosition(line, pos, false))); | ||||
|   public Motion moveCaretToColumn(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret, int count, boolean allowEnd) { | ||||
|     final int line = caret.getLine().getLine(); | ||||
|     final int column = EngineEditorHelperKt.normalizeColumn(editor, line, count, allowEnd); | ||||
|     final int offset = editor.bufferPositionToOffset(new BufferPosition(line, column, false)); | ||||
|     if (column != count) { | ||||
|       return new Motion.AdjustedOffset(offset, count); | ||||
|     } | ||||
|     return new Motion.AbsoluteOffset(offset); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToLineStartSkipLeading(@NotNull VimEditor editor, | ||||
|                                                                                       int line) { | ||||
|     return getLeadingCharacterOffset(((IjVimEditor)editor).getEditor(), line); | ||||
|   } | ||||
|  | ||||
|   public int moveCaretToLineEnd(@NotNull VimEditor editor, @NotNull VimCaret caret) { | ||||
|     final VisualPosition visualPosition = ((IjVimCaret) caret).getCaret().getVisualPosition(); | ||||
|     final int lastVisualLineColumn = EditorUtil.getLastVisualLineColumnNumber(((IjVimEditor) editor).getEditor(), visualPosition.line); | ||||
|     final VisualPosition visualEndOfLine = new VisualPosition(visualPosition.line, lastVisualLineColumn, true); | ||||
|     return moveCaretToLineEnd(editor, ((IjVimEditor) editor).getEditor().visualToLogicalPosition(visualEndOfLine).line, true); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollColumns(@NotNull VimEditor editor, int columns) { | ||||
| @@ -926,8 +716,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     final VisualPosition caretVisualPosition = ijEditor.getCaretModel().getVisualPosition(); | ||||
|     if (columns > 0) { | ||||
|       // TODO: Don't add columns to visual position. This includes inlays and folds | ||||
|       int visualColumn = normalizeVisualColumn(ijEditor, caretVisualPosition.line, | ||||
|                                                getVisualColumnAtLeftOfScreen(ijEditor, caretVisualPosition.line) + | ||||
|       int visualColumn = EngineEditorHelperKt.normalizeVisualColumn(editor, caretVisualPosition.line, | ||||
|                                                getVisualColumnAtLeftOfDisplay(ijEditor, caretVisualPosition.line) + | ||||
|                                                columns, false); | ||||
|  | ||||
|       // If the target column has an inlay preceding it, move passed it. This inlay will have been (incorrectly) | ||||
| @@ -944,7 +734,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     } | ||||
|     else { | ||||
|       // Don't normalise the rightmost column, or we break virtual space | ||||
|       final int visualColumn = getVisualColumnAtRightOfScreen(ijEditor, caretVisualPosition.line) + columns; | ||||
|       final int visualColumn = getVisualColumnAtRightOfDisplay(ijEditor, caretVisualPosition.line) + columns; | ||||
|       scrollColumnToRightOfScreen(ijEditor, caretVisualPosition.line, visualColumn); | ||||
|     } | ||||
|     moveCaretToView(ijEditor); | ||||
| @@ -952,26 +742,26 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public @NotNull Motion moveCaretToLineScreenStart(@NotNull VimEditor editor, @NotNull VimCaret caret) { | ||||
|   public @NotNull Motion moveCaretToCurrentDisplayLineStart(@NotNull VimEditor editor, ImmutableVimCaret caret) { | ||||
|     final int col = | ||||
|       getVisualColumnAtLeftOfScreen(((IjVimEditor)editor).getEditor(), caret.getVisualPosition().getLine()); | ||||
|       getVisualColumnAtLeftOfDisplay(((IjVimEditor)editor).getEditor(), caret.getVisualPosition().getLine()); | ||||
|     return moveCaretToColumn(editor, caret, col, false); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToLineScreenStartSkipLeading(@NotNull VimEditor editor, | ||||
|                                                                                             @NotNull VimCaret caret) { | ||||
|     final int col = getVisualColumnAtLeftOfScreen(((IjVimEditor)editor).getEditor(), caret.getVisualPosition().getLine()); | ||||
|   public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToCurrentDisplayLineStartSkipLeading(@NotNull VimEditor editor, | ||||
|                                                                                                     ImmutableVimCaret caret) { | ||||
|     final int col = getVisualColumnAtLeftOfDisplay(((IjVimEditor)editor).getEditor(), caret.getVisualPosition().getLine()); | ||||
|     final int logicalLine = caret.getLine().getLine(); | ||||
|     return getLeadingCharacterOffset(((IjVimEditor)editor).getEditor(), logicalLine, col); | ||||
|     return EngineEditorHelperKt.getLeadingCharacterOffset(editor, logicalLine, col); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public @NotNull Motion moveCaretToLineScreenEnd(@NotNull VimEditor editor, | ||||
|                                                   @NotNull VimCaret caret, | ||||
|   public @NotNull Motion moveCaretToCurrentDisplayLineEnd(@NotNull VimEditor editor, | ||||
|                                                           ImmutableVimCaret caret, | ||||
|                                                           boolean allowEnd) { | ||||
|     final int col = | ||||
|       getVisualColumnAtRightOfScreen(((IjVimEditor)editor).getEditor(), caret.getVisualPosition().getLine()); | ||||
|       getVisualColumnAtRightOfDisplay(((IjVimEditor)editor).getEditor(), caret.getVisualPosition().getLine()); | ||||
|     return moveCaretToColumn(editor, caret, col, allowEnd); | ||||
|   } | ||||
|  | ||||
| @@ -985,13 +775,14 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     final int topVisualLine = getVisualLineAtTopOfScreen(ijEditor); | ||||
|     int caretVisualLine = result.getSecond(); | ||||
|     if (caretVisualLine < topVisualLine + scrollOffset) { | ||||
|       caretVisualLine = normalizeVisualLine(ijEditor, caretVisualLine + scrollOffset); | ||||
|       caretVisualLine = | ||||
|         EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(ijEditor), caretVisualLine + scrollOffset); | ||||
|     } | ||||
|  | ||||
|     if (caretVisualLine != ijCaret.getVisualPosition().line) { | ||||
|       final int offset = | ||||
|         moveCaretToLineWithStartOfLineOption(editor, visualLineToLogicalLine(ijEditor, caretVisualLine), caret); | ||||
|       moveCaret(ijEditor, ijCaret, offset); | ||||
|         moveCaretToLineWithStartOfLineOption(editor, EngineEditorHelperKt.visualLineToBufferLine(editor, caretVisualLine), caret); | ||||
|       caret.moveToOffset(offset); | ||||
|       return result.getFirst(); | ||||
|     } | ||||
|  | ||||
| @@ -1008,13 +799,14 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     final int bottomVisualLine = getVisualLineAtBottomOfScreen(ijEditor); | ||||
|     int caretVisualLine = result.getSecond(); | ||||
|     if (caretVisualLine > bottomVisualLine - scrollOffset) { | ||||
|       caretVisualLine = normalizeVisualLine(ijEditor, caretVisualLine - scrollOffset); | ||||
|       caretVisualLine = | ||||
|         EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(ijEditor), caretVisualLine - scrollOffset); | ||||
|     } | ||||
|  | ||||
|     if (caretVisualLine != ijCaret.getVisualPosition().line && caretVisualLine != -1) { | ||||
|       final int offset = | ||||
|         moveCaretToLineWithStartOfLineOption(editor, visualLineToLogicalLine(ijEditor, caretVisualLine), caret); | ||||
|       moveCaret(ijEditor, ijCaret, offset); | ||||
|         moveCaretToLineWithStartOfLineOption(editor, EngineEditorHelperKt.visualLineToBufferLine(editor, caretVisualLine), caret); | ||||
|       caret.moveToOffset(offset); | ||||
|       return result.getFirst(); | ||||
|     } | ||||
|  | ||||
| @@ -1022,12 +814,12 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|     // lines of the file and virtual space. Vim normally scrolls window height minus two, but when the caret is on last | ||||
|     // line minus one, this becomes window height minus one, meaning the top line of the current page becomes the bottom | ||||
|     // line of the new page, and the caret doesn't move. Make sure we don't beep in this scenario. | ||||
|     return caretVisualLine == EditorHelper.getVisualLineCount(editor) - 2; | ||||
|     return caretVisualLine == EngineEditorHelperKt.getVisualLineCount(editor) - 2; | ||||
|   } | ||||
|  | ||||
|   public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToLineWithSameColumn(@NotNull VimEditor editor, | ||||
|                                                                                     int logicalLine, | ||||
|                                                                                     @NotNull VimCaret caret) { | ||||
|                                                                                     @NotNull ImmutableVimCaret caret) { | ||||
|     int col = UserDataManager.getVimLastColumn(((IjVimCaret) caret).getCaret()); | ||||
|     int line = logicalLine; | ||||
|     if (logicalLine < 0) { | ||||
| @@ -1035,35 +827,35 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       col = 0; | ||||
|     } | ||||
|     else if (logicalLine >= editor.lineCount()) { | ||||
|       line = normalizeLine(((IjVimEditor) editor).getEditor(), editor.lineCount() - 1); | ||||
|       col = getLineLength(((IjVimEditor) editor).getEditor(), line); | ||||
|       line = EngineEditorHelperKt.normalizeLine(editor, editor.lineCount() - 1); | ||||
|       col = EngineEditorHelperKt.lineLength(editor, line); | ||||
|     } | ||||
|  | ||||
|     LogicalPosition newPos = new LogicalPosition(line, normalizeColumn(((IjVimEditor) editor).getEditor(), line, col, false)); | ||||
|     LogicalPosition newPos = new LogicalPosition(line, EngineEditorHelperKt.normalizeColumn(editor, line, col, false)); | ||||
|  | ||||
|     return ((IjVimEditor) editor).getEditor().logicalPositionToOffset(newPos); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToLineWithStartOfLineOption(@NotNull VimEditor editor, | ||||
|                                                                                            int logicalLine, | ||||
|                                                                                            @NotNull VimCaret caret) { | ||||
|                                                                                            int line, | ||||
|                                                                                            @NotNull ImmutableVimCaret caret) { | ||||
|     if (VimPlugin.getOptionService().isSet(new OptionScope.LOCAL(editor), OptionConstants.startoflineName, OptionConstants.startoflineName)) { | ||||
|       return moveCaretToLineStartSkipLeading(editor, logicalLine); | ||||
|       return moveCaretToLineStartSkipLeading(editor, line); | ||||
|     } | ||||
|     else { | ||||
|       return moveCaretToLineWithSameColumn(editor, logicalLine, caret); | ||||
|       return moveCaretToLineWithSameColumn(editor, line, caret); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean scrollScreen(final @NotNull VimEditor editor, final @NotNull VimCaret caret, int rawCount, boolean down) { | ||||
|   public boolean scrollHalfPage(final @NotNull VimEditor editor, final @NotNull VimCaret caret, int rawCount, boolean down) { | ||||
|     Editor ijEditor = ((IjVimEditor)editor).getEditor(); | ||||
|     Caret ijCaret = ((IjVimCaret)caret).getCaret(); | ||||
|     final CaretModel caretModel = ijEditor.getCaretModel(); | ||||
|     final int currentLogicalLine = caretModel.getLogicalPosition().line; | ||||
|  | ||||
|     if ((!down && currentLogicalLine <= 0) || (down && currentLogicalLine >= getLineCount(ijEditor) - 1)) { | ||||
|     if ((!down && currentLogicalLine <= 0) || (down && currentLogicalLine >= editor.lineCount() - 1)) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
| @@ -1103,9 +895,9 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       targetCaretVisualLine = max(visualTop, min(visualBottom, targetCaretVisualLine)); | ||||
|     } | ||||
|  | ||||
|     int logicalLine = visualLineToLogicalLine(ijEditor, targetCaretVisualLine); | ||||
|     int logicalLine = EngineEditorHelperKt.visualLineToBufferLine(editor, targetCaretVisualLine); | ||||
|     int caretOffset = moveCaretToLineWithStartOfLineOption(editor, logicalLine, caret); | ||||
|     moveCaret(ijEditor, ijCaret, caretOffset); | ||||
|     caret.moveToOffset(caretOffset); | ||||
|  | ||||
|     return true; | ||||
|   } | ||||
| @@ -1118,9 +910,14 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|                                           boolean start) { | ||||
|     final int scrollOffset = getNormalizedScrollOffset(editor); | ||||
|  | ||||
|     int visualLine = rawCount == 0 | ||||
|                      ? editor.getCaretModel().getVisualPosition().line | ||||
|                      : logicalLineToVisualLine(editor, normalizeLine(editor, rawCount - 1)); | ||||
|     int visualLine; | ||||
|     if (rawCount == 0) { | ||||
|       visualLine = editor.getCaretModel().getVisualPosition().line; | ||||
|     } | ||||
|     else { | ||||
|       final int line = EngineEditorHelperKt.normalizeLine(new IjVimEditor(editor), rawCount - 1); | ||||
|       visualLine = new IjVimEditor(editor).bufferLineToVisualLine(line); | ||||
|     } | ||||
|  | ||||
|     // This method moves the current (or [count]) line to the specified screen location | ||||
|     // Scroll offset is applicable, but scroll jump isn't. Offset is applied to screen lines (visual lines) | ||||
| @@ -1133,22 +930,24 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         break; | ||||
|       case BOTTOM: | ||||
|         // Make sure we scroll to an actual line, not virtual space | ||||
|         scrollVisualLineToBottomOfScreen(editor, normalizeVisualLine(editor, visualLine + scrollOffset)); | ||||
|         scrollVisualLineToBottomOfScreen(editor, EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(editor), | ||||
|                                                                                           visualLine + scrollOffset)); | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     if (visualLine != editor.getCaretModel().getVisualPosition().line || start) { | ||||
|       int offset; | ||||
|       if (start) { | ||||
|         offset = moveCaretToLineStartSkipLeading(new IjVimEditor(editor), visualLineToLogicalLine(editor, visualLine)); | ||||
|         offset = moveCaretToLineStartSkipLeading(new IjVimEditor(editor), EngineEditorHelperKt.visualLineToBufferLine( | ||||
|           new IjVimEditor(editor), visualLine)); | ||||
|       } | ||||
|       else { | ||||
|         offset = getVerticalMotionOffset(new IjVimEditor(editor), new IjVimCaret(editor.getCaretModel().getPrimaryCaret()), | ||||
|                                    visualLineToLogicalLine(editor, visualLine) - | ||||
|                                    editor.getCaretModel().getLogicalPosition().line); | ||||
|         offset = moveCaretToLineWithSameColumn(new IjVimEditor(editor), | ||||
|                                                EngineEditorHelperKt.visualLineToBufferLine(new IjVimEditor(editor), visualLine), | ||||
|                                                new IjVimCaret(editor.getCaretModel().getPrimaryCaret())); | ||||
|       } | ||||
|  | ||||
|       moveCaret(editor, editor.getCaretModel().getPrimaryCaret(), offset); | ||||
|       new IjVimCaret(editor.getCaretModel().getPrimaryCaret()).moveToOffset(offset); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -1194,10 +993,10 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|  | ||||
|   @Override | ||||
|   public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToLinePercent(@NotNull VimEditor editor, | ||||
|                                                                              @NotNull VimCaret caret, | ||||
|                                                                              @NotNull ImmutableVimCaret caret, | ||||
|                                                                              int count) { | ||||
|     return moveCaretToLineWithStartOfLineOption(editor, | ||||
|                                                 normalizeLine(((IjVimEditor)editor).getEditor(), | ||||
|                                                 EngineEditorHelperKt.normalizeLine(editor, | ||||
|                                                               (editor.lineCount() * MathUtil.clamp(count, 0, 100) + | ||||
|                                                                99) / 100 - 1), caret); | ||||
|   } | ||||
| @@ -1213,7 +1012,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|       final Editor editor = ((TextEditor)fileEditor).getEditor(); | ||||
|       ExOutputModel.getInstance(editor).clear(); | ||||
|       if (VimStateMachine.getInstance(new IjVimEditor(editor)).getMode() == VimStateMachine.Mode.VISUAL) { | ||||
|         ModeHelper.exitVisualMode(editor); | ||||
|         EngineModeExtensionsKt.exitVisualMode(new IjVimEditor(editor)); | ||||
|         KeyHandler.getInstance().reset(new IjVimEditor(editor)); | ||||
|       } | ||||
|     } | ||||
| @@ -1232,7 +1031,8 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|  | ||||
|     final int scrollOffset = normalizeToScreen ? getNormalizedScrollOffset(editor) : 0; | ||||
|  | ||||
|     final int maxVisualLine = getVisualLineCount(new IjVimEditor(editor)); | ||||
|     @NotNull final VimEditor editor1 = new IjVimEditor(editor); | ||||
|     final int maxVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1); | ||||
|  | ||||
|     final int topVisualLine = getVisualLineAtTopOfScreen(editor); | ||||
|     final int topScrollOff = topVisualLine > 0 ? scrollOffset : 0; | ||||
| @@ -1256,7 +1056,7 @@ public class MotionGroup extends VimMotionGroupBase { | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     final int targetLogicalLine = visualLineToLogicalLine(editor, targetVisualLine); | ||||
|     final int targetLogicalLine = EngineEditorHelperKt.visualLineToBufferLine(new IjVimEditor(editor), targetVisualLine); | ||||
|     return moveCaretToLineWithStartOfLineOption(new IjVimEditor(editor), targetLogicalLine, new IjVimCaret(caret)); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
| @@ -92,7 +82,7 @@ public class ProcessGroup extends VimProcessGroupBase { | ||||
|     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd); | ||||
|     VimStateMachine.getInstance(editor).pushModes(VimStateMachine.Mode.CMD_LINE, VimStateMachine.SubMode.NONE); | ||||
|     ExEntryPanel panel = ExEntryPanel.getInstance(); | ||||
|     panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1); | ||||
|     panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, cmd.getCount()); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
| @@ -123,7 +113,7 @@ public class ProcessGroup extends VimProcessGroupBase { | ||||
|  | ||||
|       logger.debug("processing command"); | ||||
|  | ||||
|       final String text = panel.getText(); | ||||
|       String text = panel.getText(); | ||||
|  | ||||
|       if (!panel.getLabel().equals(":")) { | ||||
|         // Search is handled via Argument.Type.EX_STRING. Although ProcessExEntryAction is registered as the handler for | ||||
| @@ -134,8 +124,16 @@ public class ProcessGroup extends VimProcessGroupBase { | ||||
|  | ||||
|       if (logger.isDebugEnabled()) logger.debug("swing=" + SwingUtilities.isEventDispatchThread()); | ||||
|  | ||||
|       int repeat = 1; | ||||
|       if (text.contains("raction ")) { | ||||
|         text = text.replace("raction ", "action "); | ||||
|         repeat = panel.getCount(); | ||||
|       } | ||||
|  | ||||
|       for (int i = 0; i < repeat; i++) { | ||||
|         VimInjectorKt.getInjector().getVimscriptExecutor().execute(text, editor, context, skipHistory(editor), true, CommandLineVimLContext.INSTANCE); | ||||
|       } | ||||
|     } | ||||
|     catch (ExException e) { | ||||
|       VimPlugin.showMessage(e.getMessage()); | ||||
|       VimPlugin.indicateError(); | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.group; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2022 The IdeaVim authors | ||||
|  * Copyright 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/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.group; | ||||
|  | ||||
| @@ -72,7 +62,6 @@ import java.text.NumberFormat; | ||||
| import java.text.ParsePosition; | ||||
| import java.util.*; | ||||
|  | ||||
| import static com.maddyhome.idea.vim.api.VimInjectorKt.injector; | ||||
| import static com.maddyhome.idea.vim.helper.HelperKt.localEditors; | ||||
| import static com.maddyhome.idea.vim.helper.SearchHelperKtKt.shouldIgnoreCase; | ||||
| import static com.maddyhome.idea.vim.register.RegisterConstants.LAST_SEARCH_REGISTER; | ||||
| @@ -288,20 +277,20 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|  | ||||
|         if (logger.isDebugEnabled()) logger.debug("pattern=" + pattern); | ||||
|  | ||||
|         if (p.charAt() != type) { | ||||
|           if (end.charAt() == type) { | ||||
|             end.inc(); | ||||
|             patternOffset = end.toString(); | ||||
|           } else { | ||||
|             logger.debug("no offset"); | ||||
|             patternOffset = ""; | ||||
|           } | ||||
|         } | ||||
|         else { | ||||
|         if (p.charAt() == type) { | ||||
|           p.inc(); | ||||
|           patternOffset = p.toString(); | ||||
|           if (logger.isDebugEnabled()) logger.debug("offset=" + patternOffset); | ||||
|         } | ||||
|         if (end.charAt(0) == type) { | ||||
|           end.inc(); | ||||
|           patternOffset = end.toString(); | ||||
|           if (logger.isDebugEnabled()) logger.debug("Pattern contains offset " + patternOffset); | ||||
|         } | ||||
|         else { | ||||
|           logger.debug("no offset"); | ||||
|           patternOffset = ""; | ||||
|         } | ||||
|       } | ||||
|       else if (command.length() == 1) { | ||||
|         patternOffset = ""; | ||||
| @@ -431,14 +420,18 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|    * @return        The offset of the result or the start of the word under the caret if not found. Returns -1 on error | ||||
|    */ | ||||
|   @Override | ||||
|   public int searchWord(@NotNull VimEditor editor, @NotNull VimCaret caret, int count, boolean whole, Direction dir) { | ||||
|   public int searchWord(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret, int count, boolean whole, @NotNull Direction dir) { | ||||
|     TextRange range = SearchHelper.findWordUnderCursor(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret()); | ||||
|     if (range == null) { | ||||
|       logger.warn("No range was found"); | ||||
|       return -1; | ||||
|     } | ||||
|  | ||||
|     final String pattern = SearchHelper.makeSearchPattern(EditorHelper.getText(((IjVimEditor)editor).getEditor(), range.getStartOffset(), range.getEndOffset()), whole); | ||||
|     @NotNull final Editor editor1 = ((IjVimEditor)editor).getEditor(); | ||||
|     final int start = range.getStartOffset(); | ||||
|     final int end = range.getEndOffset(); | ||||
|     final String pattern = SearchHelper.makeSearchPattern( | ||||
|       EngineEditorHelperKt.getText(new IjVimEditor(editor1), start, end), whole); | ||||
|  | ||||
|     // Updates RE_LAST, ready for findItOffset | ||||
|     // Direction is always saved | ||||
| @@ -468,7 +461,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|    * @return        The offset of the next match, or -1 if not found | ||||
|    */ | ||||
|   @Override | ||||
|   public int searchNext(@NotNull VimEditor editor, @NotNull VimCaret caret, int count) { | ||||
|   public int searchNext(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret, int count) { | ||||
|     return searchNextWithDirection(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret(), count, lastDir); | ||||
|   } | ||||
|  | ||||
| @@ -484,7 +477,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|    * @return        The offset of the next match, or -1 if not found | ||||
|    */ | ||||
|   @Override | ||||
|   public int searchPrevious(@NotNull VimEditor editor, @NotNull VimCaret caret, int count) { | ||||
|   public int searchPrevious(@NotNull VimEditor editor, @NotNull ImmutableVimCaret caret, int count) { | ||||
|     return searchNextWithDirection(((IjVimEditor)editor).getEditor(), ((IjVimCaret)caret).getCaret(), count, | ||||
|                                    lastDir.reverse()); | ||||
|   } | ||||
| @@ -541,7 +534,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|     // Explicitly exit visual mode here, so that visual mode marks don't change when we move the cursor to a match. | ||||
|     List<ExException> exceptions = new ArrayList<>(); | ||||
|     if (CommandStateHelper.inVisualMode(((IjVimEditor) editor).getEditor())) { | ||||
|       ModeHelper.exitVisualMode(((IjVimEditor) editor).getEditor()); | ||||
|       EngineModeExtensionsKt.exitVisualMode(editor); | ||||
|     } | ||||
|  | ||||
|     CharPointer cmd = new CharPointer(new StringBuffer(exarg)); | ||||
| @@ -688,7 +681,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|         return false; | ||||
|       } | ||||
|       line1 = line2; | ||||
|       line2 = EditorHelper.normalizeLine(((IjVimEditor) editor).getEditor(), line1 + i - 1); | ||||
|       line2 = EngineEditorHelperKt.normalizeLine(editor, line1 + i - 1); | ||||
|     } | ||||
|  | ||||
|     /* | ||||
| @@ -758,7 +751,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|     int searchcol = 0; | ||||
|     boolean firstMatch = true; | ||||
|     boolean got_quit = false; | ||||
|     int lcount = EditorHelper.getLineCount(((IjVimEditor) editor).getEditor()); | ||||
|     int lcount = editor.lineCount(); | ||||
|     Expression expression = null; | ||||
|     for (int lnum = line1; lnum <= line2 && !got_quit; ) { | ||||
|       CharacterPosition newpos = null; | ||||
| @@ -817,7 +810,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|           } | ||||
|           if (doReplace) { | ||||
|             SubmatchFunctionHandler.INSTANCE.setLatestMatch(((IjVimEditor) editor).getEditor().getDocument().getText(new com.intellij.openapi.util.TextRange(startoff, endoff))); | ||||
|             injector.getMotion().moveCaret(editor, caret, startoff); | ||||
|             caret.moveToOffset(startoff); | ||||
|             if (expression != null) { | ||||
|               try { | ||||
|               match = expression | ||||
| @@ -866,8 +859,8 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|  | ||||
|     if (!got_quit) { | ||||
|       if (lastMatch != -1) { | ||||
|         injector.getMotion().moveCaret(editor, caret, | ||||
|           VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, editor.offsetToLogicalPosition(lastMatch).getLine())); | ||||
|         caret.moveToOffset( | ||||
|           VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, editor.offsetToBufferPosition(lastMatch).getLine())); | ||||
|       } | ||||
|       else { | ||||
|         VimPlugin.showMessage(MessageHelper.message(Msg.e_patnotf2, pattern)); | ||||
| @@ -986,7 +979,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|       return false; | ||||
|     }; | ||||
|     if (ApplicationManager.getApplication().isUnitTestMode()) { | ||||
|       MotionGroup.moveCaret(editor, caret, startoff); | ||||
|       new IjVimCaret(caret).moveToOffset(startoff); | ||||
|       final TestInputModel inputModel = TestInputModel.getInstance(editor); | ||||
|       for (KeyStroke key = inputModel.nextKeyStroke(); key != null; key = inputModel.nextKeyStroke()) { | ||||
|         if (!keyStrokeProcessor.invoke(key)) { | ||||
| @@ -998,7 +991,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|       // XXX: The Ex entry panel is used only for UI here, its logic might be inappropriate for this method | ||||
|       final ExEntryPanel exEntryPanel = ExEntryPanel.getInstanceWithoutShortcuts(); | ||||
|       exEntryPanel.activate(editor, EditorDataContext.init(editor, null), MessageHelper.message("replace.with.0", match), "", 1); | ||||
|       MotionGroup.moveCaret(editor, caret, startoff); | ||||
|       new IjVimCaret(caret).moveToOffset(startoff); | ||||
|       ModalEntry.INSTANCE.activate(new IjVimEditor(editor), keyStrokeProcessor); | ||||
|       exEntryPanel.deactivate(true, false); | ||||
|     } | ||||
| @@ -1133,7 +1126,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|  | ||||
|   @Override | ||||
|   public Integer findDecimalNumber(@NotNull String line) { | ||||
|     Pair<TextRange, SearchHelper.NumberType> searchResult = SearchHelper.findNumberInText(line, 0, false, false, false); | ||||
|     Pair<TextRange, NumberType> searchResult = SearchHelper.findNumberInText(line, 0, false, false, false); | ||||
|     if (searchResult != null) { | ||||
|       TextRange range = searchResult.component1(); | ||||
|       return Integer.parseInt(line.substring(range.getStartOffset(), range.getEndOffset())); | ||||
| @@ -1291,7 +1284,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo | ||||
|  | ||||
|     if (offsetIsLineOffset) { | ||||
|       int line = editor.offsetToLogicalPosition(range.getStartOffset()).line; | ||||
|       int newLine = EditorHelper.normalizeLine(editor, line + offset); | ||||
|       int newLine = EngineEditorHelperKt.normalizeLine(new IjVimEditor(editor), line + offset); | ||||
|  | ||||
|       // TODO: Don't move the caret! | ||||
|       res = VimPlugin.getMotion().moveCaretToLineStart(new IjVimEditor(editor), newLine); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user