1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-08-17 16:31:45 +02:00

Compare commits

...

275 Commits
0.52 ... 0.54

Author SHA1 Message Date
Alex Plate
a4be636f9d Run manual tests 2019-11-20 11:47:38 +03:00
Alex Plate
a2bae6795f Prepare to the release 0.54 2019-11-20 11:41:05 +03:00
Alex Plate
8e12c9bef0 Fix backward motion for ex commands 2019-11-19 14:31:30 +03:00
Alex Plate
88926c3eef Update CHANGES.md 2019-11-18 17:51:46 +03:00
Alex Plate
8dd774446b Update license information 2019-11-18 11:55:34 +03:00
Alex Plate
46cf112378 Revert user statistic 2019-11-14 13:12:50 +03:00
Alex Plate
5d2520d057 Revert compile dependencies 2019-11-14 13:10:12 +03:00
Alex Plate
a6ea89162a Change collector option 2019-11-08 14:50:02 +03:00
Alex Plate
1039cf661d Fix capability with 183 2019-11-08 14:41:18 +03:00
Alex Plate
eaf9f0bbfa Fix compatibility with older IDEA versions 2019-11-07 18:24:34 +03:00
Alex Plate
9e036176ef Update CHANGES 2019-11-07 16:40:55 +03:00
Alex Plate
31e1edcc72 Add userstatistic info 2019-11-07 16:26:22 +03:00
Alex Plate
7d9d8d4a02 Fix execution of actions in visual mode with incsearch enabled 2019-11-07 11:14:16 +03:00
Alex Plate
71cb43e751 Remove garbage 2019-11-05 17:40:15 +03:00
Alex Plate
f27e00500e Do not add kotlin stdlib to resulting jar 2019-11-05 17:35:10 +03:00
Alex Plate
617c0e3813 Add missing gif 2019-11-05 15:54:51 +03:00
Alex Plate
76634e3eed Fix "wrap with if" 2019-11-05 15:53:33 +03:00
Alex Plate
21c16b26c9 Update set-commands 2019-11-05 10:19:29 +03:00
Alex Plate
9d6f43cfeb Fix problem with lookup selection 2019-11-01 13:55:32 +03:00
Alex Plate
cdcb31cf2f Change listeners for tests 2019-10-31 18:13:37 +03:00
Alex Plate
e17f571dba Remove useless teamcity report 2019-10-31 17:56:36 +03:00
Alex Plate
629c48bba0 Run manual tests 2019-10-31 17:55:37 +03:00
Alex Plate
5078df6caf Update CHANGES 2019-10-31 17:50:34 +03:00
Alex Plate
2c5c4d9714 Update set-commands 2019-10-31 13:13:30 +03:00
Alex Plate
316cd2c02c Rename refactoring to ideaselection 2019-10-31 13:05:22 +03:00
Alex Plate
e56f08505f Convert IdeaVisualControlTest.kt to option test 2019-10-30 18:02:15 +03:00
Alex Plate
58a1f9e275 Move tests to different location 2019-10-30 17:57:24 +03:00
Alex Plate
bfdf54db67 Add tests for idearefactormode option 2019-10-30 17:46:25 +03:00
Alex Plate
df8598a6f4 Run manual tests 2019-10-30 16:49:39 +03:00
Alex Plate
4ca9e74249 Refactor controlNonVimSelection 2019-10-30 16:43:54 +03:00
Alex Plate
33caeeaf1d Fix log 2019-10-30 16:02:12 +03:00
Alex Plate
53a8c3ecc8 Move all mode exit methods to the same place 2019-10-30 16:00:03 +03:00
Alex Plate
fabe066f94 Move selection control methods to the separate file 2019-10-30 14:45:40 +03:00
Alex Plate
5672bc0fb2 Rename function 2019-10-30 14:29:51 +03:00
Alex Plate
c77f43e7c7 Initial idearefactormode support 2019-10-30 13:00:04 +03:00
Alex Plate
d47ad34909 Fix removed vimstate saving 2019-10-30 12:38:06 +03:00
Alex Plate
96f731e9c9 Refactor MotionUp/Down actions 2019-10-29 15:37:48 +03:00
Alex Plate
1b9376a9f5 Rename motion up/down actions 2019-10-29 15:31:54 +03:00
Alex Plate
1425ee0048 Ctrl-N and Ctrl-P actions for lookup in normal mode 2019-10-29 15:28:54 +03:00
Alex Plate
3a014b2a13 Convert VimPluginToggleAction to kotlin 2019-10-29 14:39:55 +03:00
Alex Plate
38c4e6bebc Rename .java to .kt 2019-10-29 14:39:05 +03:00
Alex Plate
171404bf43 Change the superclass of VimPluginToggleAction 2019-10-29 14:33:14 +03:00
Alex Plate
73b1adce1b Make common action for enabling/disabling IdeaVim 2019-10-28 18:42:37 +03:00
Alex Plate
90f55821e0 Remove not-released option 2019-10-28 15:35:53 +03:00
Alex Plate
fee8009f38 Make vim actions popup as a separate action 2019-10-28 14:59:35 +03:00
Alex Plate
8d698aeacd Update the Join EAP dialog 2019-10-28 13:50:21 +03:00
Alex Plate
fbd588444f Hide some icon actions to sublist 2019-10-26 16:06:21 +03:00
Alex Plate
5735769ee7 null save marks restoring 2019-10-25 20:19:40 +03:00
Alex Plate
150f9190d5 Add customisation for surround with for 2019-10-25 19:58:00 +03:00
Alex Plate
6a1e8a0c22 Fix template with multiple variables 2019-10-25 17:14:23 +03:00
Alex Plate
66fca4a921 [VIM-1819] Fix execution of some rider actions 2019-10-25 15:26:33 +03:00
Alex Plate
9a2accc74b Use the correct action for next variable 2019-10-25 14:33:52 +03:00
Alex Plate
5584b5ec3a Refactor selection correction during the template 2019-10-24 16:17:34 +03:00
Alex Plate
3b4121f59a Reformat code 2019-10-24 16:15:11 +03:00
Alex Plate
35eb6c2974 Add tests and doc 2019-10-24 15:16:59 +03:00
Alex Plate
e51deac151 Make TemplateTest.kt as option test 2019-10-24 12:59:02 +03:00
Alex Plate
c9bb160291 Add savemodefor option 2019-10-23 13:17:02 +03:00
Alex Plate
586979644c Add inNormalMode helper function 2019-10-23 13:15:09 +03:00
Alex Plate
0d376eaa1d Update icon list labels 2019-10-22 12:44:25 +03:00
Alex Plate
086c3d1a24 Update the join EAP dialog 2019-10-22 12:33:45 +03:00
Alex Plate
91e75561a3 Remove the default shortcut 2019-10-21 17:35:55 +03:00
Alex Plate
979bf26441 Change the implementation of system marks 2019-10-21 16:58:22 +03:00
Alex Plate
49844ddd9b Refactor fileLocation classes 2019-10-21 15:30:46 +03:00
Alex Plate
d095ebb2f3 Rename .java to .kt 2019-10-21 15:07:14 +03:00
Alex Plate
36f473508a Disable mappings for the second part of multikey commands 2019-10-21 13:40:53 +03:00
Alex Plate
5eb2810352 Add new corrections for caret vertical motion 2019-10-18 15:15:35 +03:00
Alex Plate
ee9e3a6673 Covert DocumentManager.kt to kotlin 2019-10-18 10:24:48 +03:00
Alex Plate
81a6bd528d WIP: Renaming file 'DocumentManager' with Kotlin extension 2019-10-18 10:09:20 +03:00
Alex Plate
0cd32c97c4 Update changes 2019-10-18 10:07:41 +03:00
Alex Plate
9bef55c63e Correct selection processing
The last character in the line is not selected if the selection was started from the middle of this character and has a negative direction
2019-10-17 19:17:38 +03:00
Alex Plate
9b8686c25f Reset caret on escape 2019-10-17 17:43:37 +03:00
Alex Plate
7130760114 Fix vertical caret movements with inlays 2019-10-17 17:34:10 +03:00
Alex Plate
c6390874a2 Update changes 2019-10-17 17:16:28 +03:00
Alex Plate
bf758dcd32 Add missing bundle property 2019-10-17 15:42:41 +03:00
Alex Plate
2258ffa5eb Fix incompatibilities with older version of IJ 2019-10-17 15:38:14 +03:00
Alex Plate
20b8e8db8b Add icon to status bar 2019-10-17 15:20:01 +03:00
Alex Plate
0738d965fd Add ideavim icon for actions 2019-10-16 15:05:45 +03:00
Alex Plate
a3a421410f [VIM-1749] Tag surround is finished on > 2019-10-15 19:52:48 +03:00
Alex Plate
1921bef0ea Use build script to print TeamCity status 2019-10-15 19:11:09 +03:00
Alex Plate
70270830dc Add badge for 2019.2 tests 2019-10-15 18:56:32 +03:00
Alex Plate
d57f465e60 Add IdeaVim icon 2019-10-15 18:43:32 +03:00
Alex Plate
03c38e3454 [VIM-1804] Correct disabling and enabling IdeaVim 2019-10-15 18:14:13 +03:00
Alex Plate
be7d632cba Disable IdeaVim while AceJump is active.
https://github.com/acejump/AceJump/issues/266
2019-10-14 17:05:18 +03:00
Alex Plate
8c0a85abf4 Vim script supports evaluating of integers 2019-10-14 12:44:08 +03:00
Alex Plate
497e8c06f1 Create getter for last direction 2019-10-10 19:35:04 +03:00
Alex Plate
c1bf84605c Make findAll function public 2019-10-10 18:44:37 +03:00
Alex Plate
e362f12394 Add comment for toRegex function 2019-10-10 16:29:51 +03:00
Alex Plate
02d201a2f1 Parse the scope of let expression 2019-10-10 16:28:27 +03:00
Alex Plate
48915cc6ad Print iskeyword value as a regex string 2019-10-09 18:20:16 +03:00
Alex Plate
02b065cc2c Extensions can use linewise selection 2019-10-08 14:36:20 +03:00
Alex Plate
a255597bc0 Fix exception 2019-10-08 10:37:11 +03:00
Alex Plate
29858e8b10 Do not handle plugin incomplete mappings 2019-10-08 10:31:47 +03:00
Alex Plate
972cfb265b Change MapHandler formatting 2019-10-04 18:46:30 +03:00
Alex Plate
5e8a3afe61 Provide correct mapping names
vmap - mapping for visual and select mode
xmap - mapping for visual mode
2019-10-04 18:45:46 +03:00
Alex Plate
700decb2e0 Update mappings handler for properly handler intersecting mappings. 2019-10-02 18:44:43 +03:00
Alex Plate
8368055397 Registrar should be written in java due to capability problems 2019-10-01 20:33:00 +03:00
Alex Plate
0d0f1f1c0c External plugins can now contribute to vimExtension 2019-10-01 19:59:41 +03:00
Alex Plate
db68ae5cea Add tests for extension in op mode 2019-10-01 10:15:44 +03:00
Alex Plate
0fd7c4aa4f Clean up 2019-09-30 19:46:40 +03:00
Alex Plate
8592e6ef60 Plugins can act as an operator 2019-09-30 19:46:03 +03:00
Alex Plate
e9fb02220a Update api of ListenerSuppressor 2019-09-30 19:46:03 +03:00
Alex Plate
aa54a0cd98 Execute mapping in sync way 2019-09-30 19:46:02 +03:00
Alex Plate
eb724c8753 Fix yy command 2019-09-27 22:11:28 +03:00
Alex Plate
1bb0caa704 Fix dd for empty line 2019-09-27 17:46:00 +03:00
Alex Plate
5bf2bc4a7b Reformat Command 2019-09-27 14:56:24 +03:00
Alex Plate
70fd7ef89d operator-W doesn't affect the next line 2019-09-26 15:31:05 +03:00
Alex Plate
50d8e79571 Use fail function from kotlin 2019-09-26 14:47:36 +03:00
Alex Plate
c236ddd967 Add docs to Nodes 2019-09-26 11:25:49 +03:00
Alex Plate
b551518911 Add additional checks for command consistency 2019-09-25 20:09:21 +03:00
Alex Plate
1be49b06f3 Fix processing of / and ? commands 2019-09-25 20:01:20 +03:00
Alex Plate
200a9c6318 Update key handling process 2019-09-25 20:01:19 +03:00
Alex Plate
9f10106d75 Use only one handler to process @@ and @: commands 2019-09-25 20:00:23 +03:00
Alex Plate
6d4ff752a0 Double commands are processed in original way 2019-09-25 16:22:54 +03:00
Alex Plate
29ecae66a9 Make baseExecute as final method 2019-09-25 13:20:16 +03:00
Alex Plate
9c5f50d0a6 Move change motion tests to the separate file 2019-09-25 13:02:49 +03:00
Alex Plate
8fcc9ac1e2 Some fixes on change motion actions. 2019-09-24 17:53:36 +03:00
Alex Plate
8d83b3b1e7 Remove parameter from getMotionRange 2019-09-24 17:13:20 +03:00
Alex Plate
155570b6bf Remove unused flag 2019-09-24 16:44:12 +03:00
Alex Plate
831dc35935 Update processing of text objects 2019-09-24 16:42:46 +03:00
Alex Plate
b641f1b67c Motion command should explicit define inclusive / exclusive 2019-09-24 15:24:39 +03:00
Alex Plate
3c4906b8ac Get rid of useless FLAG_MOT_EXCLUSIVE 2019-09-23 17:31:17 +03:00
Alex Plate
a575bc92cc Correctly process d_ command 2019-09-18 22:40:29 +03:00
Alex Plate
7794e9ccd2 Fix undo mapping 2019-09-18 21:28:28 +03:00
Alex Plate
4f5301a7e0 Fix mapping for undo action 2019-09-17 18:42:41 +03:00
Alex Plate
6842936a75 Add state for awaiting for digraph (or char) input 2019-09-17 18:42:41 +03:00
Alex Plate
a0bf6599fa Add comment for command flags option 2019-09-17 18:42:41 +03:00
Alex Plate
c0384949a3 Add javadoc for key mapping 2019-09-17 18:42:41 +03:00
Alex Plate
371f4b128e Rename EX_ENTRY to CMD_LINE mode 2019-09-17 18:42:41 +03:00
Alex Plate
29fc776293 Remove NONE argument 2019-09-17 18:42:40 +03:00
Alex Plate
bbdf87190c Extract node argument into the separate variable 2019-09-17 18:42:40 +03:00
Alex Plate
02a448f284 Convert command nodes to kt 2019-09-17 18:42:40 +03:00
Alex Plate
8665878b04 Remove useless FLAG_OP_PEND flag 2019-09-17 18:42:40 +03:00
Alex Plate
c23812941b Clean up Argument class 2019-09-17 18:42:40 +03:00
Alex Plate
fdac774745 Convert FilterMotionAction to kt 2019-09-17 18:42:40 +03:00
Alex Plate
0a38b65ded WIP: Renaming file 'FilterMotionAction' with Kotlin extension 2019-09-17 18:42:39 +03:00
Alex Plate
a7f44c8dd1 Revert "Temporally disable multithread startup"
This reverts commit bef3b3ba
2019-09-17 18:32:12 +03:00
Alex Plate
2444bd3c2d Update Changes.md 2019-09-17 18:29:36 +03:00
Alex Plate
27f74844cc Update changes 2019-09-17 18:28:40 +03:00
Alex Plate
d041712bd8 Run manual tests 2019-09-17 18:13:08 +03:00
Alex Plate
ef0f2024c2 Update changes 2019-09-17 18:09:08 +03:00
Alex Plate
bef3b3ba62 Temporally disable multithread startup 2019-09-17 17:49:11 +03:00
Alex Plate
037aee7c59 Make kotlin jvm 1.8 compatible. 2019-09-17 11:07:09 +03:00
Alex Plate
0e3c13099b Do not use external APP_CONFIG variable 2019-09-17 10:36:18 +03:00
Alex Plate
8e3515bc34 Clear definition of commands used to enabled plugins 2019-09-09 14:03:12 +03:00
Alex Plate
c736de7875 Deprecate local storage due to bug in storage settings 2019-09-06 18:45:12 +03:00
Alex Plate
42375d143e [VIM-1772] Fix last character for :y command 2019-09-04 17:30:34 +03:00
Alex Plate
7e6d7aed20 Add some docs to controlNonVimSelection method 2019-09-04 16:07:31 +03:00
Alex Plate
ea68d0c28f Enter correct caret shape after new mode entering 2019-09-04 16:00:14 +03:00
Alex Plate
9cc82aedf2 Join exit visual functions 2019-09-04 15:13:10 +03:00
Alex Plate
c52abce656 Fix small problem with "wrap with if" 2019-09-04 13:07:22 +03:00
Alex Plate
65d8368ad4 Update changes 2019-09-04 11:48:35 +03:00
Alex Plate
cf2f223ad4 [VIM-1781] Fix yanking with $ motion 2019-09-04 11:30:24 +03:00
Alex Plate
daae1aec6c [VIM-1785][VIM-1731] Fix yanking to clipboard 2019-09-03 18:41:38 +03:00
Alex Plate
59bcd24c47 Make actions loading async 2019-09-03 14:07:36 +03:00
Alex Plate
44e224489b Update action registration 2019-09-03 14:07:35 +03:00
Alex Plate
8134e0223f Disable async initialization 2019-09-03 14:07:35 +03:00
Alex Plate
482249a05b Convert ex commands to extension points 2019-09-03 14:07:35 +03:00
Alex Plate
d0998dc093 Do not register sticky balloon 2019-09-03 14:07:35 +03:00
Alex Plate
848bb01c10 Get rid of VimActionBean 2019-09-03 14:07:35 +03:00
Alex Plate
e39eb76aca Remove id and text from actions 2019-09-03 14:07:35 +03:00
Alex Plate
d6d2a55747 Use handlers directly (without actions) 2019-09-03 14:07:35 +03:00
Alex Plate
355fa1a622 Migrate methods from VimCommandAction to handlers 2019-09-03 14:07:34 +03:00
Alex Plate
fb007b8835 Move action settings to handler 2019-09-03 14:07:34 +03:00
Alex Plate
256f5fcd0e Handlers do not execute EditorActionHandler anymore 2019-09-03 14:07:34 +03:00
Alex Plate
e698c950a3 VimCommandActionBase doesn't extend EditorAction anymore 2019-09-03 14:07:34 +03:00
Alex Plate
d0b9c3c118 Make action in command not nullable 2019-09-03 14:07:34 +03:00
Alex Plate
24358ca1a9 [A2EP] Add method to find vim action by id
A2EP - Process of convertation actions to extension points
2019-09-03 14:07:33 +03:00
Alex Plate
6a21c94a0c [A2EP] Execute actions w/o using executeAction
A2EP - Process of convertation actions to extension points
2019-09-03 14:07:33 +03:00
Alex Plate
2d39a1e4b8 [A2EP] Move some actions to the level of VimActionBase
A2EP - Process of convertation actions to extension points
2019-09-03 14:07:33 +03:00
Alex Plate
e97a8da721 [A2EP] Remove action id from command tree
A2EP - Process of convertation actions to extension points
2019-09-03 14:07:33 +03:00
Alex Plate
665aaa3af9 [A2EP] Create "native actions"
A2EP - Process of convertation actions to extension points
2019-09-03 14:07:33 +03:00
Alex Plate
17fe1da4ed [A2EP] Convert actions into extension point
A2EP - Process of convertation actions to extenstion points
2019-09-03 14:07:33 +03:00
Alex Plate
cb6c94b4f9 Transform all groups into application services 2019-09-03 14:07:33 +03:00
Alex Plate
6fd6765bee Initialize IdeaVim components on non-EDT 2019-09-03 14:07:32 +03:00
Alex Plate
66b7019da9 Update kotlin plugin to 1.3.50 2019-09-03 14:07:32 +03:00
Alex Plate
2c11624e32 Merge pull request #208 from citizenmatt/bug/search-highlights
Fix search related bugs
2019-09-03 14:06:19 +03:00
Matt Ellis
e44d7e6d49 Update CHANGES.md 2019-09-02 17:52:53 +01:00
Matt Ellis
261911f6de [VIM-1773] Provide fall back error stripe colour 2019-09-02 17:37:44 +01:00
Matt Ellis
fe714a9003 Move caret during incsearch to match Vim behaviour 2019-09-02 17:05:27 +01:00
Matt Ellis
e8501a658b Merge branch 'master' into bug/search-highlights 2019-09-02 12:31:28 +01:00
Alex Plate
3fb4830456 Create file that describes manual tests for IdeaVim project 2019-08-26 17:02:47 +03:00
Alex Plate
39982b507a [VIM-1685] Correct shape of caret in case of zero-width selection 2019-08-26 16:52:01 +03:00
Alex Plate
4bd4f3ac68 Update changes 2019-08-26 12:37:41 +03:00
Alex Plate
8533ef7739 Fix wrong CHANGEs log 2019-08-26 12:35:57 +03:00
Alex Plate
bd6d61c8c7 Merge pull request #201 from jorgengranseth/support-surround-function-name
Support f and F surround commands (function name)
2019-08-26 12:32:09 +03:00
Alex Plate
7045ffbdb8 Fix global marks removing 2019-08-26 12:27:23 +03:00
Alex Plate
9e47f4a7c3 Add Jørgen Granseth to contributors list 2019-08-26 12:15:46 +03:00
Alex Plate
c886e49682 Add comment for different types of marks 2019-08-26 12:13:35 +03:00
Alex Plate
8fdec8e816 Merge pull request #202 from jorgengranseth/implement-delmarks-command
VIM-1720 Implement Ex command :delm[arks]
2019-08-26 12:12:24 +03:00
Alex Plate
131387d0ff Add comment about changes that should be performed on version update 2019-08-23 16:57:20 +03:00
Alex Plate
f4a2b83afc Update CHANGES 2019-08-23 16:54:10 +03:00
Alex Plate
1c02ad6b4c Merge pull request #204 from citizenmatt/feature/line-numbers
Improve relative line numbers and VCS annotations
2019-08-23 16:12:55 +03:00
Alex Plate
d93890ddcb Merge pull request #205 from citizenmatt/bug/ex-caret
[VIM-1766] Fix ex caret rendering on Linux
2019-08-23 15:14:27 +03:00
Alex Plate
ca530159bb Merge pull request #206 from sumoooru2/master
Fix jump between files with moveCaretToJump
2019-08-23 15:08:42 +03:00
Alex Plate
b76b747235 Update AUTHORS.md 2019-08-23 14:37:18 +03:00
sumoooru2
67896b7d3a Fix jump between files with moveCaretToJump 2019-08-22 16:26:26 +09:00
sumoooru2
3b598a6f45 Merge pull request #1 from JetBrains/master
update
2019-08-22 15:16:52 +09:00
Alex Plate
62466123ff Change URLs to https
TPV-3480
2019-08-20 13:10:19 +03:00
Matt Ellis
14163a0791 [VIM-1766] Fix ex caret rendering on Linux 2019-08-13 20:28:22 +01:00
Jørgen Granseth
52a8a175a6 Move constants for :delmarks to MarkGroup
Reduce, reuse, recycle.
2019-08-12 20:19:14 +02:00
Matt Ellis
0a83b0826a Use line number converter for relative line numbers
Fixes most problems with relative line numbers and VCS annotations. Only downside is that the current line is shown as blank unless :set number is set as well as :set relativenumber. There is also a chance some other plugin could install a different line number converter without us knowing, although there are no known examples of this.

Resolves VIM-1032, fixes VIM-1671, fixes VIM-1762
2019-08-10 14:26:16 +01:00
Matt Ellis
d854cd7024 Improve relative line numbers and VCS annotations
Improves TextAnnotationGutterProvider implementation, but still has issues. Relative line numbers can display alongside VCS annotations, but 183 and 191 treats the relative line number provider as a VCS annotation, so the VCS toggle is enabled incorrectly, and toggling incorrectly closes the relative line provider. 192 works much better - VCS annotations ignores the relative line numbers, but disabling relative line numbers also closes VCS annotations because we’re not using a 192 specific API.

Resolves VIM-1032, fixes VIM-1671, fixes VIM-1762
2019-08-09 23:39:02 +01:00
Matt Ellis
7ac8d7a43a Fix moving caret while confirming replace 2019-08-08 12:13:38 +01:00
Alex Plate
b012618968 Add readonly marker 2019-08-07 17:24:19 +03:00
Alex Plate
fba59ff347 [EA-134791] Fix yank in motion 2019-08-07 17:24:18 +03:00
Alex Plate
60caac5139 Update CHANGES.md 2019-08-07 14:14:01 +03:00
Matt Ellis
27d2742386 Fix bug with search updates getting stuck off 2019-08-07 09:42:45 +01:00
Matt Ellis
5ef25cfa6f Keep scroll location when adding incsearch offset 2019-08-06 23:24:39 +01:00
Matt Ellis
17e3dfe2bb [VIM-1757] Improve handling of search offsets 2019-08-06 22:32:47 +01:00
Alex Plate
307e438a1e [EA-128752] Fix NPE on isPrimaryEditor 2019-08-06 15:38:33 +03:00
Alex Plate
89489f7c7f [EA-144484] Fix NPE on panel activation 2019-08-06 15:15:31 +03:00
Alex Plate
923a4706a0 [EA-137898] Fix file is invalid exception 2019-08-06 14:23:03 +03:00
Alex Plate
2594c7179e [EA-138502] Control-flow exceptions (like ProcessCanceledException) should never be logged 2019-08-06 14:21:33 +03:00
Matt Ellis
a334ff33cd [VIM-1717] Reset scroll position correctly if no incsearch match 2019-08-06 00:33:58 +01:00
Alex Plate
0e2289caa6 [EA-129083] Fix OOBE for # action 2019-08-05 20:39:07 +03:00
Alex Plate
be26968237 [EA-138309] Fix possible exception 2019-08-05 20:20:44 +03:00
Jørgen Granseth
b0c1ecfdc5 Add access flag 2019-08-05 19:09:59 +02:00
Alex Plate
b4d5dcbf57 Reformat code 2019-08-05 19:06:27 +02:00
Jørgen Granseth
3161ba8983 Implement Ex command :delm[arks]
Deletes existing marks. See
http://vimdoc.sourceforge.net/htmldoc/motion.html#:delmarks
for details.
2019-08-05 19:06:19 +02:00
Alex Plate
022f1ededc Fix caret shape after enabling of plugin 2019-08-05 19:50:32 +03:00
Alex Plate
70a19dd95d Fix positioning on the end line in insert mode 2019-08-05 19:19:46 +03:00
Alex Plate
00b3f5b9f5 Update CHANGES.md 2019-08-05 13:59:49 +03:00
Alex Plate
8b0bb413d8 Merge pull request #198 from citizenmatt/bug/ex-dead-keys
Fix exception with dead keys in ex entry
2019-08-05 13:14:14 +03:00
Matt Ellis
bd5e7d94fe Fix tests 2019-08-02 21:21:32 +01:00
Matt Ellis
d43b2364a0 Reset ex entry panel when emulation is disabled 2019-08-02 16:49:00 +01:00
Matt Ellis
610e73d9e3 Merge branch 'master' into bug/ex-dead-keys 2019-08-02 13:55:31 +01:00
Alex Plate
6f2a454d46 [EA-141098] Fix exception during surround 2019-08-02 15:30:45 +03:00
Alex Plate
4edce29d53 [EA-209287] Fix exception on file close 2019-08-02 15:25:40 +03:00
Alex Plate
ed2b8dd129 Fix ex search for japanese language 2019-08-02 14:03:30 +03:00
Alex Plate
42cdb36a51 Update CHANGES.md 2019-08-01 18:48:47 +03:00
Alex Plate
159c22ac21 [EA-117268 2352322] Fix OOBE for check in string function 2019-08-01 18:34:50 +03:00
Alex Plate
75b6833245 [EA-117268 2386601] Fix OOBE for sentence detection 2019-08-01 18:34:49 +03:00
Alex Plate
b567717c75 [EA-117268 2394021] Fix OOBE for isEmptyLine function 2019-08-01 18:34:49 +03:00
Alex Plate
b2af829e2e [EA-117268 5135780] Fix OOBE for display ascii info 2019-08-01 18:34:49 +03:00
Alex Plate
6e81714937 [EA-117268 5154892] Fix OOBE for motion outer word 2019-08-01 18:34:49 +03:00
Alex Plate
cb9474d8d0 [EA-117268 5159449] Fix exception for inser character around cursor 2019-08-01 18:34:49 +03:00
Alex Plate
be47e4c050 [EA-117268 5165327] Fix a' for last caret position 2019-08-01 18:34:45 +03:00
Alex Plate
c301898147 [EA-117268 5167045] Fix das for empty file 2019-08-01 17:35:51 +03:00
Alex Plate
8324561022 Remove code comments 2019-08-01 17:17:06 +03:00
Alex Plate
834d630ef7 [EA-117268] Fix exception with w action 2019-08-01 17:09:43 +03:00
Alex Plate
c6259adad1 [VIM-1743] Do not show ideaput notification during surround 2019-08-01 16:03:11 +03:00
Alex Plate
9d1be34958 [VIM-1648] Make S&R self synchronized 2019-08-01 13:20:00 +03:00
Alex Plate
ce4e64ec40 Create annotations to annotate whenever a function require write/read lock 2019-07-31 21:15:32 +03:00
Jørgen Granseth
92125b49f0 Emphasize surround cursor movement in tests 2019-07-31 20:06:26 +02:00
Alex Plate
b017466270 Clean up searchAndReplace method 2019-07-31 20:35:10 +03:00
Alex Plate
568d2304ea Ex commands should define write/read access explicitly 2019-07-31 20:15:09 +03:00
Alex Plate
5dc1b245d0 Get rid of OTHER_READ_WRITE flag because technically it's right action 2019-07-31 16:56:57 +03:00
Alex Plate
978d95b351 Clean up ex command processing 2019-07-31 16:47:19 +03:00
Alex Plate
90079c9dfe Remove legacy DONT_REOPEN flag
It's not used since 18cd7547
2019-07-31 16:26:48 +03:00
Alex Plate
57dec7e211 Fix mouse click appearance 2019-07-30 19:32:54 +03:00
Alex Plate
fa75c853a7 Update mouse pressed caret rules 2019-07-30 18:53:03 +03:00
Alex Plate
0887a57e29 [VIM-1725] Enable selection adjustment with a small delay 2019-07-30 17:52:34 +03:00
Alex Plate
18901dcd44 [EA-104755] Fix "Editor is disposed" exception with CTRL-O command 2019-07-29 20:11:20 +03:00
Jørgen Granseth
a6e0fbd5e6 Add the s surround action (preceding space)
https://github.com/tpope/vim-surround/blob/master/doc/surround.txt#L148
2019-07-27 02:12:52 +02:00
Jørgen Granseth
c07d0353f0 Support f and F surround commands (function name)
https://github.com/tpope/vim-surround/blob/master/doc/surround.txt#L138
2019-07-26 22:14:10 +02:00
Alex Plate
caecbe5b63 Reformat isEndAllowed method 2019-07-26 20:24:54 +03:00
Alex Plate
077cab656b [EA-209305] Fix SO exception on enabling disabled plugin 2019-07-26 19:57:09 +03:00
Alex Plate
95d7a7e860 Insert some inferred annotations 2019-07-26 16:10:30 +03:00
Alex Plate
77a77c34b8 Fix possible NPE 2019-07-26 16:09:25 +03:00
Alex Plate
fa78cc2a9f Add Naveen Kumar Molleti to contributors list 2019-07-26 16:03:00 +03:00
Alex Plate
03f18af66f Temporaly get back ideajoin-examples because of help link in release
Revert "Move ideajoin examples to wiki"

