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

Compare commits

..

716 Commits
0.24 ... 0.47

Author SHA1 Message Date
Andrey Vlasovskikh
f3b4726b34 Version 0.47 2016-10-19 15:58:35 +03:00
Andrey Vlasovskikh
30d7c6edf1 Remove obsolete pluginId 2016-09-30 21:15:51 +03:00
Andrey Vlasovskikh
f33f73d2f5 VIM-1190 Fixed exception "Write access is allowed from write-safe contexts only"
We now use IntelliJ's version of invokeLater() in order to satisfy the
new protocol for running read-write actions in modal dialogs.
2016-09-30 20:44:16 +03:00
Andrey Vlasovskikh
b595dfd443 VIM-1098 Don't start visual selection when mouse click was actually drag over single character 2016-09-01 20:50:55 +03:00
Andrey Vlasovskikh
a3e15b5c76 Possibility to publish the plugin to multiple channels 2016-09-01 18:32:16 +03:00
Andrey Vlasovskikh
31d85c0221 Update gradle-intellij-plugin to 0.2.0-SNAPSHOT for multi-channel plugin publishing 2016-09-01 18:26:30 +03:00
Andrey Vlasovskikh
124bd55e18 Update gradle-intellij-plugin to 0.0.43 2016-07-08 12:19:02 +03:00
Andrey Vlasovskikh
bb9b5b5bde Use IntelliJ 15.0.5 by default 2016-07-08 12:19:02 +03:00
Andrey Vlasovskikh
f586e6dd29 Version 0.46
Due to the plugin versions comparision logic in the IntelliJ platform it's impossible to
update 0.45-eap-XXX to 0.45. Bumped version once again.
2016-07-07 18:27:09 +03:00
Andrey Vlasovskikh
c2b1b67b6b Parameter for customizing publish channel for plugin 2016-07-07 18:03:01 +03:00
Andrey Vlasovskikh
2cb29233c8 Version 0.45 2016-07-07 17:56:57 +03:00
Andrey Vlasovskikh
b0e0bebb7e Removed default error handler 2016-07-07 17:56:23 +03:00
Andrey Vlasovskikh
364b3567fc VIM-1126 Fixed warning about modifying shortcuts of global actions for 2016.2 2016-07-07 17:39:29 +03:00
Andrey Vlasovskikh
9522a51dc7 Enabling key repeat on Mac OS X doesn't require restart 2016-04-29 21:52:35 +03:00
Andrey Vlasovskikh
75335a8a01 Added Paulo Bu to the list of contributors 2016-04-29 21:37:42 +03:00
Andrey Vlasovskikh
0bf561e326 Merge remote-tracking branch 'pbu88/adds_more_folding_commands' 2016-04-29 21:34:19 +03:00
Andrey Vlasovskikh
7e6c2c2a7c Updated changelog 2016-04-29 21:28:41 +03:00
Andrey Vlasovskikh
b132d490f0 Typo 2016-04-29 21:20:22 +03:00
Andrey Vlasovskikh
3fde0fc209 Non-public methods made private 2016-04-29 21:19:17 +03:00
Andrey Vlasovskikh
24bc09796f Fixed NPE 2016-04-29 21:18:28 +03:00
Andrey Vlasovskikh
758bff79d6 Removed unused code 2016-04-29 21:16:05 +03:00
Andrey Vlasovskikh
3b0660799b VIM-843 Don't highlight search results after restart
Added limited support for 'viminfo' option. Only 'h' in 'viminfo' is
taken into account.
2016-04-29 21:15:01 +03:00
Andrey Vlasovskikh
6880afa73c VIM-139 Focus on current search and use modal confirmation for ':s///gc' 2016-04-29 01:33:28 +03:00
Andrey Vlasovskikh
01aae065ff Updated changelog 2016-04-28 20:17:22 +03:00
Andrey Vlasovskikh
8ee49edef0 VIM-287 Fixed insert new line before and after folds 2016-04-28 20:13:08 +03:00
Andrey Vlasovskikh
e09f6c7886 Failing tests for VIM-287 2016-04-28 19:38:19 +03:00
Andrey Vlasovskikh
dd0a7207d5 Removed old block selection API usages to become compatible with IntelliJ branch 146 2016-04-22 03:22:02 +03:00
Andrey Vlasovskikh
17700a6537 Updated changelog 2016-04-20 03:02:15 +03:00
Andrey Vlasovskikh
949444f6dd EAP for IdeaVim 2016-04-20 03:00:54 +03:00
Andrey Vlasovskikh
31832ac230 Don't specify build number as a separate entity in the plugin description 2016-04-20 02:31:38 +03:00
Andrey Vlasovskikh
33200f8208 Settings for publishing the plugin to the EAP channel 2016-04-20 01:56:46 +03:00
Andrey Vlasovskikh
893cd17c1a Updated changelog 2016-04-18 03:32:34 +03:00
Andrey Vlasovskikh
c471ddd12f Merge remote-tracking branch 'ayzenquwe/ayzen/VIM-259' 2016-04-18 02:47:38 +03:00
Andrey Vlasovskikh
b0ac8f89c5 Merge remote-tracking branch 'ayzenquwe/ayzen/VIM-964' 2016-04-18 02:41:35 +03:00
Andrey Vlasovskikh
a47338d8b7 Merge remote-tracking branch 'ayzenquwe/ayzen/VIM-564' 2016-04-18 02:36:58 +03:00
Andrey Vlasovskikh
76d00ab47f Merge remote-tracking branch 'ayzenquwe/ayzen/gomethod' 2016-04-18 02:31:11 +03:00
Andrey Vlasovskikh
22b8552939 Updated changelog 2016-04-18 02:29:15 +03:00
Andrey Vlasovskikh
1d25a04377 Added Aleksey Lagoshin to list of contributors 2016-04-18 02:26:41 +03:00
Andrey Vlasovskikh
52148f69c1 Merge remote-tracking branch 'ayzenquwe/ayzen/registers' 2016-04-18 02:24:00 +03:00
Andrey Vlasovskikh
f280f8138d Support <Plug> in mapping commands 2016-04-18 01:46:46 +03:00
Andrey Vlasovskikh
530846bc7a Added 'timeout' option for toggling timeout for mapping commands 2016-04-18 01:46:46 +03:00
Andrey Vlasovskikh
27adde7af0 Merge pull request #108 from agriesbaum/master
Improve diction of README
2016-04-06 19:41:57 +04:00
Alexander Griesbaum
e3869a201f Improve diction of README 2016-04-05 22:44:26 +02:00
Andrey Vlasovskikh
745a356c87 Cleanup 2016-02-21 07:08:21 +03:00
Andrey Vlasovskikh
b16a4a1343 Handle <Esc> in modal input better 2016-02-21 07:00:44 +03:00
Andrey Vlasovskikh
36e41555ea Cleaned up ModalEntry 2016-02-21 06:16:11 +03:00
Andrey Vlasovskikh
3f824cf205 Enable SecondaryLoop-based implementation for Java 7+ 2016-02-21 06:07:34 +03:00
dhleong
c61b3c2f29 More closely emulate SecondaryLoop with reflection and a Proxy 2016-02-17 20:46:33 -05:00
dhleong
fd97cfbd15 Add compat layer for JDK6
JDK7 mode works like a dream, but JDK6 still seems to break
after the first invocation.
2016-02-15 09:19:18 -05:00
dhleong
4b4c293008 Refactor modal input for Vim Extensions
Doesn't use dialogs, so should fix VIM-1086
2016-02-14 13:23:51 -05:00
Andrey Vlasovskikh
69a573a279 Handle <Esc> in inputKeyStroke() uniformly as "typed Esc" 2016-02-09 00:40:37 +03:00
Andrey Vlasovskikh
c33d4d989e Clearer offsets comparison + multi-line deletion test 2016-02-09 00:20:58 +03:00
dhleong
3cd1134973 Fix calculation of how to paste surrounded value
Fixes VIM-1085; includes test
2016-02-06 10:23:05 -05:00
Andrey Vlasovskikh
4f42d4dc4f Merge branch 'vlasovskikh/surround'
# Conflicts:
#	CHANGES.md
#	resources/META-INF/plugin.xml
#	src/com/maddyhome/idea/vim/option/Options.java
2016-02-04 23:08:37 +03:00
Andrey Vlasovskikh
a3b4aecded Docs about 'surround' extension 2016-02-04 23:02:29 +03:00
Andrey Vlasovskikh
534ae6aa81 Added Daniel Leong to the list of contributors 2016-02-04 22:54:15 +03:00
Andrey Vlasovskikh
7e1e50ffde Cleanup 2016-02-04 22:52:59 +03:00
Andrey Vlasovskikh
ab3cbb113e Restore caret position properly 2016-02-04 22:18:37 +03:00
dhleong
1c7e6af1fc Fix <esc> not sent after VSurround; support change with tags 2016-02-02 20:57:54 -05:00
dhleong
84f7e25c5e Cleanup overly verbose code; remove unused import 2016-02-02 20:32:09 -05:00
dhleong
458fe97b75 Add visual surround (S) command 2016-01-30 09:31:25 -05:00
dhleong
31364607f5 Add ds command; jump to start when executed to match vim-surround 2016-01-30 09:14:34 -05:00
dhleong
56ec2c7ebc Add cs action
Note that, unfortunately, we can't do `cst`, as IdeaVim doesn't
support the tag textobject. Once that's supported, however, we
just need to disable the safety check to enable that.
2016-01-30 09:02:06 -05:00
Andrey Vlasovskikh
f944d91d62 Updated changelog 2016-01-30 02:10:31 +03:00
Andrey Vlasovskikh
2cf7d89581 VIM-271 Added 'incsearch' option for showing search results while typing 2016-01-30 02:05:24 +03:00
Andrey Vlasovskikh
91546700d4 Added simple ys{motion}t tag surround and input() function 2016-01-26 22:25:36 +03:00
Andrey Vlasovskikh
a972aec9b0 Implementation notes 2016-01-26 21:33:31 +03:00
Andrey Vlasovskikh
6328575639 'ys{motion}<' requires further user input to wrap text into HTML tags 2016-01-26 21:15:29 +03:00
Andrey Vlasovskikh
af534c9209 Repeat is not supported for 'ys' yet 2016-01-26 21:14:43 +03:00
Andrey Vlasovskikh
82a1e920e0 Initial refactoring of dhleong's 'ys' on top of extension infrastructure 2016-01-26 21:14:15 +03:00
Andrey Vlasovskikh
d46d292865 Added surround tests for 'ys' by dhleong 2016-01-26 18:15:00 +03:00
Andrey Vlasovskikh
1a96533a3c Added unit test-friendly version of VimExtensionFacade.getKeyStroke() 2016-01-26 18:14:14 +03:00
Andrey Vlasovskikh
2d86054fe8 Fixed regression after setChangeMarks() refactoring 2016-01-26 17:49:05 +03:00
Andrey Vlasovskikh
50e3af7b82 Added modal getKeyStroke() similar to Vim's getchar() 2016-01-26 04:17:19 +03:00
Andrey Vlasovskikh
27af4b926b Added the 'g@' command for IdeaVim extensions 2016-01-26 01:02:20 +03:00
Andrey Vlasovskikh
1d035acb6d Vim extension facade for executing emulated Vim statements built-in functions 2016-01-24 20:14:54 +03:00
Andrey Vlasovskikh
3704c321fa Added the ability to map keys to IdeaVim extension handlers 2016-01-24 19:57:37 +03:00
Andrey Vlasovskikh
9c6f35f3bd Added mechanism for providing extensions for IdeaVim like ported Vim plugins 2016-01-24 19:04:12 +03:00
Andrey Vlasovskikh
47b49c3e03 Merge pull request #93 from raimon49/use-relative-links
Use relative links that recommended way by GitHub Inc.
2016-01-23 02:24:35 +03:00
Andrey Vlasovskikh
7a99261979 Updated "Setting up development environment" for Gradle 2016-01-23 02:15:08 +03:00
Andrey Vlasovskikh
8eda58825f Put /out/ back 2016-01-23 02:14:40 +03:00
Andrey Vlasovskikh
6ee43c0014 Removed old project files 2016-01-23 01:46:43 +03:00
Andrey Vlasovskikh
bea3d58ddb Removed old project file 2016-01-23 01:45:44 +03:00
Andrey Vlasovskikh
71b121c15c Use source code for Gradle Wrapper 2016-01-23 00:32:01 +03:00
Andrey Vlasovskikh
7c8b6d2fe6 Removed old IntelliJ project files in favor of non-version-controlled Gradle files 2016-01-23 00:31:31 +03:00
Andrey Vlasovskikh
5d33c46e6b Updated code style settings 2016-01-23 00:30:22 +03:00
Andrey Vlasovskikh
8aac0ebdb6 Configurable option for downloading IntelliJ sources 2016-01-22 23:49:32 +03:00
Andrey Vlasovskikh
6072aae338 Add build number to archive name 2016-01-22 23:47:29 +03:00
Andrey Vlasovskikh
872b916d46 Added Gradle Wrapper 2016-01-22 22:46:44 +03:00
Alexander Zolotov
86303b58df Use retina-friendly svg status images 2016-01-22 22:44:48 +03:00
Andrey Vlasovskikh
78b1ad6df6 Switched from Ant to Gradle for easier dependency on IntelliJ in automated builds 2016-01-22 22:15:38 +03:00
Andrey Vlasovskikh
e5ac7ee607 Send stats reports in internal mode 2016-01-22 21:41:35 +03:00
Andrey Vlasovskikh
480b32b5af Fixed AIOOBE in tag selection for files starting with '/' and containing '>' 2016-01-21 18:28:14 +03:00
Andrey Vlasovskikh
8c9cf09bd8 Report usage statistics 2016-01-21 17:51:21 +03:00
Andrey Vlasovskikh
7ceea17050 Added DataGrip to the list of supported IDEs 2016-01-21 02:22:48 +03:00
Andrey Vlasovskikh
76333c5a24 Updated copyright years 2016-01-21 02:20:57 +03:00
Andrey Vlasovskikh
85857a3319 Updated changelog 2016-01-21 02:02:08 +03:00
Andrey Vlasovskikh
5ad2bb4bea Updated current IntelliJ URL 2016-01-21 02:01:51 +03:00
Andrey Vlasovskikh
cb9d205336 VIM-796 Execute :action handler strictly after request focus handler 2016-01-21 01:44:27 +03:00
Andrey Vlasovskikh
e1a292ba33 Merge remote-tracking branch 'smartbomb/ActionHandler-focus-fix' 2016-01-21 01:28:20 +03:00
Andrey Vlasovskikh
fa4e54b32e Inline since-build into build.xml for running in internal mode 2016-01-21 01:27:22 +03:00
smartbomb
3ba41ac458 VIM-892 Fix various focus related issues when executing :action commands a keymap
also fixes VIM-1001, VIM-1016 and hopefully VIM-962 but unable to fully reproduce
2015-12-30 22:06:52 +01:00
Andrey Vlasovskikh
2fbe85e60f Added Teruo and Liubov to the list of contributors 2015-12-03 15:39:54 +03:00
Andrey Vlasovskikh
676a518fa8 Updated changelog 2015-12-03 15:39:23 +03:00
Andrey Vlasovskikh
992c1923f6 Use Guava for more idiomatic list operations 2015-12-03 15:33:04 +03:00
lubba
a22afdd0f6 VIM-364 Added support for tag block selection 2015-12-03 15:19:54 +03:00
Andrey Vlasovskikh
0da8625f30 VIM-1040 Fixed typing keys in completion menus and typing with the plugin disabled 2015-11-02 15:53:50 +03:00
Andrey Vlasovskikh
4cc784eb95 VIM-1039 Fixed running the plugin with Java 6 2015-11-02 00:45:23 +03:00
Andrey Vlasovskikh
ee3bec9eed Version 0.42 2015-11-01 02:23:09 +03:00
Andrey Vlasovskikh
24788ac86f Updated changelog 2015-10-30 16:11:16 +03:00
Andrey Vlasovskikh
9af3c732b5 Updated CI icons 2015-10-30 16:04:35 +03:00
Andrey Vlasovskikh
e5873fe5f9 Use HTTP by default 2015-10-30 15:41:55 +03:00
Andrey Vlasovskikh
39f088cdcd VIM-970 Use raw typed handlers in order not to require write action in read-only files
This change requires the API of IntelliJ platform branch 143+.
2015-10-30 15:37:17 +03:00
Andrey Vlasovskikh
e805852721 Platform prefix initialization is no longer needed 2015-10-30 15:20:36 +03:00
Andrey Vlasovskikh
e136ecc1f8 Added generated idea/ to excluded folders 2015-10-30 15:19:42 +03:00
Andrey Vlasovskikh
efa4001440 Require minimal platform version 143 2015-10-30 15:19:19 +03:00
Paulo Bu
52a0af1636 Adds zC and zO folding commands 2015-08-28 15:59:13 +02:00
ayzen
5fc66b5896 ={motion} implementation, == with count and fix for VIM-259 2015-07-11 21:44:36 +03:00
ayzen
80dec29832 Fix for VIM-965 with a test 2015-07-01 23:31:25 +03:00
raimon
2c7d3c9971 Use relative links that recommended way by GitHub Inc. 2015-06-23 21:56:46 +09:00
ayzen
30a16e9496 Corrected typo that prevented correct calculation for marks vertical shifting; added a test 2015-06-14 10:54:15 +03:00
ayzen
0d6526ea31 Mark should not be deleted due to change commands that start from the beginning of the mark line 2015-06-14 10:41:52 +03:00
ayzen
4428340fd9 Fix for VIM-964 (marks get removed if one-char line is replaced by r) with a test 2015-06-14 10:38:36 +03:00
ayzen
900ce21445 Fix for VIM-564 (g_ didn't work correctly) with tests 2015-06-12 22:43:19 +03:00
Andrey Vlasovskikh
68c20ed48d Version 0.41 2015-06-10 15:42:02 +03:00
Andrey Vlasovskikh
c5760ceaab VIM-957 Fixed compatibility with IDEs other than IntelliJ 2015-06-10 15:41:33 +03:00
Andrey Vlasovskikh
8c7c9a67a6 Version 0.40 2015-06-09 23:01:54 +03:00
ayzen
efad5545de Correct behavior of numbered registers 2015-06-05 21:09:31 +03:00
ayzen
afb411dd35 Added tests for special registers 2015-06-05 21:09:16 +03:00
Andrey Vlasovskikh
85231b314f More readable test data 2015-04-24 16:29:56 +03:00
Andrey Vlasovskikh
210b2efd47 Updated changelog 2015-04-24 16:12:30 +03:00
Andrey Vlasovskikh
ae5b1385ea Merge branch 'matching-comments' 2015-04-24 16:08:54 +03:00
Andrey Vlasovskikh
011ce28251 More readable tests for '%' 2015-04-24 16:08:32 +03:00
Andrey Vlasovskikh
efb58b45df Cleanup 2015-04-24 16:02:20 +03:00
Andrey Vlasovskikh
7d033787eb Better place for cleaning global variables 2015-04-24 14:31:06 +03:00
Andrey Vlasovskikh
3a47583cf9 Clean global variables 2015-04-24 14:27:38 +03:00
Andrey Vlasovskikh
565b4b3f2f Updated changelog 2015-04-24 14:25:10 +03:00
Andrey Vlasovskikh
574f32a6dd Merge pull request #84 from JetBrains/mapleader
Mapleader support based on the prototype of a Vim script expressions evaluator
2015-04-24 13:33:38 +03:00
Andrey Vlasovskikh
0e67c8ff69 Removed unnecessary 'static' declaration 2015-04-24 13:32:26 +03:00
Andrey Vlasovskikh
b886073c11 VIM-650 Added support for 'mapleader' 2015-04-24 13:32:04 +03:00
Andrey Vlasovskikh
57c35b9a74 Merge remote-tracking branch 'origin/master' 2015-04-22 20:27:31 +03:00
Andrey Vlasovskikh
f5100694d6 VIM-930 Get editor focus after closing Ex entry box on Oracle Java 6 2015-04-22 20:26:41 +03:00
Andrey Vlasovskikh
3ff9bfcc13 Initial support for 'let' and 'echo' commands
These commands evaluate Vim script expressions. Right now they are
limited to a highly limited subset of Vim script expressions that is
however enough for settings the 'mapleader' variable for VIM-650.
2015-04-05 22:54:40 +03:00
Andrey Vlasovskikh
6c8d2bfd9e Merge pull request #83 from khromalabs/master
Added deployment instructions to README.md
2015-04-04 23:10:24 +03:00
Rubén Gómez
637f7f48ad Modified deployment instructions in README.md as suggested in pull request #83 2015-04-02 09:11:52 +02:00
Rubén Gómez
8eae80d30f Added deployment instructions to README.md 2015-03-30 23:55:04 +02:00
Andrey Vlasovskikh
9a103276e3 Merge pull request #82 from jflorian/master
Added note about where .ideavimrc is located
2015-03-30 16:39:52 +03:00
John Florian
6386f011f7 Merge remote-tracking branch 'upstream/master' 2015-03-30 09:32:09 -04:00
John Florian
742d6e63d9 Change - note regarding non-default user.home setting
Some users (e.g., me) have a non-default user.home VM option and this
affects where IdeaVim looks for its configuration file.  This note might
save some head scratching.
2015-03-30 09:26:32 -04:00
Andrey Vlasovskikh
f6141603ef Merge pull request #81 from jflorian/master
Аdd mapping example using :action
2015-03-29 02:20:19 +03:00
John Florian
7a5b4e565a Change - add mapping example using :action
This example may be helpful to regular VIM users since the :action and
:actionlist commands are specific to IdeaVIM.
2015-03-28 11:12:02 -04:00
Andrey Vlasovskikh
373e1527c1 Extracted Vim script parts into 'vimscript' package 2015-03-28 14:16:38 +03:00
Andrey Vlasovskikh
9cb05b6a7d Updated changelog 2015-03-27 21:55:45 +03:00
Andrey Vlasovskikh
74bf5ff044 Formatting and typos 2015-03-27 21:43:36 +03:00
Andrey Vlasovskikh
0f7e9d11b6 Added test for VIM-845 2015-03-27 21:43:19 +03:00
Andrey Vlasovskikh
5fadc2fb9f Removed unused imports 2015-03-27 21:30:05 +03:00
Andrey Vlasovskikh
96bbcf623f Removed unnecessary 'static' in enums 2015-03-27 21:20:17 +03:00
Andrey Vlasovskikh
89e853158c Typos 2015-03-27 21:19:56 +03:00
Andrey Vlasovskikh
5c31fcc03e Extracted CommandState.inVisualBlockMode() 2015-03-27 21:18:08 +03:00
Andrey Vlasovskikh
3fee4a803b Merge remote-tracking branch 'dezgeg/fixes/visual-block-mode-overhaul' 2015-03-27 20:56:58 +03:00
Andrey Vlasovskikh
8b61f559d7 Updated default code style settings 2015-03-24 23:52:04 +03:00
Andrey Vlasovskikh
4bd058f5dc Updated changelog 2015-03-24 23:51:34 +03:00
Andrey Vlasovskikh
999ccf87fc Merge remote-tracking branch 'dezgeg/fixes/vim-700-remap-zero' 2015-03-24 23:48:11 +03:00
Andrey Vlasovskikh
4e45e885b9 Merge remote-tracking branch 'dezgeg/feature/ant-improvements' 2015-03-24 23:25:31 +03:00
Tuomas Tynkkynen
6aee9ccaf1 build.xml: forkmode=once makes tests much faster
Since classloading of the IntelliJ platform takes a lot of time,
using forkmode=once in the Ant file makes running the unit tests from
Ant much faster (down to 16 seconds from 93 seconds) and is also more
closer to how the tests are run in the IDE.
2015-02-21 21:25:47 +02:00
Tuomas Tynkkynen
af3c6ff012 build.xml: Generate XML reports from JUnit test reports
The XML reports are useful for private CI servers like Jenkins.
2015-02-21 21:25:47 +02:00
Tuomas Tynkkynen
0c9bdf5168 Visual block mode overhaul
The current visual block mode implementation has several bugs:

- The GUI never displays the rightmost characters as selected (blue)
- Due to some off-by-one, commands can't act on each line's last character
- It's possible for newlines to get deleted/changed into something else
- If the '$' mode is entered, the GUI doesn't always indicate this
- It's impossible to move to an empty line (VIM-781)

This commit fixes all of those problems. The only remaining problem are
the visible secondary carets, which makes seeing the real cursor a bit
difficult. This could be fixed later if support for per-caret visibility
would be added to IntelliJ core.
2015-02-21 17:17:36 +02:00
Tuomas Tynkkynen
82a9587b4f Support comments in brace matching
In Vim, '%' can be used to jump between the '/*' and '*/' of block
comments. Support this functionality in a language-independent manner.
2015-02-21 15:14:38 +02:00
Tuomas Tynkkynen
850f4d7ec5 Make IdeaVIM build on latest intellij-community master
The zero-parameter overload of createStructureViewModel() has been
marked deprecated and is now removed.
2015-02-21 15:12:16 +02:00
Tuomas Tynkkynen
8d1dcc4568 VIM-700 Remapping '0' should still allow zero to be entered in count
Previously, remapping '0' in command mode would prevent a number zero
from being entered in a command count.
2015-02-21 15:09:13 +02:00
Andrey Vlasovskikh
3650ab85df Updated changelog 2015-01-21 19:50:50 +03:00
Andrey Vlasovskikh
e1e1cc2666 Code style
Use javadoc comments, added nullity annotations, extracted common
expressions.
2015-01-21 19:49:41 +03:00
Tuomas Tynkkynen
79fd32088b VIM-868 Allow count on 'gt' and 'gT'
'{count}gt' can now be used to switch to a specific tab.
'{count}gT' can now be used to switch to a n:th previous tab.
2015-01-21 18:11:48 +02:00
Andrey Vlasovskikh
458e0fc76d Updated changelog 2015-01-21 16:31:26 +03:00
Tuomas Tynkkynen
5090c81632 VIM-856 Fix regex lookbehind bugs
The regex code has the following bugs, mostly related to lookbehind:
    - Comparison of CharPointers with == is wrong, .equals should be
      used instead.

    - In the original C code, the behind_pos variable is declared as
      'static regsave_T behind_pos;', i.e. not a pointer, and the same
      for other variables of type regsave_T. So assignments to these
      types of variables need to make deep copies.
2015-01-20 17:52:08 +02:00
Andrey Vlasovskikh
dcd035353b Updated IntelliJ version to the latest one available for download 2015-01-20 18:41:00 +03:00
Andrey Vlasovskikh
8606ce21bd Added Jackson Popkin to the contributors 2015-01-20 17:47:50 +03:00
Andrey Vlasovskikh
72537c6ffb Merge remote-tracking branch 'jdpopkin/relative_range'
Conflicts:
	test/org/jetbrains/plugins/ideavim/ex/SubstituteCommandTest.java
2015-01-20 17:17:27 +03:00
Andrey Vlasovskikh
30f9888f51 Merge remote-tracking branch 'selesse/sort-fix' 2015-01-20 16:06:36 +03:00
Andrey Vlasovskikh
d5a2b92121 Updated changelog 2015-01-20 15:59:39 +03:00
Andrey Vlasovskikh
fd3eee6870 Merge remote-tracking branch 'dezgeg/fixes/vim-864-visual-substitute-incorrect-visual-marks' 2015-01-20 15:50:17 +03:00
Andrey Vlasovskikh
2d6d1003b7 Merge remote-tracking branch 'dezgeg/fixes/vim-575-split-cursor' 2015-01-20 15:44:46 +03:00
Andrey Vlasovskikh
499c590f5a Merge remote-tracking branch 'dezgeg/unit-tests' 2015-01-20 15:36:18 +03:00
Andrey Vlasovskikh
787b78ef36 Typo 2015-01-20 15:31:46 +03:00
Andrey Vlasovskikh
88a0b0fa23 Removed unused ExEntryPanel.processKey() 2015-01-20 15:31:33 +03:00
Andrey Vlasovskikh
1519f04930 Fixed potential NPEs 2015-01-20 15:30:17 +03:00
Andrey Vlasovskikh
e0a1291de0 Merge remote-tracking branch 'dezgeg/fixes/vim-210-ex-focus' 2015-01-20 15:27:55 +03:00
Andrey Vlasovskikh
8a2d881002 Cleanup
Removed commented code, renamed '\0' to '\u0000' for consistency,
fixed nullable warnings, declared some variables final.
2015-01-20 14:50:55 +03:00
Tuomas Tynkkynen
4802b6f460 VIM-864 Fix visual marks getting changed during visual substitute
Previously, running a substitute command in visual mode would
incorrectly set the visual mode end mark (>) to the location of the last
search match.
2014-12-24 18:19:53 +02:00
Jackson Popkin
8c0e116a1c Fix incorrect behavior in substitution with offset ranges
Substitution commands with offset ranges like .,+2s/a/b/g previously
did not work the way they do in Vim (replace a with b on the current
line and the next two lines). This change fixes that bug.
2014-12-23 21:14:42 -05:00
Alex Selesse
8862878011 Fix broken sorting when sorting with leading whitespace 2014-12-14 12:17:51 -05:00
Tuomas Tynkkynen
bdf3361243 VIM-575 Don't change cursor position of other splits in visual mode
If a file is opened in multiple splits, entering visual mode in one
split would change the cursor position in other splits as well.
2014-12-14 15:20:36 +02:00
Tuomas Tynkkynen
6b5216077b Add few simple mark tests. 2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
7e119f7963 Add tests for change number operations (<C-A>, <C-X>) 2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
933cbc7e51 Add unit tests for some replace commands
Adds tests for: |r|, |s|, |R|, and <Ins> in insert mode.
2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
65f30d4480 Add testcase for '>' in visual block mode 2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
1f8d3f119e Add unit tests for Ex ranges
Adds tests for ranges in Ex commands. Almost every kind of range has
basic tests, except the following are still totally untested:
    - \/, \?, \&
    - register ranges
    - syntax errors in ranges
2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
45fe858503 Add tests for case changing operations
Add tests for the following commands:
- gu, gU, g~ in normal mode
- u, U, ~ in visual mode
2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
0cc06ad186 Move ChangeActionTest.doTest() to VimTestCase.
This method is convenient in other tests as well.
2014-12-12 23:05:28 +02:00
Tuomas Tynkkynen
18cd7547ad VIM-210 Fix focus issues with the Ex panel
Previously, if the editor window had been splitted, under certain
conditions some actions related to the Ex panel would cause the editor
focus to change to a different split.

The required conditions for this bug to occur:
    - no docked windows (like the Project sidebar) are open
    - 'View -> Navigation bar' is disabled

At least these actions triggered the bug:
    - search with /
    - successfully executing an Ex command
    - dismissing the Ex window with Esc
    - Ex commands that opened the output panel (e.g. :!)

All the deleted lines of the form
    FileEditorManager.getInstance(project).openFile(vf, true);
seem to be very old, non-functional workarounds for the focus issue.
2014-12-09 13:36:03 +02:00
Tuomas Tynkkynen
7746a26062 VIM-855 Fix regexp character class bugs
Previously strchr and istrchr didn't consider NUL chars as end-of-string
terminators. This caused problems in regexps using character classes:
a regexp like "[^a]bc" would be effectively treated as "[^abc]bc" - i.e.
some literal characters from the rest of the pattern would accidentally be
included in the character class.
2014-12-09 01:01:53 +02:00
Andrey Vlasovskikh
a47fc9d3be Don't share editor data contexts
The previous code threw "cannot share data context between Swing events"
throwables from DataManagerImpl$MyDataContext.getData since we used to
share DataContext objects passed to
VimShortcutKeyAction.actionPerformed() and
VimTypedActionHandler.execute() inside AnActionEvent objects with
runnables we invoked via SwingUtilities.invokeLater().
2014-12-07 18:40:51 +03:00
Andrey Vlasovskikh
8fdf75330c Updated changelog 2014-12-07 16:43:52 +03:00
Andrey Vlasovskikh
d6ebaa26b0 Merge branch 'invoke-shortcuts-handler-later' 2014-12-07 16:42:31 +03:00
Andrey Vlasovskikh
27bd7ec836 Merge remote-tracking branch 'dezgeg/fixes/misc-issues' 2014-12-07 16:28:15 +03:00
Andrey Vlasovskikh
6752058922 Version 0.39 2014-12-03 16:07:30 +03:00
Andrey Vlasovskikh
b965108dad Updated changelog 2014-12-03 16:06:20 +03:00
Andrey Vlasovskikh
6bf0f36567 Merge remote-tracking branch 'dezgeg/fixes/vim-702-fix-substitute-infinite-loop' 2014-12-03 15:59:43 +03:00
Andrey Vlasovskikh
69f1a70968 VIM-848 Show line numbers if they are enabled in the settings and there is no 'set number' 2014-12-03 15:42:59 +03:00
Tuomas Tynkkynen
47edfcac5e VIM-702 Fix infinite loop on s/$/\r/g
If the replacement contains newlines, the line number of the current
search position needs to be adjusted. Without this, e.g. s/$/\r/g would
get into an infinite loop.
2014-12-03 14:00:31 +02:00
Andrey Vlasovskikh
c34599b954 Updated the changelog 2014-12-01 16:03:12 +03:00
Andrey Vlasovskikh
48b371c985 Don't show line numbers in non-file editors 2014-12-01 15:54:48 +03:00
Andrey Vlasovskikh
47165e7b9d EA-63002 Don't update line numbers in the caret movement event listener
This update may require moving the caret.
2014-12-01 15:54:31 +03:00
Andrey Vlasovskikh
69f4611552 Version 0.38 2014-12-01 14:01:25 +03:00
Andrey Vlasovskikh
31a25449a8 Updated the changelist 2014-12-01 13:59:34 +03:00
Andrey Vlasovskikh
26a247c0bf Revert "Unified tests initialization for IntelliJ 13+ Community and Ultimate"
This reverts commit 296ef1bdf9.
2014-11-28 22:29:15 +03:00
Andrey Vlasovskikh
1c7cd23475 Updated IntelliJ version 2014-11-28 21:44:37 +03:00
Andrey Vlasovskikh
296ef1bdf9 Unified tests initialization for IntelliJ 13+ Community and Ultimate 2014-11-28 20:22:43 +03:00
Andrey Vlasovskikh
f2a0408801 VIM-586 Try to invoke Vim shortcuts handler later to restore input events sequence 2014-11-27 15:09:06 +03:00
Andrey Vlasovskikh
642659bc9b VIM-410 Use the standard editor line numbers for supporting 'nu'
Annotations-based line numbers reset all other annotations on caret
move, so the results of VCS annotate are reset all the time. It is
necessary for 'rnu', but for 'nu' we can use standard editor line
numbers and preserve the ability to show VCS annotations during caret
movement operations.
2014-11-26 19:49:09 +03:00
Andrey Vlasovskikh
f0e8d065b7 Merge remote-tracking branch 'dezgeg/fixes/vim-723-paste-wrong-line' 2014-11-26 18:18:54 +03:00
Andrey Vlasovskikh
520d852c04 Merge remote-tracking branch 'dezgeg/fixes/vim-771-repeated-semicolon' 2014-11-26 18:12:14 +03:00
Andrey Vlasovskikh
8d4d7a421a Merge remote-tracking branch 'dezgeg/fixes/crashes' 2014-11-26 17:58:27 +03:00
Andrey Vlasovskikh
802b83b0fe VIM-818 Enable key repeat on Mac OS X every time it gets reset by the OS 2014-11-26 17:21:18 +03:00
Tuomas Tynkkynen
7ccb6c8411 Optimize character case changing operations
Previously, performing e.g. visual '~' on a large file would completely
lock up the IDE. The culprit seemed to be the calls to replaceText() one
character at a time, which is not a cheap operation since each
replaceText() will for example trigger a DocumentChanged event.
2014-11-22 13:15:15 +02:00
Tuomas Tynkkynen
1518831f37 Add some missing key names. 2014-11-22 13:15:15 +02:00
Tuomas Tynkkynen
3bdfaa02e1 'J' shouldn't add whitespace if there is trailing whitespace 2014-11-22 13:15:11 +02:00
Tuomas Tynkkynen
e8de9f915c Make '>' not add trailing whitespace to empty lines. 2014-11-22 13:14:23 +02:00
Tuomas Tynkkynen
31f598d1e1 VIM-723 Fix pasting to an empty line
When pasting on an empty line, the pasted text would go to the start of
next line instead.
2014-11-17 03:47:50 +02:00
Tuomas Tynkkynen
46e6fd0847 VIM-771 Fix semicolon repeat for 'till char' motion
Based on empirical testing with Vim, ';' should work like this:
assuming "<caret>1:a 2:b 3:c" with ':' as the last f/t character:

- "t:" does nothing
- ";"  cursor goes to '2'
- "2;" cursor goes to '2', same as the previous
- "3;" cursor goes to '3'
2014-11-16 18:58:56 +02:00
Tuomas Tynkkynen
1441a60f4b Fix AIOOBE when '(' motion goes past start of file
If first character of the file is a newline, then findSentenceEnd()
could return -2 when the 'previous sentence' motion is performed,
leading to an eventual crash. Found by fuzzing.
2014-11-16 17:08:47 +02:00
Tuomas Tynkkynen
ebdf107946 Fix AIOOBE crash when using 'b' on first line
If 'b' were used on the first word of the file, and the word was
preceded by whitespace, ArrayIndexOutOfBoundsException would occur.
Found by fuzzing.
2014-11-16 17:08:47 +02:00
Tuomas Tynkkynen
38d672c9f9 Fix KeyHandler crash when using '<' or '>'
The '<' and '>' commands weren't marked with FLAG_OP_PEND even though
they should, which sometimes caused EmptyStackException in KeyHandler
(when typing <I<><I<> for example). Found by fuzzing.
2014-11-16 17:08:46 +02:00
Tuomas Tynkkynen
75d34abd45 Fix IOOBE when 'i)' motion doesn't find other delimiter
Found by fuzzing.
2014-11-16 17:08:43 +02:00
Andrey Vlasovskikh
1d98738e4d Updated the changelog 2014-11-15 00:11:35 +03:00
Andrey Vlasovskikh
3cfa0e1844 Merge remote-tracking branch 'dezgeg/fixes/vim-515-cW-command' 2014-11-15 00:09:00 +03:00
Andrey Vlasovskikh
82211a4373 Updated the changelog 2014-11-15 00:08:32 +03:00
Andrey Vlasovskikh
e324b04a94 Added Tuomas Tynkkynen to the list of contributors 2014-11-15 00:02:09 +03:00
Andrey Vlasovskikh
49d0c51d97 Merge branch 'vim-536-cc-second-to-last-line' 2014-11-15 00:00:43 +03:00
Andrey Vlasovskikh
fe4bc3b4a9 Moved line line position calculation before deletion 2014-11-15 00:00:13 +03:00
Tuomas Tynkkynen
58d964063c VIM-515 Fix cW command detecting end-of-word incorrectly
A cW command on text like 'x$$$$' or '$xxxx' would incorrectly delete
just the first character, and not the rest.
2014-11-14 22:51:46 +02:00
Andrey Vlasovskikh
17d3e37e1d Merge branch 'vim-567-run-external-command-in-window' 2014-11-14 23:43:42 +03:00
Andrey Vlasovskikh
54f6a16bd6 Nullity checks 2014-11-14 23:41:17 +03:00
Andrey Vlasovskikh
f4ffc5d198 Get rid of Reader and Writer classes in executeCommand() 2014-11-14 23:35:27 +03:00
Andrey Vlasovskikh
3d8010bf88 Removed debug output 2014-11-14 23:18:53 +03:00
Andrey Vlasovskikh
ec2cc3a7f9 Code style 2014-11-14 23:17:50 +03:00
Andrey Vlasovskikh
52b7b9bcd8 Merge branch 'vim-705-multi-line-indent-broken' 2014-11-14 23:05:03 +03:00
Andrey Vlasovskikh
8ad0fcf42d Default value for @NotNull field mode 2014-11-14 23:04:33 +03:00
Andrey Vlasovskikh
aa6cc45988 Made moveCaret(Editor, int, boolean) private 2014-11-14 23:02:32 +03:00
Tuomas Tynkkynen
da22b8297b VIM-536 Fix 'cc' on second-to-last line in file
Previously, 'cc' on the second-to-last line of a file would instead open
a new line after the last line of the file.
2014-11-14 16:56:05 +02:00
Tuomas Tynkkynen
798d82e941 VIM-567 Extend :! to allow running non-filter commands
This commit allows the Ex command '!' to be ran without a range, with
the results displayed in a window.

For example, run ':! ls' in normal mode for a quick directory listing.
2014-11-11 20:32:24 +02:00
Tuomas Tynkkynen
ac8ac302ca VIM-705 Fix repeated multiline indent
When a visual mode command is repeated, code calls into
MotionGroup#toggleVisual() to setup a 'fake' visual mode selection. But
when MotionGroup.moveCaret() is called, it notices that the indent
command has the FLAG_EXIT_VISUAL flag, and leaves visual mode right
away.
2014-11-10 23:32:09 +02:00
Tuomas Tynkkynen
22c3a73102 VIM-613 Fix repeat after 'd$'
Previously, repeating a 'd$' command would incorrectly delete the
newline from the line.
2014-11-10 16:36:40 +02:00
Andrey Vlasovskikh
1222fdb043 Merge pull request #47 from TylerNHansen/master
Update README.md - typo fix
2014-10-29 22:43:24 +03:00
Tyler Hansen
78a50c2f53 Update README.md 2014-10-29 12:19:13 -07:00
Andrey Vlasovskikh
6d261a7afa Merge pull request #46 from Baldrs/patch-1
Typo
2014-10-24 18:41:40 +04:00
Baldrs
2e37292478 Typo 2014-10-24 17:40:34 +03:00
Andrey Vlasovskikh
a4907ec9c8 Links to GitHub and YouTrack in the plugin info 2014-10-24 16:41:00 +04:00
Andrey Vlasovskikh
992bfe73b6 Updated changes in plugin.xml 2014-10-24 16:37:29 +04:00
Andrey Vlasovskikh
c186254a7e Updated dev version 2014-10-24 16:36:21 +04:00
Andrey Vlasovskikh
1dc739f32c Added :action and :actionlist to the docs 2014-10-24 16:35:56 +04:00
Andrey Vlasovskikh
9804cd83a6 VIM-652 Added a test for :action 2014-10-24 16:13:40 +04:00
Andrey Vlasovskikh
aa5b99c47a Added smartbomb to the list of contributors 2014-10-24 16:04:57 +04:00
Andrey Vlasovskikh
f95f5e8901 Merge branch 'action-command' 2014-10-24 16:02:21 +04:00
Andrey Vlasovskikh
206b303407 Renamed ExecuteActionByNameHandler to ActionHandler
The name of an Ex command handler should correspond to the Ex command
name.
2014-10-24 16:01:38 +04:00
Andrey Vlasovskikh
751bff53ee Removed checks for action execution problems not reproducible at the moment
We need to collect more data from the beta testers about these problems.
2014-10-24 16:00:23 +04:00
Andrey Vlasovskikh
b6ef0c509d We don't need two Alexeys at the moment 2014-10-23 22:47:41 +04:00
Andrey Vlasovskikh
30304d6836 VIM-794 Fixed NCDFE related to 'number' in IDEs other than IntelliJ 2014-10-23 22:45:19 +04:00
Andrey Vlasovskikh
f5df49b139 Don't allow short names for IdeaVim-specific :action and :actionlist 2014-10-23 19:01:58 +04:00
Andrey Vlasovskikh
bf8ba1a49b Prettier output of :actionlist 2014-10-23 18:58:50 +04:00
Andrey Vlasovskikh
9f2697658b Fixed code style 2014-10-23 18:25:01 +04:00
smartbomb
36fd59b92c ExecuteActionByName use the content context on actions with the EnabledInModalContext flag set
(cherry picked from commit d375740)
2014-10-23 18:02:12 +04:00
Andrey Vlasovskikh
88d946546a Added Alexey Shmalko to the list of contributors 2014-10-23 17:30:06 +04:00
Andrey Vlasovskikh
6036c0c262 Updated CHANGES 2014-10-23 16:59:41 +04:00
Andrey Vlasovskikh
20e831b56a Updated tests after fixing VIM-501 2014-10-23 16:58:43 +04:00
Andrey Vlasovskikh
72b74e075c Merge branch 'visual_block_delete' 2014-10-23 16:55:17 +04:00
Andrey Vlasovskikh
3c6ede2f8f Normalize offsets in order to prevent selecting newlines 2014-10-23 16:53:31 +04:00
Andrey Vlasovskikh
5434edbd54 VIM-792 Fixed line-wise and block-wise paste commands for * and + registers 2014-10-23 16:09:56 +04:00
Andrey Vlasovskikh
6a8c7e4b17 VIM-511 Record caret adjustment changes to the document during <Enter> processing
We have to handle Enter by our VimShortcutKeyAction in order to be
able to record it as an action for repeating it via '.'. Since original
Enter handlers are not run in this case we invoke them manually by
collecting a list of actions that can be run for the editor component
on Enter and then running the first action ready to run.

Caret adjustments are detected on changes to the document caused by
Enter. This allows to position the caret properly (e.g. between {})
before recording Enter.
2014-10-23 15:26:22 +04:00
Alexey Shmalko
0ac659f2d1 Fix visual block deleting
Currently deleting visual block leaves last char in line untouched. This
patch fixes that as well as tests.
2014-10-21 21:40:43 +03:00
Tony Kay
7eae40ca9a added a failing test 2014-10-21 11:05:43 -07:00
Andrey Vlasovskikh
b3d12c8b58 VIM-511 Fixed removing a paren just after inserting it with auto-inserting matching parens on 2014-10-21 21:47:06 +04:00
Andrey Vlasovskikh
3f92dba1b7 VIM-511 Updated test data 2014-10-21 21:16:11 +04:00
Andrey Vlasovskikh
0aedc08cfa More tests for VIM-511 2014-10-21 20:42:04 +04:00
Andrey Vlasovskikh
8312f5cffd VIM-511 Added a test for repeating a change that includes auto-inserted parens and quotes 2014-10-21 19:41:11 +04:00
Andrey Vlasovskikh
9f6338441e Updated CHANGES 2014-10-21 19:09:56 +04:00
Andrey Vlasovskikh
27efe0c9d6 Handle left and right motions during key repeat only as document (caret) changes
Previously they have been recorded twice: implicitly by a document
change listener as changes to the caret position and by a command
processor.
2014-10-21 18:24:36 +04:00
Andrey Vlasovskikh
b5bf6c08d8 Repeat typing commands by inserting text instead of handling a typed key
It will prevent auto-completion and other auto-inserting typed key
handlers from messing up with the repeated text.
2014-10-21 18:22:19 +04:00
Andrey Vlasovskikh
e3fce51ea1 VIM-511 Fixed editing offset after <BS> for '.' command 2014-10-21 16:56:54 +04:00
Andrey Vlasovskikh
13b4e93bf4 Run the test only if the system clipboard is available 2014-10-20 16:53:25 +04:00
Andrey Vlasovskikh
4ec0ab281f Removed the list of compatible IDEs
The same list is shown on the plugin's page and duplicated in the
README.
2014-10-20 16:09:32 +04:00
Andrey Vlasovskikh
39c96019b6 Typo 2014-10-20 16:08:29 +04:00
Andrey Vlasovskikh
21f2f60355 Updated CHANGES 2014-10-20 16:07:50 +04:00
Andrey Vlasovskikh
0de654dcaf Added Thomas B Homburg to the list of contributors 2014-10-20 16:02:11 +04:00
Andrey Vlasovskikh
d59e472814 Added 'clipboard' to the list of :set commands 2014-10-20 16:01:09 +04:00
Andrey Vlasovskikh
cc2ed452f0 Merge branch 'clipboard-unnamed'
Conflicts:
	src/com/maddyhome/idea/vim/option/Options.java
	test/org/jetbrains/plugins/ideavim/action/CopyActionTest.java
2014-10-20 15:59:15 +04:00
Andrey Vlasovskikh
d4d3843725 VIM-476 Added default register reset on 'clipboard' change
Added a test for :set clipboard=unnamed.
2014-10-20 15:53:33 +04:00
Andrey Vlasovskikh
dee16da1c2 Coding style 2014-10-20 14:52:22 +04:00
Andrey Vlasovskikh
e09b85870f Added Jaime Sanchez to the list of contributors 2014-10-20 13:27:31 +04:00
Andrey Vlasovskikh
8596911a0e VIM-483 VIM-410 Added support for 'number' and 'relativenumber' commands
These commands override the line numbers setting in the IDE when the
Vim emulation is enabled.
2014-10-20 13:27:09 +04:00
Andrey Vlasovskikh
6c2de9f151 Extracted EditorGroup 2014-10-17 17:07:39 +04:00
Andrey Vlasovskikh
d3a6b1e39e Use '\n' as universal line separator for sorting lines
The Document class takes care of detecting and using the correct
platform-specific line separators.
2014-10-17 14:54:48 +04:00
Andrey Vlasovskikh
3cb9b19aea Added Chang Wang to the list of contributors 2014-10-16 23:32:42 +04:00
Andrey Vlasovskikh
86aa59bb29 Merge branch 'vim-624' 2014-10-16 23:29:33 +04:00
smartbomb
c6eeaed7da :actionlist added support for wildcards 2014-10-15 22:49:08 +02:00
smartbomb
edba90f188 Renamed :findaction => :actionlist + added statusbar error message when calling invalid action names 2014-10-15 21:17:26 +02:00
Andrey Vlasovskikh
26b49b1a0c Made the description shorter 2014-10-15 15:22:40 +04:00
Andrey Vlasovskikh
ef32648ddc Bumped version to 0.37 2014-10-15 15:17:42 +04:00
Andrey Vlasovskikh
c873524cb1 VIM-784 Fixed visual line selection where start > end of the selection range
It was a regression introduced by the fix of VIM-632.
2014-10-15 15:10:22 +04:00
smartbomb
7943e34bde Fix action execution contexts, use a delay on popup actions to allow the command handler to unwind 2014-10-15 08:31:44 +02:00
smartbomb
74970c74b4 Implemented :findaction 2014-10-14 22:47:03 +02:00
Andrey Vlasovskikh
2d11561041 Added Andrew Brookins to the list of contributors 2014-10-14 15:28:23 +04:00
Andrey Vlasovskikh
f7643b6bb3 Updated changelist 2014-10-14 15:28:07 +04:00
Andrey Vlasovskikh
d3afd83e8e Merge branch 'VIM-407' 2014-10-14 15:25:43 +04:00
Andrey Vlasovskikh
969ca0119a Bumped version to 0.36 2014-10-14 14:22:38 +04:00
smartbomb
722431f5b2 VIM-652 Add support for executing and mapping arbitrary IDEA actions
* no tests performed..! *

Example usage:
:nnoremap gi :action GotoImplementation<CR>
:nnoremap gu :action FindUsages<CR>
:nnoremap gcw :action RenameElement<CR>

Action overview:
6c6cb47c5a/platform/platform-resources-en/src/messages/ActionsBundle.properties
2014-10-13 21:58:38 +02:00
Andrey Vlasovskikh
6a1c792cda VIM-171 Added support for window navigation commands: left/right/up/down 2014-10-13 23:08:56 +04:00
Andrey Vlasovskikh
c0ba39ab40 Use multi-caret API available from branches 135+ 2014-10-09 18:33:07 +04:00
Andrey Vlasovskikh
3e0e08c5e1 VIM-632 Restored visual block mode that was broken due to multiple carets support
Vim actions with multiple carets in modes other than visual block are
not supported yet. It will be a separate feature. The idea behind this
commit is to fix the regression in visual block mode.

Bounds of visual selection are no longer reversed if they are
overlapped, this fixes expanding the block selection in all directions.

IdeaVim no longer uses SelectionModel.hasBlockSelection() since it
always returns 'true' now.

There are a couple of places where we remove secondary carets when
moving the primary caret or re-setting visual mode. It may be
incompatible with the forthcoming support for multi-caret Vim actions.
2014-10-09 18:01:47 +04:00
Andrey Vlasovskikh
3d64373c22 Updated the changelog 2014-10-07 15:24:45 +04:00
Andrey Vlasovskikh
2557688657 Added Alexey Shmalko to the list of contributors 2014-10-07 15:11:55 +04:00
Andrey Vlasovskikh
fcc564df25 Cleanup 2014-10-07 14:29:30 +04:00
Andrey Vlasovskikh
4ecbb93d01 Converted window actions into subclasses of VimCommandAction 2014-10-07 13:52:46 +04:00
Alexey Shmalko
9bdc9b3634 VIM-171 Add checks for that window is not null 2014-10-04 01:29:41 +03:00
Alexey Shmalko
f46c3b0aa9 VIM-171 Add support for window cycling
Adds following keystrokes:
<C-W>w <C-W><C-W> next window
<C-W>W            previous window

With number both commands go to window with specified index.
2014-10-04 00:52:24 +03:00
Alexey Shmalko
095fdf07c5 VIM-171 Add support for closing all windows except current
Adds <C-W>o, <C-W><C-O> keystrokes.
2014-10-04 00:02:15 +03:00
Alexey Shmalko
648e988b64 VIM-171 Add support for closing window
Adds <C-W>c keystroke.
2014-10-03 23:41:53 +03:00
Alexey Shmalko
b1add735d6 Add split action
This patch adds following keystrokes:
<C-W>s <C-W>S <C-W><C-S> horizontal split
<C-W>v <C-W><C-V>        vertical split
2014-10-02 20:52:13 +03:00
Andrey Vlasovskikh
3f5882118e Compatibility with builds 133+ / IntelliJ 13+ 2014-09-10 15:03:01 +04:00
Andrey Vlasovskikh
4e83f56696 Merge branch 'vim-265'
Conflicts:
	AUTHORS.md
2014-09-10 13:58:29 +04:00
Andrey Vlasovskikh
ab250f1d9c Added salaam to the list of contributors 2014-09-10 13:57:40 +04:00
Andrey Vlasovskikh
4672dece51 VIM-770 Close the current tab on :quit instead of all tabs with the current file 2014-09-10 13:52:00 +04:00
Andrey Vlasovskikh
a632de9214 Cleanup 2014-09-09 18:30:21 +04:00
Andrey Vlasovskikh
e8ebba8b3d Removed unused declarations 2014-09-09 18:25:45 +04:00
Andrey Vlasovskikh
5cf8181474 Added Dathan Bennett to the list of contributors 2014-09-09 00:38:42 +04:00
Andrey Vlasovskikh
a717e4785d VIM-569 Fixed <C-W> when the caret is at the end of a line 2014-09-09 00:36:39 +04:00
Dathan Bennett
16ce16c632 Add test for VIM-569 fix 2014-09-06 02:59:49 -07:00
Dathan Bennett
8d7bf2661a Set isChange to true when calling deleteRange from ctrl-w handler 2014-09-06 01:07:03 -07:00
salaam
9e1b026a88 VIM-265 Add window split commands
Conflicts:
	src/com/maddyhome/idea/vim/VimPlugin.java
	src/com/maddyhome/idea/vim/ex/CommandParser.java
2014-08-31 23:57:22 -05:00
Thomas B Homburg
df8e455a6d Get default register from clipboard=unnamed setting 2014-08-26 22:51:17 +02:00
Chang Wang
b35bec2839 deselect visual selection range '<,'> when poping up ex entry field. 2014-08-13 16:40:50 -07:00
Andrew Brookins
19365effa9 VIM-407 Add tests. Only skip the ending line if it is empty.
Conflicts:
	src/com/maddyhome/idea/vim/group/ChangeGroup.java
	test/org/jetbrains/plugins/ideavim/action/ShiftRightLinesActionTest.java
2014-05-22 22:04:14 -07:00
Andrey Vlasovskikh
3750417323 Bumped version to 0.35 2014-05-15 15:09:02 +04:00
Andrey Vlasovskikh
d7bfb1ff10 Updated CHANGES 2014-05-15 15:04:12 +04:00
Andrey Vlasovskikh
1797771527 Added configuration via ~/.ideavimrc to the list of plugin features 2014-05-15 14:58:40 +04:00
Andrey Vlasovskikh
e564eb5878 VIM-213 Use '< and '> marks for saving and restoring last visual selection 2014-05-15 02:49:50 +04:00
Andrey Vlasovskikh
9cd620af58 VIM-646 Don't update visual selection if command moves caret and exits visual mode 2014-05-12 21:50:50 +04:00
Andrey Vlasovskikh
1414ef8a4f Removed check for unused FLAG_KEEP_VISUAL flag 2014-05-12 20:06:46 +04:00
Andrey Vlasovskikh
110623f6ef Moved StringHelper.parseKeysSet() to VimCommandAction 2014-05-12 20:04:32 +04:00
Andrey Vlasovskikh
0887c72486 Updated index docs for all the visual mode commands 2014-05-12 20:00:17 +04:00
Andrey Vlasovskikh
a516fd880e Made visual-only mode actions VimCommandActions 2014-05-12 19:28:24 +04:00
Andrey Vlasovskikh
50e15112d6 Use SelectionType in VisualRange instead of SubMode 2014-05-08 17:40:04 +04:00
Andrey Vlasovskikh
8b6f99385a Code style 2014-05-08 17:31:38 +04:00
Andrey Vlasovskikh
2d1b40f00c Added tests for 'gv' and 'o' in visual mode 2014-05-08 16:59:11 +04:00
Andrey Vlasovskikh
2fc2f30055 Removed debug output 2014-05-08 15:49:21 +04:00
Andrey Vlasovskikh
2094a19723 Extracted MarkGroup.setVisualSelectionMarks() 2014-05-08 02:02:38 +04:00
Andrey Vlasovskikh
5b1416424d VisualSelectPreviousAction is a VimCommandAction 2014-05-08 00:43:40 +04:00
Andrey Vlasovskikh
8b9e737c05 Fixed potential NPEs 2014-05-07 22:36:37 +04:00
Andrey Vlasovskikh
cc0f4acec6 Replaced StringBuilder with string concatenation 2014-05-07 22:36:26 +04:00
Andrey Vlasovskikh
30884162a0 Nullity annotations 2014-05-07 22:28:42 +04:00
Andrey Vlasovskikh
f1e7a8c444 Removed unused code 2014-05-07 22:22:24 +04:00
Andrey Vlasovskikh
3271939c87 Simplified conditions 2014-05-07 22:20:00 +04:00
Andrey Vlasovskikh
c9cb487cbc Replaced StringBuilder with string concatenation where possible 2014-05-07 22:17:37 +04:00
Andrey Vlasovskikh
56f6b69adf Use Collections.addAll() 2014-05-07 22:16:42 +04:00
Andrey Vlasovskikh
77dcee1269 Use foreach loop 2014-05-07 22:15:50 +04:00
Andrey Vlasovskikh
c9068ee4d1 Replaced StringBuffer with StringBuilder 2014-05-07 22:15:25 +04:00
Andrey Vlasovskikh
e7addf7fa8 Added 'final' modifiers for fields where possible 2014-05-07 22:12:47 +04:00
Andrey Vlasovskikh
7cc0a8db92 Inlined constant arguments 2014-05-07 22:05:40 +04:00
Andrey Vlasovskikh
bccb62a84f Inlined redundant local variables 2014-05-07 21:55:13 +04:00
Andrey Vlasovskikh
d47570664b Simplified conditions 2014-05-07 21:53:55 +04:00
Andrey Vlasovskikh
a7137558cc Removed unnecessary semicolons 2014-05-07 21:52:38 +04:00
Andrey Vlasovskikh
0251c5a33d Made constants final 2014-05-07 21:52:11 +04:00
Andrey Vlasovskikh
365722ef7e Removed redundant casts 2014-05-07 21:50:17 +04:00
Andrey Vlasovskikh
77e0c30e57 Removed unused assignments and empty conditions 2014-05-07 21:49:29 +04:00
Andrey Vlasovskikh
8a0cad765a Fixed potential NPEs 2014-05-07 21:38:21 +04:00
Andrey Vlasovskikh
272378b800 Fixed typos and dropped commented code 2014-05-07 21:00:16 +04:00
Andrey Vlasovskikh
a34d17ff95 Fixed potential NPEs 2014-05-07 20:46:40 +04:00
Andrey Vlasovskikh
82c782e9f0 Cleanup 2014-05-07 19:40:55 +04:00
Andrey Vlasovskikh
b7b46d2fee Removed unused code 2014-05-07 19:25:30 +04:00
Andrey Vlasovskikh
8916f0f314 Extracted more EventFacade methods 2014-05-06 20:32:42 +04:00
Andrey Vlasovskikh
8d727ef508 Extracted EventFacade.(un)registerCustomShortcutSet() 2014-05-06 19:44:35 +04:00
Andrey Vlasovskikh
fd0be10492 Extracted EventFacade.addEditorFactoryListener() 2014-05-06 19:33:35 +04:00
Andrey Vlasovskikh
a810f95101 Extracted EventFacade.*DocumentListener() 2014-05-06 19:26:36 +04:00
Andrey Vlasovskikh
8857545cf0 Introduced EventFacade for subscribing to IDE events 2014-05-06 19:18:47 +04:00
Andrey Vlasovskikh
2300c0005f Inferred nullity annotations 2014-05-06 18:32:55 +04:00
Andrey Vlasovskikh
827b91286f Removed unused DelegateCommandListener
There are no more actions marked with Command.FLAG_DELEGATE.
2014-05-06 18:04:38 +04:00
Andrey Vlasovskikh
4d8e35655d Extracted and inlined some variables 2014-05-06 17:34:53 +04:00
Andrey Vlasovskikh
f7e6ae9f3c Removed unused code 2014-05-06 17:15:34 +04:00
Andrey Vlasovskikh
67679843b4 Moved getShortcutKeyAction() to VimShortcutKeyAction.getInstance() 2014-05-06 17:09:12 +04:00
Andrey Vlasovskikh
b67b072be2 Updated CHANGES 2014-05-06 15:35:03 +04:00
Andrey Vlasovskikh
d6896e4e76 VIM-690 Read initialization commands only from ~/.ideavimrc 2014-05-06 15:20:40 +04:00
Andrey Vlasovskikh
f86c24a695 VIM-683 Allow Ctrl+PgUp/PgDown to be used outside of Vim emulation 2014-05-06 14:56:10 +04:00
Andrey Vlasovskikh
b200c842b4 VIM-679 Allow \u000D\u000C as <CR> in mappings 2014-05-05 21:26:35 +04:00
Andrey Vlasovskikh
c8df52a86c VIM-679 Allow \u0016 as an escape character for '|' in mappings 2014-05-05 20:51:39 +04:00
Andrey Vlasovskikh
b17a592c95 VIM-679 Parse characters less than \u0020 as <C-$CHAR> 2014-05-05 20:40:14 +04:00
Andrey Vlasovskikh
f71d6c7fab VIM-679 Don't trim whitespace-like characters from command arguments
Characters like '\u0018' may appear in mapping commands.
2014-04-30 21:08:16 +04:00
Andrey Vlasovskikh
30cfae91c0 Removed StringHelper.escape() in favor of updated toKeyNotation() 2014-04-30 20:10:33 +04:00
Andrey Vlasovskikh
5332128852 Extracted toEscapeNotation() 2014-04-30 19:39:04 +04:00
Andrey Vlasovskikh
b593d90dff VIM-676 Handle control characters in .vimrc as pressed, not typed keystrokes 2014-04-30 18:46:45 +04:00
Andrey Vlasovskikh
02fac3b931 Extracted executeText() 2014-04-30 17:36:18 +04:00
Andrey Vlasovskikh
446ffc3602 Bumped version to 0.34 2014-04-29 21:54:49 +04:00
Andrey Vlasovskikh
44c1a2e139 Mentioned .ideavimrc in keymap update message 2014-04-29 21:53:49 +04:00
Andrey Vlasovskikh
f6cb04c7ef VIM-674 Don't handle <Tab> in Insert mode in Vim emulation
It breaks several IDE actions that provide their own <Tab> handlers
like Emmet or parameters completion in RubyMine and AppCode.
2014-04-29 21:13:35 +04:00
Andrey Vlasovskikh
276755ae9d Typo 2014-04-29 20:33:25 +04:00
Andrey Vlasovskikh
6ee0b821cc VIM-672 Ignore mappings that contain <Plug> and <SID>
These mappings don't make sense to Vim emulation in IdeaVim.
2014-04-29 19:39:58 +04:00
Andrey Vlasovskikh
72dc121fcd VIM-670 First character of a recursive mapping shouldn't be mapped again
The mapping's "from" keys should be a prefix of "to" keys.
2014-04-29 17:22:25 +04:00
Andrey Vlasovskikh
786c4dc817 VIM-666 Support <Bar> in Vim key notation 2014-04-29 16:47:47 +04:00
Andrey Vlasovskikh
c7cfbaed0a Extracted Vim typed special keys map 2014-04-29 16:46:59 +04:00
Andrey Vlasovskikh
4351d5c366 VIM-666 Ignore characters after '|' in :map commands
Perhaps it should become a part of command parsing, since it is
possible to put several command on one line.
2014-04-29 16:40:28 +04:00
Andrey Vlasovskikh
ff3795798f Added notes about keyboard shortcut conflicts and .vimrc files 2014-04-29 14:37:16 +04:00
Andrey Vlasovskikh
45281adfd9 VIM-667 Ignore potentially nested lines of .vimrc based on leading whitespace 2014-04-29 14:28:35 +04:00
Andrey Vlasovskikh
0d813afc67 Don't show message about not using "Vim" keymap any longer in new installations 2014-04-29 14:09:18 +04:00
Andrey Vlasovskikh
e9e5c77cd3 VIM-661 Apply Operator pending and Visual mode mappings only at command start 2014-04-28 17:23:45 +04:00
Andrey Vlasovskikh
4d4bcbb365 Updated CHANGES 2014-04-28 16:05:02 +04:00
Andrey Vlasovskikh
bd5a2976fd Bumped version to 0.33 2014-04-28 16:02:34 +04:00
Andrey Vlasovskikh
cc6488ee2d Added a hyperlink for setting the IDE as a shortcut handler in case of conflicts 2014-04-28 15:57:57 +04:00
Andrey Vlasovskikh
52068198a5 VIM-665 Allow <C-C> in Insert mode when completion pop-up is active 2014-04-28 15:27:04 +04:00
Andrey Vlasovskikh
5cdcd9d4d4 Set up the vertical scroll bar on More panel in order to handle keys correctly 2014-04-25 18:06:43 +04:00
Andrey Vlasovskikh
fbeaa35d10 Use original Up/Down actions for non file-based editors 2014-04-25 17:18:08 +04:00
Andrey Vlasovskikh
1ac4bb38be Updated CHANGES 2014-04-25 16:45:27 +04:00
Andrey Vlasovskikh
69c2a096ab Updated CHANGES 2014-04-24 18:14:10 +04:00
Andrey Vlasovskikh
3dccf1b215 Nullity and immutability 2014-04-24 18:09:53 +04:00
Andrey Vlasovskikh
035cb02362 Local class name conventions 2014-04-24 18:03:46 +04:00
Andrey Vlasovskikh
43d33a4502 Immutable local variables where possible 2014-04-24 18:01:59 +04:00
Andrey Vlasovskikh
2b6e8dc566 Fixed nullity warnings 2014-04-24 17:47:59 +04:00
Andrey Vlasovskikh
6388cc0639 Added Alex Selesse to the list of contributors 2014-04-24 17:45:06 +04:00
Andrey Vlasovskikh
00bd6d2e3a Added |:sort| to index 2014-04-24 17:39:43 +04:00
Andrey Vlasovskikh
1f842b6d31 New IdeaVim API compatibility 2014-04-24 17:38:37 +04:00
Andrey Vlasovskikh
954d7bd14c Merge remote-tracking branch 'selesse/vim-439'
Conflicts:
	src/com/maddyhome/idea/vim/ex/CommandParser.java
2014-04-24 17:35:10 +04:00
Andrey Vlasovskikh
d358893579 Vim shortcuts handler is enabled for keys associated with IDE if there are no shortcut conflicts 2014-04-24 16:54:35 +04:00
Andrey Vlasovskikh
3cb40cb09d VIM-661 Apply Normal mode mappings only at command start 2014-04-23 20:44:06 +04:00
Andrey Vlasovskikh
a4a8faedbb Removed unused method 2014-04-22 19:47:48 +04:00
Andrey Vlasovskikh
c32fa2b53f VIM-648 Use default keymap if there is no previous keymap in config
Keymap upgrade message has been improved.
2014-04-22 19:40:07 +04:00
Andrey Vlasovskikh
1d0b1791c4 VIM-651 Parse <BS> as backspace 2014-04-22 17:59:49 +04:00
Andrey Vlasovskikh
7251c8976d Removed obsolete Vim help action for <F1> 2014-04-22 17:22:46 +04:00
Andrey Vlasovskikh
684531aaae VIM-665 Handle Shift-char as typed uppercase keystroke, not as pressed one 2014-04-22 17:16:09 +04:00
Andrey Vlasovskikh
4a1504f9e0 VIM-660 Handle <C-Space> as pressed keystroke, not typed one 2014-04-22 16:50:46 +04:00
Andrey Vlasovskikh
ee1a6bbbd9 Updated copyright headers 2014-04-08 00:43:51 +04:00
Andrey Vlasovskikh
52c86d8c27 VIM-645 Handle '<Space>' in key mappings as a typed key, not as a pressed shortcut 2014-04-08 00:25:14 +04:00
Andrey Vlasovskikh
07e59536f3 Updated link names 2014-04-07 20:15:50 +04:00
Andrey Vlasovskikh
63f31b9b01 Links to issues and docs, removed menu changes 2014-04-07 20:12:22 +04:00
Andrey Vlasovskikh
4b6bf1bb9f Markup for badges 2014-04-07 20:01:29 +04:00
Andrey Vlasovskikh
f03c202b46 TeamCity badges for builds and tests 2014-04-07 19:59:28 +04:00
Andrey Vlasovskikh
eb8a4a0e6a Use guest link for TeamCity builds 2014-04-07 19:53:07 +04:00
Andrey Vlasovskikh
c04b04f701 Mentioned key mappings support in README and CHANGES 2014-04-07 19:42:04 +04:00
Andrey Vlasovskikh
2a0833e3b5 Don't try to interpret '<script>' and '<expr>' key mappings 2014-04-06 03:52:39 +04:00
Andrey Vlasovskikh
6acc89331d Ignore special arguments of 'map' 2014-04-06 03:45:36 +04:00
Andrey Vlasovskikh
35afd9b92f Show all '<Enter>' equivalents as '<CR>' 2014-04-06 03:45:17 +04:00
Andrey Vlasovskikh
c16d83ceab Handle '<nop>' in mappings 2014-04-05 00:25:54 +04:00
Andrey Vlasovskikh
a7820f4fd0 More special keys of Vim '<>' notation 2014-04-05 00:15:11 +04:00
Andrey Vlasovskikh
12dd338914 Fixed parsing lowercase characters in keystrokes with modifiers 2014-04-04 23:51:58 +04:00
Andrey Vlasovskikh
720d552a21 Renamed VimrcParser and VimrcCommandHandler to VimScript* 2014-04-04 22:22:25 +04:00
Andrey Vlasovskikh
a0477f499b Added new ':source' command handler 2014-04-04 22:21:22 +04:00
Andrey Vlasovskikh
20a4639995 Show error messages after Ex exceptions where possible 2014-04-04 22:20:18 +04:00
Andrey Vlasovskikh
3d7a0e7917 Modify and re-register shortcut set required by Vim emulation after ':map' 2014-04-04 21:09:29 +04:00
Andrey Vlasovskikh
c9c1295001 Cleanup 2014-04-04 17:49:45 +04:00
Andrey Vlasovskikh
c93daf78f6 Unify ':map' and ':noremap' handlers 2014-04-04 17:35:59 +04:00
Andrey Vlasovskikh
c77812d2a8 Refactored MapHandler to be more declarative 2014-04-04 17:31:16 +04:00
Andrey Vlasovskikh
c7107b7ad7 Reuse MappingInfo for rows of key mapping table 2014-04-04 16:54:41 +04:00
Andrey Vlasovskikh
a9a28b259f Made MappingInfo comparable 2014-04-04 16:48:15 +04:00
Andrey Vlasovskikh
5f1a1d0aa0 Show non-recursive mapping status in the output of 'map' 2014-04-04 16:46:40 +04:00
Andrey Vlasovskikh
2f5dd3f2b1 'map!' is not supported yet 2014-04-04 16:36:06 +04:00
Andrey Vlasovskikh
779909bdeb Added support for 'noremap' commands 2014-04-04 16:35:11 +04:00
Andrey Vlasovskikh
e76bee2afa Add 'recursive' flag to key mapping info 2014-04-04 16:30:41 +04:00
Andrey Vlasovskikh
bb9d551dad Extracted logic from MapHandler to KeyGroup 2014-04-04 16:21:56 +04:00
Andrey Vlasovskikh
db6399f1c5 Added test for recursive key mapping 2014-04-04 15:39:20 +04:00
Andrey Vlasovskikh
32ee6be7f9 Fixed displaying 'map' NVO mapping code 2014-04-04 00:29:52 +04:00
Andrey Vlasovskikh
33a5dd9e1c Allow commands that start with ':' in .vimrc 2014-04-04 00:21:05 +04:00
Andrey Vlasovskikh
0c59182eb8 Show modes code for mappings 2014-04-04 00:15:57 +04:00
Andrey Vlasovskikh
391e14a05b Output sorted map results 2014-04-04 00:09:52 +04:00
Andrey Vlasovskikh
c3259faf42 Don't read .vimrc during unit testing 2014-04-03 23:45:31 +04:00
Andrey Vlasovskikh
f588e473a1 Use unit test friendly ExOutputModel instead of ExOutputPanel 2014-04-03 23:19:14 +04:00
Andrey Vlasovskikh
a076b4d71c Renamed MorePanel to ExOutputPanel 2014-04-03 22:58:45 +04:00
Andrey Vlasovskikh
4540c75498 Made MorePanel.activate() private 2014-04-03 22:52:42 +04:00
Andrey Vlasovskikh
239199462f Removed unnecessary MorePanel.isActive() check 2014-04-03 22:52:00 +04:00
Andrey Vlasovskikh
b703a7eabb Show MorePanel on every MorePanel.setText() instead of showing it explicitly after Ex commands 2014-04-03 22:49:54 +04:00
Andrey Vlasovskikh
3cafe72f8f Removed unused code 2014-04-03 22:29:57 +04:00
Andrey Vlasovskikh
48375c37de Removed unnecessary logging 2014-04-03 19:05:19 +04:00
Andrey Vlasovskikh
f9ceb506d7 Don't store editor's content component 2014-04-03 19:03:47 +04:00
Andrey Vlasovskikh
a7a054f4e4 Use EditorHelper.getScreenWidth() instead of MorePanel.getDisplayWidth() 2014-04-03 18:57:43 +04:00
Andrey Vlasovskikh
f8781353a2 Made MorePanel per-editor based 2014-04-03 17:41:22 +04:00
Andrey Vlasovskikh
b0760222f0 Cleanup 2014-04-03 17:12:09 +04:00
Andrey Vlasovskikh
66bcacc2c4 Show mappings in Ex output panel 2014-04-02 17:40:22 +04:00
Andrey Vlasovskikh
5868f8a2a5 Renamed pad() to rightJustify() 2014-04-02 13:41:06 +04:00
Andrey Vlasovskikh
8e54e24e03 Show not implemented message for show mappings command instead of an exception 2014-04-02 13:28:29 +04:00
Andrey Vlasovskikh
f511e6ea34 Set default editor font for Ex and More panels on every activation 2014-04-02 13:17:17 +04:00
Andrey Vlasovskikh
6c9608a9ee Prettier border for Ex entry panel 2014-04-02 13:07:20 +04:00
Andrey Vlasovskikh
4a0f95f0f0 Removed aliases 2014-04-02 12:55:01 +04:00
Andrey Vlasovskikh
e3e7bcffa0 Added more mapping commands for various modes 2014-04-02 12:54:15 +04:00
Andrey Vlasovskikh
9340208c2c Handle unknown special keys as simple key sequences 2014-04-02 02:12:08 +04:00
Andrey Vlasovskikh
a658b8d8bd Handle unfinished special keys as simple key sequences 2014-04-02 02:05:57 +04:00
Andrey Vlasovskikh
0b9946eaf9 Handle '\' at the end of the mapping as regular '\' 2014-04-02 01:55:35 +04:00
Andrey Vlasovskikh
6ea255f125 Reset key mappings for each test 2014-04-02 01:54:26 +04:00
Andrey Vlasovskikh
0225975e20 Backslash is an escape character only for '\' and '<' 2014-04-02 01:43:20 +04:00
Andrey Vlasovskikh
af406c7d14 Execute key mapping commands from .vimrc 2014-04-02 00:40:46 +04:00
Andrey Vlasovskikh
a146e2c303 Prevented sharing DataContext between Swing events 2014-04-02 00:40:02 +04:00
Andrey Vlasovskikh
f285051a9a Merge remote-tracking branch 'origin/map-commands' into map-commands 2014-04-02 00:29:20 +04:00
Andrey Vlasovskikh
936f7e5d7c Modularized .vimrc parsing a bit 2014-04-02 00:23:35 +04:00
Andrey Vlasovskikh
463c8defa4 Added 'timeoutlen' option 2014-04-01 17:15:50 +04:00
Andrey Vlasovskikh
19f0399f28 Added 'imap' to mapping commands table
It's now possible to try ':imap jj <Esc>' at runtime. Reading mappings
from .vimrc is not supported yet.
2014-04-01 00:42:43 +04:00
Andrey Vlasovskikh
05436427ee Very initial key mapping support 2014-04-01 00:20:13 +04:00
Andrey Vlasovskikh
2f6d4c9ff2 Spelling and naming conventions 2014-03-31 22:50:46 +04:00
Andrey Vlasovskikh
64790c531e Removed unused logging and debug info 2014-03-31 22:44:07 +04:00
Andrey Vlasovskikh
9c209d2fb2 Sorted methods and attributes 2014-03-31 22:42:25 +04:00
Andrey Vlasovskikh
8420ca355b Nullity annotations 2014-03-31 15:44:15 +04:00
Andrey Vlasovskikh
0aebcbd71e Nullity annotations for CommandHandler.execute() 2014-03-31 15:27:40 +04:00
Andrey Vlasovskikh
13528667c8 Moved command index to the root of the package 2014-03-31 14:27:02 +04:00
Andrey Vlasovskikh
3b3fa3a455 Split configureByText() and typeText() 2014-03-28 16:38:41 +04:00
Andrey Vlasovskikh
13d3d4e990 Unified running Ex commands in tests with the usual key handling 2014-03-28 16:30:06 +04:00
Andrey Vlasovskikh
b69d475e15 Removed legacy CDATA-based XML serializer 2014-03-26 18:48:08 +04:00
Andrey Vlasovskikh
b6f840aacb Use StringBuilder instead of StringBuffer 2014-03-26 18:45:56 +04:00
Andrey Vlasovskikh
ea454d3c07 Use parseKeys() instead of stringToKeys() in tests 2014-03-26 18:44:57 +04:00
Andrey Vlasovskikh
fb72d5d782 Parse <C-x> and some special keys 2014-03-26 18:44:33 +04:00
Andrey Vlasovskikh
d4b8c09b02 Fixed broken <Enter> in inplace editors, e.g. refactorings and live templates 2014-03-26 16:48:29 +04:00
Andrey Vlasovskikh
254339037b Merged KeyParser into KeyGroup 2014-03-26 14:36:04 +04:00
Andrey Vlasovskikh
800e3a3012 Moved shortcut conflicts state to new KeyGroup 2014-03-26 14:16:34 +04:00
Andrey Vlasovskikh
44a5021786 Updated changelist 2014-03-26 13:33:25 +04:00
Andrey Vlasovskikh
db80629cbb Add build number string to plugin description 2014-03-26 13:20:46 +04:00
Andrey Vlasovskikh
1c3a1c132b Don't include logo into plugin.xml 2014-03-26 13:17:10 +04:00
Andrey Vlasovskikh
751831f3b7 Include build number in archive name 2014-03-26 13:14:32 +04:00
Andrey Vlasovskikh
d226d58e38 Changed build number for developer builds to 'dev' 2014-03-26 13:14:11 +04:00
Andrey Vlasovskikh
230364ac87 Removed unused code 2014-03-26 01:49:01 +04:00
Andrey Vlasovskikh
9df61bba7e Mentioned the active keymap in the shortcut conflicts title 2014-03-26 01:43:48 +04:00
Andrey Vlasovskikh
9ee1910a01 Set up Vim handler by default and show notifications on the first use 2014-03-26 01:18:35 +04:00
Andrey Vlasovskikh
46e10e1599 Changed table column sizes 2014-03-26 01:17:52 +04:00
Andrey Vlasovskikh
ed29f7c1db Don't use sticky balloons 2014-03-26 00:57:38 +04:00
Andrey Vlasovskikh
60f4c7b02e Configurable shortcut conflicts in Vim Emulation settings 2014-03-25 22:58:36 +04:00
Andrey Vlasovskikh
5616723fa4 Read-only table of shortcut conflicts 2014-03-25 20:06:05 +04:00
Andrey Vlasovskikh
724698df08 Moved getKeymapConflicts() to KeyParser 2014-03-25 19:58:01 +04:00
Andrey Vlasovskikh
9bdb99d948 Initial Vim Emulation configurable with empty Shortcut Conflicts table 2014-03-25 18:16:37 +04:00
Andrey Vlasovskikh
efc340a37a Reordered methods 2014-03-23 19:52:00 +04:00
Andrey Vlasovskikh
58548a39d3 Removed obsolete TODO item 2014-03-23 19:49:31 +04:00
Andrey Vlasovskikh
638a205b6c Fixed loading of saved shortcut conflicts settings 2014-03-23 19:49:01 +04:00
Andrey Vlasovskikh
3031dbc600 Detect shortcut conflicts between Vim emulation and IDE keymap 2014-03-23 19:48:20 +04:00
Andrey Vlasovskikh
36dcb53e14 Cleanup 2014-03-23 15:35:16 +04:00
Andrey Vlasovskikh
1a94f4f12f Deprecated old action registration 2014-03-22 16:32:45 +04:00
Andrey Vlasovskikh
d87a241e34 Typo 2014-03-22 16:05:30 +04:00
Andrey Vlasovskikh
ddd28c9a44 Cleanup and minor refactorings 2014-03-22 15:49:50 +04:00
Andrey Vlasovskikh
9637edf30e Some docs 2014-03-22 15:44:24 +04:00
Andrey Vlasovskikh
b0a5e6d375 Don't reserve any shortcuts before implementing actual actions that use them 2014-03-22 15:33:33 +04:00
Andrey Vlasovskikh
6bec99b631 Moved and renamed KeyAction to VimShortcutKeyAction 2014-03-22 15:32:12 +04:00
Andrey Vlasovskikh
a95b65067d Switched from EditorActionHandler substitution to registering custom shortcut sets for Vim-enabled editors 2014-03-22 15:29:04 +04:00
Andrey Vlasovskikh
ac5c176deb Nullity annotations for ChangeEditorActionHandler 2014-03-20 23:30:46 +04:00
Andrey Vlasovskikh
5d385eb26d Added parseKeysSet() helper 2014-03-20 22:43:29 +04:00
Andrey Vlasovskikh
611620555f Initial version of shortcut conflicts settings 2014-03-20 19:38:38 +04:00
Andrey Vlasovskikh
d44412c712 Don't require a custom "Vim" keymap any longer
Keyboard shortcut conflicts aren't handled yet.
2014-03-20 18:18:43 +04:00
Andrey Vlasovskikh
761719fffd Made VisualToggleCharacterModeAction a VimCommandAction 2014-03-20 16:46:53 +04:00
Andrey Vlasovskikh
3015a4a8a2 Initial version of Vim notation typed characters parsing 2014-03-20 15:58:04 +04:00
Andrey Vlasovskikh
e8f579bf74 Added Vim actions index with Javadoc links 2014-03-20 14:39:42 +04:00
Andrey Vlasovskikh
f8da48f61d Added VimCommandAction base class for simplifying action registration 2014-03-20 14:17:14 +04:00
Andrey Vlasovskikh
5b21015f5b Inlined action handler 2014-03-20 13:27:34 +04:00
Andrey Vlasovskikh
326d62d815 Renamed Mapping to MappingMode 2014-03-20 13:24:03 +04:00
Andrey Vlasovskikh
f5f6c92e59 Removed unused class 2014-03-19 19:56:57 +04:00
Andrey Vlasovskikh
b56654c217 Removed unused actionId field 2014-03-19 19:37:02 +04:00
Andrey Vlasovskikh
f5e8572a73 Replaced mapping int codes with Mapping enum 2014-03-19 19:34:32 +04:00
Andrey Vlasovskikh
95a395ed70 Moved Vim operation groups accessors to VimPlugin
VimPlugin now acts as a facade to Vim operations.
2014-03-19 18:29:42 +04:00
Andrey Vlasovskikh
c08c122ea6 Reordered methods 2014-03-19 17:55:25 +04:00
Andrey Vlasovskikh
95460df473 Reformat 2014-03-19 17:37:29 +04:00
Andrey Vlasovskikh
ab489faa56 Some overrides and deprecations 2014-03-19 17:35:39 +04:00
Andrey Vlasovskikh
48e49fe92d Renamed AbstractEditorActionHandler to EditorActionHandlerBase 2014-03-19 16:46:48 +04:00
Andrey Vlasovskikh
441a296bde No abstract classes for no reason 2014-03-19 16:42:23 +04:00
Andrey Vlasovskikh
7359ed74ad Moved some actions to com.maddyhome.vim.action package 2014-03-19 16:35:22 +04:00
Andrey Vlasovskikh
dd56ec6b4c Removed unused MakeTags CLI utility 2014-03-19 16:33:44 +04:00
Andrey Vlasovskikh
2d271008f3 Flattened com.intellij.idea.vim.handler.* package 2014-03-19 16:32:38 +04:00
Andrey Vlasovskikh
d06340ac3c Inlined ResetModeHandler 2014-03-19 16:30:41 +04:00
Andrey Vlasovskikh
f9a67c5180 Removed unused classes 2014-03-19 16:29:35 +04:00
Andrey Vlasovskikh
b4cce0980a Removed practically unused ActionGroup and AbstractActionGroup interfaces 2014-03-19 16:26:12 +04:00
Andrey Vlasovskikh
4a7557c5ba Don't reset visual mode after some IntelliJ actions that operate on selections
These actions are: comment by block/line comment, surround with /
surround with template, move statement up/down.

The reason is simplification of action handling as a step towards
keymap-less IdeaVim configuration.
2014-03-19 14:55:08 +04:00
Andrey Vlasovskikh
4e84f056aa Renamed KeyParser.registerAction() to KeyParser.registerIdeaAction() 2014-03-17 16:17:38 +04:00
Andrey Vlasovskikh
68f938d476 Don't override completion and live templates actions
This requires reconfiguring the Vim keymap.
2014-03-17 14:06:02 +04:00
Alex Selesse
6a7135d2bc VIM-439: Implement :sort command.
- Supports "n", "i" and "!" arguments.
2014-02-06 08:43:55 -05:00
Andrey Vlasovskikh
58ab3ab1bb Added Ira Klotzko to the contributors list 2013-12-06 17:09:41 +04:00
ik
78beef71ce Merge remote-tracking branch 'upstream/master' 2013-12-04 13:41:41 -05:00
ik
b05892e97d VIM-528
Change annotations to reflect that pp (CharPointer) is Nullable
Create check that if pp (CharPointer) is Nullable, code that could result in an NPE (NullPointerException) is not executed
Update the added tests' comments to reflect that they are for VIM-528
2013-12-02 10:42:27 -05:00
ik
f71e24d17e VIM-528 and VIM-459
These 2 cases (duplicates) are fixed with this commit
Additionally, there are a couple of new test cases for search groups and substitutions.
2013-11-18 14:33:06 -05:00
Andrey Vlasovskikh
3968e7741f Added 'Where to start' for contributors 2013-11-18 20:42:41 +04:00
Andrey Vlasovskikh
aa75245d79 Note about Android Studio 2013-11-15 17:06:13 +04:00
Andrey Vlasovskikh
e8c97ba6bf Bumped version 2013-11-15 17:05:45 +04:00
Andrey Vlasovskikh
27bbae3ccd Minor changes to README 2013-11-15 16:59:00 +04:00
Andrey Vlasovskikh
305c03458a Note about Android Studio 2013-11-15 16:57:43 +04:00
Andrey Vlasovskikh
8143114a86 Revert "Fixed usages of deprecated platform API methods"
This reverts commit d3d63395b3.
2013-11-15 16:36:56 +04:00
Andrey Vlasovskikh
a39a56cd39 Dropped JComboBox generics 2013-11-15 16:16:36 +04:00
Andrey Vlasovskikh
c1c076830a Merge remote-tracking branch 'origin/master'
Conflicts:
	build.properties
2013-11-15 16:11:53 +04:00
Andrey Vlasovskikh
d3d63395b3 Fixed usages of deprecated platform API methods 2013-11-15 16:09:57 +04:00
Andrey Vlasovskikh
5a9a53d235 Use moved ListCellRendererWrapper for compatibility with IntelliJ builds
132.1052+
2013-11-15 16:03:17 +04:00
Andrey Vlasovskikh
b7e37aeb20 Release notes 2013-11-12 04:18:53 +04:00
Andrey Vlasovskikh
a86ef05d52 Revert "Remove editor selection after undo"
This reverts commit 13fc780287.
2013-11-12 04:14:05 +04:00
Andrey Vlasovskikh
1be2d9affc VIM-582 Fixed line comment and reformat commands with no visual selection 2013-11-12 04:12:20 +04:00
Andrey Vlasovskikh
43e9469546 Bumped version 2013-11-11 15:36:03 +04:00
Andrey Vlasovskikh
23bb0679dd New URL for the plugin page 2013-11-08 18:18:38 +04:00
Andrey Vlasovskikh
04c41414da More release notes 2013-11-08 18:17:11 +04:00
Andrey Vlasovskikh
3490d83ce6 Draft of release notes for 0.30 2013-11-08 18:11:15 +04:00
Andrey Vlasovskikh
13fc780287 Remove editor selection after undo 2013-11-08 17:56:58 +04:00
Andrey Vlasovskikh
f0c234a5de Nullability annotations for 'cmd' parameter of execute() methods 2013-11-08 17:44:19 +04:00
Andrey Vlasovskikh
7f8050e645 Removed unused argument 2013-11-08 17:31:48 +04:00
Andrey Vlasovskikh
e8b27724c9 Nullability annotations for execute() methods of action handlers 2013-11-08 17:07:13 +04:00
Andrey Vlasovskikh
327cd2c524 EA-43519 Fixed IOOBE: EditorImpl.offsetToLogicalLine 2013-11-08 15:52:22 +04:00
Andrey Vlasovskikh
1366e859be Removed a note about <Esc> in completion windows 2013-11-07 20:43:35 +04:00
Andrey Vlasovskikh
17b779b494 Launch Vim action handler for <Esc> in completion windows (VIM-193) 2013-11-07 20:33:59 +04:00
Andrey Vlasovskikh
7e30b7c7a7 Merge branch 'warning-removal' 2013-09-17 00:18:34 +04:00
Andrey Vlasovskikh
b1b8c49c43 Removed unnecessary generate actions override 2013-08-31 16:14:21 +04:00
Andrey Vlasovskikh
876c35c212 Removed old unused undo classes 2013-08-30 16:48:24 +04:00
Andrey Vlasovskikh
e758e3d457 Removed unused VimSettings 2013-08-30 16:45:42 +04:00
Andrey Vlasovskikh
91e7bfce1d Fixed setting command count 2013-08-30 16:39:56 +04:00
Andrey Vlasovskikh
2e6c53fb52 Typos 2013-08-30 16:04:34 +04:00
Andrey Vlasovskikh
510edeb9a6 Reformat code 2013-08-30 16:03:11 +04:00
Andrey Vlasovskikh
8566e7bf46 Fixed potential NPE 2013-08-30 15:57:38 +04:00
Andrey Vlasovskikh
7dfea2feb6 Removed unused parameter 2013-08-30 15:52:13 +04:00
Andrey Vlasovskikh
fcb9de1930 @Nullable 2013-08-30 15:51:51 +04:00
Andrey Vlasovskikh
2c7a3b877c Argument is always true 2013-08-30 15:47:37 +04:00
Andrey Vlasovskikh
e4ae7f8566 Removed unnecessary logger 2013-08-30 15:45:46 +04:00
Andrey Vlasovskikh
94f8544dfa Removed unnecessary Ascii class 2013-08-30 15:42:08 +04:00
Andrey Vlasovskikh
0159155e1c Removed unused ErrorHandler class 2013-08-30 15:41:21 +04:00
Andrey Vlasovskikh
b45e32dd3f Cleanup 2013-08-12 19:40:44 +04:00
Andrey Vlasovskikh
f3d66b3356 VIM-551 Argument of ':put' is optional 2013-08-12 19:39:59 +04:00
Andrey Vlasovskikh
f21190cb24 VIM-550 ':put' creates a new line 2013-08-12 19:38:33 +04:00
Andrey Vlasovskikh
9554eb0990 Extracted VimTestCase.typeText() 2013-08-12 18:40:51 +04:00
Andrey Vlasovskikh
9c04525df8 Extracted VimTestCase.runExCommand() 2013-08-12 18:26:52 +04:00
Andrey Vlasovskikh
26555c6ad6 VIM-425 Read config from .ideavimrc if available 2013-08-12 17:56:32 +04:00
Andrey Vlasovskikh
d6ee29dc91 Refactored Options.loadVimrc() 2013-08-12 17:54:26 +04:00
Andrey Vlasovskikh
e6dacd0b84 Cleanup 2013-08-12 17:38:11 +04:00
Andrey Vlasovskikh
acf75ad080 Cleanup 2013-08-12 17:01:38 +04:00
Andrey Vlasovskikh
92067b2577 VIM-440 Fixed ':e' open file dialog 2013-08-12 16:59:43 +04:00
Andrey Vlasovskikh
24f197ce99 Use SwingUtilities.invokeLater() for consistency 2013-08-12 16:52:33 +04:00
Andrey Vlasovskikh
39cc7db50b Typos 2013-08-09 00:47:05 +04:00
Andrey Vlasovskikh
510a6d12a7 Replace StringBuffer with concatenation 2013-08-09 00:44:25 +04:00
Andrey Vlasovskikh
cb8c1ea4b5 Fixed possible NPE 2013-08-09 00:43:27 +04:00
Andrey Vlasovskikh
3284102dde Specify size in toArray() 2013-08-09 00:40:50 +04:00
Andrey Vlasovskikh
4a5457ad49 Removed unused method 2013-08-09 00:40:21 +04:00
Andrey Vlasovskikh
39ed9265d7 Converted a RegisterActions class instance into a function 2013-08-09 00:30:52 +04:00
Andrey Vlasovskikh
2fc721f220 Typo 2013-08-09 00:19:20 +04:00
Andrey Vlasovskikh
28c658810f Split RegisterActions constructor into several methods 2013-08-09 00:18:08 +04:00
Andrey Vlasovskikh
2f2ecc252e Updated copyright years in sources 2013-08-09 00:06:38 +04:00
Andrey Vlasovskikh
9f2613c56a Moved RegisterActions to the root IdeaVim package
This class is an entry point to nearly all Vim actions, so it should be
easier to discover.
2013-08-08 23:47:00 +04:00
Andrey Vlasovskikh
a58929d4fb Added forgotten release date for 0.29 2013-08-08 21:12:41 +04:00
Andrey Vlasovskikh
fa13be1e15 Updated link to build server 2013-08-08 21:11:20 +04:00
Andrey Vlasovskikh
7a4d900b06 VIM-98 Invoke actions in separate commands for better Undo/Redo
Vim actions used to be invoked inside a key typing command and didn't
have their own commands. Now they've got separate commands with unique
group IDs in order to stop them from being merged into combined
Undo/Redo steps.

The Undo/Redo behaviour still differs from Vim: typing in a single
Insert mode session is split into several Undo chunks depending on
timing. An Undo step may require one more Undo step for moving the
cursor to its position before Undo.
2013-08-08 20:56:28 +04:00
Andrey Vlasovskikh
421ce832dd Updated changelog 2013-05-15 19:18:13 +04:00
Andrey Vlasovskikh
987781f826 VIM-121 Don't move cursor while scrolling 2013-05-15 18:57:46 +04:00
Andrey Vlasovskikh
d85a41ea98 VIM-91 Enable normal <Enter> handling for one-line editors 2013-05-15 17:15:04 +04:00
Andrey Vlasovskikh
42f86a3f73 VIM-482 Added repeat buffer limits 2013-05-15 16:46:09 +04:00
Andrey Vlasovskikh
0241b58777 Updated change notes 2013-04-06 22:29:58 +04:00
Andrey Vlasovskikh
97a2c73efe Updated changelog 2013-04-06 22:19:50 +04:00
Andrey Vlasovskikh
5f1e46ca82 Merge branch 'vim-479' 2013-04-06 21:59:50 +04:00
Andrey Vlasovskikh
805779144e Fixed copying second keystrokes in Reconfigure Vim keymap 2013-04-06 21:50:12 +04:00
Andrey Vlasovskikh
c65e21708c VIM-478 Fixed bug in reconfiguring Vim keymap based on user-defined keymaps 2013-04-06 21:21:22 +04:00
Andrey Vlasovskikh
08e546b677 Fixed NPE in VimKeyMapUtil.installKeyBoardBindings 2013-04-06 19:57:27 +04:00
Andrey Vlasovskikh
11cf8454ad VIM-479 Don't try to put read-only editors into insert mode 2013-04-06 19:53:57 +04:00
Andrey Vlasovskikh
c3494803dc Removed unused code 2013-04-06 18:39:56 +04:00
Andrey Vlasovskikh
c84496b942 Suggest reconfiguring keymap during update only for Macs 2013-04-06 18:12:15 +04:00
Andrey Vlasovskikh
c4eb8e5752 Updated changelog 2013-04-03 15:57:22 +04:00
Andrey Vlasovskikh
7702d3a695 Fixed broken test 2013-04-03 04:05:37 +04:00
Andrey Vlasovskikh
fbff8ed2c0 VIM-419 Keep cursor position after 'gt' and 'gT' 2013-04-03 03:55:02 +04:00
Andrey Vlasovskikh
5b5b6188da VIM-42 Ignore multi-character indents while recoding last insert actions 2013-04-03 00:30:26 +04:00
Andrey Vlasovskikh
6a1707a7e6 Minor style edits 2013-04-01 20:36:41 +04:00
Andrey Vlasovskikh
b625fd3df9 Updated changelog 2013-04-01 20:35:56 +04:00
Andrey Vlasovskikh
ffaf2cc451 VIM-42 Handle moving cursor back and forward during autocompletion
Expressions like static methods (Foo.bar()) and shortcut completions (f.b for
foo.bar()) are completed using several document edits with cursor movements.
Now IdeaVim records and replays these cursor movements.
2013-04-01 20:17:30 +04:00
Andrey Vlasovskikh
dcc9b5a37e VIM-42 Record char strokes as regular document edits 2013-04-01 17:23:33 +04:00
Andrey Vlasovskikh
1b4a51f770 VIM-42 Basic support for repeating code completion using '.' command 2013-04-01 17:10:56 +04:00
Andrey Vlasovskikh
f8d2ee2dd7 VIM-286 Note about switching key repeating on Mac OS X manually 2013-03-27 18:15:46 +04:00
Andrey Vlasovskikh
348d88d543 VIM-92 Note about resetting custom shortcuts 2013-03-27 17:54:51 +04:00
Andrey Vlasovskikh
38b859e555 VIM-472 Fixed right selection in visual character mode to be one char past line 2013-03-26 16:36:15 +04:00
Andrey Vlasovskikh
ca8026f612 VIM-404 Fixed 'O' at the first line 2013-03-26 15:51:15 +04:00
Andrey Vlasovskikh
befcf4298f Updated changelog 2013-03-26 02:43:46 +04:00
Andrey Vlasovskikh
2e0bbcc75d Moved MacKeyRepeat to helpers 2013-03-26 02:23:27 +04:00
Andrey Vlasovskikh
2204fe6451 Fixed unit tests for updated plugin state 2013-03-26 02:21:09 +04:00
Andrey Vlasovskikh
12bc68bc02 VIM-286 Suggest enabling Mac OS X keys autorepeat only if it is not enabled 2013-03-26 02:20:30 +04:00
Andrey Vlasovskikh
290370f744 VIM-92 Don't suggest reconfiguring Vim keymap if it is not installed yet 2013-03-25 22:45:02 +04:00
Andrey Vlasovskikh
79acef46ce VIM-286 Suggest enabling repeating keys on press and hold for Mac OS X 2013-03-25 22:44:25 +04:00
Andrey Vlasovskikh
0054eb5279 Disabled overriding second keystrokes as a workaround for Emacs keymap 2013-03-25 21:27:14 +04:00
Andrey Vlasovskikh
e0eb919e51 VIM-92 Save parent keymap after reconfiguring Vim keymap and show notification 2013-03-25 20:51:30 +04:00
Andrey Vlasovskikh
7c3d5a7946 VIM-92 Suggest to reconfigure Vim keymap using the new generation algorithm 2013-03-25 19:49:31 +04:00
Andrey Vlasovskikh
38cb20d1bd Changed capitalization of "Vim" 2013-03-25 19:48:25 +04:00
Andrey Vlasovskikh
505fcf5b31 VIM-421 Fixed 'cw' at the last word in line 2013-03-13 13:48:11 -07:00
Andrey Vlasovskikh
d744d45ccd VIM-92 Reconfigure Vim keymap by overwriting it and switching bindings without restart 2013-03-12 21:40:18 +04:00
Andrey Vlasovskikh
2e2e7a7df6 VIM-92 Free Ctrl+N that is critical to navigate actions on Linux 2013-03-12 21:39:19 +04:00
Andrey Vlasovskikh
db5ff05bb3 VIM-92 Do not use Meta key on systems other than Mac 2013-03-12 21:38:28 +04:00
Andrey Vlasovskikh
566273fe83 Merge branch 'vim-92' 2013-03-12 16:48:31 +04:00
Andrey Vlasovskikh
decb17e665 VIM-92 Alternative shortcuts for actions with shortcuts bound to IdeaVim
Alternative action shortcuts are obtained from standard shortcuts by
adding Alt+, Ctrl+, Shift+, Meta+, Alt+Ctrl+, etc. to them.
2013-03-12 16:48:17 +04:00
Andrey Vlasovskikh
46c27bbd10 Added John Lindquist to contributors 2013-03-11 15:41:23 +04:00
Andrey Vlasovskikh
72f98cef14 Merge pull request #14 from johnlindquist/master
Matching command-line font and font size to editor font and font size
2013-03-11 04:38:33 -07:00
John Lindquist
0f8cfa289d Command-line font and font size now match editor font and font size 2013-03-10 23:47:53 -06:00
Alexander Zolotov
0cb420c557 VIM-92: Fix Vim keymap to work better in Mac OS
- add extra shortcuts for Linux keymaps
2013-01-11 00:50:15 +04:00
Alexander Zolotov
79df0b0594 VIM-92: Fix Vim keymap to work better in Mac OS
- ability to define extra shortcuts
2013-01-11 00:42:31 +04:00
Alexander Zolotov
dfbddb4050 VIM-92: Fix Vim keymap to work better in Mac OS
- tests for keymap generation
2013-01-10 23:47:20 +04:00
Alexander Zolotov
0f88495f29 VIM-92: Fix Vim keymap to work better in Mac OS
- remove all static overrides from vim.xml
- introduce conflicts resolving
2013-01-08 23:19:41 +04:00
Andrey Vlasovskikh
2b31ef3f16 Link to the Twitter account 2012-12-26 16:20:45 +04:00
Andrey Vlasovskikh
8fa6bc1b69 Markup for emails 2012-12-26 16:19:20 +04:00
Andrey Vlasovskikh
f485b1eb50 Updated changelog for 0.26 2012-12-26 16:17:01 +04:00
Andrey Vlasovskikh
8515eac900 Reformat 2012-12-26 16:00:05 +04:00
Andrey Vlasovskikh
d9e068f794 Updated contents of the plugin descriptor 2012-12-26 15:58:54 +04:00
Andrey Vlasovskikh
ed5358a6d6 VIM-262 Support for paste from register in command mode 2012-12-25 22:30:52 +04:00
Andrey Vlasovskikh
7b6163c968 Refactored digraph handling in command line 2012-12-25 21:59:05 +04:00
Andrey Vlasovskikh
c4927372ec Test for handling digraphs in command mode 2012-12-25 21:04:07 +04:00
Andrey Vlasovskikh
f3cd21009b Fixed nullable annotation 2012-12-25 19:11:59 +04:00
Andrey Vlasovskikh
a71c75b53e Fixed Ex command panel to run unit tests of Ex commands 2012-12-25 17:58:17 +04:00
Andrey Vlasovskikh
d95f67748c VIM-262 Test for <C-R> in insert mode 2012-12-25 15:37:03 +04:00
Andrey Vlasovskikh
e11bf264b5 VIM-214 Key bindings for paste into command line 2012-12-24 23:05:38 +04:00
Andrey Vlasovskikh
db382816f5 Cleanup 2012-12-24 18:20:29 +04:00
Andrey Vlasovskikh
01732eb443 Automatic nullity annotations 2012-12-24 18:13:58 +04:00
Andrey Vlasovskikh
fc9605565a Cleanup 2012-12-24 17:55:20 +04:00
Andrey Vlasovskikh
7d018760ca Fixed NPE: ChangeGroup.insertRegister 2012-12-24 17:41:40 +04:00
Andrey Vlasovskikh
d52679eae8 VIM-43 Added support for the last change position mark 2012-12-24 17:39:40 +04:00
Andrey Vlasovskikh
aa9c317831 VIM-177 Added <C-]> and <C-T> to the keymap 2012-12-24 16:08:24 +04:00
Andrey Vlasovskikh
44b280962f VIM-302 Fixed tab switching order for 'gt' and 'gT' 2012-12-24 15:08:56 +04:00
Andrey Vlasovskikh
6a90f95712 Minor numbering scheme update 2012-12-19 21:46:50 +04:00
Andrey Vlasovskikh
910c51004d Temporarily include build number in version again 2012-12-19 21:36:56 +04:00
Andrey Vlasovskikh
bdb05d1dee Bumped version to 0.24.1 2012-12-19 21:14:08 +04:00
Andrey Vlasovskikh
abc68eb900 Don't include build number in version 2012-12-19 21:11:35 +04:00
Andrey Vlasovskikh
5a50c9e5ac Updated changelog 2012-12-19 21:10:30 +04:00
Andrey Vlasovskikh
1d15417a83 Switch to IntelliJ 12 plugin SDK by default 2012-12-19 21:10:11 +04:00
Andrey Vlasovskikh
233d318e48 Cleanup 2012-12-17 00:00:52 +04:00
Andrey Vlasovskikh
a0c52f017c Switch to Base64 codec from Apache Commons Codec library 2012-12-16 23:47:49 +04:00
Andrey Vlasovskikh
f89d824367 VIM-400 Fixed saving special characters in settings 2012-12-16 23:32:27 +04:00
Andrey Vlasovskikh
d5daf5de67 Instructions for setting up the development environment 2012-12-05 01:41:14 +04:00
Andrey Vlasovskikh
49459b2d81 Added link to the bug tracker 2012-12-05 01:39:05 +04:00
525 changed files with 21826 additions and 15142 deletions

3
.gitignore vendored
View File

@@ -1,5 +1,6 @@
*.swp
/.gradle/
/.idea/
/idea/
/build/
/out/
/tmp/

View File

@@ -141,11 +141,8 @@
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="Groovy">
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="false" />
<option name="BLOCK_COMMENT_AT_FIRST_COLUMN" value="false" />
<option name="KEEP_LINE_BREAKS" value="false" />
<option name="ELSE_ON_NEW_LINE" value="true" />
<option name="WHILE_ON_NEW_LINE" value="true" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
@@ -154,7 +151,6 @@
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
<option name="ALIGN_MULTILINE_THROWS_LIST" value="true" />
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
<option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="true" />
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="METHOD_PARAMETERS_WRAP" value="5" />
@@ -165,12 +161,9 @@
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
<option name="BINARY_OPERATION_WRAP" value="5" />
<option name="TERNARY_OPERATION_WRAP" value="5" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="FOR_STATEMENT_WRAP" value="5" />
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
<option name="ASSIGNMENT_WRAP" value="1" />
<option name="IF_BRACE_FORCE" value="1" />
<option name="DOWHILE_BRACE_FORCE" value="1" />
<option name="WHILE_BRACE_FORCE" value="1" />
<option name="FOR_BRACE_FORCE" value="1" />
<option name="FIELD_ANNOTATION_WRAP" value="0" />
@@ -227,6 +220,10 @@
<option name="TAB_SIZE" value="8" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JSON">
<option name="KEEP_LINE_BREAKS" value="false" />
<option name="PARENT_SETTINGS_INSTALLED" value="true" />
</codeStyleSettings>
<codeStyleSettings language="JSP">
<indentOptions>
<option name="INDENT_SIZE" value="2" />
@@ -259,7 +256,6 @@
</codeStyleSettings>
<codeStyleSettings language="Python">
<option name="KEEP_LINE_BREAKS" value="false" />
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
<option name="PARENT_SETTINGS_INSTALLED" value="true" />
</codeStyleSettings>
<codeStyleSettings language="SQL">
@@ -276,5 +272,4 @@
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>
</project>