This reverts commit d06f2a2d
2019-07-26 16:01:12 +03:00
Alex Plate
4e21145808 Merge pull request #200 from NOLFXceptMe/master
Fix ideajoin examples URL
2019-07-26 15:59:39 +03:00
Alex Plate
258557ee5d [VIM-1713] Add possibility to get ExEntryPanel without shortcuts 2019-07-26 15:27:30 +03:00
Alex Plate
88ad420716 Update kotlin version 2019-07-26 12:04:08 +03:00
Naveen Kumar Molleti
4828e40f0d Fix ideajoin examples URL 2019-07-25 17:49:34 -07:00
Alex Plate
5be29f5a07 Convert ExKeyBindings to kotlin 2019-07-25 18:29:31 +03:00
Alex Plate
48ac99a29b WIP: Renaming file 'ExKeyBindings' with Kotlin extension 2019-07-25 17:20:59 +03:00
Alex Plate
2c4f2139dd Fix warnings 2019-07-25 13:52:07 +03:00
Alex Plate
47236c1e6c Convert VimSurroundExtenstionTest to kotlin 2019-07-25 13:28:00 +03:00
Alex Plate
5d8996dc38 WIP: Renaming file 'VimSurroundExtensionTest' with Kotlin extension 2019-07-25 13:24:00 +03:00
Alex Plate
9feff84125 [VIM-1710] Fix opening empty file with "relative number" enabled 2019-07-24 16:34:42 +03:00
Alex Plate
c0fc62a1d6 [VIM-1712] Fix Y command for visual mode 2019-07-24 15:56:19 +03:00
Alex Plate
6b06d58759 [VIM-1711] Search is not triggered during surround action 2019-07-24 15:10:48 +03:00
Alex Plate
d06f2a2d18 Move ideajoin examples to wiki 2019-07-24 12:20:23 +03:00
Matt Ellis
36c4596a08 Fix exception with dead keys in ex entry
Will also highlight composed text on Mac
2019-06-11 19:57:11 +01:00
647 changed files with 11313 additions and 10105 deletions

View File