10
.idea/misc.xml generated
View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="IntelliJ Plugin SDK" project-jdk-type="IDEA JDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

9
.idea/modules.xml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/ideavim.iml" filepath="$PROJECT_DIR$/ideavim.iml" />
</modules>
</component>
</project>

View File

@@ -1,36 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests" type="JUnit" factoryName="JUnit">
<extension name="coverage" enabled="false" merge="false" runner="idea">
<pattern>
<option name="PATTERN" value="com.maddyhome.idea.vim.*" />
<option name="ENABLED" value="true" />
</pattern>
<pattern>
<option name="PATTERN" value="org.jetbrains.plugins.ideavim.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<module name="ideavim" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="org.jetbrains.plugins.ideavim" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<patterns />
<RunnerSettings RunnerId="Cover" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Cover" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
</component>

View File

@@ -1,10 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="IdeaVim" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
<module name="ideavim" />
<option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -Didea.is.internal=true" />
<option name="PROGRAM_PARAMETERS" value="" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
</component>

7
.idea/vcs.xml generated
View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -3,24 +3,42 @@ IdeaVim Authors
The original author:
* Rick Maddy <rmaddy@maddyhome.com>
* [Rick Maddy](mailto:rmaddy@maddyhome.com)
The current maintainer:
* Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
* [Andrey Vlasovskikh](mailto:andrey.vlasovskikh@gmail.com)
Previous maintainers:
* Oleg Shpynov <oleg.shpynov@jetbrains.com>
* [Oleg Shpynov](mailto:oleg.shpynov@jetbrains.com)
Contributors:
* Dmitry Jemerov <yole@jetbrains.com>
* Marquis Wang <marquis@marquiswang.com>
* Julien Hoarau <madgnome@gmail.com>
* Masanobu Imai <masanobu.imai@gmail.com>
* poxu <poxvuibr@gmail.com>
* Alexander Zolotov <alexander.zolotov@jetbrains.com>
* [Dmitry Jemerov](mailto:yole@jetbrains.com)
* [Marquis Wang](mailto:marquis@marquiswang.com)
* [Julien Hoarau](mailto:madgnome@gmail.com)
* [Masanobu Imai](mailto:masanobu.imai@gmail.com)
* [poxu](mailto:poxvuibr@gmail.com)
* [Alexander Zolotov](mailto:alexander.zolotov@jetbrains.com)
* [John Lindquist](mailto:johnlindquist@gmail.com)
* [Ira Klotzko](mailto:iklotzko@ltech.com)
* [Alex Selesse](mailto:alex@selesse.com)
* [Dathan Bennett](mailto:dbennett@palantir.com)
* [salaam](mailto:kphayen@gmail.com)
* [Alexey Shmalko](mailto:rasen.dubi@gmail.com)
* [Andrew Brookins](mailto:a.m.brookins@gmail.com)
* [Chang Wang](mailto:changwang83@gmail.com)
* [Jaime Sanchez](mailto:josejaime.sanchez@gmail.com)
* [Thomas B Homburg](mailto:thomas@homburg.dk)
* [smartbomb](mailto:smartbomb@server.fake)
* [Tuomas Tynkkynen](mailto:tuomas.tynkkynen@iki.fi)
* [Jackson Popkin](mailto:jackson@donorschoose.org)
* [Teruo Kunihiro](mailto:yuyuyu1999@gmail.com)
* [Liubov Paina](mailto:lubashka.994@mail.ru)
* [Daniel Leong](mailto:falcone88@gmail.com)
* [Aleksey Lagoshin](mailto:aleksey@pri-num.com)
* [Paulo Bu](mailto:pbu_98@yahoo.com)
If you are a contributor and your name is not listed here, feel free to
contact the maintainer.