@@ -3,76 +3,273 @@ IdeaVim Authors
The original author: The original author:
* [Rick Maddy](mailto:rmaddy@maddyhome.com) * [![icon][mail]](mailto:rmaddy@maddyhome.com)
[![icon][github-off]](#)
 
Rick Maddy
The current maintainers: The current maintainers:
* [Andrey Vlasovskikh](mailto:andrey.vlasovskikh@gmail.com) * [![icon][mail]](mailto:andrey.vlasovskikh@gmail.com)
* [Alex Plate](mailto:alexpl292@gmail.com) [![icon][github]](https://github.com/vlasovskikh)
 
Andrey Vlasovskikh
* [![icon][mail]](mailto:alexpl292@gmail.com)
[![icon][github]](https://github.com/AlexPl292)
 
Alex Plate
Previous maintainers: Previous maintainers:
* [Oleg Shpynov](mailto:oleg.shpynov@jetbrains.com) * [![icon][mail]](mailto:oleg.shpynov@jetbrains.com)
[![icon][github]](https://github.com/olegs)
 
Oleg Shpynov
Contributors: Contributors:
* [![icon][mail]](mailto:yole@jetbrains.com)
* [Dmitry Jemerov](mailto:yole@jetbrains.com) [![icon][github]](https://github.com/yole)
* [Marquis Wang](mailto:marquis@marquiswang.com)  
* [Julien Hoarau](mailto:madgnome@gmail.com) Dmitry Jemerov
* [Masanobu Imai](mailto:masanobu.imai@gmail.com) * [![icon][mail]](mailto:marquis@marquiswang.com)
* [poxu](mailto:poxvuibr@gmail.com) [![icon][github]](https://github.com/marquiswang)
* [Alexander Zolotov](mailto:alexander.zolotov@jetbrains.com)  
* [John Lindquist](mailto:johnlindquist@gmail.com) Marquis Wang
* [Ira Klotzko](mailto:iklotzko@ltech.com) * [![icon][mail]](mailto:madgnome@gmail.com)
* [Alex Selesse](mailto:alex@selesse.com) [![icon][github-off]](#)
* [Dathan Bennett](mailto:dbennett@palantir.com)  
* [salaam](mailto:kphayen@gmail.com) Julien Hoarau
* [Alexey Shmalko](mailto:rasen.dubi@gmail.com) * [![icon][mail]](mailto:masanobu.imai@gmail.com)
* [Andrew Brookins](mailto:a.m.brookins@gmail.com) [![icon][github-off]](#)
* [Chang Wang](mailto:changwang83@gmail.com)  
* [Jaime Sanchez](mailto:josejaime.sanchez@gmail.com) Masanobu Imai
* [Thomas B Homburg](mailto:thomas@homburg.dk) * [![icon][mail]](mailto:poxvuibr@gmail.com)
* [smartbomb](mailto:smartbomb@server.fake) [![icon][github]](https://github.com/poxu)
* [Tuomas Tynkkynen](mailto:tuomas.tynkkynen@iki.fi)  
* [Jackson Popkin](mailto:jackson@donorschoose.org) poxu
* [Teruo Kunihiro](mailto:yuyuyu1999@gmail.com) * [![icon][mail]](mailto:alexander.zolotov@jetbrains.com)
* [Liubov Paina](mailto:lubashka.994@mail.ru) [![icon][github]](https://github.com/zolotov)
* [Daniel Leong](mailto:me@dhleong.net)  
* [Aleksey Lagoshin](mailto:aleksey@pri-num.com) Alexander Zolotov
* [Paulo Bu](mailto:pbu_98@yahoo.com) * [![icon][mail]](mailto:johnlindquist@gmail.com)
* [Giorgos Gaganis](mailto:gaganis@yahoo.com) [![icon][github]](https://github.com/johnlindquist)
* [Pavel Fatin](mailto:pavel.fatin@jetbrains.com)  
* [tieTYT](mailto:tietyt@gmail.com) John Lindquist
* [Nick Gieschen](mailto:nickgieschen@gmail.com) * [![icon][mail]](mailto:iklotzko@ltech.com)
* [Naoto Ikeno](mailto:ikenox@gmail.com) [![icon][github-off]](#)
* [Maximilian Luz](mailto:qzed@users.noreply.github.com)  
* [Vladimir Parfinenko](mailto:vparfinenko@excelsior-usa.com) Ira Klotzko
* [Florian Hassmann](mailto:hassmann@hwdev.de) * [![icon][mail]](mailto:alex@selesse.com)
* [Jan Palus](mailto:jpalus@fastmail.com) [![icon][github]](https://github.com/selesse)
* [Konstantin Petrov](mailto:kpetrov@ripe.net)  
* [Vasily Alferov](mailto:ya-ikmik2012@yandex.ru) Alex Selesse
* [Vitalii Karavaev](mailto:fkve97@gmail.com) * [![icon][mail]](mailto:dbennett@palantir.com)
* [John Lin](mailto:johnlinp@gmail.com) [![icon][github-off]](#)
* [Alex Plate](mailto:alexpl292@gmail.com)  
* [Matt Ellis](mailto:m.t.ellis@gmail.com) Dathan Bennett
* [John Grib](mailto:johngrib82@gmail.com) * [![icon][mail]](mailto:kphayen@gmail.com)
* [Marcel Hild](mailto:hild@b4mad.net) [![icon][github-off]](#)
* [Vedran Budimcic](mailto:vedranb@gmail.com)  
* [Andrei Gasparovici](mailto:andreigasparovici1@gmail.com) salaam
* [dos65](mailto:qtankle@gmail.com) * [![icon][mail]](mailto:rasen.dubi@gmail.com)
* [Tony Arra](mailto:ttonyarra@gmail.com) [![icon][github]](https://github.com/rasendubi)
* [Brad Ziolko](mailto:bradziolko@gmail.com)  
* [sumoooru2](mailto:sumoooru2@gmail.com) Alexey Shmalko
* [gecko655](mailto:aqwsedrft1234@yahoo.co.jp) * [![icon][mail]](mailto:a.m.brookins@gmail.com)
* [Daniele Megna](mailto:megna.dany@gmail.com) [![icon][github-off]](#)
* [Andrew Potter](mailto:apottere@gmail.com)  
* [Romain Gautier](mailto:romain.gautier@nimamoh.net) Andrew Brookins
* [Elliot Courant](mailto:elliot.courant@wheniwork.com) * [![icon][mail]](mailto:changwang83@gmail.com)
* [Simon Rainer](mailto:simon.rainer@fau.de) [![icon][github-off]](#)
* [Michael Ziwisky](mailto:mziwisky@instructure.com)  
* [Pierce Corcoran](mailto:pierce@plasticcow.com) Chang Wang
* [Jonatan Tierno](mailto:jonatantierno@gmail.com) * [![icon][mail]](mailto:josejaime.sanchez@gmail.com)
* [Brendan Annable](mailto:brendan@annable.me) [![icon][github-off]](#)
 
Jaime Sanchez
* [![icon][mail]](mailto:thomas@homburg.dk)
[![icon][github-off]](#)
 
Thomas B Homburg
* [![icon][mail]](mailto:smartbomb@server.fake)
[![icon][github-off]](#)
 
smartbomb
* [![icon][mail]](mailto:tuomas.tynkkynen@iki.fi)
[![icon][github-off]](#)
 
Tuomas Tynkkynen
* [![icon][mail]](mailto:jackson@donorschoose.org)
[![icon][github-off]](#)
 
Jackson Popkin
* [![icon][mail]](mailto:yuyuyu1999@gmail.com)
[![icon][github-off]](#)
 
Teruo Kunihiro
* [![icon][mail]](mailto:lubashka.994@mail.ru)
[![icon][github-off]](#)
 
Liubov Paina
* [![icon][mail]](mailto:me@dhleong.net)
[![icon][github]](https://github.com/dhleong)
 
Daniel Leong
* [![icon][mail]](mailto:aleksey@pri-num.com)
[![icon][github-off]](#)
 
Aleksey Lagoshin
* [![icon][mail]](mailto:pbu_98@yahoo.com)
[![icon][github-off]](#)
 
Paulo Bu
* [![icon][mail]](mailto:gaganis@yahoo.com)
[![icon][github]](https://github.com/gaganis)
 
Giorgos Gaganis
* [![icon][mail]](mailto:pavel.fatin@jetbrains.com)
[![icon][github]](https://github.com/pavelfatin)
 
Pavel Fatin
* [![icon][mail]](mailto:tietyt@gmail.com)
[![icon][github-off]](#)
 
tieTYT
* [![icon][mail]](mailto:nickgieschen@gmail.com)
[![icon][github-off]](#)
 
Nick Gieschen
* [![icon][mail]](mailto:ikenox@gmail.com)
[![icon][github]](https://github.com/ikenox)
 
Naoto Ikeno
* [![icon][mail]](mailto:qzed@users.noreply.github.com)
[![icon][github-off]](#)
 
Maximilian Luz
* [![icon][mail]](mailto:vparfinenko@excelsior-usa.com)
[![icon][github-off]](#)
 
Vladimir Parfinenko
* [![icon][mail]](mailto:hassmann@hwdev.de)
[![icon][github-off]](#)
 
Florian Hassmann
* [![icon][mail]](mailto:jpalus@fastmail.com)
[![icon][github]](https://github.com/jpalus)
 
Jan Palus
* [![icon][mail]](mailto:kpetrov@ripe.net)
[![icon][github-off]](#)
 
Konstantin Petrov
* [![icon][mail]](mailto:ya-ikmik2012@yandex.ru)
[![icon][github]](https://github.com/vasalf)
 
Vasily Alferov
* [![icon][mail]](mailto:fkve97@gmail.com)
[![icon][github]](https://github.com/karavaevitalii)
 
Vitalii Karavaev
* [![icon][mail]](mailto:johnlinp@gmail.com)
[![icon][github]](https://github.com/johnlinp)
 
John Lin
* [![icon][mail]](mailto:alexpl292@gmail.com)
[![icon][github]](https://github.com/AlexPl292)
 
Alex Plate
* [![icon][mail]](mailto:m.t.ellis@gmail.com)
[![icon][github]](https://github.com/citizenmatt)
 
Matt Ellis
* [![icon][mail]](mailto:johngrib82@gmail.com)
[![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-off]](#)
 
Vedran Budimcic
* [![icon][mail]](mailto:andreigasparovici1@gmail.com)
[![icon][github]](https://github.com/andreigasparovici)
 
Andrei Gasparovici
* [![icon][mail]](mailto:qtankle@gmail.com)
[![icon][github]](https://github.com/dos65)
 
dos65
* [![icon][mail]](mailto:ttonyarra@gmail.com)
[![icon][github]](https://github.com/TonyArra)
 
Tony Arra
* [![icon][mail]](mailto:bradziolko@gmail.com)
[![icon][github]](https://github.com/bradziolko)
 
Brad Ziolko
* [![icon][mail]](mailto:sumoooru2@gmail.com)
[![icon][github]](https://github.com/sumoooru2)
 
sumoooru2
* [![icon][mail]](mailto:aqwsedrft1234@yahoo.co.jp)
[![icon][github]](https://github.com/gecko655)
 
gecko655
* [![icon][mail]](mailto:megna.dany@gmail.com)
[![icon][github]](https://github.com/danielemegna)
 
Daniele Megna
* [![icon][mail]](mailto:apottere@gmail.com)
[![icon][github]](https://github.com/apottere)
 
Andrew Potter
* [![icon][mail]](mailto:romain.gautier@nimamoh.net)
[![icon][github]](https://github.com/Nimamoh)
 
Romain Gautier
* [![icon][mail]](mailto:elliot.courant@wheniwork.com)
[![icon][github]](https://github.com/ECourant)
 
Elliot Courant
* [![icon][mail]](mailto:simon.rainer@fau.de)
[![icon][github]](https://github.com/Vvalter)
 
Simon Rainer
* [![icon][mail]](mailto:mziwisky@instructure.com)
[![icon][github]](https://github.com/mziwisky)
 
Michael Ziwisky
* [![icon][mail]](mailto:pierce@plasticcow.com)
[![icon][github]](https://github.com/thecodewarrior)
 
Pierce Corcoran
* [![icon][mail]](mailto:jonatantierno@gmail.com)
[![icon][github]](https://github.com/jonatantierno)
 
Jonatan Tierno
* [![icon][mail]](mailto:brendan@annable.me)
[![icon][github]](https://github.com/BrendanAnnable)
 
Brendan Annable
* [![icon][mail]](mailto:nerd.naveen@gmail.com)
[![icon][github]](https://github.com/NOLFXceptMe)
 
Naveen Kumar Molleti
* [![icon][mail]](mailto:jorgen.granseth@bekk.no)
[![icon][github]](https://github.com/jorgengranseth)
 
Jørgen Granseth
If you are a contributor and your name is not listed here, feel free to If you are a contributor and your name is not listed here, feel free to
contact the maintainer. contact the maintainers.
<a href="https://icons8.com">Icons by Icons8</a>
[mail]: resources/icons/mail.png
[github]: resources/icons/github.png
[github-off]: resources/icons/github-off.png

View File

@@ -8,18 +8,71 @@ Get an Early Access
------------------- -------------------
Would you like to try new features and fixes? Join the Early Access Program and Would you like to try new features and fixes? Join the Early Access Program and
receive EAP builds as updates! Add this URL to "Settings | Plugins | receive EAP builds as updates! Use the `Join EAP` option in the status bar or
Browse Repositories | Manage Repositories": add this URL to "Settings | Plugins | Manage Plugin Repositories":
[https://plugins.jetbrains.com/plugins/eap/ideavim](https://plugins.jetbrains.com/plugins/eap/ideavim) `https://plugins.jetbrains.com/plugins/eap/ideavim`
It is important to distinguish EAP from traditional pre-release software. It is important to distinguish EAP from traditional pre-release software.
Please note that the quality of EAP versions may at times be way below even Please note that the quality of EAP versions may at times be way below even
usual beta standards. usual beta standards.
0.54, 2019-11-20
--------------
**Features:**
* EasyMotion plugin emulation ([VIM-820](https://youtrack.jetbrains.com/issue/VIM-820) | [Instructions](https://github.com/JetBrains/ideavim#emulated-vim-plugins))
* Support surrounding with a function name ([link](https://github.com/tpope/vim-surround/blob/master/doc/surround.txt#L138))
* Add `:delmarks` command ([VIM-1720](https://youtrack.jetbrains.com/issue/VIM-1720))
* Add IdeaVim icon to the status bar ([VIM-943](https://youtrack.jetbrains.com/issue/VIM-943))
**Changes:**
* Remove the default IdeaVim toggle shortcut (<kbd>CTRL</kbd><kbd>ALT</kbd><kbd>V</kbd>)
* Rename `refactoring` value of `selectmode` option to `ideaselection`
* Remove `template` value of `selectmode` option and replace it with `idearefactormode` option.
**Fixes:**
* [VIM-1766](https://youtrack.jetbrains.com/issue/VIM-1766) Fix disappearing caret in ex entry on Linux
* [VIM-1032](https://youtrack.jetbrains.com/issue/VIM-1032) Annotations work well with relative line numbers enabled
* [VIM-1762](https://youtrack.jetbrains.com/issue/VIM-1762) Relative line numbers respect line number theme
* [VIM-1717](https://youtrack.jetbrains.com/issue/VIM-1717) Fix incorrect scroll location if no match with `incsearch`
* [VIM-1757](https://youtrack.jetbrains.com/issue/VIM-1757) Fix incorrect search results when specifying offset as part of search command
* Fix search highlights not showing after deleting last result
* Update current line highlight during incsearch and replace operation
* [VIM-1773](https://youtrack.jetbrains.com/issue/VIM-1773) Provide fallback error stripe colour if not defined
* [VIM-1785](https://youtrack.jetbrains.com/issue/VIM-1785)
[VIM-1731](https://youtrack.jetbrains.com/issue/VIM-1731)
Fix some problems with yanking to clipboard
* [VIM-1781](https://youtrack.jetbrains.com/issue/VIM-1781) Fix yanking with dollar motion
* [VIM-1772](https://youtrack.jetbrains.com/issue/VIM-1772) Fix yanking with `:y` command
* [VIM-1685](https://youtrack.jetbrains.com/issue/VIM-1685) Fix `ESC` for insert mode
* [VIM-1752](https://youtrack.jetbrains.com/issue/VIM-1752) Fix `ESC` for insert mode
* [VIM-1189](https://youtrack.jetbrains.com/issue/VIM-1189)
[VIM-927](https://youtrack.jetbrains.com/issue/VIM-927)
Fix mappings to black hole register
* [VIM-1804](https://youtrack.jetbrains.com/issue/VIM-1804) Exit insert move after toggling IdeaVim
* [VIM-1749](https://youtrack.jetbrains.com/issue/VIM-1749) Tag surround is finished on `>`
* [VIM-1801](https://youtrack.jetbrains.com/issue/VIM-1801) Fix j/k motions with inline hints
* [VIM-1800](https://youtrack.jetbrains.com/issue/VIM-1800) Improve ideamarks option
* [VIM-1819](https://youtrack.jetbrains.com/issue/VIM-1819) Fix execution of some rider actions
* [VIM-1604](https://youtrack.jetbrains.com/issue/VIM-1604) Add IdeaVim logo
0.53, 2019-08-07
--------------
* [VIM-1711](https://youtrack.jetbrains.com/issue/VIM-1711) Search is not triggered during surround action
* [VIM-1712](https://youtrack.jetbrains.com/issue/VIM-1712) Fix `Y` command for visual mode
* [VIM-1713](https://youtrack.jetbrains.com/issue/VIM-1713) Surround in visual mode put caret in correct position
* [VIM-1732](https://youtrack.jetbrains.com/issue/VIM-1732) Fix SO after enabling vim mode
* [VIM-1710](https://youtrack.jetbrains.com/issue/VIM-1710) Fix opening empty file with "relative number" enabled
* [VIM-1725](https://youtrack.jetbrains.com/issue/VIM-1725) Fix problems with Japanese language
* [VIM-1648](https://youtrack.jetbrains.com/issue/VIM-1648) Fix exception while substitute with conformation
* [VIM-1736](https://youtrack.jetbrains.com/issue/VIM-1736) Fix `` for ex panel
* [VIM-1739](https://youtrack.jetbrains.com/issue/VIM-1739) Fix full-width characters for ex pane
0.52, 2019-07-23 0.52, 2019-07-23
-------------- --------------
* Introduce [Select Mode](https://vimhelp.org/visual.txt.html#Select-mode). * Introduce [Select Mode](https://github.com/JetBrains/ideavim/wiki/Select-mode).
* Fixed `:only` command * Fixed `:only` command

View File

@@ -1,15 +1,21 @@
<div> <div>
<a href="http://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ20183&guest=1"> <a href="https://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ20183&guest=1">
<img src="http://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ20183)/statusIcon.svg?guest=1"/> <img src="https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ20183)/statusIcon.svg?guest=1"/>
</a> </a>
<span>2018.3 Tests</span> <span>2018.3 Tests</span>
</div> </div>
<div> <div>
<a href="http://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ20191&guest=1"> <a href="https://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ20191&guest=1">
<img src="http://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ20191)/statusIcon.svg?guest=1"/> <img src="https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ20191)/statusIcon.svg?guest=1"/>
</a> </a>
<span>2019.1 Tests</span> <span>2019.1 Tests</span>
</div> </div>
<div>
<a href="https://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ20192&guest=1">
<img src="https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ20192)/statusIcon.svg?guest=1"/>
</a>
<span>2019.2 Tests</span>
</div>
### Where to Start ### Where to Start
@@ -18,8 +24,8 @@ In order to contribute to IdeaVim, you should have some understanding of Java or
See also these docs on the IntelliJ API: See also these docs on the IntelliJ API:
* [IntelliJ architectural overview](http://confluence.jetbrains.com/display/IDEADEV/IntelliJ+IDEA+Architectural+Overview) * [IntelliJ architectural overview](https://www.jetbrains.org/intellij/sdk/docs/platform/fundamentals.html)
* [IntelliJ plugin development resources](http://confluence.jetbrains.com/display/IDEADEV/PluginDevelopment) * [IntelliJ plugin development resources](https://www.jetbrains.org/intellij/sdk/docs/welcome.html)
You can start by: You can start by:
@@ -85,7 +91,7 @@ in the issue tracker.
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
3. Go to `Preferences | Editor | Copyright`, click the "+" button. 3. Go to `Preferences | Editor | Copyright`, click the "+" button.
Scope: Copyright scope Scope: Copyright scope
@@ -103,4 +109,4 @@ For example, take a few lines from your favorite poem, or use
3. Test your functionality properly. 3. Test your functionality properly.
Especially check whether your command works with: Especially check whether your command works with:
line start, line end, file start, file end, empty line, multiple carets, dollar motion, etc. line start, line end, file start, file end, empty line, multiple carets, dollar motion, etc.

View File

@@ -1,38 +1,28 @@
<img src="resources/META-INF/pluginIcon.svg" width="80" height="80" alt="icon" align="left"/>
IdeaVim IdeaVim
======= ===
<div> <div>
<a href="https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub"> <a href="https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub">
<img src="http://jb.gg/badges/official.svg" alt="official JetBrains project"/> <img src="https://jb.gg/badges/official.svg" alt="official JetBrains project"/>
</a>
<a href="https://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ20191&guest=1">
<img src="https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ20191)/statusIcon.svg?guest=1"/>
</a> </a>
</div> </div>
<div>
<a href="http://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_Deploy&guest=1">
<img src="http://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_Deploy)/statusIcon.svg?guest=1"/>
</a>
<span>Stable</span>
</div>
<div>
<a href="http://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_Build&guest=1">
<img src="http://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_Build)/statusIcon.svg?guest=1"/>
</a>
<span>EAP</span>
</div>
IdeaVim is a Vim emulation plugin for IDEs based on the IntelliJ Platform. IdeaVim is a Vim emulation plugin for IDEs based on the IntelliJ Platform.
IdeaVim can be used with IntelliJ IDEA, PyCharm, CLion, PhpStorm, WebStorm, IdeaVim can be used with IntelliJ IDEA, PyCharm, CLion, PhpStorm, WebStorm,
RubyMine, AppCode, DataGrip, GoLand, Rider, Cursive, and Android Studio. RubyMine, AppCode, DataGrip, GoLand, Rider, Cursive, and Android Studio.
Resources: Resources:
* [Plugin homepage](http://plugins.jetbrains.com/plugin/164) * [Plugin homepage](https://plugins.jetbrains.com/plugin/164-ideavim)
* [Changelog](CHANGES.md) * [Changelog](CHANGES.md)
* [Bug tracker](http://youtrack.jetbrains.com/issues/VIM) * [Bug tracker](https://youtrack.jetbrains.com/issues/VIM)
* [Continuous integration builds](http://teamcity.jetbrains.com/project.html?projectId=IdeaVim&guest=1) * [Continuous integration builds](https://teamcity.jetbrains.com/project.html?projectId=IdeaVim&guest=1)
* [@IdeaVim](http://twitter.com/ideavim) in Twitter * [@IdeaVim](https://twitter.com/ideavim) in Twitter
Installation Installation
@@ -59,6 +49,10 @@ Get Early Access
Would you like to try new features and fixes? Join the Early Access Program and Would you like to try new features and fixes? Join the Early Access Program and
receive EAP builds as updates! receive EAP builds as updates!
1. Click the IdeaVim icon in the status bar | `EAP` | `Join EAP`
Or subscribe to EAP updates manually:
1. Open `Settings | Plugins` 1. Open `Settings | Plugins`
2. Click the gear icon :gear:, select `Manage Plugin Repositories`, and add the following url: 2. Click the gear icon :gear:, select `Manage Plugin Repositories`, and add the following url:
`https://plugins.jetbrains.com/plugins/eap/ideavim` `https://plugins.jetbrains.com/plugins/eap/ideavim`
@@ -70,8 +64,8 @@ Please note that the quality of EAP versions may at times be way below even
usual beta standards. usual beta standards.
You can always leave your feedback with: You can always leave your feedback with:
* [@IdeaVim](http://twitter.com/ideavim) in Twitter * [@IdeaVim](https://twitter.com/ideavim) in Twitter
* [Bug tracker](http://youtrack.jetbrains.com/issues/VIM) * [Bug tracker](https://youtrack.jetbrains.com/issues/VIM)
Summary of Supported Vim Features Summary of Supported Vim Features
@@ -111,7 +105,7 @@ Not supported (yet):
See also: See also:
* [The list of all supported commands](src/com/maddyhome/idea/vim/package-info.java) * [The list of all supported commands](src/com/maddyhome/idea/vim/package-info.java)
* [Top features and bugs](http://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+sort+by%3A+votes) * [Top features and bugs](https://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+sort+by%3A+votes)
Files Files
@@ -125,7 +119,7 @@ You can read your ~/.vimrc file from ~/.ideavimrc with this command:
source ~/.vimrc source ~/.vimrc
Note, that IdeaVim currently parses ~/.ideavimrc file via simple pattern matching. Note, that IdeaVim currently parses ~/.ideavimrc file via simple pattern matching.
See [VIM-669](http://youtrack.jetbrains.com/issue/VIM-669) for proper parsing See [VIM-669](https://youtrack.jetbrains.com/issue/VIM-669) for proper parsing
of VimL files. of VimL files.
Also note that if you have overridden the `user.home` JVM option, this Also note that if you have overridden the `user.home` JVM option, this
@@ -138,19 +132,32 @@ Emulated Vim Plugins
-------------------- --------------------
IdeaVim extensions emulate some plugins of the original Vim. In order to use IdeaVim extensions emulate some plugins of the original Vim. In order to use
IdeaVim extensions, you have to enable them via this command in your ~/.ideavimrc: IdeaVim extensions, you have to enable them via this command in your `~/.ideavimrc`:
set <extension-name> set <extension-name>
Available extensions: 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.
* `set easymotion`
* 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).
* surround * surround
* Setup: `set surround`
* Emulates [vim-surround](https://github.com/tpope/vim-surround) * Emulates [vim-surround](https://github.com/tpope/vim-surround)
* Commands: `ys`, `cs`, `ds`, `S` * Commands: `ys`, `cs`, `ds`, `S`
* multiple-cursors * multiple-cursors
* Setup: `set multiple-cursors`
* Emulates [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors) * Emulates [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors)
* Commands: `<A-n>`, `<A-x>`, `<A-p>`, `g<A-n>` * Commands: `<A-n>`, `<A-x>`, `<A-p>`, `g<A-n>`
* commentary * commentary
* Setup: `set commentary`
* Emulates [commentary.vim](https://github.com/tpope/vim-commentary) * Emulates [commentary.vim](https://github.com/tpope/vim-commentary)
* Commands: `gcc`, `gc + motion`, `v_gc` * Commands: `gcc`, `gc + motion`, `v_gc`
@@ -164,7 +171,7 @@ The IdeaVim plugin uses the undo/redo functionality of the IntelliJ Platform,
so the behavior of the `u` and `<C-R>` commands may differ from the original so the behavior of the `u` and `<C-R>` commands may differ from the original
Vim. Vim compatibility of undo/redo may be improved in future releases. Vim. Vim compatibility of undo/redo may be improved in future releases.
See also [unresolved undo issues](http://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+Help+topic%3A+u). See also [unresolved undo issues](https://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+Help+topic%3A+u).
### Escape ### Escape
@@ -174,7 +181,7 @@ should use `<C-c>` or `<C-[>` instead. In some dialog windows, the normal mode i
switched by default. The usage of the Vim emulator in dialog windows is an area for switched by default. The usage of the Vim emulator in dialog windows is an area for
improvement. improvement.
See also [unresolved escape issues](http://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+Help+topic%3A+i_Esc). See also [unresolved escape issues](https://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+Help+topic%3A+i_Esc).
### Executing IDE Actions ### Executing IDE Actions
@@ -206,4 +213,5 @@ for a list of authors and contributors.
License License
------- -------
IdeaVim is licensed under the terms of the GNU Public License version 2. IdeaVim is licensed under the terms of the GNU Public License version 2
or any later version.

View File

@@ -55,10 +55,21 @@ repositories {
} }
dependencies { dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"
compile "org.jetbrains:annotations:17.0.0" compile "org.jetbrains:annotations:17.0.0"
} }
compileKotlin {
kotlinOptions {
jvmTarget = javaVersion
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = javaVersion
}
}
tasks.register("slackEapNotification") { tasks.register("slackEapNotification") {
doLast { doLast {
if (!slackUrl) return if (!slackUrl) return
@@ -74,4 +85,4 @@ tasks.register("slackEapNotification") {
println(post.getInputStream().getText()) println(post.getInputStream().getText())
} }
} }
} }

View File

@@ -18,6 +18,19 @@ The following `:set` commands can appear in `~/.ideavimrc` or be set manually in
If true, creation of global mark will trigger creation of IDE's bookmark If true, creation of global mark will trigger creation of IDE's bookmark
and vice versa. and vice versa.
`idearefactormode` `idearefactormode` String(default "select") - IdeaVim ONLY
Define the mode that would be enabled during
the refactoring (renaming, live template, introduce variable, etc)
Use one of the following values:
- keep - keep the mode that was enabled before starting a refactoring
- select - start refactoring in select mode
- visual - start refactoring in visual mode
This option has effect if you are in normal, insert or replace mode before refactoring start.
Visual or select mode are not changed.
'ignorecase' 'ic' ignore case in search patterns 'ignorecase' 'ic' ignore case in search patterns
'iskeyword' 'isk' defines keywords for commands like 'w', '*', etc. 'iskeyword' 'isk' defines keywords for commands like 'w', '*', etc.
@@ -59,7 +72,7 @@ The following `:set` commands can appear in `~/.ideavimrc` or be set manually in
'scrolloff' 'so' minimum number of lines above and below the cursor 'scrolloff' 'so' minimum number of lines above and below the cursor
'selection' 'sel' what type of selection to use 'selection' 'sel' what type of selection to use
`selectmode` `slm` String (default "template") `selectmode` `slm` String (default "")
This is a comma-separated list of words, which specify when to start This is a comma-separated list of words, which specify when to start
Select mode instead of Visual mode, when a selection is started. Select mode instead of Visual mode, when a selection is started.
@@ -67,16 +80,21 @@ The following `:set` commands can appear in `~/.ideavimrc` or be set manually in
mouse when using the mouse mouse when using the mouse
key when using shifted special[1] keys key when using shifted special[1] keys
cmd when using "v", "V", or <C-V> cmd when using "v", "V", or <C-V>
template when starting a template - IdeaVim ONLY ideaselection when IDE sets a selection - IdeaVim ONLY
refactoring when refactoring without - IdeaVim ONLY (examples: extend selection, wrap with while, etc.)
a template is performed
Deprecated values:
template ~~please use `idearefactormode` option~~
when starting a template - IdeaVim ONLY
refactoring ~~please use ideaselection~~
same as ideaselection - IdeaVim ONLY
'showmode' 'smd' message on the status line to show current mode 'showmode' 'smd' message on the status line to show current mode
`ideajoin` `ideajoin` Boolean (default false) - IdeaVim ONLY `ideajoin` `ideajoin` Boolean (default false) - IdeaVim ONLY
If true, join command will be performed via IDE If true, join command will be performed via IDE
See ideajoin-examples.md See wiki/`ideajoin` examples
'sidescroll' 'ss' minimum number of columns to scroll horizontally 'sidescroll' 'ss' minimum number of columns to scroll horizontally
'sidescrolloff' 'siso' min. number of columns to left and right of cursor 'sidescrolloff' 'siso' min. number of columns to left and right of cursor
@@ -89,4 +107,4 @@ The following `:set` commands can appear in `~/.ideavimrc` or be set manually in
'wrapscan' 'ws' searches wrap around the end of file 'wrapscan' 'ws' searches wrap around the end of file
---------- ----------
[1] - cursor keys, <End>, <Home>, <PageUp> and <PageDown> [1] - cursor keys, <End>, <Home>, <PageUp> and <PageDown>

View File

@@ -1,9 +1,11 @@
ideaVersion=192-EAP-SNAPSHOT # suppress inspection "UnusedProperty" for whole file
ideaVersion=193-EAP-SNAPSHOT
downloadIdeaSources=true downloadIdeaSources=true
instrumentPluginCode=true instrumentPluginCode=true
version=SNAPSHOT version=SNAPSHOT
javaVersion=1.8 javaVersion=1.8
kotlinVersion=1.3.40 kotlinVersion=1.3.50
publishUsername=username publishUsername=username
publishToken=token publishToken=token
publishChannels=eap publishChannels=eap

View File

@@ -13,7 +13,7 @@
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
#Thu Feb 21 15:20:13 MSK 2019 #Thu Feb 21 15:20:13 MSK 2019

View File

@@ -1,17 +1,11 @@
<idea-plugin url="http://plugins.jetbrains.com/plugin/164"> <idea-plugin url="https://plugins.jetbrains.com/plugin/164">
<name>IdeaVim</name> <name>IdeaVim</name>
<id>IdeaVIM</id> <id>IdeaVIM</id>
<change-notes><![CDATA[ <change-notes><![CDATA[
<ul> <ul>
<li>Support select mode</li> <li>EasyMotion plugin emulation (<a href="https://github.com/JetBrains/ideavim#emulated-vim-plugins">link</a>)</li>
<li>Integration with templates & in-line refactorings using Select mode</li> <li>Support surrounding with a function name</li>
<li>Support "Extend selection" action in visual mode</li> <li>Add IdeaVim logo to the status bar</li>
<li>Commentary extension</li>
<li>Add options to integrate paste/join/marks with the IDE</li>
<li>Support 'gn' commands</li>
<li>Support :command command</li>
<li>Support :shell command</li>
<li>Support :tabnext and :tabprevious commands</li>
<li>Various bug fixes</li> <li>Various bug fixes</li>
</ul> </ul>
<p>See also the complete <a href="https://github.com/JetBrains/ideavim/blob/master/CHANGES.md">changelog</a>.</p> <p>See also the complete <a href="https://github.com/JetBrains/ideavim/blob/master/CHANGES.md">changelog</a>.</p>
@@ -22,13 +16,14 @@
<p>See also:</p> <p>See also:</p>
<ul> <ul>
<li><a href="https://github.com/JetBrains/ideavim">GitHub repository</a>: documentation and contributing</li> <li><a href="https://github.com/JetBrains/ideavim">GitHub repository</a>: documentation and contributing</li>
<li><a href="http://youtrack.jetbrains.com/issues/VIM">Issue tracker</a>: feature requests and bug reports</li> <li><a href="https://youtrack.jetbrains.com/issues/VIM">Issue tracker</a>: feature requests and bug reports</li>
</ul> </ul>
]]></description> ]]></description>
<version>SNAPSHOT</version> <version>SNAPSHOT</version>
<vendor>JetBrains</vendor> <vendor>JetBrains</vendor>
<idea-version since-build="183.2940.10"/> <!-- Please search for "[VERSION UPDATE]" in project in case you update the since-build version -->
<idea-version since-build="183.4284.148"/>
<!-- Mark the plugin as compatible with RubyMine and other products based on the IntelliJ platform --> <!-- Mark the plugin as compatible with RubyMine and other products based on the IntelliJ platform -->
<depends>com.intellij.modules.lang</depends> <depends>com.intellij.modules.lang</depends>
@@ -49,372 +44,458 @@
</project-components> </project-components>
<extensionPoints> <extensionPoints>
<extensionPoint qualifiedName="IdeaVIM.vimExtension" interface="com.maddyhome.idea.vim.extension.VimExtension"/> <extensionPoint name="vimExtension" interface="com.maddyhome.idea.vim.extension.VimExtension"/>
<extensionPoint name="vimAction" interface="com.maddyhome.idea.vim.handler.EditorActionHandlerBase"/>
<extensionPoint name="vimExCommand" interface="com.maddyhome.idea.vim.ex.CommandHandler"/>
</extensionPoints> </extensionPoints>
<extensions defaultExtensionNs="com.intellij"> <extensions defaultExtensionNs="com.intellij">
<applicationConfigurable groupId="editor" instance="com.maddyhome.idea.vim.ui.VimEmulationConfigurable"/> <applicationConfigurable groupId="editor" instance="com.maddyhome.idea.vim.ui.VimEmulationConfigurable"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.MotionGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.ChangeGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.CommandGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.MarkGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.RegisterGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.FileGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.SearchGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.ProcessGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.MacroGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.DigraphGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.HistoryGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.KeyGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.WindowGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.EditorGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.visual.VisualMotionGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.YankGroup"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.PutGroup"/>
<projectService serviceImplementation="com.maddyhome.idea.vim.group.NotificationService"/> <projectService serviceImplementation="com.maddyhome.idea.vim.group.NotificationService"/>
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.NotificationService"/> <applicationService serviceImplementation="com.maddyhome.idea.vim.group.NotificationService"/>
<statusBarWidgetProvider implementation="com.maddyhome.idea.vim.StatusBarIconProvider"/>
</extensions> </extensions>
<extensions defaultExtensionNs="IdeaVIM"> <extensions defaultExtensionNs="IdeaVIM">
<vimExtension implementation="com.maddyhome.idea.vim.extension.surround.VimSurroundExtension"/> <vimExtension implementation="com.maddyhome.idea.vim.extension.surround.VimSurroundExtension"/>
<vimExtension implementation="com.maddyhome.idea.vim.extension.multiplecursors.VimMultipleCursorsExtension"/> <vimExtension implementation="com.maddyhome.idea.vim.extension.multiplecursors.VimMultipleCursorsExtension"/>
<vimExtension implementation="com.maddyhome.idea.vim.extension.commentary.CommentaryExtension"/> <vimExtension implementation="com.maddyhome.idea.vim.extension.commentary.CommentaryExtension"/>
<!-- Motions -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.tabs.MotionPreviousTabAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.tabs.MotionNextTabAction"/>
<!-- Left/Right -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnInsertModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstNonSpaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenNonSpaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLastScreenColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharReverseAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLastNonSpaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftInsertModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftWrapAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftMatchCharAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftTillMatchCharAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionMiddleColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionRightInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionRightWrapAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionRightMatchCharAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionRightTillMatchCharAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionHomeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftHomeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftEndAction"/>
<!-- Up/Down -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionDownCtrlNAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionDownNotLineWiseAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.EnterNormalAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionPercentOrMatchAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionUpCtrlPAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionUpNotLineWiseAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionUpFirstNonSpaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionArrowDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionArrowUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionArrowLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionArrowRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.LookupDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.LookupUpAction"/>
<!-- Text -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionCamelEndLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionCamelEndRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionCamelLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionCamelRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionNthCharacterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionWordEndLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionWordEndRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionWordLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionWordLeftInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionBigWordLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionWordRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionWordRightInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionBigWordRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionParagraphNextAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionParagraphPreviousAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceCloseAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceOpenAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenCloseAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenOpenAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionMethodNextEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.text.MotionMethodNextStartAction"/>
<!-- Text Objects -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterWordAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBigWordAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerWordAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBigWordAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockAngleAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBracketAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockDoubleQuoteAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockSingleQuoteAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBackQuoteAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockTagAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockAngleAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBracketAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockDoubleQuoteAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockSingleQuoteAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBackQuoteAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockTagAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerParagraphAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterParagraphAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionInnerSentenceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.object.MotionOuterSentenceAction"/>
<!-- Marks -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionMarkAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkNoSaveJumpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineNoSaveJumpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkNoSaveJumpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineNoSaveJumpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction"/>
<!-- Screen -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.screen.MotionFirstScreenLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.screen.MotionMiddleScreenLineAction"/>
<!-- Scroll -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLinePageStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLinePageStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownInsertModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpInsertModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenColumnAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionShiftDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.updown.MotionShiftUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftLeftAction"/>
<!-- Visual -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualToggleCharacterModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualToggleLineModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsBlockAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualSelectPreviousAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction"/>
<!-- Select-->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectEnableCharacterModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectEnableLineModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectEnableBlockModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectToggleVisualMode"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectEnterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectEscapeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.select.SelectDeleteAction"/>
<!-- Insert -->
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertAfterCursorAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertAfterLineEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertAtPreviousInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertBeforeCursorAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertBeforeFirstNonBlankAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertCharacterAboveCursorAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertCharacterBelowCursorAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertDeleteInsertedTextAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertDeletePreviousWordAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertEnterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertLineStartAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertNewLineAboveAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertNewLineBelowAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertExitAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertRegisterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.InsertSingleCommandAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.VisualBlockInsertAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.insert.VisualBlockAppendAction"/>
<!-- Delete -->
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteCharacterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteCharacterLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteCharacterRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteEndOfLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesSpacesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesSpacesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesEndAction"/>
<!-- Change -->
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleCharacterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCharacterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeCharactersAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeEndOfLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.number.ChangeNumberIncAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.number.ChangeNumberDecAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberIncAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberDecAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheIncAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheDecAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeReplaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeVisualCharacterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesEndAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.FilterMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.FilterVisualLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.AutoIndentLinesVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ReformatCodeVisualAction"/>
<!-- Shift -->
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.AutoIndentMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.ShiftLeftLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.ShiftLeftMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.ShiftLeftVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.ShiftRightLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.ShiftRightMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.shift.ShiftRightVisualAction"/>
<!-- Copy -->
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutTextAfterCursorAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutTextAfterCursorNoIndentAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutTextAfterCursorActionMoveCursor"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorActionMoveCursor"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.SelectRegisterAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.YankLineAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.YankMotionAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.YankVisualAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.YankVisualLinesAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutVisualTextAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutVisualTextNoIndentAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.copy.PutVisualTextMoveCursorAction"/>
<!-- File -->
<vimAction implementation="com.maddyhome.idea.vim.action.file.FileSaveCloseAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.file.FilePreviousAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.file.FileGetAsciiAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.file.FileGetHexAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.file.FileGetFileInfoAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.file.FileGetLocationInfoAction"/>
<!-- Window -->
<vimAction implementation="com.maddyhome.idea.vim.action.window.VerticalSplitAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.HorizontalSplitAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.CloseWindowAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowOnlyAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowNextAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowPrevAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowLeftAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowRightAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowUpAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.window.WindowDownAction"/>
<!-- Search -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchEntryFwdAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchEntryRevAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchAgainNextAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchAgainPreviousAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchWholeWordForwardAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchWholeWordBackwardAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchWordForwardAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.SearchWordBackwardAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction"/>
<!-- Macro -->
<vimAction implementation="com.maddyhome.idea.vim.action.macro.ToggleRecordingAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.macro.PlaybackRegisterAction"/>
<!-- Command Line -->
<vimAction implementation="com.maddyhome.idea.vim.action.ex.ProcessExEntryAction"/>
<!-- Other -->
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeLastSearchReplaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.change.ChangeLastGlobalSearchReplaceAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.RepeatChangeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.ExEntryAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.ResetModeAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.RedoAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.change.UndoAction"/>
<!-- Keys -->
<vimAction implementation="com.maddyhome.idea.vim.action.change.OperatorAction"/>
<!-- Visual Selection of last Search Pattern (gn) -->
<vimAction implementation="com.maddyhome.idea.vim.action.motion.gn.VisualSelectNextSearch"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.gn.VisualSelectPreviousSearch"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.gn.GnNextTextObject"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.gn.GnPreviousTextObject"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.CtrlDownAction"/>
<vimAction implementation="com.maddyhome.idea.vim.action.motion.scroll.CtrlUpAction"/>
<!-- Folds -->
<vimAction implementation="com.maddyhome.idea.vim.action.fold.VimCollapseAllRegions"/>
<vimAction implementation="com.maddyhome.idea.vim.action.fold.VimCollapseRegion"/>
<vimAction implementation="com.maddyhome.idea.vim.action.fold.VimCollapseRegionRecursively"/>
<vimAction implementation="com.maddyhome.idea.vim.action.fold.VimExpandAllRegions"/>
<vimAction implementation="com.maddyhome.idea.vim.action.fold.VimExpandRegion"/>
<vimAction implementation="com.maddyhome.idea.vim.action.fold.VimExpandRegionRecursively"/>
<!-- Editor Actions -->
<vimAction implementation="com.maddyhome.idea.vim.action.editor.VimEditorBackSpace"/>
<vimAction implementation="com.maddyhome.idea.vim.action.editor.VimEditorDelete"/>
<vimAction implementation="com.maddyhome.idea.vim.action.editor.VimEditorDown"/>
<vimAction implementation="com.maddyhome.idea.vim.action.editor.VimEditorTab"/>
<vimAction implementation="com.maddyhome.idea.vim.action.editor.VimEditorUp"/>
<vimAction implementation="com.maddyhome.idea.vim.action.editor.VimQuickJavaDoc"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ActionListHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.AsciiHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CmdFilterHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CmdHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CmdClearHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CopyTextHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DelCmdHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DeleteLinesHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DeleteMarksHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DigraphHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DumpLineHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.EditFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ActionHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.EchoHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ExitHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FindClassHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FindFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FindSymbolHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.GotoCharacterHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.HelpHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.HistoryHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.JoinLinesHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.JumpsHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.LetHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MapHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MarkHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MarksHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MoveTextHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.NextFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.NoHLSearchHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.OnlyHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PreviousFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PromptFindHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PromptReplaceHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PutLinesHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.QuitHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.RedoHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.RegistersHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.RepeatHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SelectFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SelectFirstFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SelectLastFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SetHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ShiftLeftHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ShiftRightHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SourceHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SortHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SplitHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SubstituteHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.UndoHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteAllHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteNextFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WritePreviousFileHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteQuitHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.YankLinesHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ShellHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.NextTabHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PreviousTabHandler"/>
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.TabOnlyHandler"/>
</extensions> </extensions>
<actions> <actions>
<action id="VimPluginToggle" class="com.maddyhome.idea.vim.action.VimPluginToggleAction" text="Vim Emulator" description="Toggle the Vim Plugin On/Off"> <action id="VimPluginToggle" class="com.maddyhome.idea.vim.action.VimPluginToggleAction" text="Vim Emulator" description="Toggle the vim plugin On/off">
<keyboard-shortcut first-keystroke="control alt V" keymap="$default"/>
<add-to-group group-id="ToolsMenu" anchor="last"/> <add-to-group group-id="ToolsMenu" anchor="last"/>
</action> </action>
<!-- Motions -->
<action id="VimMotionPreviousTab" class="com.maddyhome.idea.vim.action.motion.tabs.MotionPreviousTabAction" text="Move to Previous Tab"/>
<action id="VimMotionNextTab" class="com.maddyhome.idea.vim.action.motion.tabs.MotionNextTabAction" text="Move to Next Tab"/>
<!-- Left/Right -->
<action id="VimMotionColumn" class="com.maddyhome.idea.vim.action.motion.leftright.MotionColumnAction" text="Move to Column"/>
<action id="VimMotionFirstColumn" class="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnAction" text="Start of Line"/>
<action id="VimMotionFirstColumnInsertMode" class="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnInsertModeAction" text="Start of Line"/>
<action id="VimMotionFirstScreenColumn" class="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenColumnAction" text="Start of Screen Line"/>
<action id="VimMotionFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstNonSpaceAction" text="First Character of Line"/>
<action id="VimMotionFirstScreenNonSpace" class="com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenNonSpaceAction" text="First Character of Screen Line"/>
<action id="VimMotionLastColumn" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnAction" text="End of Line"/>
<action id="VimMotionLastColumnInsert" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnInsertAction" text="End of Line"/>
<action id="VimMotionLastScreenColumn" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLastScreenColumnAction" text="End of Screen Line"/>
<action id="VimMotionLastMatchChar" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharAction" text="Repeat Last Character Match"/>
<action id="VimMotionLastMatchCharReverse" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharReverseAction" text="Repeat Last Character Match in Reverse"/>
<action id="VimMotionLastNonSpace" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLastNonSpaceAction" text="Last Character of Line"/>
<action id="VimMotionLeft" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftAction" text="Left"/>
<action id="VimMotionLeftInsert" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftInsertModeAction" text="Left"/>
<action id="VimMotionLeftWrap" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftWrapAction" text="Left"/>
<action id="VimMotionLeftMatchChar" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftMatchCharAction" text="Move Left to Character"/>
<action id="VimMotionLeftTillMatchChar" class="com.maddyhome.idea.vim.action.motion.leftright.MotionLeftTillMatchCharAction" text="Move Left till Character"/>
<action id="VimMotionMiddleColumn" class="com.maddyhome.idea.vim.action.motion.leftright.MotionMiddleColumnAction" text="Middle of Screen"/>
<action id="VimMotionRight" class="com.maddyhome.idea.vim.action.motion.leftright.MotionRightAction" text="Right"/>
<action id="VimMotionRightInsert" class="com.maddyhome.idea.vim.action.motion.leftright.MotionRightInsertAction" text="Right"/>
<action id="VimMotionRightWrap" class="com.maddyhome.idea.vim.action.motion.leftright.MotionRightWrapAction" text="Right"/>
<action id="VimMotionRightMatchChar" class="com.maddyhome.idea.vim.action.motion.leftright.MotionRightMatchCharAction" text="Move Right to Character"/>
<action id="VimMotionRightTillMatchChar" class="com.maddyhome.idea.vim.action.motion.leftright.MotionRightTillMatchCharAction" text="Move Right till Character"/>
<action id="VimMotionHome" class="com.maddyhome.idea.vim.action.motion.leftright.MotionHomeAction" text="Move Home Key"/>
<action id="VimMotionShiftHome" class="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftHomeAction" text="Move Shift Home"/>
<action id="VimMotionEnd" class="com.maddyhome.idea.vim.action.motion.leftright.MotionEndAction" text="Move End Key"/>
<action id="VimMotionShiftEnd" class="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftEndAction" text="Move Shift End Key"/>
<!-- Up/Down -->
<action id="VimMotionDown" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownAction" text="Down"/>
<action id="VimMotionNotLineWiseDown" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownNotLineWiseAction" text="Down"/>
<action id="VimMotionDownFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction" text="Down to First non-Space"/>
<action id="VimEnterNormalAction" class="com.maddyhome.idea.vim.action.motion.updown.EnterNormalAction" text="Down to First non-Space"/>
<action id="VimMotionDownLess1FirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction" text="Down to First non-Space"/>
<action id="VimMotionGotoLineFirst" class="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstAction" text="Goto Line"/>
<action id="VimMotionGotoLineFirstInsertMode" class="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstInsertAction" text="Goto Line"/>
<action id="VimMotionGotoLineLast" class="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastAction" text="Goto Line"/>
<action id="VimMotionGotoLineLastEnd" class="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndAction" text="Goto Line End"/>
<action id="VimMotionGotoLineLastEndInsert" class="com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndInsertAction" text="Goto Line End"/>
<action id="VimMotionPercentOrMatch" class="com.maddyhome.idea.vim.action.motion.updown.MotionPercentOrMatchAction" text="Percent Down or Match"/>
<action id="VimMotionUp" class="com.maddyhome.idea.vim.action.motion.updown.MotionUpAction" text="Up"/>
<action id="VimMotionUpNotLineWise" class="com.maddyhome.idea.vim.action.motion.updown.MotionUpNotLineWiseAction" text="Up"/>
<action id="VimMotionUpFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionUpFirstNonSpaceAction" text="Up to First non-Space"/>
<action id="VimArrowMotionDown" class="com.maddyhome.idea.vim.action.motion.updown.MotionArrowDownAction" text="Arrow Down"/>
<action id="VimArrowMotionUp" class="com.maddyhome.idea.vim.action.motion.updown.MotionArrowUpAction" text="Arrow Up"/>
<action id="VimArrowMotionLeft" class="com.maddyhome.idea.vim.action.motion.leftright.MotionArrowLeftAction" text="Arrow Left"/>
<action id="VimArrowMotionRight" class="com.maddyhome.idea.vim.action.motion.leftright.MotionArrowRightAction" text="Arrow Right"/>
<action id="VimLookupDown" class="com.maddyhome.idea.vim.action.window.LookupDownAction" text="Down"/>
<action id="VimLookupUp" class="com.maddyhome.idea.vim.action.window.LookupUpAction" text="Up"/>
<!-- Text -->
<action id="VimMotionCamelEndLeft" class="com.maddyhome.idea.vim.action.motion.text.MotionCamelEndLeftAction" text="Camel Word End Left"/>
<action id="VimMotionCamelEndRight" class="com.maddyhome.idea.vim.action.motion.text.MotionCamelEndRightAction" text="Camel Word End Right"/>
<action id="VimMotionCamelLeft" class="com.maddyhome.idea.vim.action.motion.text.MotionCamelLeftAction" text="Camel Word Left"/>
<action id="VimMotionCamelRight" class="com.maddyhome.idea.vim.action.motion.text.MotionCamelRightAction" text="Camel Word Right"/>
<action id="VimMotionNthCharacter" class="com.maddyhome.idea.vim.action.motion.text.MotionNthCharacterAction" text="Nth Character"/>
<action id="VimMotionWordEndLeft" class="com.maddyhome.idea.vim.action.motion.text.MotionWordEndLeftAction" text="Word End Left"/>
<action id="VimMotionBigWordEndLeft" class="com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndLeftAction" text="BigWord End Left"/>
<action id="VimMotionWordEndRight" class="com.maddyhome.idea.vim.action.motion.text.MotionWordEndRightAction" text="Word End Right"/>
<action id="VimMotionBigWordEndRight" class="com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndRightAction" text="BigWord End Right"/>
<action id="VimMotionWordLeft" class="com.maddyhome.idea.vim.action.motion.text.MotionWordLeftAction" text="Word Left"/>
<action id="VimMotionWordLeftInsert" class="com.maddyhome.idea.vim.action.motion.text.MotionWordLeftInsertAction" text="Word Left"/>
<action id="VimMotionBigWordLeft" class="com.maddyhome.idea.vim.action.motion.text.MotionBigWordLeftAction" text="BigWord Left"/>
<action id="VimMotionWordRight" class="com.maddyhome.idea.vim.action.motion.text.MotionWordRightAction" text="Word Right"/>
<action id="VimMotionWordRightInsert" class="com.maddyhome.idea.vim.action.motion.text.MotionWordRightInsertAction" text="Word Right"/>
<action id="VimMotionBigWordRight" class="com.maddyhome.idea.vim.action.motion.text.MotionBigWordRightAction" text="BigWord Right"/>
<action id="VimMotionSentenceStartNext" class="com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextStartAction" text="Next Sentence Start"/>
<action id="VimMotionSentenceStartPrevious" class="com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousStartAction" text="Previous Sentence Start"/>
<action id="VimMotionSentenceEndNext" class="com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextEndAction" text="Next Sentence End"/>
<action id="VimMotionSentenceEndPrevious" class="com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousEndAction" text="Previous Sentence End"/>
<action id="VimMotionParagraphNext" class="com.maddyhome.idea.vim.action.motion.text.MotionParagraphNextAction" text="Next Paragraph"/>
<action id="VimMotionParagraphPrevious" class="com.maddyhome.idea.vim.action.motion.text.MotionParagraphPreviousAction" text="Previous Paragraph"/>
<action id="VimMotionUnmatchedBraceClose" class="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceCloseAction" text="Unmatched }"/>
<action id="VimMotionUnmatchedBraceOpen" class="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceOpenAction" text="Unmatched {"/>
<action id="VimMotionUnmatchedParenClose" class="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenCloseAction" text="Unmatched )"/>
<action id="VimMotionUnmatchedParenOpen" class="com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenOpenAction" text="Unmatched ("/>
<action id="VimMotionSectionBackwardEnd" class="com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardEndAction" text="Section End Backward"/>
<action id="VimMotionSectionBackwardStart" class="com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardStartAction" text="Section Start Backward"/>
<action id="VimMotionSectionForwardEnd" class="com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardEndAction" text="Section End Forward"/>
<action id="VimMotionSectionForwardStart" class="com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardStartAction" text="Section Start Forward"/>
<action id="VimMotionMethodBackwardEnd" class="com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousEndAction" text="Previous Method End"/>
<action id="VimMotionMethodBackwardStart" class="com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousStartAction" text="Previous Method Start"/>
<action id="VimMotionMethodForwardEnd" class="com.maddyhome.idea.vim.action.motion.text.MotionMethodNextEndAction" text="Next Method End"/>
<action id="VimMotionMethodForwardStart" class="com.maddyhome.idea.vim.action.motion.text.MotionMethodNextStartAction" text="Next Method Start"/>
<!-- Text Objects -->
<action id="VimMotionTextOuterWord" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterWordAction" text="Select outer word"/>
<action id="VimMotionTextOuterBigWord" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBigWordAction" text="Select outer WORD"/>
<action id="VimMotionTextInnerWord" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerWordAction" text="Select inner word"/>
<action id="VimMotionTextInnerBigWord" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBigWordAction" text="Select inner WORD"/>
<action id="VimMotionInnerBlockAngle" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockAngleAction" text="Select inner &lt; block"/>
<action id="VimMotionInnerBlockBrace" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction" text="Select inner { block"/>
<action id="VimMotionInnerBlockBracket" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBracketAction" text="Select inner [ block"/>
<action id="VimMotionInnerBlockParen" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction" text="Select inner ( block"/>
<action id="VimMotionInnerBlockDoubleQuote" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockDoubleQuoteAction" text="Select inner double quote block"/>
<action id="VimMotionInnerBlockSingleQuote" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockSingleQuoteAction" text="Select inner single quote block"/>
<action id="VimMotionInnerBlockBackQuote" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBackQuoteAction" text="Select inner back quote block"/>
<action id="VimMotionInnerBlockTag" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockTagAction" text="Select inner &gt;&lt; block &gt;/&lt;"/>
<action id="VimMotionOuterBlockAngle" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockAngleAction" text="Select outer &lt; block"/>
<action id="VimMotionOuterBlockBrace" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction" text="Select outer { block"/>
<action id="VimMotionOuterBlockBracket" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBracketAction" text="Select outer [ block"/>
<action id="VimMotionOuterBlockParen" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction" text="Select outer ( block"/>
<action id="VimMotionOuterBlockDoubleQuote" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockDoubleQuoteAction" text="Select outer double quote block"/>
<action id="VimMotionOuterBlockSingleQuote" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockSingleQuoteAction" text="Select outer single quote block"/>
<action id="VimMotionOuterBlockBackQuote" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBackQuoteAction" text="Select outer back quote block"/>
<action id="VimMotionOuterBlockTag" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockTagAction" text="Select outer &gt;&lt; block &gt;/&lt;"/>
<action id="VimMotionInnerParagraph" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerParagraphAction" text="Select Inner Paragraph"/>
<action id="VimMotionOuterParagraph" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterParagraphAction" text="Select Outer Paragraph"/>
<action id="VimMotionInnerSentence" class="com.maddyhome.idea.vim.action.motion.object.MotionInnerSentenceAction" text="Select Inner Sentence"/>
<action id="VimMotionOuterSentence" class="com.maddyhome.idea.vim.action.motion.object.MotionOuterSentenceAction" text="Select Outer Sentence"/>
<!-- Marks -->
<action id="VimMotionMark" class="com.maddyhome.idea.vim.action.motion.mark.MotionMarkAction" text="Mark"/>
<action id="VimMotionGotoFileMark" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkAction" text="Goto Mark"/>
<action id="VimMotionGotoFileMarkNoSaveJump" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkNoSaveJumpAction" text="Goto Mark"/>
<action id="VimMotionGotoFileMarkLine" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineAction" text="Goto Mark Line"/>
<action id="VimMotionGotoFileMarkLineNoSaveJumo" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineNoSaveJumpAction" text="Goto Mark Line"/>
<action id="VimMotionGotoMark" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkAction" text="Goto Mark"/>
<action id="VimMotionGotoMarkNoSaveJump" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkNoSaveJumpAction" text="Goto Mark"/>
<action id="VimMotionGotoMarkLine" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineAction" text="Goto Mark Line"/>
<action id="VimMotionGotoMarkLineNoSaveJump" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineNoSaveJumpAction" text="Goto Mark Line"/>
<action id="VimMotionJumpNext" class="com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction" text="Goto Next Jump"/>
<action id="VimMotionJumpPrevious" class="com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction" text="Goto Previous Jump"/>
<!-- Screen -->
<action id="VimMotionFirstScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionFirstScreenLineAction" text="First Screen Line"/>
<action id="VimMotionLastScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineAction" text="Last Screen Line"/>
<action id="VimMotionMiddleScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionMiddleScreenLineAction" text="Middle Screen Line"/>
<!-- Scroll -->
<action id="VimMotionScrollFirstScreenLinePageStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLinePageStartAction" text="Scroll Line to Top"/>
<action id="VimMotionScrollFirstScreenLineStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineStartAction" text="Scroll Line to Top"/>
<action id="VimMotionScrollFirstScreenLine" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineAction" text="Scroll Line to Top"/>
<action id="VimMotionScrollHalfPageDown" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageDownAction" text="Scroll Half Page Down"/>
<action id="VimMotionScrollHalfPageUp" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageUpAction" text="Scroll Half Page Up"/>
<action id="VimMotionScrollLastScreenLine" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineAction" text="Scroll Line to Bottom"/>
<action id="VimMotionScrollLastScreenLinePageStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLinePageStartAction" text="Scroll Line to Bottom"/>
<action id="VimMotionScrollLastScreenLineStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineStartAction" text="Scroll Line to Bottom"/>
<action id="VimMotionScrollLineDown" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineDownAction" text="Scroll Line Down"/>
<action id="VimMotionScrollLineUp" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineUpAction" text="Scroll Line Up"/>
<action id="VimMotionScrollMiddleScreenLine" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineAction" text="Scroll Line to Middle"/>
<action id="VimMotionScrollMiddleScreenLineStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineStartAction" text="Scroll Line to Middle"/>
<action id="VimMotionScrollPageDown" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownAction" text="Scroll Page Down"/>
<action id="VimMotionScrollPageDownInsertMode" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownInsertModeAction" text="Scroll Page Down"/>
<action id="VimMotionScrollPageUp" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction" text="Scroll Page Up"/>
<action id="VimMotionScrollPageUpInsertMode" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpInsertModeAction" text="Scroll Page Up"/>
<action id="VimMotionScrollFirstScreenColumn" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenColumnAction" text="Scroll Column to first column"/>
<action id="VimMotionScrollLastScreenColumn" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenColumnAction" text="Scroll Column to last column"/>
<action id="VimMotionScrollColumnLeft" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnLeftAction" text="Scroll Column Left"/>
<action id="VimMotionScrollColumnRight" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnRightAction" text="Scroll Column Right"/>
<action id="VimMotionShiftDown" class="com.maddyhome.idea.vim.action.motion.updown.MotionShiftDownAction" text="Shift Down"/>
<action id="VimMotionShiftUp" class="com.maddyhome.idea.vim.action.motion.updown.MotionShiftUpAction" text="Shift Up"/>
<action id="VimMotionShiftRight" class="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftRightAction" text="Shift Right"/>
<action id="VimMotionShiftLeft" class="com.maddyhome.idea.vim.action.motion.leftright.MotionShiftLeftAction" text="Shift Left"/>
<!-- Visual -->
<action id="VimVisualExitMode" class="com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction" text="Exit Visual Mode"/>
<action id="VimVisualToggleCharacterMode" class="com.maddyhome.idea.vim.action.motion.visual.VisualToggleCharacterModeAction" text="Toggle Character Selection"/>
<action id="VimVisualToggleLineMode" class="com.maddyhome.idea.vim.action.motion.visual.VisualToggleLineModeAction" text="Toggle Line Selection"/>
<action id="VimVisualToggleBlockMode" class="com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction" text="Toggle Block Selection"/>
<action id="VimVisualSwapEnds" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsAction" text="Swap Visual Selection Ends"/>
<action id="VimVisualSwapEndsBlock" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsBlockAction" text="Swap Visual Selection Ends"/>
<action id="VimVisualSelectPrevious" class="com.maddyhome.idea.vim.action.motion.visual.VisualSelectPreviousAction" text="Visual Select Previous"/>
<action id="VimVisualSwapSelections" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction" text="Swap Visual Selection Ends"/>
<!-- Select-->
<action id="VimSelectEnableCharacterMode"
class="com.maddyhome.idea.vim.action.motion.select.SelectEnableCharacterModeAction"
text="Enter Character Select Mode"/>
<action id="VimSelectEnableLineMode" class="com.maddyhome.idea.vim.action.motion.select.SelectEnableLineModeAction"
text="Enter Line Select Mode"/>
<action id="VimSelectEnableBlockMode"
class="com.maddyhome.idea.vim.action.motion.select.SelectEnableBlockModeAction"
text="Enter Block Select Mode"/>
<action id="VimSelectMotionRight" class="com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionRightAction"
text="Move Right Select Mode"/>
<action id="VimSelectMotionLeft" class="com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionLeftAction"
text="Move Left Select Mode"/>
<action id="VimToggleVisual" class="com.maddyhome.idea.vim.action.motion.select.SelectToggleVisualMode"
text="Toggle Select/Visual mode"/>
<action id="VimSelectInsert" class="com.maddyhome.idea.vim.action.motion.select.SelectEnterAction"
text="Select Enter Action"/>
<action id="VimEscapeSelect" class="com.maddyhome.idea.vim.action.motion.select.SelectEscapeAction"
text="Select Escape Action"/>
<action id="VimDeleteAction" class="com.maddyhome.idea.vim.action.motion.select.SelectDeleteAction"
text="Select Delete Action"/>
<!-- Insert -->
<action id="VimInsertAfterCursor" class="com.maddyhome.idea.vim.action.change.insert.InsertAfterCursorAction" text="Insert After Cursor"/>
<action id="VimInsertAfterLineEnd" class="com.maddyhome.idea.vim.action.change.insert.InsertAfterLineEndAction" text="Insert After Line End"/>
<action id="VimInsertAtPreviousInsert" class="com.maddyhome.idea.vim.action.change.insert.InsertAtPreviousInsertAction" text="Insert Before Cursor"/>
<action id="VimInsertBeforeCursor" class="com.maddyhome.idea.vim.action.change.insert.InsertBeforeCursorAction" text="Insert Before Cursor"/>
<action id="VimInsertBeforeFirstNonBlank" class="com.maddyhome.idea.vim.action.change.insert.InsertBeforeFirstNonBlankAction" text="Insert Before First non-Blank"/>
<action id="VimInsertCharacterAboveCursor" class="com.maddyhome.idea.vim.action.change.insert.InsertCharacterAboveCursorAction" text="Insert Character Above Cursor"/>
<action id="VimInsertCharacterBelowCursor" class="com.maddyhome.idea.vim.action.change.insert.InsertCharacterBelowCursorAction" text="Insert Character Below Cursor"/>
<action id="VimInsertDeleteInsertedText" class="com.maddyhome.idea.vim.action.change.insert.InsertDeleteInsertedTextAction" text="Delete Inserted Text"/>
<action id="VimInsertDeletePreviousWord" class="com.maddyhome.idea.vim.action.change.insert.InsertDeletePreviousWordAction" text="Delete Previous Word"/>
<action id="VimInsertEnter" class="com.maddyhome.idea.vim.action.change.insert.InsertEnterAction" text="Enter"/>
<action id="VimInsertExitMode" class="com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction" text="Exit Insert Mode"/>
<action id="VimInsertLineStart" class="com.maddyhome.idea.vim.action.change.insert.InsertLineStartAction" text="Insert at Line Start"/>
<action id="VimInsertNewLineAbove" class="com.maddyhome.idea.vim.action.change.insert.InsertNewLineAboveAction" text="Insert New Line Above"/>
<action id="VimInsertNewLineBelow" class="com.maddyhome.idea.vim.action.change.insert.InsertNewLineBelowAction" text="Insert New Line Below"/>
<action id="VimInsertPreviousInsert" class="com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertAction" text="Insert Previous Text"/>
<action id="VimInsertPreviousInsertExit" class="com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertExitAction" text="Insert Previous Text"/>
<action id="VimInsertRegister" class="com.maddyhome.idea.vim.action.change.insert.InsertRegisterAction" text="Insert Register"/>
<action id="VimInsertReplaceToggle" class="com.maddyhome.idea.vim.action.change.insert.InsertInsertAction" text="Toggle Insert/Replace"/>
<action id="VimInsertSingleCommand" class="com.maddyhome.idea.vim.action.change.insert.InsertSingleCommandAction" text="Execute Command"/>
<action id="VimVisualBlockInsert" class="com.maddyhome.idea.vim.action.change.insert.VisualBlockInsertAction" text="Visual Block Insert"/>
<action id="VimVisualBlockAppend" class="com.maddyhome.idea.vim.action.change.insert.VisualBlockAppendAction" text="Visual Block Append"/>
<!-- Delete -->
<action id="VimDeleteCharacter" class="com.maddyhome.idea.vim.action.change.delete.DeleteCharacterAction" text="Delete Character"/>
<action id="VimDeleteCharacterLeft" class="com.maddyhome.idea.vim.action.change.delete.DeleteCharacterLeftAction" text="Delete Character Left"/>
<action id="VimDeleteCharacterRight" class="com.maddyhome.idea.vim.action.change.delete.DeleteCharacterRightAction" text="Delete Character Right"/>
<action id="VimDeleteEndOfLine" class="com.maddyhome.idea.vim.action.change.delete.DeleteEndOfLineAction" text="Delete End-of-Line"/>
<action id="VimDeleteJoinLines" class="com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesAction" text="Delete Join Lines"/>
<action id="VimDeleteJoinLinesSpaces" class="com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesSpacesAction" text="Delete Join Lines"/>
<action id="VimDeleteJoinVisualLines" class="com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesAction" text="Delete Join Lines"/>
<action id="VimDeleteJoinVisualLinesSpaces" class="com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesSpacesAction" text="Delete Join Lines"/>
<action id="VimDeleteLine" class="com.maddyhome.idea.vim.action.change.delete.DeleteLineAction" text="Delete Line"/>
<action id="VimDeleteMotion" class="com.maddyhome.idea.vim.action.change.delete.DeleteMotionAction" text="Delete Motion"/>
<action id="VimDeleteVisual" class="com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction" text="Delete Selection"/>
<action id="VimDeleteVisualLines" class="com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesAction" text="Delete Selected Lines"/>
<action id="VimDeleteVisualLinesEnd" class="com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesEndAction" text="Delete Selected Lines"/>
<!-- Change -->
<action id="VimChangeCaseLowerMotion" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerMotionAction" text="Change Motion to Lower Case"/>
<action id="VimChangeCaseLowerVisual" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerVisualAction" text="Change Motion to Lower Case"/>
<action id="VimChangeCaseToggleCharacter" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleCharacterAction" text="Change Toggle Case"/>
<action id="VimChangeCaseToggleMotion" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleMotionAction" text="Change Motion Toggle Case"/>
<action id="VimChangeCaseToggleVisual" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleVisualAction" text="Change Motion Toggle Case"/>
<action id="VimChangeCaseUpperMotion" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperMotionAction" text="Change Motion to Upper Case"/>
<action id="VimChangeCaseUpperVisual" class="com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperVisualAction" text="Change Motion to Upper Case"/>
<action id="VimChangeCharacter" class="com.maddyhome.idea.vim.action.change.change.ChangeCharacterAction" text="Change Character"/>
<action id="VimChangeCharacters" class="com.maddyhome.idea.vim.action.change.change.ChangeCharactersAction" text="Change Characters"/>
<action id="VimChangeEndOfLine" class="com.maddyhome.idea.vim.action.change.change.ChangeEndOfLineAction" text="Change to End-of-Line"/>
<action id="VimChangeLine" class="com.maddyhome.idea.vim.action.change.change.ChangeLineAction" text="Change Line"/>
<action id="VimChangeMotion" class="com.maddyhome.idea.vim.action.change.change.ChangeMotionAction" text="Change Motion"/>
<action id="VimChangeNumberInc" class="com.maddyhome.idea.vim.action.change.change.number.ChangeNumberIncAction" text="Increment Number"/>
<action id="VimChangeNumberDec" class="com.maddyhome.idea.vim.action.change.change.number.ChangeNumberDecAction" text="Decrement Number"/>
<action id="VimChangeVisualNumberInc" class="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberIncAction" text="Increment Number"/>
<action id="VimChangeVisualNumberDec" class="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberDecAction" text="Decrement Number"/>
<action id="VimChangeVisualAvalancheNumberInc" class="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheIncAction" text="Increment Number"/>
<action id="VimChangeVisualAvalancheNumberDec" class="com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheDecAction" text="Decrement Number"/>
<action id="VimChangeReplace" class="com.maddyhome.idea.vim.action.change.change.ChangeReplaceAction" text="Replace"/>
<action id="VimChangeVisual" class="com.maddyhome.idea.vim.action.change.change.ChangeVisualAction" text="Change Motion"/>
<action id="VimChangeVisualCharacter" class="com.maddyhome.idea.vim.action.change.change.ChangeVisualCharacterAction" text="Change Motion"/>
<action id="VimChangeVisualLines" class="com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesAction" text="Change Motion"/>
<action id="VimChangeVisualLinesEnd" class="com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesEndAction" text="Change Motion"/>
<action id="VimFilterMotion" class="com.maddyhome.idea.vim.action.change.change.FilterMotionAction" text="Filter Lines"/>
<action id="VimFilterCountLines" class="com.maddyhome.idea.vim.action.change.change.FilterCountLinesAction" text="Filter Lines"/>
<action id="VimFilterVisualLines" class="com.maddyhome.idea.vim.action.change.change.FilterVisualLinesAction" text="Filter Visual Lines"/>
<action id="VimAutoIndentVisual" class="com.maddyhome.idea.vim.action.change.change.AutoIndentLinesVisualAction" text="Auto Indent Selection"/>
<action id="VimReformatVisual" class="com.maddyhome.idea.vim.action.change.change.ReformatCodeVisualAction" text="Reformat Selection"/>
<!-- Shift -->
<action id="VimAutoIndentLines" class="com.maddyhome.idea.vim.action.change.shift.AutoIndentLinesAction" text="Auto Indent Lines"/>
<action id="VimAutoIndentMotion" class="com.maddyhome.idea.vim.action.change.shift.AutoIndentMotionAction" text="Auto Indent Lines"/>
<action id="VimShiftLeftLines" class="com.maddyhome.idea.vim.action.change.shift.ShiftLeftLinesAction" text="Shift Lines Left"/>
<action id="VimShiftLeftLinesNormalMode" class="com.maddyhome.idea.vim.action.change.shift.ShiftLeftLinesNormalModeAction" text="Shift Lines Left"/>
<action id="VimShiftLeftMotion" class="com.maddyhome.idea.vim.action.change.shift.ShiftLeftMotionAction" text="Shift Motion Left"/>
<action id="VimShiftLeftVisual" class="com.maddyhome.idea.vim.action.change.shift.ShiftLeftVisualAction" text="Shift Visual Left"/>
<action id="VimShiftRightLines" class="com.maddyhome.idea.vim.action.change.shift.ShiftRightLinesAction" text="Shift Lines Right"/>
<action id="VimShiftRightLinesNormalMode" class="com.maddyhome.idea.vim.action.change.shift.ShiftRightLinesNormalModeAction" text="Shift Lines Right"/>
<action id="VimShiftRightMotion" class="com.maddyhome.idea.vim.action.change.shift.ShiftRightMotionAction" text="Shift Motion Right"/>
<action id="VimShiftRightVisual" class="com.maddyhome.idea.vim.action.change.shift.ShiftRightVisualAction" text="Shift Visual Right"/>
<!-- Copy -->
<action id="VimCopyPutTextAfterCursor" class="com.maddyhome.idea.vim.action.copy.PutTextAfterCursorAction" text="Put Text"/>
<action id="VimCopyPutTextBeforeCursor" class="com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorAction" text="Put Text"/>
<action id="VimCopyPutTextAfterCursorNoIndent" class="com.maddyhome.idea.vim.action.copy.PutTextAfterCursorNoIndentAction" text="Put Text"/>
<action id="VimCopyPutTextBeforeCursorNoIndent" class="com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction" text="Put Text"/>
<action id="VimCopyPutTextAfterCursorMoveCursor" class="com.maddyhome.idea.vim.action.copy.PutTextAfterCursorActionMoveCursor" text="Put Text"/>
<action id="VimCopyPutTextBeforeCursorMoveCursor" class="com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorActionMoveCursor" text="Put Text"/>
<action id="VimCopySelectRegister" class="com.maddyhome.idea.vim.action.copy.SelectRegisterAction" text="Select Register"/>
<action id="VimCopyYankLine" class="com.maddyhome.idea.vim.action.copy.YankLineAction" text="Yank Line"/>
<action id="VimCopyYankMidCountLine" class="com.maddyhome.idea.vim.action.copy.YankLineMidCountAction" text="Yank Line"/>
<action id="VimCopyYankMotion" class="com.maddyhome.idea.vim.action.copy.YankMotionAction" text="Yank Motion"/>
<action id="VimCopyYankVisual" class="com.maddyhome.idea.vim.action.copy.YankVisualAction" text="Yank Motion"/>
<action id="VimCopyYankVisualLines" class="com.maddyhome.idea.vim.action.copy.YankVisualLinesAction" text="Yank Motion"/>
<action id="VimVisualPutText" class="com.maddyhome.idea.vim.action.copy.PutVisualTextAction" text="Paste over Selection"/>
<action id="VimVisualPutTextNoIndent" class="com.maddyhome.idea.vim.action.copy.PutVisualTextNoIndentAction" text="Paste over Selection"/>
<action id="VimVisualPutTextMoveCursor" class="com.maddyhome.idea.vim.action.copy.PutVisualTextMoveCursorAction" text="Paste over Selection"/>
<!-- File -->
<action id="VimFileSaveClose" class="com.maddyhome.idea.vim.action.file.FileSaveCloseAction" text="Save and Close Editor"/>
<action id="VimFilePrevious" class="com.maddyhome.idea.vim.action.file.FilePreviousAction" text="Selects Previous Editor"/>
<action id="VimFileGetAscii" class="com.maddyhome.idea.vim.action.file.FileGetAsciiAction" text="Get ASCII Info"/>
<action id="VimFileGetHex" class="com.maddyhome.idea.vim.action.file.FileGetHexAction" text="Get Hex Info"/>
<action id="VimFileGetFileInfo" class="com.maddyhome.idea.vim.action.file.FileGetFileInfoAction" text="Get File Info"/>
<action id="VimFileGetLocationInfo" class="com.maddyhome.idea.vim.action.file.FileGetLocationInfoAction" text="Get Location Info"/>
<!-- Window -->
<action id="VimWindowSplitVertical" class="com.maddyhome.idea.vim.action.window.VerticalSplitAction" text="Split window vertically"/>
<action id="VimWindowSplitHorizontal" class="com.maddyhome.idea.vim.action.window.HorizontalSplitAction" text="Split window horizontally"/>
<action id="VimWindowClose" class="com.maddyhome.idea.vim.action.window.CloseWindowAction" text="Close current window"/>
<action id="VimWindowOnly" class="com.maddyhome.idea.vim.action.window.WindowOnlyAction" text="Close all windows except current"/>
<action id="VimWindowNext" class="com.maddyhome.idea.vim.action.window.WindowNextAction" text="Select next window"/>
<action id="VimWindowPrev" class="com.maddyhome.idea.vim.action.window.WindowPrevAction" text="Select previous window"/>
<action id="VimWindowLeft" class="com.maddyhome.idea.vim.action.window.WindowLeftAction" text="Go to left window"/>
<action id="VimWindowRight" class="com.maddyhome.idea.vim.action.window.WindowRightAction" text="Go to right window"/>
<action id="VimWindowUp" class="com.maddyhome.idea.vim.action.window.WindowUpAction" text="Go to window up"/>
<action id="VimWindowDown" class="com.maddyhome.idea.vim.action.window.WindowDownAction" text="Go to window down"/>
<!-- Search -->
<action id="VimSearchFwdEntry" class="com.maddyhome.idea.vim.action.motion.search.SearchEntryFwdAction" text="Search Forward"/>
<action id="VimSearchRevEntry" class="com.maddyhome.idea.vim.action.motion.search.SearchEntryRevAction" text="Search Backward"/>
<action id="VimSearchAgainNext" class="com.maddyhome.idea.vim.action.motion.search.SearchAgainNextAction" text="Search Again"/>
<action id="VimSearchAgainPrevious" class="com.maddyhome.idea.vim.action.motion.search.SearchAgainPreviousAction" text="Search Again"/>
<action id="VimSearchWholeWordForward" class="com.maddyhome.idea.vim.action.motion.search.SearchWholeWordForwardAction" text="Search Again"/>
<action id="VimSearchWholeWordBackward" class="com.maddyhome.idea.vim.action.motion.search.SearchWholeWordBackwardAction" text="Search Again"/>
<action id="VimSearchWordForward" class="com.maddyhome.idea.vim.action.motion.search.SearchWordForwardAction" text="Search Again"/>
<action id="VimSearchWordBackward" class="com.maddyhome.idea.vim.action.motion.search.SearchWordBackwardAction" text="Search Again"/>
<action id="VimGotoDeclaration" class="com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction" text="Goto Declaration"/>
<!-- Macro -->
<action id="VimToggleRecording" class="com.maddyhome.idea.vim.action.macro.ToggleRecordingAction" text="Record Keystrokes"/>
<action id="VimPlaybackRegister" class="com.maddyhome.idea.vim.action.macro.PlaybackRegisterAction" text="Playback Register"/>
<action id="VimPlaybackLastRegister" class="com.maddyhome.idea.vim.action.macro.PlaybackLastRegisterAction" text="Playback Last Register"/>
<!-- Command Line -->
<action id="VimProcessExEntry" class="com.maddyhome.idea.vim.action.ex.ProcessExEntryAction" text="Process Ex Entry"/>
<!-- Other -->
<action id="VimLastSearchReplace" class="com.maddyhome.idea.vim.action.change.change.ChangeLastSearchReplaceAction" text="Repeat Last :s"/>
<action id="VimLastGlobalSearchReplace" class="com.maddyhome.idea.vim.action.change.change.ChangeLastGlobalSearchReplaceAction" text="Repeat Last :s"/>
<action id="VimRepeatChange" class="com.maddyhome.idea.vim.action.change.RepeatChangeAction" text="Repeat Change"/>
<action id="VimRepeatExCommand" class="com.maddyhome.idea.vim.action.change.RepeatExCommandAction" text="Repeat Ex Command"/>
<action id="VimExEntry" class="com.maddyhome.idea.vim.action.ExEntryAction" text="Enter Ex Command"/>
<action id="VimResetMode" class="com.maddyhome.idea.vim.action.ResetModeAction" text="Reset Mode"/>
<action id="VimRedo" class="com.maddyhome.idea.vim.action.change.RedoAction" text="Redo"/>
<action id="VimUndo" class="com.maddyhome.idea.vim.action.change.UndoAction" text="Undo"/>
<!-- Internal --> <!-- Internal -->
<action id="VimInternalAddInlays" class="com.maddyhome.idea.vim.action.internal.AddInlaysAction" text="Add test inlays | IdeaVim internal" internal="true"/> <action id="VimInternalAddInlays" class="com.maddyhome.idea.vim.action.internal.AddInlaysAction" text="Add Test Inlays | IdeaVim Internal" internal="true"/>
<!-- Keys -->
<action id="VimShortcutKeyAction" class="com.maddyhome.idea.vim.action.VimShortcutKeyAction" text="Shortcuts"/> <action id="VimShortcutKeyAction" class="com.maddyhome.idea.vim.action.VimShortcutKeyAction" text="Shortcuts"/>
<action id="VimOperatorAction" class="com.maddyhome.idea.vim.action.change.OperatorAction" text="Operator"/> <action id="VimActions" class="com.maddyhome.idea.vim.VimActions" text="Vim Actions"/>
<!-- Visual Selection of last Search Pattern (gn) -->
<action id="VimVisualSelectNextSearch" class="com.maddyhome.idea.vim.action.motion.gn.VisualSelectNextSearch" text="Visual Select Next Search"/>
<action id="VimVisualSelectPreviousSearch" class="com.maddyhome.idea.vim.action.motion.gn.VisualSelectPreviousSearch" text="Visual Select Previous Search"/>
<action id="VimGnNextTextObject" class="com.maddyhome.idea.vim.action.motion.gn.GnNextTextObject" text="Gn Next Text Object"/>
<action id="VimGnPreviousTextObject" class="com.maddyhome.idea.vim.action.motion.gn.GnPreviousTextObject" text="Gn Previous Text Object"/>
<action id="VimCtrlDownAction" class="com.maddyhome.idea.vim.action.motion.scroll.CtrlDownAction" text="Ctrl down"/>
<action id="VimCtrlUpAction" class="com.maddyhome.idea.vim.action.motion.scroll.CtrlUpAction" text="Ctrl up"/>
</actions> </actions>
</idea-plugin> </idea-plugin>

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
<defs>
<linearGradient id="ideavim_plugin-a" x1="-6.748%" x2="47.286%" y1="33.61%" y2="85.907%">
<stop offset="0%" stop-color="#3BEA62"/>
<stop offset="100%" stop-color="#087CFA"/>
</linearGradient>
</defs>
<polygon fill="url(#ideavim_plugin-a)" fill-rule="evenodd" points="28.019 4 15.988 24.119 15.988 4 4 4 4 36 17.953 36 36 4"/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

BIN
resources/icons/github.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

View File

@@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
<path
d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
</svg>

After

Width:  |  Height:  |  Size: 824 B

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40">
<defs>
<linearGradient id="ideavim_plugin-a" x1="-6.748%" x2="47.286%" y1="33.61%" y2="85.907%">
<stop offset="0%" stop-color="#3BEA62"/>
<stop offset="100%" stop-color="#087CFA"/>
</linearGradient>
</defs>
<polygon fill="url(#ideavim_plugin-a)" fill-rule="evenodd" points="28.019 4 15.988 24.119 15.988 4 4 4 4 36 17.953 36 36 4"/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40">
<polygon fill="#6E6E6E" fill-rule="evenodd" points="28.019 4 15.988 24.119 15.988 4 4 4 4 36 17.953 36 36 4"/>
</svg>

After

Width:  |  Height:  |  Size: 204 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40">
<polygon fill="#AFB1B3" fill-rule="evenodd" points="28.019 4 15.988 24.119 15.988 4 4 4 4 36 17.953 36 36 4"/>
</svg>

After

Width:  |  Height:  |  Size: 204 B

BIN
resources/icons/mail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26" width="16" height="16" fill="#000000">
<path fill="#1DA1F2" d="M 25.855469 5.574219 C 24.914063 5.992188 23.902344 6.273438 22.839844 6.402344 C 23.921875 5.75 24.757813 4.722656 25.148438 3.496094 C 24.132813 4.097656 23.007813 4.535156 21.8125 4.769531 C 20.855469 3.75 19.492188 3.113281 17.980469 3.113281 C 15.082031 3.113281 12.730469 5.464844 12.730469 8.363281 C 12.730469 8.773438 12.777344 9.175781 12.867188 9.558594 C 8.503906 9.339844 4.636719 7.246094 2.046875 4.070313 C 1.59375 4.847656 1.335938 5.75 1.335938 6.714844 C 1.335938 8.535156 2.261719 10.140625 3.671875 11.082031 C 2.808594 11.054688 2 10.820313 1.292969 10.425781 C 1.292969 10.449219 1.292969 10.46875 1.292969 10.492188 C 1.292969 13.035156 3.101563 15.15625 5.503906 15.640625 C 5.0625 15.761719 4.601563 15.824219 4.121094 15.824219 C 3.78125 15.824219 3.453125 15.792969 3.132813 15.730469 C 3.800781 17.8125 5.738281 19.335938 8.035156 19.375 C 6.242188 20.785156 3.976563 21.621094 1.515625 21.621094 C 1.089844 21.621094 0.675781 21.597656 0.265625 21.550781 C 2.585938 23.039063 5.347656 23.90625 8.3125 23.90625 C 17.96875 23.90625 23.25 15.90625 23.25 8.972656 C 23.25 8.742188 23.246094 8.515625 23.234375 8.289063 C 24.261719 7.554688 25.152344 6.628906 25.855469 5.574219"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="16" height="16" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
<g>
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="7.083" y1="16.2945" x2="64.1058" y2="42.2878" gradientTransform="matrix(1 0 0 -1 0 71.0471)">
<stop offset="0" style="stop-color:#7863AB"/>
<stop offset="0.1649" style="stop-color:#6572B6"/>
<stop offset="0.3776" style="stop-color:#538FCC"/>
<stop offset="0.5401" style="stop-color:#3DA5DD"/>
<stop offset="0.6317" style="stop-color:#35ADE3"/>
</linearGradient>
<path style="fill:url(#SVGID_1_);" d="M66.9,47.5c-0.2-0.2-13.1-12.6-13.1-12.6s9.8-10.4,12.4-13c0.8-0.8,1.5-1.6,2-2.6
c3.6-6.1,1.5-13.9-4.6-17.5c-4.5-2.6-10.1-2.2-14.1,0.8c-0.7,0.5-1.3,1-1.9,1.6C47.3,4.6,33.7,17,21.9,27.8l22.1,14L20.8,67.9
c-1.4,1-2.8,1.6-4.3,1.9c0.3,0,0.5,0,0.8-0.1c4.6-0.7,43.9-7.3,45.8-7.7c2.3-0.4,4.4-1.8,5.7-3.9C71,54.5,70,50,66.9,47.5z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="30.31" y1="42.9162" x2="1.0679" y2="68.7442" gradientTransform="matrix(1 0 0 -1 0 71.0471)">
<stop offset="0" style="stop-color:#7863AB"/>
<stop offset="7.176042e-002" style="stop-color:#895EA7"/>
<stop offset="0.2523" style="stop-color:#C34F9D"/>
<stop offset="0.3901" style="stop-color:#ED3995"/>
<stop offset="0.4677" style="stop-color:#EE3B8B"/>
</linearGradient>
<path style="fill:url(#SVGID_2_);" d="M45.9,30.5c-0.4-2.7-1.8-4.9-3.8-6.5C40,22.4,23.8,5.6,22,3.7C19.2,1,15.2-0.5,11.1,0.2
C4.1,1.2-0.8,7.8,0.3,14.8c0.5,3.5,2.5,6.5,5.1,8.4c2.6,2,23,16,24.3,17c2.1,1.6,4.9,2.5,7.7,2C42.9,41.2,46.8,36,45.9,30.5z"/>
</g>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.9829" y1="12.3617" x2="74.0226" y2="55.8638" gradientTransform="matrix(1 0 0 -1 0 71.0471)">
<stop offset="0" style="stop-color:#7863AB"/>
<stop offset="0.1649" style="stop-color:#6572B6"/>
<stop offset="0.3776" style="stop-color:#538FCC"/>
<stop offset="0.5401" style="stop-color:#3DA5DD"/>
<stop offset="0.6317" style="stop-color:#35ADE3"/>
</linearGradient>
<path style="fill:url(#SVGID_3_);" d="M23,67.8c0.1,0,23.3-26.1,23.3-26.1L22.9,26.9c-8.3,7.6-16,14.5-17.8,16.2
c-1.1,1-2.2,2.3-3,3.7c-4.3,7.4-1.8,16.8,5.6,21.1C10.7,69.6,17.5,71.7,23,67.8z"/>
</g>
<g>
<rect x="13.4" y="13.4" style="fill:#231F20;" width="43.2" height="43.2"/>
<rect x="17.4" y="48.5" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
<polygon style="fill:#FFFFFF;" points="23.8,29.9 17,19.1 21.6,19.1 25.8,26.2 30.2,19.1 34.7,19.1 27.8,29.8 27.8,37 23.8,37
"/>
<polygon style="fill:#FFFFFF;" points="41.6,22.7 36.1,22.7 36.1,19.1 51,19.1 51,22.7 45.5,22.7 45.5,37 41.6,37 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -13,7 +13,7 @@
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
notexcmd=Not an editor command: {0} notexcmd=Not an editor command: {0}
@@ -23,6 +23,7 @@ e_badrange=Unexpected character ''{0}'' in range
e_norange=No range allowed e_norange=No range allowed
e_rangereq=Range required e_rangereq=Range required
e_argreq=Argument required e_argreq=Argument required
e_argforb=Argument forbidden
e_noprev=E34: No previous command e_noprev=E34: No previous command
e_nopresub=E33: No previous substitute regular expression e_nopresub=E33: No previous substitute regular expression
E191=E191: Argument must be a letter or forward/backward quote E191=E191: Argument must be a letter or forward/backward quote
@@ -67,4 +68,5 @@ E385=E385: search hit BOTTOM without match for: {0}
e_patnotf2=Pattern not found: {0} e_patnotf2=Pattern not found: {0}
unkopt=Unknown option: {0} unkopt=Unknown option: {0}
e_invarg=Invalid argument: {0} e_invarg=Invalid argument: {0}
E475=E475: Invalid argument: {0}
E774=E774: 'operatorfunc' is empty E774=E774: 'operatorfunc' is empty

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
rootProject.name = 'IdeaVIM' rootProject.name = 'IdeaVIM'

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim; package com.maddyhome.idea.vim;
@@ -68,12 +68,9 @@ public class EventFacade {
public void setupTypedActionHandler(@NotNull VimTypedActionHandler handler) { public void setupTypedActionHandler(@NotNull VimTypedActionHandler handler) {
final TypedAction typedAction = getTypedAction(); final TypedAction typedAction = getTypedAction();
final TypedActionHandler rawHandler = typedAction.getRawHandler(); myOriginalTypedActionHandler = typedAction.getRawHandler();
if (!(rawHandler instanceof VimTypedActionHandler)) {
// Actually this if should always be true, but just as protection typedAction.setupRawHandler(handler);
myOriginalTypedActionHandler = rawHandler;
typedAction.setupRawHandler(handler);
}
} }
public void restoreTypedActionHandler() { public void restoreTypedActionHandler() {

View File

@@ -13,37 +13,55 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim; package com.maddyhome.idea.vim;
import com.intellij.ide.DataManager;
import com.intellij.ide.IdeEventQueue; import com.intellij.ide.IdeEventQueue;
import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.Application; import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.UndoConfirmationPolicy;
import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.ActionPlan; import com.intellij.openapi.editor.actionSystem.ActionPlan;
import com.intellij.openapi.editor.actionSystem.DocCommandGroupId;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler; import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.maddyhome.idea.vim.action.MotionEditorAction; import com.maddyhome.idea.vim.action.ExEntryAction;
import com.maddyhome.idea.vim.action.TextObjectAction; import com.maddyhome.idea.vim.action.macro.ToggleRecordingAction;
import com.maddyhome.idea.vim.action.motion.search.SearchEntryFwdAction;
import com.maddyhome.idea.vim.action.motion.search.SearchEntryRevAction;
import com.maddyhome.idea.vim.command.*; import com.maddyhome.idea.vim.command.*;
import com.maddyhome.idea.vim.extension.VimExtensionHandler; import com.maddyhome.idea.vim.extension.VimExtensionHandler;
import com.maddyhome.idea.vim.group.ChangeGroup;
import com.maddyhome.idea.vim.group.RegisterGroup; import com.maddyhome.idea.vim.group.RegisterGroup;
import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.group.visual.VisualGroupKt;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.helper.*; import com.maddyhome.idea.vim.helper.*;
import com.maddyhome.idea.vim.key.*; import com.maddyhome.idea.vim.key.*;
import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor;
import com.maddyhome.idea.vim.listener.VimListenerSuppressor;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import javax.swing.*; import javax.swing.*;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.ArrayList; import java.util.*;
import java.util.List; import java.util.function.Function;
import java.util.Stack; import java.util.stream.Collectors;
import static com.intellij.openapi.actionSystem.CommonDataKeys.*;
import static com.intellij.openapi.actionSystem.PlatformDataKeys.PROJECT_FILE_DIRECTORY;
import static com.maddyhome.idea.vim.helper.StringHelper.parseKeys;
/** /**
* This handlers every keystroke that the user can argType except those that are still valid hotkeys for various Idea * This handlers every keystroke that the user can argType except those that are still valid hotkeys for various Idea
@@ -88,6 +106,15 @@ public class KeyHandler {
return origHandler; return origHandler;
} }
public static void executeVimAction(@NotNull Editor editor,
@NotNull EditorActionHandlerBase cmd,
DataContext context) {
CommandProcessor.getInstance()
.executeCommand(editor.getProject(), () -> cmd.execute(editor, getProjectAwareDataContext(editor, context)),
cmd.getId(), DocCommandGroupId.noneGroupId(editor.getDocument()), UndoConfirmationPolicy.DEFAULT,
editor.getDocument());
}
/** /**
* Execute an action * Execute an action
* *
@@ -100,9 +127,13 @@ public class KeyHandler {
// What is "place"? Leave it the empty string for now. // What is "place"? Leave it the empty string for now.
// Is the template presentation sufficient? // Is the template presentation sufficient?
// What are the modifiers? Is zero OK? // What are the modifiers? Is zero OK?
//
// beforeActionPerformedUpdate should be called to update the action. It fixes some rider-specific problems
// because rider use async update method. See VIM-1819
final AnActionEvent event = final AnActionEvent event =
new AnActionEvent(null, context, ActionPlaces.ACTION_SEARCH, action.getTemplatePresentation(), ActionManager.getInstance(), 0); new AnActionEvent(null, context, ActionPlaces.ACTION_SEARCH, action.getTemplatePresentation(),
action.update(event); ActionManager.getInstance(), 0);
action.beforeActionPerformedUpdate(event);
if (event.getPresentation().isEnabled()) { if (event.getPresentation().isEnabled()) {
action.actionPerformed(event); action.actionPerformed(event);
return true; return true;
@@ -148,6 +179,8 @@ public class KeyHandler {
@NotNull KeyStroke key, @NotNull KeyStroke key,
@NotNull DataContext context, @NotNull DataContext context,
boolean allowKeyMappings) { boolean allowKeyMappings) {
if (VimPlugin.Initialization.notInitialized()) return;
VimPlugin.clearError(); VimPlugin.clearError();
// All the editor actions should be performed with top level editor!!! // All the editor actions should be performed with top level editor!!!
// Be careful: all the EditorActionHandler implementation should correctly process InjectedEditors // Be careful: all the EditorActionHandler implementation should correctly process InjectedEditors
@@ -165,8 +198,13 @@ public class KeyHandler {
// Update the count // Update the count
count = count * 10 + (chKey - '0'); count = count * 10 + (chKey - '0');
} }
else if (allowKeyMappings && handleKeyMapping(editor, key, context)) { else if (!waitCommandFinish(editor) && allowKeyMappings && handleKeyMapping(editor, key, context)) {
return; if (editorState.getMappingMode() != MappingMode.OP_PENDING ||
currentCmd.isEmpty() ||
currentCmd.peek().getArgument() == null ||
currentCmd.peek().getArgument().getType() != Argument.Type.OFFSETS) {
return;
}
} }
// Pressing delete while entering a count "removes" the last digit entered // Pressing delete while entering a count "removes" the last digit entered
// Unlike the digits, this must be checked *after* checking for key mappings // Unlike the digits, this must be checked *after* checking for key mappings
@@ -190,24 +228,17 @@ public class KeyHandler {
// Ask the key/action tree if this is an appropriate key at this point in the command and if so, // Ask the key/action tree if this is an appropriate key at this point in the command and if so,
// return the node matching this keystroke // return the node matching this keystroke
final Node node = editorState.getCurrentNode().getChildOrArgument(key); Node node = editorState.getCurrentNode().get(key);
if (handleDigraph(editor, key, context, node)) { if (handleDigraph(editor, key, context, node)) return;
return;
}
// If this is a branch node we have entered only part of a multi-key command node = mapOpCommand(key, node, editorState);
if (node instanceof BranchNode) {
handleBranchNode(editor, context, editorState, chKey, (BranchNode)node); if (node instanceof CommandNode) {
handleCommandNode(editor, context, key, (CommandNode)node, editorState);
} }
// If this is a command node the user has entered a valid key sequence of a known command else if (node instanceof CommandPartNode) {
else if (node instanceof CommandNode) { editorState.setCurrentNode((CommandPartNode)node);
handleCommandNode(editor, (CommandNode)node);
}
// If this is an argument node then the last keystroke was not part of the current command but should
// be the first keystroke of the argument of the current command
else if (node instanceof ArgumentNode) {
shouldRecord = handleArgumentNode(editor, key, context, editorState, (ArgumentNode)node);
} }
else { else {
if (lastWasBS && lastChar != 0 && OptionsManager.INSTANCE.getDigraph().isSet()) { if (lastWasBS && lastChar != 0 && OptionsManager.INSTANCE.getDigraph().isSet()) {
@@ -250,21 +281,32 @@ public class KeyHandler {
if (editorState.getMappingMode() == MappingMode.OP_PENDING) { if (editorState.getMappingMode() == MappingMode.OP_PENDING) {
editorState.popState(); editorState.popState();
} }
else {
VimPlugin.indicateError();
reset(editor);
}
}
// We had some sort of error so reset the handler and let the user know (beep)
else if (state == State.ERROR) {
VimPlugin.indicateError(); VimPlugin.indicateError();
fullReset(editor); reset(editor);
} }
else if (isRecording && shouldRecord) { else if (isRecording && shouldRecord) {
VimPlugin.getRegister().recordKeyStroke(key); VimPlugin.getRegister().recordKeyStroke(key);
} }
} }
private boolean waitCommandFinish(@NotNull Editor editor) {
return !(CommandState.getInstance(editor).getCurrentNode() instanceof RootNode);
}
/**
* See the description for {@link CommandFlags#FLAG_DUPLICABLE_OPERATOR}
*/
private Node mapOpCommand(KeyStroke key, Node node, @NotNull CommandState editorState) {
if (editorState.getMappingMode() == MappingMode.OP_PENDING && !currentCmd.empty()) {
EditorActionHandlerBase action = currentCmd.peek().getAction();
if (action.getFlags().contains(CommandFlags.FLAG_DUPLICABLE_OPERATOR) &&
action.getKeyStrokesSet().stream().anyMatch(o -> o.size() == 1 && o.get(0).equals(key))) {
return editorState.getCurrentNode().get(KeyStroke.getKeyStroke('_'));
}
}
return node;
}
private static <T> boolean isPrefix(@NotNull List<T> list1, @NotNull List<T> list2) { private static <T> boolean isPrefix(@NotNull List<T> list1, @NotNull List<T> list2) {
if (list1.size() > list2.size()) { if (list1.size() > list2.size()) {
return false; return false;
@@ -278,29 +320,29 @@ public class KeyHandler {
} }
private void handleEditorReset(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull final DataContext context) { private void handleEditorReset(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull final DataContext context) {
if (state != State.COMMAND && count == 0 && currentArg == Argument.Type.NONE && currentCmd.size() == 0) { if (count == 0 && currentArg == null && currentCmd.size() == 0) {
RegisterGroup register = VimPlugin.getRegister(); RegisterGroup register = VimPlugin.getRegister();
if (register.getCurrentRegister() == register.getDefaultRegister()) { if (register.getCurrentRegister() == register.getDefaultRegister()) {
if (key.getKeyCode() == KeyEvent.VK_ESCAPE) { if (key.getKeyCode() == KeyEvent.VK_ESCAPE) {
CommandProcessor.getInstance().executeCommand(editor.getProject(), CommandProcessor.getInstance()
() -> KeyHandler.executeAction("EditorEscape", context), "", null); .executeCommand(editor.getProject(), () -> KeyHandler.executeAction("EditorEscape", context), "", null);
} }
VimPlugin.indicateError(); VimPlugin.indicateError();
} }
} }
reset(editor); reset(editor);
ChangeGroup.resetCaret(editor, false);
} }
private boolean handleKeyMapping(@NotNull final Editor editor, private boolean handleKeyMapping(@NotNull final Editor editor,
@NotNull final KeyStroke key, @NotNull final KeyStroke key,
@NotNull final DataContext context) { @NotNull final DataContext context) {
if (state == State.CHAR_OR_DIGRAPH) return false;
final CommandState commandState = CommandState.getInstance(editor); final CommandState commandState = CommandState.getInstance(editor);
commandState.stopMappingTimer(); commandState.stopMappingTimer();
final MappingMode mappingMode = commandState.getMappingMode(); final MappingMode mappingMode = commandState.getMappingMode();
if (MappingMode.NVO.contains(mappingMode) && (state != State.NEW_COMMAND || currentArg != Argument.Type.NONE)) {
return false;
}
final List<KeyStroke> mappingKeys = commandState.getMappingKeys(); final List<KeyStroke> mappingKeys = commandState.getMappingKeys();
final List<KeyStroke> fromKeys = new ArrayList<>(mappingKeys); final List<KeyStroke> fromKeys = new ArrayList<>(mappingKeys);
@@ -314,11 +356,19 @@ public class KeyHandler {
final Application application = ApplicationManager.getApplication(); final Application application = ApplicationManager.getApplication();
if (mapping.isPrefix(fromKeys)) { if (mapping.isPrefix(fromKeys)) {
// Okay, there is some mapping that starts with inserted key sequence. So,
// either the user will continue to enter the mapping, or (if timeout option is set)
// the entered command should be executed. Here we set up the times that will execute
// typed keys after some delay.
// E.g. there is a map for "dweri". If the user types "d", "w" they mean either "dweri" or "dw" command.
// If the user will continue typing "e", "r" and "i", the timer will be cancelled. If the user will
// not type anything, the "dw" command will be executed.
mappingKeys.add(key); mappingKeys.add(key);
if (!application.isUnitTestMode() && OptionsManager.INSTANCE.getTimeout().isSet()) { if (!application.isUnitTestMode() && OptionsManager.INSTANCE.getTimeout().isSet()) {
commandState.startMappingTimer(actionEvent -> application.invokeLater(() -> { commandState.startMappingTimer(actionEvent -> application.invokeLater(() -> {
final KeyStroke firstKey = mappingKeys.get(0);
mappingKeys.clear(); mappingKeys.clear();
if (editor.isDisposed()) { if (editor.isDisposed() || firstKey.equals(parseKeys("<Plug>").get(0))) {
return; return;
} }
for (KeyStroke keyStroke : fromKeys) { for (KeyStroke keyStroke : fromKeys) {
@@ -329,62 +379,121 @@ public class KeyHandler {
return true; return true;
} }
else if (mappingInfo != null) { else if (mappingInfo != null) {
// Okay, there is a mapping for the entered key sequence
// now the another key sequence should be executed, or the handler that attached to this command
mappingKeys.clear(); mappingKeys.clear();
final Runnable handleMappedKeys = () -> {
if (editor.isDisposed()) {
return;
}
final List<KeyStroke> toKeys = mappingInfo.getToKeys();
final VimExtensionHandler extensionHandler = mappingInfo.getExtensionHandler();
final EditorDataContext currentContext = new EditorDataContext(editor);
if (toKeys != null) {
final boolean fromIsPrefix = isPrefix(mappingInfo.getFromKeys(), toKeys);
boolean first = true;
for (KeyStroke keyStroke : toKeys) {
final boolean recursive = mappingInfo.isRecursive() && !(first && fromIsPrefix);
handleKey(editor, keyStroke, currentContext, recursive);
first = false;
}
}
else if (extensionHandler != null) {
final CommandProcessor processor = CommandProcessor.getInstance();
processor.executeCommand(editor.getProject(), () -> extensionHandler.execute(editor, context),
"Vim " + extensionHandler.getClass().getSimpleName(), null);
}
// NB: mappingInfo MUST be non-null here, so if equal final List<KeyStroke> toKeys = mappingInfo.getToKeys();
// then prevMappingInfo is also non-null; this also final VimExtensionHandler extensionHandler = mappingInfo.getExtensionHandler();
// means that the prev mapping was a prefix, but the final EditorDataContext currentContext = new EditorDataContext(editor);
// next key typed (`key`) was not part of that if (toKeys != null) {
if (prevMappingInfo == mappingInfo) { // Here is a mapping to another key sequence
// post to end of queue so it's handled AFTER final boolean fromIsPrefix = isPrefix(mappingInfo.getFromKeys(), toKeys);
// an <Plug> mapping is invoked (since that boolean first = true;
// will also get posted) for (KeyStroke keyStroke : toKeys) {
Runnable handleRemainingKey = () -> handleKey(editor, key, currentContext); final boolean recursive = mappingInfo.isRecursive() && !(first && fromIsPrefix);
handleKey(editor, keyStroke, currentContext, recursive);
if (application.isUnitTestMode()) { first = false;
handleRemainingKey.run();
}
else {
application.invokeLater(handleRemainingKey);
}
} }
};
if (application.isUnitTestMode()) {
handleMappedKeys.run();
} }
else { else if (extensionHandler != null) {
application.invokeLater(handleMappedKeys); // Here is a mapping to some vim handler
final CommandProcessor processor = CommandProcessor.getInstance();
final boolean isPendingMode = CommandState.getInstance(editor).getMappingMode() == MappingMode.OP_PENDING;
Map<Caret, Integer> startOffsets =
editor.getCaretModel().getAllCarets().stream().collect(Collectors.toMap(Function.identity(), Caret::getOffset));
processor.executeCommand(editor.getProject(), () -> extensionHandler.execute(editor, context),
"Vim " + extensionHandler.getClass().getSimpleName(), null);
if (isPendingMode &&
!currentCmd.isEmpty() &&
currentCmd.peek().getArgument() == null) {
Map<Caret, VimSelection> offsets = new HashMap<>();
for (Caret caret : editor.getCaretModel().getAllCarets()) {
@Nullable Integer startOffset = startOffsets.get(caret);
if (caret.hasSelection()) {
final VimSelection vimSelection = VimSelection.Companion
.create(UserDataManager.getVimSelectionStart(caret), caret.getOffset(),
SelectionType.fromSubMode(CommandStateHelper.getSubMode(editor)), editor);
offsets.put(caret, vimSelection);
commandState.popState();
}
else if (startOffset != null && startOffset != caret.getOffset()) {
// Command line motions are always characterwise exclusive
int endOffset = caret.getOffset();
if (startOffset < endOffset) {
endOffset -= 1;
} else {
startOffset -= 1;
}
final VimSelection vimSelection = VimSelection.Companion
.create(startOffset, endOffset, SelectionType.CHARACTER_WISE, editor);
offsets.put(caret, vimSelection);
try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) {
// Move caret to the initial offset for better undo action
// This is not a necessary thing, but without it undo action look less convenient
editor.getCaretModel().moveToOffset(startOffset);
}
}
}
if (!offsets.isEmpty()) {
currentCmd.peek().setArgument(new Argument(offsets));
state = State.READY;
}
}
}
// NB: mappingInfo MUST be non-null here, so if equal
// then prevMappingInfo is also non-null; this also
// means that the prev mapping was a prefix, but the
// next key typed (`key`) was not part of that
if (prevMappingInfo == mappingInfo) {
handleKey(editor, key, currentContext);
} }
return true; return true;
} }
else { else {
final List<KeyStroke> unhandledKeys = new ArrayList<>(mappingKeys); // If the user enters a command that starts with known mapping, but it is not exactly this mapping,
// mapping handler prevents further processing of there keys.
// E.g. if there is a mapping for "hello" and user enters command "help"
// the processing of "h", "e" and "l" will be prevented by this handler.
// However, these keys should be processed as usual when user enters "p"
// and the following for loop does exactly that.
//
// Okay, look at the code below. Why is the first key handled separately?
// Let's assume the next mappings:
// - map ds j
// - map I 2l
// If user enters `dI`, the first `d` will be caught be this handler because it's a prefix for `ds` command.
// After the user enters `I`, the caught `d` should be processed without mapping and the rest of keys
// should be processed with mappings (to make I work)
//
// Additionally, the <Plug>mappings are not executed if the are failed to map to somethings.
// E.g.
// - map <Plug>iA someAction
// - map I <Plug>i
// For `IA` someAction should be executed.
// But if the user types `Ib`, `<Plug>i` won't be executed again. Only `b` will be passed to keyHandler.
if (mappingKeys.isEmpty()) return false;
// Well, this will always be false, but just for protection
if (fromKeys.isEmpty()) return false;
final List<KeyStroke> unhandledKeys = new ArrayList<>(fromKeys);
mappingKeys.clear(); mappingKeys.clear();
for (KeyStroke keyStroke : unhandledKeys) {
handleKey(editor, keyStroke, context, false); if (unhandledKeys.get(0).equals(parseKeys("<Plug>").get(0))) {
handleKey(editor, unhandledKeys.get(unhandledKeys.size() - 1), context);
} else {
handleKey(editor, unhandledKeys.get(0), context, false);
for (KeyStroke keyStroke : unhandledKeys.subList(1, unhandledKeys.size())) {
handleKey(editor, keyStroke, context, true);
}
} }
return false; return true;
} }
} }
@@ -398,8 +507,7 @@ public class KeyHandler {
} }
private boolean isEditorReset(@NotNull KeyStroke key, @NotNull CommandState editorState) { private boolean isEditorReset(@NotNull KeyStroke key, @NotNull CommandState editorState) {
return (editorState.getMode() == CommandState.Mode.COMMAND || state == State.COMMAND) && return (editorState.getMode() == CommandState.Mode.COMMAND) && StringHelper.isCloseKeyStroke(key);
StringHelper.isCloseKeyStroke(key);
} }
private void handleCharArgument(@NotNull KeyStroke key, char chKey) { private void handleCharArgument(@NotNull KeyStroke key, char chKey) {
@@ -492,10 +600,8 @@ public class KeyHandler {
final Command mot = arg.getMotion(); final Command mot = arg.getMotion();
// If no count was entered for either command then nothing changes. If either had a count then // If no count was entered for either command then nothing changes. If either had a count then
// the motion gets the product of both. // the motion gets the product of both.
if (mot != null) { int cnt = cmd.getRawCount() == 0 && mot.getRawCount() == 0 ? 0 : cmd.getCount() * mot.getCount();
int cnt = cmd.getRawCount() == 0 && mot.getRawCount() == 0 ? 0 : cmd.getCount() * mot.getCount(); mot.setCount(cnt);
mot.setCount(cnt);
}
cmd.setCount(0); cmd.setCount(0);
} }
@@ -527,8 +633,9 @@ public class KeyHandler {
if (ApplicationManager.getApplication().isDispatchThread()) { if (ApplicationManager.getApplication().isDispatchThread()) {
Runnable action = new ActionRunner(editor, context, cmd, key); Runnable action = new ActionRunner(editor, context, cmd, key);
String name = cmd.getAction().getTemplatePresentation().getText(); EditorActionHandlerBase cmdAction = cmd.getAction();
name = name != null ? "Vim " + name : ""; String name = cmdAction.getId();
if (type.isWrite()) { if (type.isWrite()) {
RunnableHelper.runWriteCommand(project, action, name, action); RunnableHelper.runWriteCommand(project, action, name, action);
} }
@@ -541,93 +648,81 @@ public class KeyHandler {
} }
} }
private void handleCommandNode(@NotNull Editor editor, @NotNull CommandNode node) { private void handleCommandNode(Editor editor,
// If all does well we are ready to process this command DataContext context,
state = State.READY; KeyStroke key,
// Did we just get the completed sequence for a motion command argument? @NotNull CommandNode node,
if (currentArg == Argument.Type.MOTION) { CommandState editorState) {
// We have been expecting a motion argument - is this one? // The user entered a valid command. Create the command and add it to the stack
if (node.getCmdType() == Command.Type.MOTION) { Command cmd = new Command(count, node.getAction(), node.getAction().getType(), node.getAction().getFlags(), keys);
if (!(node.getAction() instanceof MotionEditorAction) && !(node.getAction() instanceof TextObjectAction)) { currentCmd.push(cmd);
throw new RuntimeException("MOTION cmd type can be used only with MotionEditorAction or TextObjectAction - " +
node.getAction().getClass().getName()); if (currentArg != null && !checkArgumentCompatibility(node)) return;
}
// Create the motion command and add it to the stack if (node.getAction().getArgumentType() == null || stopMacroRecord(node, editorState)) {
Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags()); state = State.READY;
cmd.setKeys(keys); }
currentCmd.push(cmd); else {
} currentArg = node.getAction().getArgumentType();
else if (node.getCmdType() == Command.Type.RESET) { startWaitingForArgument(editor, context, key.getKeyChar(), currentArg, editorState, node.getAction());
currentCmd.clear(); partialReset(editor);
Command cmd = new Command(1, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags()); }
cmd.setKeys(keys);
currentCmd.push(cmd); // TODO In the name of God, get rid of EX_STRING, FLAG_COMPLETE_EX and all the related staff
if (currentArg == Argument.Type.EX_STRING && node.getAction().getFlags().contains(CommandFlags.FLAG_COMPLETE_EX)) {
EditorActionHandlerBase action;
if (forwardSearch) {
action = new SearchEntryFwdAction();
} }
else { else {
// Oops - this wasn't a motion command. The user goofed and typed something else action = new SearchEntryRevAction();
state = State.BAD_COMMAND;
} }
}
else if (currentArg == Argument.Type.EX_STRING && node.getFlags().contains(CommandFlags.FLAG_COMPLETE_EX)) {
String text = VimPlugin.getProcess().endSearchCommand(editor);
Argument arg = new Argument(text);
Command cmd = currentCmd.peek();
cmd.setArgument(arg);
CommandState.getInstance(editor).popState();
}
// The user entered a valid command that doesn't take any arguments
else {
// Create the command and add it to the stack
Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags());
cmd.setKeys(keys);
currentCmd.push(cmd);
// This is a sanity check that the command has a valid action. This should only fail if the String text = VimPlugin.getProcess().endSearchCommand(editor);
// programmer made a typo or forgot to add the action to the plugin.xml file currentCmd.pop();
if (cmd.getAction() == null) {
state = State.ERROR; Argument arg = new Argument(text);
} cmd = new Command(count, action, action.getType(), action.getFlags(), keys);
cmd.setArgument(arg);
currentCmd.push(cmd);
CommandState.getInstance(editor).popState();
} }
} }
private boolean handleArgumentNode(@NotNull Editor editor, private boolean stopMacroRecord(CommandNode node, @NotNull CommandState editorState) {
@NotNull KeyStroke key, return editorState.isRecording() && node.getAction() instanceof ToggleRecordingAction;
@NotNull DataContext context, }
@NotNull CommandState editorState,
@NotNull ArgumentNode node) { private void startWaitingForArgument(Editor editor,
// Create a new command based on what the user has typed so far, excluding this keystroke. DataContext context,
Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags()); char key,
cmd.setKeys(keys); @NotNull Argument.Type argument,
currentCmd.push(cmd); CommandState editorState,
// What type of argument does this command expect? EditorActionHandlerBase action) {
switch (node.getArgType()) { switch (argument) {
case DIGRAPH:
//digraphState = 0;
digraph = new DigraphSequence();
// No break - fall through
case CHARACTER: case CHARACTER:
case DIGRAPH:
digraph = new DigraphSequence();
state = State.CHAR_OR_DIGRAPH;
break;
case MOTION: case MOTION:
state = State.NEW_COMMAND; editorState.pushState(editorState.getMode(), editorState.getSubMode(), MappingMode.OP_PENDING);
currentArg = node.getArgType();
// Is the current command an operator? If so set the state to only accept "operator pending"
// commands
if (node.getFlags().contains(CommandFlags.FLAG_OP_PEND)) {
editorState.pushState(editorState.getMode(), editorState.getSubMode(), MappingMode.OP_PENDING);
}
break; break;
case EX_STRING: case EX_STRING:
break; forwardSearch = !(action instanceof SearchEntryRevAction);
default:
// Oops - we aren't expecting any other type of argument
state = State.ERROR;
}
// If the current keystroke is really the first character of an argument the user needs to enter, VimPlugin.getProcess().startSearchCommand(editor, context, count, key);
// recursively go back and handle this keystroke again with all the state properly updated to state = State.NEW_COMMAND;
// handle the argument editorState.pushState(CommandState.Mode.CMD_LINE, CommandState.SubMode.NONE, MappingMode.CMD_LINE);
if (currentArg != Argument.Type.NONE) { currentCmd.pop();
partialReset(editor); }
handleKey(editor, key, context); }
private boolean checkArgumentCompatibility(@NotNull CommandNode node) {
if (currentArg == Argument.Type.MOTION &&
node.getAction().getType() != Command.Type.MOTION &&
!(node.getAction() instanceof ExEntryAction)) {
state = State.BAD_COMMAND;
return false; return false;
} }
return true; return true;
@@ -645,37 +740,6 @@ public class KeyHandler {
return action != null && executeAction(action, context); return action != null && executeAction(action, context);
} }
private void handleBranchNode(@NotNull Editor editor,
@NotNull DataContext context,
@NotNull CommandState editorState,
char key,
@NotNull BranchNode node) {
// Flag that we aren't allowing any more count digits (unless it's OK)
if (!node.getFlags().contains(CommandFlags.FLAG_ALLOW_MID_COUNT)) {
state = State.COMMAND;
}
editorState.setCurrentNode(node);
ArgumentNode arg = (ArgumentNode)((BranchNode)editorState.getCurrentNode()).getArgumentNode();
if (arg != null) {
if (currentArg == Argument.Type.MOTION && arg.getCmdType() != Command.Type.MOTION) {
editorState.popState();
state = State.BAD_COMMAND;
return;
}
if (editorState.isRecording() && arg.getFlags().contains(CommandFlags.FLAG_NO_ARG_RECORDING)) {
handleKey(editor, KeyStroke.getKeyStroke(' '), context);
}
if (arg.getArgType() == Argument.Type.EX_STRING) {
VimPlugin.getProcess().startSearchCommand(editor, context, count, key);
state = State.NEW_COMMAND;
currentArg = Argument.Type.EX_STRING;
editorState.pushState(CommandState.Mode.EX_ENTRY, CommandState.SubMode.NONE, MappingMode.CMD_LINE);
}
}
}
/** /**
* Partially resets the state of this handler. Resets the command count, clears the key list, resets the key tree * Partially resets the state of this handler. Resets the command count, clears the key list, resets the key tree
* node to the root for the current mode we are in. * node to the root for the current mode we are in.
@@ -700,7 +764,7 @@ public class KeyHandler {
partialReset(editor); partialReset(editor);
state = State.NEW_COMMAND; state = State.NEW_COMMAND;
currentCmd.clear(); currentCmd.clear();
currentArg = Argument.Type.NONE; currentArg = null;
digraph = null; digraph = null;
} }
@@ -717,13 +781,63 @@ public class KeyHandler {
lastChar = 0; lastChar = 0;
lastWasBS = false; lastWasBS = false;
VimPlugin.getRegister().resetRegister(); VimPlugin.getRegister().resetRegister();
if (editor != null) {
VisualGroupKt.updateCaretState(editor);
editor.getSelectionModel().removeSelection();
}
}
// This method is copied from com.intellij.openapi.editor.actionSystem.EditorAction.getProjectAwareDataContext
@NotNull
private static DataContext getProjectAwareDataContext(@NotNull final Editor editor,
@NotNull final DataContext original) {
if (PROJECT.getData(original) == editor.getProject()) {
return new DialogAwareDataContext(original);
}
return dataId -> {
if (PROJECT.is(dataId)) {
final Project project = editor.getProject();
if (project != null) {
return project;
}
}
return original.getData(dataId);
};
}
// This class is copied from com.intellij.openapi.editor.actionSystem.DialogAwareDataContext.DialogAwareDataContext
private final static class DialogAwareDataContext implements DataContext {
private static final DataKey[] keys = {PROJECT, PROJECT_FILE_DIRECTORY, EDITOR, VIRTUAL_FILE, PSI_FILE};
private final Map<String, Object> values = new HashMap<>();
DialogAwareDataContext(DataContext context) {
for (DataKey key : keys) {
values.put(key.getName(), key.getData(context));
}
}
@Nullable
@Override
public Object getData(@NotNull @NonNls String dataId) {
if (values.containsKey(dataId)) {
return values.get(dataId);
}
final Editor editor = (Editor)values.get(EDITOR.getName());
if (editor != null) {
return DataManager.getInstance().getDataContext(editor.getContentComponent()).getData(dataId);
}
return null;
}
} }
/** /**
* This was used as an experiment to execute actions as a runnable. * This was used as an experiment to execute actions as a runnable.
*/ */
static class ActionRunner implements Runnable { static class ActionRunner implements Runnable {
public ActionRunner(Editor editor, DataContext context, Command cmd, KeyStroke key) { @Contract(pure = true)
ActionRunner(Editor editor, DataContext context, Command cmd, KeyStroke key) {
this.editor = editor; this.editor = editor;
this.context = context; this.context = context;
this.cmd = cmd; this.cmd = cmd;
@@ -735,7 +849,7 @@ public class KeyHandler {
CommandState editorState = CommandState.getInstance(editor); CommandState editorState = CommandState.getInstance(editor);
boolean wasRecording = editorState.isRecording(); boolean wasRecording = editorState.isRecording();
executeAction(cmd.getAction(), context); executeVimAction(editor, cmd.getAction(), context);
if (editorState.getMode() == CommandState.Mode.INSERT || editorState.getMode() == CommandState.Mode.REPLACE) { if (editorState.getMode() == CommandState.Mode.INSERT || editorState.getMode() == CommandState.Mode.REPLACE) {
VimPlugin.getChange().processCommand(editor, cmd); VimPlugin.getChange().processCommand(editor, cmd);
} }
@@ -771,18 +885,26 @@ public class KeyHandler {
} }
private enum State { private enum State {
NEW_COMMAND, COMMAND, READY, ERROR, BAD_COMMAND /** Awaiting a new command */
NEW_COMMAND,
// TODO This should be probably processed in some better way
/** Awaiting for char or digraph input. In this mode mappings doesn't work (even for <C-K>) */
CHAR_OR_DIGRAPH,
READY,
BAD_COMMAND
} }
private int count; private int count;
private List<KeyStroke> keys; private List<KeyStroke> keys;
private State state; private State state;
@NotNull private final Stack<Command> currentCmd = new Stack<>(); @NotNull private final Stack<Command> currentCmd = new Stack<>();
@NotNull private Argument.Type currentArg; @Nullable private Argument.Type currentArg;
private TypedActionHandler origHandler; private TypedActionHandler origHandler;
@Nullable private DigraphSequence digraph = null; @Nullable private DigraphSequence digraph = null;
private char lastChar; private char lastChar;
private boolean lastWasBS; private boolean lastWasBS;
private boolean forwardSearch = true;
private static KeyHandler instance; private static KeyHandler instance;
} }

View File

@@ -13,67 +13,53 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim; package com.maddyhome.idea.vim;
import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.actionSystem.ex.ActionManagerEx;
import com.maddyhome.idea.vim.action.VimCommandActionBase;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.KeyGroup; import com.maddyhome.idea.vim.group.KeyGroup;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.key.Shortcut; import com.maddyhome.idea.vim.key.Shortcut;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*; import javax.swing.*;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.EnumSet;
class RegisterActions { public class RegisterActions {
public static final ExtensionPointName<EditorActionHandlerBase> VIM_ACTIONS_EP =
ExtensionPointName.create("IdeaVIM.vimAction");
/** /**
* Register all the key/action mappings for the plugin. * Register all the key/action mappings for the plugin.
*/ */
static void registerActions() { static void registerActions() {
registerVimCommandActions(); registerVimCommandActions();
registerSystemMappings(); registerEmptyShortcuts();
}
@Nullable
public static EditorActionHandlerBase findAction(@NotNull String id) {
return VIM_ACTIONS_EP.extensions().filter(vimActionBean -> vimActionBean.getId().equals(id)).findFirst()
.orElse(null);
}
@NotNull
public static EditorActionHandlerBase findActionOrDie(@NotNull String id) {
EditorActionHandlerBase action = findAction(id);
if (action == null) throw new RuntimeException("Action " + id + " is not registered");
return action;
} }
private static void registerVimCommandActions() { private static void registerVimCommandActions() {
final ActionManagerEx manager = ActionManagerEx.getInstanceEx(); KeyGroup parser = VimPlugin.getKey();
for (String actionId : manager.getPluginActions(VimPlugin.getPluginId())) { VIM_ACTIONS_EP.extensions().forEach(parser::registerCommandAction);
final AnAction action = manager.getAction(actionId);
if (action instanceof VimCommandActionBase) {
VimPlugin.getKey().registerCommandAction((VimCommandActionBase)action, actionId);
}
}
} }
private static void registerSystemMappings() { private static void registerEmptyShortcuts() {
final KeyGroup parser = VimPlugin.getKey(); final KeyGroup parser = VimPlugin.getKey();
parser.registerAction(MappingMode.NV, "CollapseAllRegions", Command.Type.OTHER_READONLY, new Shortcut("zM"));
parser.registerAction(MappingMode.NV, "CollapseRegion", Command.Type.OTHER_READONLY, new Shortcut("zc"));
parser.registerAction(MappingMode.NV, "CollapseRegionRecursively", Command.Type.OTHER_READONLY, new Shortcut("zC"));
parser.registerAction(MappingMode.NV, "ExpandAllRegions", Command.Type.OTHER_READONLY, new Shortcut("zR"));
parser.registerAction(MappingMode.NV, "ExpandRegion", Command.Type.OTHER_READONLY, new Shortcut("zo"));
parser.registerAction(MappingMode.NV, "ExpandRegionRecursively", Command.Type.OTHER_READONLY, new Shortcut("zO"));
parser.registerAction(MappingMode.I, "EditorBackSpace", Command.Type.INSERT, EnumSet.noneOf(CommandFlags.class),
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0))});
parser.registerAction(MappingMode.I, "EditorDelete", Command.Type.INSERT, EnumSet.of(CommandFlags.FLAG_SAVE_STROKE),
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0))});
parser.registerAction(MappingMode.I, "EditorDown", Command.Type.INSERT, EnumSet.of(CommandFlags.FLAG_CLEAR_STROKES),
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0))});
parser.registerAction(MappingMode.I, "EditorTab", Command.Type.INSERT, EnumSet.of(CommandFlags.FLAG_SAVE_STROKE),
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0))});
parser.registerAction(MappingMode.I, "EditorUp", Command.Type.INSERT, EnumSet.of(CommandFlags.FLAG_CLEAR_STROKES),
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, 0))});
parser.registerAction(MappingMode.N, "QuickJavaDoc", Command.Type.OTHER_READONLY, new Shortcut('K'));
// Digraph shortcuts are handled directly by KeyHandler#handleKey, so they don't have an action. But we still need to // Digraph shortcuts are handled directly by KeyHandler#handleKey, so they don't have an action. But we still need to
// register the shortcuts or the editor will swallow them. Technically, the shortcuts will be registered as part of // register the shortcuts or the editor will swallow them. Technically, the shortcuts will be registered as part of

View File

@@ -0,0 +1,256 @@
package com.maddyhome.idea.vim
import com.intellij.ide.BrowserUtil
import com.intellij.ide.DataManager
import com.intellij.ide.plugins.InstalledPluginsState
import com.intellij.ide.plugins.PluginManager
import com.intellij.ide.plugins.PluginManagerMain
import com.intellij.ide.plugins.RepositoryHelper
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.progress.PerformInBackgroundOption
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.ui.popup.ListPopup
import com.intellij.openapi.updateSettings.impl.PluginDownloader
import com.intellij.openapi.updateSettings.impl.UpdateChecker
import com.intellij.openapi.updateSettings.impl.UpdateInstaller
import com.intellij.openapi.updateSettings.impl.UpdateSettings
import com.intellij.openapi.util.Ref
import com.intellij.openapi.wm.StatusBar
import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.StatusBarWidgetProvider
import com.intellij.ui.awt.RelativePoint
import com.intellij.util.Consumer
import com.intellij.util.text.VersionComparatorUtil
import com.maddyhome.idea.vim.group.NotificationService
import com.maddyhome.idea.vim.ui.VimEmulationConfigurable
import icons.VimIcons
import java.awt.Point
import java.awt.event.MouseEvent
import javax.swing.Icon
import javax.swing.SwingConstants
private class StatusBarIconProvider : StatusBarWidgetProvider {
override fun getWidget(project: Project) = VimStatusBar
}
private object VimStatusBar : StatusBarWidget, StatusBarWidget.IconPresentation {
private var statusBar: StatusBar? = null
override fun ID(): String = "IdeaVim-Icon"
override fun install(statusBar: StatusBar) {
this.statusBar = statusBar
}
override fun dispose() {}
override fun getTooltipText() = "IdeaVim"
override fun getIcon(): Icon = if (VimPlugin.isEnabled()) VimIcons.IDEAVIM else VimIcons.IDEAVIM_DISABLED
override fun getClickConsumer() = Consumer<MouseEvent> { event ->
val component = event.component
val popup = VimActionsPopup.getPopup(DataManager.getInstance().getDataContext(component))
val dimension = popup.content.preferredSize
// Trying to find the best position. 16 - size of the icon, 1 - height of the delimiter
val at = Point(-dimension.width + 16, -dimension.height - 1)
popup.show(RelativePoint(component, at))
}
// TODO [VERSION UPDATE] After 193 use `getPresentation()`
@Suppress("DEPRECATION", "UnstableApiUsage")
override fun getPresentation(type: StatusBarWidget.PlatformType): StatusBarWidget.WidgetPresentation? = this
fun update() {
statusBar?.updateWidget(this.ID())
}
}
class VimActions : DumbAwareAction() {
companion object {
const val actionPlace = "VimActionsPopup"
}
override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return
VimActionsPopup.getPopup(e.dataContext).showCenteredInCurrentWindow(project)
}
override fun update(e: AnActionEvent) {
val project = e.project
e.presentation.isEnabledAndVisible = project != null && !project.isDisposed
}
}
private object VimActionsPopup {
fun getPopup(dataContext: DataContext): ListPopup {
val actions = getActions()
val popup = JBPopupFactory.getInstance()
.createActionGroupPopup("IdeaVim", actions,
dataContext, JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false,
VimActions.actionPlace)
popup.setAdText("Version ${VimPlugin.getVersion()}", SwingConstants.CENTER)
return popup
}
private fun getActions(): DefaultActionGroup {
val actionGroup = DefaultActionGroup()
actionGroup.isPopup = true
actionGroup.add(ActionManager.getInstance().getAction("VimPluginToggle"))
actionGroup.addSeparator()
actionGroup.add(NotificationService.OpenIdeaVimRcAction(null))
actionGroup.add(ShortcutConflictsSettings)
actionGroup.addSeparator()
val eapGroup = DefaultActionGroup("EAP" + if (JoinEap.eapActive()) " (Active)" else "", true)
eapGroup.add(JoinEap)
eapGroup.add(HelpLink("About EAP...", "https://github.com/JetBrains/ideavim#get-early-access", null))
actionGroup.add(eapGroup)
val helpGroup = DefaultActionGroup("Contacts && Help", true)
helpGroup.add(HelpLink("Contact on Twitter", "https://twitter.com/ideavim", VimIcons.TWITTER))
helpGroup.add(HelpLink("Create an Issue", "https://youtrack.jetbrains.com/issues/VIM", VimIcons.YOUTRACK))
helpGroup.add(HelpLink("Contribute on GitHub", "https://github.com/JetBrains/ideavim", VimIcons.GITHUB))
actionGroup.add(helpGroup)
return actionGroup
}
}
private class HelpLink(
name: String,
val link: String,
icon: Icon?
) : DumbAwareAction(name, null, icon) {
override fun actionPerformed(e: AnActionEvent) {
BrowserUtil.browse(link)
}
}
private object ShortcutConflictsSettings : DumbAwareAction("Settings...") {
override fun actionPerformed(e: AnActionEvent) {
ShowSettingsUtil.getInstance().editConfigurable(e.project, VimEmulationConfigurable())
}
}
private object JoinEap : DumbAwareAction() {
private const val EAP_LINK = "https://plugins.jetbrains.com/plugins/eap/ideavim"
fun eapActive() = EAP_LINK in UpdateSettings.getInstance().storedPluginHosts
override fun actionPerformed(e: AnActionEvent) {
if (eapActive()) {
UpdateSettings.getInstance().storedPluginHosts -= EAP_LINK
VimPlugin.getNotifications(e.project).notifyEapFinished()
} else {
UpdateSettings.getInstance().storedPluginHosts += EAP_LINK
checkForUpdates(e.project)
}
}
override fun update(e: AnActionEvent) {
if (eapActive()) {
e.presentation.text = "Finish EAP"
} else {
e.presentation.text = "Get Early Access..."
}
}
private fun checkForUpdates(project: Project?) {
val notificator = VimPlugin.getNotifications(project)
val pluginRef = Ref.create<PluginDownloader>()
object : Task.Backgroundable(null, "Checking for IdeaVim EAP version", true) {
override fun run(indicator: ProgressIndicator) {
val downloaders = mutableListOf<PluginDownloader>()
val build = ApplicationInfo.getInstance().build
for (host in RepositoryHelper.getPluginHosts()) {
val newPluginDescriptor = RepositoryHelper
.loadPlugins(host, null, indicator)
.filter { it.pluginId == VimPlugin.getPluginId() }
.maxWith(java.util.Comparator { o1, o2 -> VersionComparatorUtil.compare(o1.version, o2.version) })
?: continue
downloaders += PluginDownloader.createDownloader(newPluginDescriptor, host, build)
}
val plugin = downloaders.maxWith(java.util.Comparator { o1, o2 -> VersionComparatorUtil.compare(o1.pluginVersion, o2.pluginVersion) })
pluginRef.set(plugin)
}
override fun onSuccess() {
val downloader: PluginDownloader = pluginRef.get() ?: run {
notificator.notifySubscribedToEap()
return
}
val currentVersion = PluginManager.getPlugin(VimPlugin.getPluginId())?.version ?: ""
if (VersionComparatorUtil.compare(downloader.pluginVersion, currentVersion) <= 0) {
notificator.notifySubscribedToEap()
return
}
val version = downloader.pluginVersion
val message = "Do you want to install the EAP version of IdeaVim?"
@Suppress("MoveVariableDeclarationIntoWhen")
val res = Messages.showYesNoCancelDialog(project, message, "IdeaVim $version", null)
when (res) {
Messages.YES -> updatePlugin(project, downloader)
Messages.NO -> notificator.notifySubscribedToEap()
Messages.CANCEL -> if (eapActive()) UpdateSettings.getInstance().storedPluginHosts -= EAP_LINK
}
}
override fun onCancel() {
notificator.notifySubscribedToEap()
}
override fun onThrowable(error: Throwable) {
notificator.notifySubscribedToEap()
}
}.queue()
}
private fun updatePlugin(project: Project?, downloader: PluginDownloader) {
val notificator = VimPlugin.getNotifications(project)
return object : Task.Backgroundable(null, "Plugin Updates", true, PerformInBackgroundOption.DEAF) {
private var updated = false
override fun run(indicator: ProgressIndicator) {
val state = InstalledPluginsState.getInstance()
state.onDescriptorDownload(downloader.descriptor)
UpdateChecker.checkAndPrepareToInstall(downloader, state, mutableMapOf(VimPlugin.getPluginId() to downloader), mutableListOf(), indicator)
updated = UpdateInstaller.installPluginUpdates(listOf(downloader), indicator)
}
override fun onSuccess() {
if (updated) {
PluginManagerMain.notifyPluginsUpdated(null)
} else {
notificator.notifyFailedToDownloadEap()
}
}
override fun onCancel() {
notificator.notifyFailedToDownloadEap()
}
override fun onThrowable(error: Throwable) {
notificator.notifyFailedToDownloadEap()
}
}.queue()
}
}

View File

@@ -13,12 +13,12 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim package com.maddyhome.idea.vim
import com.intellij.configurationStore.APP_CONFIG import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.RoamingType import com.intellij.openapi.components.RoamingType
import com.intellij.openapi.components.State import com.intellij.openapi.components.State
@@ -30,8 +30,10 @@ import org.jdom.Element
* @author Alex Plate * @author Alex Plate
*/ */
@State(name = "VimLocalSettings", @State(name = "VimLocalSettings", storages = [
storages = [Storage("$APP_CONFIG$/vim_local_settings.xml", roamingType = RoamingType.DISABLED)]) Storage("\$APP_CONFIG$$/vim_local_settings.xml", roamingType = RoamingType.DISABLED, deprecated = true),
Storage("\$APP_CONFIG$/vim_local_settings.xml", roamingType = RoamingType.DISABLED)
])
class VimLocalConfig : PersistentStateComponent<Element> { class VimLocalConfig : PersistentStateComponent<Element> {
override fun getState(): Element { override fun getState(): Element {
val element = Element("ideavim-local") val element = Element("ideavim-local")
@@ -48,9 +50,17 @@ class VimLocalConfig : PersistentStateComponent<Element> {
} }
override fun loadState(state: Element) { override fun loadState(state: Element) {
VimPlugin.getMark().readData(state) val setup = {
VimPlugin.getRegister().readData(state) VimPlugin.getMark().readData(state)
VimPlugin.getSearch().readData(state) VimPlugin.getRegister().readData(state)
VimPlugin.getHistory().readData(state) VimPlugin.getSearch().readData(state)
VimPlugin.getHistory().readData(state)
}
if (ApplicationManager.getApplication().isUnitTestMode) {
setup()
} else {
ApplicationManager.getApplication().executeOnPooledThread(setup)
}
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim; package com.maddyhome.idea.vim;
@@ -21,9 +21,7 @@ import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.plugins.PluginManager; import com.intellij.ide.plugins.PluginManager;
import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.PropertiesComponent;
import com.intellij.notification.Notification; import com.intellij.notification.Notification;
import com.intellij.notification.NotificationDisplayType;
import com.intellij.notification.NotificationListener; import com.intellij.notification.NotificationListener;
import com.intellij.notification.Notifications;
import com.intellij.openapi.Disposable; import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ApplicationInfo;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
@@ -46,14 +44,15 @@ import com.intellij.openapi.wm.WindowManager;
import com.intellij.util.io.HttpRequests; import com.intellij.util.io.HttpRequests;
import com.maddyhome.idea.vim.ex.CommandParser; import com.maddyhome.idea.vim.ex.CommandParser;
import com.maddyhome.idea.vim.ex.vimscript.VimScriptParser; import com.maddyhome.idea.vim.ex.vimscript.VimScriptParser;
import com.maddyhome.idea.vim.extension.VimExtensionRegistrar;
import com.maddyhome.idea.vim.group.*; import com.maddyhome.idea.vim.group.*;
import com.maddyhome.idea.vim.group.copy.PutGroup; import com.maddyhome.idea.vim.group.copy.PutGroup;
import com.maddyhome.idea.vim.group.copy.YankGroup; import com.maddyhome.idea.vim.group.copy.YankGroup;
import com.maddyhome.idea.vim.group.visual.VisualMotionGroup; import com.maddyhome.idea.vim.group.visual.VisualMotionGroup;
import com.maddyhome.idea.vim.helper.DocumentManager;
import com.maddyhome.idea.vim.helper.MacKeyRepeat; import com.maddyhome.idea.vim.helper.MacKeyRepeat;
import com.maddyhome.idea.vim.listener.VimListenerManager; import com.maddyhome.idea.vim.listener.VimListenerManager;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import com.maddyhome.idea.vim.ui.ExEntryPanel;
import com.maddyhome.idea.vim.ui.VimEmulationConfigurable; import com.maddyhome.idea.vim.ui.VimEmulationConfigurable;
import org.jdom.Element; import org.jdom.Element;
import org.jdom.JDOMException; import org.jdom.JDOMException;
@@ -66,6 +65,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/** /**
* This plugin attempts to emulate the key binding and general functionality of Vim and gVim. See the supplied * This plugin attempts to emulate the key binding and general functionality of Vim and gVim. See the supplied
@@ -95,56 +95,15 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
private static final Logger LOG = Logger.getInstance(VimPlugin.class); private static final Logger LOG = Logger.getInstance(VimPlugin.class);
@NotNull private final MotionGroup motion;
@NotNull private final ChangeGroup change;
@NotNull private final CommandGroup command;
@NotNull private final MarkGroup mark;
@NotNull private final RegisterGroup register;
@NotNull private final FileGroup file;
@NotNull private final SearchGroup search;
@NotNull private final ProcessGroup process;
@NotNull private final MacroGroup macro;
@NotNull private final DigraphGroup digraph;
@NotNull private final HistoryGroup history;
@NotNull private final KeyGroup key;
@NotNull private final WindowGroup window;
@NotNull private final EditorGroup editor;
@NotNull private final VisualMotionGroup visualMotion;
@NotNull private final YankGroup yank;
@NotNull private final PutGroup put;
@NotNull private final VimState state;
public VimPlugin() {
motion = new MotionGroup();
change = new ChangeGroup();
command = new CommandGroup();
mark = new MarkGroup();
register = new RegisterGroup();
file = new FileGroup();
search = new SearchGroup();
process = new ProcessGroup();
macro = new MacroGroup();
digraph = new DigraphGroup();
history = new HistoryGroup();
key = new KeyGroup();
window = new WindowGroup();
editor = new EditorGroup();
visualMotion = new VisualMotionGroup();
yank = new YankGroup();
put = new PutGroup();
state = new VimState();
LOG.debug("VimPlugin ctr");
}
@NotNull @NotNull
@Override @Override
public String getComponentName() { public String getComponentName() {
return IDEAVIM_COMPONENT_NAME; return IDEAVIM_COMPONENT_NAME;
} }
@NotNull private final VimState state = new VimState();
@Override @Override
public void initComponent() { public void initComponent() {
LOG.debug("initComponent"); LOG.debug("initComponent");
@@ -178,6 +137,12 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
return getInstance().state; return getInstance().state;
} }
@NotNull
public static MotionGroup getMotion() {
return ServiceManager.getService(MotionGroup.class);
}
/** /**
* Reports statistics about installed IdeaVim and enabled Vim emulation. * Reports statistics about installed IdeaVim and enabled Vim emulation.
* <p> * <p>
@@ -226,94 +191,84 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
} }
} }
@NotNull
public static MotionGroup getMotion() {
return getInstance().motion;
}
@NotNull @NotNull
public static ChangeGroup getChange() { public static ChangeGroup getChange() {
return getInstance().change; return ServiceManager.getService(ChangeGroup.class);
} }
@NotNull @NotNull
public static CommandGroup getCommand() { public static CommandGroup getCommand() {
return getInstance().command; return ServiceManager.getService(CommandGroup.class);
} }
@NotNull @NotNull
public static MarkGroup getMark() { public static MarkGroup getMark() {
return getInstance().mark; return ServiceManager.getService(MarkGroup.class);
} }
@NotNull @NotNull
public static RegisterGroup getRegister() { public static RegisterGroup getRegister() {
return getInstance().register; return ServiceManager.getService(RegisterGroup.class);
} }
@NotNull @NotNull
public static FileGroup getFile() { public static FileGroup getFile() {
return getInstance().file; return ServiceManager.getService(FileGroup.class);
} }
@NotNull @NotNull
public static SearchGroup getSearch() { public static SearchGroup getSearch() {
return getInstance().search; return ServiceManager.getService(SearchGroup.class);
} }
@NotNull @NotNull
public static ProcessGroup getProcess() { public static ProcessGroup getProcess() {
return getInstance().process; return ServiceManager.getService(ProcessGroup.class);
} }
@NotNull @NotNull
public static MacroGroup getMacro() { public static MacroGroup getMacro() {
return getInstance().macro; return ServiceManager.getService(MacroGroup.class);
} }
@NotNull @NotNull
public static DigraphGroup getDigraph() { public static DigraphGroup getDigraph() {
return getInstance().digraph; return ServiceManager.getService(DigraphGroup.class);
} }
@NotNull @NotNull
public static HistoryGroup getHistory() { public static HistoryGroup getHistory() {
return getInstance().history; return ServiceManager.getService(HistoryGroup.class);
} }
@NotNull @NotNull
public static KeyGroup getKey() { public static KeyGroup getKey() {
return getInstance().key; return ServiceManager.getService(KeyGroup.class);
} }
@NotNull @NotNull
public static WindowGroup getWindow() { public static WindowGroup getWindow() {
return getInstance().window; return ServiceManager.getService(WindowGroup.class);
} }
@NotNull @NotNull
public static EditorGroup getEditor() { public static EditorGroup getEditor() {
return getInstance().editor; return ServiceManager.getService(EditorGroup.class);
} }
@NotNull @NotNull
public static VisualMotionGroup getVisualMotion() { public static VisualMotionGroup getVisualMotion() {
return getInstance().visualMotion; return ServiceManager.getService(VisualMotionGroup.class);
} }
@NotNull @NotNull
public static YankGroup getYank() { public static YankGroup getYank() {
return getInstance().yank; return ServiceManager.getService(YankGroup.class);
} }
@NotNull @NotNull
public static PutGroup getPut() { public static PutGroup getPut() {
return getInstance().put; return ServiceManager.getService(PutGroup.class);
}
@NotNull
private static NotificationService getNotifications() {
return getNotifications(null);
} }
@Override @Override
@@ -327,38 +282,53 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
state.setAttribute("enabled", Boolean.toString(enabled)); state.setAttribute("enabled", Boolean.toString(enabled));
element.addContent(state); element.addContent(state);
key.saveData(element); getKey().saveData(element);
editor.saveData(element); getEditor().saveData(element);
this.state.saveData(element); this.state.saveData(element);
return element; return element;
} }
@NotNull
private static NotificationService getNotifications() {
return getNotifications(null);
}
private void initializePlugin() { private void initializePlugin() {
if (initialized) return; if (initialized) return;
initialized = true; initialized = true;
Notifications.Bus.register(NotificationService.IDEAVIM_STICKY_NOTIFICATION_ID, NotificationDisplayType.STICKY_BALLOON);
ApplicationManager.getApplication().invokeLater(this::updateState); ApplicationManager.getApplication().invokeLater(this::updateState);
VimListenerManager.GlobalListeners.enable(); getEditor().turnOn();
getSearch().turnOn();
VimListenerManager.INSTANCE.turnOn();
// Register vim actions in command mode
RegisterActions.registerActions();
// Add some listeners so we can handle special events Runnable asyncSetup = () -> {
DocumentManager.getInstance().addDocumentListener(MarkGroup.MarkUpdater.INSTANCE); // Register vim actions in command mode
DocumentManager.getInstance().addDocumentListener(SearchGroup.DocumentSearchListener.INSTANCE); RegisterActions.registerActions();
// Register ex handlers // Register ex handlers
CommandParser.getInstance().registerHandlers(); CommandParser.getInstance().registerHandlers();
if (!ApplicationManager.getApplication().isUnitTestMode()) { // Register extensions
final File ideaVimRc = VimScriptParser.findIdeaVimRc(); VimExtensionRegistrar.registerExtensions();
if (ideaVimRc != null) {
VimScriptParser.executeFile(ideaVimRc); if (!ApplicationManager.getApplication().isUnitTestMode()) {
final File ideaVimRc = VimScriptParser.findIdeaVimRc();
if (ideaVimRc != null) {
VimScriptParser.executeFile(ideaVimRc);
}
} }
Initialization.initialized();
};
if (ApplicationManager.getApplication().isUnitTestMode()) {
asyncSetup.run();
} else {
ApplicationManager.getApplication().executeOnPooledThread(asyncSetup);
} }
} }
@@ -392,6 +362,8 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
if (enabled) { if (enabled) {
getInstance().turnOnPlugin(); getInstance().turnOnPlugin();
} }
VimStatusBar.INSTANCE.update();
} }
public static boolean isError() { public static boolean isError() {
@@ -441,18 +413,33 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
} }
} }
public static class Initialization {
private static final AtomicBoolean initialized = new AtomicBoolean(false);
public static boolean notInitialized() {
return !(initialized.get());
}
public static void initialized() {
initialized.set(true);
}
}
@NotNull @NotNull
private static VimPlugin getInstance() { private static VimPlugin getInstance() {
return (VimPlugin)ApplicationManager.getApplication().getComponent(IDEAVIM_COMPONENT_NAME); return (VimPlugin)ApplicationManager.getApplication().getComponent(IDEAVIM_COMPONENT_NAME);
} }
private void turnOnPlugin() { private void turnOnPlugin() {
initializePlugin(); if (initialized) {
KeyHandler.getInstance().fullReset(null); KeyHandler.getInstance().fullReset(null);
getEditor().turnOn(); getEditor().turnOn();
getSearch().turnOn(); getSearch().turnOn();
VimListenerManager.INSTANCE.turnOn(); VimListenerManager.INSTANCE.turnOn();
} else {
initializePlugin();
}
} }
private void turnOffPlugin() { private void turnOffPlugin() {
@@ -461,6 +448,7 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
getEditor().turnOff(); getEditor().turnOff();
getSearch().turnOff(); getSearch().turnOff();
VimListenerManager.INSTANCE.turnOff(); VimListenerManager.INSTANCE.turnOff();
ExEntryPanel.fullReset();
} }
private void updateState() { private void updateState() {
@@ -468,14 +456,14 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
if (SystemInfo.isMac) { if (SystemInfo.isMac) {
final MacKeyRepeat keyRepeat = MacKeyRepeat.getInstance(); final MacKeyRepeat keyRepeat = MacKeyRepeat.getInstance();
final Boolean enabled = keyRepeat.isEnabled(); final Boolean enabled = keyRepeat.isEnabled();
final Boolean isKeyRepeat = editor.isKeyRepeat(); final Boolean isKeyRepeat = getEditor().isKeyRepeat();
if ((enabled == null || !enabled) && (isKeyRepeat == null || isKeyRepeat)) { if ((enabled == null || !enabled) && (isKeyRepeat == null || isKeyRepeat)) {
if (VimPlugin.getNotifications().enableRepeatingMode() == Messages.YES) { if (VimPlugin.getNotifications().enableRepeatingMode() == Messages.YES) {
editor.setKeyRepeat(true); getEditor().setKeyRepeat(true);
keyRepeat.setEnabled(true); keyRepeat.setEnabled(true);
} }
else { else {
editor.setKeyRepeat(false); getEditor().setKeyRepeat(false);
} }
} }
} }
@@ -507,27 +495,35 @@ public class VimPlugin implements BaseComponent, PersistentStateComponent<Elemen
public void loadState(@NotNull final Element element) { public void loadState(@NotNull final Element element) {
LOG.debug("Loading state"); LOG.debug("Loading state");
// Restore whether the plugin is enabled or not Runnable setup = () -> {
Element state = element.getChild("state"); // Restore whether the plugin is enabled or not
if (state != null) { Element state = element.getChild("state");
try { if (state != null) {
previousStateVersion = Integer.parseInt(state.getAttributeValue("version")); try {
previousStateVersion = Integer.parseInt(state.getAttributeValue("version"));
}
catch (NumberFormatException ignored) {
}
enabled = Boolean.parseBoolean(state.getAttributeValue("enabled"));
previousKeyMap = state.getAttributeValue("keymap");
} }
catch (NumberFormatException ignored) {
}
enabled = Boolean.parseBoolean(state.getAttributeValue("enabled"));
previousKeyMap = state.getAttributeValue("keymap");
}
if (previousStateVersion > 0 && previousStateVersion < 5) { if (previousStateVersion > 0 && previousStateVersion < 5) {
// Migrate settings from 4 to 5 version // Migrate settings from 4 to 5 version
mark.readData(element); getMark().readData(element);
register.readData(element); getRegister().readData(element);
search.readData(element); getSearch().readData(element);
history.readData(element); getHistory().readData(element);
}
getKey().readData(element);
getEditor().readData(element);
this.state.readData(element);
};
if (ApplicationManager.getApplication().isUnitTestMode()) {
setup.run();
} else {
ApplicationManager.getApplication().executeOnPooledThread(setup);
} }
key.readData(element);
editor.readData(element);
this.state.readData(element);
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim package com.maddyhome.idea.vim
@@ -31,4 +31,4 @@ class VimProjectComponent(private val project: Project) : ProjectComponent {
// Project listeners are self-disposable, so there is no need to unregister them on project close // Project listeners are self-disposable, so there is no need to unregister them on project close
VimListenerManager.ProjectListeners.add(project) VimListenerManager.ProjectListeners.add(project)
} }
} }

View File

@@ -1,26 +1,22 @@
package com.maddyhome.idea.vim package com.maddyhome.idea.vim
import org.jdom.Element import org.jdom.Element
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
/** /**
* @author Alex Plate * @author Alex Plate
*/ */
class VimState { class VimState {
var isIdeaJoinNotified = false var isIdeaJoinNotified by StateProperty("idea-join")
var isIdeaPutNotified = false var isIdeaPutNotified by StateProperty("idea-put")
var isTemplateInSelectModeNotified = false
fun readData(element: Element) { fun readData(element: Element) {
val notifications: Element? = element.getChild("notifications") val notifications = element.getChild("notifications")
map.keys.forEach { name ->
notifications?.getChild("idea-join")?.getAttributeValue("enabled")?.let { notifications?.getChild(name)?.getAttributeValue("enabled")?.let {
isIdeaJoinNotified = it.toBoolean() map[name] = it.toBoolean()
} }
notifications?.getChild("idea-put")?.getAttributeValue("enabled")?.let {
isIdeaPutNotified = it.toBoolean()
}
notifications?.getChild("template-selectmode")?.getAttributeValue("enabled")?.let {
isIdeaPutNotified = it.toBoolean()
} }
} }
@@ -28,16 +24,25 @@ class VimState {
val notifications = Element("notifications") val notifications = Element("notifications")
element.addContent(notifications) element.addContent(notifications)
val ideaJoin = Element("idea-join") map.forEach { (name, value) ->
ideaJoin.setAttribute("enabled", isIdeaJoinNotified.toString()) val child = Element(name)
notifications.addContent(ideaJoin) child.setAttribute("enabled", value.toString())
notifications.addContent(child)
val ideaPut = Element("idea-put") }
ideaPut.setAttribute("enabled", isIdeaPutNotified.toString())
notifications.addContent(ideaPut)
val templateKeyModel = Element("template-selectmode")
templateKeyModel.setAttribute("enabled", isTemplateInSelectModeNotified.toString())
notifications.addContent(templateKeyModel)
} }
} }
val map by lazy { mutableMapOf<String, Boolean>() }
private class StateProperty(val xmlName: String) : ReadWriteProperty<VimState, Boolean> {
init {
map[xmlName] = false
}
override fun getValue(thisRef: VimState, property: KProperty<*>): Boolean = map.getOrPut(xmlName) { false }
override fun setValue(thisRef: VimState, property: KProperty<*>, value: Boolean) {
map[xmlName] = value
}
}

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim; package com.maddyhome.idea.vim;
@@ -73,7 +73,7 @@ public class VimTypedActionHandler implements TypedActionHandlerEx {
} }
} }
else { else {
try (final VimListenerSuppressor ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) { try (VimListenerSuppressor.Locked ignored = SelectionVimListenerSuppressor.INSTANCE.lock()) {
TypedActionHandler origHandler = handler.getOriginalHandler(); TypedActionHandler origHandler = handler.getOriginalHandler();
origHandler.execute(editor, charTyped, context); origHandler.execute(editor, charTyped, context);
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action; package com.maddyhome.idea.vim.action;
@@ -31,11 +31,11 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ExEntryAction extends VimCommandAction { public class ExEntryAction extends VimActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
return MappingMode.NVO; return MappingMode.NXO;
} }
@NotNull @NotNull
@@ -47,19 +47,13 @@ public class ExEntryAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public Command.Type getType() { public Command.Type getType() {
return Command.Type.OTHER_READ_WRITE; return Command.Type.OTHER_READONLY;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return new VimActionHandler.SingleExecution() { VimPlugin.getProcess().startExCommand(editor, context, cmd);
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startExCommand(editor, context, cmd);
return true; return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action; package com.maddyhome.idea.vim.action;
@@ -32,23 +32,12 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ResetModeAction extends VimCommandAction { public class ResetModeAction extends VimActionHandler.SingleExecution {
@NotNull
@Override
protected VimActionHandler makeActionHandler() {
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
KeyHandler.getInstance().fullReset(HelperKt.getTopLevelEditor(editor));
return true;
}
};
}
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
return MappingMode.NO; return MappingMode.ALL;
} }
@NotNull @NotNull
@@ -62,4 +51,10 @@ public class ResetModeAction extends VimCommandAction {
public Command.Type getType() { public Command.Type getType() {
return Command.Type.RESET; return Command.Type.RESET;
} }
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
KeyHandler.getInstance().fullReset(HelperKt.getTopLevelEditor(editor));
return true;
}
} }

View File

@@ -1,136 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action
import com.google.common.collect.ImmutableSet
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.actionSystem.EditorAction
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.MappingMode
import com.maddyhome.idea.vim.common.TextRange
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase
import com.maddyhome.idea.vim.handler.MotionActionHandler
import com.maddyhome.idea.vim.handler.TextObjectActionHandler
import com.maddyhome.idea.vim.handler.VimActionHandler
import com.maddyhome.idea.vim.helper.StringHelper
import com.maddyhome.idea.vim.helper.noneOfEnum
import java.util.*
import javax.swing.KeyStroke
/**
* Structure of commands
*
* VimCommandActionBase
* (Can't be used directly)
* |
* -------------------------------------------------------------------------------------
* | | |
* MotionEditorAction TextObjectAction VimCommandAction
* (accepts MotionActionHandler) (accepts TextObjectActionHandler) (accepts VimActionHandler)
*
* See also EditorActionHandlerBase.kt for handlers structure
*/
/**
* Action that represents a Vim command.
*
* Actions should be registered in resources/META-INF/plugin.xml and in package-info.java
* inside [com.maddyhome.idea.vim.action].
*
* @author vlan
*/
sealed class VimCommandActionBase : EditorAction(null) {
init {
@Suppress("LeakingThis")
setupHandler(makeActionHandler())
}
protected abstract fun makeActionHandler(): EditorActionHandlerBase
abstract val mappingModes: Set<MappingMode>
abstract val keyStrokesSet: Set<List<KeyStroke>>
abstract val type: Command.Type
open val argumentType: Argument.Type = Argument.Type.NONE
/**
* Returns various binary flags for the command.
*
* These legacy flags will be refactored in future releases.
*
* @see com.maddyhome.idea.vim.command.Command
*/
open val flags: EnumSet<CommandFlags> = noneOfEnum()
protected companion object {
@JvmStatic
fun parseKeysSet(vararg keyStrings: String): Set<List<KeyStroke>> {
val builder = ImmutableSet.builder<List<KeyStroke>>()
for (keyString in keyStrings) {
builder.add(StringHelper.parseKeys(keyString))
}
return builder.build()
}
}
}
abstract class VimCommandAction : VimCommandActionBase() {
abstract override fun makeActionHandler(): VimActionHandler
}
abstract class TextObjectAction : VimCommandActionBase() {
abstract override fun makeActionHandler(): TextObjectActionHandler
fun getRange(editor: Editor, caret: Caret, context: DataContext, count: Int, rawCount: Int, argument: Argument?): TextRange? {
val actionHandler = handler as? TextObjectActionHandler
?: throw RuntimeException("TextObjectAction works only with TextObjectActionHandler")
return actionHandler.getRange(editor, caret, context, count, rawCount, argument)
}
final override val type: Command.Type = Command.Type.MOTION
}
abstract class MotionEditorAction : VimCommandActionBase() {
abstract override fun makeActionHandler(): MotionActionHandler
fun getOffset(editor: Editor,
caret: Caret,
context: DataContext,
count: Int,
rawCount: Int,
argument: Argument?): Int {
val actionHandler = handler as? MotionActionHandler
?: throw RuntimeException("MotionAction works only with MotionHandler")
return when (actionHandler) {
is MotionActionHandler.SingleExecution -> actionHandler.getOffset(editor, context, count, rawCount, argument)
is MotionActionHandler.ForEachCaret -> actionHandler.getOffset(editor, caret, context, count, rawCount, argument)
}
}
final override val type: Command.Type = Command.Type.MOTION
}

View File

@@ -1,53 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.ToggleAction;
import com.intellij.openapi.project.DumbAware;
import com.maddyhome.idea.vim.VimPlugin;
import org.jetbrains.annotations.NotNull;
/**
* This class is used to handle the Vim Plugin enabled/disabled toggle. This is most likely used as a menu option
* but could also be used as a toolbar item.
*/
public class VimPluginToggleAction extends ToggleAction implements DumbAware {
/**
* Indicates if the toggle is on or off
*
* @param event The event that triggered the action
* @return true if the toggle is on, false if off
*/
@Override
public boolean isSelected(@NotNull AnActionEvent event) {
return VimPlugin.isEnabled();
}
/**
* Specifies whether the toggle should be on or off
*
* @param event The event that triggered the action
* @param b The new state - true is on, false is off
*/
@Override
public void setSelected(@NotNull AnActionEvent event, boolean b) {
VimPlugin.setEnabled(b);
}
}

View File

@@ -0,0 +1,44 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareToggleAction
import com.maddyhome.idea.vim.VimActions
import com.maddyhome.idea.vim.VimPlugin
/**
* This class is used to handle the Vim Plugin enabled/disabled toggle. This is most likely used as a menu option
* but could also be used as a toolbar item.
*/
class VimPluginToggleAction : DumbAwareToggleAction() {
override fun isSelected(event: AnActionEvent): Boolean = VimPlugin.isEnabled()
override fun setSelected(event: AnActionEvent, b: Boolean) {
VimPlugin.setEnabled(b)
}
override fun update(e: AnActionEvent) {
super.update(e)
e.presentation.text = if (VimActions.actionPlace == e.place) {
if (VimPlugin.isEnabled()) "Enabled" else "Enable"
} else "Vim Emulator"
}
}

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action; package com.maddyhome.idea.vim.action;
@@ -25,30 +25,30 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.editor.ex.util.EditorUtil;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Key;
import com.maddyhome.idea.vim.KeyHandler; import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.RegisterActions;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction; import com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.helper.CommandStateHelper; import com.maddyhome.idea.vim.helper.CommandStateHelper;
import com.maddyhome.idea.vim.helper.EditorDataContext; import com.maddyhome.idea.vim.helper.EditorDataContext;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import com.maddyhome.idea.vim.key.ShortcutOwner; import com.maddyhome.idea.vim.key.ShortcutOwner;
import com.maddyhome.idea.vim.listener.IdeaSpecifics;
import com.maddyhome.idea.vim.option.ListOption; import com.maddyhome.idea.vim.option.ListOption;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import javax.swing.*; import javax.swing.*;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.awt.event.KeyEvent.*; import static java.awt.event.KeyEvent.*;
@@ -101,6 +101,10 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
try { try {
KeyHandler.getInstance().handleKey(editor, keyStroke, new EditorDataContext(editor)); KeyHandler.getInstance().handleKey(editor, keyStroke, new EditorDataContext(editor));
} }
catch (ProcessCanceledException ignored) {
// Control-flow exceptions (like ProcessCanceledException) should never be logged
// See {@link com.intellij.openapi.diagnostic.Logger.checkException}
}
catch (Throwable throwable) { catch (Throwable throwable) {
ourLogger.error(throwable); ourLogger.error(throwable);
} }
@@ -130,6 +134,7 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
// Workaround for smart step into // Workaround for smart step into
final Key<?> SMART_STEP_INPLACE_DATA = Key.findKeyByName("SMART_STEP_INPLACE_DATA"); final Key<?> SMART_STEP_INPLACE_DATA = Key.findKeyByName("SMART_STEP_INPLACE_DATA");
if (SMART_STEP_INPLACE_DATA != null && editor.getUserData(SMART_STEP_INPLACE_DATA) != null) return false; if (SMART_STEP_INPLACE_DATA != null && editor.getUserData(SMART_STEP_INPLACE_DATA) != null) return false;
if (IdeaSpecifics.INSTANCE.aceJumpActive()) return false;
final int keyCode = keyStroke.getKeyCode(); final int keyCode = keyStroke.getKeyCode();
if (LookupManager.getActiveLookup(editor) != null && !passCommandToVimWithLookup(keyStroke)) { if (LookupManager.getActiveLookup(editor) != null && !passCommandToVimWithLookup(keyStroke)) {
@@ -176,9 +181,9 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
if (values == null) return false; if (values == null) return false;
return values.stream().anyMatch(actionId -> { return values.stream().anyMatch(actionId -> {
final AnAction action = ActionManager.getInstance().getAction(actionId); final EditorActionHandlerBase action = RegisterActions.findAction(actionId);
if (!(action instanceof VimCommandAction)) return false; if (action == null) return false;
return ((VimCommandAction)action).getKeyStrokesSet().stream() return action.getKeyStrokesSet().stream()
.anyMatch(ks -> !ks.isEmpty() && ks.get(0).equals(keyStroke)); .anyMatch(ks -> !ks.isEmpty() && ks.get(0).equals(keyStroke));
}); });
} }
@@ -195,7 +200,8 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
final Project project = editor.getProject(); final Project project = editor.getProject();
if (project == null) return false; if (project == null) return false;
final FileEditorManagerEx fileEditorManager = FileEditorManagerEx.getInstanceEx(project); final FileEditorManagerEx fileEditorManager = FileEditorManagerEx.getInstanceEx(project);
return StreamEx.of(fileEditorManager.getAllEditors()) if (fileEditorManager == null) return false;
return Arrays.stream(fileEditorManager.getAllEditors())
.anyMatch(fileEditor -> editor.equals(EditorUtil.getEditorEx(fileEditor))); .anyMatch(fileEditor -> editor.equals(EditorUtil.getEditorEx(fileEditor)));
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change; package com.maddyhome.idea.vim.action.change;
@@ -22,7 +22,6 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.KeyHandler; import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.*; import com.maddyhome.idea.vim.command.*;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.MotionGroup; import com.maddyhome.idea.vim.group.MotionGroup;
@@ -33,46 +32,13 @@ import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*; import javax.swing.*;
import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class OperatorAction extends VimCommandAction { final public class OperatorAction extends VimActionHandler.SingleExecution {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
final OperatorFunction operatorFunction = VimPlugin.getKey().getOperatorFunction();
if (operatorFunction != null) {
final Argument argument = cmd.getArgument();
if (argument != null) {
final Command motion = argument.getMotion();
if (motion != null) {
final TextRange range = MotionGroup
.getMotionRange(editor, editor.getCaretModel().getPrimaryCaret(), context, cmd.getCount(),
cmd.getRawCount(), argument, true);
if (range != null) {
VimPlugin.getMark().setChangeMarks(editor, range);
final SelectionType selectionType = SelectionType.fromCommandFlags(motion.getFlags());
KeyHandler.getInstance().reset(editor);
return operatorFunction.apply(editor, context, selectionType);
}
}
}
return false;
}
VimPlugin.showMessage(MessageHelper.message("E774"));
return false;
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
@@ -100,9 +66,26 @@ final public class OperatorAction extends VimCommandAction {
return Argument.Type.MOTION; return Argument.Type.MOTION;
} }
@NotNull
@Override @Override
final public EnumSet<CommandFlags> getFlags() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return EnumSet.of(CommandFlags.FLAG_OP_PEND); final OperatorFunction operatorFunction = VimPlugin.getKey().getOperatorFunction();
if (operatorFunction != null) {
final Argument argument = cmd.getArgument();
if (argument != null) {
final Command motion = argument.getMotion();
final TextRange range = MotionGroup
.getMotionRange(editor, editor.getCaretModel().getPrimaryCaret(), context, cmd.getCount(),
cmd.getRawCount(), argument);
if (range != null) {
VimPlugin.getMark().setChangeMarks(editor, range);
final SelectionType selectionType = SelectionType.fromCommandFlags(motion.getFlags());
KeyHandler.getInstance().reset(editor);
return operatorFunction.apply(editor, context, selectionType);
}
}
return false;
}
VimPlugin.showMessage(MessageHelper.message("E774"));
return false;
} }
} }

View File

@@ -13,14 +13,13 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change; package com.maddyhome.idea.vim.action.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.VimActionHandler; import com.maddyhome.idea.vim.handler.VimActionHandler;
@@ -32,7 +31,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class RedoAction extends VimCommandAction { public class RedoAction extends VimActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -51,14 +50,8 @@ public class RedoAction extends VimCommandAction {
return Command.Type.OTHER_SELF_SYNCHRONIZED; return Command.Type.OTHER_SELF_SYNCHRONIZED;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return new VimActionHandler.SingleExecution() { return UndoRedoHelper.INSTANCE.redo(context);
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return UndoRedoHelper.INSTANCE.redo(context);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change; package com.maddyhome.idea.vim.action.change;
@@ -22,7 +22,6 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.KeyHandler; import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
@@ -35,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class RepeatChangeAction extends VimCommandAction { public class RepeatChangeAction extends VimActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -54,54 +53,46 @@ public class RepeatChangeAction extends VimCommandAction {
return Command.Type.OTHER_WRITABLE; return Command.Type.OTHER_WRITABLE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command command) {
return new VimActionHandler.SingleExecution() { CommandState state = CommandState.getInstance(editor);
@Override Command cmd = state.getLastChangeCommand();
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command command) {
CommandState state = CommandState.getInstance(editor);
Command cmd = state.getLastChangeCommand();
if (cmd != null) { if (cmd != null) {
if (command.getRawCount() > 0) { if (command.getRawCount() > 0) {
cmd.setCount(command.getCount()); cmd.setCount(command.getCount());
Argument arg = cmd.getArgument(); Argument arg = cmd.getArgument();
if (arg != null) { if (arg != null) {
Command mot = arg.getMotion(); Command mot = arg.getMotion();
if (mot != null) { mot.setCount(0);
mot.setCount(0);
}
}
}
Command save = state.getCommand();
int lastFTCmd = VimPlugin.getMotion().getLastFTCmd();
char lastFTChar = VimPlugin.getMotion().getLastFTChar();
state.setCommand(cmd);
state.pushState(CommandState.Mode.REPEAT, CommandState.SubMode.NONE, MappingMode.NORMAL);
char reg = VimPlugin.getRegister().getCurrentRegister();
VimPlugin.getRegister().selectRegister(state.getLastChangeRegister());
try {
KeyHandler.executeAction(cmd.getAction(), context);
}
catch (Exception e) {
// oops
}
state.popState();
if (save != null) {
state.setCommand(save);
}
VimPlugin.getMotion().setLastFTCmd(lastFTCmd, lastFTChar);
state.saveLastChangeCommand(cmd);
VimPlugin.getRegister().selectRegister(reg);
return true;
}
else {
return false;
} }
} }
}; Command save = state.getCommand();
int lastFTCmd = VimPlugin.getMotion().getLastFTCmd();
char lastFTChar = VimPlugin.getMotion().getLastFTChar();
state.setCommand(cmd);
state.pushState(CommandState.Mode.REPEAT, CommandState.SubMode.NONE, MappingMode.NORMAL);
char reg = VimPlugin.getRegister().getCurrentRegister();
VimPlugin.getRegister().selectRegister(state.getLastChangeRegister());
try {
KeyHandler.executeVimAction(editor, cmd.getAction(), context);
}
catch (Exception e) {
// oops
}
state.popState();
if (save != null) {
state.setCommand(save);
}
VimPlugin.getMotion().setLastFTCmd(lastFTCmd, lastFTChar);
state.saveLastChangeCommand(cmd);
VimPlugin.getRegister().selectRegister(reg);
return true;
}
else {
return false;
}
} }
} }

View File

@@ -1,71 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.ex.CommandParser;
import com.maddyhome.idea.vim.ex.ExException;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
public class RepeatExCommandAction extends VimCommandAction {
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("@:");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_WRITABLE;
}
@NotNull
@Override
protected VimActionHandler makeActionHandler() {
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command command) {
int count = command.getCount();
try {
return CommandParser.getInstance().processLastCommand(editor, context, count);
}
catch (ExException e) {
return false;
}
}
};
}
}

View File

@@ -13,14 +13,13 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change; package com.maddyhome.idea.vim.action.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.VimActionHandler; import com.maddyhome.idea.vim.handler.VimActionHandler;
@@ -28,11 +27,16 @@ import com.maddyhome.idea.vim.helper.UndoRedoHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*; import javax.swing.*;
import java.awt.event.KeyEvent;
import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.maddyhome.idea.vim.helper.StringHelper.parseKeys;
public class UndoAction extends VimCommandAction {
public class UndoAction extends VimActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -42,7 +46,10 @@ public class UndoAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public Set<List<KeyStroke>> getKeyStrokesSet() { public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("u", "<Undo>"); Set<List<KeyStroke>> keys = new HashSet<>();
keys.add(parseKeys("u"));
keys.add(Collections.singletonList(KeyStroke.getKeyStroke(KeyEvent.VK_UNDO, 0)));
return keys;
} }
@NotNull @NotNull
@@ -51,14 +58,8 @@ public class UndoAction extends VimCommandAction {
return Command.Type.OTHER_SELF_SYNCHRONIZED; return Command.Type.OTHER_SELF_SYNCHRONIZED;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return new VimActionHandler.SingleExecution() { return UndoRedoHelper.INSTANCE.undo(context);
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return UndoRedoHelper.INSTANCE.undo(context);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -40,29 +38,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class AutoIndentLinesVisualAction extends VimCommandAction { final public class AutoIndentLinesVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
VimPlugin.getChange().autoIndentRange(editor, caret, context, range.toVimTextRange(true));
return true;
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -83,4 +64,14 @@ final public class AutoIndentLinesVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
VimPlugin.getChange().autoIndentRange(editor, caret, context, range.toVimTextRange(true));
return true;
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -39,7 +37,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeCaseLowerMotionAction extends VimCommandAction { public class ChangeCaseLowerMotionAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -58,33 +56,21 @@ public class ChangeCaseLowerMotionAction extends VimCommandAction {
return Command.Type.CHANGE; return Command.Type.CHANGE;
} }
@NotNull
@Override
public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_OP_PEND);
}
@NotNull @NotNull
@Override @Override
public Argument.Type getArgumentType() { public Argument.Type getArgumentType() {
return Argument.Type.MOTION; return Argument.Type.MOTION;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return argument != null &&
int rawCount, VimPlugin.getChange()
@Nullable Argument argument) { .changeCaseMotion(editor, caret, context, count, rawCount, CharacterHelper.CASE_LOWER, argument);
return argument != null &&
VimPlugin.getChange()
.changeCaseMotion(editor, caret, context, count, rawCount, CharacterHelper.CASE_LOWER, argument);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import com.maddyhome.idea.vim.helper.HelperKt; import com.maddyhome.idea.vim.helper.HelperKt;
@@ -42,30 +40,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeCaseLowerVisualAction extends VimCommandAction { final public class ChangeCaseLowerVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final Editor topLevelEditor = HelperKt.getTopLevelEditor(editor);
return VimPlugin.getChange()
.changeCaseRange(topLevelEditor, caret, range.toVimTextRange(false), CharacterHelper.CASE_LOWER);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -86,4 +66,15 @@ final public class ChangeCaseLowerVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final Editor topLevelEditor = HelperKt.getTopLevelEditor(editor);
return VimPlugin.getChange()
.changeCaseRange(topLevelEditor, caret, range.toVimTextRange(false), CharacterHelper.CASE_LOWER);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeCaseToggleCharacterAction extends VimCommandAction { public class ChangeCaseToggleCharacterAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class ChangeCaseToggleCharacterAction extends VimCommandAction {
return Command.Type.CHANGE; return Command.Type.CHANGE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().changeCaseToggleCharacter(editor, caret, count);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().changeCaseToggleCharacter(editor, caret, count);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -39,7 +37,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeCaseToggleMotionAction extends VimCommandAction { public class ChangeCaseToggleMotionAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -64,27 +62,15 @@ public class ChangeCaseToggleMotionAction extends VimCommandAction {
return Argument.Type.MOTION; return Argument.Type.MOTION;
} }
@NotNull
@Override @Override
public EnumSet<CommandFlags> getFlags() { public boolean execute(@NotNull Editor editor,
return EnumSet.of(CommandFlags.FLAG_OP_PEND); @NotNull Caret caret,
} @NotNull DataContext context,
int count,
@NotNull int rawCount,
@Override @Nullable Argument argument) {
protected VimActionHandler makeActionHandler() { return argument != null &&
return new ChangeEditorActionHandler.ForEachCaret() { VimPlugin.getChange()
@Override .changeCaseMotion(editor, caret, context, count, rawCount, CharacterHelper.CASE_TOGGLE, argument);
public boolean execute(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
int count,
int rawCount,
@Nullable Argument argument) {
return argument != null &&
VimPlugin.getChange()
.changeCaseMotion(editor, caret, context, count, rawCount, CharacterHelper.CASE_TOGGLE, argument);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -41,29 +39,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeCaseToggleVisualAction extends VimCommandAction { final public class ChangeCaseToggleVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeCaseRange(editor, caret, range.toVimTextRange(false), CharacterHelper.CASE_TOGGLE);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -84,4 +65,14 @@ final public class ChangeCaseToggleVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeCaseRange(editor, caret, range.toVimTextRange(false), CharacterHelper.CASE_TOGGLE);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -39,7 +37,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeCaseUpperMotionAction extends VimCommandAction { public class ChangeCaseUpperMotionAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -64,27 +62,15 @@ public class ChangeCaseUpperMotionAction extends VimCommandAction {
return Argument.Type.MOTION; return Argument.Type.MOTION;
} }
@NotNull
@Override @Override
public EnumSet<CommandFlags> getFlags() { public boolean execute(@NotNull Editor editor,
return EnumSet.of(CommandFlags.FLAG_OP_PEND); @NotNull Caret caret,
} @NotNull DataContext context,
int count,
@NotNull int rawCount,
@Override @Nullable Argument argument) {
protected VimActionHandler makeActionHandler() { return argument != null &&
return new ChangeEditorActionHandler.ForEachCaret() { VimPlugin.getChange()
@Override .changeCaseMotion(editor, caret, context, count, rawCount, CharacterHelper.CASE_UPPER, argument);
public boolean execute(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
int count,
int rawCount,
@Nullable Argument argument) {
return argument != null &&
VimPlugin.getChange()
.changeCaseMotion(editor, caret, context, count, rawCount, CharacterHelper.CASE_UPPER, argument);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -41,29 +39,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeCaseUpperVisualAction extends VimCommandAction { final public class ChangeCaseUpperVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeCaseRange(editor, caret, range.toVimTextRange(false), CharacterHelper.CASE_UPPER);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -84,4 +65,14 @@ final public class ChangeCaseUpperVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeCaseRange(editor, caret, range.toVimTextRange(false), CharacterHelper.CASE_UPPER);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeCharacterAction extends VimCommandAction { public class ChangeCharacterAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -69,19 +67,13 @@ public class ChangeCharacterAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_ALLOW_DIGRAPH); return EnumSet.of(CommandFlags.FLAG_ALLOW_DIGRAPH);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return argument != null && VimPlugin.getChange().changeCharacter(editor, caret, count, argument.getCharacter());
int rawCount,
@Nullable Argument argument) {
return argument != null && VimPlugin.getChange().changeCharacter(editor, caret, count, argument.getCharacter());
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeCharactersAction extends VimCommandAction { public class ChangeCharactersAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -63,19 +61,13 @@ public class ChangeCharactersAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_NO_REPEAT, CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_NO_REPEAT, CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().changeCharacters(editor, caret, count);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().changeCharacters(editor, caret, count);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeEndOfLineAction extends VimCommandAction { public class ChangeEndOfLineAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -63,19 +61,13 @@ public class ChangeEndOfLineAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_NO_REPEAT, CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_NO_REPEAT, CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().changeEndOfLine(editor, caret, count);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().changeEndOfLine(editor, caret, count);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.ex.LineRange; import com.maddyhome.idea.vim.ex.LineRange;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeLastGlobalSearchReplaceAction extends VimCommandAction { public class ChangeLastGlobalSearchReplaceAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -53,23 +51,17 @@ public class ChangeLastGlobalSearchReplaceAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public Command.Type getType() { public Command.Type getType() {
return Command.Type.OTHER_WRITABLE; return Command.Type.OTHER_SELF_SYNCHRONIZED;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, final LineRange range = new LineRange(0, EditorHelper.getLineCount(editor) - 1);
int rawCount, return VimPlugin.getSearch()
@Nullable Argument argument) { .searchAndReplace(editor, editor.getCaretModel().getPrimaryCaret(), range, "s", "//~/&");
final LineRange range = new LineRange(0, EditorHelper.getLineCount(editor) - 1);
return VimPlugin.getSearch()
.searchAndReplace(editor, editor.getCaretModel().getPrimaryCaret(), range, "s", "//~/&");
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.ex.LineRange; import com.maddyhome.idea.vim.ex.LineRange;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeLastSearchReplaceAction extends VimCommandAction { public class ChangeLastSearchReplaceAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -53,29 +51,23 @@ public class ChangeLastSearchReplaceAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public Command.Type getType() { public Command.Type getType() {
return Command.Type.OTHER_WRITABLE; return Command.Type.OTHER_SELF_SYNCHRONIZED;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, boolean result = true;
int rawCount, for (Caret caret : editor.getCaretModel().getAllCarets()) {
@Nullable Argument argument) { final int line = caret.getLogicalPosition().line;
boolean result = true; if (!VimPlugin.getSearch().searchAndReplace(editor, caret, new LineRange(line, line), "s", "//~/")) {
for (Caret caret : editor.getCaretModel().getAllCarets()) { result = false;
final int line = caret.getLogicalPosition().line;
if (!VimPlugin.getSearch().searchAndReplace(editor, caret, new LineRange(line, line), "s", "//~/")) {
result = false;
}
}
return result;
} }
};
}
return result;
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeLineAction extends VimCommandAction { public class ChangeLineAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -48,7 +46,7 @@ public class ChangeLineAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public Set<List<KeyStroke>> getKeyStrokesSet() { public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("cc", "S"); return parseKeysSet("S");
} }
@NotNull @NotNull
@@ -60,22 +58,16 @@ public class ChangeLineAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public EnumSet<CommandFlags> getFlags() { public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_NO_REPEAT, CommandFlags.FLAG_ALLOW_MID_COUNT, CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_NO_REPEAT, CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().changeLine(editor, caret, count, context);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().changeLine(editor, caret, count, context);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeMotionAction extends VimCommandAction { public class ChangeMotionAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -57,12 +55,6 @@ public class ChangeMotionAction extends VimCommandAction {
return Command.Type.CHANGE; return Command.Type.CHANGE;
} }
@NotNull
@Override
public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_OP_PEND, CommandFlags.FLAG_MULTIKEY_UNDO);
}
@NotNull @NotNull
@Override @Override
public Argument.Type getArgumentType() { public Argument.Type getArgumentType() {
@@ -71,18 +63,17 @@ public class ChangeMotionAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public EnumSet<CommandFlags> getFlags() {
return new ChangeEditorActionHandler.ForEachCaret() { return EnumSet.of(CommandFlags.FLAG_DUPLICABLE_OPERATOR);
@Override }
public boolean execute(@NotNull Editor editor,
@NotNull Caret caret, @Override
@NotNull DataContext context, public boolean execute(@NotNull Editor editor,
int count, @NotNull Caret caret,
int rawCount, @NotNull DataContext context,
@Nullable Argument argument) { int count,
return argument != null && int rawCount,
VimPlugin.getChange().changeMotion(editor, caret, context, count, rawCount, argument); @Nullable Argument argument) {
} return argument != null && VimPlugin.getChange().changeMotion(editor, caret, context, count, rawCount, argument);
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeReplaceAction extends VimCommandAction { public class ChangeReplaceAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,19 +60,13 @@ public class ChangeReplaceAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, VimPlugin.getChange().changeReplace(editor, context);
int rawCount, return true;
@Nullable Argument argument) {
VimPlugin.getChange().changeReplace(editor, context);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -40,29 +38,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeVisualAction extends VimCommandAction { final public class ChangeVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange().changeRange(editor, caret, range.toVimTextRange(false), range.getType(), context);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -83,4 +64,14 @@ final public class ChangeVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange().changeRange(editor, caret, range.toVimTextRange(false), range.getType(), context);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -41,30 +39,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeVisualCharacterAction extends VimCommandAction { final public class ChangeVisualCharacterAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final Argument argument = cmd.getArgument();
return argument != null &&
VimPlugin.getChange().changeCharacterRange(editor, range.toVimTextRange(false), argument.getCharacter());
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -92,4 +72,15 @@ final public class ChangeVisualCharacterAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_ALLOW_DIGRAPH, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_ALLOW_DIGRAPH, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final Argument argument = cmd.getArgument();
return argument != null &&
VimPlugin.getChange().changeCharacterRange(editor, range.toVimTextRange(false), argument.getCharacter());
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,14 +22,12 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -43,32 +41,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeVisualLinesAction extends VimCommandAction { final public class ChangeVisualLinesAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final TextRange textRange = range.toVimTextRange(true);
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, textRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, textRange.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, caret, lineRange, SelectionType.LINE_WISE, context);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -89,4 +67,17 @@ final public class ChangeVisualLinesAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final TextRange textRange = range.toVimTextRange(true);
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, textRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, textRange.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, caret, lineRange, SelectionType.LINE_WISE, context);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,14 +22,12 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -43,44 +41,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ChangeVisualLinesEndAction extends VimCommandAction { final public class ChangeVisualLinesEndAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
TextRange vimTextRange = range.toVimTextRange(true);
if (range.getType() == SelectionType.BLOCK_WISE && vimTextRange.isMultiple()) {
final int[] starts = vimTextRange.getStartOffsets();
final int[] ends = vimTextRange.getEndOffsets();
for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
}
}
final TextRange blockRange = new TextRange(starts, ends);
return VimPlugin.getChange().changeRange(editor, caret, blockRange, SelectionType.BLOCK_WISE, context);
}
else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, vimTextRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, vimTextRange.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, caret, lineRange, SelectionType.LINE_WISE, context);
}
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -101,4 +67,30 @@ final public class ChangeVisualLinesEndAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
TextRange vimTextRange = range.toVimTextRange(true);
if (range.getType() == SelectionType.BLOCK_WISE && vimTextRange.isMultiple()) {
final int[] starts = vimTextRange.getStartOffsets();
final int[] ends = vimTextRange.getEndOffsets();
for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
}
}
final TextRange blockRange = new TextRange(starts, ends);
return VimPlugin.getChange().changeRange(editor, caret, blockRange, SelectionType.BLOCK_WISE, context);
}
else {
final TextRange lineRange =
new TextRange(EditorHelper.getLineStartForOffset(editor, vimTextRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, vimTextRange.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, caret, lineRange, SelectionType.LINE_WISE, context);
}
}
} }

View File

@@ -1,66 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
public class FilterCountLinesAction extends VimCommandAction {
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("!!");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@NotNull
@Override
protected VimActionHandler makeActionHandler() {
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startFilterCommand(editor, context, cmd);
return true;
}
};
}
}

View File

@@ -1,111 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.LogicalPosition;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.MotionGroup;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
public class FilterMotionAction extends VimCommandAction {
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("!");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@NotNull
@Override
public Argument.Type getArgumentType() {
return Argument.Type.MOTION;
}
@NotNull
@Override
public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_OP_PEND);
}
@NotNull
@Override
protected VimActionHandler makeActionHandler() {
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
final Argument argument = cmd.getArgument();
if (argument == null) {
return false;
}
TextRange range = MotionGroup
.getMotionRange(editor, editor.getCaretModel().getPrimaryCaret(), context, cmd.getCount(), cmd.getRawCount(),
argument, false);
if (range == null) {
return false;
}
LogicalPosition current = editor.getCaretModel().getLogicalPosition();
LogicalPosition start = editor.offsetToLogicalPosition(range.getStartOffset());
LogicalPosition end = editor.offsetToLogicalPosition(range.getEndOffset());
if (current.line != start.line) {
MotionGroup.moveCaret(editor, editor.getCaretModel().getPrimaryCaret(), range.getStartOffset());
}
int count;
if (start.line < end.line) {
count = end.line - start.line + 1;
}
else {
count = 1;
}
Command command = new Command(count, null, null, Command.Type.UNDEFINED, EnumSet.noneOf(CommandFlags.class));
VimPlugin.getProcess().startFilterCommand(editor, context, command);
return true;
}
};
}
}

View File

@@ -0,0 +1,68 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.change
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.MappingMode
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.handler.VimActionHandler
import com.maddyhome.idea.vim.helper.endOffsetInclusive
import com.maddyhome.idea.vim.helper.enumSetOf
import java.util.*
import javax.swing.KeyStroke
class FilterMotionAction : VimActionHandler.SingleExecution() {
override val mappingModes: Set<MappingMode> = MappingMode.N
override val keyStrokesSet: Set<List<KeyStroke>> = parseKeysSet("!")
override val type: Command.Type = Command.Type.CHANGE
override val argumentType: Argument.Type = Argument.Type.MOTION
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_DUPLICABLE_OPERATOR)
override fun execute(editor: Editor, context: DataContext, cmd: Command): Boolean {
val argument = cmd.argument ?: return false
val range = MotionGroup
.getMotionRange(editor, editor.caretModel.primaryCaret, context, cmd.count, cmd.rawCount,
argument)
?: return false
val current = editor.caretModel.logicalPosition
val start = editor.offsetToLogicalPosition(range.startOffset)
val end = editor.offsetToLogicalPosition(range.endOffsetInclusive)
if (current.line != start.line) {
MotionGroup.moveCaret(editor, editor.caretModel.primaryCaret, range.startOffset)
}
val count = if (start.line < end.line) end.line - start.line + 1 else 1
VimPlugin.getProcess().startFilterCommand(editor, context, Argument.EMPTY_COMMAND.copy(rawCount = count))
return true
}
}

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -21,11 +21,11 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.VimActionHandler; import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.helper.ModeHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -37,26 +37,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class FilterVisualLinesAction extends VimCommandAction { final public class FilterVisualLinesAction extends VimActionHandler.SingleExecution {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startFilterCommand(editor, context, cmd);
VimPlugin.getVisualMotion().resetVisual(editor);
return true;
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -77,4 +63,11 @@ final public class FilterVisualLinesAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE);
} }
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startFilterCommand(editor, context, cmd);
ModeHelper.exitVisualMode(editor);
return true;
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change; package com.maddyhome.idea.vim.action.change.change;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -40,29 +38,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class ReformatCodeVisualAction extends VimCommandAction { final public class ReformatCodeVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
VimPlugin.getChange().reformatCode(editor, range);
return true;
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -83,4 +64,14 @@ final public class ReformatCodeVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
VimPlugin.getChange().reformatCode(editor, range);
return true;
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change.number; package com.maddyhome.idea.vim.action.change.change.number;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeNumberDecAction extends VimCommandAction { public class ChangeNumberDecAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class ChangeNumberDecAction extends VimCommandAction {
return Command.Type.CHANGE; return Command.Type.CHANGE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().changeNumber(editor, caret, -count);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().changeNumber(editor, caret, -count);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change.number; package com.maddyhome.idea.vim.action.change.change.number;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class ChangeNumberIncAction extends VimCommandAction { public class ChangeNumberIncAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class ChangeNumberIncAction extends VimCommandAction {
return Command.Type.CHANGE; return Command.Type.CHANGE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().changeNumber(editor, caret, count);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().changeNumber(editor, caret, count);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change.number; package com.maddyhome.idea.vim.action.change.change.number;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -37,29 +35,12 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
final public class ChangeVisualNumberAvalancheDecAction extends VimCommandAction { final public class ChangeVisualNumberAvalancheDecAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), -cmd.getCount(), true);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -80,4 +61,14 @@ final public class ChangeVisualNumberAvalancheDecAction extends VimCommandAction
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), -cmd.getCount(), true);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change.number; package com.maddyhome.idea.vim.action.change.change.number;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -37,29 +35,12 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
final public class ChangeVisualNumberAvalancheIncAction extends VimCommandAction { final public class ChangeVisualNumberAvalancheIncAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), cmd.getCount(), true);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -80,4 +61,14 @@ final public class ChangeVisualNumberAvalancheIncAction extends VimCommandAction
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), cmd.getCount(), true);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change.number; package com.maddyhome.idea.vim.action.change.change.number;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -37,29 +35,12 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
final public class ChangeVisualNumberDecAction extends VimCommandAction { final public class ChangeVisualNumberDecAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), -cmd.getCount(), false);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -80,4 +61,14 @@ final public class ChangeVisualNumberDecAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), -cmd.getCount(), false);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.change.number; package com.maddyhome.idea.vim.action.change.change.number;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -37,29 +35,12 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
final public class ChangeVisualNumberIncAction extends VimCommandAction { final public class ChangeVisualNumberIncAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), cmd.getCount(), false);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -80,4 +61,14 @@ final public class ChangeVisualNumberIncAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
return VimPlugin.getChange()
.changeNumberVisualMode(editor, caret, range.toVimTextRange(false), cmd.getCount(), false);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteCharacterAction extends VimCommandAction { public class DeleteCharacterAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class DeleteCharacterAction extends VimCommandAction {
return Command.Type.DELETE; return Command.Type.DELETE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().deleteCharacter(editor, caret, 1, false);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().deleteCharacter(editor, caret, 1, false);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteCharacterLeftAction extends VimCommandAction { public class DeleteCharacterLeftAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class DeleteCharacterLeftAction extends VimCommandAction {
return Command.Type.DELETE; return Command.Type.DELETE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().deleteCharacter(editor, caret, -count, false);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().deleteCharacter(editor, caret, -count, false);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteCharacterRightAction extends VimCommandAction { public class DeleteCharacterRightAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class DeleteCharacterRightAction extends VimCommandAction {
return Command.Type.DELETE; return Command.Type.DELETE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().deleteCharacter(editor, caret, count, false);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().deleteCharacter(editor, caret, count, false);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteEndOfLineAction extends VimCommandAction { public class DeleteEndOfLineAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,19 +53,13 @@ public class DeleteEndOfLineAction extends VimCommandAction {
return Command.Type.DELETE; return Command.Type.DELETE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().deleteEndOfLine(editor, caret, count);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().deleteEndOfLine(editor, caret, count);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteJoinLinesAction extends VimCommandAction { public class DeleteJoinLinesAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -56,29 +54,23 @@ public class DeleteJoinLinesAction extends VimCommandAction {
return Command.Type.DELETE; return Command.Type.DELETE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (editor.isOneLineMode()) return false;
int rawCount,
@Nullable Argument argument) {
if (editor.isOneLineMode()) return false;
if (OptionsManager.INSTANCE.getIdeajoin().isSet()) { if (OptionsManager.INSTANCE.getIdeajoin().isSet()) {
return VimPlugin.getChange().joinViaIdeaByCount(editor, context, count); return VimPlugin.getChange().joinViaIdeaByCount(editor, context, count);
} }
VimPlugin.getEditor().notifyIdeaJoin(editor.getProject()); VimPlugin.getEditor().notifyIdeaJoin(editor.getProject());
Ref<Boolean> res = Ref.create(true); Ref<Boolean> res = Ref.create(true);
editor.getCaretModel().runForEachCaret(caret -> { editor.getCaretModel().runForEachCaret(caret -> {
if (!VimPlugin.getChange().deleteJoinLines(editor, caret, count, false)) res.set(false); if (!VimPlugin.getChange().deleteJoinLines(editor, caret, count, false)) res.set(false);
}, true); }, true);
return res.get(); return res.get();
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteJoinLinesSpacesAction extends VimCommandAction { public class DeleteJoinLinesSpacesAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -56,30 +54,24 @@ public class DeleteJoinLinesSpacesAction extends VimCommandAction {
return Command.Type.DELETE; return Command.Type.DELETE;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (editor.isOneLineMode()) return false;
int rawCount,
@Nullable Argument argument) {
if (editor.isOneLineMode()) return false;
if (OptionsManager.INSTANCE.getIdeajoin().isSet()) { if (OptionsManager.INSTANCE.getIdeajoin().isSet()) {
return VimPlugin.getChange().joinViaIdeaByCount(editor, context, count); return VimPlugin.getChange().joinViaIdeaByCount(editor, context, count);
} }
VimPlugin.getEditor().notifyIdeaJoin(editor.getProject()); VimPlugin.getEditor().notifyIdeaJoin(editor.getProject());
Ref<Boolean> res = Ref.create(true); Ref<Boolean> res = Ref.create(true);
editor.getCaretModel().runForEachCaret(caret -> { editor.getCaretModel().runForEachCaret(caret -> {
if (!VimPlugin.getChange().deleteJoinLines(editor, caret, count, true)) res.set(false); if (!VimPlugin.getChange().deleteJoinLines(editor, caret, count, true)) res.set(false);
}, true); }, true);
return res.get(); return res.get();
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -23,12 +23,10 @@ import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -43,44 +41,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class DeleteJoinVisualLinesAction extends VimCommandAction { final public class DeleteJoinVisualLinesAction extends VisualOperatorActionHandler.SingleExecution {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.SingleExecution() {
@Override
public boolean executeForAllCarets(@NotNull Editor editor,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull Map<Caret, ? extends VimSelection> caretsAndSelections) {
if (editor.isOneLineMode()) return false;
if (OptionsManager.INSTANCE.getIdeajoin().isSet()) {
VimPlugin.getChange().joinViaIdeaBySelections(editor, context, caretsAndSelections);
return true;
}
Ref<Boolean> res = Ref.create(true);
editor.getCaretModel().runForEachCaret(caret -> {
if (!caret.isValid()) return;
final VimSelection range = caretsAndSelections.get(caret);
if (range == null) return;
if (!VimPlugin.getChange().deleteJoinRange(editor, caret, range.toVimTextRange(true).normalize(), false)) {
res.set(false);
}
}, true);
return res.get();
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -102,4 +68,29 @@ final public class DeleteJoinVisualLinesAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeForAllCarets(@NotNull Editor editor,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull Map<Caret, ? extends VimSelection> caretsAndSelections) {
if (editor.isOneLineMode()) return false;
if (OptionsManager.INSTANCE.getIdeajoin().isSet()) {
VimPlugin.getChange().joinViaIdeaBySelections(editor, context, caretsAndSelections);
return true;
}
Ref<Boolean> res = Ref.create(true);
editor.getCaretModel().runForEachCaret(caret -> {
if (!caret.isValid()) return;
final VimSelection range = caretsAndSelections.get(caret);
if (range == null) return;
if (!VimPlugin.getChange().deleteJoinRange(editor, caret, range.toVimTextRange(true).normalize(), false)) {
res.set(false);
}
}, true);
return res.get();
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -23,12 +23,10 @@ import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.option.OptionsManager; import com.maddyhome.idea.vim.option.OptionsManager;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -43,45 +41,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class DeleteJoinVisualLinesSpacesAction extends VimCommandAction { final public class DeleteJoinVisualLinesSpacesAction extends VisualOperatorActionHandler.SingleExecution {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.SingleExecution() {
@Override
public boolean executeForAllCarets(@NotNull Editor editor,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull Map<Caret, ? extends VimSelection> caretsAndSelections) {
if (editor.isOneLineMode()) return false;
if (OptionsManager.INSTANCE.getIdeajoin().isSet()) {
VimPlugin.getChange().joinViaIdeaBySelections(editor, context, caretsAndSelections);
return true;
}
Ref<Boolean> res = Ref.create(true);
editor.getCaretModel().runForEachCaret(caret -> {
if (!caret.isValid()) return;
final VimSelection range = caretsAndSelections.get(caret);
if (range == null) return;
if (!VimPlugin.getChange().deleteJoinRange(editor, caret, range.toVimTextRange(true).normalize(), true)) {
res.set(false);
}
}, true);
return res.get();
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -102,4 +67,29 @@ final public class DeleteJoinVisualLinesSpacesAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeForAllCarets(@NotNull Editor editor,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull Map<Caret, ? extends VimSelection> caretsAndSelections) {
if (editor.isOneLineMode()) return false;
if (OptionsManager.INSTANCE.getIdeajoin().isSet()) {
VimPlugin.getChange().joinViaIdeaBySelections(editor, context, caretsAndSelections);
return true;
}
Ref<Boolean> res = Ref.create(true);
editor.getCaretModel().runForEachCaret(caret -> {
if (!caret.isValid()) return;
final VimSelection range = caretsAndSelections.get(caret);
if (range == null) return;
if (!VimPlugin.getChange().deleteJoinRange(editor, caret, range.toVimTextRange(true).normalize(), true)) {
res.set(false);
}
}, true);
return res.get();
}
} }

View File

@@ -1,85 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2019 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 <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.delete;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
public class DeleteLineAction extends VimCommandAction {
public DeleteLineAction() {
super();
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("dd");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@NotNull
@Override
public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_ALLOW_MID_COUNT);
}
@NotNull
@Override
protected VimActionHandler makeActionHandler() {
return new ChangeEditorActionHandler.ForEachCaret() {
@Override
public boolean execute(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
int count,
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().deleteLine(editor, caret, count);
}
};
}
}

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,13 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction; import com.maddyhome.idea.vim.command.*;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler; import kotlin.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class DeleteMotionAction extends VimCommandAction { public class DeleteMotionAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -66,23 +63,22 @@ public class DeleteMotionAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
public EnumSet<CommandFlags> getFlags() { public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_OP_PEND); return EnumSet.of(CommandFlags.FLAG_DUPLICABLE_OPERATOR);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (argument == null) return false;
int rawCount, Pair<TextRange, SelectionType> deleteRangeAndType =
@Nullable Argument argument) { VimPlugin.getChange().getDeleteRangeAndType(editor, caret, context, count, rawCount, argument, false);
return argument != null &&
VimPlugin.getChange().deleteMotion(editor, caret, context, count, rawCount, argument, false); if (deleteRangeAndType == null) return false;
} return VimPlugin.getChange()
}; .deleteRange(editor, caret, deleteRangeAndType.getFirst(), deleteRangeAndType.getSecond(), false);
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -41,29 +39,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class DeleteVisualAction extends VimCommandAction { final public class DeleteVisualAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
SelectionType selectionType = range.getType();
return VimPlugin.getChange().deleteRange(editor, caret, range.toVimTextRange(false), selectionType, false);
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -84,4 +65,14 @@ final public class DeleteVisualAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
SelectionType selectionType = range.getType();
return VimPlugin.getChange().deleteRange(editor, caret, range.toVimTextRange(false), selectionType, false);
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,11 +22,9 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.*; import com.maddyhome.idea.vim.command.*;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -40,38 +38,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class DeleteVisualLinesAction extends VimCommandAction { final public class DeleteVisualLinesAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
final TextRange textRange = range.toVimTextRange(false);
if (mode == CommandState.SubMode.VISUAL_BLOCK) {
return VimPlugin.getChange()
.deleteRange(editor, editor.getCaretModel().getPrimaryCaret(), textRange,
SelectionType.fromSubMode(mode), false);
} else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, textRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, textRange.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, caret, lineRange, SelectionType.LINE_WISE, false);
}
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -92,4 +64,24 @@ final public class DeleteVisualLinesAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
final TextRange textRange = range.toVimTextRange(false);
if (mode == CommandState.SubMode.VISUAL_BLOCK) {
return VimPlugin.getChange()
.deleteRange(editor, editor.getCaretModel().getPrimaryCaret(), textRange, SelectionType.fromSubMode(mode),
false);
}
else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, textRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, textRange.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, caret, lineRange, SelectionType.LINE_WISE, false);
}
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.delete; package com.maddyhome.idea.vim.action.change.delete;
@@ -22,14 +22,12 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.visual.VimSelection; import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
@@ -43,45 +41,12 @@ import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
final public class DeleteVisualLinesEndAction extends VimCommandAction { final public class DeleteVisualLinesEndAction extends VisualOperatorActionHandler.ForEachCaret {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new VisualOperatorActionHandler.ForEachCaret() {
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
TextRange vimTextRange = range.toVimTextRange(true);
if (range.getType() == SelectionType.BLOCK_WISE) {
final int[] starts = vimTextRange.getStartOffsets();
final int[] ends = vimTextRange.getEndOffsets();
for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
}
}
final TextRange blockRange = new TextRange(starts, ends);
return VimPlugin.getChange()
.deleteRange(editor, editor.getCaretModel().getPrimaryCaret(), blockRange, SelectionType.BLOCK_WISE, false);
}
else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, vimTextRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, vimTextRange.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, caret, lineRange, SelectionType.LINE_WISE, false);
}
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
final public Set<MappingMode> getMappingModes() { final public Set<MappingMode> getMappingModes() {
return MappingMode.V; return MappingMode.X;
} }
@NotNull @NotNull
@@ -102,4 +67,31 @@ final public class DeleteVisualLinesEndAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL); return EnumSet.of(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL);
} }
@Override
public boolean executeAction(@NotNull Editor editor,
@NotNull Caret caret,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull VimSelection range) {
TextRange vimTextRange = range.toVimTextRange(true);
if (range.getType() == SelectionType.BLOCK_WISE) {
final int[] starts = vimTextRange.getStartOffsets();
final int[] ends = vimTextRange.getEndOffsets();
for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
}
}
final TextRange blockRange = new TextRange(starts, ends);
return VimPlugin.getChange()
.deleteRange(editor, editor.getCaretModel().getPrimaryCaret(), blockRange, SelectionType.BLOCK_WISE, false);
}
else {
final TextRange lineRange =
new TextRange(EditorHelper.getLineStartForOffset(editor, vimTextRange.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, vimTextRange.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, caret, lineRange, SelectionType.LINE_WISE, false);
}
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertAfterCursorAction extends VimCommandAction { public class InsertAfterCursorAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,19 +60,13 @@ public class InsertAfterCursorAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, VimPlugin.getChange().insertAfterCursor(editor, context);
int rawCount, return true;
@Nullable Argument argument) {
VimPlugin.getChange().insertAfterCursor(editor, context);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertAfterLineEndAction extends VimCommandAction { public class InsertAfterLineEndAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,19 +60,13 @@ public class InsertAfterLineEndAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, VimPlugin.getChange().insertAfterLineEnd(editor, context);
int rawCount, return true;
@Nullable Argument argument) {
VimPlugin.getChange().insertAfterLineEnd(editor, context);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertAtPreviousInsertAction extends VimCommandAction { public class InsertAtPreviousInsertAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,19 +60,13 @@ public class InsertAtPreviousInsertAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, VimPlugin.getChange().insertAtPreviousInsert(editor, context);
int rawCount, return true;
@Nullable Argument argument) {
VimPlugin.getChange().insertAtPreviousInsert(editor, context);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,21 +35,7 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
final public class InsertBeforeCursorAction extends VimCommandAction { final public class InsertBeforeCursorAction extends ChangeEditorActionHandler.SingleExecution {
@Contract(" -> new")
@NotNull
@Override
final protected VimActionHandler makeActionHandler() {
return new ChangeEditorActionHandler.SingleExecution() {
@Override
final public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount,
@Nullable Argument argument) {
VimPlugin.getChange().insertBeforeCursor(editor, context);
return true;
}
};
}
@Contract(pure = true) @Contract(pure = true)
@NotNull @NotNull
@Override @Override
@@ -77,4 +61,14 @@ final public class InsertBeforeCursorAction extends VimCommandAction {
final public EnumSet<CommandFlags> getFlags() { final public EnumSet<CommandFlags> getFlags() {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@Override
final public boolean execute(@NotNull Editor editor,
@NotNull DataContext context,
int count,
int rawCount,
@Nullable Argument argument) {
VimPlugin.getChange().insertBeforeCursor(editor, context);
return true;
}
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertBeforeFirstNonBlankAction extends VimCommandAction { public class InsertBeforeFirstNonBlankAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,19 +60,13 @@ public class InsertBeforeFirstNonBlankAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, VimPlugin.getChange().insertBeforeFirstNonBlank(editor, context);
int rawCount, return true;
@Nullable Argument argument) {
VimPlugin.getChange().insertBeforeFirstNonBlank(editor, context);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertCharacterAboveCursorAction extends VimCommandAction { public class InsertCharacterAboveCursorAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,23 +53,17 @@ public class InsertCharacterAboveCursorAction extends VimCommandAction {
return Command.Type.INSERT; return Command.Type.INSERT;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (editor.isOneLineMode()) {
int rawCount, return false;
@Nullable Argument argument) { }
if (editor.isOneLineMode()) {
return false;
}
return VimPlugin.getChange().insertCharacterAroundCursor(editor, caret, -1); return VimPlugin.getChange().insertCharacterAroundCursor(editor, caret, -1);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -22,12 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -36,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertCharacterBelowCursorAction extends VimCommandAction { public class InsertCharacterBelowCursorAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -55,23 +53,17 @@ public class InsertCharacterBelowCursorAction extends VimCommandAction {
return Command.Type.INSERT; return Command.Type.INSERT;
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (editor.isOneLineMode()) {
int rawCount, return false;
@Nullable Argument argument) { }
if (editor.isOneLineMode()) {
return false;
}
return VimPlugin.getChange().insertCharacterAroundCursor(editor, caret, 1); return VimPlugin.getChange().insertCharacterAroundCursor(editor, caret, 1);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertDeleteInsertedTextAction extends VimCommandAction { public class InsertDeleteInsertedTextAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -63,19 +61,13 @@ public class InsertDeleteInsertedTextAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_CLEAR_STROKES); return EnumSet.of(CommandFlags.FLAG_CLEAR_STROKES);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().insertDeleteInsertedText(editor, caret);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().insertDeleteInsertedText(editor, caret);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -22,13 +22,11 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,7 +36,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertDeletePreviousWordAction extends VimCommandAction { public class InsertDeletePreviousWordAction extends ChangeEditorActionHandler.ForEachCaret {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -63,19 +61,13 @@ public class InsertDeletePreviousWordAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_CLEAR_STROKES); return EnumSet.of(CommandFlags.FLAG_CLEAR_STROKES);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.ForEachCaret() { @NotNull Caret caret,
@Override @NotNull DataContext context,
public boolean execute(@NotNull Editor editor, int count,
@NotNull Caret caret, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, return VimPlugin.getChange().insertDeletePreviousWord(editor, caret);
int rawCount,
@Nullable Argument argument) {
return VimPlugin.getChange().insertDeletePreviousWord(editor, caret);
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,7 +21,6 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
@@ -35,7 +34,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertEnterAction extends VimCommandAction { public class InsertEnterAction extends VimActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -60,15 +59,9 @@ public class InsertEnterAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_SAVE_STROKE); return EnumSet.of(CommandFlags.FLAG_SAVE_STROKE);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return new VimActionHandler.SingleExecution() { VimPlugin.getChange().processEnter(HelperKt.getTopLevelEditor(editor), context);
@Override return true;
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getChange().processEnter(HelperKt.getTopLevelEditor(editor), context);
return true;
}
};
} }
} }

View File

@@ -13,19 +13,19 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.RegisterActions;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.handler.VimActionHandler; import com.maddyhome.idea.vim.handler.VimActionHandler;
import com.maddyhome.idea.vim.helper.ModeHelper;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -33,20 +33,12 @@ import javax.swing.*;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
final public class InsertExitModeAction extends VimCommandAction { final public class InsertExitModeAction extends VimActionHandler.SingleExecution {
private static final String ACTION_ID = "VimInsertExitMode"; private static final String ACTION_ID = "VimInsertExitModeAction";
@Contract(" -> new")
@NotNull @NotNull
@Override public static EditorActionHandlerBase getInstance() {
final protected VimActionHandler makeActionHandler() { return RegisterActions.findActionOrDie(ACTION_ID);
return new VimActionHandler.SingleExecution() {
@Override
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getChange().processEscape(editor, context);
return true;
}
};
} }
@Contract(pure = true) @Contract(pure = true)
@@ -59,7 +51,7 @@ final public class InsertExitModeAction extends VimCommandAction {
@NotNull @NotNull
@Override @Override
final public Set<List<KeyStroke>> getKeyStrokesSet() { final public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("<C-[>", "<C-C>", "<Esc>", "<C-\\><C-N>"); return parseKeysSet("<C-[>", "<C-C>", "<Esc>");
} }
@Contract(pure = true) @Contract(pure = true)
@@ -69,8 +61,9 @@ final public class InsertExitModeAction extends VimCommandAction {
return Command.Type.INSERT; return Command.Type.INSERT;
} }
@NotNull @Override
public static VimCommandAction getInstance() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return (VimCommandAction)ActionManager.getInstance().getAction(ACTION_ID); ModeHelper.exitInsertMode(editor, context);
return true;
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,7 +21,6 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
@@ -34,7 +33,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertInsertAction extends VimCommandAction { public class InsertInsertAction extends VimActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -59,15 +58,9 @@ public class InsertInsertAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_SAVE_STROKE); return EnumSet.of(CommandFlags.FLAG_SAVE_STROKE);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return new VimActionHandler.SingleExecution() { VimPlugin.getChange().processInsert(editor);
@Override return true;
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getChange().processInsert(editor);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertLineStartAction extends VimCommandAction { public class InsertLineStartAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,19 +60,13 @@ public class InsertLineStartAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, VimPlugin.getChange().insertLineStart(editor, context);
int rawCount, return true;
@Nullable Argument argument) {
VimPlugin.getChange().insertLineStart(editor, context);
return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertNewLineAboveAction extends VimCommandAction { public class InsertNewLineAboveAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,24 +60,18 @@ public class InsertNewLineAboveAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (editor.isOneLineMode()) {
int rawCount, return false;
@Nullable Argument argument) { }
if (editor.isOneLineMode()) {
return false;
}
VimPlugin.getChange().insertNewLineAbove(editor, context); VimPlugin.getChange().insertNewLineAbove(editor, context);
return true; return true;
}
};
} }
} }

View File

@@ -13,7 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.maddyhome.idea.vim.action.change.insert; package com.maddyhome.idea.vim.action.change.insert;
@@ -21,13 +21,11 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandFlags; import com.maddyhome.idea.vim.command.CommandFlags;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler; import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.handler.VimActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -37,7 +35,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class InsertNewLineBelowAction extends VimCommandAction { public class InsertNewLineBelowAction extends ChangeEditorActionHandler.SingleExecution {
@NotNull @NotNull
@Override @Override
public Set<MappingMode> getMappingModes() { public Set<MappingMode> getMappingModes() {
@@ -62,24 +60,18 @@ public class InsertNewLineBelowAction extends VimCommandAction {
return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO); return EnumSet.of(CommandFlags.FLAG_MULTIKEY_UNDO);
} }
@NotNull
@Override @Override
protected VimActionHandler makeActionHandler() { public boolean execute(@NotNull Editor editor,
return new ChangeEditorActionHandler.SingleExecution() { @NotNull DataContext context,
@Override int count,
public boolean execute(@NotNull Editor editor, int rawCount,
@NotNull DataContext context, @Nullable Argument argument) {
int count, if (editor.isOneLineMode()) {
int rawCount, return false;
@Nullable Argument argument) { }
if (editor.isOneLineMode()) {
return false;
}
VimPlugin.getChange().insertNewLineBelow(editor, context); VimPlugin.getChange().insertNewLineBelow(editor, context);
return true; return true;
}
};
} }
} }

Some files were not shown because too many files have changed in this diff Show More