View File

@@ -3,6 +3,373 @@ The Changelog
History of changes in IdeaVim for the IntelliJ platform.
Get an Early Access
-------------------
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 |
Browse Repositories | Manage Repositories":
[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.
Please note that the quality of EAP versions may at times be way below even
usual beta standards.
To Be Released
--------------
0.47, 2016-10-19
----------------
A bugfix release.
Bug fixes:
* VIM-1098 Don't start visual selection when mouse click was actually drag over single character
* VIM-1190 Fixed exception "Write access is allowed from write-safe contexts only"
0.46, 2016-07-07
----------------
Added `incsearch` option for incremental search. Added support for `it` and
`at` tag block selection. Added `vim-surround` commands `ys`, `cs`, `ds`,
`S`. Various bug fixes.
Features:
* VIM-769 Added `vim-surround` commands `ys`, `cs`, `ds`, `S`
* VIM-264 Added tag block selection
* VIM-271 Added `incsearch` option for showing search results while typing
* VIM-217 Added support for `={motion}` formatting command
Bug fixes:
* VIM-796 Fixed focus issues with `:action` command
* VIM-581 Fixed use of special registers `0`-`9` and `-` in delete commands
* VIM-965 Fixed exception in `[m` in some file types
* VIM-564 Fixed `g_` move to go to the current line
* VIM-964 Fixed marks behavior when the whole line got deleted
* VIM-259 Move caret to the line beginning after `==`
* VIM-246 Fixed `{count}==` formatting
* VIM-287 Fixed insert new line before and after folds
* VIM-139 Focus on current search and use modal confirmation for `:s///gc`
* VIM-843 Don't highlight search results after restart
* VIM-1126 Fixed warning about modifying shortcuts of global actions for 2016.2
0.44, 2015-11-02
----------------
A bugfix release.
* VIM-1040 Fixed typing keys in completion menus and typing with the
plugin disabled
0.43, 2015-11-02
----------------
A bugfix release.
* VIM-1039 Fixed running the plugin with Java 6
0.42, 2015-11-01
----------------
This release is compatible with IntelliJ 15+ and other IDEs based on the
IntelliJ platform branch 143+.
* VIM-970 Fixed move commands in read-only files
0.41, 2015-06-10
----------------
A bugfix release.
* VIM-957 Fixed plugin version 0.40 is not compatible with IDEs other than
IntelliJ
0.40, 2015-06-09
----------------
Added support for `mapleader`. Support comments in `%` brace matching. Various
bug fixes.
Features:
* VIM-650 Added support for `mapleader`
* VIM-932 Support comments in `%` brace matching
Bug fixes:
* VIM-586 Invoke Vim shortcuts handler later to restore the sequence of input
events
* VIM-838 `J` shouldn't add whitespace if there is a trailing space
* VIM-855 Fixed regexp character class problem
* VIM-210 Fix focus issues with the Ex panel and splits
* VIM-575 Don't change cursor position of other splits in visual mode
* VIM-864 Fixed visual marks getting changed during visual substitute
* VIM-856 Fixed regex look-behind problem
* VIM-868 Allow count on `gt` and `gT`
* VIM-700 Remapping `0` should still allow it to be entered in command count
* VIM-781 Fixed expanding visual block selection past empty lines
* VIM-845 Fixed `c` and `x` functionality for visual block selections
* VIM-930 Fixed editor focus issues after closing Ex entry box on Oracle Java 6
0.39, 2014-12-03
----------------
A bugfix release.
Bug fixes:
* VIM-848 Show line numbers if they are enabled in the settings and there is
no `set number`
* VIM-702 Fix infinite loop on `s/$/\r/g`
* EA-63022 Don't update line numbers in the caret movement event listener
0.38, 2014-12-01
----------------
Added support for `number` and `relativenumber` options, `clipboard=unnamed`
option. Added `:action` and `:actionlist` commands for executing arbitrary
IDE actions. Various bug fixes.
Features:
* VIM-476 Added support for `clipboard=unnamed` option
* VIM-410 Added support for `relativenumber` option
* VIM-483 Added support for `number` option
* VIM-652 Added `:action` and `:actionlist` commands for executing arbitrary
IDE actions
Bug fixes:
* VIM-818 Enable key repeat on Mac OS X every time it gets reset by the OS
* VIM-624 Deselect visual selection range on opening the Ex entry field
* VIM-511 Fixed editing offset after `<BS>` for `.` command
* VIM-792 Fixed line-wise and block-wise paste commands for `*` and `+`
registers
* VIM-501 Fixed off-by-1 error in visual block-wise selection
* VIM-613 Fixed repeat after `d$`
* VIM-705 Fixed repeated multiline indent
* VIM-567 Fixed `:!` to allow running non-filter commands
* VIM-536 Fixed `cc` on the second-to-last line
* VIM-515 Fixed `cW` command detecting end-of-word incorrectly
* VIM-794 Fixed NCDFE related to 'number' in IDEs other than IntelliJ
* VIM-771 Fix semicolon repeat for 'till char' motion
* VIM-723 Fix pasting to an empty line
0.37, 2014-10-15
----------------
A bugfix release.
Bug fixes:
* VIM-784 Fixed visual line selection where the start of the selection range
was greater than its end
* VIM-407 Fixed `>>` to work if a line contains only one character
0.36, 2014-10-14
----------------
Added support for common window splitting and navigation commands. Various bug
fixes.
Features:
* VIM-171 Window `<C-W>` commands: split, close, next/previous windows,
left/right/up/down windows
* VIM-265 Window `:split` and `:vsplit` commands
Bug fixes:
* VIM-632 Restored visual block mode that was broken due to multiple carets support
* VIM-770 Close the current tab on `:quit` instead of all tabs with the current
file
* VIM-569 Fixed `<C-W>` when the caret is at the end of a line
0.35, 2014-05-15
----------------
The `~/.vimrc` initialization file is no longer read by default, use
`~/.ideavimrc` instead.
Features:
* VIM-690 Read initialization commands only from `~/.ideavimrc`
Bug fixes:
* VIM-676 Handle control characters in `.ideavimrc` as pressed, not typed
keystrokes
* VIM-679 Parse characters less than U+0020 as `<C-$CHAR>`
* VIM-683 Allow `<C-PageUp>`/`<C-PagDown>` to be used outside of Vim emulation
* VIM-646 Don't update the visual selection if a command moves the caret and exits
the visual mode
* VIM-213 Use `'<` and `'>` marks for saving and restoring the last visual
selection
0.34, 2014-04-29
----------------
A bugfix release.
Bug fixes:
* VIM-674 Don't handle `<Tab>` in Insert mode in Vim emulation
* VIM-672 Ignore mappings that contain `<Plug>` and `<SID>`
* VIM-670 First character of a recursive mapping shouldn't be mapped again
* VIM-666 Support `<Bar>` in Vim key notation
* VIM-666 Ignore characters after `|` in `:map` commands
* VIM-667 Ignore potentially nested lines of .vimrc based on leading whitespace
0.33, 2014-04-28
----------------
Added support for `:map` key mapping commands. New keyboard shortcuts handler
that doesn't require a separate keymap for Vim emulation. Added support for
`:source` and `:sort` commands.
Features:
* VIM-288 Support for `:map` key mapping commands
* VIM-543 Allow granular enable/disable of Vim shortcut keys
* VIM-643 Support for `:source` command
* VIM-439 Support for `:sort` command
Bug fixes:
* VIM-528 Search and replace with grouping no longer works
* VIM-281 Don't disable global reformat code action for Vim emulation
0.32, 2013-11-15
----------------
Fixed API compatibility with IntelliJ platform builds 132.1052+.
0.31, 2013-11-12
----------------
A bugfix release.
Bug fixes:
* VIM-582 Fixed line comment and reformat commands with no visual selection
0.30, 2013-11-11
----------------
Added support for a separate `.ideavimrc` config file. Fixed long-standing
issues with merged undo/redo commands and `<Esc>` during code completion.
Various bug fixes.
Features:
* VIM-425 Read config from .ideavimrc if available
Bug fixes:
* VIM-98 Invoke actions in separate commands for better undo/redo
* VIM-193 Launch Vim action handler for `<Esc>` in completion windows
* VIM-440 Fixed `:e` open file dialog
* VIM-550 `:put` creates a new line
* VIM-551 Argument of `:put` is optional
* Fixed several reported exceptions
0.29, 2013-05-15
----------------
A bugfix release.
Bug fixes:
* VIM-482 Fixed repeat buffer limits
* VIM-91 Enable normal `<Enter>` handling for one-line editors
* VIM-121 Don't move cursor while scrolling
0.28, 2013-04-06
----------------
A bugfix release.
Bug fixes:
* VIM-478 Fixed reconfigure Vim keymap for user-defined base keymaps
* VIM-479 Don't try to activate insert mode for diff view
0.27, 2013-04-03
----------------
New Vim keymap generator creates better keymaps, especially for Mac OS X.
Restart after reconfiguring the keymap is no longer required.
Features:
* VIM-92 Better Vim keymaps for Mac OS X
* VIM-286 Ask if the plugin should enable repeating keys in Mac OS X
Bug fixes:
* VIM-42 Fixed code completion for the `.` command
* VIM-421 Fixed `cw` on the last character in line
* VIM-419 Fixed resetting cursor position after 'gt' and 'gT'
* VIM-233 Fixed code completion for edits in visual block mode
* VIM-404 Fixed `O` command at the first line
* VIM-472 Fixed right selection in visual mode to be one char more
* Fixed command window font size to match editor font size
0.26, 2012-12-26
----------------
Added support for paste in the command mode: from a register using `<C-R>`,
from the clipboard using `<S-Insert>` or `<M-V>`. Added support for the last
change position mark (the dot `.` mark). New shortcuts for Go to declaration
`<C-]>` and Navigate back `<C-T>`. Various bug fixes.
Features:
* VIM-262 Support for paste from register in command mode
* VIM-214 Key bindings for paste into command line
* VIM-43 Added support for the last change position mark
* VIM-177 Added `<C-]>` and `<C-T>` to the keymap
Bug fixes:
* VIM-302 Fixed tab switching order for `gt` and `gT`
0.25, 2012-12-19
----------------
A bugfix release.
* VIM-400 Fixed saving characters with key modifiers in plugin settings
* VIM-319 Fixed saving plugin settings when registers contain the null
character
0.24, 2012-12-03
----------------

224
README.md
View File

@@ -1,28 +1,63 @@
IdeaVim
=======
IdeaVim is a Vim emulation plug-in for IDEs based on the IntelliJ platform.
IdeaVim can be used with IntelliJ IDEA, RubyMine, PyCharm, PhpStorm, WebStorm
and AppCode.
<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>Build<span>
</div>
<div>
<a href="http://teamcity.jetbrains.com/viewType.html?buildTypeId=IdeaVim_TestsForIntelliJ15&guest=1">
<img src="http://teamcity.jetbrains.com/app/rest/builds/buildType:(id:IdeaVim_TestsForIntelliJ15)/statusIcon.svg?guest=1"/>
</a>
<span>Tests</span>
</div>
IdeaVim is a Vim emulation plugin for IDEs based on the IntelliJ platform.
IdeaVim can be used with IntelliJ IDEA, RubyMine, PyCharm, PhpStorm, WebStorm,
AppCode, CLion, DataGrip and Android Studio.
Resources:
* [Plugin homepage](http://plugins.intellij.net/plugin/?id=164)
* [Changelog](https://github.com/JetBrains/ideavim/blob/master/CHANGES.md)
* [Continuous integration builds](http://teamcity.jetbrains.com/project.html?projectId=project55)
* [Plugin homepage](http://plugins.jetbrains.com/plugin/164)
* [Changelog](CHANGES.md)
* [Bug tracker](http://youtrack.jetbrains.com/issues/VIM)
* [Continuous integration builds](http://teamcity.jetbrains.com/project.html?projectId=IdeaVim&guest=1)
* [@IdeaVim](http://twitter.com/ideavim) in Twitter
Installation
------------
Use the IDE's plugin manager to install the latest version of the plugin.
Start the IDE normally and enable the Vim emulation using "Tools | VIM
Start the IDE normally and enable the Vim emulation using "Tools | Vim
Emulator" menu item. At this point you must use Vim keystrokes in all editors.
If you wish to disable the plugin, select the "Tools | VIM Emulator" menu so
it is unchecked. At this point IDE will work with it's regular keyboard
If you wish to disable the plugin, select the "Tools | Vim Emulator" menu so
it is unchecked. At this point your IDE will work with its regular keyboard
shortcuts.
Keyboard shortcut conflicts between the Vim emulation and the IDE can be
resolved via "File | Settings | Vim Emulation", "File | Settings | Keymap"
and key mapping commands in your ~/.ideavimrc file.
Get an Early Access
-------------------
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 |
Browse Repositories | Manage Repositories":
[https://plugins.jetbrains.com/plugins/eap/ideavim](https://plugins.jetbrains.com/plugins/eap/ideavim)
See [the changelog](CHANGES.md) for the list of hot unreleased features.
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
usual beta standards.
Summary of Supported Vim Features
---------------------------------
@@ -30,29 +65,70 @@ Summary of Supported Vim Features
Supported:
* Motion keys
* Deletion/Changing
* Deletion/changing
* Insert mode commands
* Marks
* Registers
* Undo/redo
* Visual mode commands
* Some Ex commands
* Some [:set options](https://github.com/JetBrains/ideavim/blob/master/doc/set-commands.md)
* Some [:set options](doc/set-commands.md)
* Full Vim regexps for search and search/replace
* Key mappings
* Macros
* Digraphs
* Command line and search history
* Window commands
* Vim web help
Emulated Vim plugins:
* vim-surround
Not supported (yet):
* Key mappings
* Various less used commands
* Jump lists
* Window commands
* Various less used commands
Please see the file [index.txt](https://github.com/JetBrains/ideavim/blob/master/index.txt)
for a list of commands covered with tests.
See also:
* [List of recently added 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)
Files
-----
* ~/.ideavimrc
* Your IdeaVim-specific Vim initialization commands
You can read your ~/.vimrc file from ~/.ideavimrc using this command:
source ~/.vimrc
Note, that IdeaVim currently parses ~/.ideavimrc file via simple pattern matching,
see [VIM-669](http://youtrack.jetbrains.com/issue/VIM-669) for proper parsing
of VimL files.
Also note that if you have overridden the `user.home` JVM option, this
will affect where IdeaVim looks for your .ideavimrc file. For example, if you
have `-Duser.home=/my/alternate/home` then IdeaVim will source
`/my/alternate/home/.ideavimrc` instead of `~/.ideavimrc`.
Emulated Vim Plugins
--------------------
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:
set <extension-name>
Available extensions:
* surround
* Emulates [vim-surround](https://github.com/tpope/vim-surround)
* Commands: `ys`, `cs`, `ds`, `S`
Changes to the IDE
@@ -62,75 +138,88 @@ Changes to the IDE
The IdeaVim plugin uses the undo/redo functionality of the IntelliJ platform,
so the behaviour of the `u` and `<C-R>` commands may differ from the original
Vim. Vim compatibility of undo/redo may be improved in the 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).
### Escape
In the IDE, the `<Esc>` key is used during editing to cancel code completion
windows, dialog windows, and parameter tooltips. While in the Vim insert mode,
`<Esc>` is used to return back to the normal mode. If you are typing in the
insert mode and a code completion window is popped up, pressing `<Esc>` cancel
the window without exiting the insert mode.
Using `<Esc>` in dialog windows remains problematic. For most dialog windows
the Vim emulator is put into the insert mode without the possibility to switch to
the normal mode. In some dialog windows the normal mode is on by default. The
usage of the Vim emulator in dialog windows is an area for improvements.
the Vim emulator is put into the insert mode with `<Esc>` not working. You
should use `<C-c>` or `<C-[>` instead. In some dialog windows the normal mode is
on by default. The usage of the Vim emulator in dialog windows is an area for
improvements.
### Menu Changes
See also [unresolved escape issues](http://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+Help+topic%3A+i_Esc).
In order to emulate the keystrokes used by Vim, several of the default hotkeys
used by the IDE had to be changed. Below is a list of IDE menus, their default
keyboard shortcuts, and their new VIM keystrokes.
### Executing IDE Actions
File
Save All Ctrl-S :w
IdeaVim adds two commands for listing and executing arbitrary IDE actions as
Ex commands or via `:map` command mappings:
Edit
Undo Ctrl-Z u
Redo Ctrl-Shift-Z Ctrl-R
Cut Ctrl-X "+x
Copy Ctrl-C "+y
Paste Ctrl-V "+P
Select All Ctrl-A ggVG
* `:actionlist [pattern]`
* Find IDE actions by name pattern
* `:action {name}`
* Execute an action named `NAME`
Search
Find Ctrl-F /
Replace Ctrl-R :s
Find Next F3 n
Find Previous Shift-F3 N
For example, here `\r` is mapped to the Reformat Code action:
View
Quick JavaDoc Ctrl-Q K
Parameter Info Ctrl-P Ctrl-Shift-P
Swap Panels Ctrl-U <None>
Recent Files... Ctrl-E <None>
Type Hierarchy Ctrl-H Ctrl-Alt-Shift-H
:map \r :action ReformatCode<CR>
Goto
Class... Ctrl-N Alt-Shift-N
Line... Ctrl-G G
Declaration Ctrl-B gd
Super Method Ctrl-U Ctrl-Shift-U
Code
Override Methods... Ctrl-O Ctrl-Shift-O
Implement Methods... Ctrl-I Ctrl-Shift-I
Complete Code (Only in Insert mode)
Basic Ctrl-Space Ctrl-Space or Ctrl-N or Ctrl-P
Smart Type Ctrl-Shift-Space Ctrl-Shift-Space
Class Name Ctrl-Alt-Space Ctrl-Alt-Space
Insert Live Template Ctrl-J Ctrl-]
Contributing
------------
Tools
Version Control
Check In Project Ctrl-K <None>
### Where to Start
In order to contribute to IdeaVim you should have some understanding of Java.
See also these docs on the IntelliJ API:
* [IntelliJ architectural overview](http://confluence.jetbrains.com/display/IDEADEV/IntelliJ+IDEA+Architectural+Overview)
* [IntelliJ plugin development resources](http://confluence.jetbrains.com/display/IDEADEV/PluginDevelopment)
You can start by picking relatively simple tasks that are tagged with
[#patch_welcome](http://youtrack.jetbrains.com/issues/VIM?q=%23patch_welcome)
in the issue tracker.
### Development Environment
1. Fork IdeaVim on GitHub and clone the repository on your local machine.
2. Import the project from existing sources in IntelliJ IDEA 15+ (Community or
Ultimate) using "File | New | Project from Existing Sources..." or "Import
Project" from the start window.
* In the project wizard select "Import project from external model | Gradle"
* Select your Java 6+ JDK as the Gradle JVM, leave other parameters unchanged
3. Create a new plugin run configuration using "Run | Edit Configurations | New
Gradle Configuration" and run it in order to launch IntelliJ with the
compiled version of the IdeaVim plugin.
* Select your project as the Gradle project
* Enter "runIdea" as the task to run
4. Create and run a new configuration for running tests by right-clicking on the
"test" folder in the project structure and selecting "Run All Tests".
5. Build the plugin distribution by running `./gradlew clean buildPlugin` in the
terminal in your project root.
* The resulting distribution file is build/distributions/IdeaVim-VERSION.zip
* You can install this file using "Settings | Plugins | Install plugin
from disk"
Authors
-------
See [AUTHORS.md](https://github.com/JetBrains/ideavim/blob/master/AUTHORS.md)
See [AUTHORS.md](AUTHORS.md)
for a list of authors and contributors.
@@ -138,4 +227,3 @@ License
-------
IdeaVim is licensed under the terms of the GNU Public license version 2.

45
build.gradle Normal file
View File

@@ -0,0 +1,45 @@
buildscript {
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
url 'http://dl.bintray.com/jetbrains/intellij-plugin-service'
}
}
dependencies {
classpath "org.jetbrains.intellij.plugins:gradle-intellij-plugin:0.2.0-SNAPSHOT"
}
}
apply plugin: 'org.jetbrains.intellij'
apply plugin: 'java'
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }
sourceSets {
main {
java.srcDir 'src'
resources.srcDir 'resources'
}
test {
java.srcDir 'test'
}
}
intellij {
version ideaVersion
pluginName 'IdeaVim'
updateSinceUntilBuild false
downloadSources Boolean.valueOf(downloadIdeaSources)
publish {
channels publishChannels
username publishUsername
password publishPassword
}
}

View File

@@ -1,4 +0,0 @@
version-id:0.24
platform-version:110.0
idea.download.url=http://download.jetbrains.com/idea/ideaIU-11.zip
build.number=x

182
build.xml
View File

@@ -1,182 +0,0 @@
<project name="IdeaVim">
<!--
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2009 Rick Maddy, Oleg Shpynov
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-->
<property file="build.properties"/>
<property name="idea" value="${basedir}/idea"/>
<property name="src" value="${basedir}/src"/>
<property name="resources" value="${basedir}/resources"/>
<property name="test" value="${basedir}/test"/>
<property name="keymap" value="${basedir}/resources/Vim.xml"/>
<property name="idea.home" value="${idea}/unzip"/>
<property environment="env"/>
<property name="tools.jar" value="${env.JAVA_HOME}/lib/tools.jar"/>
<property name="version" value="${version-id}-${build.number}"/>
<property name="filename" value="ideavim-${version}"/>
<!--Output-->
<property name="out" value="${basedir}/out"/>
<property name="classes" value="${out}/classes"/>
<property name="build" value="${out}/build"/>
<property name="dist" value="${out}/dist"/>
<property name="test-reports" value="${out}/test-reports"/>
<path id="build.classpath">
<fileset dir="${idea.home}/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${java.home}/lib">
<include name="*.jar"/>
</fileset>
<pathelement path="${classes}"/>
</path>
<path id="test.classpath">
<path refid="build.classpath"/>
<pathelement path="${tools.jar}"/>
</path>
<!-- Clean all the generated stuff -->
<target name="clean" description="Removes all generated files">
<delete dir="${out}"/>
</target>
<!-- Compile all the sources to the ${classes} folder -->
<target name="compile">
<mkdir dir="${classes}"/>
<taskdef name="javac2" classname="com.intellij.ant.Javac2">
<classpath refid="build.classpath"/>
</taskdef>
<!-- The task requires the following libraries from IntelliJ IDEA distribution: -->
<!-- javac2.jar; jdom.jar; asm.jar; asm-commons.jar -->
<javac2 destdir="${classes}" debug="on" fork="true" encoding="UTF-8" includeantruntime="false">
<classpath refid="build.classpath"/>
<src path="${src}"/>
<include name="com/maddyhome/idea/**"/>
</javac2>
</target>
<!-- Create ideavim.jar for packing inside zip plugin package -->
<target name="jar">
<mkdir dir="${classes}"/>
<mkdir dir="${classes}/META-INF"/>
<copy file="resources/META-INF/plugin.xml" todir="${classes}/META-INF">
<filterset>
<filter token="VERSION" value="${version}"/>
<filter token="SINCE-VERSION" value="${platform-version}"/>
</filterset>
</copy>
<copy todir="${classes}">
<fileset dir="${src}" excludes="**/*.java"/>
</copy>
<copy todir="${classes}">
<fileset dir="${resources}"/>
</copy>
<mkdir dir="${build}"/>
<jar basedir="${classes}" jarfile="${build}/IdeaVim.jar" compress="yes"/>
</target>
<target name="build" depends="unzip, clean, compile, jar" description="Compiles all source code and created plugin jar file"/>
<!-- Download IntelliJ IDEA distribution -->
<target name="download" description="Downloads IntelliJ IDEA artifacts">
<mkdir dir="${idea}"/>
<get src="${idea.download.url}" dest="${idea}" skipexisting="true"/>
</target>
<!-- Unpack idea-*.zip file for ideavim compilation -->
<target name="unzip" depends="download" description="Unzip downloaded artifacts and set up idea.home">
<delete dir="${idea}/unzip"/>
<mkdir dir="${idea}/unzip"/>
<basename property="idea.filename" file="${idea.download.url}"/>
<unzip dest="${idea}/unzip">
<fileset dir="${idea}" includes="${idea.filename}"/>
</unzip>
</target>
<target name="dist" depends="dist-src, dist-bin" description="Creates the src and bin distribution files"/>
<!-- Prepare layout for plugin distribution and creates zip file which can be published -->
<target name="dist-bin" depends="clean, build" description="Creates a zip file containing the plugin sources">
<delete dir="${build}/IdeaVim"/>
<mkdir dir="${build}/IdeaVim"/>
<copy file="${basedir}/LICENSE.txt" tofile="${build}/IdeaVim/LICENSE"/>
<copy file="${keymap}" todir="${build}/IdeaVim"/>
<copy todir="${build}/IdeaVim/lib">
<fileset dir="${build}" includes="*.jar"/>
</copy>
<copy file="${basedir}/README.md" tofile="${build}/IdeaVim/README"/>
<copy file="${basedir}/CHANGES.md" tofile="${build}/IdeaVim/CHANGES"/>
<zip basedir="${build}" zipfile="${dist}/${filename}.zip" compress="true" includes="IdeaVim/**"/>
</target>
<!-- Packs all the sources -->
<target name="dist-src" depends="clean" description="Creates the source tar file">
<mkdir dir="${dist}"/>
<tar basedir="." destfile="${dist}/${filename}-src.tar.gz" excludes=".git/**,.idea/**,idea/**,out/**,*.iws,*.iml" compression="gzip"/>
</target>
<target name="compile-tests" depends="compile">
<mkdir dir="${classes}"/>
<taskdef name="javac2" classname="com.intellij.ant.Javac2">
<classpath refid="build.classpath"/>
</taskdef>
<javac2 destdir="${classes}" debug="on" fork="true" encoding="UTF-8" includeantruntime="false">
<classpath refid="build.classpath"/>
<src path="${test}"/>
<include name="org/jetbrains/plugins/ideavim/**"/>
</javac2>
</target>
<target name="prepare-tests" depends="compile-tests">
<mkdir dir="${classes}/META-INF"/>
<copy file="resources/META-INF/plugin.xml" todir="${classes}/META-INF">
<filterset>
<filter token="VERSION" value="${version}"/>
<filter token="SINCE-VERSION" value="${platform-version}"/>
</filterset>
</copy>
<copy todir="${classes}">
<fileset dir="${resources}"/>
</copy>
<mkdir dir="${out}/IdeaVim"/>
<copy file="${keymap}" todir="${build}/IdeaVim"/>
</target>
<target name="test" depends="unzip, clean, prepare-tests">
<mkdir dir="${test-reports}"/>
<junit fork="true" logfailedtests="false" printsummary="true">
<classpath refid="test.classpath"/>
<jvmarg value="-Xmx256M"/>
<jvmarg value="-ea"/>
<jvmarg value="-Djava.awt.headless=true"/>
<jvmarg value="-Didea.plugins.path=${out}"/>
<jvmarg value="-Didea.load.plugins.id=IdeaVIM"/>
<formatter type="plain"/>
<batchtest todir="${test-reports}">
<fileset dir="${test}">
<include name="**/*Test.java"/>
</fileset>
</batchtest>
</junit>
</target>
</project>

View File

@@ -1,23 +1,31 @@
List of Supported Set Commands
==============================
The following `:set` commands can appear in `~/.vimrc` or set manually in the command mode:
The following `:set` commands can appear in `~/.ideavimrc` or set manually in the command mode:
'digraph' 'dg' enable the entering of digraphs in Insert mode
'gdefault' 'gd' the ":substitute" flag 'g' is default on
'history' 'hi' number of command-lines that are remembered
'hlsearch' 'hls' highlight matches with last search pattern
'ignorecase' 'ic' ignore case in search patterns
'matchpairs' 'mps' pairs of characters that "%" can match
'nrformats' 'nf' number formats recognized for CTRL-A command
'scroll' 'scr' lines to scroll with CTRL-U and CTRL-D
'scrolljump' 'sj' minimum number of lines to scroll
'scrolloff' 'so' minimum nr. of lines above and below cursor
'selection' 'sel' what type of selection to use
'showmode' 'smd' message on status line to show current mode
'sidescroll' 'ss' minimum number of columns to scroll horizontal
'sidescrolloff' 'siso' min. nr. of columns to left and right of cursor
'smartcase' 'scs' no ignore case when pattern has uppercase
'undolevels' 'ul' maximum number of changes that can be undone
'visualbell' 'vb' use visual bell instead of beeping
'wrapscan' 'ws' searches wrap around the end of the file
'clipboard' 'cb' clipboard options
'digraph' 'dg' enable the entering of digraphs in Insert mode
'gdefault' 'gd' the ":substitute" flag 'g' is default on
'history' 'hi' number of command-lines that are remembered
'hlsearch' 'hls' highlight matches with last search pattern
'ignorecase' 'ic' ignore case in search patterns
'incsearch' 'is' show where search pattern typed so far matches
'matchpairs' 'mps' pairs of characters that "%" can match
'nrformats' 'nf' number formats recognized for CTRL-A command
'number' 'nu' print the line number in front of each line
'relativenumber' 'rnu' show the line number relative to the line with
the cursor
'scroll' 'scr' lines to scroll with CTRL-U and CTRL-D
'scrolljump' 'sj' minimum number of lines to scroll
'scrolloff' 'so' minimum nr. of lines above and below cursor
'selection' 'sel' what type of selection to use
'showmode' 'smd' message on status line to show current mode
'sidescroll' 'ss' minimum number of columns to scroll horizontal
'sidescrolloff' 'siso' min. nr. of columns to left and right of cursor
'smartcase' 'scs' no ignore case when pattern has uppercase
'timeout' 'to' use timeout for mapped key sequences
'timeoutlen' 'tm' time that is waited for a mapped key sequence
'undolevels' 'ul' maximum number of changes that can be undone
'viminfo' 'vi' information to remember after restart
'visualbell' 'vb' use visual bell instead of beeping
'wrapscan' 'ws' searches wrap around the end of the file

7
gradle.properties Normal file
View File

@@ -0,0 +1,7 @@
ideaVersion IC-15.0.5
downloadIdeaSources true
version SNAPSHOT
javaVersion 1.6
publishUsername username
publishPassword password
publishChannels eap

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,6 @@
#Sat Jan 23 00:00:00 MSK 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

160
gradlew vendored Executable file
View File

@@ -0,0 +1,160 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

90
gradlew.bat vendored Normal file
View File

@@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PLUGIN_MODULE" version="4">
<component name="DevKit.ModuleBuildProperties" url="file://$MODULE_DIR$/resources/META-INF/plugin.xml" />
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@@ -26,6 +26,8 @@ tag char action in Insert mode ~
enter digraph
|i_CTRL-O| CTRL-O execute a single command and return to insert
mode
|i_CTRL-R| CTRL-R {0-9a-z"%#*:=}
insert the contents of a register
|i_CTRL-W| CTRL-W delete word before the cursor
==============================================================================
@@ -63,6 +65,8 @@ tag char note action in Normal mode ~
|count| 9 "
|F| F{char} 1 cursor to the Nth occurrence of {char} to
the left
|O| O 2 begin a new line above the cursor and
insert text, repeat N times
|P| ["x]P 2 put the text [from buffer x] before the
cursor N times
|T| T{char} 1 cursor till after Nth occurrence of {char}
@@ -159,6 +163,20 @@ tag command note action in Visual mode ~
------------------------------------------------------------------------------
|v_y| y yank the highlighted area
==============================================================================
4. Command-line editing *ex-edit-index*
Get to the command-line with the ':', '!', '/' or '?' commands.
Normal characters are inserted at the current cursor position.
"Completion" below refers to context-sensitive completion. It will complete
file names, tags, commands etc. as appropriate.
tag command action in Command-line editing mode ~
------------------------------------------------------------------------------
|c_CTRL-R| CTRL-R {0-9a-z"%#*:= CTRL-F CTRL-P CTRL-W CTRL-A}
insert the contents of a register or object
under the cursor as if typed
==============================================================================
5. EX commands *ex-cmd-index*

View File

@@ -1,352 +1,362 @@
<idea-plugin url="http://plugins.intellij.net/plugin/?id=164">
<name>IdeaVIM</name>
<id>IdeaVIM</id>
<description><![CDATA[
<p>Vim emulation plug-in for IDEs based on the IntelliJ platform. IdeaVim can be used with IntelliJ IDEA, RubyMine, PyCharm, PhpStorm, WebStorm and AppCode.</p>
<p>Supported functionality:</p>
<ul>
<li>Motion keys</li>
<li>Deletion/Changing</li>
<li>Insert mode commands</li>
<li>Marks</li>
<li>Registers</li>
<li>Undo/redo</li>
<li>Visual mode commands</li>
<li>Some Ex commands</li>
<li>Some :set options</li>
<li>Full Vim regexps for search and search/replace</li>
<li>Macros</li>
<li>Digraphs</li>
<li>Command line and search history</li>
<li>Vim web help</li>
</ul>
<idea-plugin url="http://plugins.jetbrains.com/plugin/164">
<name>IdeaVim</name>
<id>IdeaVIM</id>
<change-notes><![CDATA[
<p>0.47:</p>
<ul>
<li>Various bug fixes</li>
</ul>
<p>0.46:</p>
<ul>
<li>Support for <code>incsearch</code> option for showing search results while typing</li>
<li>Support for <code>it</code> and <code>at</code> tag block selection</li>
<li>Support for vim-surround commands <code>ys</code>, <code>cs</code>, <code>ds</code>, <code>S</code>, enable it with <code>set surround</code> in your ~/.ideavimrc</li>
<li>Support for <code>={motion}</code> formatting command</li>
<li>Various bug fixes</li>
</ul>
<p>0.44:</p>
<ul>
<li>Fixed typing keys in completion menus and typing with the plugin disabled</li>
</ul>
<p>0.43:</p>
<ul>
<li>Fixed running the plugin with Java 6</li>
</ul>
<p>0.42:</p>
<ul>
<li>Fixed move commands in read-only files</li>
</ul>
<p>0.41:</p>
<ul>
<li>Various bug fixes</li>
</ul>
<p>0.40:</p>
<ul>
<li>Support for <code>mapleader</code></li>
<li>Support comments in <code>%</code> brace matching</li>
<li>Various bug fixes</li>
</ul>
<p>See also the complete <a href="https://github.com/JetBrains/ideavim/blob/master/CHANGES.md">changelog</a>.</p>
]]></change-notes>
<description><![CDATA[
<p>Vim emulation plug-in for IDEs based on the IntelliJ platform.</p>
<p>IdeaVim supports many Vim features including normal/insert/visual modes, motion keys, deletion/changing, marks, registers, some Ex commands, Vim regexps, configuration via ~/.ideavimrc, macros, window commands, etc.</p>
<p>See also:</p>
<ul>
<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>
</ul>
]]></description>
<version>@VERSION@</version>
<vendor logo="/icons/vim16x16.png">Rick Maddy, JetBrains</vendor>
<version>SNAPSHOT</version>
<vendor>JetBrains</vendor>
<helpset file="help.jar" path="/VimHelp.hs"/>
<idea-version since-build="@SINCE-VERSION@"/>
<idea-version since-build="143.0"/>
<!-- Mark the plugin as compatible with RubyMine and other products based on the IntelliJ platform -->
<depends>com.intellij.modules.lang</depends>
<resource-bundle xmlns="">messages</resource-bundle>
<!-- Mark the plugin as compatible with RubyMine and other products based on the IntelliJ platform -->
<depends>com.intellij.modules.lang</depends>
<resource-bundle xmlns="">messages</resource-bundle>
<application-components>
<component>
<implementation-class>com.maddyhome.idea.vim.VimPlugin</implementation-class>
</component>
</application-components>
<application-components>
<component>
<implementation-class>com.maddyhome.idea.vim.VimPlugin</implementation-class>
</component>
</application-components>
<extensions defaultExtensionNs="com.intellij">
<errorHandler implementation="com.intellij.diagnostic.ITNReporter"/>
</extensions>
<extensionPoints>
<extensionPoint qualifiedName="IdeaVIM.vimExtension" interface="com.maddyhome.idea.vim.extension.VimExtension"/>
</extensionPoints>
<actions>
<action id="VimPluginToggle" class="com.maddyhome.idea.vim.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"/>
</action>
<action id="VimReconfigureKeymap" class="com.maddyhome.idea.vim.VimReconfigureKeymapAction" text="Reconfigure VIM Keymap" description="Reconfigure VIM keymap">
<add-to-group group-id="ToolsMenu" order="after VimPluginToggle"/>
</action>
<extensions defaultExtensionNs="com.intellij">
<applicationConfigurable instance="com.maddyhome.idea.vim.ui.VimEmulationConfigurable"/>
</extensions>
<!-- 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="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="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="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="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"/>
<!-- Up/Down -->
<action id="VimMotionDown" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownAction" text="Down"/>
<action id="VimMotionDownFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction" 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="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="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="VimMotionUpFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionUpFirstNonSpaceAction" text="Up to First non-Space"/>
<!-- 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="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="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="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="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="VimMotionGotoFileMarkLine" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineAction" text="Goto Mark Line"/>
<action id="VimMotionGotoMark" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkAction" text="Goto Mark"/>
<action id="VimMotionGotoMarkLine" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineAction" 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"/>
<action id="VimForward" class="com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction" text="Forward"/>
<action id="VimBack" class="com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction" text="Back"/>
<!-- 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="VimMotionLastScreenLineEnd" class="com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineEndAction" text="Last Screen Line End"/>
<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="VimMotionScrollPageUp" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction" 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"/>
<!-- 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="Swap Visual Selection Ends"/>
<action id="VimVisualSwapSelections" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction" text="Swap Visual Selection Ends"/>
<extensions defaultExtensionNs="IdeaVIM">
<vimExtension implementation="com.maddyhome.idea.vim.extension.surround.VimSurroundExtension"/>
</extensions>
<!-- 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="VimInsertHelp" class="com.maddyhome.idea.vim.action.change.insert.InsertHelpAction" text="Help"/>
<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"/>
<actions>
<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"/>
</action>
<!-- 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"/>
<!-- 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="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="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="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="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"/>
<!-- Up/Down -->
<action id="VimMotionDown" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownAction" text="Down"/>
<action id="VimMotionDownFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction" 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="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="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="VimMotionUpFirstNonSpace" class="com.maddyhome.idea.vim.action.motion.updown.MotionUpFirstNonSpaceAction" text="Up to First non-Space"/>
<!-- 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="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="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="VimMotionGotoFileMarkLine" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineAction" text="Goto Mark Line"/>
<action id="VimMotionGotoMark" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkAction" text="Goto Mark"/>
<action id="VimMotionGotoMarkLine" class="com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineAction" 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"/>
<action id="VimForward" class="com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction" text="Forward"/>
<action id="VimBack" class="com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction" text="Back"/>
<!-- 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="VimMotionScrollPageUp" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction" 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"/>
<!-- 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"/>
<!-- 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.ChangeNumberIncAction" text="Increment Number"/>
<action id="VimChangeNumberDec" class="com.maddyhome.idea.vim.action.change.change.ChangeNumberDecAction" 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.visual.VisualOperatorDelegateAction" text="Auto Indent Selection"/>
<action id="VimReformatVisual" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Reformat Selection"/>
<action id="VimCommentByBlockComment" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Block Comment"/>
<action id="VimCommentByLineComment" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Line Comment"/>
<action id="VimSurroundWith" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Surround With"/>
<action id="VimSurroundWithLiveTemplate" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Surround With Live Template"/>
<action id="VimMoveStatementDown" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Move Statement Down"/>
<action id="VimMoveStatementUp" class="com.maddyhome.idea.vim.action.visual.VisualOperatorDelegateAction" text="Move Statement Up"/>
<!-- 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"/>
<!-- Shift -->
<action id="VimAutoIndentLines" class="com.maddyhome.idea.vim.action.change.shift.AutoIndentLinesAction" text="Auto Indent Lines"/>
<action id="VimShiftLeftLines" class="com.maddyhome.idea.vim.action.change.shift.ShiftLeftLinesAction" 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="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"/>
<!-- 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"/>
<!-- 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="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"/>
<!-- 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.ChangeNumberIncAction" text="Increment Number"/>
<action id="VimChangeNumberDec" class="com.maddyhome.idea.vim.action.change.change.ChangeNumberDecAction" 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"/>
<!-- 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"/>
<!-- 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="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="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"/>
<!-- 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"/>
<!-- 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="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"/>
<!-- 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"/>
<!-- 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"/>
<!-- Command Line -->
<action id="VimExBackspace" class="com.maddyhome.idea.vim.action.ex.BackspaceAction" text="Backspace"/>
<action id="VimProcessExEntry" class="com.maddyhome.idea.vim.action.ex.ProcessExEntryAction" text="Process Ex Entry"/>
<action id="VimProcessExKey" class="com.maddyhome.idea.vim.action.ex.ProcessExKeyAction" text="Process Ex Key"/>
<action id="VimCancelExEntry" class="com.maddyhome.idea.vim.action.ex.CancelExEntryAction" text="Cancel Ex Entry"/>
<!-- 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"/>
<!-- 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"/>
<action id="VimGenerateConstructor" class="com.maddyhome.idea.vim.action.TxActionWrapper" text="Generate Constructor"/>
<action id="VimGenerateGetter" class="com.maddyhome.idea.vim.action.TxActionWrapper" text="Generate Getter"/>
<action id="VimGenerateSetter" class="com.maddyhome.idea.vim.action.TxActionWrapper" text="Generate Setter"/>
<action id="VimGenerateGetterAndSetter" class="com.maddyhome.idea.vim.action.TxActionWrapper" text="Generate Getter and Setter"/>
<action id="VimGenerateEquals" class="com.maddyhome.idea.vim.action.TxActionWrapper" text="Generate Equals"/>
<!-- 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"/>
<action id="VimClassNameCompletion" class="com.maddyhome.idea.vim.action.OriginalDelegateAction" text="Class Name Completion"/>
<action id="VimCodeCompletion" class="com.maddyhome.idea.vim.action.OriginalDelegateAction" text="Code Completion"/>
<action id="VimSmartTypeCompletion" class="com.maddyhome.idea.vim.action.OriginalDelegateAction" text="Smart Type Completion"/>
<action id="VimWordCompletion" class="com.maddyhome.idea.vim.action.OriginalDelegateAction" text="Word Completion"/>
<action id="VimInsertLiveTemplate" class="com.maddyhome.idea.vim.action.OriginalDelegateAction" text="Insert Live Template"/>
<!-- 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"/>
<!-- Keys -->
<action id="VimKeyHandler" class="com.maddyhome.idea.vim.action.key.KeyAction" text="Keys"/>
<action id="VimDummyHandler" class="com.maddyhome.idea.vim.action.key.DummyAction" text="Keys"/>
<action id="VimNotImplementedHandler" class="com.maddyhome.idea.vim.action.key.NotImplementedAction" text="Reserved For Future Use"/>
<action id="VimEditorBackSpace" class="com.maddyhome.idea.vim.action.key.BackSpaceAction" text="Backspace"/>
<action id="VimEditorDelete" class="com.maddyhome.idea.vim.action.key.DeleteAction" text="Delete"/>
<action id="VimEditorDown" class="com.maddyhome.idea.vim.action.key.DownAction" text="Down"/>
<action id="VimEditorEnter" class="com.maddyhome.idea.vim.action.key.EnterAction" text="Enter"/>
<action id="VimEditorEscape" class="com.maddyhome.idea.vim.action.key.EscapeAction" text="Escape"/>
<action id="VimEditorLeft" class="com.maddyhome.idea.vim.action.key.LeftAction" text="Left"/>
<action id="VimEditorLineEnd" class="com.maddyhome.idea.vim.action.key.LineEndAction" text="LineEnd"/>
<action id="VimEditorLineStart" class="com.maddyhome.idea.vim.action.key.LineStartAction" text="LineStart"/>
<action id="VimEditorPageDown" class="com.maddyhome.idea.vim.action.key.PageDownAction" text="PageDown"/>
<action id="VimEditorPageUp" class="com.maddyhome.idea.vim.action.key.PageUpAction" text="PageUp"/>
<action id="VimEditorRight" class="com.maddyhome.idea.vim.action.key.RightAction" text="Right"/>
<action id="VimEditorTab" class="com.maddyhome.idea.vim.action.key.TabAction" text="Tab"/>
<action id="VimEditorToggleInsertState" class="com.maddyhome.idea.vim.action.key.ToggleInsertStateAction" text="Insert/Overwrite"/>
<action id="VimEditorUp" class="com.maddyhome.idea.vim.action.key.UpAction" text="Up"/>
<action id="VimDigraphEntry" class="com.maddyhome.idea.vim.action.key.KeyAction" text="Digraph Entry"/>
</actions>
<!-- Command Line -->
<action id="VimExBackspace" class="com.maddyhome.idea.vim.action.ex.BackspaceAction" text="Backspace"/>
<action id="VimProcessExEntry" class="com.maddyhome.idea.vim.action.ex.ProcessExEntryAction" text="Process Ex Entry"/>
<action id="VimProcessExKey" class="com.maddyhome.idea.vim.action.ex.ProcessExKeyAction" text="Process Ex Key"/>
<action id="VimCancelExEntry" class="com.maddyhome.idea.vim.action.ex.CancelExEntryAction" text="Cancel 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"/>
<!-- Keys -->
<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"/>
</actions>
</idea-plugin>

View File

@@ -1,178 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<keymap version="1" name="Vim" disable-mnemonics="false" parent="$default">
<action id="$Copy">
<keyboard-shortcut first-keystroke="control INSERT" />
<keyboard-shortcut first-keystroke="meta C" />
</action>
<action id="$Cut">
<keyboard-shortcut first-keystroke="shift DELETE" />
<keyboard-shortcut first-keystroke="meta X" />
</action>
<action id="$Paste">
<keyboard-shortcut first-keystroke="shift INSERT" />
<keyboard-shortcut first-keystroke="meta V" />
</action>
<action id="$Redo">
<keyboard-shortcut first-keystroke="shift alt BACK_SPACE" />
</action>
<action id="$SelectAll" />
<action id="$Undo">
<keyboard-shortcut first-keystroke="alt BACK_SPACE" />
</action>
<action id="CheckinProject" />
<action id="ClassNameCompletion" />
<action id="ClearCase.CheckInProject" />
<action id="CodeCompletion" />
<action id="CommanderSwapPanels" />
<action id="ContextHelp" />
<action id="EditorBackSpace">
<keyboard-shortcut first-keystroke="BACK_SPACE" />
</action>
<action id="EditorCodeBlockEnd" />
<action id="EditorCodeBlockStart" />
<action id="EditorCopy">
<keyboard-shortcut first-keystroke="control INSERT" />
<keyboard-shortcut first-keystroke="meta C" />
</action>
<action id="EditorCut">
<keyboard-shortcut first-keystroke="shift DELETE" />
<keyboard-shortcut first-keystroke="meta X" />
</action>
<action id="EditorDeleteLine" />
<action id="EditorDeleteToWordEnd" />
<action id="EditorDeleteToWordStart" />
<action id="EditorDownWithSelection" />
<action id="EditorDuplicate" />
<action id="EditorIndentSelection" />
<action id="EditorJoinLines" />
<action id="EditorLeftWithSelection" />
<action id="EditorLineEndWithSelection" />
<action id="EditorLineStartWithSelection" />
<action id="EditorMoveToPageBottom" />
<action id="EditorMoveToPageBottomWithSelection" />
<action id="EditorMoveToPageTop" />
<action id="EditorMoveToPageTopWithSelection" />
<action id="EditorNextWord" />
<action id="EditorNextWordWithSelection" />
<action id="EditorPageDownWithSelection" />
<action id="EditorPageUpWithSelection" />
<action id="EditorPaste">
<keyboard-shortcut first-keystroke="shift INSERT" />
<keyboard-shortcut first-keystroke="meta V" />
</action>
<action id="EditorPreviousWord" />
<action id="EditorPreviousWordWithSelection" />
<action id="EditorRedo" />
<action id="EditorRightWithSelection" />
<action id="EditorScrollDown" />
<action id="EditorScrollToCenter" />
<action id="EditorScrollUp" />
<action id="EditorSelectAll" />
<action id="EditorSelectWord" />
<action id="EditorSplitLine" />
<action id="EditorStartNewLine" />
<action id="EditorTextEnd" />
<action id="EditorTextEndWithSelection" />
<action id="EditorTextStart" />
<action id="EditorTextStartWithSelection" />
<action id="EditorToggleCase" />
<action id="EditorUnSelectWord" />
<action id="EditorUndo" />
<action id="EditorUnindentSelection" />
<action id="EditorUpWithSelection" />
<action id="Find" />
<action id="FindNext">
<keyboard-shortcut first-keystroke="F3" />
</action>
<action id="FindPrevious">
<keyboard-shortcut first-keystroke="shift F3" />
</action>
<action id="GotoBookmark2" />
<action id="GotoClass">
<keyboard-shortcut first-keystroke="shift alt N" />
</action>
<action id="GotoDeclaration">
<mouse-shortcut keystroke="control button1" />
<mouse-shortcut keystroke="button2" />
</action>
<action id="GotoLine" />
<action id="GotoSuperMethod">
<keyboard-shortcut first-keystroke="shift control U" />
</action>
<action id="ImplementMethods">
<keyboard-shortcut first-keystroke="shift control I" />
</action>
<action id="InsertLiveTemplate" />
<action id="MethodHierarchy.ImplementMethodAction" />
<action id="MethodHierarchy.OverrideMethodAction" />
<action id="OverrideMethods">
<keyboard-shortcut first-keystroke="shift control O" />
</action>
<action id="ParameterInfo">
<keyboard-shortcut first-keystroke="shift control P" />
</action>
<action id="QuickJavaDoc">
<mouse-shortcut keystroke="alt button2" />
</action>
<action id="RecentFiles" />
<action id="Replace" />
<action id="SaveAll" />
<action id="SmartTypeCompletion" />
<action id="Starteam.CheckinProject" />
<action id="Subversion.CommitProject" />
<action id="ToggleBookmark2" />
<action id="TypeHierarchy">
<keyboard-shortcut first-keystroke="shift control alt H" />
</action>
<action id="VimKeyHandler">
<keyboard-shortcut first-keystroke="control 2" />
<keyboard-shortcut first-keystroke="control A" />
<keyboard-shortcut first-keystroke="control alt SPACE" />
<keyboard-shortcut first-keystroke="control B" />
<keyboard-shortcut first-keystroke="control BACK_SLASH" />
<keyboard-shortcut first-keystroke="control C" />
<keyboard-shortcut first-keystroke="control CLOSE_BRACKET" />
<keyboard-shortcut first-keystroke="control D" />
<keyboard-shortcut first-keystroke="control E" />
<keyboard-shortcut first-keystroke="control END" />
<keyboard-shortcut first-keystroke="control F" />
<keyboard-shortcut first-keystroke="control G" />
<keyboard-shortcut first-keystroke="control H" />
<keyboard-shortcut first-keystroke="control HOME" />
<keyboard-shortcut first-keystroke="control I" />
<keyboard-shortcut first-keystroke="control J" />
<keyboard-shortcut first-keystroke="control K" />
<keyboard-shortcut first-keystroke="control L" />
<keyboard-shortcut first-keystroke="control LEFT" />
<keyboard-shortcut first-keystroke="control M" />
<keyboard-shortcut first-keystroke="control N" />
<keyboard-shortcut first-keystroke="control O" />
<keyboard-shortcut first-keystroke="control OPEN_BRACKET" />
<keyboard-shortcut first-keystroke="control P" />
<keyboard-shortcut first-keystroke="control PAGE_DOWN" />
<keyboard-shortcut first-keystroke="control PAGE_UP" />
<keyboard-shortcut first-keystroke="control Q" />
<keyboard-shortcut first-keystroke="control R" />
<keyboard-shortcut first-keystroke="control RIGHT" />
<keyboard-shortcut first-keystroke="control S" />
<keyboard-shortcut first-keystroke="control SPACE" />
<keyboard-shortcut first-keystroke="control T" />
<keyboard-shortcut first-keystroke="control U" />
<keyboard-shortcut first-keystroke="control V" />
<keyboard-shortcut first-keystroke="control W" />
<keyboard-shortcut first-keystroke="control X" />
<keyboard-shortcut first-keystroke="control Y" />
<keyboard-shortcut first-keystroke="control Z" />
<keyboard-shortcut first-keystroke="KP_DOWN" />
<keyboard-shortcut first-keystroke="KP_LEFT" />
<keyboard-shortcut first-keystroke="KP_RIGHT" />
<keyboard-shortcut first-keystroke="KP_UP" />
<keyboard-shortcut first-keystroke="shift control 2" />
<keyboard-shortcut first-keystroke="shift control SPACE" />
<keyboard-shortcut first-keystroke="shift DOWN" />
<keyboard-shortcut first-keystroke="shift LEFT" />
<keyboard-shortcut first-keystroke="shift RIGHT" />
<keyboard-shortcut first-keystroke="shift UP" />
</action>
</keymap>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

View File

@@ -48,3 +48,4 @@ E385=E385: search hit BOTTOM without match for: {0}
e_patnotf2=Pattern not found: {0}
unkopt=Unknown option: {0}
e_invarg=Invalid argument: {0}
E774=E774: 'operatorfunc' is empty

View File

@@ -0,0 +1,127 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.ShortcutSet;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.actionSystem.TypedAction;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.editor.event.*;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ProjectManagerListener;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author vlan
*/
public class EventFacade {
@NotNull private static final EventFacade ourInstance = new EventFacade();
@Nullable private TypedActionHandler myOriginalTypedActionHandler;
private EventFacade() {
}
@NotNull
public static EventFacade getInstance() {
return ourInstance;
}
public void addProjectManagerListener(@NotNull ProjectManagerListener listener) {
ProjectManager.getInstance().addProjectManagerListener(listener);
}
public void setupTypedActionHandler(@NotNull TypedActionHandler handler) {
final TypedAction typedAction = getTypedAction();
myOriginalTypedActionHandler = typedAction.getRawHandler();
typedAction.setupRawHandler(handler);
}
public void restoreTypedActionHandler() {
if (myOriginalTypedActionHandler != null) {
getTypedAction().setupRawHandler(myOriginalTypedActionHandler);
}
}
public void registerCustomShortcutSet(@NotNull AnAction action, @NotNull ShortcutSet shortcutSet,
@Nullable JComponent component) {
action.registerCustomShortcutSet(shortcutSet, component);
}
public void unregisterCustomShortcutSet(@NotNull AnAction action, @Nullable JComponent component) {
action.unregisterCustomShortcutSet(component);
}
public void addFileEditorManagerListener(@NotNull Project project, @NotNull FileEditorManagerListener listener) {
final MessageBusConnection connection = project.getMessageBus().connect();
connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener);
}
public void addDocumentListener(@NotNull Document document, @NotNull DocumentListener listener) {
document.addDocumentListener(listener);
}
public void removeDocumentListener(@NotNull Document document, @NotNull DocumentListener listener) {
document.removeDocumentListener(listener);
}
public void addEditorFactoryListener(@NotNull EditorFactoryListener listener, @NotNull Disposable parentDisposable) {
EditorFactory.getInstance().addEditorFactoryListener(listener, parentDisposable);
}
public void addEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) {
editor.addEditorMouseListener(listener);
}
public void removeEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) {
editor.removeEditorMouseListener(listener);
}
public void addEditorMouseMotionListener(@NotNull Editor editor, @NotNull EditorMouseMotionListener listener) {
editor.addEditorMouseMotionListener(listener);
}
public void removeEditorMouseMotionListener(@NotNull Editor editor, @NotNull EditorMouseMotionListener listener) {
editor.removeEditorMouseMotionListener(listener);
}
public void addEditorSelectionListener(@NotNull Editor editor, @NotNull SelectionListener listener) {
editor.getSelectionModel().addSelectionListener(listener);
}
public void removeEditorSelectionListener(@NotNull Editor editor, @NotNull SelectionListener listener) {
editor.getSelectionModel().removeSelectionListener(listener);
}
@NotNull
private TypedAction getTypedAction() {
return EditorActionManager.getInstance().getTypedAction();
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2006 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.project.Project;
@@ -32,18 +32,18 @@ import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.extension.VimExtensionHandler;
import com.maddyhome.idea.vim.group.RegisterGroup;
import com.maddyhome.idea.vim.helper.DelegateCommandListener;
import com.maddyhome.idea.vim.helper.DigraphSequence;
import com.maddyhome.idea.vim.helper.EditorHelper;
import com.maddyhome.idea.vim.helper.RunnableHelper;
import com.maddyhome.idea.vim.helper.*;
import com.maddyhome.idea.vim.key.*;
import com.maddyhome.idea.vim.option.Options;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
@@ -101,32 +101,39 @@ public class KeyHandler {
* @param context The data context
*/
public void handleKey(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context) {
handleKey(editor, key, context, true);
}
public void handleKey(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context,
boolean allowKeyMappings) {
VimPlugin.clearError();
// All the editor actions should be performed with top level editor!!!
// Be careful: all the EditorActionHandler implementation should correctly process InjectedEditors
editor = InjectedLanguageUtil.getTopLevelEditor(editor);
logger.debug("handleKey " + key);
final CommandState editorState = CommandState.getInstance(editor);
final boolean isRecording = editorState.isRecording();
boolean shouldRecord = true;
// If this is a "regular" character keystroke, get the character
char chKey = key.getKeyChar() == KeyEvent.CHAR_UNDEFINED ? 0 : key.getKeyChar();
if (isEditorReset(key, editorState)) {
handleEditorReset(editor, key, context);
}
// At this point the user must be typing in a command. Most commands can be preceded by a number. Let's
// check if a number can be entered at this point, and if so, did the user send us a digit.
else if (isCommandCount(editorState, chKey)) {
final boolean isRecording = editorState.isRecording();
boolean shouldRecord = true;
// Check for command count before key mappings - otherwise e.g. ':map 0 ^' breaks command counts that contain a zero
if (isCommandCount(editorState, chKey)) {
// Update the count
count = count * 10 + (chKey - '0');
logger.debug("count now " + count);
}
else if (allowKeyMappings && handleKeyMapping(editor, key, context)) {
return;
}
// Pressing delete while entering a count "removes" the last digit entered
// Unlike the digits, this must be checked *after* checking for key mappings
else if (isDeleteCommandCount(key, editorState)) {
// "Remove" the last digit sent to us
count /= 10;
logger.debug("count now " + count);
}
else if (isEditorReset(key, editorState)) {
handleEditorReset(editor, key, context);
}
// If we got this far the user is entering a command or supplying an argument to an entered command.
// First let's check to see if we are at the point of expecting a single character argument to a command.
@@ -138,9 +145,6 @@ public class KeyHandler {
else {
// For debugging purposes we track the keys entered for this command
keys.add(key);
if (logger.isDebugEnabled()) {
logger.debug("keys now " + keys);
}
// 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
@@ -161,27 +165,22 @@ public class KeyHandler {
// 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, shouldRecord, (ArgumentNode)node);
shouldRecord = handleArgumentNode(editor, key, context, editorState, (ArgumentNode)node);
}
else {
logger.debug("checking for digraph");
logger.debug("lastWasBS=" + lastWasBS);
logger.debug("lastChar=" + lastChar);
if (lastWasBS && lastChar != 0 && Options.getInstance().isSet("digraph")) {
char dig = CommandGroups.getInstance().getDigraph().getDigraph(lastChar, key.getKeyChar());
logger.debug("dig=" + dig);
char dig = VimPlugin.getDigraph().getDigraph(lastChar, key.getKeyChar());
key = KeyStroke.getKeyStroke(dig);
}
// If we are in insert/replace mode send this key in for processing
if (editorState.getMode() == CommandState.Mode.INSERT ||
editorState.getMode() == CommandState.Mode.REPLACE) {
if (!CommandGroups.getInstance().getChange().processKey(editor, context, key)) {
if (editorState.getMode() == CommandState.Mode.INSERT || editorState.getMode() == CommandState.Mode.REPLACE) {
if (!VimPlugin.getChange().processKey(editor, context, key)) {
shouldRecord = false;
}
}
else if (editorState.getMappingMode() == KeyParser.MAPPING_CMD_LINE) {
if (!CommandGroups.getInstance().getProcess().processExKey(editor, key, true)) {
else if (editorState.getMappingMode() == MappingMode.CMD_LINE) {
if (!VimPlugin.getProcess().processExKey(editor, key)) {
shouldRecord = false;
}
}
@@ -200,7 +199,7 @@ public class KeyHandler {
executeCommand(editor, key, context, editorState);
}
else if (state == State.BAD_COMMAND) {
if (editorState.getMappingMode() == KeyParser.MAPPING_OP_PEND) {
if (editorState.getMappingMode() == MappingMode.OP_PENDING) {
editorState.popState();
}
else {
@@ -214,49 +213,146 @@ public class KeyHandler {
fullReset(editor);
}
else if (isRecording && shouldRecord) {
CommandGroups.getInstance().getRegister().addKeyStroke(key);
VimPlugin.getRegister().recordKeyStroke(key);
}
}
private void handleEditorReset(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context) {
if (state != State.COMMAND && count == 0 && currentArg == Argument.Type.NONE && currentCmd.size() == 0 &&
CommandGroups.getInstance().getRegister().getCurrentRegister() == RegisterGroup.REGISTER_DEFAULT) {
if (key.getKeyCode() == KeyEvent.VK_ESCAPE) {
KeyHandler.executeAction("VimEditorEscape", context);
//getOriginalHandler().execute(editor, key.getKeyChar(), context);
}
VimPlugin.indicateError();
private boolean handleKeyMapping(@NotNull final Editor editor, @NotNull final KeyStroke key,
@NotNull final DataContext context) {
final CommandState commandState = CommandState.getInstance(editor);
commandState.stopMappingTimer();
final List<KeyStroke> mappingKeys = commandState.getMappingKeys();
final List<KeyStroke> fromKeys = new ArrayList<KeyStroke>(mappingKeys);
fromKeys.add(key);
final MappingMode mappingMode = commandState.getMappingMode();
if (MappingMode.NVO.contains(mappingMode) && (state != State.NEW_COMMAND || currentArg != Argument.Type.NONE)) {
return false;
}
reset(editor);
final KeyMapping mapping = VimPlugin.getKey().getKeyMapping(mappingMode);
final MappingInfo currentMappingInfo = mapping.get(fromKeys);
final MappingInfo prevMappingInfo = mapping.get(mappingKeys);
final MappingInfo mappingInfo = currentMappingInfo != null ? currentMappingInfo : prevMappingInfo;
final Application application = ApplicationManager.getApplication();
if (mapping.isPrefix(fromKeys)) {
mappingKeys.add(key);
if (!application.isUnitTestMode() && Options.getInstance().isSet(Options.TIMEOUT)) {
commandState.startMappingTimer(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
mappingKeys.clear();
for (KeyStroke keyStroke : fromKeys) {
handleKey(editor, keyStroke, new EditorDataContext(editor), false);
}
}
});
}
return true;
}
else if (mappingInfo != null) {
mappingKeys.clear();
final Runnable handleMappedKeys = new Runnable() {
@Override
public void run() {
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) {
RunnableHelper.runWriteCommand(editor.getProject(), new Runnable() {
@Override
public void run() {
extensionHandler.execute(editor, context);
}
}, "Vim " + extensionHandler.getClass().getSimpleName(), null);
}
if (prevMappingInfo != null) {
handleKey(editor, key, currentContext);
}
}
};
if (application.isUnitTestMode()) {
handleMappedKeys.run();
}
else {
application.invokeLater(handleMappedKeys);
}
return true;
}
else {
final List<KeyStroke> unhandledKeys = new ArrayList<KeyStroke>(mappingKeys);
mappingKeys.clear();
for (KeyStroke keyStroke : unhandledKeys) {
handleKey(editor, keyStroke, context, false);
}
return false;
}
}
private static <T> boolean isPrefix(@NotNull List<T> list1, @NotNull List<T> list2) {
if (list1.size() > list2.size()) {
return false;
}
for (int i = 0; i < list1.size(); i++) {
if (!list1.get(i).equals(list2.get(i))) {
return false;
}
}
return true;
}
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) {
RegisterGroup register = VimPlugin.getRegister();
if (register.getCurrentRegister() == register.getDefaultRegister()) {
if (key.getKeyCode() == KeyEvent.VK_ESCAPE) {
CommandProcessor.getInstance().executeCommand(editor.getProject(), new Runnable() {
@Override
public void run() {
KeyHandler.executeAction("EditorEscape", context);
}
}, "", null);
}
VimPlugin.indicateError();
}
}
reset(editor);
}
private boolean isDeleteCommandCount(@NotNull KeyStroke key, @NotNull CommandState editorState) {
return (editorState.getMode() == CommandState.Mode.COMMAND ||
editorState.getMode() == CommandState.Mode.VISUAL) &&
state == State.NEW_COMMAND && currentArg != Argument.Type.CHARACTER && currentArg !=
Argument.Type.DIGRAPH &&
key.getKeyCode() == KeyEvent.VK_DELETE && count != 0;
return (editorState.getMode() == CommandState.Mode.COMMAND || editorState.getMode() == CommandState.Mode.VISUAL) &&
state == State.NEW_COMMAND && currentArg != Argument.Type.CHARACTER && currentArg != Argument.Type.DIGRAPH &&
key.getKeyCode() == KeyEvent.VK_DELETE && count != 0;
}
private boolean isCommandCount(@NotNull CommandState editorState, char chKey) {
return (editorState.getMode() == CommandState.Mode.COMMAND ||
editorState.getMode() == CommandState.Mode.VISUAL) &&
state == State.NEW_COMMAND && currentArg != Argument.Type.CHARACTER && currentArg !=
Argument.Type.DIGRAPH &&
Character.isDigit(chKey) &&
(count != 0 || chKey != '0');
return (editorState.getMode() == CommandState.Mode.COMMAND || editorState.getMode() == CommandState.Mode.VISUAL) &&
state == State.NEW_COMMAND && currentArg != Argument.Type.CHARACTER && currentArg != Argument.Type.DIGRAPH &&
Character.isDigit(chKey) &&
(count != 0 || chKey != '0');
}
private boolean isEditorReset(@NotNull KeyStroke key, @NotNull CommandState editorState) {
return (editorState.getMode() == CommandState.Mode.COMMAND || state == State.COMMAND) &&
(key.getKeyCode() == KeyEvent.VK_ESCAPE ||
(key.getKeyCode() == KeyEvent.VK_C && (key.getModifiers() & KeyEvent.CTRL_MASK) != 0) ||
(key.getKeyCode() == '[' && (key.getModifiers() & KeyEvent.CTRL_MASK) != 0));
StringHelper.isCloseKeyStroke(key);
}
private void handleCharArgument(@NotNull KeyStroke key, char chKey) {
logger.debug("currentArg is Character");
// We are expecting a character argument - is this a regular character the user typed?
// Some special keys can be handled as character arguments - let's check for them here.
if (chKey == 0) {
@@ -284,12 +380,13 @@ public class KeyHandler {
}
}
private boolean handleDigraph(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context, @Nullable Node node) {
private boolean handleDigraph(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context,
@Nullable Node node) {
if (digraph == null && !(node instanceof CommandNode) && DigraphSequence.isDigraphStart(key)) {
digraph = new DigraphSequence();
}
if (digraph != null) {
DigraphSequence.DigraphResult res = digraph.processKey(key, editor, context);
DigraphSequence.DigraphResult res = digraph.processKey(key, editor);
switch (res.getResult()) {
case DigraphSequence.DigraphResult.RES_OK:
return true;
@@ -301,18 +398,19 @@ public class KeyHandler {
currentArg = Argument.Type.CHARACTER;
}
digraph = null;
handleKey(editor, res.getStroke(), context);
final KeyStroke stroke = res.getStroke();
if (stroke == null) {
return false;
}
handleKey(editor, stroke, context);
return true;
}
logger.debug("digraph done");
}
return false;
}
private void executeCommand(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context,
@NotNull CommandState editorState) {
DelegateCommandListener.getInstance().setRunnable(null);
// Let's go through the command stack and merge it all into one command. At this time there should never
// be more than two commands on the stack - one is the actual command and the other would be a motion
// command argument needed by the first command
@@ -323,28 +421,23 @@ public class KeyHandler {
cmd = top;
}
if (logger.isDebugEnabled()) {
logger.debug("cmd=" + cmd);
}
// If we have a command and a motion command argument, both could possibly have their own counts. We
// need to adjust the counts so the motion gets the product of both counts and the count associated with
// the command gets reset. Example 3c2w (change 2 words, three times) becomes c6w (change 6 words)
Argument arg = cmd.getArgument();
if (logger.isDebugEnabled()) {
logger.debug("arg=" + arg);
}
final Argument arg = cmd.getArgument();
if (arg != null && arg.getType() == Argument.Type.MOTION) {
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
// the motion gets the product of both.
int cnt = cmd.getRawCount() == 0 && mot.getRawCount() == 0 ? 0 : cmd.getCount() * mot.getCount();
if (mot != null) {
int cnt = cmd.getRawCount() == 0 && mot.getRawCount() == 0 ? 0 : cmd.getCount() * mot.getCount();
mot.setCount(cnt);
}
cmd.setCount(0);
mot.setCount(cnt);
}
// If we were in "operator pending" mode, reset back to normal mode.
if (editorState.getMappingMode() == KeyParser.MAPPING_OP_PEND) {
//CommandState.getInstance().setMappingMode(KeyParser.MAPPING_NORMAL);
if (editorState.getMappingMode() == MappingMode.OP_PENDING) {
editorState.popState();
}
@@ -352,34 +445,29 @@ public class KeyHandler {
editorState.setCommand(cmd);
lastWasBS = ((cmd.getFlags() & Command.FLAG_IS_BACKSPACE) != 0);
logger.debug("lastWasBS=" + lastWasBS);
Project project = editor.getProject();
if (cmd.getType().isRead() || project == null || EditorHelper.canEdit(project, editor)) {
if (ApplicationManager.getApplication().isDispatchThread()) {
Runnable action = new ActionRunner(editor, context, cmd, key);
String name = cmd.getAction().getTemplatePresentation().getText();
name = name != null ? "Vim " + name : "";
if (cmd.getType().isWrite()) {
RunnableHelper.runWriteCommand(project, action, cmd.getActionId(), null);
RunnableHelper.runWriteCommand(project, action, name, action);
}
else {
RunnableHelper.runReadCommand(project, action, cmd.getActionId(), null);
RunnableHelper.runReadCommand(project, action, name, action);
}
}
}
else {
logger.info("write command on read-only file");
VimPlugin.indicateError();
reset(editor);
}
}
private boolean handleArgumentNode(@NotNull Editor editor,
@NotNull KeyStroke key,
@NotNull DataContext context,
@NotNull CommandState editorState,
boolean shouldRecord,
@NotNull ArgumentNode node) {
logger.debug("argument node");
private boolean handleArgumentNode(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context,
@NotNull CommandState editorState, @NotNull ArgumentNode node) {
// Create a new command based on what the user has typed so far, excluding this keystroke.
Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags());
cmd.setKeys(keys);
@@ -397,9 +485,7 @@ public class KeyHandler {
// Is the current command an operator? If so set the state to only accept "operator pending"
// commands
if ((node.getFlags() & Command.FLAG_OP_PEND) != 0) {
//CommandState.getInstance().setMappingMode(KeyParser.MAPPING_OP_PEND);
editorState.pushState(editorState.getMode(), editorState.getSubMode(),
KeyParser.MAPPING_OP_PEND);
editorState.pushState(editorState.getMode(), editorState.getSubMode(), MappingMode.OP_PENDING);
}
break;
case EX_STRING:
@@ -415,13 +501,12 @@ public class KeyHandler {
if (currentArg != Argument.Type.NONE) {
partialReset(editor);
handleKey(editor, key, context);
shouldRecord = false; // Prevent this from getting recorded twice
return false;
}
return shouldRecord;
return true;
}
private void handleCommandNode(@NotNull Editor editor, @NotNull DataContext context, @NotNull CommandNode node) {
logger.debug("command node");
// If all does well we are ready to process this command
state = State.READY;
// Did we just get the completed sequence for a motion command argument?
@@ -429,15 +514,13 @@ public class KeyHandler {
// We have been expecting a motion argument - is this one?
if (node.getCmdType() == Command.Type.MOTION) {
// Create the motion command and add it to the stack
Command cmd = new Command(count, node.getActionId(), node.getAction(),
node.getCmdType(), node.getFlags());
Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags());
cmd.setKeys(keys);
currentCmd.push(cmd);
}
else if (node.getCmdType() == Command.Type.RESET) {
currentCmd.clear();
Command cmd = new Command(1, node.getActionId(), node.getAction(),
node.getCmdType(), node.getFlags());
Command cmd = new Command(1, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags());
cmd.setKeys(keys);
currentCmd.push(cmd);
}
@@ -447,7 +530,7 @@ public class KeyHandler {
}
}
else if (currentArg == Argument.Type.EX_STRING && (node.getFlags() & Command.FLAG_COMPLETE_EX) != 0) {
String text = CommandGroups.getInstance().getProcess().endSearchCommand(editor, context);
String text = VimPlugin.getProcess().endSearchCommand(editor, context);
Argument arg = new Argument(text);
Command cmd = currentCmd.peek();
cmd.setArgument(arg);
@@ -456,23 +539,20 @@ public class KeyHandler {
// 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());
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
// programmer made a typo or forgot to add the action to the plugin.xml file
if (cmd.getAction() == null) {
logger.error("NULL action for keys '" + keys + "'");
state = State.ERROR;
}
}
}
private void handleBranchNode(@NotNull Editor editor, @NotNull DataContext context, @NotNull CommandState editorState, char key,
@NotNull BranchNode node) {
logger.debug("branch node");
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() & Command.FLAG_ALLOW_MID_COUNT) == 0) {
state = State.COMMAND;
@@ -491,10 +571,10 @@ public class KeyHandler {
}
if (arg.getArgType() == Argument.Type.EX_STRING) {
CommandGroups.getInstance().getProcess().startSearchCommand(editor, context, count, key);
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, KeyParser.MAPPING_CMD_LINE);
editorState.pushState(CommandState.Mode.EX_ENTRY, CommandState.SubMode.NONE, MappingMode.CMD_LINE);
}
}
}
@@ -505,16 +585,10 @@ public class KeyHandler {
* @param name The name of the action to execute
* @param context The context to run it in
*/
public static void executeAction(String name, DataContext context) {
logger.debug("executing action " + name);
public static boolean executeAction(@NotNull String name, @NotNull DataContext context) {
ActionManager aMgr = ActionManager.getInstance();
AnAction action = aMgr.getAction(name);
if (action != null) {
executeAction(action, context);
}
else {
logger.debug("Unknown action");
}
return action != null && executeAction(action, context);
}
/**
@@ -523,23 +597,20 @@ public class KeyHandler {
* @param action The action to execute
* @param context The context to run it in
*/
public static void executeAction(AnAction action, DataContext context) {
if (logger.isDebugEnabled()) {
logger.debug("executing action " + action);
}
public static boolean executeAction(@NotNull AnAction action, @NotNull DataContext context) {
// Hopefully all the arguments are sufficient. So far they all seem to work OK.
// We don't have a specific InputEvent so that is null
// What is "place"? Leave it the empty string for now.
// Is the template presentation sufficient?
// What are the modifiers? Is zero OK?
action.actionPerformed(new AnActionEvent(
null,
context,
"",
action.getTemplatePresentation(),
ActionManager.getInstance(), // API change - don't merge
0));
final AnActionEvent event = new AnActionEvent(null, context, "", action.getTemplatePresentation(),
ActionManager.getInstance(), 0);
action.update(event);
if (event.getPresentation().isEnabled()) {
action.actionPerformed(event);
return true;
}
return false;
}
/**
@@ -552,8 +623,9 @@ public class KeyHandler {
count = 0;
keys = new ArrayList<KeyStroke>();
CommandState editorState = CommandState.getInstance(editor);
editorState.setCurrentNode(KeyParser.getInstance().getKeyRoot(editorState.getMappingMode()));
logger.debug("partialReset");
editorState.stopMappingTimer();
editorState.getMappingKeys().clear();
editorState.setCurrentNode(VimPlugin.getKey().getKeyRoot(editorState.getMappingMode()));
}
/**
@@ -567,7 +639,6 @@ public class KeyHandler {
currentCmd.clear();
currentArg = Argument.Type.NONE;
digraph = null;
logger.debug("reset");
}
/**
@@ -582,8 +653,7 @@ public class KeyHandler {
reset(editor);
lastChar = 0;
lastWasBS = false;
CommandGroups.getInstance().getRegister().resetRegister();
DelegateCommandListener.getInstance().setRunnable(null);
VimPlugin.getRegister().resetRegister();
}
/**
@@ -602,9 +672,8 @@ public class KeyHandler {
boolean wasRecording = editorState.isRecording();
executeAction(cmd.getAction(), context);
if (editorState.getMode() == CommandState.Mode.INSERT ||
editorState.getMode() == CommandState.Mode.REPLACE) {
CommandGroups.getInstance().getChange().processCommand(editor, context, cmd);
if (editorState.getMode() == CommandState.Mode.INSERT || editorState.getMode() == CommandState.Mode.REPLACE) {
VimPlugin.getChange().processCommand(editor, cmd);
}
// Now that the command has been executed let's clean up a few things.
@@ -612,7 +681,7 @@ public class KeyHandler {
// By default the "empty" register is used by all commands so we want to reset whatever the last register
// selected by the user was to the empty register - unless we just executed the "select register" command.
if (cmd.getType() != Command.Type.SELECT_REGISTER) {
CommandGroups.getInstance().getRegister().resetRegister();
VimPlugin.getRegister().resetRegister();
}
// If, at this point, we are not in insert, replace, or visual modes, we need to restore the previous
@@ -627,14 +696,14 @@ public class KeyHandler {
KeyHandler.getInstance().reset(editor);
if (wasRecording && editorState.isRecording()) {
CommandGroups.getInstance().getRegister().addKeyStroke(key);
VimPlugin.getRegister().recordKeyStroke(key);
}
}
private Editor editor;
private DataContext context;
private Command cmd;
private KeyStroke key;
private final Editor editor;
private final DataContext context;
private final Command cmd;
private final KeyStroke key;
}
private static enum State {
@@ -648,13 +717,12 @@ public class KeyHandler {
private int count;
private List<KeyStroke> keys;
private State state;
private Stack<Command> currentCmd = new Stack<Command>();
@NotNull private final Stack<Command> currentCmd = new Stack<Command>();
@NotNull private Argument.Type currentArg;
private TypedActionHandler origHandler;
private DigraphSequence digraph = null;
@Nullable private DigraphSequence digraph = null;
private char lastChar;
private boolean lastWasBS;
private static KeyHandler instance;
private static Logger logger = Logger.getInstance(KeyHandler.class.getName());
}

View File

@@ -0,0 +1,772 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.ex.ActionManagerEx;
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.MappingMode;
import com.maddyhome.idea.vim.group.KeyGroup;
import com.maddyhome.idea.vim.key.Shortcut;
import javax.swing.*;
import java.awt.event.KeyEvent;
public class RegisterActions {
/**
* Register all the key/action mappings for the plugin.
*/
public static void registerActions() {
registerVimCommandActions();
registerInsertModeActions();
registerNormalModeActions();
registerNVOModesActions();
registerCommandLineActions();
registerVariousModesActions();
}
private static void registerVimCommandActions() {
final ActionManagerEx manager = ActionManagerEx.getInstanceEx();
for (String actionId : manager.getPluginActions(VimPlugin.getPluginId())) {
final AnAction action = manager.getAction(actionId);
if (action instanceof VimCommandAction) {
VimPlugin.getKey().registerCommandAction((VimCommandAction)action, actionId);
}
}
}
private static void registerVariousModesActions() {
final KeyGroup parser = VimPlugin.getKey();
parser.registerAction(MappingMode.NV, "VimVisualToggleLineMode", Command.Type.OTHER_READONLY, Command.FLAG_MOT_LINEWISE,
new Shortcut('V'));
parser.registerAction(MappingMode.NV, "VimVisualToggleBlockMode", Command.Type.OTHER_READONLY,
Command.FLAG_MOT_BLOCKWISE,
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK))}
);
parser.registerAction(MappingMode.NV, "VimMotionMark", Command.Type.OTHER_READONLY, new Shortcut('m'),
Argument.Type.CHARACTER);
parser.registerAction(MappingMode.NV, "VimGotoDeclaration", Command.Type.OTHER_READONLY, Command.FLAG_SAVE_JUMP,
new Shortcut[]{new Shortcut("gD"), new Shortcut("gd"),
// TODO: <C-]> is a tag command similar to gD, the tag stack is not implemented
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.CTRL_MASK)),}
);
parser.registerAction(MappingMode.NV, "VimFileGetLocationInfo", Command.Type.OTHER_READONLY, new Shortcut(
new KeyStroke[]{KeyStroke.getKeyStroke('g'),
KeyStroke.getKeyStroke(KeyEvent.VK_G, KeyEvent.CTRL_MASK)})
);
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.NV, "VimToggleRecording",
Command.Type.OTHER_READONLY,
Command.FLAG_NO_ARG_RECORDING,
new Shortcut('q'), Argument.Type.CHARACTER);
// Text Object Actions for Visual and Operator Pending Modes
parser.registerAction(MappingMode.VO, "VimMotionGotoFileMark", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP, new Shortcut('`'),
Argument.Type.CHARACTER);
parser.registerAction(MappingMode.VO, "VimMotionGotoFileMarkLine", Command.Type.MOTION,
Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP, new Shortcut('\''),
Argument.Type.CHARACTER);
parser.registerAction(MappingMode.VO, "VimMotionGotoFileMark", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE,
new Shortcut("g`"), Argument.Type.CHARACTER);
parser.registerAction(MappingMode.VO, "VimMotionGotoFileMarkLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE,
new Shortcut("g'"), Argument.Type.CHARACTER);
parser.registerAction(MappingMode.VO, "VimMotionTextOuterWord", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE, new Shortcut("aw"));
parser.registerAction(MappingMode.VO, "VimMotionTextOuterBigWord", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE, new Shortcut("aW"));
parser.registerAction(MappingMode.VO, "VimMotionTextInnerWord", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE, new Shortcut("iw"));
parser.registerAction(MappingMode.VO, "VimMotionTextInnerBigWord", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE, new Shortcut("iW"));
parser.registerAction(MappingMode.VO, "VimMotionInnerParagraph", Command.Type.MOTION,
Command.FLAG_MOT_LINEWISE | Command.FLAG_TEXT_BLOCK, new Shortcut("ip"));
parser.registerAction(MappingMode.VO, "VimMotionOuterParagraph", Command.Type.MOTION,
Command.FLAG_MOT_LINEWISE | Command.FLAG_TEXT_BLOCK, new Shortcut("ap"));
parser.registerAction(MappingMode.VO, "VimMotionInnerSentence",
Command.Type.MOTION,
Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut("is"));
parser.registerAction(MappingMode.VO, "VimMotionOuterSentence", Command.Type.MOTION,
Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK, new Shortcut("as"));
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockAngle", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("i<"), new Shortcut("i>")}
);
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockBrace", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("iB"), new Shortcut("i{"), new Shortcut("i}")}
);
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockBracket", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("i["), new Shortcut("i]")}
);
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockParen", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("ib"), new Shortcut("i("), new Shortcut("i)")}
);
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockDoubleQuote", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("i\""),}
);
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockSingleQuote", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("i'"),}
);
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockBackQuote", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("i`"),}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockAngle",
Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK, new Shortcut[]{
new Shortcut("a<"),
new Shortcut("a>")
});
parser.registerAction(MappingMode.VO, "VimMotionInnerBlockTag", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("it")}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockBrace", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("aB"), new Shortcut("a{"), new Shortcut("a}")}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockBracket", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("a["), new Shortcut("a]")}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockParen", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("ab"), new Shortcut("a("), new Shortcut("a)")}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockDoubleQuote", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("a\""),}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockSingleQuote", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("a'"),}
);
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockBackQuote", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK, new Shortcut[]{
new Shortcut("a`"),
});
parser.registerAction(MappingMode.VO, "VimMotionOuterBlockTag", Command.Type.MOTION,
Command.FLAG_MOT_CHARACTERWISE | Command.FLAG_MOT_INCLUSIVE | Command.FLAG_TEXT_BLOCK,
new Shortcut[]{new Shortcut("at")}
);
parser.registerAction(MappingMode.NO, "VimResetMode", Command.Type.RESET, new Shortcut(new KeyStroke[]{
KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SLASH, KeyEvent.CTRL_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK)
}));
}
private static void registerCommandLineActions() {
final KeyGroup parser = VimPlugin.getKey();
parser
.registerAction(MappingMode.C, "VimProcessExEntry", Command.Type.OTHER_READ_WRITE, Command.FLAG_COMPLETE_EX,
new Shortcut[]{new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke((char)0x0a)),
new Shortcut(KeyStroke.getKeyStroke((char)0x0d))});
}
/**
* Register normal, visual, operator pending modes actions.
*/
private static void registerNVOModesActions() {
final KeyGroup parser = VimPlugin.getKey();
parser.registerAction(MappingMode.NVO, "VimCopySelectRegister", Command.Type.SELECT_REGISTER, Command.FLAG_EXPECT_MORE,
new Shortcut('"'), Argument.Type.CHARACTER);
// Motion Actions
// TODO - add ['
// TODO - add [`
// TODO - add ]'
// TODO - add ]`
// TODO - add zj
// TODO - add zk
parser.registerAction(MappingMode.NVO, "VimMotionNextTab", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("gt"));
parser.registerAction(MappingMode.NVO, "VimMotionPreviousTab", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("gT"));
parser.registerAction(MappingMode.NVO, "VimMotionCamelEndLeft", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("]b"));
parser.registerAction(MappingMode.NVO, "VimMotionCamelEndRight", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("]w"));
parser.registerAction(MappingMode.NVO, "VimMotionCamelLeft", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE,
new Shortcut("[b"));
parser.registerAction(MappingMode.NVO, "VimMotionCamelRight", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE,
new Shortcut("[w"));
parser.registerAction(MappingMode.NVO, "VimMotionColumn", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE,
new Shortcut('|'));
parser.registerAction(MappingMode.NVO, "VimMotionDown", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE, new Shortcut[]{
new Shortcut('j'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK)),
});
parser.registerAction(MappingMode.NVO, "VimMotionDown", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut("gj"),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('g'), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionDownFirstNonSpace", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE, new Shortcut[]{
new Shortcut('+'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionDownLess1FirstNonSpace", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE,
new Shortcut('_'));
parser.registerAction(MappingMode.NVO, "VimMotionFirstColumn", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('0'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0))
});
parser.registerAction(MappingMode.NVO, "VimMotionFirstScreenColumn", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut("g0"),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('g'), KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionFirstNonSpace", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('^')
});
parser.registerAction(MappingMode.NVO, "VimMotionFirstScreenNonSpace", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut("g^")
});
parser
.registerAction(MappingMode.NVO, "VimMotionFirstScreenLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut[]{
new Shortcut('H')
});
parser
.registerAction(MappingMode.NVO, "VimMotionGotoLineFirst", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut[]{
new Shortcut("gg"),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, KeyEvent.CTRL_MASK))
});
parser
.registerAction(MappingMode.NVO, "VimMotionGotoLineLast", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut('G'));
parser
.registerAction(MappingMode.NVO, "VimMotionGotoLineLastEnd", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_END, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.NVO, "VimMotionLastColumn", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE, new Shortcut[]{
new Shortcut('$'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0))
});
parser.registerAction(MappingMode.NVO, "VimMotionLastScreenColumn", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE, new Shortcut[]{
new Shortcut("g$"),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('g'), KeyStroke.getKeyStroke(KeyEvent.VK_END, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionLastMatchChar", Command.Type.MOTION,
new Shortcut(';'));
parser.registerAction(MappingMode.NVO, "VimMotionLastMatchCharReverse", Command.Type.MOTION,
new Shortcut(','));
parser.registerAction(MappingMode.NVO, "VimMotionLastNonSpace", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("g_"));
parser
.registerAction(MappingMode.NVO, "VimMotionLastScreenLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut('L'));
parser.registerAction(MappingMode.NVO, "VimMotionLeft", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('h'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0))
});
parser.registerAction(MappingMode.NVO, "VimMotionLeftMatchChar", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_ALLOW_DIGRAPH,
new Shortcut('F'), Argument.Type.DIGRAPH);
parser.registerAction(MappingMode.NVO, "VimMotionLeftTillMatchChar", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_ALLOW_DIGRAPH,
new Shortcut('T'), Argument.Type.DIGRAPH);
parser.registerAction(MappingMode.NVO, "VimMotionLeftWrap", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionMiddleColumn", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("gm"));
parser.registerAction(MappingMode.NVO, "VimMotionMiddleScreenLine", Command.Type.MOTION,
Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut('M'));
parser
.registerAction(MappingMode.NVO, "VimMotionNthCharacter", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("go"));
// This represents two commands and one is linewise and the other is inclusive - the handler will fix it
parser.registerAction(MappingMode.NVO, "VimMotionPercentOrMatch", Command.Type.MOTION, Command.FLAG_SAVE_JUMP,
new Shortcut('%'));
parser.registerAction(MappingMode.NVO, "VimMotionRight", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('l'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0))
});
parser.registerAction(MappingMode.NVO, "VimMotionRightMatchChar", Command.Type.MOTION,
Command.FLAG_MOT_INCLUSIVE | Command.FLAG_ALLOW_DIGRAPH,
new Shortcut('f'), Argument.Type.DIGRAPH);
parser.registerAction(MappingMode.NVO, "VimMotionRightTillMatchChar", Command.Type.MOTION,
Command.FLAG_MOT_INCLUSIVE | Command.FLAG_ALLOW_DIGRAPH,
new Shortcut('t'), Argument.Type.DIGRAPH);
parser.registerAction(MappingMode.NVO, "VimMotionRightWrap", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE,
new Shortcut(' '));
parser.registerAction(MappingMode.NVO, "VimMotionScrollFirstScreenLine", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("zt")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollFirstScreenColumn", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("zs")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollFirstScreenLineStart", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('z'), KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollFirstScreenLinePageStart", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("z+")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollHalfPageDown", Command.Type.OTHER_READONLY, Command.FLAG_IGNORE_SCROLL_JUMP,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.NVO, "VimMotionScrollHalfPageUp", Command.Type.OTHER_READONLY, Command.FLAG_IGNORE_SCROLL_JUMP,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.NVO, "VimMotionScrollLastScreenLine", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("zb")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollLastScreenColumn", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("ze")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollLastScreenLineStart", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("z-")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollLastScreenLinePageStart", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("z^")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollLineDown", Command.Type.OTHER_READONLY,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.NVO, "VimMotionScrollLineUp", Command.Type.OTHER_READONLY,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_Y, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.NVO, "VimMotionScrollMiddleScreenLine", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("zz")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollMiddleScreenLineStart", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut("z.")
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollColumnLeft", Command.Type.OTHER_READONLY, Command.FLAG_IGNORE_SIDE_SCROLL_JUMP,
new Shortcut[]{
new Shortcut("zl"),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('z'), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollColumnRight", Command.Type.OTHER_READONLY, Command.FLAG_IGNORE_SIDE_SCROLL_JUMP,
new Shortcut[]{
new Shortcut("zh"),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('z'), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollPageDown", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0))
});
parser.registerAction(MappingMode.NVO, "VimMotionScrollPageUp", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionUp", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE, new Shortcut[]{
new Shortcut('k'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),
});
parser.registerAction(MappingMode.NVO, "VimMotionUp", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut("gk"),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke('g'), KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)})
});
parser.registerAction(MappingMode.NVO, "VimMotionUpFirstNonSpace", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE,
new Shortcut('-'));
parser.registerAction(MappingMode.NVO, "VimMotionWordEndLeft", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("ge"));
parser.registerAction(MappingMode.NVO, "VimMotionWordEndRight", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut('e'));
parser.registerAction(MappingMode.NVO, "VimMotionWordLeft", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('b'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionWordRight", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('w'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionBigWordEndLeft", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut("gE"));
parser.registerAction(MappingMode.NVO, "VimMotionBigWordEndRight", Command.Type.MOTION, Command.FLAG_MOT_INCLUSIVE,
new Shortcut('E'));
parser.registerAction(MappingMode.NVO, "VimMotionBigWordLeft", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('B'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionBigWordRight", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('W'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_MASK))
});
parser.registerAction(MappingMode.NVO, "VimMotionSentenceStartPrevious", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('('));
parser.registerAction(MappingMode.NVO, "VimMotionSentenceStartNext", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut(')'));
parser.registerAction(MappingMode.NVO, "VimMotionSentenceEndPrevious", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("g("));
parser.registerAction(MappingMode.NVO, "VimMotionSentenceEndNext", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("g)"));
parser.registerAction(MappingMode.NVO, "VimMotionParagraphPrevious", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('{'));
parser
.registerAction(MappingMode.NVO, "VimMotionParagraphNext", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('}'));
parser.registerAction(MappingMode.NVO, "VimMotionUnmatchedBraceOpen", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("[{"));
parser.registerAction(MappingMode.NVO, "VimMotionUnmatchedBraceClose", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("]}"));
parser.registerAction(MappingMode.NVO, "VimMotionUnmatchedParenOpen", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("[("));
parser.registerAction(MappingMode.NVO, "VimMotionUnmatchedParenClose", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("])"));
parser.registerAction(MappingMode.NVO, "VimMotionSectionBackwardEnd", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("[]"));
parser.registerAction(MappingMode.NVO, "VimMotionSectionBackwardStart", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("[["));
parser.registerAction(MappingMode.NVO, "VimMotionSectionForwardEnd", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("]]"));
parser.registerAction(MappingMode.NVO, "VimMotionSectionForwardStart", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("]["));
parser.registerAction(MappingMode.NVO, "VimMotionMethodBackwardEnd", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("[M"));
parser.registerAction(MappingMode.NVO, "VimMotionMethodBackwardStart", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("[m"));
parser.registerAction(MappingMode.NVO, "VimMotionMethodForwardEnd", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("]M"));
parser.registerAction(MappingMode.NVO, "VimMotionMethodForwardStart", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("]m"));
// Misc Actions
parser.registerAction(MappingMode.NVO, "VimSearchFwdEntry", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SEARCH_FWD | Command.FLAG_SAVE_JUMP,
new Shortcut('/'), Argument.Type.EX_STRING);
parser.registerAction(MappingMode.NVO, "VimSearchRevEntry", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SEARCH_REV | Command.FLAG_SAVE_JUMP,
new Shortcut('?'), Argument.Type.EX_STRING);
parser.registerAction(MappingMode.NVO, "VimSearchAgainNext", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('n'));
parser
.registerAction(MappingMode.NVO, "VimSearchAgainPrevious", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('N'));
parser.registerAction(MappingMode.NVO, "VimExEntry", Command.Type.OTHER_READ_WRITE,
new Shortcut(':'));
parser.registerAction(MappingMode.NVO, "VimSearchWholeWordForward", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('*'));
parser.registerAction(MappingMode.NVO, "VimSearchWholeWordBackward", Command.Type.MOTION,
Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('#'));
parser
.registerAction(MappingMode.NVO, "VimSearchWordForward", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("g*"));
parser
.registerAction(MappingMode.NVO, "VimSearchWordBackward", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut("g#"));
}
private static void registerNormalModeActions() {
final KeyGroup parser = VimPlugin.getKey();
// Copy/Paste Actions
parser.registerAction(MappingMode.N, "VimCopyPutTextBeforeCursor", Command.Type.PASTE,
new Shortcut('P'));
parser.registerAction(MappingMode.N, "VimCopyPutTextAfterCursor", Command.Type.PASTE,
new Shortcut('p'));
parser.registerAction(MappingMode.N, "VimCopyPutTextBeforeCursorMoveCursor", Command.Type.PASTE,
new Shortcut("gP"));
parser.registerAction(MappingMode.N, "VimCopyPutTextAfterCursorMoveCursor", Command.Type.PASTE,
new Shortcut("gp"));
parser.registerAction(MappingMode.N, "VimCopyPutTextBeforeCursorNoIndent", Command.Type.PASTE, new Shortcut[]{
new Shortcut("[P"),
new Shortcut("]P")
});
parser.registerAction(MappingMode.N, "VimCopyPutTextAfterCursorNoIndent", Command.Type.PASTE, new Shortcut[]{
new Shortcut("[p"),
new Shortcut("]p")
});
parser.registerAction(MappingMode.N, "VimCopyYankLine", Command.Type.COPY,
new Shortcut('Y'));
parser.registerAction(MappingMode.N, "VimCopyYankLine", Command.Type.COPY, Command.FLAG_ALLOW_MID_COUNT,
new Shortcut("yy"));
parser.registerAction(MappingMode.N, "VimCopyYankMotion", Command.Type.COPY, Command.FLAG_OP_PEND,
new Shortcut('y'), Argument.Type.MOTION);
// Insert/Replace/Change Actions
parser.registerAction(MappingMode.N, "VimChangeCaseLowerMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut("gu"), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimChangeCaseToggleCharacter", Command.Type.CHANGE,
new Shortcut('~'));
parser.registerAction(MappingMode.N, "VimChangeCaseToggleMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut("g~"), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimChangeCaseUpperMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut("gU"), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimChangeCharacter", Command.Type.CHANGE, Command.FLAG_ALLOW_DIGRAPH,
new Shortcut('r'), Argument.Type.DIGRAPH);
parser
.registerAction(MappingMode.N, "VimChangeCharacters", Command.Type.CHANGE, Command.FLAG_NO_REPEAT | Command.FLAG_MULTIKEY_UNDO,
new Shortcut('s'));
parser
.registerAction(MappingMode.N, "VimChangeEndOfLine", Command.Type.CHANGE, Command.FLAG_NO_REPEAT | Command.FLAG_MULTIKEY_UNDO,
new Shortcut('C'));
parser.registerAction(MappingMode.N, "VimChangeLine", Command.Type.CHANGE,
Command.FLAG_NO_REPEAT | Command.FLAG_ALLOW_MID_COUNT | Command.FLAG_MULTIKEY_UNDO, new Shortcut[]{
new Shortcut("cc"),
new Shortcut('S')
});
parser.registerAction(MappingMode.N, "VimChangeNumberInc", Command.Type.CHANGE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.N, "VimChangeNumberDec", Command.Type.CHANGE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.N, "VimChangeMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND | Command.FLAG_MULTIKEY_UNDO,
new Shortcut('c'), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimChangeReplace", Command.Type.CHANGE, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('R'));
parser.registerAction(MappingMode.N, "VimDeleteCharacter", Command.Type.DELETE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)));
parser.registerAction(MappingMode.N, "VimDeleteCharacterLeft", Command.Type.DELETE,
new Shortcut('X'));
parser.registerAction(MappingMode.N, "VimDeleteCharacterRight", Command.Type.DELETE,
new Shortcut('x'));
parser.registerAction(MappingMode.N, "VimDeleteEndOfLine", Command.Type.DELETE,
new Shortcut('D'));
parser.registerAction(MappingMode.N, "VimDeleteJoinLines", Command.Type.DELETE,
new Shortcut("gJ"));
parser.registerAction(MappingMode.N, "VimDeleteJoinLinesSpaces", Command.Type.DELETE,
new Shortcut('J'));
parser.registerAction(MappingMode.N, "VimDeleteLine", Command.Type.DELETE, Command.FLAG_ALLOW_MID_COUNT,
new Shortcut("dd"));
parser.registerAction(MappingMode.N, "VimDeleteMotion", Command.Type.DELETE, Command.FLAG_OP_PEND,
new Shortcut('d'), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimFilterCountLines", Command.Type.CHANGE,
new Shortcut("!!"));
parser.registerAction(MappingMode.N, "VimFilterMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut('!'), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimInsertAfterCursor", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('a'));
parser.registerAction(MappingMode.N, "VimInsertAfterLineEnd", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('A'));
parser.registerAction(MappingMode.N, "VimInsertAtPreviousInsert", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut("gi"));
parser.registerAction(MappingMode.N, "VimInsertBeforeFirstNonBlank", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('I'));
parser.registerAction(MappingMode.N, "VimInsertLineStart", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut("gI"));
parser.registerAction(MappingMode.N, "VimInsertNewLineAbove", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('O'));
parser.registerAction(MappingMode.N, "VimInsertNewLineBelow", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('o'));
// Motion Actions
parser
.registerAction(MappingMode.N, "VimMotionGotoMark", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE | Command.FLAG_SAVE_JUMP,
new Shortcut('`'), Argument.Type.CHARACTER);
parser
.registerAction(MappingMode.N, "VimMotionGotoMarkLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut('\''), Argument.Type.CHARACTER);
parser.registerAction(MappingMode.N, "VimMotionGotoMark", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE,
new Shortcut("g`"), Argument.Type.CHARACTER);
parser.registerAction(MappingMode.N, "VimMotionGotoMarkLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE,
new Shortcut("g'"), Argument.Type.CHARACTER);
// Misc Actions
parser.registerAction(MappingMode.N, "VimLastSearchReplace", Command.Type.OTHER_WRITABLE,
new Shortcut('&'));
parser.registerAction(MappingMode.N, "VimLastGlobalSearchReplace", Command.Type.OTHER_WRITABLE,
new Shortcut("g&"));
parser.registerAction(MappingMode.N, "VimRepeatChange", Command.Type.OTHER_WRITABLE,
new Shortcut('.'));
parser.registerAction(MappingMode.N, "VimRepeatExCommand", Command.Type.OTHER_WRITABLE,
new Shortcut("@:"));
parser.registerAction(MappingMode.N, "QuickJavaDoc", Command.Type.OTHER_READONLY,
new Shortcut('K'));
parser.registerAction(MappingMode.N, "VimRedo", Command.Type.OTHER_WRITABLE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.N, "VimUndo", Command.Type.OTHER_WRITABLE, new Shortcut[]{
new Shortcut('u'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UNDO, 0))
});
// File Actions
parser.registerAction(MappingMode.N, "VimFileSaveClose", Command.Type.OTHER_WRITABLE, new Shortcut[]{
new Shortcut("ZQ"),
new Shortcut("ZZ")
});
parser.registerAction(MappingMode.N, "VimFilePrevious", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_6, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_CIRCUMFLEX, KeyEvent.CTRL_MASK))
});
// Shift Actions
parser.registerAction(MappingMode.N, "VimAutoIndentLines", Command.Type.CHANGE,
new Shortcut("=="));
parser.registerAction(MappingMode.N, "VimAutoIndentMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut('='), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimShiftLeftLines", Command.Type.CHANGE,
new Shortcut("<<"));
parser.registerAction(MappingMode.N, "VimShiftLeftMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut('<'), Argument.Type.MOTION);
parser.registerAction(MappingMode.N, "VimShiftRightLines", Command.Type.CHANGE,
new Shortcut(">>"));
parser.registerAction(MappingMode.N, "VimShiftRightMotion", Command.Type.CHANGE, Command.FLAG_OP_PEND,
new Shortcut('>'), Argument.Type.MOTION);
// Jump Actions
parser.registerAction(MappingMode.N, "VimMotionJumpNext", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0))
});
parser.registerAction(MappingMode.N, "VimMotionJumpPrevious", Command.Type.OTHER_READONLY,
new Shortcut[] {
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK)),
// TODO: <C-T> is a tag command similar to <C-O>, the tag stack is not implemented
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.CTRL_MASK))
});
parser.registerAction(MappingMode.N, "VimFileGetAscii", Command.Type.OTHER_READONLY,
new Shortcut("ga"));
parser.registerAction(MappingMode.N, "VimFileGetHex", Command.Type.OTHER_READONLY,
new Shortcut("g8"));
parser.registerAction(MappingMode.N, "VimFileGetFileInfo", Command.Type.OTHER_READONLY,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_G, KeyEvent.CTRL_MASK)));
// Macro Actions
parser.registerAction(MappingMode.N, "VimPlaybackLastRegister", Command.Type.OTHER_WRITABLE,
new Shortcut("@@"));
parser.registerAction(MappingMode.N, "VimPlaybackRegister", Command.Type.OTHER_WRITABLE,
new Shortcut('@'), Argument.Type.CHARACTER);
// TODO - support for :map macros
}
private static void registerInsertModeActions() {
final KeyGroup parser = VimPlugin.getKey();
// Other insert actions
parser
.registerAction(MappingMode.I, "EditorBackSpace", Command.Type.INSERT, Command.FLAG_IS_BACKSPACE,
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, Command.FLAG_SAVE_STROKE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)));
parser.registerAction(MappingMode.I, "EditorDown", Command.Type.INSERT, Command.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, Command.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, Command.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.I, "VimInsertCharacterAboveCursor", Command.Type.INSERT,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_Y, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimInsertCharacterBelowCursor", Command.Type.INSERT,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimInsertDeleteInsertedText", Command.Type.INSERT, Command.FLAG_CLEAR_STROKES,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimInsertDeletePreviousWord", Command.Type.INSERT, Command.FLAG_CLEAR_STROKES,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimInsertEnter", Command.Type.INSERT, Command.FLAG_SAVE_STROKE, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0))
});
parser.registerAction(MappingMode.I, "VimInsertPreviousInsert", Command.Type.INSERT,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimInsertPreviousInsertExit", Command.Type.INSERT, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_AT, KeyEvent.CTRL_MASK))
});
parser.registerAction(MappingMode.I, "VimInsertRegister", Command.Type.INSERT,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK)),
Argument.Type.CHARACTER);
parser.registerAction(MappingMode.I, "VimInsertReplaceToggle", Command.Type.INSERT, Command.FLAG_SAVE_STROKE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0)));
parser.registerAction(MappingMode.I, "VimInsertSingleCommand", Command.Type.INSERT,
Command.FLAG_CLEAR_STROKES | Command.FLAG_EXPECT_MORE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimMotionFirstColumn", Command.Type.INSERT, Command.FLAG_SAVE_STROKE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0)));
parser.registerAction(MappingMode.I, "VimMotionGotoLineFirst", Command.Type.INSERT, Command.FLAG_CLEAR_STROKES,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimMotionGotoLineLastEnd", Command.Type.INSERT, Command.FLAG_CLEAR_STROKES,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_END, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimMotionLastColumn", Command.Type.INSERT, Command.FLAG_SAVE_STROKE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0)));
parser.registerAction(MappingMode.I, "VimMotionLeft", Command.Type.INSERT, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, 0))
});
parser.registerAction(MappingMode.I, "VimMotionRight", Command.Type.INSERT, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_RIGHT, 0))
});
parser.registerAction(MappingMode.I, "VimMotionScrollPageUp", Command.Type.INSERT, Command.FLAG_CLEAR_STROKES, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.I, "VimMotionScrollPageDown", Command.Type.INSERT, Command.FLAG_CLEAR_STROKES, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.I, "VimMotionWordLeft", Command.Type.INSERT, Command.FLAG_SAVE_STROKE, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.I, "VimMotionWordRight", Command.Type.INSERT, Command.FLAG_SAVE_STROKE, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_RIGHT, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.SHIFT_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_KP_RIGHT, KeyEvent.SHIFT_MASK))
});
parser.registerAction(MappingMode.I, "VimShiftLeftLines", Command.Type.INSERT, Command.FLAG_SAVE_STROKE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.I, "VimShiftRightLines", Command.Type.INSERT, Command.FLAG_SAVE_STROKE,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.CTRL_MASK)));
}
}

View File

@@ -1,249 +0,0 @@
package com.maddyhome.idea.vim;
import com.google.common.base.Joiner;
import com.google.common.io.Files;
import com.google.common.io.Resources;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ex.ApplicationEx;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.components.impl.stores.StorageUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.KeymapManager;
import com.intellij.openapi.keymap.impl.KeymapImpl;
import com.intellij.openapi.keymap.impl.KeymapManagerImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.maddyhome.idea.vim.ui.VimKeymapDialog;
import org.jdom.Document;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.*;
import static com.google.common.io.ByteStreams.toByteArray;
/**
* @author oleg
*/
public class VimKeyMapUtil {
private static final Joiner PATH_JOINER = Joiner.on(File.separatorChar);
public static final String VIM_KEYMAP_NAME = "Vim";
private static final String VIM_XML = "Vim.xml";
private static final String KEYMAPS_PATH = PATH_JOINER.join(PathManager.getConfigPath(), "keymaps");
private static final String INSTALLED_VIM_KEYMAP_PATH = PATH_JOINER.join(KEYMAPS_PATH, VIM_XML);
private static Logger LOG = Logger.getInstance(VimKeyMapUtil.class);
public static boolean isVimKeymapInstalled() {
return KeymapManager.getInstance().getKeymap(VIM_KEYMAP_NAME) != null;
}
/**
* @return true if keymap was installed or was successfully installed
*/
public static boolean installKeyBoardBindings() {
LOG.debug("Check for keyboard bindings");
if (isVimKeymapInstalled()) {
return true;
}
final LocalFileSystem localFileSystem = LocalFileSystem.getInstance();
if (localFileSystem.refreshAndFindFileByPath(KEYMAPS_PATH) == null) {
reportError("Failed to install vim keymap. Empty keymaps folder");
return false;
}
LOG.debug("No vim keyboard installed found. Installing");
try {
final byte[] bytes = toByteArray(retrieveSourceKeymapStream());
Files.write(bytes, new File(INSTALLED_VIM_KEYMAP_PATH));
final Document document = StorageUtil.loadDocument(bytes);
if (!ApplicationManager.getApplication().isUnitTestMode()) {
// Prompt user to select the parent for the Vim keyboard
configureVimParentKeymap(INSTALLED_VIM_KEYMAP_PATH, document, false);
}
installKeymap(document);
} catch (IOException e) {
reportError("Source keymap not found", e);
return false;
} catch (InvalidDataException e) {
reportError("Failed to install vim keymap. Vim.xml file is corrupted", e);
return false;
} catch (Exception e) {
reportError("Failed to install vim keymap.\n", e);
return false;
}
return true;
}
private static void installKeymap(Document document) throws InvalidDataException {
if (document == null) {
throw new InvalidDataException();
}
final KeymapImpl vimKeyMap = new KeymapImpl();
final KeymapManagerImpl keymapManager = (KeymapManagerImpl) KeymapManager.getInstance();
final Keymap[] allKeymaps = keymapManager.getAllKeymaps();
vimKeyMap.readExternal(document.getRootElement(), allKeymaps);
keymapManager.addKeymap(vimKeyMap);
}
private static void requestRestartOrShutdown(final Project project) {
final ApplicationEx app = ApplicationManagerEx.getApplicationEx();
if (app.isRestartCapable()) {
if (Messages.showDialog(project, "Restart " + ApplicationNamesInfo.getInstance().getProductName() + " to activate changes?",
VimPlugin.IDEAVIM_NOTIFICATION_TITLE, new String[]{"&Restart", "&Postpone"}, 0,
Messages.getQuestionIcon()) == 0) {
app.restart();
}
} else {
if (Messages.showDialog(project, "Shut down " + ApplicationNamesInfo.getInstance().getProductName() + " to activate changes?",
VimPlugin.IDEAVIM_NOTIFICATION_TITLE, new String[]{"&Shut Down", "&Postpone"}, 0,
Messages.getQuestionIcon()) == 0) {
app.exit(true);
}
}
}
/**
* Changes parent keymap for the Vim
*
* @return true if document was changed successfully
*/
private static boolean configureVimParentKeymap(final String path, final Document document, final boolean showNotification) throws IOException {
final Element rootElement = document.getRootElement();
final String parentKeymap = rootElement.getAttributeValue("parent");
final VimKeymapDialog vimKeymapDialog = new VimKeymapDialog(parentKeymap);
vimKeymapDialog.show();
if (vimKeymapDialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) {
return false;
}
rootElement.removeAttribute("parent");
final Keymap selectedKeymap = vimKeymapDialog.getSelectedKeymap();
final String keymapName = selectedKeymap.getName();
rootElement.setAttribute("parent", keymapName);
// Save modified keymap to the file
JDOMUtil.writeDocument(document, path, "\n");
if (showNotification) {
Notifications.Bus.notify(new Notification(VimPlugin.IDEAVIM_NOTIFICATION_ID, VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
"Successfully configured vim keymap to be based on " +
selectedKeymap.getPresentableName(),
NotificationType.INFORMATION));
}
return true;
}
public static boolean isVimKeymapUsed() {
return KeymapManager.getInstance().getActiveKeymap().getName().equals(VIM_KEYMAP_NAME);
}
/**
* @return true if keymap was switched successfully, false otherwise
*/
public static boolean switchKeymapBindings(final boolean enableVimKeymap) {
LOG.debug("Enabling keymap");
// In case if Vim keymap is already in use or we don't need it, we have nothing to do
if (isVimKeymapUsed() == enableVimKeymap) {
return false;
}
final KeymapManagerImpl manager = (KeymapManagerImpl) KeymapManager.getInstance();
// Get keymap to enable
final String keymapName2Enable = enableVimKeymap ? VIM_KEYMAP_NAME : VimPlugin.getInstance().getPreviousKeyMap();
if (keymapName2Enable.isEmpty()) {
return false;
}
if (keymapName2Enable.equals(manager.getActiveKeymap().getName())) {
return false;
}
LOG.debug("Enabling keymap:" + keymapName2Enable);
final Keymap keymap = manager.getKeymap(keymapName2Enable);
if (keymap == null) {
reportError("Failed to enable keymap: " + keymapName2Enable);
return false;
}
// Save previous keymap to enable after VIM emulation is turned off
if (enableVimKeymap) {
VimPlugin.getInstance().setPreviousKeyMap(manager.getActiveKeymap().getName());
}
manager.setActiveKeymap(keymap);
final String keyMapPresentableName = keymap.getPresentableName();
Notifications.Bus.notify(new Notification(VimPlugin.IDEAVIM_NOTIFICATION_ID, VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
keyMapPresentableName + " keymap was successfully enabled", NotificationType.INFORMATION));
LOG.debug(keyMapPresentableName + " keymap was successfully enabled");
return true;
}
public static void reconfigureParentKeymap(final Project project) {
final VirtualFile vimKeymapFile = getVimKeymapFile();
if (vimKeymapFile == null) {
reportError("Failed to find Vim keymap");
return;
}
try {
final Document document = StorageUtil.loadDocument(new FileInputStream(vimKeymapFile.getPath()));
// Prompt user to select the parent for the Vim keyboard
if (configureVimParentKeymap(vimKeymapFile.getPath(), document, true)) {
installKeymap(document);
requestRestartOrShutdown(project);
}
} catch (FileNotFoundException e) {
reportError("Failed to install vim keymap.", e);
} catch (IOException e) {
reportError("Failed to install vim keymap.", e);
} catch (InvalidDataException e) {
reportError("Failed to install vim keymap. Vim.xml file is corrupted", e);
}
}
@NotNull
private static InputStream retrieveSourceKeymapStream() throws IOException {
String keymapPath = PATH_JOINER.join(PathManager.getPluginsPath(), VimPlugin.IDEAVIM_NOTIFICATION_TITLE, VIM_XML);
try {
return new FileInputStream(keymapPath);
} catch (FileNotFoundException e) {
if (ApplicationManager.getApplication().isInternal()) {
LOG.debug("Development mode on. Trying to retrieve source keymap from resources");
return Resources.getResource(VimKeyMapUtil.class, "/" + VIM_XML).openStream();
}
throw e;
}
}
private static void reportError(final String message) {
reportError(message, null);
}
private static void reportError(final String message, @Nullable final Exception e) {
LOG.error(message, e);
Notifications.Bus.notify(new Notification(VimPlugin.IDEAVIM_NOTIFICATION_ID, VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
message + String.valueOf(e), NotificationType.ERROR));
}
@Nullable
public static VirtualFile getVimKeymapFile() {
return LocalFileSystem.getInstance().refreshAndFindFileByPath(INSTALLED_VIM_KEYMAP_PATH);
}
}

View File

@@ -1,63 +1,75 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 The IdeaVim authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* 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.
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the 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/>.
*/
package com.maddyhome.idea.vim;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.notification.*;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationInfo;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.actionSystem.TypedAction;
import com.intellij.openapi.editor.event.EditorFactoryAdapter;
import com.intellij.openapi.editor.event.EditorFactoryEvent;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.ex.KeymapManagerEx;
import com.intellij.openapi.keymap.impl.DefaultKeymap;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ProjectManagerAdapter;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.updateSettings.impl.UpdateChecker;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.openapi.wm.WindowManager;
import com.maddyhome.idea.vim.command.CommandState;
import com.intellij.util.io.HttpRequests;
import com.maddyhome.idea.vim.ex.CommandParser;
import com.maddyhome.idea.vim.ex.vimscript.VimScriptParser;
import com.maddyhome.idea.vim.group.*;
import com.maddyhome.idea.vim.helper.DelegateCommandListener;
import com.maddyhome.idea.vim.helper.DocumentManager;
import com.maddyhome.idea.vim.helper.EditorData;
import com.maddyhome.idea.vim.helper.EditorDataContext;
import com.maddyhome.idea.vim.key.RegisterActions;
import com.maddyhome.idea.vim.helper.MacKeyRepeat;
import com.maddyhome.idea.vim.option.Options;
import com.maddyhome.idea.vim.ui.VimEmulationConfigurable;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.concurrent.TimeUnit;
/**
* This plugin attempts to emulate the keybinding 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
* documentation for a complete list of supported and unsupported Vim emulation. The code base contains some debugging
* output that can be enabled in necessary.
* <p/>
@@ -67,206 +79,109 @@ import java.awt.*;
* @version 0.1
*/
@State(
name = "VimSettings",
storages = {
@Storage(
id = "main",
file = "$APP_CONFIG$/vim_settings.xml"
)}
)
public class VimPlugin implements ApplicationComponent, PersistentStateComponent<Element>
{
name = "VimSettings",
storages = {@Storage(
id = "main",
file = "$APP_CONFIG$/vim_settings.xml")})
public class VimPlugin implements ApplicationComponent, PersistentStateComponent<Element> {
private static final String IDEAVIM_COMPONENT_NAME = "VimPlugin";
private static final String IDEAVIM_PLUGIN_ID = "IdeaVIM";
private static final String IDEAVIM_STATISTICS_TIMESTAMP_KEY = "ideavim.statistics.timestamp";
public static final String IDEAVIM_NOTIFICATION_ID = "ideavim";
public static final String IDEAVIM_STICKY_NOTIFICATION_ID = "ideavim-sticky";
public static final String IDEAVIM_NOTIFICATION_TITLE = "IdeaVim";
public static final int STATE_VERSION = 4;
private static final boolean BLOCK_CURSOR_VIM_VALUE = true;
private static final boolean ANIMATED_SCROLLING_VIM_VALUE = false;
private static final boolean REFRAIN_FROM_SCROLLING_VIM_VALUE = true;
private VimTypedActionHandler vimHandler;
private RegisterActions actions;
private boolean isBlockCursor = false;
private boolean isAnimatedScrolling = false;
private boolean isRefrainFromScrolling = false;
private boolean error = false;
private int previousStateVersion = 0;
private String previousKeyMap = "";
// It is enabled by default to avoid any special configuration after plugin installation
private boolean enabled = true;
private static Logger LOG = Logger.getInstance(VimPlugin.class);
private static final Logger LOG = Logger.getInstance(VimPlugin.class);
private final Application myApp;
@NotNull private final MotionGroup motion;
@NotNull private final ChangeGroup change;
@NotNull private final CopyGroup copy;
@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;
public VimPlugin() {
motion = new MotionGroup();
change = new ChangeGroup();
copy = new CopyGroup();
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();
/**
* Creates the Vim Plugin
*/
public VimPlugin(final Application app) {
myApp = app;
LOG.debug("VimPlugin ctr");
}
public static VimPlugin getInstance() {
return (VimPlugin)ApplicationManager.getApplication().getComponent(IDEAVIM_COMPONENT_NAME);
}
/**
* Supplies the name of the plugin
*
* @return The plugin name
*/
@NotNull
@Override
public String getComponentName() {
return IDEAVIM_COMPONENT_NAME;
}
public String getPreviousKeyMap() {
return previousKeyMap;
}
public void setPreviousKeyMap(final String keymap) {
previousKeyMap = keymap;
}
/**
* Initialize the Vim Plugin. This plugs the vim key handler into the editor action manager.
*/
@Override
public void initComponent() {
LOG.debug("initComponent");
Notifications.Bus.register(IDEAVIM_STICKY_NOTIFICATION_ID, NotificationDisplayType.STICKY_BALLOON);
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
checkAndInstallKeymap();
updateState();
}
});
EditorActionManager manager = EditorActionManager.getInstance();
TypedAction action = manager.getTypedAction();
final TypedAction typedAction = EditorActionManager.getInstance().getTypedAction();
EventFacade.getInstance().setupTypedActionHandler(new VimTypedActionHandler(typedAction.getRawHandler()));
// Replace the default key handler with the Vim key handler
vimHandler = new VimTypedActionHandler(action.getHandler());
action.setupHandler(vimHandler);
// Register vim actions in command mode
RegisterActions.registerActions();
// Add some listeners so we can handle special events
setupListeners();
getActions();
// Register ex handlers
CommandParser.getInstance().registerHandlers();
LOG.debug("done");
}
private static void checkAndInstallKeymap() {
// Ensure that Vim keymap is installed and install if not.
// Moreover we can use installed keymap as indicator of the first time installed plugin
if (VimPlugin.isEnabled()) {
boolean vimKeyMapInstalled = VimKeyMapUtil.isVimKeymapInstalled();
// In case if keymap wasn't installed, we assume that this is the first launch after installation
if (!vimKeyMapInstalled) {
vimKeyMapInstalled = VimKeyMapUtil.installKeyBoardBindings();
if (!vimKeyMapInstalled) {
if (Messages.showYesNoDialog("It is crucial to use Vim keymap for IdeaVim plugin correct work, " +
"however it was not installed correctly.\nDo you want " +
ApplicationManagerEx.getApplicationEx().getName() +
" to disable Vim emulation?", IDEAVIM_NOTIFICATION_TITLE, Messages.getQuestionIcon()) == Messages.YES) {
VimPlugin.getInstance().turnOffPlugin();
return;
}
}
// Enable proper keymap bindings
VimKeyMapUtil.switchKeymapBindings(true);
}
// In this case we should warn if user doesn't use vim keymap
else {
if (!VimKeyMapUtil.isVimKeymapUsed()) {
Notifications.Bus.notify(new Notification(IDEAVIM_NOTIFICATION_ID, IDEAVIM_NOTIFICATION_TITLE,
"Vim keymap is not active, IdeaVim plugin may work incorrectly",
NotificationType.WARNING));
}
if (!ApplicationManager.getApplication().isUnitTestMode()) {
final File ideaVimRc = VimScriptParser.findIdeaVimRc();
if (ideaVimRc != null) {
VimScriptParser.executeFile(ideaVimRc);
}
}
}
/**
* This sets up some listeners so we can handle various events that occur
*/
private void setupListeners() {
DocumentManager.getInstance().addDocumentListener(new MarkGroup.MarkUpdater());
DocumentManager.getInstance().addDocumentListener(new SearchGroup.DocumentSearchListener());
DocumentManager.getInstance().init();
EditorFactory.getInstance().addEditorFactoryListener(new EditorFactoryAdapter() {
public void editorCreated(@NotNull EditorFactoryEvent event) {
final Editor editor = event.getEditor();
isBlockCursor = editor.getSettings().isBlockCursor();
isAnimatedScrolling = editor.getSettings().isAnimatedScrolling();
isRefrainFromScrolling = editor.getSettings().isRefrainFromScrolling();
EditorData.initializeEditor(editor);
DocumentManager.getInstance().addListeners(editor.getDocument());
if (VimPlugin.isEnabled()) {
// Turn on insert mode if editor doesn't have any file
if (!EditorData.isFileEditor(editor) && !CommandState.inInsertMode(editor)) {
KeyHandler.getInstance().handleKey(editor, KeyStroke.getKeyStroke('i'), new EditorDataContext(editor));
}
editor.getSettings().setBlockCursor(!CommandState.inInsertMode(editor));
editor.getSettings().setAnimatedScrolling(ANIMATED_SCROLLING_VIM_VALUE);
editor.getSettings().setRefrainFromScrolling(REFRAIN_FROM_SCROLLING_VIM_VALUE);
}
}
public void editorReleased(@NotNull EditorFactoryEvent event) {
EditorData.uninitializeEditor(event.getEditor());
event.getEditor().getSettings().setAnimatedScrolling(isAnimatedScrolling);
event.getEditor().getSettings().setRefrainFromScrolling(isRefrainFromScrolling);
DocumentManager.getInstance().removeListeners(event.getEditor().getDocument());
}
}, myApp);
// Since the Vim plugin custom actions aren't available to the call to <code>initComponent()</code>
// we need to force the generation of the key map when the first project is opened.
ProjectManager.getInstance().addProjectManagerListener(new ProjectManagerAdapter() {
public void projectOpened(final Project project) {
project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new MotionGroup.MotionEditorChange());
project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileGroup.SelectionCheck());
project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new SearchGroup.EditorSelectionCheck());
}
public void projectClosed(final Project project) {
}
});
CommandProcessor.getInstance().addCommandListener(DelegateCommandListener.getInstance());
}
/**
* This shuts down the Vim plugin. All we need to do is reinstall the original key handler
*/
public void disposeComponent() {
LOG.debug("disposeComponent");
turnOffPlugin();
EditorActionManager manager = EditorActionManager.getInstance();
TypedAction action = manager.getTypedAction();
action.setupHandler(vimHandler.getOriginalTypedHandler());
LOG.debug("done");
}
@Override
public void loadState(final Element element) {
LOG.debug("Loading state");
// Restore whether the plugin is enabled or not
Element state = element.getChild("state");
if (state != null) {
enabled = Boolean.valueOf(state.getAttributeValue("enabled"));
previousKeyMap = state.getAttributeValue("keymap");
}
CommandGroups.getInstance().readData(element);
public void disposeComponent() {
LOG.debug("disposeComponent");
turnOffPlugin();
EventFacade.getInstance().restoreTypedActionHandler();
LOG.debug("done");
}
@Override
@@ -276,19 +191,130 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
final Element element = new Element("ideavim");
// Save whether the plugin is enabled or not
final Element state = new Element("state");
state.setAttribute("version", Integer.toString(STATE_VERSION));
state.setAttribute("enabled", Boolean.toString(enabled));
state.setAttribute("keymap", previousKeyMap);
element.addContent(state);
CommandGroups.getInstance().saveData(element);
mark.saveData(element);
register.saveData(element);
search.saveData(element);
history.saveData(element);
key.saveData(element);
editor.saveData(element);
return element;
}
/**
* Indicates whether the user has enabled or disabled the plugin
*
* @return true if the Vim plugin is enabled, false if not
*/
@Override
public void loadState(@NotNull final Element element) {
LOG.debug("Loading state");
// Restore whether the plugin is enabled or not
Element state = element.getChild("state");
if (state != null) {
try {
previousStateVersion = Integer.valueOf(state.getAttributeValue("version"));
}
catch (NumberFormatException ignored) {
}
enabled = Boolean.valueOf(state.getAttributeValue("enabled"));
previousKeyMap = state.getAttributeValue("keymap");
}
mark.readData(element);
register.readData(element);
search.readData(element);
history.readData(element);
key.readData(element);
editor.readData(element);
}
@NotNull
public static MotionGroup getMotion() {
return getInstance().motion;
}
@NotNull
public static ChangeGroup getChange() {
return getInstance().change;
}
@NotNull
public static CopyGroup getCopy() {
return getInstance().copy;
}
@NotNull
public static MarkGroup getMark() {
return getInstance().mark;
}
@NotNull
public static RegisterGroup getRegister() {
return getInstance().register;
}
@NotNull
public static FileGroup getFile() {
return getInstance().file;
}
@NotNull
public static SearchGroup getSearch() {
return getInstance().search;
}
@NotNull
public static ProcessGroup getProcess() {
return getInstance().process;
}
@NotNull
public static MacroGroup getMacro() {
return getInstance().macro;
}
@NotNull
public static DigraphGroup getDigraph() {
return getInstance().digraph;
}
@NotNull
public static HistoryGroup getHistory() {
return getInstance().history;
}
@NotNull
public static KeyGroup getKey() {
return getInstance().key;
}
@NotNull
public static WindowGroup getWindow() {
return getInstance().window;
}
@NotNull
public static EditorGroup getEditor() {
return getInstance().editor;
}
@NotNull
public static PluginId getPluginId() {
return PluginId.getId(IDEAVIM_PLUGIN_ID);
}
@NotNull
public static String getVersion() {
if (!ApplicationManager.getApplication().isInternal()) {
final IdeaPluginDescriptor plugin = PluginManager.getPlugin(getPluginId());
return plugin != null ? plugin.getVersion() : "SNAPSHOT";
}
else {
return "INTERNAL";
}
}
public static boolean isEnabled() {
return getInstance().enabled;
}
@@ -303,12 +329,14 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
if (enabled) {
getInstance().turnOnPlugin();
}
}
VimKeyMapUtil.switchKeymapBindings(enabled);
public static boolean isError() {
return getInstance().error;
}
/**
* Inidicate to the user that an error has occurred. Just beep.
* Indicate to the user that an error has occurred. Just beep.
*/
public static void indicateError() {
if (ApplicationManager.getApplication().isUnitTestMode()) {
@@ -319,15 +347,21 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
}
}
public static void clearError() {
if (ApplicationManager.getApplication().isUnitTestMode()) {
getInstance().error = false;
}
}
public static void showMode(String msg) {
showMessage(msg);
}
public static void showMessage(String msg) {
public static void showMessage(@Nullable String msg) {
ProjectManager pm = ProjectManager.getInstance();
Project[] projs = pm.getOpenProjects();
for (Project proj : projs) {
StatusBar bar = WindowManager.getInstance().getStatusBar(proj);
Project[] projects = pm.getOpenProjects();
for (Project project : projects) {
StatusBar bar = WindowManager.getInstance().getStatusBar(project);
if (bar != null) {
if (msg == null || msg.length() == 0) {
bar.setInfo("");
@@ -339,65 +373,163 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
}
}
public void turnOnPlugin() {
@NotNull
private static VimPlugin getInstance() {
return (VimPlugin)ApplicationManager.getApplication().getComponent(IDEAVIM_COMPONENT_NAME);
}
private void turnOnPlugin() {
KeyHandler.getInstance().fullReset(null);
setCursors(BLOCK_CURSOR_VIM_VALUE);
setAnimatedScrolling(ANIMATED_SCROLLING_VIM_VALUE);
setRefrainFromScrolling(REFRAIN_FROM_SCROLLING_VIM_VALUE);
CommandGroups.getInstance().getMotion().turnOn();
getEditor().turnOn();
getMotion().turnOn();
}
public void turnOffPlugin() {
private void turnOffPlugin() {
KeyHandler.getInstance().fullReset(null);
setCursors(isBlockCursor);
setAnimatedScrolling(isAnimatedScrolling);
setRefrainFromScrolling(isRefrainFromScrolling);
CommandGroups.getInstance().getMotion().turnOff();
getEditor().turnOff();
getMotion().turnOff();
}
private void setCursors(boolean isBlock) {
Editor[] editors = EditorFactory.getInstance().getAllEditors();
for (Editor editor : editors) {
// Vim plugin should be turned on in insert mode
((EditorEx)editor).setInsertMode(true);
editor.getSettings().setBlockCursor(isBlock);
private void updateState() {
if (isEnabled() && !ApplicationManager.getApplication().isUnitTestMode()) {
if (SystemInfo.isMac) {
final MacKeyRepeat keyRepeat = MacKeyRepeat.getInstance();
final Boolean enabled = keyRepeat.isEnabled();
final Boolean isKeyRepeat = editor.isKeyRepeat();
if ((enabled == null || !enabled) && (isKeyRepeat == null || isKeyRepeat)) {
if (Messages.showYesNoDialog("Do you want to enable repeating keys in Mac OS X on press and hold?\n\n" +
"(You can do it manually by running 'defaults write -g " +
"ApplePressAndHoldEnabled 0' in the console).", IDEAVIM_NOTIFICATION_TITLE,
Messages.getQuestionIcon()) == Messages.YES) {
editor.setKeyRepeat(true);
keyRepeat.setEnabled(true);
}
else {
editor.setKeyRepeat(false);
}
}
}
if (previousStateVersion > 0 && previousStateVersion < 3) {
final KeymapManagerEx manager = KeymapManagerEx.getInstanceEx();
Keymap keymap = null;
if (previousKeyMap != null) {
keymap = manager.getKeymap(previousKeyMap);
}
if (keymap == null) {
keymap = manager.getKeymap(DefaultKeymap.getInstance().getDefaultKeymapName());
}
assert keymap != null : "Default keymap not found";
new Notification(
VimPlugin.IDEAVIM_STICKY_NOTIFICATION_ID,
VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
String.format("IdeaVim plugin doesn't use the special \"Vim\" keymap any longer. " +
"Switching to \"%s\" keymap.<br/><br/>" +
"Now it is possible to set up:<br/>" +
"<ul>" +
"<li>Vim keys in your ~/.ideavimrc file using key mapping commands</li>" +
"<li>IDE action shortcuts in \"File | Settings | Keymap\"</li>" +
"<li>Vim or IDE handlers for conflicting shortcuts in <a href='#settings'>Vim Emulation</a> settings</li>" +
"</ul>", keymap.getPresentableName()),
NotificationType.INFORMATION,
new NotificationListener.Adapter() {
@Override
protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent e) {
ShowSettingsUtil.getInstance().editConfigurable((Project)null, new VimEmulationConfigurable());
}
}).notify(null);
manager.setActiveKeymap(keymap);
}
if (previousStateVersion > 0 && previousStateVersion < 4) {
new Notification(
VimPlugin.IDEAVIM_STICKY_NOTIFICATION_ID,
VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
"The ~/.vimrc file is no longer read by default, use ~/.ideavimrc instead. You can read it from your " +
"~/.ideavimrc using this command:<br/><br/>" +
"<code>source ~/.vimrc</code>",
NotificationType.INFORMATION).notify(null);
}
}
}
private void setAnimatedScrolling(boolean isOn) {
Editor[] editors = EditorFactory.getInstance().getAllEditors();
for (Editor editor : editors) {
editor.getSettings().setAnimatedScrolling(isOn);
}
/**
* This sets up some listeners so we can handle various events that occur
*/
private void setupListeners() {
final EventFacade eventFacade = EventFacade.getInstance();
setupStatisticsReporter(eventFacade);
DocumentManager.getInstance().addDocumentListener(new MarkGroup.MarkUpdater());
DocumentManager.getInstance().addDocumentListener(new SearchGroup.DocumentSearchListener());
eventFacade.addProjectManagerListener(new ProjectManagerAdapter() {
@Override
public void projectOpened(@NotNull final Project project) {
eventFacade.addFileEditorManagerListener(project, new MotionGroup.MotionEditorChange());
eventFacade.addFileEditorManagerListener(project, new FileGroup.SelectionCheck());
eventFacade.addFileEditorManagerListener(project, new SearchGroup.EditorSelectionCheck());
}
});
}
private void setRefrainFromScrolling(boolean isOn) {
Editor[] editors = EditorFactory.getInstance().getAllEditors();
for (Editor editor : editors) {
editor.getSettings().setRefrainFromScrolling(isOn);
}
}
private RegisterActions getActions() {
if (actions == null) {
// Register vim actions in command mode
actions = RegisterActions.getInstance();
// Register ex handlers
CommandParser.getInstance().registerHandlers();
}
return actions;
}
public boolean isError() {
return error;
}
public static void clearError() {
if (ApplicationManager.getApplication().isUnitTestMode()) {
getInstance().error = false;
}
/**
* Reports statistics about installed IdeaVim and enabled Vim emulation.
*
* See https://github.com/go-lang-plugin-org/go-lang-idea-plugin/commit/5182ab4a1d01ad37f6786268a2fe5e908575a217
*/
private void setupStatisticsReporter(@NotNull EventFacade eventFacade) {
final Application application = ApplicationManager.getApplication();
eventFacade.addEditorFactoryListener(new EditorFactoryAdapter() {
@Override
public void editorCreated(@NotNull EditorFactoryEvent event) {
final PropertiesComponent propertiesComponent = PropertiesComponent.getInstance();
final long lastUpdate = propertiesComponent.getOrInitLong(IDEAVIM_STATISTICS_TIMESTAMP_KEY, 0);
final boolean outOfDate = lastUpdate == 0 ||
System.currentTimeMillis() - lastUpdate > TimeUnit.DAYS.toMillis(1);
if (outOfDate && isEnabled()) {
application.executeOnPooledThread(new Runnable() {
@Override
public void run() {
try {
final String buildNumber = ApplicationInfo.getInstance().getBuild().asString();
final String pluginId = IDEAVIM_PLUGIN_ID;
final String version = URLEncoder.encode(getVersion(), CharsetToolkit.UTF8);
final String os = URLEncoder.encode(SystemInfo.OS_NAME + " " + SystemInfo.OS_VERSION,
CharsetToolkit.UTF8);
final String uid = UpdateChecker.getInstallationUID(PropertiesComponent.getInstance());
final String url =
"https://plugins.jetbrains.com/plugins/list" +
"?pluginId=" + pluginId +
"&build=" + buildNumber +
"&pluginVersion=" + version +
"&os=" + os +
"&uuid=" + uid;
PropertiesComponent.getInstance().setValue(IDEAVIM_STATISTICS_TIMESTAMP_KEY,
String.valueOf(System.currentTimeMillis()));
HttpRequests.request(url).connect(new HttpRequests.RequestProcessor<Object>() {
@Override
public Object process(@NotNull HttpRequests.Request request) throws IOException {
LOG.info("Sending statistics: " + url);
try {
JDOMUtil.load(request.getInputStream());
}
catch (JDOMException e) {
LOG.warn(e);
}
return null;
}
}
);
}
catch (IOException e) {
LOG.warn(e);
}
}
});
}
}
}, application);
}
}

View File

@@ -1,22 +0,0 @@
package com.maddyhome.idea.vim;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
/**
* This action allows to reconfigure base parent keymap for the Vim keymap
* @author oleg
*/
public class VimReconfigureKeymapAction extends AnAction implements DumbAware {
@Override
public void update(final AnActionEvent e) {
e.getPresentation().setEnabled(VimPlugin.isEnabled());
}
@Override
public void actionPerformed(final AnActionEvent e) {
VimKeyMapUtil.reconfigureParentKeymap(e.getData(PlatformDataKeys.PROJECT));
}
}

View File

@@ -1,76 +0,0 @@
package com.maddyhome.idea.vim;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import java.util.HashSet;
public class VimSettings {
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public HashSet getChoices() {
return choices;
}
public void setChoices(HashSet choices) {
this.choices = choices;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final VimSettings that = (VimSettings)o;
if (enabled != that.enabled) {
return false;
}
return choices.equals(that.choices);
}
public int hashCode() {
int result;
result = (enabled ? 1 : 0);
result = 29 * result + choices.hashCode();
return result;
}
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append("VimSettings");
sb.append("{enabled=").append(enabled);
sb.append(", choices=").append(choices);
sb.append('}');
return sb.toString();
}
private boolean enabled;
private HashSet choices = new HashSet();
}

View File

@@ -1,90 +1,78 @@
package com.maddyhome.idea.vim;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import com.intellij.codeInsight.lookup.LookupEx;
package com.maddyhome.idea.vim;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.maddyhome.idea.vim.helper.EditorDataContext;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/**
* This handler accepts all regular keystrokes and passes them on to the Vim Key handler
* Accepts all regular keystrokes and passes them on to the Vim key handler.
*
* IDE shortcut keys used by Vim commands are handled by {@link com.maddyhome.idea.vim.action.VimShortcutKeyAction}.
*/
public class VimTypedActionHandler implements TypedActionHandler {
/**
* Creates an instance of the key handler
*
* @param origHandler The original key handler
*/
private static final Logger logger = Logger.getInstance(VimTypedActionHandler.class.getName());
private final TypedActionHandler origHandler;
@NotNull private final KeyHandler handler;
public VimTypedActionHandler(TypedActionHandler origHandler) {
this.origHandler = origHandler;
handler = KeyHandler.getInstance();
handler.setOriginalHandler(origHandler);
}
/**
* Gives the original key handler
*
* @return The original key handler
*/
public TypedActionHandler getOriginalTypedHandler() {
return origHandler;
}
/**
* All characters typed into an editor will get sent to this handler. Only letters, numbers, and punctuation
* are sent here. Keys like Tab, Enter, Home, Backspace, etc. and all Control-Letter etc. argType keys are not
* sent by Idea to this handler.
*
* @param editor The editor the character was typed into
* @param charTyped The character that was typed
* @param context The data context
*/
@Override
public void execute(@NotNull final Editor editor, final char charTyped, @NotNull final DataContext context) {
// If the plugin is disabled we simply resend the character to the original handler
if (!VimPlugin.isEnabled()) {
if (isEnabled(editor)) {
// Run key handler outside of the key typed command for creating our own undoable commands
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
try {
handler.handleKey(editor, KeyStroke.getKeyStroke(charTyped), new EditorDataContext(editor));
}
catch (Throwable e) {
logger.error(e);
}
}
});
}
else {
origHandler.execute(editor, charTyped, context);
return;
}
// In case if keystrokes go to lookup, we use original handler
final LookupEx lookup = LookupManager.getActiveLookup(editor);
if (lookup != null && lookup.isFocused()) {
origHandler.execute(editor, charTyped, context);
return;
}
try {
handler.handleKey(editor, KeyStroke.getKeyStroke(charTyped), context);
}
catch (Throwable e) {
logger.error(e);
}
}
private TypedActionHandler origHandler;
private KeyHandler handler;
private static Logger logger = Logger.getInstance(VimTypedActionHandler.class.getName());
private boolean isEnabled(@NotNull Editor editor) {
if (VimPlugin.isEnabled()) {
final Lookup lookup = LookupManager.getActiveLookup(editor);
return lookup == null || !lookup.isFocused();
}
return false;
}
}

View File

@@ -1,48 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.diagnostic.Logger;
public abstract class AbstractDelegateAction extends AnAction implements DelegateAction {
protected AbstractDelegateAction() {
}
protected AbstractDelegateAction(AnAction origAction) {
setOrigAction(origAction);
}
public void setOrigAction(AnAction origAction) {
if (logger.isDebugEnabled()) {
logger.debug("origAction=" + origAction);
}
this.origAction = origAction;
copyFrom(origAction);
}
public AnAction getOrigAction() {
return origAction;
}
private AnAction origAction;
private static Logger logger = Logger.getInstance(AbstractDelegateAction.class.getName());
}

View File

@@ -1,51 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
public abstract class AbstractDelegateEditorAction extends EditorAction implements DelegateAction {
protected AbstractDelegateEditorAction(EditorActionHandler handler) {
super(handler);
}
protected AbstractDelegateEditorAction(EditorActionHandler handler, EditorAction origAction) {
this(handler);
setOrigAction(origAction);
}
public void setOrigAction(AnAction origAction) {
if (logger.isDebugEnabled()) {
logger.debug("origAction=" + origAction);
}
this.origAction = origAction;
copyFrom(origAction);
}
public AnAction getOrigAction() {
return origAction;
}
private AnAction origAction;
private static Logger logger = Logger.getInstance(AbstractDelegateEditorAction.class.getName());
}

View File

@@ -1,28 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.AnAction;
public interface DelegateAction {
void setOrigAction(AnAction origAction);
AnAction getOrigAction();
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*
@@ -34,9 +34,9 @@ public class ExEntryAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
CommandGroups.getInstance().getProcess().startExCommand(editor, context, cmd);
private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startExCommand(editor, context, cmd);
return true;
}

View File

@@ -1,33 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
public class OriginalDelegateAction extends AbstractDelegateAction {
public void actionPerformed(AnActionEvent event) {
Editor editor = event.getData(PlatformDataKeys.EDITOR);
if (editor != null) {
getOrigAction().actionPerformed(event);
}
}
}

View File

@@ -1,63 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import javax.swing.*;
import java.awt.event.KeyEvent;
public class PassThruDelegateAction extends AbstractDelegateAction {
public PassThruDelegateAction(KeyStroke stroke) {
this.stroke = stroke;
}
public void actionPerformed(AnActionEvent event) {
if (logger.isDebugEnabled()) {
logger.debug("actionPerformed key=" + stroke);
}
final Editor editor = event.getData(PlatformDataKeys.EDITOR); // API change - don't merge
if (editor == null || !VimPlugin.isEnabled()) {
getOrigAction().actionPerformed(event);
}
else if (event.getInputEvent() instanceof KeyEvent) {
KeyStroke key = KeyStroke.getKeyStrokeForEvent((KeyEvent)event.getInputEvent());
if (logger.isDebugEnabled()) {
logger.debug("event = KeyEvent: " + key);
}
KeyHandler.getInstance().handleKey(editor, key, event.getDataContext());
}
else {
if (logger.isDebugEnabled()) {
logger.debug("event is a " + event.getInputEvent().getClass().getName());
}
KeyHandler.getInstance().handleKey(editor, stroke, event.getDataContext());
}
}
private KeyStroke stroke;
private static Logger logger = Logger.getInstance(PassThruDelegateAction.class.getName());
}

View File

@@ -1,65 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2006 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class PassThruDelegateEditorAction extends AbstractDelegateEditorAction {
public PassThruDelegateEditorAction(KeyStroke stroke, EditorActionHandler origHandler) {
super(new MyHandler(stroke, origHandler));
}
private static Logger logger = Logger.getInstance(PassThruDelegateEditorAction.class.getName());
private static class MyHandler extends EditorActionHandler {
public MyHandler(KeyStroke stroke, EditorActionHandler handler) {
this.stroke = stroke;
this.origHandler = handler;
}
public void execute(@Nullable Editor editor, @NotNull DataContext dataContext) {
if (logger.isDebugEnabled()) {
logger.debug("actionPerformed key=" + stroke);
}
if (editor == null || !VimPlugin.isEnabled()) {
origHandler.execute(editor, dataContext);
}
else {
if (logger.isDebugEnabled()) {
logger.debug("event = KeyEvent: " + stroke);
}
KeyHandler.getInstance().handleKey(InjectedLanguageUtil.getTopLevelEditor(editor), stroke, dataContext);
}
}
private KeyStroke stroke;
private EditorActionHandler origHandler;
}
}

View File

@@ -1,32 +1,40 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.handler.ResetModeHandler;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.KeyHandler;
import org.jetbrains.annotations.NotNull;
/**
*
*/
public class ResetModeAction extends EditorAction {
public ResetModeAction() {
super(new ResetModeHandler());
super(new EditorActionHandler() {
public void execute(@NotNull Editor editor, @NotNull DataContext context) {
KeyHandler.getInstance().fullReset(InjectedLanguageUtil.getTopLevelEditor(editor));
}
});
}
}

View File

@@ -1,36 +0,0 @@
package com.maddyhome.idea.vim.action;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.diagnostic.Logger;
/**
*
*/
public class TxActionWrapper extends AbstractDelegateAction {
public void actionPerformed(AnActionEvent event) {
logger.debug("actionPerformed");
getOrigAction().actionPerformed(event);
}
private static Logger logger = Logger.getInstance(TxActionWrapper.class.getName());
}

View File

@@ -0,0 +1,80 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.helper.StringHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* Action that represents a Vim command.
*
* Actions should be registered in resources/META-INF/plugin.xml and in package-info.java
* inside {@link com.maddyhome.idea.vim.action}.
*
* @author vlan
*/
public abstract class VimCommandAction extends EditorAction {
protected VimCommandAction(EditorActionHandler defaultHandler) {
super(defaultHandler);
}
@NotNull
public abstract Set<MappingMode> getMappingModes();
@NotNull
public abstract Set<List<KeyStroke>> getKeyStrokesSet();
@NotNull
public abstract Command.Type getType();
@NotNull
public Argument.Type getArgumentType() {
return Argument.Type.NONE;
}
/**
* Returns various binary flags for the command.
*
* These legacy flags will be refactored in future releases.
*
* @see {@link Command}.
*/
public int getFlags() {
return 0;
}
@NotNull
protected static Set<List<KeyStroke>> parseKeysSet(@NotNull String... keyStrings) {
final ImmutableSet.Builder<List<KeyStroke>> builder = ImmutableSet.builder();
for (String keyString : keyStrings) {
builder.add(StringHelper.parseKeys(keyString));
}
return builder.build();
}
}

View File

@@ -1,8 +1,27 @@
package com.maddyhome.idea.vim;
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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;
/**
* This class is used to handle the Vim Plugin enabled/disabled toggle. This is most likely used as a menu option

View File

@@ -0,0 +1,237 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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.codeInsight.lookup.LookupManager;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationListener;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction;
import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.helper.EditorData;
import com.maddyhome.idea.vim.helper.EditorDataContext;
import com.maddyhome.idea.vim.key.ShortcutOwner;
import com.maddyhome.idea.vim.ui.VimEmulationConfigurable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.awt.event.KeyEvent.*;
/**
* Handles Vim keys that are treated as action shortcuts by the IDE.
*
* These keys are not passed to {@link com.maddyhome.idea.vim.VimTypedActionHandler} and should be handled by actions.
*/
public class VimShortcutKeyAction extends AnAction implements DumbAware {
private static final String ACTION_ID = "VimShortcutKeyAction";
@NotNull public static final Set<KeyStroke> VIM_ONLY_EDITOR_KEYS = ImmutableSet.<KeyStroke>builder()
.addAll(getKeyStrokes(VK_ENTER, 0))
.addAll(getKeyStrokes(VK_ESCAPE, 0))
.addAll(getKeyStrokes(VK_TAB, 0))
.addAll(getKeyStrokes(VK_BACK_SPACE, 0, CTRL_MASK))
.addAll(getKeyStrokes(VK_INSERT, 0))
.addAll(getKeyStrokes(VK_DELETE, 0, CTRL_MASK))
.addAll(getKeyStrokes(VK_UP, 0, CTRL_MASK, SHIFT_MASK))
.addAll(getKeyStrokes(VK_DOWN, 0, CTRL_MASK, SHIFT_MASK))
.addAll(getKeyStrokes(VK_LEFT, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_RIGHT, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_HOME, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_END, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_PAGE_UP, 0, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_PAGE_DOWN, 0, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.build();
@NotNull private static final Set<KeyStroke> NON_FILE_EDITOR_KEYS = ImmutableSet.<KeyStroke>builder()
.addAll(getKeyStrokes(VK_ENTER, 0))
.addAll(getKeyStrokes(VK_ESCAPE, 0))
.addAll(getKeyStrokes(VK_TAB, 0))
.addAll(getKeyStrokes(VK_UP, 0))
.addAll(getKeyStrokes(VK_DOWN, 0))
.build();
private static final Logger ourLogger = Logger.getInstance(VimShortcutKeyAction.class.getName());
private static AnAction ourInstance = null;
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
final Editor editor = getEditor(e);
final KeyStroke keyStroke = getKeyStroke(e);
if (editor != null && keyStroke != null) {
final ShortcutOwner owner = VimPlugin.getKey().getSavedShortcutConflicts().get(keyStroke);
if (owner == ShortcutOwner.UNDEFINED) {
notifyAboutShortcutConflict(keyStroke);
}
// Should we use InjectedLanguageUtil.getTopLevelEditor(editor) here, as we did in former EditorKeyHandler?
// Run key handler later to restore input events sequence due to VimTypedActionHandler
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
try {
KeyHandler.getInstance().handleKey(editor, keyStroke, new EditorDataContext(editor));
}
catch (Throwable throwable) {
ourLogger.error(throwable);
}
}
});
}
}
@Override
public void update(@NotNull AnActionEvent e) {
e.getPresentation().setEnabled(isEnabled(e));
}
@NotNull
public static AnAction getInstance() {
if (ourInstance == null) {
final AnAction originalAction = ActionManager.getInstance().getAction(ACTION_ID);
ourInstance = EmptyAction.wrap(originalAction);
}
return ourInstance;
}
private void notifyAboutShortcutConflict(@NotNull final KeyStroke keyStroke) {
VimPlugin.getKey().getSavedShortcutConflicts().put(keyStroke, ShortcutOwner.VIM);
final String message = String.format(
"Using the <b>%s</b> shortcut for Vim emulation.<br/>" +
"You can redefine it as an <a href='#ide'>IDE shortcut</a> or " +
"configure its handler in <a href='#settings'>Vim Emulation</a> settings.",
KeymapUtil.getShortcutText(new KeyboardShortcut(keyStroke, null)));
final NotificationListener listener = new NotificationListener.Adapter() {
@Override
protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent e) {
final String description = e.getDescription();
if ("#ide".equals(description)) {
VimPlugin.getKey().getSavedShortcutConflicts().put(keyStroke, ShortcutOwner.IDE);
notification.expire();
}
else if ("#settings".equals(description)) {
ShowSettingsUtil.getInstance().editConfigurable((Project)null, new VimEmulationConfigurable());
}
}
};
final Notification notification = new Notification(VimPlugin.IDEAVIM_NOTIFICATION_ID,
VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
message,
NotificationType.INFORMATION,
listener);
notification.notify(null);
}
private boolean isEnabled(@NotNull AnActionEvent e) {
if (VimPlugin.isEnabled()) {
final Editor editor = getEditor(e);
final KeyStroke keyStroke = getKeyStroke(e);
if (editor != null && keyStroke != null) {
final int keyCode = keyStroke.getKeyCode();
if (LookupManager.getActiveLookup(editor) != null) {
return isExitInsertMode(keyStroke);
}
if (CommandState.inInsertMode(editor)) {
// XXX: <Tab> won't be recorded in macros
if (keyCode == VK_TAB) {
return false;
}
// Debug watch, Python console, etc.
if (NON_FILE_EDITOR_KEYS.contains(keyStroke) && !EditorData.isFileEditor(editor)) {
return false;
}
}
if (VIM_ONLY_EDITOR_KEYS.contains(keyStroke)) {
return true;
}
final Map<KeyStroke, ShortcutOwner> savedShortcutConflicts = VimPlugin.getKey().getSavedShortcutConflicts();
final ShortcutOwner owner = savedShortcutConflicts.get(keyStroke);
if (owner == ShortcutOwner.VIM) {
return true;
}
else if (owner == ShortcutOwner.IDE) {
return !isShortcutConflict(keyStroke);
}
else {
if (isShortcutConflict(keyStroke)) {
savedShortcutConflicts.put(keyStroke, ShortcutOwner.UNDEFINED);
}
return true;
}
}
}
return false;
}
private boolean isExitInsertMode(@NotNull KeyStroke keyStroke) {
for (List<KeyStroke> keys : InsertExitModeAction.getInstance().getKeyStrokesSet()) {
// XXX: Currently we cannot handle <C-\><C-N> because of the importance of <C-N> for the IDE on Linux
if (keys.size() == 1 && keyStroke.equals(keys.get(0))) {
return true;
}
}
return false;
}
private boolean isShortcutConflict(@NotNull KeyStroke keyStroke) {
return !VimPlugin.getKey().getKeymapConflicts(keyStroke).isEmpty();
}
@NotNull
private static List<KeyStroke> getKeyStrokes(int keyCode, @NotNull int... modifiers) {
final List<KeyStroke> keyStrokes = new ArrayList<KeyStroke>();
for (int modifier : modifiers) {
keyStrokes.add(KeyStroke.getKeyStroke(keyCode, modifier));
}
return keyStrokes;
}
@Nullable
private KeyStroke getKeyStroke(@NotNull AnActionEvent e) {
final InputEvent inputEvent = e.getInputEvent();
if (inputEvent instanceof KeyEvent) {
final KeyEvent keyEvent = (KeyEvent)inputEvent;
return KeyStroke.getKeyStrokeForEvent(keyEvent);
}
return null;
}
@Nullable
private Editor getEditor(@NotNull AnActionEvent e) {
return e.getData(PlatformDataKeys.EDITOR);
}
}

View File

@@ -0,0 +1,98 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.*;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.MotionGroup;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.helper.MessageHelper;
import com.maddyhome.idea.vim.key.OperatorFunction;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class OperatorAction extends VimCommandAction {
protected OperatorAction() {
super(new EditorActionHandlerBase() {
@Override
protected 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, 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;
}
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("g@");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_READ_WRITE;
}
@NotNull
@Override
public Argument.Type getArgumentType() {
return Argument.Type.MOTION;
}
@Override
public int getFlags() {
return Command.FLAG_OP_PEND;
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.helper.UndoRedoHelper;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,8 +33,8 @@ public class RedoAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return UndoRedoHelper.redo(context);
}
}

View File

@@ -1,34 +1,34 @@
package com.maddyhome.idea.vim.action.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.KeyHandler;
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.CommandState;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.key.KeyParser;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -37,8 +37,8 @@ public class RepeatChangeAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
public boolean execute(Editor editor, DataContext context, Command command) {
private static class Handler extends EditorActionHandlerBase {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command command) {
CommandState state = CommandState.getInstance(editor);
Command cmd = state.getLastChangeCommand();
if (cmd != null) {
@@ -54,9 +54,9 @@ public class RepeatChangeAction extends EditorAction {
}
Command save = state.getCommand();
state.setCommand(cmd);
state.pushState(CommandState.Mode.REPEAT, CommandState.SubMode.NONE, KeyParser.MAPPING_NORMAL);
char reg = CommandGroups.getInstance().getRegister().getCurrentRegister();
CommandGroups.getInstance().getRegister().selectRegister(state.getLastChangeRegister());
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);
}
@@ -64,9 +64,11 @@ public class RepeatChangeAction extends EditorAction {
// oops
}
state.popState();
state.setCommand(save);
if (save != null) {
state.setCommand(save);
}
state.saveLastChangeCommand(cmd);
CommandGroups.getInstance().getRegister().selectRegister(reg);
VimPlugin.getRegister().selectRegister(reg);
return true;
}

View File

@@ -1,31 +1,31 @@
package com.maddyhome.idea.vim.action.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.ex.CommandParser;
import com.maddyhome.idea.vim.ex.ExException;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -34,8 +34,8 @@ public class RepeatExCommandAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
public boolean execute(Editor editor, DataContext context, Command command) {
private static class Handler extends EditorActionHandlerBase {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command command) {
int count = command.getCount();
try {
return CommandParser.getInstance().processLastCommand(editor, context, count);

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import com.maddyhome.idea.vim.helper.UndoRedoHelper;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,8 +33,8 @@ public class UndoAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return UndoRedoHelper.undo(context);
}
}

View File

@@ -0,0 +1,74 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class AutoIndentLinesVisualAction extends VimCommandAction {
public AutoIndentLinesVisualAction() {
super(new VisualOperatorActionHandler() {
@Override
protected boolean execute(@NotNull Editor editor,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull TextRange range) {
VimPlugin.getChange().autoIndentRange(editor, context, range);
return true;
}
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("=");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_FORCE_LINEWISE | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,31 +1,32 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -35,9 +36,10 @@ public class ChangeCaseLowerMotionAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeCaseMotion(editor, context, count, rawCount,
CharacterHelper.CASE_LOWER, argument);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return argument != null &&
VimPlugin.getChange().changeCaseMotion(editor, context, count, rawCount, CharacterHelper.CASE_LOWER,
argument);
}
}
}

View File

@@ -1,45 +1,73 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
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.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeCaseLowerVisualAction extends EditorAction {
public class ChangeCaseLowerVisualAction extends VimCommandAction {
public ChangeCaseLowerVisualAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(editor);
return VimPlugin.getChange().changeCaseRange(topLevelEditor, range, CharacterHelper.CASE_LOWER);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
return CommandGroups.getInstance().getChange().changeCaseRange(InjectedLanguageUtil.getTopLevelEditor(editor), context, range, CharacterHelper.CASE_LOWER);
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("u");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeCaseToggleCharacterAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeCaseToggleCharacter(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeCaseToggleCharacter(editor, count);
}
}
}

View File

@@ -1,31 +1,32 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -35,9 +36,9 @@ public class ChangeCaseToggleMotionAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeCaseMotion(editor, context, count, rawCount,
CharacterHelper.CASE_TOGGLE, argument);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return argument != null && VimPlugin.getChange().changeCaseMotion(editor, context, count, rawCount,
CharacterHelper.CASE_TOGGLE, argument);
}
}
}

View File

@@ -1,43 +1,71 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeCaseToggleVisualAction extends EditorAction {
public class ChangeCaseToggleVisualAction extends VimCommandAction {
public ChangeCaseToggleVisualAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return VimPlugin.getChange().changeCaseRange(editor, range, CharacterHelper.CASE_TOGGLE);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
return CommandGroups.getInstance().getChange().changeCaseRange(editor, context, range, CharacterHelper.CASE_TOGGLE);
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("~");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,31 +1,32 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -35,9 +36,9 @@ public class ChangeCaseUpperMotionAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeCaseMotion(editor, context, count, rawCount,
CharacterHelper.CASE_UPPER, argument);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return argument != null && VimPlugin.getChange().changeCaseMotion(editor, context, count, rawCount,
CharacterHelper.CASE_UPPER, argument);
}
}
}

View File

@@ -1,43 +1,71 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeCaseUpperVisualAction extends EditorAction {
public class ChangeCaseUpperVisualAction extends VimCommandAction {
public ChangeCaseUpperVisualAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return VimPlugin.getChange().changeCaseRange(editor, range, CharacterHelper.CASE_UPPER);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
return CommandGroups.getInstance().getChange().changeCaseRange(editor, context, range, CharacterHelper.CASE_UPPER);
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("U");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeCharacterAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeCharacter(editor, context, count, argument.getCharacter());
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return argument != null && VimPlugin.getChange().changeCharacter(editor, count, argument.getCharacter());
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeCharactersAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeCharacters(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeCharacters(editor, context, count);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeEndOfLineAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeEndOfLine(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeEndOfLine(editor, context, count);
}
}
}

View File

@@ -1,32 +1,33 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.ex.LineRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -36,9 +37,9 @@ public class ChangeLastGlobalSearchReplaceAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
LineRange range = new LineRange(0, EditorHelper.getLineCount(editor) - 1);
return CommandGroups.getInstance().getSearch().searchAndReplace(editor, context, range, "s", "//~/&");
return VimPlugin.getSearch().searchAndReplace(editor, range, "s", "//~/&");
}
}
}

View File

@@ -1,31 +1,32 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.ex.LineRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -35,10 +36,10 @@ public class ChangeLastSearchReplaceAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
int line = editor.getCaretModel().getLogicalPosition().line;
LineRange range = new LineRange(line, line);
return CommandGroups.getInstance().getSearch().searchAndReplace(editor, context, range, "s", "//~/");
return VimPlugin.getSearch().searchAndReplace(editor, range, "s", "//~/");
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeLineAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeLine(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeLine(editor, context, count);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeMotionAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeMotion(editor, context, count, rawCount, argument);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return argument != null && VimPlugin.getChange().changeMotion(editor, context, count, rawCount, argument);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2006 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeNumberDecAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeNumber(editor, context, -count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeNumber(editor, -count);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2006 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeNumberIncAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeNumber(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeNumber(editor, count);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class ChangeReplaceAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().changeReplace(editor, context);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().changeReplace(editor, context);
}
}
}

View File

@@ -1,44 +1,72 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeVisualAction extends EditorAction {
public class ChangeVisualAction extends VimCommandAction {
public ChangeVisualAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final SelectionType type = range.isMultiple() ? SelectionType.BLOCK_WISE : SelectionType.CHARACTER_WISE;
return VimPlugin.getChange().changeRange(editor, context, range, type);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
final SelectionType type = range.isMultiple() ? SelectionType.BLOCK_WISE : SelectionType.CHARACTER_WISE;
return CommandGroups.getInstance().getChange().changeRange(editor, context, range, type);
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("c", "s");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,43 +1,78 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.MappingMode;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeVisualCharacterAction extends EditorAction {
public class ChangeVisualCharacterAction extends VimCommandAction {
public ChangeVisualCharacterAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final Argument argument = cmd.getArgument();
return argument != null && VimPlugin.getChange().changeCharacterRange(editor, range, argument.getCharacter());
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
return CommandGroups.getInstance().getChange().changeCharacterRange(editor, context, range,
cmd.getArgument().getCharacter());
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("r");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@NotNull
@Override
public Argument.Type getArgumentType() {
return Argument.Type.DIGRAPH;
}
@Override
public int getFlags() {
return Command.FLAG_ALLOW_DIGRAPH | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,47 +1,74 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeVisualLinesAction extends EditorAction {
public class ChangeVisualLinesAction extends VimCommandAction {
public ChangeVisualLinesAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, context, lineRange, SelectionType.LINE_WISE);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
return CommandGroups.getInstance().getChange().changeRange(editor, context, range, SelectionType.LINE_WISE);
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("R", "S");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,61 +1,87 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ChangeVisualLinesEndAction extends EditorAction {
public class ChangeVisualLinesEndAction extends VimCommandAction {
public ChangeVisualLinesEndAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
if (range.isMultiple()) {
final int[] starts = range.getStartOffsets();
final int[] ends = range.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, context, blockRange, SelectionType.BLOCK_WISE);
}
else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, context, lineRange, SelectionType.LINE_WISE);
}
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
if (range.isMultiple()) {
int[] starts = range.getStartOffsets();
int[] ends = range.getEndOffsets();
for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
}
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
range = new TextRange(starts, ends);
return CommandGroups.getInstance().getChange().changeRange(editor, context, range, SelectionType.BLOCK_WISE);
}
else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("C");
}
return CommandGroups.getInstance().getChange().changeRange(editor, context, range, SelectionType.LINE_WISE);
}
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,9 +33,9 @@ public class FilterCountLinesAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
CommandGroups.getInstance().getProcess().startFilterCommand(editor, context, cmd);
private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startFilterCommand(editor, context, cmd);
return true;
}

View File

@@ -1,33 +1,34 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.intellij.openapi.editor.actionSystem.EditorAction;
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.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.group.MotionGroup;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -36,10 +37,13 @@ public class FilterMotionAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
TextRange range = MotionGroup.getMotionRange(editor, context, cmd.getCount(), cmd.getRawCount(),
cmd.getArgument(), false, false);
private static class Handler extends EditorActionHandlerBase {
protected 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, context, cmd.getCount(), cmd.getRawCount(), argument, false);
if (range == null) {
return false;
}
@@ -60,7 +64,7 @@ public class FilterMotionAction extends EditorAction {
}
Command command = new Command(count, null, null, Command.Type.UNDEFINED, 0);
CommandGroups.getInstance().getProcess().startFilterCommand(editor, context, command);
VimPlugin.getProcess().startFilterCommand(editor, context, command);
return true;
}

View File

@@ -1,44 +1,70 @@
package com.maddyhome.idea.vim.action.change.change;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.actionSystem.EditorAction;
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.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class FilterVisualLinesAction extends EditorAction {
public class FilterVisualLinesAction extends VimCommandAction {
public FilterVisualLinesAction() {
super(new Handler());
super(new EditorActionHandlerBase() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startFilterCommand(editor, context, cmd);
VimPlugin.getMotion().resetVisual(editor, true);
return true;
}
});
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
CommandGroups.getInstance().getProcess().startFilterCommand(editor, context, cmd);
CommandGroups.getInstance().getMotion().resetVisual(editor, true);
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
return true;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("!");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE;
}
}

View File

@@ -0,0 +1,72 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class ReformatCodeVisualAction extends VimCommandAction {
public ReformatCodeVisualAction() {
super(new VisualOperatorActionHandler() {
@Override
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
VimPlugin.getChange().reformatCode(context);
return true;
}
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gq");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_FORCE_LINEWISE | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class DeleteCharacterAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().deleteCharacter(editor, context, 1);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().deleteCharacter(editor, 1, false);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class DeleteCharacterLeftAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().deleteCharacter(editor, context, -count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().deleteCharacter(editor, -count, false);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class DeleteCharacterRightAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().deleteCharacter(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().deleteCharacter(editor, count, false);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class DeleteEndOfLineAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().deleteEndOfLine(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().deleteEndOfLine(editor, count);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,12 +35,12 @@ public class DeleteJoinLinesAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
if (editor.isOneLineMode()) {
return false;
}
return CommandGroups.getInstance().getChange().deleteJoinLines(editor, context, count, false);
return VimPlugin.getChange().deleteJoinLines(editor, count, false);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,12 +35,12 @@ public class DeleteJoinLinesSpacesAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
if (editor.isOneLineMode()) {
return false;
}
return CommandGroups.getInstance().getChange().deleteJoinLines(editor, context, count, true);
return VimPlugin.getChange().deleteJoinLines(editor, count, true);
}
}
}

View File

@@ -1,46 +1,70 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
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.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class DeleteJoinVisualLinesAction extends EditorAction {
public class DeleteJoinVisualLinesAction extends VimCommandAction {
public DeleteJoinVisualLinesAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return !editor.isOneLineMode() && VimPlugin.getChange().deleteJoinRange(editor, range, false);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
if (editor.isOneLineMode()) {
return false;
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
return CommandGroups.getInstance().getChange().deleteJoinRange(editor, context, range, false);
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gJ");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,46 +1,70 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
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.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class DeleteJoinVisualLinesSpacesAction extends EditorAction {
public class DeleteJoinVisualLinesSpacesAction extends VimCommandAction {
public DeleteJoinVisualLinesSpacesAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return !editor.isOneLineMode() && VimPlugin.getChange().deleteJoinRange(editor, range, true);
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
if (editor.isOneLineMode()) {
return false;
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
return CommandGroups.getInstance().getChange().deleteJoinRange(editor, context, range, true);
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("J");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class DeleteLineAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().deleteLine(editor, context, count);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return VimPlugin.getChange().deleteLine(editor, count);
}
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class DeleteMotionAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return CommandGroups.getInstance().getChange().deleteMotion(editor, context, count, rawCount, argument, false);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
return argument != null && VimPlugin.getChange().deleteMotion(editor, context, count, rawCount, argument, false);
}
}
}

View File

@@ -1,52 +1,81 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
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.CommandState;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class DeleteVisualAction extends EditorAction {
public class DeleteVisualAction extends VimCommandAction {
public DeleteVisualAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_LINE) {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, lineRange, SelectionType.fromSubMode(mode), false);
}
else {
return VimPlugin.getChange().deleteRange(editor, range, SelectionType.fromSubMode(mode), false);
}
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_LINE) {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
return CommandGroups.getInstance().getChange().deleteRange(editor, context, range,
SelectionType.fromSubMode(mode));
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("d", "x", "<Del>");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,55 +1,81 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
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.CommandState;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class DeleteVisualLinesAction extends EditorAction {
public class DeleteVisualLinesAction extends VimCommandAction {
public DeleteVisualLinesAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_BLOCK) {
return VimPlugin.getChange().deleteRange(editor, range, SelectionType.fromSubMode(mode), false);
}
else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, lineRange, SelectionType.LINE_WISE, false);
}
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_BLOCK) {
return CommandGroups.getInstance().getChange().deleteRange(editor, context, range,
SelectionType.fromSubMode(mode));
}
else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
return CommandGroups.getInstance().getChange().deleteRange(editor, context, range, SelectionType.LINE_WISE);
}
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("X");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,63 +1,87 @@
package com.maddyhome.idea.vim.action.change.delete;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 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.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
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.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class DeleteVisualLinesEndAction extends EditorAction {
public class DeleteVisualLinesEndAction extends VimCommandAction {
public DeleteVisualLinesEndAction() {
super(new Handler());
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
if (range.isMultiple()) {
final int[] starts = range.getStartOffsets();
final int[] ends = range.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, blockRange, SelectionType.BLOCK_WISE, false);
}
else {
final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, lineRange, SelectionType.LINE_WISE, false);
}
}
});
}
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd, TextRange range) {
if (range.isMultiple()) {
int[] starts = range.getStartOffsets();
int[] ends = range.getEndOffsets();
for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
}
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
range = new TextRange(starts, ends);
return CommandGroups.getInstance().getChange().deleteRange(editor, context, range,
SelectionType.BLOCK_WISE);
}
else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("D");
}
return CommandGroups.getInstance().getChange().deleteRange(editor, context, range,
SelectionType.LINE_WISE);
}
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_EXIT_VISUAL;
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class InsertAfterCursorAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
CommandGroups.getInstance().getChange().insertAfterCursor(editor, context);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
VimPlugin.getChange().insertAfterCursor(editor, context);
return true;
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class InsertAfterLineEndAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
CommandGroups.getInstance().getChange().insertAfterLineEnd(editor, context);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
VimPlugin.getChange().insertAfterLineEnd(editor, context);
return true;
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class InsertAtPreviousInsertAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
CommandGroups.getInstance().getChange().insertAtPreviousInsert(editor, context);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
VimPlugin.getChange().insertAtPreviousInsert(editor, context);
return true;
}

View File

@@ -1,43 +1,69 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
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.group.CommandGroups;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
public class InsertBeforeCursorAction extends EditorAction {
import javax.swing.*;
import java.util.List;
import java.util.Set;
public class InsertBeforeCursorAction extends VimCommandAction {
public InsertBeforeCursorAction() {
super(new Handler());
super(new ChangeEditorActionHandler() {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount,
@Nullable Argument argument) {
VimPlugin.getChange().insertBeforeCursor(editor, context);
return true;
}
});
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
CommandGroups.getInstance().getChange().insertBeforeCursor(editor, context);
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
return true;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("i", "<Insert>");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.INSERT;
}
@Override
public int getFlags() {
return Command.FLAG_MULTIKEY_UNDO;
}
}

View File

@@ -1,30 +1,31 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
*/
@@ -34,8 +35,8 @@ public class InsertBeforeFirstNonBlankAction extends EditorAction {
}
private static class Handler extends ChangeEditorActionHandler {
public boolean execute(Editor editor, DataContext context, int count, int rawCount, Argument argument) {
CommandGroups.getInstance().getChange().insertBeforeFirstNonBlank(editor, context);
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
VimPlugin.getChange().insertBeforeFirstNonBlank(editor, context);
return true;
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,13 +33,13 @@ public class InsertCharacterAboveCursorAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
if (editor.isOneLineMode()) {
return false;
}
return CommandGroups.getInstance().getChange().insertCharacterAroundCursor(editor, context, -1);
return VimPlugin.getChange().insertCharacterAroundCursor(editor, context, -1);
}
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,13 +33,13 @@ public class InsertCharacterBelowCursorAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
protected boolean execute(Editor editor, DataContext context, Command cmd) {
private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
if (editor.isOneLineMode()) {
return false;
}
return CommandGroups.getInstance().getChange().insertCharacterAroundCursor(editor, context, 1);
return VimPlugin.getChange().insertCharacterAroundCursor(editor, context, 1);
}
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,9 +33,9 @@ public class InsertDeleteInsertedTextAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
public boolean execute(Editor editor, DataContext context, Command cmd) {
return CommandGroups.getInstance().getChange().insertDeleteInsertedText(editor, context);
private static class Handler extends EditorActionHandlerBase {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getChange().insertDeleteInsertedText(editor);
}
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.handler.AbstractEditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -33,9 +33,9 @@ public class InsertDeletePreviousWordAction extends EditorAction {
super(new Handler());
}
private static class Handler extends AbstractEditorActionHandler {
public boolean execute(Editor editor, DataContext context, Command cmd) {
return CommandGroups.getInstance().getChange().insertDeletePreviousWord(editor, context);
private static class Handler extends EditorActionHandlerBase {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getChange().insertDeletePreviousWord(editor);
}
}
}

View File

@@ -1,30 +1,30 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.group.CommandGroups;
import com.maddyhome.idea.vim.VimPlugin;
import org.jetbrains.annotations.NotNull;
/**
*/
@@ -34,13 +34,8 @@ public class InsertEnterAction extends EditorAction {
}
private static class Handler extends EditorActionHandler {
public void execute(Editor editor, DataContext context) {
editor = InjectedLanguageUtil.getTopLevelEditor(editor);
if (editor.isOneLineMode()) {
return;
}
CommandGroups.getInstance().getChange().processEnter(editor, context);
public void execute(@NotNull Editor editor, @NotNull DataContext context) {
VimPlugin.getChange().processEnter(InjectedLanguageUtil.getTopLevelEditor(editor), context);
}
}
}

View File

@@ -1,41 +1,70 @@
package com.maddyhome.idea.vim.action.change.insert;
/*
* IdeaVim - A Vim emulator plugin for IntelliJ Idea
* Copyright (C) 2003-2005 Rick Maddy
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2016 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 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.group.CommandGroups;
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.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
public class InsertExitModeAction extends VimCommandAction {
private static final String ACTION_ID = "VimInsertExitMode";
/**
*/
public class InsertExitModeAction extends EditorAction {
public InsertExitModeAction() {
super(new Handler());
super(new EditorActionHandlerBase() {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getChange().processEscape(InjectedLanguageUtil.getTopLevelEditor(editor), context);
return true;
}
});
}
private static class Handler extends EditorActionHandler {
public void execute(Editor editor, DataContext context) {
CommandGroups.getInstance().getChange().processEscape(InjectedLanguageUtil.getTopLevelEditor(editor), context);
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.I;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("<C-[>", "<C-C>", "<Esc>", "<C-\\><C-N>");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.INSERT;
}
@NotNull
public static VimCommandAction getInstance() {
return (VimCommandAction)ActionManager.getInstance().getAction(ACTION_ID);
}
}

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