1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-09-15 17:32:14 +02:00

Compare commits

...

102 Commits

Author SHA1 Message Date
9f469d0eb2 Set plugin version to chylex-13 2022-10-24 02:18:35 +02:00
f59d2f769c Stop IdeaVIM blocking editor scrolling 2022-10-24 02:18:35 +02:00
dc00b59733 Change matchit plugin to use HTML patterns in unrecognized files 2022-10-24 02:11:31 +02:00
bc20e6af9c Fix vim-surround not working with multiple cursors
Fixes multiple cursors with vim-surround commands `cs, ds, S` (but not `ys`).

 Conflicts:
	src/main/java/com/maddyhome/idea/vim/extension/surround/VimSurroundExtension.kt
2022-10-24 02:09:43 +02:00
c40f07714a Add VimScript 'renaming()' function 2022-10-24 02:04:59 +02:00
fa68842c2d Add support for repeatable actions with ':raction' 2022-10-24 02:04:59 +02:00
eca9258607 Disable taking over arrow keys and Home/End 2022-10-24 02:04:26 +02:00
46fb030977 Set custom plugin version 2022-10-24 02:04:25 +02:00
Alex Plate
da3d83ecc6 Update formatting 2022-10-23 00:26:59 +00:00
filipp
4af8e574c4 Log keystrokes only in ASCII 2022-10-19 14:59:09 +03:00
Alex Plate
bdcb5c4f33 Update colors 2022-10-18 16:56:43 +03:00
Alex Plate
013f7a42c2 [VIM-2774] Move visual toggle mode to another handler 2022-10-18 16:38:40 +03:00
Alex Plate
d03398f3e8 [VIM-2774] Move reset mode to another handler 2022-10-18 16:38:40 +03:00
Alex Plate
7a26307a2b [VIM-2774] Move caret swap to runForEachCaret 2022-10-18 16:38:40 +03:00
Alex Plate
fa6a0369b8 [VIM-2774] Remove runforEachCaret for other method 2022-10-18 16:38:40 +03:00
Alex Plate
ad8cb0ba09 [VIM-2774] Add conditional multicaret handler 2022-10-18 16:38:39 +03:00
Alex Plate
8125ce5072 Update changelog 2022-10-18 08:34:00 +00:00
Alex Plate
6c0cc7285f Fix(VIM-2766): Move NERDTree update to background thread 2022-10-18 11:31:15 +03:00
Alex Plate
d3424021c8 Fix(VIM-2768): Refactor listeners 2022-10-17 17:39:40 +03:00
Alex Plate
623aa40acd Update to java 17 2022-10-17 15:45:15 +03:00
Alex Plate
c131cb338e Update description in plugin.xml 2022-10-17 15:45:14 +03:00
filipp
14d242a233 Disable logging undefined handlers 2022-10-17 14:56:16 +03:00
Alex Plate
a131b7d29a Update IdeaVim motto 2022-10-17 12:35:05 +03:00
Alex Plate
85a1fbe89e Update links to github accounts 2022-10-11 09:23:07 +03:00
Alex Plate
142550a1f8 Use 2022.2.2 version of IJ by default 2022-10-04 09:48:35 +03:00
Alex Plate
e3d3b73903 Fix incompatiility with futur versions of IJ 2022-10-04 09:48:18 +03:00
Alex Plate
45f18ff91c Update formatting 2022-10-02 00:26:29 +00:00
Alex Pláte
2103163207 Update AUTHORS information 2022-09-29 09:10:19 +03:00
filipp
19dd49670c Statistic 2022-09-26 11:51:56 +03:00
Alex Plate
e738a1a821 Update formatting 2022-09-25 00:20:49 +00:00
filipp
6e0f301fb8 Fix(VIM-2757) Wrong gv behavior 2022-09-22 04:08:39 +03:00
filipp
c76b8db293 Fix(VIM-2718) Copied value is not inserted 2022-09-21 03:00:53 +03:00
Alex Plate
9fa4ca8fb3 Update formatting 2022-09-18 00:20:25 +00:00
Alex Plate
871b60fe8d Revert "[New Typing Handler]: Switch j command to new typing handler"
This reverts commit 43a79dba
2022-09-12 09:30:22 +03:00
Alex Plate
6715a5b61f Revert "[New Typing Handler]: Support d"
This reverts commit c32c62ea
2022-09-12 09:29:46 +03:00
Alex Plate
d7d91f1cc5 Add some tests for dd 2022-09-12 09:28:27 +03:00
Alex Plate
9f00dbd6f4 Update formatting 2022-09-11 00:19:01 +00:00
Alex Plate
f95cf3d671 Update changelog 2022-09-10 21:26:01 +00:00
filipp
7fbc17624f Fix(VIM-2718): Fixed case where the primary caret was changed 2022-09-11 00:24:06 +03:00
Alex Plate
b9c2ea37cb Update changelog 2022-09-09 14:21:51 +00:00
Alex Plate
ca0db15e01 Fix(VIM-2749): Fix :tabn and :tabN commands 2022-09-09 17:20:09 +03:00
Alex Plate
c32c62eacc [New Typing Handler]: Support d 2022-09-06 13:13:31 +03:00
Alex Plate
43a79dbad4 [New Typing Handler]: Switch j command to new typing handler 2022-09-05 15:22:10 +03:00
Alex Plate
2829a13187 Update gradle plugin 2022-09-05 12:32:08 +03:00
Alex Plate
efc8c9207d Update changelog 2022-08-29 06:37:12 +00:00
Alex Plate
183ed10592 Fix(VIM-2744): Fix undo from ex line 2022-08-29 09:31:55 +03:00
Alex Plate
926b47a31e Update gradle plugin 2022-08-29 09:31:34 +03:00
Alex Plate
d272c919ea Fill missing authors 2022-08-25 11:59:16 +03:00
Alex Plate
f6e7d04fd5 Fix accessing bookmarks
Tests were failing because IdeaVim group is created by default by project name
2022-08-25 11:59:05 +03:00
Alex Plate
ccdff4f087 TC: Fix missing import 2022-08-25 11:23:22 +03:00
Alex Plate
ff14303e88 TC: add tests for stable version of idea 2022-08-25 11:12:50 +03:00
Alex Plate
48a592340b Update test fixture 2022-08-23 15:27:00 +03:00
Alex Plate
da8f5f3231 Fix handler call from put command 2022-08-23 15:26:58 +03:00
Alex Plate
f8fa8b73fa Move some methods to vim engine 2022-08-23 15:26:55 +03:00
Alex Plate
aee126b625 Formatting 2022-08-23 15:26:53 +03:00
Alex Plate
396ac86939 Fix strange issue on ideavimrc reload 2022-08-23 15:26:50 +03:00
Alex Plate
81816f903f Update formatting 2022-08-21 00:17:52 +00:00
Alex Plate
06a85b784b Update changelog 2022-08-17 07:14:42 +00:00
Alex Plate
7f1e3bb155 Fix(VIM-1758): Commentary plugin in rider 2022-08-17 10:13:04 +03:00
Alex Plate
241f554133 Fix(VIM-1903): Autoindent now works in rider 2022-08-17 10:11:19 +03:00
Alex Plate
9498d0779c Revert "Refactoring IdeaVim to use editor actions instead of registering shortcuts in the editor"
This reverts commit b12fd5100f.
2022-08-15 18:59:35 +03:00
Alex Plate
b12fd5100f Refactoring IdeaVim to use editor actions instead of registering shortcuts in the editor 2022-08-15 18:42:32 +03:00
Alex Plate
92f622430d Revert "Add a hidden gem"
This reverts commit 362b9a5c3a.
2022-08-15 17:22:31 +03:00
Alex Plate
ef518f5b23 Revert "Rename hidden gem to neovim"
This reverts commit 4fd1a25557.
2022-08-15 17:22:31 +03:00
Alex Plate
7acb17ebdb Small update 2022-08-15 17:22:31 +03:00
Alex Plate
479a7dbbaf Update formatting 2022-08-14 00:17:52 +00:00
Alex Plate
4fd1a25557 Rename hidden gem to neovim 2022-08-12 12:14:17 +03:00
Alex Plate
f32d42e625 Nice knowledge popup 2022-08-12 12:10:57 +03:00
Alex Plate
362b9a5c3a Add a hidden gem 2022-08-12 10:49:55 +03:00
Alex Plate
e42b4d0ea3 Fix regex for changelog plugin 2022-08-12 10:14:31 +03:00
Alex Plate
43767b8500 Print error 2022-08-12 09:55:29 +03:00
Alex Plate
d05098c870 Update changelog 2022-08-12 06:47:15 +00:00
Alex Plate
505f485568 Update release version 2022-08-12 09:45:30 +03:00
Alex Plate
86f512fb91 Update for slack notification 2022-08-12 09:45:08 +03:00
Alex Plate
12903066b9 Workaround for VIM-2487 2022-08-12 09:45:07 +03:00
Alex Plate
118d0433cb Fix(VIM-2728): Give access to global variables 2022-08-12 09:45:07 +03:00
filipp
eb781c3679 An attempt to avoid "No tests found" emails 2022-08-11 03:50:07 +03:00
filipp
3c6bffba03 Fix(VIM-749) 2022-08-11 03:27:19 +03:00
Alex Plate
89623b04d6 Update changelog 2022-08-09 10:25:14 +03:00
Alex Plate
444a96132c Comment out test 2022-08-09 10:10:17 +03:00
Alex Plate
c008553127 Update TC constants 2022-08-09 09:51:25 +03:00
Alex Plate
162d7b021f Update reference to changes 2022-08-09 09:50:02 +03:00
Alex Plate
c82364c1dd Update changelog 2022-08-09 09:49:29 +03:00
Alex Plate
977402c6b0 Update changelog 2022-08-09 09:49:28 +03:00
Alex Plate
b14e59ab5b Disable removing selection after undo 2022-08-09 09:49:28 +03:00
Alex Plate
47dcefcfbf Update formatting 2022-08-07 00:20:00 +00:00
Alex Plate
2b299cb422 Cut white edges on the gif 2022-08-05 08:47:50 +03:00
Alex Plate
d0ccbb4620 Use correct git for dark mode 2022-08-05 08:44:21 +03:00
Alex Plate
187b207271 Use gif instead of mp4 2022-08-05 08:37:05 +03:00
Alex Plate
a3e22c844c Different gif in readme 2022-08-05 08:34:59 +03:00
Alex Plate
f8384b2732 Create dark screenshot for contributing 2022-08-05 08:16:38 +03:00
Alex Plate
2dae43258c Skip unsupported arguments in command
VIM-2720
2022-08-04 20:08:13 +03:00
Alex Plate
48033ecb85 Update changelog 2022-08-04 19:45:52 +03:00
Alex Plate
ad8df027ac Skip neovim check in extensions and multicaret tests 2022-08-04 19:44:58 +03:00
Alex Plate
91f580771d Fix test with closing buffer 2022-08-04 19:18:26 +03:00
Matt Ellis
9c6f0981f5 Consolidate doTest methods 2022-08-04 19:17:59 +03:00
Alex Plate
2212569688 Update changelog 2022-08-02 15:07:49 +00:00
Alex Plate
6711f1dbab Specify update thread for actions 2022-08-01 13:09:23 +03:00
Alex Plate
0b7a883efb Fix(VIM-2723): Move focus to editor after :q 2022-08-01 09:29:44 +03:00
Alex Plate
8ae84c62c0 Update changelog 2022-07-26 09:39:51 +03:00
Alex Plate
0d168c8115 Update formatting 2022-07-24 00:20:23 +00:00
c7b51b7fa5 Implement partial code completion support in macros
Works ok with insertions (Enter, Ctrl+Enter) but not with replacements (Tab)
2022-07-22 10:02:23 +03:00
140 changed files with 1819 additions and 1989 deletions

View File

@@ -5,8 +5,8 @@ object Constants {
const val EAP_CHANNEL = "eap"
const val DEV_CHANNEL = "Dev"
const val VERSION = "1.10.3"
const val DEV_VERSION = "1.11.0"
const val VERSION = "1.11.1"
const val DEV_VERSION = "1.12.0"
const val GITHUB_TESTS = "LATEST-EAP-SNAPSHOT"
const val NVIM_TESTS = "LATEST-EAP-SNAPSHOT"

View File

@@ -6,6 +6,7 @@ import _Self.buildTypes.Nvim
import _Self.buildTypes.PluginVerifier
import _Self.buildTypes.PropertyBased
import _Self.buildTypes.Qodana
import _Self.buildTypes.TestsForIntelliJ20222
import _Self.buildTypes.TestsForIntelliJEAP
import _Self.subprojects.GitHub
import _Self.subprojects.OldTests
@@ -39,6 +40,7 @@ object Project : Project({
// Builds
buildType(TestsForIntelliJEAP)
buildType(TestsForIntelliJ20222)
buildType(PropertyBased)
buildType(LongRunning)

View File

@@ -55,4 +55,4 @@ sealed class ActiveTests(buildName: String, ijVersion: String) : BuildType({
})
object TestsForIntelliJEAP : ActiveTests("Tests for IntelliJ Latest EAP", "LATEST-EAP-SNAPSHOT")
//object TestsForIntelliJ20213 : ActiveTests("Tests for IntelliJ 2021.3", "2021.3.2")
object TestsForIntelliJ20222 : ActiveTests("Tests for IntelliJ 2022.2", "2022.2.1")

View File

@@ -32,16 +32,48 @@ Contributors:
[![icon][github]](https://github.com/yole)
 
Dmitry Jemerov
* [![icon][mail]](mailto:tony.kay@gmail.com)
[![icon][github]](https://github.com/awkay)
 
Tony Kay
* [![icon][mail]](mailto:jamescmartinez@gmail.com)
[![icon][github]](https://github.com/jamescmartinez)
 
James Martinez
* [![icon][mail]](mailto:almas337519@gmail.com)
[![icon][github]](https://github.com/strogiyotec)
 
strogiyotec
* [![icon][mail]](mailto:raimon49@hotmail.com)
[![icon][github]](https://github.com/raimon49)
 
raimon
* [![icon][mail]](mailto:agrsbm@gmail.com)
[![icon][github-off]](#)
 
Alexander Griesbaum
* [![icon][mail]](mailto:manwe64@gmail.com)
[![icon][github]](https://github.com/baldrs)
 
Baldrs
* [![icon][mail]](mailto:yury@shurup.com)
[![icon][github]](https://github.com/zyv)
 
Yury V. Zaytsev
* [![icon][mail]](mailto:jflorian@doubledog.org)
[![icon][github]](https://github.com/jflorian)
 
John Florian
* [![icon][mail]](mailto:marquis@marquiswang.com)
[![icon][github]](https://github.com/marquiswang)
 
Marquis Wang
* [![icon][mail]](mailto:madgnome@gmail.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/madgnome)
 
Julien Hoarau
* [![icon][mail]](mailto:masanobu.imai@gmail.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/masanobuimai)
 
Masanobu Imai
* [![icon][mail]](mailto:poxvuibr@gmail.com)
@@ -57,7 +89,7 @@ Contributors:
 
John Lindquist
* [![icon][mail]](mailto:iklotzko@ltech.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/iklotzko)
 
Ira Klotzko
* [![icon][mail]](mailto:alex@selesse.com)
@@ -65,7 +97,7 @@ Contributors:
 
Alex Selesse
* [![icon][mail]](mailto:dbennett@palantir.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/dathanb)
 
Dathan Bennett
* [![icon][mail]](mailto:kphayen@gmail.com)
@@ -77,11 +109,11 @@ Contributors:
 
Alexey Shmalko
* [![icon][mail]](mailto:a.m.brookins@gmail.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/abrookins)
 
Andrew Brookins
* [![icon][mail]](mailto:changwang83@gmail.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/changwang)
 
Chang Wang
* [![icon][mail]](mailto:josejaime.sanchez@gmail.com)
@@ -89,19 +121,19 @@ Contributors:
 
Jaime Sanchez
* [![icon][mail]](mailto:thomas@homburg.dk)
[![icon][github-off]](#)
[![icon][github]](https://github.com/homburg)
 
Thomas B Homburg
* [![icon][mail]](mailto:smartbomb@server.fake)
[![icon][github-off]](#)
[![icon][github]](https://github.com/smartbomb)
 
smartbomb
* [![icon][mail]](mailto:tuomas.tynkkynen@iki.fi)
[![icon][github-off]](#)
[![icon][github]](https://github.com/dezgeg)
 
Tuomas Tynkkynen
* [![icon][mail]](mailto:jackson@donorschoose.org)
[![icon][github-off]](#)
[![icon][github]](https://github.com/jdpopkin)
 
Jackson Popkin
* [![icon][mail]](mailto:yuyuyu1999@gmail.com)
@@ -109,7 +141,7 @@ Contributors:
 
Teruo Kunihiro
* [![icon][mail]](mailto:lubashka.994@mail.ru)
[![icon][github-off]](#)
[![icon][github]](https://github.com/lubba)
 
Liubov Paina
* [![icon][mail]](mailto:me@dhleong.net)
@@ -137,7 +169,7 @@ Contributors:
 
tieTYT
* [![icon][mail]](mailto:nickgieschen@gmail.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/nickgieschen)
 
Nick Gieschen
* [![icon][mail]](mailto:ikenox@gmail.com)
@@ -149,7 +181,7 @@ Contributors:
 
Maximilian Luz
* [![icon][mail]](mailto:vparfinenko@excelsior-usa.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/cypok)
 
Vladimir Parfinenko
* [![icon][mail]](mailto:hassmann@hwdev.de)
@@ -193,7 +225,7 @@ Contributors:
 
Marcel Hild
* [![icon][mail]](mailto:vedranb@gmail.com)
[![icon][github-off]](#)
[![icon][github]](https://github.com/vedran)
 
Vedran Budimcic
* [![icon][mail]](mailto:andreigasparovici1@gmail.com)
@@ -208,10 +240,13 @@ Contributors:
[![icon][github]](https://github.com/TonyArra)
 
Tony Arra
* [![icon][mail]](mailto:bradziolko@gmail.com)
[![icon][github]](https://github.com/bradziolko)
* [![icon][mail]](mailto:mj@ziolko.dev)
[![icon][github]](https://github.com/mjziolko)
 
Brad Ziolko
Madeline Ziolko
[Original contribution from:
[![icon][mail]](mailto:bradziolko@gmail.com)
[![icon][github]](https://github.com/bradziolko)]
* [![icon][mail]](mailto:sumoooru2@gmail.com)
[![icon][github]](https://github.com/sumoooru2)
 

View File

@@ -25,6 +25,17 @@ usual beta standards.
## To Be Released
### Fixes:
* [VIM-1758](https://youtrack.jetbrains.com/issue/VIM-1758) Commentary plugin in rider
* [VIM-1903](https://youtrack.jetbrains.com/issue/VIM-1903) Autoindent now works in rider
* [VIM-2744](https://youtrack.jetbrains.com/issue/VIM-2744) Fix undo from ex line
* [VIM-2749](https://youtrack.jetbrains.com/issue/VIM-2749) Fix :tabn and :tabN commands
* [VIM-2718](https://youtrack.jetbrains.com/issue/VIM-2718) Fixed case where the primary caret was changed
* [VIM-2766](https://youtrack.jetbrains.com/issue/VIM-2766) Move NERDTree update to background thread
* [VIM-2768](https://youtrack.jetbrains.com/issue/VIM-2768) Refactor listeners
## 1.11.0, 2022-08-09
### Features:
* Add `gcu` command for Commentary plugin
* Add `:Commentary` command, which works great for commands such as `:%g/fun/Commentary`
@@ -53,12 +64,14 @@ usual beta standards.
* [VIM-2595](https://youtrack.jetbrains.com/issue/VIM-2595) Support plugins in macro execution
* [VIM-2671](https://youtrack.jetbrains.com/issue/VIM-2671) Fix using plugins from mappings
* [VIM-2675](https://youtrack.jetbrains.com/issue/VIM-2675) Fix numbering register in visual mode
* [VIM-696](https://youtrack.jetbrains.com/issue/VIM-696/vim-selection-issue-after-undo) Fix selection after undo
* [VIM-744](https://youtrack.jetbrains.com/issue/VIM-744/Use-undoredo-with-count-modifier) Add count to undo/redo
* [VIM-1862](https://youtrack.jetbrains.com/issue/VIM-1862/Ex-commands-executed-in-keymaps-and-macros-are-added-to-the-command-history) Fix command history
* [VIM-2227](https://youtrack.jetbrains.com/issue/VIM-2227) Wrong behavior when deleting / changing surround with invalid character
* [VIM-2691](https://youtrack.jetbrains.com/issue/VIM-2691) Save file on :w
* [VIM-2710](https://youtrack.jetbrains.com/issue/VIM-2710) Show options value on `set opt`
* [VIM-913](https://youtrack.jetbrains.com/issue/VIM-913) Partially fix the issue with macros and autocompletion
* [VIM-2723](https://youtrack.jetbrains.com/issue/VIM-2723) Move focus to editor after :q
* [VIM-2728](https://youtrack.jetbrains.com/issue/VIM-2728) Give access to global variables
### Merged PRs:
* [468](https://github.com/JetBrains/ideavim/pull/468) by [Thomas Schouten](https://github.com/PHPirates): Implement UserDataHolder for EditorDataContext
@@ -70,6 +83,8 @@ usual beta standards.
* [519](https://github.com/JetBrains/ideavim/pull/519) by [chylex](https://github.com/chylex): Fix(VIM-2227): Wrong behavior when deleting / changing surround with invalid character
* [525](https://github.com/JetBrains/ideavim/pull/525) by [Matt Ellis](https://github.com/citizenmatt): Improve handling of fractional width fonts
* [526](https://github.com/JetBrains/ideavim/pull/526) by [Alex Pláte](https://github.com/AlexPl292): Create gradle.properties
* [528](https://github.com/JetBrains/ideavim/pull/528) by [chylex](https://github.com/chylex): Implement partial code completion support in macros
* [531](https://github.com/JetBrains/ideavim/pull/531) by [Matt Ellis](https://github.com/citizenmatt): Consolidate doTest methods
## 1.10.0, 2022-02-17

View File

@@ -32,7 +32,7 @@ OK, ready to do some coding?
Yoo hoo! Youre all set to begin contributing.
We've prepared some useful configurations for you:
![Prepared configurations](assets/contributing/configurations.png)
![Prepared configurations light](assets/contributing/configs-light.png#gh-light-mode-only)![Prepared configurations dark](assets/contributing/configs-dark.png#gh-dark-mode-only)
And here are useful gradle commands:

View File

@@ -11,7 +11,7 @@ IdeaVim
[![Gitter][gitter-svg]][gitter]
[![Twitter][twitter-svg]][twitter]
IdeaVim is a Vim emulation plugin for IntelliJ Platform-based IDEs.
IdeaVim is a Vim engine for JetBrains IDEs.
##### Contact maintainers:
* [Bug tracker](https://youtrack.jetbrains.com/issues/VIM)
@@ -36,7 +36,7 @@ Setup
- IdeaVim can be installed via `Settings | Plugins`.
See the [detailed instructions](https://www.jetbrains.com/help/idea/managing-plugins.html#).
- Use `Tools | Vim Emulator` in the menu to enable or disable emulation.
- Use `Tools | Vim` in the menu to enable or disable vim.
- Use the `~/.ideavimrc` file as an analog of `~/.vimrc` ([learn more](#Files)). The XDG standard is supported, as well.
@@ -88,7 +88,7 @@ Here are some examples of supported vim features and commands:
* Vim web help
* `~/.ideavimrc` configuration file
[Emulated Vim plugins](https://github.com/JetBrains/ideavim/wiki/Emulated-plugins):
[IdeaVim plugins](https://github.com/JetBrains/ideavim/wiki/Emulated-plugins):
* vim-easymotion
* NERDTree
@@ -198,7 +198,7 @@ Alternatively, you can set up initialization commands using [XDG](https://specif
Put your settings to `$XDG_CONFIG_HOME/ideavim/ideavimrc` file.
Emulated Vim Plugins
IdeaVim Plugins
--------------------
See [doc/emulated-plugins.md](https://github.com/JetBrains/ideavim/wiki/Emulated-plugins)
@@ -226,7 +226,10 @@ Ex commands or via `:map` command mappings:
<details>
<summary><strong>"Track action Ids" Details</strong> (click to see)</summary>
<img src="assets/readme/track_action_id.gif" alt="track action ids"/>
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/readme/track_action_dark.gif">
<img src="assets/readme/track_action_light.gif" alt="track action ids"/>
</picture>
</details>

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 KiB

View File

@@ -15,7 +15,9 @@ buildscript {
classpath("com.github.AlexPl292:mark-down-to-slack:1.1.2")
classpath("org.eclipse.jgit:org.eclipse.jgit:6.1.0.202203080745-r")
classpath("org.kohsuke:github-api:1.305")
classpath("org.jetbrains:markdown:0.3.1")
// This comes from the changelog plugin
// classpath("org.jetbrains:markdown:0.3.1")
}
}
@@ -24,7 +26,7 @@ plugins {
java
kotlin("jvm") version "1.6.21"
id("org.jetbrains.intellij") version "1.7.0-SNAPSHOT"
id("org.jetbrains.intellij") version "1.10.0-SNAPSHOT"
id("org.jetbrains.changelog") version "1.3.1"
// ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle
@@ -164,6 +166,18 @@ tasks {
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(javaVersion))
}
}
kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(javaVersion))
}
}
gradle.projectsEvaluated {
tasks.compileJava {
// options.compilerArgs.add("-Werror")
@@ -273,7 +287,7 @@ changelog {
itemPrefix.set("*")
path.set("${project.projectDir}/CHANGES.md")
unreleasedTerm.set("To Be Released")
headerParserRegex.set("\\d\\.\\d+(.\\d+)?".toRegex())
headerParserRegex.set("(\\d\\.\\d+(.\\d+)?)".toRegex())
// header = { "${project.version}" }
// version = "0.60"
}
@@ -326,13 +340,22 @@ tasks.register("slackNotification") {
println("Response code: $postRc")
if (postRc == 200) {
println(inputStream.bufferedReader().use { it.readText() })
} else {
println(errorStream.bufferedReader().use { it.readText() })
}
}
}
}
// Uncomment to enable FUS testing mode
// tasks {
// withType<org.jetbrains.intellij.tasks.RunIdeTask> {
// jvmArgs("-Didea.is.internal=true")
// jvmArgs("-Dfus.internal.test.mode=true")
// }
// }
// --- Update authors
tasks.register("updateAuthors") {
doLast {
val uncheckedEmails = setOf(

View File

@@ -1,14 +1,13 @@
# suppress inspection "UnusedProperty" for whole file
ideaVersion=LATEST-EAP-SNAPSHOT
ideaVersion=2022.2.2
downloadIdeaSources=true
instrumentPluginCode=true
version=SNAPSHOT
javaVersion=11
version=chylex-13
javaVersion=17
remoteRobotVersion=0.11.15
antlrVersion=4.10.1
# Please don't forget to update kotlin version in buildscript section
kotlinVersion=1.6.21
publishToken=token

View File

@@ -27,6 +27,7 @@ import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.actionSystem.TypedAction;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.editor.event.*;
import com.intellij.openapi.util.Disposer;
import com.maddyhome.idea.vim.helper.HandlerInjector;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -101,32 +102,41 @@ public class EventFacade {
EditorFactory.getInstance().addEditorFactoryListener(listener, parentDisposable);
}
public void addEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) {
editor.addEditorMouseListener(listener);
public void addEditorMouseListener(@NotNull Editor editor,
@NotNull EditorMouseListener listener,
@NotNull Disposable disposable) {
editor.addEditorMouseListener(listener, disposable);
}
public void removeEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) {
editor.removeEditorMouseListener(listener);
}
public void addComponentMouseListener(@NotNull Component component, @NotNull MouseListener mouseListener) {
public void addComponentMouseListener(@NotNull Component component,
@NotNull MouseListener mouseListener,
@NotNull Disposable disposable) {
component.addMouseListener(mouseListener);
Disposer.register(disposable, () -> component.removeMouseListener(mouseListener));
}
public void removeComponentMouseListener(@NotNull Component component, @NotNull MouseListener mouseListener) {
component.removeMouseListener(mouseListener);
}
public void addEditorMouseMotionListener(@NotNull Editor editor, @NotNull EditorMouseMotionListener listener) {
editor.addEditorMouseMotionListener(listener);
public void addEditorMouseMotionListener(@NotNull Editor editor,
@NotNull EditorMouseMotionListener listener,
@NotNull Disposable disposable) {
editor.addEditorMouseMotionListener(listener, disposable);
}
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 addEditorSelectionListener(@NotNull Editor editor,
@NotNull SelectionListener listener,
@NotNull Disposable disposable) {
editor.getSelectionModel().addSelectionListener(listener, disposable);
}
public void removeEditorSelectionListener(@NotNull Editor editor, @NotNull SelectionListener listener) {

View File

@@ -18,8 +18,14 @@
package com.maddyhome.idea.vim
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManagerListener
import com.intellij.openapi.startup.StartupActivity
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.localEditors
import com.maddyhome.idea.vim.options.OptionScope
/**
* @author Alex Plate
@@ -36,3 +42,19 @@ class PluginStartup : StartupActivity.DumbAware/*, LightEditCompatible*/ {
VimPlugin.getInstance().initialize()
}
}
// This is a temporal workaround for VIM-2487
class PyNotebooksCloseWorkaround : ProjectManagerListener {
override fun projectClosingBeforeSave(project: Project) {
val close = injector.optionService.getOptionValue(OptionScope.GLOBAL, "closenotebooks").asBoolean()
if (close) {
localEditors().forEach { editor ->
val virtualFile = EditorHelper.getVirtualFile(editor)
if (virtualFile?.extension == "ipynb") {
val fileEditorManager = FileEditorManagerEx.getInstanceEx(project)
fileEditorManager.closeFile(virtualFile)
}
}
}
}
}

View File

@@ -114,7 +114,7 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable
@Override
public void dispose() {
LOG.debug("disposeComponent");
turnOffPlugin();
turnOffPlugin(false);
LOG.debug("done");
}
@@ -272,7 +272,7 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable
if (isEnabled() == enabled) return;
if (!enabled) {
getInstance().turnOffPlugin();
getInstance().turnOffPlugin(true);
}
getInstance().enabled = enabled;
@@ -365,12 +365,14 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable
VimListenerManager.INSTANCE.turnOn();
}
private void turnOffPlugin() {
private void turnOffPlugin(boolean unsubscribe) {
SearchGroup searchGroup = getSearchIfCreated();
if (searchGroup != null) {
searchGroup.turnOff();
}
if (unsubscribe) {
VimListenerManager.INSTANCE.turnOff();
}
ExEntryPanel.fullReset();
// Unregister vim actions in command mode

View File

@@ -19,6 +19,7 @@
package com.maddyhome.idea.vim.action
import com.intellij.openapi.actionSystem.ActionPlaces
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareToggleAction
import com.maddyhome.idea.vim.VimPlugin
@@ -42,4 +43,6 @@ class VimPluginToggleAction : DumbAwareToggleAction()/*, LightEditCompatible*/ {
if (VimPlugin.isEnabled()) MessageHelper.message("action.VimPluginToggle.enabled") else MessageHelper.message("action.VimPluginToggle.enable")
} else MessageHelper.message("action.VimPluginToggle.text")
}
override fun getActionUpdateThread() = ActionUpdateThread.BGT
}

View File

@@ -20,6 +20,7 @@ package com.maddyhome.idea.vim.action
import com.google.common.collect.ImmutableSet
import com.intellij.codeInsight.lookup.LookupManager
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.EmptyAction
@@ -95,6 +96,10 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ {
}
}
// There is a chance that we can use BGT, but we call for isCell inside the update.
// Not sure if can can use BGT with this call. Let's use EDT for now.
override fun getActionUpdateThread() = ActionUpdateThread.EDT
override fun update(e: AnActionEvent) {
val start = if (traceTime) System.currentTimeMillis() else null
e.presentation.isEnabled = isEnabled(e)
@@ -149,6 +154,10 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ {
if ((keyCode == KeyEvent.VK_TAB || keyCode == KeyEvent.VK_ENTER) && editor.appCodeTemplateCaptured()) return false
if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) return false
if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN) return false
if (keyCode == KeyEvent.VK_HOME || keyCode == KeyEvent.VK_END) return false
if (editor.inInsertMode) {
if (keyCode == KeyEvent.VK_TAB) {
// TODO: This stops VimEditorTab seeing <Tab> in insert mode and correctly scrolling the view

View File

@@ -22,6 +22,7 @@ import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
@@ -40,7 +41,7 @@ import com.maddyhome.idea.vim.newapi.ij
import java.util.*
private fun doOperatorAction(editor: VimEditor, context: ExecutionContext, textRange: TextRange, selectionType: SelectionType): Boolean {
val operatorFunction = VimPlugin.getKey().operatorFunction
val operatorFunction = injector.keyGroup.operatorFunction
if (operatorFunction == null) {
VimPlugin.showMessage(MessageHelper.message("E774"))
return false
@@ -49,7 +50,7 @@ private fun doOperatorAction(editor: VimEditor, context: ExecutionContext, textR
val saveRepeatHandler = VimRepeater.repeatHandler
VimPlugin.getMark().setChangeMarks(editor, textRange)
KeyHandler.getInstance().reset(editor)
val result = operatorFunction.apply(editor.ij, context.ij, selectionType)
val result = operatorFunction.apply(editor, context, selectionType)
VimRepeater.repeatHandler = saveRepeatHandler
return result
}

View File

@@ -127,7 +127,7 @@ object VimExtensionFacade {
/** Sets the value of 'operatorfunc' to be used as the operator function in 'g@'. */
@JvmStatic
fun setOperatorFunction(function: OperatorFunction) {
VimPlugin.getKey().setOperatorFunction(function)
VimPlugin.getKey().operatorFunction = function
}
/**
@@ -186,7 +186,7 @@ object VimExtensionFacade {
@JvmStatic
fun getRegisterForCaret(register: Char, caret: VimCaret): List<KeyStroke>? {
val reg = caret.registerStorage.getRegister(register) ?: return null
val reg = caret.registerStorage.getRegister(caret, register) ?: return null
return reg.keys
}
@@ -199,7 +199,7 @@ object VimExtensionFacade {
/** Set the current contents of the given register */
@JvmStatic
fun setRegisterForCaret(register: Char, caret: VimCaret, keys: List<KeyStroke?>?) {
caret.registerStorage.setKeys(register, keys?.filterNotNull() ?: emptyList())
caret.registerStorage.setKeys(caret, register, keys?.filterNotNull() ?: emptyList())
}
/** Set the current contents of the given register */

View File

@@ -17,10 +17,11 @@
*/
package com.maddyhome.idea.vim.extension.commentary
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.codeInsight.actions.AsyncActionExecutionService
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
@@ -56,20 +57,24 @@ import com.maddyhome.idea.vim.helper.vimStateMachine
import com.maddyhome.idea.vim.key.OperatorFunction
import com.maddyhome.idea.vim.newapi.IjVimEditor
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim
import java.util.*
class CommentaryExtension : VimExtension {
companion object {
fun doCommentary(editor: VimEditor, context: ExecutionContext, range: TextRange, selectionType: SelectionType, resetCaret: Boolean): Boolean {
fun doCommentary(
editor: VimEditor,
context: ExecutionContext,
range: TextRange,
selectionType: SelectionType,
resetCaret: Boolean,
): Boolean {
val mode = editor.vimStateMachine.mode
if (mode !== VimStateMachine.Mode.VISUAL) {
editor.ij.selectionModel.setSelection(range.startOffset, range.endOffset)
}
return runWriteAction {
try {
// Treat block- and character-wise selections as block comments. Be ready to fall back to if the first action
// isn't available
val actions = if (selectionType === SelectionType.LINE_WISE) {
@@ -78,9 +83,25 @@ class CommentaryExtension : VimExtension {
listOf(IdeActions.ACTION_COMMENT_BLOCK, IdeActions.ACTION_COMMENT_LINE)
}
injector.actionExecutor.executeAction(actions[0], context) ||
injector.actionExecutor.executeAction(actions[1], context)
} finally {
val res = Ref.create<Boolean>(true)
AsyncActionExecutionService.getInstance(editor.ij.project!!).withExecutionAfterAction(actions[0], {
res.set(injector.actionExecutor.executeAction(actions[0], context))
}, { afterCommenting(mode, editor, resetCaret, range) })
if (!res.get()) {
AsyncActionExecutionService.getInstance(editor.ij.project!!).withExecutionAfterAction(actions[1], {
res.set(injector.actionExecutor.executeAction(actions[1], context))
}, { afterCommenting(mode, editor, resetCaret, range) })
}
res.get()
}
}
private fun afterCommenting(
mode: VimStateMachine.Mode,
editor: VimEditor,
resetCaret: Boolean,
range: TextRange,
) {
// Remove the selection, if we added it
if (mode !== VimStateMachine.Mode.VISUAL) {
editor.removeSelection()
@@ -98,8 +119,6 @@ class CommentaryExtension : VimExtension {
}
}
}
}
}
override fun getName() = "commentary"
@@ -112,7 +131,13 @@ class CommentaryExtension : VimExtension {
putKeyMappingIfMissing(MappingMode.NXO, injector.parser.parseKeys("gc"), owner, plugCommentaryKeys, true)
putKeyMappingIfMissing(MappingMode.N, injector.parser.parseKeys("gcc"), owner, plugCommentaryLineKeys, true)
putKeyMappingIfMissing(MappingMode.N, injector.parser.parseKeys("gcu"), owner, injector.parser.parseKeys("<Plug>Commentary<Plug>Commentary"), true)
putKeyMappingIfMissing(
MappingMode.N,
injector.parser.parseKeys("gcu"),
owner,
injector.parser.parseKeys("<Plug>Commentary<Plug>Commentary"),
true
)
// Previous versions of IdeaVim used different mappings to Vim's Commentary. Make sure everything works if someone
// is still using the old mapping
@@ -132,14 +157,19 @@ class CommentaryExtension : VimExtension {
private class CommentaryOperatorHandler : OperatorFunction, ExtensionHandler {
override val isRepeatable = true
// In this operator we process selection by ourselves. This is necessary for rider, VIM-1758
override fun postProcessSelection(): Boolean {
return false
}
override fun execute(editor: VimEditor, context: ExecutionContext) {
setOperatorFunction(this)
executeNormalWithoutMapping(injector.parser.parseKeys("g@"), editor.ij)
}
override fun apply(editor: Editor, context: DataContext, selectionType: SelectionType): Boolean {
val range = VimPlugin.getMark().getChangeMarks(editor.vim) ?: return false
return doCommentary(editor.vim, context.vim, range, selectionType, true)
override fun apply(editor: VimEditor, context: ExecutionContext, selectionType: SelectionType): Boolean {
val range = VimPlugin.getMark().getChangeMarks(editor) ?: return false
return doCommentary(editor, context, range, selectionType, true)
}
}
@@ -174,7 +204,7 @@ class CommentaryExtension : VimExtension {
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?
argument: Argument?,
): TextRange? {
val nativeEditor = (editor as IjVimEditor).editor

View File

@@ -18,7 +18,6 @@
package com.maddyhome.idea.vim.extension.exchange
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.LogicalPosition
@@ -133,7 +132,7 @@ class VimExchangeExtension : VimExtension {
val subMode = editor.subMode
// Leave visual mode to create selection marks
executeNormalWithoutMapping(injector.parser.parseKeys("<Esc>"), editor.ij)
Operator(true).apply(editor.ij, context.ij, SelectionType.fromSubMode(subMode))
Operator(true).apply(editor, context, SelectionType.fromSubMode(subMode))
}
}
}
@@ -147,7 +146,8 @@ class VimExchangeExtension : VimExtension {
else -> error("Invalid SubMode: $this")
}
override fun apply(editor: Editor, context: DataContext, selectionType: SelectionType): Boolean {
override fun apply(vimEditor: VimEditor, context: ExecutionContext, selectionType: SelectionType): Boolean {
val editor = vimEditor.ij
fun highlightExchange(ex: Exchange): RangeHighlighter {
val attributes = editor.colorsScheme.getAttributes(EditorColors.TEXT_SEARCH_RESULT_ATTRIBUTES)
val hlArea = when (ex.type) {

View File

@@ -233,7 +233,7 @@ private object FileTypePatterns {
} else if (fileTypeName == "CMakeLists.txt" || fileName == "CMakeLists") {
this.cMakePatterns
} else {
return null
this.htmlPatterns
}
}

View File

@@ -21,6 +21,7 @@ package com.maddyhome.idea.vim.extension.nerdtree
import com.intellij.ide.projectView.ProjectView
import com.intellij.ide.projectView.impl.ProjectViewImpl
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.application.ApplicationManager
@@ -172,7 +173,7 @@ class NerdTree : VimExtension {
}
class ProjectViewListener(private val project: Project) : ToolWindowManagerListener {
override fun toolWindowShown(id: String, toolWindow: ToolWindow) {
override fun toolWindowShown(toolWindow: ToolWindow) {
if (ToolWindowId.PROJECT_VIEW != toolWindow.id) return
val dispatcher = NerdDispatcher.getInstance(project)
@@ -242,6 +243,8 @@ class NerdTree : VimExtension {
e.presentation.isEnabled = !speedSearchIsHere(project)
}
override fun getActionUpdateThread() = ActionUpdateThread.EDT
private fun speedSearchIsHere(project: Project): Boolean {
val component = ProjectView.getInstance(project).currentProjectViewPane.tree ?: return false
return SpeedSearchSupply.getSupply(component) != null
@@ -342,7 +345,7 @@ class NerdTree : VimExtension {
if (file.isDirectory) return@Code
val splitters = FileEditorManagerEx.getInstanceEx(project).splitters
val currentWindow = splitters.currentWindow
currentWindow.split(SwingConstants.HORIZONTAL, true, file, true)
currentWindow?.split(SwingConstants.HORIZONTAL, true, file, true)
}
)
registerCommand(
@@ -351,7 +354,7 @@ class NerdTree : VimExtension {
val file = event.getData(CommonDataKeys.VIRTUAL_FILE) ?: return@Code
val splitters = FileEditorManagerEx.getInstanceEx(project).splitters
val currentWindow = splitters.currentWindow
currentWindow.split(SwingConstants.VERTICAL, true, file, true)
currentWindow?.split(SwingConstants.VERTICAL, true, file, true)
// FIXME: 22.01.2021 This solution bouncing a bit
callAction("ActivateProjectToolWindow", context.vim)
@@ -363,7 +366,7 @@ class NerdTree : VimExtension {
val file = event.getData(CommonDataKeys.VIRTUAL_FILE) ?: return@Code
val splitters = FileEditorManagerEx.getInstanceEx(project).splitters
val currentWindow = splitters.currentWindow
currentWindow.split(SwingConstants.HORIZONTAL, true, file, true)
currentWindow?.split(SwingConstants.HORIZONTAL, true, file, true)
callAction("ActivateProjectToolWindow", context.vim)
}
@@ -560,7 +563,3 @@ class NerdTree : VimExtension {
}
}
}
private fun <T> Node<T>.addLeafs(keys: String, actionHolder: T) {
addLeafs(injector.parser.parseKeys(keys), actionHolder)
}

View File

@@ -18,7 +18,6 @@
package com.maddyhome.idea.vim.extension.replacewithregister
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
@@ -115,21 +114,22 @@ class ReplaceWithRegister : VimExtension {
}
private class Operator : OperatorFunction {
override fun apply(editor: Editor, context: DataContext, selectionType: SelectionType): Boolean {
override fun apply(vimEditor: VimEditor, context: ExecutionContext, selectionType: SelectionType): Boolean {
val editor = (vimEditor as IjVimEditor).editor
val range = getRange(editor) ?: return false
val visualSelection = PutData.VisualSelection(
mapOf(
editor.caretModel.primaryCaret.vim to VimSelection.create(
vimEditor.primaryCaret() to VimSelection.create(
range.startOffset,
range.endOffset - 1,
selectionType,
IjVimEditor(editor)
vimEditor
)
),
selectionType
)
// todo multicaret
doReplace(editor, editor.vim.primaryCaret(), visualSelection)
doReplace(editor, vimEditor.primaryCaret(), visualSelection)
return true
}
@@ -152,7 +152,7 @@ class ReplaceWithRegister : VimExtension {
private fun doReplace(editor: Editor, caret: VimCaret, visualSelection: PutData.VisualSelection) {
val lastRegisterChar = injector.registerGroup.lastRegisterChar
val savedRegister = caret.registerStorage.getRegister(lastRegisterChar) ?: return
val savedRegister = caret.registerStorage.getRegister(caret, lastRegisterChar) ?: return
var usedType = savedRegister.type
var usedText = savedRegister.text
@@ -185,8 +185,8 @@ class ReplaceWithRegister : VimExtension {
)
}
caret.registerStorage.saveRegister(savedRegister.name, savedRegister)
caret.registerStorage.saveRegister(VimPlugin.getRegister().defaultRegister, savedRegister)
caret.registerStorage.saveRegister(caret, savedRegister.name, savedRegister)
caret.registerStorage.saveRegister(caret, VimPlugin.getRegister().defaultRegister, savedRegister)
}
}
}

View File

@@ -17,12 +17,12 @@
*/
package com.maddyhome.idea.vim.extension.surround
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimChangeGroup
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.MappingMode
@@ -40,6 +40,7 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissin
import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction
import com.maddyhome.idea.vim.extension.VimExtensionFacade.setRegisterForCaret
import com.maddyhome.idea.vim.helper.editorMode
import com.maddyhome.idea.vim.helper.runWithEveryCaretAndRestore
import com.maddyhome.idea.vim.key.OperatorFunction
import com.maddyhome.idea.vim.newapi.IjVimCaret
import com.maddyhome.idea.vim.newapi.IjVimEditor
@@ -85,22 +86,20 @@ class VimSurroundExtension : VimExtension {
override val isRepeatable = true
override fun execute(editor: VimEditor, context: ExecutionContext) {
setOperatorFunction(Operator())
setOperatorFunction(Operator(supportsMultipleCursors = false)) // TODO
executeNormalWithoutMapping(injector.parser.parseKeys("g@"), editor.ij)
}
}
private class VSurroundHandler : ExtensionHandler {
override fun execute(editor: VimEditor, context: ExecutionContext) {
val selectionStart = editor.ij.caretModel.primaryCaret.selectionStart
// NB: Operator ignores SelectionType anyway
if (!Operator().apply(editor.ij, context.ij, SelectionType.CHARACTER_WISE)) {
if (!Operator(supportsMultipleCursors = true).apply(editor, context, SelectionType.CHARACTER_WISE)) {
return
}
runWriteAction {
// Leave visual mode
executeNormalWithoutMapping(injector.parser.parseKeys("<Esc>"), editor.ij)
editor.ij.caretModel.moveToOffset(selectionStart)
}
}
}
@@ -121,6 +120,10 @@ class VimSurroundExtension : VimExtension {
companion object {
fun change(editor: VimEditor, context: ExecutionContext, charFrom: Char, newSurround: Pair<String, String>?) {
editor.ij.runWithEveryCaretAndRestore { changeAtCaret(editor, context, charFrom, newSurround) }
}
fun changeAtCaret(editor: VimEditor, context: ExecutionContext, charFrom: Char, newSurround: Pair<String, String>?) {
// Save old register values for carets
val surroundings = editor.sortedCarets()
.map {
@@ -219,26 +222,45 @@ class VimSurroundExtension : VimExtension {
}
}
private class Operator : OperatorFunction {
override fun apply(editor: Editor, context: DataContext, selectionType: SelectionType): Boolean {
private class Operator(private val supportsMultipleCursors: Boolean) : OperatorFunction {
override fun apply(vimEditor: VimEditor, context: ExecutionContext, selectionType: SelectionType): Boolean {
val editor = vimEditor.ij
val c = getChar(editor)
if (c.code == 0) return true
val pair = getOrInputPair(c, editor) ?: return false
// XXX: Will it work with line-wise or block-wise selections?
val range = getSurroundRange(editor) ?: return false
runWriteAction {
val change = VimPlugin.getChange()
val leftSurround = pair.first
val primaryCaret = editor.caretModel.primaryCaret
change.insertText(IjVimEditor(editor), IjVimCaret(primaryCaret), range.startOffset, leftSurround)
change.insertText(IjVimEditor(editor), IjVimCaret(primaryCaret), range.endOffset + leftSurround.length, pair.second)
if (supportsMultipleCursors) {
editor.runWithEveryCaretAndRestore {
applyOnce(editor, change, pair)
}
}
else {
applyOnce(editor, change, pair)
// Jump back to start
executeNormalWithoutMapping(injector.parser.parseKeys("`["), editor)
}
}
return true
}
private fun applyOnce(editor: Editor, change: VimChangeGroup, pair: Pair<String, String>) {
// XXX: Will it work with line-wise or block-wise selections?
val range = getSurroundRange(editor)
if (range != null) {
val primaryCaret = editor.caretModel.primaryCaret
change.insertText(IjVimEditor(editor), IjVimCaret(primaryCaret), range.startOffset, pair.first)
change.insertText(
IjVimEditor(editor),
IjVimCaret(primaryCaret),
range.endOffset + pair.first.length,
pair.second
)
}
}
private fun getSurroundRange(editor: Editor): TextRange? = when (editor.editorMode) {
VimStateMachine.Mode.COMMAND -> VimPlugin.getMark().getChangeMarks(editor.vim)
VimStateMachine.Mode.VISUAL -> editor.caretModel.primaryCaret.run { TextRange(selectionStart, selectionEnd) }

View File

@@ -20,7 +20,10 @@ package com.maddyhome.idea.vim.group;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.intellij.codeInsight.actions.AsyncActionExecutionService;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.UndoConfirmationPolicy;
@@ -33,6 +36,9 @@ import com.intellij.openapi.editor.event.EditorMouseEvent;
import com.intellij.openapi.editor.event.EditorMouseListener;
import com.intellij.openapi.editor.impl.TextRangeInterval;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -48,13 +54,19 @@ import com.maddyhome.idea.vim.ex.ranges.LineRange;
import com.maddyhome.idea.vim.group.visual.VimSelection;
import com.maddyhome.idea.vim.group.visual.VisualModeHelperKt;
import com.maddyhome.idea.vim.helper.*;
import com.maddyhome.idea.vim.icons.VimIcons;
import com.maddyhome.idea.vim.key.KeyHandlerKeeper;
import com.maddyhome.idea.vim.listener.VimInsertListener;
import com.maddyhome.idea.vim.newapi.*;
import com.maddyhome.idea.vim.newapi.IjExecutionContext;
import com.maddyhome.idea.vim.newapi.IjExecutionContextKt;
import com.maddyhome.idea.vim.newapi.IjVimCaret;
import com.maddyhome.idea.vim.newapi.IjVimEditor;
import com.maddyhome.idea.vim.options.OptionConstants;
import com.maddyhome.idea.vim.options.OptionScope;
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString;
import kotlin.Pair;
import kotlin.Unit;
import kotlin.jvm.functions.Function0;
import kotlin.text.StringsKt;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -85,6 +97,8 @@ public class ChangeGroup extends VimChangeGroupBase {
private final List<VimInsertListener> insertListeners = ContainerUtil.createLockFreeCopyOnWriteList();
private long lastShownTime = 0L;
/**
* Inserts a new line above the caret position
*
@@ -142,14 +156,12 @@ public class ChangeGroup extends VimChangeGroupBase {
}
};
@Override
public void editorCreated(VimEditor editor) {
EventFacade.getInstance().addEditorMouseListener(((IjVimEditor) editor).getEditor(), listener);
public void editorCreated(Editor editor, @NotNull Disposable disposable) {
EventFacade.getInstance().addEditorMouseListener(editor, listener, disposable);
}
@Override
public void editorReleased(VimEditor editor) {
EventFacade.getInstance().removeEditorMouseListener(((IjVimEditor) editor).getEditor(), listener);
public void editorReleased(Editor editor) {
EventFacade.getInstance().removeEditorMouseListener(editor, listener);
}
@Override
@@ -571,17 +583,31 @@ public class ChangeGroup extends VimChangeGroupBase {
final int startOffset = injector.getEngineEditorHelper().getLineStartForOffset(editor, range.getStartOffset());
final int endOffset = injector.getEngineEditorHelper().getLineEndForOffset(editor, range.getEndOffset());
VisualModeHelperKt.vimSetSystemSelectionSilently(((IjVimEditor) editor).getEditor().getSelectionModel(), startOffset, endOffset);
Editor ijEditor = ((IjVimEditor)editor).getEditor();
VisualModeHelperKt.vimSetSystemSelectionSilently(ijEditor.getSelectionModel(), startOffset, endOffset);
Project project = ijEditor.getProject();
Function0<Unit> actionExecution = () -> {
NativeAction joinLinesAction = VimInjectorKt.getInjector().getNativeActionManager().getIndentLines();
if (joinLinesAction != null) {
VimInjectorKt.getInjector().getActionExecutor().executeAction(joinLinesAction, context);
}
return null;
};
Function0<Unit> afterAction = () -> {
final int firstLine = editor.offsetToLogicalPosition(Math.min(startOffset, endOffset)).getLine();
final int newOffset = VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, firstLine);
injector.getMotion().moveCaret(editor, caret, newOffset);
restoreCursor(editor, caret, ((IjVimCaret)caret).getCaret().getLogicalPosition().line);
return null;
};
if (project != null) {
AsyncActionExecutionService.Companion.getInstance(project)
.withExecutionAfterAction(IdeActions.ACTION_EDITOR_AUTO_INDENT_LINES, actionExecution, afterAction);
} else {
actionExecution.invoke();
afterAction.invoke();
}
}
@Override
@@ -773,6 +799,23 @@ public class ChangeGroup extends VimChangeGroupBase {
@NotNull TextRange selectedRange,
final int count,
boolean avalanche) {
// Just an easter egg
if (avalanche) {
long currentTime = System.currentTimeMillis();
if (currentTime - lastShownTime > 60_000) {
lastShownTime = currentTime;
ApplicationManager.getApplication().invokeLater(() -> {
final Balloon balloon = JBPopupFactory.getInstance()
.createHtmlTextBalloonBuilder("Wow, nice vim skills!", VimIcons.IDEAVIM,
MessageType.INFO.getTitleForeground(), MessageType.INFO.getPopupBackground(),
null).createBalloon();
balloon.show(JBPopupFactory.getInstance().guessBestPopupLocation(((IjVimEditor)editor).getEditor()),
Balloon.Position.below);
});
}
}
String nf = ((VimString) VimPlugin.getOptionService().getOptionValue(new OptionScope.LOCAL(editor), OptionConstants.nrformatsName, OptionConstants.nrformatsName)).getValue();
boolean alpha = nf.contains("alpha");
boolean hex = nf.contains("hex");

View File

@@ -232,7 +232,7 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor
KeyHandler.getInstance().reset(new IjVimEditor(editor));
}
updateCaretsVisualAttributes(editor);
editor.getSettings().setRefrainFromScrolling(REFRAIN_FROM_SCROLLING_VIM_VALUE);
//editor.getSettings().setRefrainFromScrolling(REFRAIN_FROM_SCROLLING_VIM_VALUE);
}
public void editorDeinit(@NotNull Editor editor, boolean isReleased) {

View File

@@ -20,6 +20,7 @@ package com.maddyhome.idea.vim.group;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
@@ -27,6 +28,7 @@ import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.fileEditor.*;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.fileEditor.impl.EditorWindow;
import com.intellij.openapi.fileEditor.impl.EditorsSplitters;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.Project;
@@ -159,6 +161,10 @@ public class FileGroup extends VimFileBase {
if (virtualFile != null && window != null) {
window.closeFile(virtualFile);
}
if (!ApplicationManager.getApplication().isUnitTestMode()) {
// This thing doesn't have an implementation in test mode
EditorsSplitters.focusDefaultComponentInSplittersIfPresent(project);
}
}
}
@@ -175,6 +181,10 @@ public class FileGroup extends VimFileBase {
if (number >= 0 && number < editors.length) {
fileEditorManager.closeFile(editors[number], window);
}
if (!ApplicationManager.getApplication().isUnitTestMode()) {
// This thing doesn't have an implementation in test mode
EditorsSplitters.focusDefaultComponentInSplittersIfPresent(project);
}
}
/**

View File

@@ -73,8 +73,6 @@ public class KeyGroup extends VimKeyGroupBase implements PersistentStateComponen
private static final Logger logger = Logger.getInstance(KeyGroup.class);
private @Nullable OperatorFunction operatorFunction = null;
public void registerRequiredShortcutKeys(@NotNull VimEditor editor) {
EventFacade.getInstance()
.registerCustomShortcutSet(VimShortcutKeyAction.getInstance(), toShortcutSet(getRequiredShortcutKeys()),
@@ -119,14 +117,6 @@ public class KeyGroup extends VimKeyGroupBase implements PersistentStateComponen
}
}
public @Nullable OperatorFunction getOperatorFunction() {
return operatorFunction;
}
public void setOperatorFunction(@NotNull OperatorFunction function) {
operatorFunction = function;
}
public void saveData(@NotNull Element element) {
final Element conflictsElement = new Element(SHORTCUT_CONFLICTS_ELEMENT);
for (Map.Entry<KeyStroke, ShortcutOwnerInfo> entry : myShortcutConflicts.entrySet()) {

View File

@@ -23,8 +23,10 @@ import com.intellij.openapi.editor.ex.util.EditorUtil;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManagerEvent;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.fileEditor.impl.EditorTabbedContainer;
import com.intellij.openapi.fileEditor.impl.EditorWindow;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
@@ -1168,15 +1170,25 @@ public class MotionGroup extends VimMotionGroupBase {
@Override
public int moveCaretGotoPreviousTab(@NotNull VimEditor editor, @NotNull ExecutionContext context, int rawCount) {
switchEditorTab(EditorWindow.DATA_KEY.getData((DataContext)context.getContext()), rawCount >= 1 ? -rawCount : -1, false);
Project project = ((IjVimEditor)editor).getEditor().getProject();
if (project == null) {
return editor.currentCaret().getOffset().getPoint();
}
EditorWindow currentWindow = FileEditorManagerEx.getInstanceEx(project).getSplitters().getCurrentWindow();
switchEditorTab(currentWindow, rawCount >= 1 ? -rawCount : -1, false);
return editor.currentCaret().getOffset().getPoint();
}
@Override
public int moveCaretGotoNextTab(@NotNull VimEditor editor, @NotNull ExecutionContext context, int rawCount) {
final boolean absolute = rawCount >= 1;
switchEditorTab(EditorWindow.DATA_KEY.getData((DataContext)context.getContext()), absolute ? rawCount - 1 : 1,
absolute);
Project project = ((IjVimEditor)editor).getEditor().getProject();
if (project == null) {
return editor.currentCaret().getOffset().getPoint();
}
EditorWindow currentWindow = FileEditorManagerEx.getInstanceEx(project).getSplitters().getCurrentWindow();
switchEditorTab(currentWindow, absolute ? rawCount - 1 : 1, absolute);
return editor.currentCaret().getOffset().getPoint();
}

View File

@@ -27,6 +27,7 @@ import com.intellij.notification.Notification
import com.intellij.notification.NotificationGroup
import com.intellij.notification.NotificationGroupManager
import com.intellij.notification.NotificationType
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.KeyboardShortcut
@@ -221,6 +222,8 @@ class NotificationService(private val project: Project?) {
override fun update(e: AnActionEvent) {
e.presentation.isEnabled = id != null
}
override fun getActionUpdateThread() = ActionUpdateThread.BGT
}
class StopTracking : DumbAwareAction("Stop Tracking") {
@@ -257,6 +260,8 @@ class NotificationService(private val project: Project?) {
val actionText = if (VimRcService.findIdeaVimRc() != null) "Open ~/.ideavimrc" else "Create ~/.ideavimrc"
e.presentation.text = actionText
}
override fun getActionUpdateThread() = ActionUpdateThread.BGT
}
@Suppress("DialogTitleCapitalization")

View File

@@ -92,7 +92,7 @@ public class ProcessGroup extends VimProcessGroupBase {
String initText = getRange(((IjVimEditor) editor).getEditor(), cmd);
VimStateMachine.getInstance(editor).pushModes(VimStateMachine.Mode.CMD_LINE, VimStateMachine.SubMode.NONE);
ExEntryPanel panel = ExEntryPanel.getInstance();
panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1);
panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, cmd.getCount());
}
@Override
@@ -123,7 +123,7 @@ public class ProcessGroup extends VimProcessGroupBase {
logger.debug("processing command");
final String text = panel.getText();
String text = panel.getText();
if (!panel.getLabel().equals(":")) {
// Search is handled via Argument.Type.EX_STRING. Although ProcessExEntryAction is registered as the handler for
@@ -134,8 +134,16 @@ public class ProcessGroup extends VimProcessGroupBase {
if (logger.isDebugEnabled()) logger.debug("swing=" + SwingUtilities.isEventDispatchThread());
int repeat = 1;
if (text.contains("raction ")) {
text = text.replace("raction ", "action ");
repeat = panel.getCount();
}
for (int i = 0; i < repeat; i++) {
VimInjectorKt.getInjector().getVimscriptExecutor().execute(text, editor, context, skipHistory(editor), true, CommandLineVimLContext.INSTANCE);
}
}
catch (ExException e) {
VimPlugin.showMessage(e.getMessage());
VimPlugin.indicateError();

View File

@@ -61,7 +61,10 @@ internal fun Project.createLineBookmark(editor: Editor, line: Int, mnemonic: Cha
val type = BookmarkType.get(mnemonic)
if (type == BookmarkType.DEFAULT) return null
val group = bookmarksManager.defaultGroup ?: bookmarksManager.addGroup("IdeaVim", true) ?: return null
val group = bookmarksManager.defaultGroup
?: bookmarksManager.getGroup("IdeaVim")
?: bookmarksManager.addGroup("IdeaVim", true)
?: return null
if (group.canAdd(bookmark)) {
group.add(bookmark, type)
return bookmark

View File

@@ -190,7 +190,12 @@ class PutGroup : VimPutBase() {
}
}
visualSelection.typeInEditor.isLine -> {
if (caret.offset == editor.fileSize && editor.fileSize != 0) {
val lastChar = if (editor.fileSize > 0) {
editor.document.getText(com.intellij.openapi.util.TextRange(editor.fileSize - 1, editor.fileSize))[0]
} else {
null
}
if (caret.offset == editor.fileSize && editor.fileSize != 0 && lastChar != '\n') {
application.runWriteAction { editor.document.insertString(caret.offset, "\n") }
listOf(caret.offset + 1)
} else listOf(caret.offset)

View File

@@ -211,7 +211,7 @@ class YankGroup : YankGroupBase() {
var result = true
for ((caret, myRange) in caretToRange) {
result = caret.registerStorage.storeText(editor, myRange, type, false) && result
result = caret.registerStorage.storeText(caret, editor, myRange, type, false) && result
}
return result
}

View File

@@ -22,6 +22,7 @@ package com.maddyhome.idea.vim.helper
import com.intellij.codeWithMe.ClientId
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.CaretState
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.ex.util.EditorUtil
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx
@@ -106,3 +107,41 @@ val Caret.vimLine: Int
*/
val Editor.vimLine: Int
get() = this.caretModel.currentCaret.vimLine
inline fun Editor.runWithEveryCaretAndRestore(action: () -> Unit) {
val caretModel = this.caretModel
val carets = if (this.inBlockSubMode) null else caretModel.allCarets
if (carets == null || carets.size == 1) {
action()
}
else {
var initialDocumentSize = this.document.textLength
var documentSizeDifference = 0
val caretOffsets = carets.map { it.selectionStart to it.selectionEnd }
val restoredCarets = mutableListOf<CaretState>()
caretModel.removeSecondaryCarets()
for ((selectionStart, selectionEnd) in caretOffsets) {
if (selectionStart == selectionEnd) {
caretModel.primaryCaret.moveToOffset(selectionStart + documentSizeDifference)
}
else {
caretModel.primaryCaret.setSelection(
selectionStart + documentSizeDifference,
selectionEnd + documentSizeDifference
)
}
action()
restoredCarets.add(caretModel.caretsAndSelections.single())
val documentLength = this.document.textLength
documentSizeDifference += documentLength - initialDocumentSize
initialDocumentSize = documentLength
}
caretModel.caretsAndSelections = restoredCarets
}
}

View File

@@ -31,6 +31,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.api.VimSearchHelperBase;
import com.maddyhome.idea.vim.command.VimStateMachine;
import com.maddyhome.idea.vim.common.CharacterPosition;
import com.maddyhome.idea.vim.common.Direction;
@@ -1201,7 +1202,7 @@ public class SearchHelper {
int last = -1;
int res = start;
while (true) {
res = findNextWordOne(chars, res, end, 1, true, false);
res = (int)VimSearchHelperBase.Companion.findNextWordOne(chars, res, end, 1, true, false);
if (res == start || res == 0 || res > end || res == last) {
break;
}
@@ -1230,105 +1231,6 @@ public class SearchHelper {
return new CountPosition(count, position);
}
public static int findNextWord(@NotNull Editor editor, int searchFrom, int count, boolean bigWord) {
CharSequence chars = editor.getDocument().getCharsSequence();
final int size = EditorHelperRt.getFileSize(editor);
return findNextWord(chars, searchFrom, size, count, bigWord, false);
}
public static int findNextWord(@NotNull CharSequence chars,
int pos,
int size,
int count,
boolean bigWord,
boolean spaceWords) {
int step = count >= 0 ? 1 : -1;
count = Math.abs(count);
int res = pos;
for (int i = 0; i < count; i++) {
res = findNextWordOne(chars, res, size, step, bigWord, spaceWords);
if (res == pos || res == 0 || res == size - 1) {
break;
}
}
return res;
}
private static int findNextWordOne(@NotNull CharSequence chars,
int pos,
int size,
int step,
boolean bigWord,
boolean spaceWords) {
boolean found = false;
pos = pos < size ? pos : Math.min(size, chars.length() - 1);
// For back searches, skip any current whitespace so we start at the end of a word
if (step < 0 && pos > 0) {
if (CharacterHelper.charType(chars.charAt(pos - 1), bigWord) == CharacterHelper.CharacterType.WHITESPACE &&
!spaceWords) {
pos = skipSpace(chars, pos - 1, step, size) + 1;
}
if (pos > 0 &&
CharacterHelper.charType(chars.charAt(pos), bigWord) !=
CharacterHelper.charType(chars.charAt(pos - 1), bigWord)) {
pos += step;
}
}
int res = pos;
if (pos < 0 || pos >= size) {
return pos;
}
CharacterHelper.CharacterType type = CharacterHelper.charType(chars.charAt(pos), bigWord);
if (type == CharacterHelper.CharacterType.WHITESPACE && step < 0 && pos > 0 && !spaceWords) {
type = CharacterHelper.charType(chars.charAt(pos - 1), bigWord);
}
pos += step;
while (pos >= 0 && pos < size && !found) {
CharacterHelper.CharacterType newType = CharacterHelper.charType(chars.charAt(pos), bigWord);
if (newType != type) {
if (newType == CharacterHelper.CharacterType.WHITESPACE && step >= 0 && !spaceWords) {
pos = skipSpace(chars, pos, step, size);
res = pos;
}
else if (step < 0) {
res = pos + 1;
}
else {
res = pos;
}
type = CharacterHelper.charType(chars.charAt(res), bigWord);
found = true;
}
pos += step;
}
if (found) {
if (res < 0) //(pos <= 0)
{
res = 0;
}
else if (res >= size) //(pos >= size)
{
res = size - 1;
}
}
else if (pos <= 0) {
res = 0;
}
else if (pos >= size) {
res = size;
}
return res;
}
public static @NotNull List<Pair<TextRange, NumberType>> findNumbersInRange(final @NotNull Editor editor,
@NotNull TextRange textRange,
final boolean alpha,
@@ -1654,10 +1556,10 @@ public class SearchHelper {
if ((!onWordStart && !(startSpace && isOuter)) || hasSelection || (count > 1 && dir == -1)) {
if (dir == 1) {
start = findNextWord(chars, pos, max, -1, isBig, !isOuter);
start = (int)VimSearchHelperBase.Companion.findNextWord(chars, pos, max, -1, isBig, !isOuter);
}
else {
start = findNextWord(chars, pos, max, -(count - (onWordStart && !hasSelection ? 1 : 0)), isBig, !isOuter);
start = (int)VimSearchHelperBase.Companion.findNextWord(chars, pos, max, -(count - (onWordStart && !hasSelection ? 1 : 0)), isBig, !isOuter);
}
start = EditorHelper.normalizeOffset(editor, start, false);
@@ -1805,7 +1707,7 @@ public class SearchHelper {
if (step > 0 && pos < size - 1) {
if (CharacterHelper.charType(chars.charAt(pos + 1), bigWord) == CharacterHelper.CharacterType.WHITESPACE &&
!spaceWords) {
pos = skipSpace(chars, pos + 1, step, size) - 1;
pos = (int)(VimSearchHelperBase.Companion.skipSpace(chars, pos + 1, step, size) - 1);
}
if (pos < size - 1 &&
CharacterHelper.charType(chars.charAt(pos), bigWord) !=
@@ -1830,7 +1732,7 @@ public class SearchHelper {
res = pos - 1;
}
else if (newType == CharacterHelper.CharacterType.WHITESPACE && step < 0 && !spaceWords) {
pos = skipSpace(chars, pos, step, size);
pos = (int)VimSearchHelperBase.Companion.skipSpace(chars, pos, step, size);
res = pos;
}
else {
@@ -1858,34 +1760,6 @@ public class SearchHelper {
return res;
}
/**
* Skip whitespace starting with the supplied position.
* <p>
* An empty line is considered a whitespace break.
*
* @param chars The text as a character array
* @param offset The starting position
* @param step The direction to move
* @param size The size of the document
* @return The new position. This will be the first non-whitespace character found or an empty line
*/
private static int skipSpace(@NotNull CharSequence chars, int offset, int step, int size) {
char prev = 0;
while (offset >= 0 && offset < size) {
final char c = chars.charAt(offset);
if (c == '\n' && c == prev) {
break;
}
if (CharacterHelper.charType(c, false) != CharacterHelper.CharacterType.WHITESPACE) {
break;
}
prev = c;
offset += step;
}
return offset < size ? offset : size - 1;
}
/**
* This locates the position with the document of the count-th occurrence of ch on the current line
*

View File

@@ -25,6 +25,7 @@ import com.intellij.openapi.command.CommandProcessor
import com.intellij.openapi.command.impl.UndoManagerImpl
import com.intellij.openapi.command.undo.UndoManager
import com.intellij.openapi.components.Service
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.common.ChangesListener
@@ -48,17 +49,17 @@ class UndoRedoHelper : UndoRedoBase() {
override fun undo(context: ExecutionContext): Boolean {
val ijContext = context.context as DataContext
val project = PlatformDataKeys.PROJECT.getData(ijContext) ?: return false
val fileEditor = PlatformDataKeys.FILE_EDITOR.getData(ijContext)
val editor = CommonDataKeys.EDITOR.getData(context.ij) ?: return false
val vimEditor = editor.vim
val fileEditor = TextEditorProvider.getInstance().getTextEditor(editor)
val undoManager = UndoManager.getInstance(project)
if (fileEditor != null && undoManager.isUndoAvailable(fileEditor)) {
val editor = CommonDataKeys.EDITOR.getData(context.ij)?.vim
if (undoManager.isUndoAvailable(fileEditor)) {
if (injector.optionService.isSet(OptionScope.GLOBAL, IjVimOptionService.oldUndo)) {
SelectionVimListenerSuppressor.lock().use { undoManager.undo(fileEditor) }
} else {
performUntilFileChanges(editor, { undoManager.isUndoAvailable(fileEditor) }, { undoManager.undo(fileEditor) })
}
performUntilFileChanges(vimEditor, { undoManager.isUndoAvailable(fileEditor) }, { undoManager.undo(fileEditor) })
editor?.carets()?.forEach {
vimEditor.carets().forEach {
val ijCaret = it.ij
val hasSelection = ijCaret.hasSelection()
if (hasSelection) {
@@ -69,6 +70,8 @@ class UndoRedoHelper : UndoRedoBase() {
}
}
}
}
return true
}
return false
@@ -77,17 +80,18 @@ class UndoRedoHelper : UndoRedoBase() {
override fun redo(context: ExecutionContext): Boolean {
val ijContext = context.context as DataContext
val project = PlatformDataKeys.PROJECT.getData(ijContext) ?: return false
val fileEditor = PlatformDataKeys.FILE_EDITOR.getData(ijContext)
val editor = CommonDataKeys.EDITOR.getData(context.ij) ?: return false
val vimEditor = editor.vim
val fileEditor = TextEditorProvider.getInstance().getTextEditor(editor)
val undoManager = UndoManager.getInstance(project)
val editor = CommonDataKeys.EDITOR.getData(context.ij)?.vim
if (fileEditor != null && undoManager.isRedoAvailable(fileEditor)) {
if (undoManager.isRedoAvailable(fileEditor)) {
if (injector.optionService.isSet(OptionScope.GLOBAL, IjVimOptionService.oldUndo)) {
SelectionVimListenerSuppressor.lock().use { undoManager.redo(fileEditor) }
} else {
performUntilFileChanges(editor, { undoManager.isRedoAvailable(fileEditor) }, { undoManager.redo(fileEditor) })
}
performUntilFileChanges(vimEditor, { undoManager.isRedoAvailable(fileEditor) }, { undoManager.redo(fileEditor) })
CommandProcessor.getInstance().runUndoTransparentAction {
editor?.carets()?.forEach { it.ij.removeSelection() }
vimEditor.carets().forEach { it.ij.removeSelection() }
}
}
return true
}

View File

@@ -19,8 +19,10 @@
package com.maddyhome.idea.vim.listener
import com.intellij.codeInsight.lookup.Lookup
import com.intellij.codeInsight.lookup.LookupManager
import com.intellij.codeInsight.lookup.LookupManagerListener
import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.codeInsight.lookup.impl.actions.ChooseItemAction
import com.intellij.codeInsight.template.Template
import com.intellij.codeInsight.template.TemplateEditingAdapter
import com.intellij.codeInsight.template.TemplateManagerListener
@@ -35,10 +37,10 @@ import com.intellij.openapi.actionSystem.ex.AnActionListener
import com.intellij.openapi.actionSystem.impl.ProxyShortcutSet
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.DumbAwareToggleAction
import com.intellij.openapi.util.TextRange
import com.maddyhome.idea.vim.KeyHandler
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.group.NotificationService
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.inNormalMode
import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere
@@ -49,6 +51,8 @@ import com.maddyhome.idea.vim.options.OptionScope
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimInt
import com.maddyhome.idea.vim.vimscript.model.options.helpers.IdeaRefactorModeHelper
import org.jetbrains.annotations.NonNls
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
/**
* @author Alex Plate
@@ -60,6 +64,8 @@ object IdeaSpecifics {
private val surrounderAction =
"com.intellij.codeInsight.generation.surroundWith.SurroundWithHandler\$InvokeSurrounderAction"
private var editor: Editor? = null
private var completionPrevDocumentLength: Int? = null
private var completionPrevDocumentOffset: Int? = null
override fun beforeActionPerformed(action: AnAction, event: AnActionEvent) {
if (!VimPlugin.isEnabled()) return
@@ -68,19 +74,52 @@ object IdeaSpecifics {
editor = hostEditor
}
//region Track action id
if (VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.trackactionidsName)) {
if (action !is NotificationService.ActionIdNotifier.CopyActionId && action !is NotificationService.ActionIdNotifier.StopTracking) {
val id: String? = ActionManager.getInstance().getId(action) ?: (action.shortcutSet as? ProxyShortcutSet)?.actionId
VimPlugin.getNotifications(event.dataContext.getData(CommonDataKeys.PROJECT)).notifyActionId(id)
}
if (hostEditor != null && action is ChooseItemAction && hostEditor.vimStateMachine?.isRecording == true) {
val lookup = LookupManager.getActiveLookup(hostEditor)
if (lookup != null) {
val charsToRemove = hostEditor.caretModel.primaryCaret.offset - lookup.lookupStart
val register = VimPlugin.getRegister()
val backSpace = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0)
repeat(charsToRemove) {
register.recordKeyStroke(backSpace)
}
completionPrevDocumentLength = hostEditor.document.textLength - charsToRemove
completionPrevDocumentOffset = lookup.lookupStart
}
}
//endregion
}
override fun afterActionPerformed(action: AnAction, event: AnActionEvent, result: AnActionResult) {
if (!VimPlugin.isEnabled()) return
val editor = editor
if (editor != null && action is ChooseItemAction && editor.vimStateMachine?.isRecording == true) {
val prevDocumentLength = completionPrevDocumentLength
val prevDocumentOffset = completionPrevDocumentOffset
if (prevDocumentLength != null && prevDocumentOffset != null) {
val register = VimPlugin.getRegister()
val addedTextLength = editor.document.textLength - prevDocumentLength
val caretShift = addedTextLength - (editor.caretModel.primaryCaret.offset - prevDocumentOffset)
val leftArrow = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)
register.recordText(editor.document.getText(TextRange(prevDocumentOffset, prevDocumentOffset + addedTextLength)))
repeat(caretShift.coerceAtLeast(0)) {
register.recordKeyStroke(leftArrow)
}
}
this.completionPrevDocumentLength = null
this.completionPrevDocumentOffset = null
}
//region Enter insert mode after surround with if
if (surrounderAction == action.javaClass.name && surrounderItems.any {
action.templatePresentation.text.endsWith(
@@ -99,7 +138,7 @@ object IdeaSpecifics {
}
//endregion
editor = null
this.editor = null
}
}

View File

@@ -36,9 +36,14 @@ import com.intellij.openapi.editor.event.SelectionEvent
import com.intellij.openapi.editor.event.SelectionListener
import com.intellij.openapi.editor.ex.DocumentEx
import com.intellij.openapi.editor.impl.EditorComponentImpl
import com.intellij.openapi.editor.impl.EditorImpl
import com.intellij.openapi.fileEditor.FileEditorManagerEvent
import com.intellij.openapi.fileEditor.FileEditorManagerListener
import com.intellij.openapi.rd.createLifetime
import com.intellij.openapi.rd.createNestedDisposable
import com.intellij.openapi.util.Disposer
import com.intellij.util.ExceptionUtil
import com.jetbrains.rd.util.lifetime.intersect
import com.maddyhome.idea.vim.EventFacade
import com.maddyhome.idea.vim.KeyHandler
import com.maddyhome.idea.vim.VimKeyListener
@@ -73,8 +78,6 @@ import com.maddyhome.idea.vim.helper.vimLastColumn
import com.maddyhome.idea.vim.listener.MouseEventsDataHolder.skipEvents
import com.maddyhome.idea.vim.listener.MouseEventsDataHolder.skipNDragEvents
import com.maddyhome.idea.vim.listener.VimListenerManager.EditorListeners.add
import com.maddyhome.idea.vim.listener.VimListenerManager.EditorListeners.remove
import com.maddyhome.idea.vim.newapi.IjVimEditor
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.options.OptionConstants
import com.maddyhome.idea.vim.options.OptionScope
@@ -153,17 +156,26 @@ object VimListenerManager {
}
fun add(editor: Editor) {
val pluginLifetime = VimPlugin.getInstance().createLifetime()
val editorLifetime = (editor as EditorImpl).disposable.createLifetime()
val disposable = editorLifetime.intersect(pluginLifetime).createNestedDisposable("MyLifetimedDisposable")
editor.contentComponent.addKeyListener(VimKeyListener)
Disposer.register(disposable) { editor.contentComponent.removeKeyListener(VimKeyListener) }
val eventFacade = EventFacade.getInstance()
eventFacade.addEditorMouseListener(editor, EditorMouseHandler)
eventFacade.addEditorMouseMotionListener(editor, EditorMouseHandler)
eventFacade.addEditorSelectionListener(editor, EditorSelectionHandler)
eventFacade.addComponentMouseListener(editor.contentComponent, ComponentMouseListener)
eventFacade.addEditorMouseListener(editor, EditorMouseHandler, disposable)
eventFacade.addEditorMouseMotionListener(editor, EditorMouseHandler, disposable)
eventFacade.addEditorSelectionListener(editor, EditorSelectionHandler, disposable)
eventFacade.addComponentMouseListener(editor.contentComponent, ComponentMouseListener, disposable)
VimPlugin.getEditor().editorCreated(editor)
VimPlugin.getChange().editorCreated(IjVimEditor(editor))
VimPlugin.getChange().editorCreated(editor, disposable)
Disposer.register(disposable) {
VimPlugin.getEditorIfCreated()?.editorDeinit(editor, true)
}
}
fun remove(editor: Editor, isReleased: Boolean) {
@@ -177,7 +189,7 @@ object VimListenerManager {
VimPlugin.getEditorIfCreated()?.editorDeinit(editor, isReleased)
VimPlugin.getChange().editorReleased(IjVimEditor(editor))
VimPlugin.getChange().editorReleased(editor)
}
}
@@ -209,7 +221,6 @@ object VimListenerManager {
}
override fun editorReleased(event: EditorFactoryEvent) {
remove(event.editor, true)
VimPlugin.getMark().editorReleased(event)
}
}

View File

@@ -53,7 +53,7 @@ class IjVimCaret(val caret: Caret) : VimCaretBase() {
get() {
var storage = this.caret.registerStorage
if (storage == null) {
storage = CaretRegisterStorageBase(editor.primaryCaret().ij == caret)
storage = CaretRegisterStorageBase()
this.caret.registerStorage = storage
}
return storage
@@ -87,6 +87,8 @@ class IjVimCaret(val caret: Caret) : VimCaretBase() {
}
override val vimLine: Int
get() = this.caret.vimLine
override val isPrimary: Boolean
get() = editor.primaryCaret().ij == this.caret
override fun moveToOffset(offset: Int) {
// TODO: 17.12.2021 Unpack internal actions

View File

@@ -3,14 +3,14 @@ package com.maddyhome.idea.vim.newapi
import com.intellij.openapi.components.Service
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimSearchHelper
import com.maddyhome.idea.vim.api.VimSearchHelperBase
import com.maddyhome.idea.vim.common.TextRange
import com.maddyhome.idea.vim.helper.SearchHelper
import com.maddyhome.idea.vim.helper.SearchOptions
import java.util.*
@Service
class IjVimSearchHelper : VimSearchHelper {
class IjVimSearchHelper : VimSearchHelperBase() {
override fun findNextParagraph(editor: VimEditor, caret: VimCaret, count: Int, allowBlanks: Boolean): Int {
return SearchHelper.findNextParagraph(
(editor as IjVimEditor).editor,
@@ -121,15 +121,6 @@ class IjVimSearchHelper : VimSearchHelper {
return SearchHelper.findNextWordEnd(chars, pos, size, count, bigWord, spaceWords)
}
override fun findNextWord(editor: VimEditor, searchFrom: Int, count: Int, bigWord: Boolean): Int {
return SearchHelper.findNextWord(
(editor as IjVimEditor).editor,
searchFrom,
count,
bigWord
)
}
override fun findPattern(
editor: VimEditor,
pattern: String?,

View File

@@ -21,15 +21,14 @@ package com.maddyhome.idea.vim.statistic
import com.intellij.internal.statistic.beans.MetricEvent
import com.intellij.internal.statistic.eventLog.EventLogGroup
import com.intellij.internal.statistic.eventLog.events.EventFields
import com.intellij.internal.statistic.eventLog.events.EventPair
import com.intellij.internal.statistic.eventLog.events.StringListEventField
import com.intellij.internal.statistic.eventLog.events.VarargEventId
import com.intellij.internal.statistic.service.fus.collectors.ApplicationUsagesCollector
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.key.ShortcutOwner
import com.maddyhome.idea.vim.key.ShortcutOwnerInfo
import java.awt.event.InputEvent
import java.awt.event.InputEvent.CTRL_DOWN_MASK
import java.awt.event.InputEvent.SHIFT_DOWN_MASK
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
internal class ShortcutConflictState : ApplicationUsagesCollector() {
@@ -37,93 +36,15 @@ internal class ShortcutConflictState : ApplicationUsagesCollector() {
override fun getGroup(): EventLogGroup = GROUP
override fun getMetrics(): Set<MetricEvent> {
return setOf(
HANDLERS.metric(
CTRL_1 withKeyStroke KeyStroke.getKeyStroke('1'.code, CTRL_DOWN_MASK),
CTRL_2 withKeyStroke KeyStroke.getKeyStroke('2'.code, CTRL_DOWN_MASK),
CTRL_3 withKeyStroke KeyStroke.getKeyStroke('3'.code, CTRL_DOWN_MASK),
CTRL_4 withKeyStroke KeyStroke.getKeyStroke('4'.code, CTRL_DOWN_MASK),
CTRL_5 withKeyStroke KeyStroke.getKeyStroke('5'.code, CTRL_DOWN_MASK),
CTRL_6 withKeyStroke KeyStroke.getKeyStroke('6'.code, CTRL_DOWN_MASK),
CTRL_7 withKeyStroke KeyStroke.getKeyStroke('7'.code, CTRL_DOWN_MASK),
CTRL_8 withKeyStroke KeyStroke.getKeyStroke('8'.code, CTRL_DOWN_MASK),
CTRL_9 withKeyStroke KeyStroke.getKeyStroke('9'.code, CTRL_DOWN_MASK),
CTRL_0 withKeyStroke KeyStroke.getKeyStroke('0'.code, CTRL_DOWN_MASK),
CTRL_SHIFT_1 withKeyStroke KeyStroke.getKeyStroke('1'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_2 withKeyStroke KeyStroke.getKeyStroke('2'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_3 withKeyStroke KeyStroke.getKeyStroke('3'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_4 withKeyStroke KeyStroke.getKeyStroke('4'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_5 withKeyStroke KeyStroke.getKeyStroke('5'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_6 withKeyStroke KeyStroke.getKeyStroke('6'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_7 withKeyStroke KeyStroke.getKeyStroke('7'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_8 withKeyStroke KeyStroke.getKeyStroke('8'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_9 withKeyStroke KeyStroke.getKeyStroke('9'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_0 withKeyStroke KeyStroke.getKeyStroke('0'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_A withKeyStroke KeyStroke.getKeyStroke('A'.code, CTRL_DOWN_MASK),
CTRL_B withKeyStroke KeyStroke.getKeyStroke('B'.code, CTRL_DOWN_MASK),
CTRL_C withKeyStroke KeyStroke.getKeyStroke('C'.code, CTRL_DOWN_MASK),
CTRL_D withKeyStroke KeyStroke.getKeyStroke('D'.code, CTRL_DOWN_MASK),
CTRL_E withKeyStroke KeyStroke.getKeyStroke('E'.code, CTRL_DOWN_MASK),
CTRL_F withKeyStroke KeyStroke.getKeyStroke('F'.code, CTRL_DOWN_MASK),
CTRL_G withKeyStroke KeyStroke.getKeyStroke('G'.code, CTRL_DOWN_MASK),
CTRL_H withKeyStroke KeyStroke.getKeyStroke('H'.code, CTRL_DOWN_MASK),
CTRL_I withKeyStroke KeyStroke.getKeyStroke('I'.code, CTRL_DOWN_MASK),
CTRL_J withKeyStroke KeyStroke.getKeyStroke('J'.code, CTRL_DOWN_MASK),
CTRL_K withKeyStroke KeyStroke.getKeyStroke('K'.code, CTRL_DOWN_MASK),
CTRL_L withKeyStroke KeyStroke.getKeyStroke('L'.code, CTRL_DOWN_MASK),
CTRL_M withKeyStroke KeyStroke.getKeyStroke('M'.code, CTRL_DOWN_MASK),
CTRL_N withKeyStroke KeyStroke.getKeyStroke('N'.code, CTRL_DOWN_MASK),
CTRL_O withKeyStroke KeyStroke.getKeyStroke('O'.code, CTRL_DOWN_MASK),
CTRL_P withKeyStroke KeyStroke.getKeyStroke('P'.code, CTRL_DOWN_MASK),
CTRL_Q withKeyStroke KeyStroke.getKeyStroke('Q'.code, CTRL_DOWN_MASK),
CTRL_R withKeyStroke KeyStroke.getKeyStroke('R'.code, CTRL_DOWN_MASK),
CTRL_S withKeyStroke KeyStroke.getKeyStroke('S'.code, CTRL_DOWN_MASK),
CTRL_T withKeyStroke KeyStroke.getKeyStroke('T'.code, CTRL_DOWN_MASK),
CTRL_U withKeyStroke KeyStroke.getKeyStroke('U'.code, CTRL_DOWN_MASK),
CTRL_V withKeyStroke KeyStroke.getKeyStroke('V'.code, CTRL_DOWN_MASK),
CTRL_W withKeyStroke KeyStroke.getKeyStroke('W'.code, CTRL_DOWN_MASK),
CTRL_X withKeyStroke KeyStroke.getKeyStroke('X'.code, CTRL_DOWN_MASK),
CTRL_Y withKeyStroke KeyStroke.getKeyStroke('Y'.code, CTRL_DOWN_MASK),
CTRL_Z withKeyStroke KeyStroke.getKeyStroke('Z'.code, CTRL_DOWN_MASK),
CTRL_BR1 withKeyStroke KeyStroke.getKeyStroke('['.code, CTRL_DOWN_MASK),
CTRL_BR2 withKeyStroke KeyStroke.getKeyStroke(']'.code, CTRL_DOWN_MASK),
CTRL_SHIFT_A withKeyStroke KeyStroke.getKeyStroke('A'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_B withKeyStroke KeyStroke.getKeyStroke('B'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_C withKeyStroke KeyStroke.getKeyStroke('C'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_D withKeyStroke KeyStroke.getKeyStroke('D'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_E withKeyStroke KeyStroke.getKeyStroke('E'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_F withKeyStroke KeyStroke.getKeyStroke('F'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_G withKeyStroke KeyStroke.getKeyStroke('G'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_H withKeyStroke KeyStroke.getKeyStroke('H'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_I withKeyStroke KeyStroke.getKeyStroke('I'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_J withKeyStroke KeyStroke.getKeyStroke('J'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_K withKeyStroke KeyStroke.getKeyStroke('K'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_L withKeyStroke KeyStroke.getKeyStroke('L'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_M withKeyStroke KeyStroke.getKeyStroke('M'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_N withKeyStroke KeyStroke.getKeyStroke('N'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_O withKeyStroke KeyStroke.getKeyStroke('O'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_P withKeyStroke KeyStroke.getKeyStroke('P'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_Q withKeyStroke KeyStroke.getKeyStroke('Q'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_R withKeyStroke KeyStroke.getKeyStroke('R'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_S withKeyStroke KeyStroke.getKeyStroke('S'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_T withKeyStroke KeyStroke.getKeyStroke('T'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_U withKeyStroke KeyStroke.getKeyStroke('U'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_V withKeyStroke KeyStroke.getKeyStroke('V'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_W withKeyStroke KeyStroke.getKeyStroke('W'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_X withKeyStroke KeyStroke.getKeyStroke('X'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_Y withKeyStroke KeyStroke.getKeyStroke('Y'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_Z withKeyStroke KeyStroke.getKeyStroke('Z'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_BR1 withKeyStroke KeyStroke.getKeyStroke('['.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
CTRL_SHIFT_BR2 withKeyStroke KeyStroke.getKeyStroke(']'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
)
)
val metrics = mutableSetOf<MetricEvent>()
keyStrokes.forEach { keystroke ->
getHandlersForShortcut(keystroke)
.filter { !setOf(HandledModes.INSERT_UNDEFINED, HandledModes.NORMAL_UNDEFINED, HandledModes.VISUAL_AND_SELECT_UNDEFINED).contains(it) }
.forEach { mode ->
metrics += HANDLER.metric(keystroke.toReadableString(), mode)
}
private infix fun StringListEventField.withKeyStroke(ks: KeyStroke): EventPair<List<String>> {
return this.with(getHandlersForShortcut(ks).map { it.name })
}
return metrics
}
private fun getHandlersForShortcut(shortcut: KeyStroke): List<HandledModes> {
@@ -162,173 +83,105 @@ internal class ShortcutConflictState : ApplicationUsagesCollector() {
companion object {
private val GROUP = EventLogGroup("vim.handlers", 1)
private val values = HandledModes.values().map { it.name }
private val CTRL_1 = EventFields.StringList("Ctrl-1", values)
private val CTRL_2 = EventFields.StringList("Ctrl-2", values)
private val CTRL_3 = EventFields.StringList("Ctrl-3", values)
private val CTRL_4 = EventFields.StringList("Ctrl-4", values)
private val CTRL_5 = EventFields.StringList("Ctrl-5", values)
private val CTRL_6 = EventFields.StringList("Ctrl-6", values)
private val CTRL_7 = EventFields.StringList("Ctrl-7", values)
private val CTRL_8 = EventFields.StringList("Ctrl-8", values)
private val CTRL_9 = EventFields.StringList("Ctrl-9", values)
private val CTRL_0 = EventFields.StringList("Ctrl-0", values)
private val keyStrokes = listOf(
KeyStroke.getKeyStroke('1'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('2'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('3'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('4'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('5'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('6'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('7'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('8'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('9'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('0'.code, CTRL_DOWN_MASK),
private val CTRL_SHIFT_1 = EventFields.StringList("Ctrl-Shift-1", values)
private val CTRL_SHIFT_2 = EventFields.StringList("Ctrl-Shift-2", values)
private val CTRL_SHIFT_3 = EventFields.StringList("Ctrl-Shift-3", values)
private val CTRL_SHIFT_4 = EventFields.StringList("Ctrl-Shift-4", values)
private val CTRL_SHIFT_5 = EventFields.StringList("Ctrl-Shift-5", values)
private val CTRL_SHIFT_6 = EventFields.StringList("Ctrl-Shift-6", values)
private val CTRL_SHIFT_7 = EventFields.StringList("Ctrl-Shift-7", values)
private val CTRL_SHIFT_8 = EventFields.StringList("Ctrl-Shift-8", values)
private val CTRL_SHIFT_9 = EventFields.StringList("Ctrl-Shift-9", values)
private val CTRL_SHIFT_0 = EventFields.StringList("Ctrl-Shift-0", values)
KeyStroke.getKeyStroke('1'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('2'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('3'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('4'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('5'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('6'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('7'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('8'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('9'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('0'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
private val CTRL_A = EventFields.StringList("Ctrl-A", values)
private val CTRL_B = EventFields.StringList("Ctrl-B", values)
private val CTRL_C = EventFields.StringList("Ctrl-C", values)
private val CTRL_D = EventFields.StringList("Ctrl-D", values)
private val CTRL_E = EventFields.StringList("Ctrl-E", values)
private val CTRL_F = EventFields.StringList("Ctrl-F", values)
private val CTRL_G = EventFields.StringList("Ctrl-G", values)
private val CTRL_H = EventFields.StringList("Ctrl-H", values)
private val CTRL_I = EventFields.StringList("Ctrl-I", values)
private val CTRL_J = EventFields.StringList("Ctrl-J", values)
private val CTRL_K = EventFields.StringList("Ctrl-K", values)
private val CTRL_L = EventFields.StringList("Ctrl-L", values)
private val CTRL_M = EventFields.StringList("Ctrl-M", values)
private val CTRL_N = EventFields.StringList("Ctrl-N", values)
private val CTRL_O = EventFields.StringList("Ctrl-O", values)
private val CTRL_P = EventFields.StringList("Ctrl-P", values)
private val CTRL_Q = EventFields.StringList("Ctrl-Q", values)
private val CTRL_R = EventFields.StringList("Ctrl-R", values)
private val CTRL_S = EventFields.StringList("Ctrl-S", values)
private val CTRL_T = EventFields.StringList("Ctrl-T", values)
private val CTRL_U = EventFields.StringList("Ctrl-U", values)
private val CTRL_V = EventFields.StringList("Ctrl-V", values)
private val CTRL_W = EventFields.StringList("Ctrl-W", values)
private val CTRL_X = EventFields.StringList("Ctrl-X", values)
private val CTRL_Y = EventFields.StringList("Ctrl-Y", values)
private val CTRL_Z = EventFields.StringList("Ctrl-Z", values)
private val CTRL_BR1 = EventFields.StringList("Ctrl-[", values)
private val CTRL_BR2 = EventFields.StringList("Ctrl-]", values)
KeyStroke.getKeyStroke('A'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('B'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('C'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('D'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('E'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('F'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('G'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('H'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('I'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('J'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('K'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('L'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('M'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('N'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('O'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('P'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('Q'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('R'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('S'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('T'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('U'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('V'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('W'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('X'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('Y'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('Z'.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke('['.code, CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(']'.code, CTRL_DOWN_MASK),
private val CTRL_SHIFT_A = EventFields.StringList("Ctrl-Shift-A", values)
private val CTRL_SHIFT_B = EventFields.StringList("Ctrl-Shift-B", values)
private val CTRL_SHIFT_C = EventFields.StringList("Ctrl-Shift-C", values)
private val CTRL_SHIFT_D = EventFields.StringList("Ctrl-Shift-D", values)
private val CTRL_SHIFT_E = EventFields.StringList("Ctrl-Shift-E", values)
private val CTRL_SHIFT_F = EventFields.StringList("Ctrl-Shift-F", values)
private val CTRL_SHIFT_G = EventFields.StringList("Ctrl-Shift-G", values)
private val CTRL_SHIFT_H = EventFields.StringList("Ctrl-Shift-H", values)
private val CTRL_SHIFT_I = EventFields.StringList("Ctrl-Shift-I", values)
private val CTRL_SHIFT_J = EventFields.StringList("Ctrl-Shift-J", values)
private val CTRL_SHIFT_K = EventFields.StringList("Ctrl-Shift-K", values)
private val CTRL_SHIFT_L = EventFields.StringList("Ctrl-Shift-L", values)
private val CTRL_SHIFT_M = EventFields.StringList("Ctrl-Shift-M", values)
private val CTRL_SHIFT_N = EventFields.StringList("Ctrl-Shift-N", values)
private val CTRL_SHIFT_O = EventFields.StringList("Ctrl-Shift-O", values)
private val CTRL_SHIFT_P = EventFields.StringList("Ctrl-Shift-P", values)
private val CTRL_SHIFT_Q = EventFields.StringList("Ctrl-Shift-Q", values)
private val CTRL_SHIFT_R = EventFields.StringList("Ctrl-Shift-R", values)
private val CTRL_SHIFT_S = EventFields.StringList("Ctrl-Shift-S", values)
private val CTRL_SHIFT_T = EventFields.StringList("Ctrl-Shift-T", values)
private val CTRL_SHIFT_U = EventFields.StringList("Ctrl-Shift-U", values)
private val CTRL_SHIFT_V = EventFields.StringList("Ctrl-Shift-V", values)
private val CTRL_SHIFT_W = EventFields.StringList("Ctrl-Shift-W", values)
private val CTRL_SHIFT_X = EventFields.StringList("Ctrl-Shift-X", values)
private val CTRL_SHIFT_Y = EventFields.StringList("Ctrl-Shift-Y", values)
private val CTRL_SHIFT_Z = EventFields.StringList("Ctrl-Shift-Z", values)
private val CTRL_SHIFT_BR1 = EventFields.StringList("Ctrl-Shift-[", values)
private val CTRL_SHIFT_BR2 = EventFields.StringList("Ctrl-Shift-]", values)
private val HANDLERS: VarargEventId = GROUP.registerVarargEvent(
"vim.handlers",
CTRL_1,
CTRL_2,
CTRL_3,
CTRL_4,
CTRL_5,
CTRL_6,
CTRL_7,
CTRL_8,
CTRL_9,
CTRL_0,
CTRL_SHIFT_1,
CTRL_SHIFT_2,
CTRL_SHIFT_3,
CTRL_SHIFT_4,
CTRL_SHIFT_5,
CTRL_SHIFT_6,
CTRL_SHIFT_7,
CTRL_SHIFT_8,
CTRL_SHIFT_9,
CTRL_SHIFT_0,
CTRL_A,
CTRL_B,
CTRL_C,
CTRL_D,
CTRL_E,
CTRL_F,
CTRL_G,
CTRL_H,
CTRL_I,
CTRL_J,
CTRL_K,
CTRL_L,
CTRL_M,
CTRL_N,
CTRL_O,
CTRL_P,
CTRL_Q,
CTRL_R,
CTRL_S,
CTRL_T,
CTRL_U,
CTRL_V,
CTRL_W,
CTRL_X,
CTRL_Y,
CTRL_Z,
CTRL_BR1,
CTRL_BR2,
CTRL_SHIFT_A,
CTRL_SHIFT_B,
CTRL_SHIFT_C,
CTRL_SHIFT_D,
CTRL_SHIFT_E,
CTRL_SHIFT_F,
CTRL_SHIFT_G,
CTRL_SHIFT_H,
CTRL_SHIFT_I,
CTRL_SHIFT_J,
CTRL_SHIFT_K,
CTRL_SHIFT_L,
CTRL_SHIFT_M,
CTRL_SHIFT_N,
CTRL_SHIFT_O,
CTRL_SHIFT_P,
CTRL_SHIFT_Q,
CTRL_SHIFT_R,
CTRL_SHIFT_S,
CTRL_SHIFT_T,
CTRL_SHIFT_U,
CTRL_SHIFT_V,
CTRL_SHIFT_W,
CTRL_SHIFT_X,
CTRL_SHIFT_Y,
CTRL_SHIFT_Z,
CTRL_SHIFT_BR1,
CTRL_SHIFT_BR2,
KeyStroke.getKeyStroke('A'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('B'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('C'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('D'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('E'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('F'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('G'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('H'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('I'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('J'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('K'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('L'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('M'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('N'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('O'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('P'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('Q'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('R'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('S'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('T'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('U'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('V'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('W'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('X'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('Y'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('Z'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke('['.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke(']'.code, CTRL_DOWN_MASK + SHIFT_DOWN_MASK),
)
private val KEY_STROKE = EventFields.String("key_stroke", keyStrokes.map { it.toReadableString() })
private val HANDLER_MODE = EventFields.Enum<HandledModes>("handler")
private val HANDLER = GROUP.registerEvent("vim.handler", KEY_STROKE, HANDLER_MODE)
}
}
private fun KeyStroke.toReadableString(): String {
val result = StringBuilder()
val modifiers = this.modifiers
if (modifiers > 0) {
result.append(InputEvent.getModifiersExText(modifiers))
.append("+")
}
result.append(KeyEvent.getKeyText(this.keyCode))
return result.toString()
}
private enum class HandledModes {
NORMAL_UNDEFINED,
NORMAL_IDE,

View File

@@ -59,8 +59,8 @@ internal class VimscriptState : ApplicationUsagesCollector() {
var isFunctionDeclarationUsed = false
var isFunctionCallUsed = false
private val SOURCED_FILES = EventFields.Int("number_of_sourced_files")
private val IDEAVIMRC_SIZE = EventFields.Int("ideavimrc_size")
private val SOURCED_FILES = EventFields.RoundedInt("number_of_sourced_files")
private val IDEAVIMRC_SIZE = EventFields.RoundedInt("ideavimrc_size")
private val EXTENSIONS_ENABLED_BY_SET = EventFields.StringList("extensions_enabled_by_set", PluginState.extensionNames)
private val EXTENSIONS_ENABLED_BY_PLUG = EventFields.StringList("extensions_enabled_by_plug", PluginState.extensionNames)
private val IS_IDE_SPECIFIC_CONFIGURATION_USED = EventFields.Boolean("is_IDE-specific_configuration_used")

View File

@@ -20,10 +20,10 @@ package com.maddyhome.idea.vim.ui
import com.intellij.icons.AllIcons
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.actionSystem.PlatformDataKeys
import com.intellij.openapi.components.service
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.toolbar.floating.AbstractFloatingToolbarProvider
import com.intellij.openapi.editor.toolbar.floating.FloatingToolbarComponent
@@ -144,11 +144,13 @@ class ReloadVimRc : DumbAwareAction() {
e.presentation.isEnabledAndVisible = true
}
override fun getActionUpdateThread() = ActionUpdateThread.BGT
override fun actionPerformed(e: AnActionEvent) {
val editor = e.getData(PlatformDataKeys.EDITOR) ?: return
FileDocumentManager.getInstance().saveDocumentAsIs(editor.document)
injector.keyGroup.removeKeyMapping(MappingOwner.IdeaVim.InitScript)
service<Troubleshooter>().removeByType("old-action-notation-in-mappings")
Troubleshooter.instance.removeByType("old-action-notation-in-mappings")
executeIdeaVimRc()
}
}

View File

@@ -23,6 +23,7 @@ import com.intellij.ide.BrowserUtil
import com.intellij.ide.DataManager
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.ActionPlaces
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.DefaultActionGroup
@@ -158,6 +159,8 @@ class VimActions : DumbAwareAction() {
val project = e.project
e.presentation.isEnabledAndVisible = project != null && !project.isDisposed
}
override fun getActionUpdateThread() = ActionUpdateThread.BGT
}
private object VimActionsPopup {
@@ -264,4 +267,6 @@ internal object JoinEap : DumbAwareAction()/*, LightEditCompatible*/ {
e.presentation.text = MessageHelper.message("action.subscribe.to.eap.text")
}
}
override fun getActionUpdateThread() = ActionUpdateThread.BGT
}

View File

@@ -21,7 +21,7 @@ package com.maddyhome.idea.vim.ui.ex
import com.intellij.openapi.diagnostic.logger
import com.maddyhome.idea.vim.KeyHandler
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.helper.SearchHelper
import com.maddyhome.idea.vim.api.VimSearchHelperBase
import com.maddyhome.idea.vim.newapi.vim
import java.awt.event.ActionEvent
import java.awt.event.KeyEvent
@@ -238,14 +238,14 @@ class DeletePreviousWordAction : TextAction(DefaultEditorKit.deletePrevWordActio
target.saveLastEntry()
val doc = target.document
val caret = target.caret
val offset = SearchHelper.findNextWord(
target.actualText, caret.dot, target.actualText.length,
val offset = VimSearchHelperBase.Companion.findNextWord(
target.actualText, caret.dot.toLong(), target.actualText.length.toLong(),
-1, false, false
)
if (logger.isDebugEnabled) logger.debug("offset=$offset")
try {
val pos = caret.dot
doc.remove(offset, pos - offset)
doc.remove(offset.toInt(), (pos - offset).toInt())
} catch (ex: BadLocationException) {
// ignore
}

View File

@@ -18,6 +18,7 @@
package com.maddyhome.idea.vim.ui.ex
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.KeyboardShortcut
import com.intellij.openapi.project.DumbAwareAction
@@ -69,4 +70,7 @@ class ExShortcutKeyAction(private val exEntryPanel: ExEntryPanel) : DumbAwareAct
registerCustomShortcutSet({ shortcuts }, exEntryPanel)
}
// / Or EDT? We access ExEntryPanel actually. But seems to work with BGT
override fun getActionUpdateThread() = ActionUpdateThread.BGT
}

View File

@@ -0,0 +1,48 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2021 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.vimscript.model.functions.handlers
import com.intellij.refactoring.rename.inplace.InplaceRefactoring
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.vimscript.model.VimLContext
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimInt
import com.maddyhome.idea.vim.vimscript.model.expressions.Expression
import com.maddyhome.idea.vim.vimscript.model.functions.FunctionHandler
object RenamingFunctionHandler : FunctionHandler() {
override val name = "renaming"
override val minimumNumberOfArguments = 0
override val maximumNumberOfArguments = 0
override fun doFunction(
argumentValues: List<Expression>,
editor: VimEditor,
context: ExecutionContext,
vimContext: VimLContext,
): VimDataType {
return if (InplaceRefactoring.getActiveInplaceRenamer(editor.ij) == null)
VimInt.ZERO
else
VimInt.ONE
}
}

View File

@@ -14,5 +14,6 @@
<vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.TolowerFunctionHandler" name="tolower"/>
<vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.ToupperFunctionHandler" name="toupper"/>
<vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.JoinFunctionHandler" name="join"/>
<vimLibraryFunction implementation="com.maddyhome.idea.vim.vimscript.model.functions.handlers.RenamingFunctionHandler" name="renaming"/>
</extensions>
</idea-plugin>

View File

@@ -1,12 +1,115 @@
<idea-plugin url="https://plugins.jetbrains.com/plugin/164" xmlns:xi="http://www.w3.org/2001/XInclude">
<idea-plugin xmlns:xi="http://www.w3.org/2001/XInclude">
<name>IdeaVim</name>
<id>IdeaVIM</id>
<change-notes><![CDATA[
<a href="https://github.com/JetBrains/ideavim/blob/master/CHANGES.md">Changes</a>
<h3>Features:</h3>
<ul>
<li>Add <code>gcu</code> command for Commentary plugin</li>
<li>Add <code>:Commentary</code> command, which works great for commands such as <code>:%g/fun/Commentary</code></li>
<li>Support <code>gc</code> commentary text objects. E.g. <code>dgc</code>: delete commented text.</li>
<li>Support <code>redo-register feature</code> | <a
href="https://youtrack.jetbrains.com/issue/VIM-2643/Dot-operator-doesn-t-increment-number-register-after-pasting-fro">VIM-2643</a>
| <a href="http://vimdoc.sourceforge.net/htmldoc/undo.html#redo-register">viminfo</a></li>
</ul>
<h3>Changes:</h3>
<ul>
<li>Uses the same mappings as Commentary, so custom bindings for the Vim plugin will work with IdeaVim, too.
E.g. <code>&lt;Plug&gt;Commentary</code> instead of <code>&lt;Plug&gt;(CommentMotion)</code>. Old mappings are
maintained for compatibility.
</li>
<li>If you open <code>~/.ideavimrc</code> in IDE, remove a mapping, and reload the config using the reload button,
the mapping will actually be unmapped.
</li>
<li>New vim (and IdeaVim) behaviour: <code>ci(</code>&amp; friends searches for the brackets in the line.</li>
</ul>
<h3>Fixes:</h3>
<ul>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2587">VIM-2587</a> Use ctrl-6 as ctrl-^</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2590">VIM-2590</a> Fix caret shape in PyCharm</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2553">VIM-2553</a> Substitute consecutive matches</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-1687">VIM-1687</a> Support count for <code>gcc</code></li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2381">VIM-2381</a> Fall back to line comment if block comment is
not available
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2589">VIM-2589</a> Add <code>gc</code> text object</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2604">VIM-2604</a> Update action execution rules</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2654">VIM-2654</a> Add support for <code>return</code> without
expression
</li>
<li><a
href="https://youtrack.jetbrains.com/issue/VIM-2630/Please-fix-warning-Shall-not-be-called-on-a-template-presentatio">VIM-2630</a>
Fix IDE freeze
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2661/Spamming-does-not-work">VIM-2661</a> Fix repeating the
<code>@@</code> command
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2668/tabm-or-tabm-with-no-number-does-not-match-vim-behavior">VIM-2668</a>
Fix omitted numbers in <code>tabm</code> command
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2595">VIM-2595</a> Support plugins in macro execution</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2671">VIM-2671</a> Fix using plugins from mappings</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2675">VIM-2675</a> Fix numbering register in visual mode</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-744/Use-undoredo-with-count-modifier">VIM-744</a> Add count to
undo/redo
</li>
<li><a
href="https://youtrack.jetbrains.com/issue/VIM-1862/Ex-commands-executed-in-keymaps-and-macros-are-added-to-the-command-history">VIM-1862</a>
Fix command history
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2227">VIM-2227</a> Wrong behavior when deleting / changing
surround with invalid character
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2691">VIM-2691</a> Save file on :w</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2710">VIM-2710</a> Show options value on <code>set opt</code>
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-913">VIM-913</a> Partially fix the issue with macros and
autocompletion
</li>
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2723">VIM-2723</a> Move focus to editor after :q</li>
</ul>
<h3>Merged PRs:</h3>
<ul>
<li><a href="https://github.com/JetBrains/ideavim/pull/468">468</a> by <a href="https://github.com/PHPirates">Thomas
Schouten</a>: Implement UserDataHolder for EditorDataContext
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/483">483</a> by <a href="https://github.com/Vvalter">Simon
Rainer</a>: Fix(VIM-2553): Substitute consecutive matches
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/488">488</a> by <a href="https://github.com/myzeiri">Martin
Yzeiri</a>: Add Matchit support for the C family of languages
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/493">493</a> by <a href="https://github.com/citizenmatt">Matt
Ellis</a>: Improvements to Commentary extension
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/494">494</a> by <a href="https://github.com/citizenmatt">Matt
Ellis</a>: Cleanup pre-212 CaretVisualAttributes compatibility code
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/504">504</a> by <a href="https://github.com/citizenmatt">Matt
Ellis</a>: Minor bug fixes
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/519">519</a> by <a href="https://github.com/chylex">chylex</a>:
Fix(VIM-2227): Wrong behavior when deleting / changing surround with invalid character
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/525">525</a> by <a href="https://github.com/citizenmatt">Matt
Ellis</a>: Improve handling of fractional width fonts
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/526">526</a> by <a href="https://github.com/AlexPl292">Alex
Pláte</a>: Create gradle.properties
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/528">528</a> by <a href="https://github.com/chylex">chylex</a>:
Implement partial code completion support in macros
</li>
<li><a href="https://github.com/JetBrains/ideavim/pull/531">531</a> by <a href="https://github.com/citizenmatt">Matt
Ellis</a>: Consolidate doTest methods
</li>
</ul>
]]>
</change-notes>
<description><![CDATA[
<p>Vim emulation plugin for IntelliJ Platform-based IDEs.</p>
<p>Vim engine for JetBrains IDEs</p>
<br/>
<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, Vim plugins, etc.</p>
@@ -17,7 +120,7 @@
<li><a href="https://youtrack.jetbrains.com/issues/VIM">Issue tracker</a>: feature requests and bug reports</li>
</ul>
]]></description>
<version>SNAPSHOT</version>
<version>chylex</version>
<vendor>JetBrains</vendor>
<!-- Please search for "[VERSION UPDATE]" in project in case you update the since-build version -->
@@ -36,6 +139,11 @@
<depends optional="true" config-file="ides/ideavim-withAppCode.xml">com.intellij.modules.appcode</depends>
<depends optional="true" config-file="ideavim-withAceJump.xml">AceJump</depends>
<applicationListeners>
<listener class="com.maddyhome.idea.vim.PyNotebooksCloseWorkaround"
topic="com.intellij.openapi.project.ProjectManagerListener"/>
</applicationListeners>
<application-components>
<component>
<implementation-class>com.maddyhome.idea.vim.DynamicLoaderStopper</implementation-class>

View File

@@ -63,7 +63,7 @@ E548=E548: Digit expected: {0}
E549=E549: Illegal percentage: {0}
E774=E774: 'operatorfunc' is empty
action.VimPluginToggle.text=Vim Emulator
action.VimPluginToggle.text=Vim
action.VimPluginToggle.description=Toggle the vim plugin On/Off
action.VimPluginToggle.enabled=Enabled
action.VimPluginToggle.enable=Enable

View File

@@ -53,6 +53,8 @@ internal object NeovimTesting {
private lateinit var escapeCommand: String
private lateinit var ctrlcCommand: String
private var singleCaret = true
fun setUp(test: VimTestCase) {
if (!neovimEnabled(test)) return
val nvimPath = System.getenv("ideavim.nvim.path") ?: "nvim"
@@ -90,25 +92,35 @@ internal object NeovimTesting {
}
}
private fun neovimEnabled(test: VimTestCase): Boolean {
private fun neovimEnabled(test: VimTestCase, editor: Editor? = null): Boolean {
val method = test.javaClass.getMethod(test.name)
val noBehaviourDiffers = !method.isAnnotationPresent(VimBehaviorDiffers::class.java)
val noTestingWithoutNeovim = !method.isAnnotationPresent(TestWithoutNeovim::class.java)
val neovimTestingEnabled = System.getProperty("ideavim.nvim.test", "false")!!.toBoolean()
val notParserTest = "org.jetbrains.plugins.ideavim.ex.parser" !in test.javaClass.packageName
val notScriptImplementation = "org.jetbrains.plugins.ideavim.ex.implementation" !in test.javaClass.packageName
return noBehaviourDiffers && noTestingWithoutNeovim && neovimTestingEnabled && notParserTest && notScriptImplementation
val notExtension = "org.jetbrains.plugins.ideavim.extension" !in test.javaClass.packageName
if (singleCaret) {
singleCaret = editor == null || editor.caretModel.caretCount == 1
}
return noBehaviourDiffers &&
noTestingWithoutNeovim &&
neovimTestingEnabled &&
notParserTest &&
notScriptImplementation &&
notExtension &&
singleCaret
}
fun setupEditor(editor: Editor, test: VimTestCase) {
if (!neovimEnabled(test)) return
if (!neovimEnabled(test, editor)) return
neovimApi.currentBuffer.get().setLines(0, -1, false, editor.document.text.split("\n")).get()
val charPosition = CharacterPosition.fromOffset(editor, editor.caretModel.offset)
neovimApi.currentWindow.get().setCursor(VimCoords(charPosition.line + 1, charPosition.column)).get()
}
fun typeCommand(keys: String, test: VimTestCase) {
if (!neovimEnabled(test)) return
fun typeCommand(keys: String, test: VimTestCase, editor: Editor) {
if (!neovimEnabled(test, editor)) return
when {
keys.equals("<esc>", ignoreCase = true) -> neovimApi.input(escapeCommand).get()
keys.equals("<C-C>", ignoreCase = true) -> neovimApi.input(ctrlcCommand).get()
@@ -120,7 +132,7 @@ internal object NeovimTesting {
}
fun assertState(editor: Editor, test: VimTestCase) {
if (!neovimEnabled(test)) return
if (!neovimEnabled(test, editor)) return
if (currentTestName != "") {
currentTestName = ""
neovimTestsCounter++
@@ -140,7 +152,7 @@ internal object NeovimTesting {
private fun getText(): String = neovimApi.currentBuffer.get().getLines(0, -1, false).get().joinToString("\n")
fun assertCaret(editor: Editor, test: VimTestCase) {
if (!neovimEnabled(test)) return
if (!neovimEnabled(test, editor)) return
if (currentTestName != "") {
currentTestName = ""
neovimTestsCounter++
@@ -200,7 +212,6 @@ annotation class TestWithoutNeovim(val reason: SkipNeovimReason, val description
enum class SkipNeovimReason {
PLUGIN,
MULTICARET,
@Suppress("unused")
INLAYS,
@@ -221,7 +232,6 @@ enum class SkipNeovimReason {
EDITOR_MODIFICATION,
CMD,
IDEAVIMRC,
ACTION_COMMAND,
PLUG,
FOLDING,

View File

@@ -20,7 +20,6 @@ package org.jetbrains.plugins.ideavim
import com.maddyhome.idea.vim.RegisterActions.VIM_ACTIONS_EP
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.MappingMode
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.handler.ActionBeanClass
@@ -42,10 +41,9 @@ class RegisterActionsTest : VimTestCase() {
setupChecks {
caretShape = false
}
val keys = injector.parser.parseKeys("jklwB") // just random keys
val before = "I ${c}found it in a legendary land"
val after = "I jklwB${c}found it in a legendary land"
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest("jklwB", before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
VimPlugin.setEnabled(false)
}
} finally {
@@ -55,10 +53,9 @@ class RegisterActionsTest : VimTestCase() {
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test turn plugin off and on`() {
val keys = injector.parser.parseKeys("l")
val before = "I ${c}found it in a legendary land"
val after = "I f${c}ound it in a legendary land"
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest("l", before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
VimPlugin.setEnabled(false)
VimPlugin.setEnabled(true)
}
@@ -66,10 +63,9 @@ class RegisterActionsTest : VimTestCase() {
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test enable twice`() {
val keys = injector.parser.parseKeys("l")
val before = "I ${c}found it in a legendary land"
val after = "I f${c}ound it in a legendary land"
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest("l", before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
VimPlugin.setEnabled(false)
VimPlugin.setEnabled(true)
VimPlugin.setEnabled(true)
@@ -78,11 +74,10 @@ class RegisterActionsTest : VimTestCase() {
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test unregister extension`() {
val keys = injector.parser.parseKeys("l")
val before = "I ${c}found it in a legendary land"
val after = "I f${c}ound it in a legendary land"
var motionRightAction: ActionBeanClass? = null
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest("l", before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
motionRightAction = VIM_ACTIONS_EP.extensions().filter { it.actionId == "VimPreviousTabAction" }.findFirst().get()
assertNotNull(getCommandNode())

View File

@@ -94,7 +94,7 @@ abstract class VimTestCase : UsefulTestCase() {
super.setUp()
val factory = IdeaTestFixtureFactory.getFixtureFactory()
val projectDescriptor = LightProjectDescriptor.EMPTY_PROJECT_DESCRIPTOR
val fixtureBuilder = factory.createLightFixtureBuilder(projectDescriptor)
val fixtureBuilder = factory.createLightFixtureBuilder(projectDescriptor, "IdeaVim")
val fixture = fixtureBuilder.fixture
myFixture = IdeaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(
fixture,
@@ -229,6 +229,7 @@ abstract class VimTestCase : UsefulTestCase() {
private fun configureByText(fileName: String, content: String): Editor {
@Suppress("IdeaVimAssertState")
myFixture.configureByText(fileName, content)
NeovimTesting.setupEditor(myFixture.editor, this)
setEditorVisibleSize(screenWidth, screenHeight)
return myFixture.editor
}
@@ -236,6 +237,7 @@ abstract class VimTestCase : UsefulTestCase() {
protected fun configureByFileName(fileName: String): Editor {
@Suppress("IdeaVimAssertState")
myFixture.configureByText(fileName, "\n")
NeovimTesting.setupEditor(myFixture.editor, this)
setEditorVisibleSize(screenWidth, screenHeight)
return myFixture.editor
}
@@ -298,8 +300,12 @@ abstract class VimTestCase : UsefulTestCase() {
}
protected fun typeText(keys: List<KeyStroke?>): Editor {
NeovimTesting.typeCommand(keys.filterNotNull().joinToString(separator = "") { injector.parser.toKeyNotation(it) }, this)
val editor = myFixture.editor
NeovimTesting.typeCommand(
keys.filterNotNull().joinToString(separator = "") { injector.parser.toKeyNotation(it) },
this,
editor
)
val project = myFixture.project
when (Checks.keyHandler) {
Checks.KeyHandlerMethod.DIRECT_TO_VIM -> typeText(keys, editor, project)
@@ -328,6 +334,12 @@ abstract class VimTestCase : UsefulTestCase() {
NeovimTesting.assertState(myFixture.editor, this)
}
protected fun assertState(modeAfter: VimStateMachine.Mode, subModeAfter: SubMode) {
assertMode(modeAfter)
assertSubMode(subModeAfter)
assertCaretsVisualAttributes()
}
fun assertPosition(line: Int, column: Int) {
val carets = myFixture.editor.caretModel.allCarets
Assert.assertEquals("Wrong amount of carets", 1, carets.size)
@@ -459,7 +471,7 @@ abstract class VimTestCase : UsefulTestCase() {
val actual = getInstance(myFixture.editor).text
Assert.assertNotNull("No Ex output", actual)
Assert.assertEquals(expected, actual)
NeovimTesting.typeCommand("<esc>", this)
NeovimTesting.typeCommand("<esc>", this, myFixture.editor)
}
fun assertNoExOutput() {
@@ -501,95 +513,46 @@ abstract class VimTestCase : UsefulTestCase() {
}
}
@JvmOverloads
fun doTest(
keys: List<String>,
before: String,
after: String,
modeAfter: VimStateMachine.Mode = VimStateMachine.Mode.COMMAND,
subModeAfter: SubMode = SubMode.NONE,
fileType: FileType? = null,
fileName: String? = null,
afterEditorInitialized: ((Editor) -> Unit)? = null,
) {
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, SubMode.NONE)
}
fun doTest(
keys: List<String>,
before: String,
after: String,
modeAfter: VimStateMachine.Mode,
subModeAfter: SubMode,
) {
doTest(keys.joinToString(separator = ""), before, after, modeAfter, subModeAfter)
doTest(keys.joinToString(separator = ""), before, after, modeAfter, subModeAfter, fileType, fileName, afterEditorInitialized)
}
@JvmOverloads
fun doTest(
keys: String,
before: String,
after: String,
modeAfter: VimStateMachine.Mode,
subModeAfter: SubMode,
) {
configureByText(before)
performTest(keys, after, modeAfter, subModeAfter)
NeovimTesting.assertState(myFixture.editor, this)
}
fun doTest(
keys: String,
before: String,
after: String,
modeAfter: VimStateMachine.Mode,
subModeAfter: SubMode,
fileType: FileType,
) {
configureByText(fileType, before)
NeovimTesting.setupEditor(myFixture.editor, this)
NeovimTesting.typeCommand(keys, this)
performTest(keys, after, modeAfter, subModeAfter)
NeovimTesting.assertState(myFixture.editor, this)
}
fun doTest(
keys: String,
before: String,
after: String,
modeAfter: VimStateMachine.Mode,
subModeAfter: SubMode,
fileName: String,
modeAfter: VimStateMachine.Mode = VimStateMachine.Mode.COMMAND,
subModeAfter: SubMode = SubMode.NONE,
fileType: FileType? = null,
fileName: String? = null,
afterEditorInitialized: ((Editor) -> Unit)? = null,
) {
if (fileName != null) {
configureByText(fileName, before)
NeovimTesting.setupEditor(myFixture.editor, this)
NeovimTesting.typeCommand(keys, this)
} else if (fileType != null) {
configureByText(fileType, before)
} else {
configureByText(before)
}
afterEditorInitialized?.invoke(myFixture.editor)
performTest(keys, after, modeAfter, subModeAfter)
NeovimTesting.assertState(myFixture.editor, this)
}
protected fun performTest(keys: String, after: String, modeAfter: VimStateMachine.Mode, subModeAfter: SubMode) {
typeText(injector.parser.parseKeys(keys))
PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue()
@Suppress("IdeaVimAssertState")
myFixture.checkResult(after)
assertState(modeAfter, subModeAfter)
}
fun doTest(
keys: List<KeyStroke>,
before: String,
after: String?,
modeAfter: VimStateMachine.Mode,
subModeAfter: SubMode,
afterEditorInitialized: (Editor) -> Unit,
) {
configureByText(before)
afterEditorInitialized(myFixture.editor)
typeText(keys)
@Suppress("IdeaVimAssertState")
myFixture.checkResult(after!!)
assertState(after)
assertState(modeAfter, subModeAfter)
}
@@ -598,12 +561,6 @@ abstract class VimTestCase : UsefulTestCase() {
NeovimTesting.setRegister(register, keys, this)
}
protected fun assertState(modeAfter: VimStateMachine.Mode, subModeAfter: SubMode) {
assertMode(modeAfter)
assertSubMode(subModeAfter)
assertCaretsVisualAttributes()
}
protected val fileManager: FileEditorManagerEx
get() = FileEditorManagerEx.getInstanceEx(myFixture.project)

View File

@@ -20,6 +20,7 @@ package org.jetbrains.plugins.ideavim.action
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.StringHelper.parseKeys
import com.maddyhome.idea.vim.helper.vimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
@@ -1039,4 +1040,16 @@ two
)
assertOffset(4)
}
fun `test gv after backwards selection`() {
configureByText("${c}Oh, hi Mark\n")
typeText(parseKeys("yw" + "$" + "vb" + "p" + "gv"))
assertSelection("Oh")
}
fun `test gv after linewise selection`() {
configureByText("${c}Oh, hi Mark\nOh, hi Markus\n")
typeText(parseKeys("V" + "y" + "j" + "V" + "p" + "gv"))
assertSelection("Oh, hi Mark")
}
}

View File

@@ -131,7 +131,6 @@ class RepeatChangeActionTest : VimTestCase() {
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test multicaret`() {
val keys = listOf("v2erXj^", ".")
val before = """

View File

@@ -41,7 +41,8 @@ class UndoActionTest : VimTestCase() {
assertFalse(editor.caretModel.primaryCaret.hasSelection())
}
fun `test undo after selection`() {
// Not yet supported
fun `undo after selection`() {
val keys = listOf("v3eld", "u")
val before = """
A Discovery

View File

@@ -23,8 +23,6 @@ package org.jetbrains.plugins.ideavim.action.change.change
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class ChangeVisualActionTest : VimTestCase() {
@@ -155,7 +153,6 @@ class ChangeVisualActionTest : VimTestCase() {
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test change visual action`() {
typeTextInFile(
injector.parser.parseKeys("v2lc" + "aaa" + "<ESC>"),

View File

@@ -0,0 +1,46 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2022 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.jetbrains.plugins.ideavim.action.change.change
// class InsertRegisterTest : VimTestCase() {
// todo test cursor position VIM-2732
// fun `test multiline insert from expression register`() {
// val keys = "VjyGo<C-r>=@\"<CR>"
// val before = """
// A Discovery
//
// ${c}I found it in a legendary land
// all rocks and lavender and tufted grass,
// where it was settled on some sodden sand
// hard by the torrent of a mountain pass.
// """.trimIndent()
// val after = """
// A Discovery
//
// I found it in a legendary land
// all rocks and lavender and tufted grass,
// where it was settled on some sodden sand
// hard by the torrent of a mountain pass.
// I found it in a legendary land
// all rocks and lavender and tufted grass,
// ${c}
// """.trimIndent()
// doTest(keys, before, after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE)
// }
// }

View File

@@ -20,8 +20,6 @@ package org.jetbrains.plugins.ideavim.action.change.change.number
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
/**
@@ -114,7 +112,6 @@ class ChangeVisualNumberDecActionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test change number dec visual action`() {
typeTextInFile(
injector.parser.parseKeys("Vj<C-X>"),

View File

@@ -20,8 +20,6 @@ package org.jetbrains.plugins.ideavim.action.change.change.number
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
/**
@@ -114,7 +112,6 @@ class ChangeVisualNumberIncActionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test change number inc visual multiple cursor`() {
typeTextInFile(
injector.parser.parseKeys("Vj<C-A>"),

View File

@@ -49,6 +49,23 @@ class DeleteMotionActionTest : VimTestCase() {
)
}
fun `test on line in middle`() {
typeTextInFile(
injector.parser.parseKeys("dd"),
"""
def xxx():
expression${c} one
expression two
""".trimIndent()
)
assertState(
"""
def xxx():
${c}expression two
""".trimIndent()
)
}
fun `test delete single line`() {
typeTextInFile(
injector.parser.parseKeys("dd"),
@@ -92,7 +109,6 @@ class DeleteMotionActionTest : VimTestCase() {
assertEquals(" expression two\n", savedText)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test delete line action multicaret`() {
typeTextInFile(
injector.parser.parseKeys("d3d"),
@@ -110,7 +126,6 @@ class DeleteMotionActionTest : VimTestCase() {
assertState("${c}abcde\n${c}")
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test delete motion action multicaret`() {
typeTextInFile(
injector.parser.parseKeys("dt)"),

View File

@@ -20,12 +20,9 @@ package org.jetbrains.plugins.ideavim.action.change.insert
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class InsertAfterLineEndActionTest : VimTestCase() {
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test insert after line end action`() {
typeTextInFile(
injector.parser.parseKeys("A" + " four" + "<ESC>"),
@@ -44,7 +41,6 @@ class InsertAfterLineEndActionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test multiple carets`() {
doTest(
"AHello<esc>",

View File

@@ -19,12 +19,9 @@
package org.jetbrains.plugins.ideavim.action.change.insert
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class InsertBeforeFirstNonBlankActionTest : VimTestCase() {
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test insert multiple carets`() {
doTest(
"IHello<esc>",

View File

@@ -23,8 +23,6 @@ package org.jetbrains.plugins.ideavim.action.change.insert
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class InsertDeletePreviousWordActionTest : VimTestCase() {
@@ -146,7 +144,6 @@ class InsertDeletePreviousWordActionTest : VimTestCase() {
assertState("hello\n" + "one two \n")
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test insert delete previous word action`() {
typeTextInFile(
injector.parser.parseKeys("i" + "<C-W>" + "<ESC>"),

View File

@@ -99,7 +99,6 @@ class InsertNewLineAboveActionTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test insert new line above with multiple carets`() {
val before = """ I fou${c}nd it in a legendary land
| all rocks and laven${c}der and tufted grass,

View File

@@ -117,7 +117,6 @@ class InsertNewLineBelowActionTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test insert new line below with multiple carets`() {
val before = """ I fou${c}nd it in a legendary land
| all rocks and laven${c}der and tufted grass,
@@ -190,6 +189,7 @@ class InsertNewLineBelowActionTest : VimTestCase() {
performTest("o", after, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE)
}
@TestWithoutNeovim(reason = SkipNeovimReason.FOLDING, "Neovim doesn't support arbitrary folds")
fun `test insert new line below with folds 2`() {
val before = """I found it in a legendary land
|${c}all rocks [and lavender and tufted grass,

View File

@@ -28,7 +28,6 @@ import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class InsertTabActionTest : VimTestCase() {
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test insert tab`() {
setupChecks {
keyHandler = Checks.KeyHandlerMethod.DIRECT_TO_VIM

View File

@@ -57,7 +57,6 @@ class VisualBlockAppendActionTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test append in non block mode`() {
doTest(
"vwAHello<esc>",

View File

@@ -73,9 +73,7 @@ Xbar
ba_quux_r
""".trimIndent(),
VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE
""".trimIndent()
)
}
@@ -97,9 +95,7 @@ Xbar
quux spam eggs
""".trimIndent()
),
VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE
)
)
}
@@ -136,9 +132,7 @@ Xbar
ba_quux_r
""".trimIndent()
),
VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE
)
)
}
@@ -162,10 +156,7 @@ Xbar
where it was settled on some sodden sand
hard by the torrent of a mountain pass.
""".trimIndent(),
VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE
)
assertMode(VimStateMachine.Mode.COMMAND)
}
@TestWithoutNeovim(SkipNeovimReason.VISUAL_BLOCK_MODE)
@@ -179,7 +170,7 @@ Xbar
hard by the torrent of a mountain pass.
"""
doTest(
injector.parser.parseKeys("<C-V>" + "jjI" + " Hello " + "<ESC>"),
listOf("<C-V>" + "jjI" + " Hello " + "<ESC>"),
before.trimIndent(),
"""
A Discovery
@@ -189,14 +180,11 @@ Xbar
where it was s Hello ettled on some sodden sand
hard by the torrent of a mountain pass.
""".trimIndent(),
VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE
) {
it.inlayModel.addInlineElement(before.indexOf("found"), HintRenderer("Hello"))
it.inlayModel.addInlineElement(before.indexOf("l rocks"), HintRenderer("Hello"))
it.inlayModel.addInlineElement(before.indexOf("ere it"), HintRenderer("Hello"))
}
assertMode(VimStateMachine.Mode.COMMAND)
}
@TestWithoutNeovim(SkipNeovimReason.VISUAL_BLOCK_MODE)

View File

@@ -18,19 +18,48 @@
package org.jetbrains.plugins.ideavim.action.copy
import com.intellij.codeInsight.editorActions.CopyPastePostProcessor
import com.intellij.codeInsight.editorActions.CopyPastePreProcessor
import com.intellij.codeInsight.editorActions.TextBlockTransferableData
import com.intellij.openapi.editor.CaretStateTransferableData
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiFile
import com.intellij.testFramework.ExtensionTestUtil
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.SelectionType
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import com.maddyhome.idea.vim.newapi.vim
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
import org.jetbrains.plugins.ideavim.rangeOf
import org.junit.Test
import java.awt.datatransfer.Transferable
class PutTestAfterCursorActionTest : VimTestCase() {
fun `test platform handlers are called`() {
val extension = TestExtension()
ExtensionTestUtil.maskExtensions(
CopyPastePostProcessor.EP_NAME,
listOf(extension),
myFixture.testRootDisposable
)
ExtensionTestUtil.maskExtensions(
CopyPastePreProcessor.EP_NAME,
listOf(),
myFixture.testRootDisposable
)
setRegister('4', "XXX ")
doTest(
"\"4p",
"This is my$c text",
"This is my XXX$c text",
VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE
)
assertEquals(1, extension.calledExtractTransferableData)
}
fun `test put from number register`() {
setRegister('4', "XXX ")
doTest(
@@ -78,7 +107,6 @@ class PutTestAfterCursorActionTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
@Test
fun `test inserting same content to multiple carets`() {
val before = """
@@ -102,4 +130,24 @@ class PutTestAfterCursorActionTest : VimTestCase() {
""".trimIndent()
assertState(after)
}
private class TestExtension : CopyPastePostProcessor<TextBlockTransferableData>() {
var calledExtractTransferableData = 0
override fun collectTransferableData(
file: PsiFile,
editor: Editor,
startOffsets: IntArray?,
endOffsets: IntArray?,
): List<TextBlockTransferableData> {
return emptyList()
}
override fun extractTransferableData(content: Transferable): List<TextBlockTransferableData> {
calledExtractTransferableData += 1
return listOf(
// Just some random data
CaretStateTransferableData(intArrayOf(), intArrayOf())
)
}
}
}

View File

@@ -91,7 +91,7 @@ class YankVisualActionTest : VimTestCase() {
typeText(injector.parser.parseKeys("viw" + "y"))
val editor = myFixture.editor.vim
val lastRegister = injector.registerGroup.lastRegisterChar
val registers = editor.carets().map { it.registerStorage.getRegister(lastRegister)?.rawText }
val registers = editor.carets().map { it.registerStorage.getRegister(it, lastRegister)?.rawText }
assertEquals(listOf("found", "was"), registers)
}
@@ -165,7 +165,7 @@ class YankVisualActionTest : VimTestCase() {
typeText(injector.parser.parseKeys("V" + "y"))
val editor = myFixture.editor.vim
val lastRegister = injector.registerGroup.lastRegisterChar
val registers = editor.carets().map { it.registerStorage.getRegister(lastRegister)?.rawText }
val registers = editor.carets().map { it.registerStorage.getRegister(it, lastRegister)?.rawText }
assertEquals(
listOf("all rocks and lavender and tufted grass,\n", "hard by the torrent of a mountain pass.\n"),
registers

View File

@@ -19,13 +19,10 @@
package org.jetbrains.plugins.ideavim.action.motion.search
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.common.Direction
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
import javax.swing.KeyStroke
class SearchAgainPreviousActionTest : VimTestCase() {
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
@@ -36,14 +33,13 @@ class SearchAgainPreviousActionTest : VimTestCase() {
...${c}all it was settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
val keys = injector.parser.parseKeys("N")
val after = """
I found it in a legendary land
...${c}all rocks and lavender and tufted grass,
...all it was settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
doTestWithSearch(keys, before, after)
doTestWithSearch("N", before, after)
}
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
@@ -54,14 +50,13 @@ class SearchAgainPreviousActionTest : VimTestCase() {
...all it was .${c}all settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
val keys = injector.parser.parseKeys("N")
val after = """
I found it in a legendary land
...all rocks and lavender and tufted grass,
...${c}all it was .all settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
doTestWithSearch(keys, before, after)
doTestWithSearch("N", before, after)
}
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
@@ -72,14 +67,13 @@ class SearchAgainPreviousActionTest : VimTestCase() {
...all it was .all.${c}all settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
val keys = injector.parser.parseKeys("N")
val after = """
I found it in a legendary land
...all rocks and lavender and tufted grass,
...all it was .${c}all.all settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
doTestWithSearch(keys, before, after)
doTestWithSearch("N", before, after)
}
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
@@ -90,14 +84,13 @@ class SearchAgainPreviousActionTest : VimTestCase() {
...all it was settled on some sodden sand
...all by the torrent of a mountain pass
""".trimIndent().dotToTab()
val keys = injector.parser.parseKeys("N")
val after = """
I found it in a legendary land
...all rocks and lavender and tufted grass,
...all it was settled on some sodden sand
...${c}all by the torrent of a mountain pass
""".trimIndent().dotToTab()
doTestWithSearch(keys, before, after)
doTestWithSearch("N", before, after)
}
fun `test search previous after search command with offset`() {
@@ -174,8 +167,8 @@ class SearchAgainPreviousActionTest : VimTestCase() {
doTest(listOf(searchCommand("/land/1"), exCommand("s/and/or"), "G", "N"), before, after)
}
private fun doTestWithSearch(keys: List<KeyStroke>, before: String, after: String) {
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
private fun doTestWithSearch(keys: String, before: String, after: String) {
doTest(keys, before, after) {
VimPlugin.getSearch().setLastSearchState(it, "all", "", Direction.FORWARDS)
}
}

View File

@@ -18,8 +18,6 @@
package org.jetbrains.plugins.ideavim.action.motion.updown
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.vimLastColumn
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
@@ -36,12 +34,11 @@ class MotionUpActionTest : VimTestCase() {
I found it in a le${c}gendary land
all rocks and lavender and tufted grass,
""".trimIndent()
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
doTest(keys, before, after)
}
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test last column is incorrect`() {
val keys = injector.parser.parseKeys("k")
val before = """
I found it in a legendary land
all rocks and lave${c}nder and tufted grass,
@@ -50,7 +47,7 @@ class MotionUpActionTest : VimTestCase() {
I found it in a le${c}gendary land
all rocks and lavender and tufted grass,
""".trimIndent()
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest("k", before, after) {
it.caretModel.primaryCaret.vimLastColumn = 5
}
}
@@ -69,12 +66,11 @@ class MotionUpActionTest : VimTestCase() {
I found it in a legendary land
all rocks and lavender and tufted ${c}grass,
""".trimIndent()
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
doTest(keys, before, after)
}
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test last column wrong lastColumn`() {
val keys = injector.parser.parseKeys("k")
val before = """
I found it in a legendary land
all rocks and lavender and tufted ${c}grass,
@@ -83,7 +79,7 @@ class MotionUpActionTest : VimTestCase() {
I found it in a legendary lan${c}d
all rocks and lavender and tufted grass,
""".trimIndent()
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest("k", before, after) {
it.caretModel.primaryCaret.vimLastColumn = 0
}
}

View File

@@ -28,8 +28,6 @@ import com.maddyhome.idea.vim.helper.vimSelectionStart
import com.maddyhome.idea.vim.options.OptionConstants
import com.maddyhome.idea.vim.options.OptionScope
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
import org.jetbrains.plugins.ideavim.rangeOf
@@ -230,7 +228,6 @@ class VisualToggleCharacterModeActionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test enter visual with count after visual operation multicaret`() {
doTest(
listOf("vedx", "1v"),

View File

@@ -54,20 +54,18 @@ class CommandParserTest : VimTestCase() {
setupChecks {
caretShape = false
}
val keys = commandToKeys(">>")
val before = "I ${c}found it in a legendary land"
val after = "I :>>${c}found it in a legendary land"
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest(exCommand(">>"), before, after) {
VimPlugin.setEnabled(false)
}
}
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test turn off and on`() {
val keys = commandToKeys(">>")
val before = "I ${c}found it in a legendary land"
val after = " ${c}I found it in a legendary land"
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest(exCommand(">>"), before, after) {
VimPlugin.setEnabled(false)
VimPlugin.setEnabled(true)
}
@@ -75,10 +73,9 @@ class CommandParserTest : VimTestCase() {
@TestWithoutNeovim(reason = SkipNeovimReason.EDITOR_MODIFICATION)
fun `test turn off and on twice`() {
val keys = commandToKeys(">>")
val before = "I ${c}found it in a legendary land"
val after = " ${c}I found it in a legendary land"
doTest(keys, before, after, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE) {
doTest(exCommand(">>"), before, after) {
VimPlugin.setEnabled(false)
VimPlugin.setEnabled(true)
VimPlugin.setEnabled(true)

View File

@@ -68,7 +68,6 @@ class MultipleCaretsTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testJoinLines() {
val before = "qwe\n" + "r${c}ty\n" + "asd\n" + "fg${c}h\n" + "zxc\n" + "vbn\n"
configureByText(before)
@@ -86,7 +85,6 @@ class MultipleCaretsTest : VimTestCase() {
// myFixture.checkResult(after)
// }
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testCopyText() {
val before = "qwe\n" + "rty\n" + "a${c}sd\n" + "fg${c}h\n" + "zxc\n" + "vbn\n"
configureByText(before)
@@ -104,7 +102,6 @@ class MultipleCaretsTest : VimTestCase() {
// myFixture.checkResult(after)
// }
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testPutText() {
// This test produces double ${c}zxc on 3rd line if non-idea paste is used
val before = """
@@ -173,7 +170,6 @@ class MultipleCaretsTest : VimTestCase() {
// myFixture.checkResult(after)
// }
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testMoveTextBeforeCarets() {
val before = "qwe\n" + "rty\n" + "${c}asd\n" + "fgh\n" + "z${c}xc\n" + "vbn\n"
configureByText(before)
@@ -182,7 +178,6 @@ class MultipleCaretsTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testMoveTextAfterCarets() {
val before = "q${c}we\n" + "rty\n" + "${c}asd\n" + "fgh\n" + "zxc\n" + "vbn\n"
configureByText(before)
@@ -191,7 +186,6 @@ class MultipleCaretsTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testMoveTextBetweenCarets() {
val before = "q${c}we\n" + "rty\n" + "${c}asd\n" + "fgh\n" + "zxc\n" + "vbn\n"
configureByText(before)
@@ -200,7 +194,6 @@ class MultipleCaretsTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testYankLines() {
val before = """qwe
|rt${c}y
@@ -230,7 +223,6 @@ class MultipleCaretsTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun testDeleteLines() {
val before = """qwe
|r${c}ty

View File

@@ -19,6 +19,7 @@
package org.jetbrains.plugins.ideavim.ex.implementation.commands
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import org.jetbrains.plugins.ideavim.VimTestCase
/**
@@ -130,6 +131,22 @@ class CmdCommandTest : VimTestCase() {
assertPluginError(false)
}
fun `test add command with range`() {
VimPlugin.getCommand().resetAliases()
configureByText("\n")
typeText(commandToKeys("command! -range Error echo <args>"))
assertPluginError(false)
assertEquals("'-range' is not supported by `command`", injector.messages.getStatusBarMessage())
}
fun `test add command with complete`() {
VimPlugin.getCommand().resetAliases()
configureByText("\n")
typeText(commandToKeys("command! -complete=color Error echo <args>"))
assertPluginError(false)
assertEquals("'-complete' is not supported by `command`", injector.messages.getStatusBarMessage())
}
fun `test add command with arguments short`() {
VimPlugin.getCommand().resetAliases()
configureByText("\n")

View File

@@ -21,8 +21,6 @@ package org.jetbrains.plugins.ideavim.ex.implementation.commands
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class JoinLinesCommandTest : VimTestCase() {
@@ -97,7 +95,6 @@ class JoinLinesCommandTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test join multicaret`() {
configureByText(
"""

View File

@@ -121,6 +121,22 @@ n ,f <Plug>Foo
assertState("quux\n")
}
fun testddWithMapping() {
configureByText(
"""
Hello$c 1
Hello 2
""".trimIndent()
)
typeText(commandToKeys("nmap dc k"))
typeText(injector.parser.parseKeys("dd"))
assertState(
"""
Hello 2
""".trimIndent()
)
}
fun testNonRecursiveMapping() {
configureByText("\n")
typeText(commandToKeys("inoremap a b"))

View File

@@ -38,8 +38,8 @@ class MarksCommandTest : VimTestCase() {
assertState(
"""I found it in a legendary land
|all rocks and lavender and tufted grass,
|${s}all rocks and lavender and tufted grass,
|${se}hard by the torrent of a mountain pass.
|${s}all rocks and lavender and tufted grass,$se
|hard by the torrent of a mountain pass.
""".trimMargin()
)
}

View File

@@ -102,7 +102,6 @@ class ShiftLeftCommandTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test multiple carets`() {
val before = """ I found it in a legendary land
|${c}all rocks and lavender and tufted grass,

View File

@@ -83,7 +83,6 @@ class ShiftRightCommandTest : VimTestCase() {
assertState(after)
}
@TestWithoutNeovim(SkipNeovimReason.MULTICARET)
fun `test multiple carets`() {
val before = """ I found it in a legendary land
|${c}all rocks and lavender and tufted grass,

View File

@@ -0,0 +1,33 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2022 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.jetbrains.plugins.ideavim.ex.implementation.expressions
import com.maddyhome.idea.vim.helper.StringHelper.parseKeys
import com.maddyhome.idea.vim.vimscript.model.expressions.Register
import org.jetbrains.plugins.ideavim.VimTestCase
import org.jetbrains.plugins.ideavim.ex.evaluate
class ExpressionTest : VimTestCase() {
fun `test multiline register content`() {
configureByText("${c}Oh\nHi\nMark\n")
typeText(parseKeys("VGy"))
assertEquals("Oh\nHi\nMark\n", Register('"').evaluate().toString())
}
}

View File

@@ -41,8 +41,6 @@ import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.options.OptionScope
import junit.framework.TestCase
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class OpMappingTest : VimTestCase() {
@@ -68,7 +66,6 @@ class OpMappingTest : VimTestCase() {
super.tearDown()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test simple delete`() {
doTest(
"dI",
@@ -79,7 +76,6 @@ class OpMappingTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test simple delete backwards`() {
doTest(
"dP",
@@ -90,7 +86,6 @@ class OpMappingTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test delete emulate inclusive`() {
doTest(
"dU",
@@ -101,7 +96,6 @@ class OpMappingTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test linewise delete`() {
doTest(
"dO",
@@ -124,7 +118,6 @@ class OpMappingTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test disable extension via set`() {
configureByText("${c}I found it in a legendary land")
typeText(injector.parser.parseKeys("Q"))
@@ -139,7 +132,6 @@ class OpMappingTest : VimTestCase() {
assertState("I ${c}found it in a legendary land")
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test disable extension as extension point`() {
configureByText("${c}I found it in a legendary land")
typeText(injector.parser.parseKeys("Q"))
@@ -158,7 +150,6 @@ class OpMappingTest : VimTestCase() {
assertState("I ${c}found it in a legendary land")
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test disable disposed extension`() {
configureByText("${c}I found it in a legendary land")
typeText(injector.parser.parseKeys("Q"))
@@ -176,7 +167,6 @@ class OpMappingTest : VimTestCase() {
assertState("I ${c}found it in a legendary land")
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test delayed action`() {
configureByText("${c}I found it in a legendary land")
typeText(injector.parser.parseKeys("R"))
@@ -191,7 +181,6 @@ class OpMappingTest : VimTestCase() {
/**
* This test tests an intentionally incorrectly implemented action
*/
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test delayed incorrect action`() {
configureByText("${c}I found it in a legendary land")
typeText(injector.parser.parseKeys("E"))
@@ -221,21 +210,18 @@ class PlugExtensionsTest : VimTestCase() {
super.tearDown()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test enable via plug`() {
injector.vimscriptExecutor.execute("Plug 'MyTest'", false)
assertTrue(extension.ext.initialized)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test enable via plugin`() {
injector.vimscriptExecutor.execute("Plugin 'MyTest'", false)
assertTrue(extension.ext.initialized)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test enable via plug and disable via set`() {
injector.vimscriptExecutor.execute("Plug 'MyTest'")
injector.vimscriptExecutor.execute("set noTestExtension")
@@ -261,7 +247,6 @@ class PlugMissingKeysTest : VimTestCase() {
super.tearDown()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test missing keys`() {
executeLikeVimrc(
"map myKey <Plug>TestMissing",
@@ -277,7 +262,6 @@ class PlugMissingKeysTest : VimTestCase() {
TestCase.assertEquals(injector.parser.parseKeys("L"), iKeyMappings.first().first)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test missing keys enable plugin first`() {
executeLikeVimrc(
"Plug 'MyTest'",
@@ -293,7 +277,6 @@ class PlugMissingKeysTest : VimTestCase() {
TestCase.assertEquals(injector.parser.parseKeys("L"), iKeyMappings.first().first)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test packadd`() {
assertFalse(injector.optionService.isSet(OptionScope.GLOBAL, "matchit"))
executeLikeVimrc(
@@ -303,7 +286,6 @@ class PlugMissingKeysTest : VimTestCase() {
assertTrue(injector.optionService.isSet(OptionScope.GLOBAL, "matchit"))
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test packadd ex`() {
assertFalse(injector.optionService.isSet(OptionScope.GLOBAL, "matchit"))
executeLikeVimrc(

View File

@@ -22,8 +22,6 @@ import com.google.common.collect.Lists;
import com.maddyhome.idea.vim.api.VimInjectorKt;
import com.maddyhome.idea.vim.command.VimStateMachine;
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers;
import org.jetbrains.plugins.ideavim.SkipNeovimReason;
import org.jetbrains.plugins.ideavim.TestWithoutNeovim;
import org.jetbrains.plugins.ideavim.VimTestCase;
import java.util.Collections;
@@ -41,7 +39,7 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimInjectorKt.getInjector().getVimscriptExecutor().execute("let argtextobj_pairs='" + value + "'", true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testDeleteAnArgument() {
doTest(Lists.newArrayList("daa"), "function(int arg1, char<caret>* arg2=\"a,b,c(d,e)\")",
"function(int arg1<caret>)", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -49,13 +47,11 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testChangeInnerArgument() {
doTest(Lists.newArrayList("cia"), "function(int arg1, char<caret>* arg2=\"a,b,c(d,e)\")",
"function(int arg1, <caret>)", VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testSmartArgumentRecognition() {
doTest(Lists.newArrayList("dia"), "function(1, (20<caret>*30)+40, somefunc2(3, 4))",
"function(1, <caret>, somefunc2(3, 4))", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -63,7 +59,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
"function(1, (20*30)+40, somefunc2(<caret>4))", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testIgnoreQuotedArguments() {
doTest(Lists.newArrayList("daa"), "function(int arg1, char* arg2=a,b,c(<caret>arg,e))",
"function(int arg1, char* arg2=a,b,c(<caret>e))", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -75,7 +70,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
"function(int arg1<caret>)", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testDeleteTwoArguments() {
doTest(Lists.newArrayList("d2aa"), "function(int <caret>arg1, char* arg2=\"a,b,c(d,e)\")", "function(<caret>)",
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -91,7 +85,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
"function(int arg1, <caret>)", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testSelectTwoArguments() {
doTest(Lists.newArrayList("v2aa"), "function(int <caret>arg1, char* arg2=\"a,b,c(d,e)\", bool arg3)",
"function(<selection>int arg1, char* arg2=\"a,b,c(d,e)\", </selection>bool arg3)",
@@ -101,14 +94,12 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testArgumentsInsideAngleBrackets() {
setArgTextObjPairsVariable("(:),<:>");
doTest(Lists.newArrayList("dia"), "std::vector<int, std::unique_p<caret>tr<bool>> v{};",
"std::vector<int, <caret>> v{};", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testWhenUnbalancedHigherPriorityPairIsUsed() {
setArgTextObjPairsVariable("{:},(:)");
doTest(Lists.newArrayList("dia"), "namespace foo { void foo(int arg1, bool arg2<caret> { body }\n}",
@@ -117,7 +108,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
"namespace foo { <caret>, bool arg2 { body }\n}", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testBracketPriorityToHangleShiftOperators() {
doTest(Lists.newArrayList("dia"), "foo(30 << 10, 20 << <caret>3) >> 17", "foo(30 << 10, <caret>) >> 17",
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -127,7 +117,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testEmptyFile() {
assertPluginError(false);
doTest(Lists.newArrayList("daa"), "<caret>", "<caret>", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -136,7 +125,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
assertPluginError(true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testEmptyLine() {
assertPluginError(false);
doTest(Lists.newArrayList("daa"), "<caret>\n", "<caret>\n", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -145,7 +133,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
assertPluginError(true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testEmptyArg() {
assertPluginError(false);
doTest(Lists.newArrayList("daa"), "foo(<caret>)", "foo(<caret>)", VimStateMachine.Mode.COMMAND,
@@ -156,7 +143,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
assertPluginError(true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testSkipCommasInsideNestedPairs() {
final String before =
"void foo(int arg1)\n{" + " methodCall(arg1, \"{ arg1 , 2\");\n" + " otherMeth<caret>odcall(arg, 3);\n" + "}";
@@ -164,19 +150,16 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
assertPluginError(true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testHandleNestedPairs() {
doTest(Lists.newArrayList("dia"), "foo(arg1, arr<caret>ay[someexpr(Class{arg1 << 3, arg2})] + 3)\n{",
"foo(arg1, <caret>)\n{", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testHandleNestedParenthesisForASingleArgument() {
doTest(Lists.newArrayList("dia"), "foo((20*<caret>30))", "foo(<caret>)", VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testHandleImbalancedPairs() {
doTest(Lists.newArrayList("dia"), "foo(arg1, ba<caret>r(not-an-arg{body", "foo(arg1, ba<caret>r(not-an-arg{body",
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
@@ -192,14 +175,12 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
assertPluginError(true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testArgumentBoundsSearchIsLimitedByLineCount() {
final String before = "foo(\n" + String.join("", Collections.nCopies(10, " arg,\n")) + " last<caret>Arg" + ")";
doTest(Lists.newArrayList("dia"), before, before, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
assertPluginError(true);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testExtendVisualSelection() {
doTest(Lists.newArrayList("vllia"), "function(int arg1, ch<caret>ar* arg2=\"a,b,c(d,e)\")",
"function(int arg1, <selection>char* arg2=\"a,b,c(d,e)\"</selection>)", VimStateMachine.Mode.VISUAL,
@@ -209,13 +190,11 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.SubMode.VISUAL_CHARACTER);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testExtendVisualSelectionUsesCaretPos() {
doTest(Lists.newArrayList("vllia"), "fu<caret>n(arg)", "fun(<selection>arg</selection>)", VimStateMachine.Mode.VISUAL,
VimStateMachine.SubMode.VISUAL_CHARACTER);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testDeleteArrayArgument() {
setArgTextObjPairsVariable("[:],(:)");
doTest(Lists.newArrayList("dia"), "function(int a, String[<caret>] b)", "function(int a, <caret>)",
@@ -224,7 +203,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testDeleteInClass() {
doTest(Lists.newArrayList("dia"), "class MyClass{ public int myFun() { some<caret>Call(); } }",
"class MyClass{ public int myFun() { some<caret>Call(); } }", VimStateMachine.Mode.COMMAND,
@@ -234,7 +212,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testFunctionWithSpaceAfterName() {
doTest(Lists.newArrayList("dia"), "function (int <caret>a)", "function (int <caret>a)", VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE);
@@ -243,7 +220,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
}
@VimBehaviorDiffers(originalVimAfter = "function (int <caret>a, int b)", description = "Should work the same as testFunctionWithSpaceAfterName")
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testFunctionWithSpaceAfterNameWithTwoArgs() {
doTest(Lists.newArrayList("dia"), "function (int <caret>a, int b)", "function (, int b)", VimStateMachine.Mode.COMMAND,
VimStateMachine.SubMode.NONE);
@@ -251,7 +227,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testDeleteInIf() {
doTest(Lists.newArrayList("dia"), "class MyClass{ public int myFun() { if (tr<caret>ue) { somFunction(); } } }",
"class MyClass{ public int myFun() { if (tr<caret>ue) { somFunction(); } } }", VimStateMachine.Mode.COMMAND,
@@ -261,7 +236,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
VimStateMachine.SubMode.NONE);
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testParseVariablePairs() {
assertPluginError(false);
setArgTextObjPairsVariable("[:], (:)");
@@ -306,7 +280,6 @@ public class VimArgTextObjExtensionTest extends VimTestCase {
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
public void testCppLambaArguments() {
setArgTextObjPairsVariable("[:],(:),{:},<:>");
doTest(Lists.newArrayList("daa"),

View File

@@ -22,21 +22,17 @@ import com.intellij.ide.highlighter.HtmlFileType
import com.intellij.ide.highlighter.JavaFileType
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
import org.jetbrains.yaml.YAMLFileType
@Suppress("SpellCheckingInspection")
class CommentaryExtensionTest : VimTestCase() {
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
override fun setUp() {
super.setUp()
enableExtensions("commentary")
}
// |gc| |l| + move caret
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testBlockCommentSingle() {
doTest(
"gcll",
@@ -48,7 +44,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |iw|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testBlockCommentInnerWord() {
doTest(
"gciw",
@@ -60,7 +55,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |iw|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testBlockCommentTillForward() {
doTest(
"gct{",
@@ -71,7 +65,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |ab|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testBlockCommentOuterParens() {
doTest(
"gcab",
@@ -86,7 +79,6 @@ class CommentaryExtensionTest : VimTestCase() {
* otherwise, they are incredibly difficult to undo
*/
// |gc| |j|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentDown() {
doTest(
"gcj",
@@ -97,7 +89,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentDownPreservesAbsoluteCaretLocation() {
doTest(
"gcj",
@@ -109,7 +100,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |ip|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentInnerParagraph() {
doTest(
"gcip",
@@ -121,7 +111,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |ip|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentSingleLineInnerParagraph() {
doTest(
"gcip",
@@ -132,7 +121,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
/* Ensure uncommenting works as well */ // |gc| |ip|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineUncommentInnerParagraph() {
doTest(
"gcip",
@@ -145,7 +133,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |ip|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineUncommentSingleLineInnerParagraph() {
doTest(
"gcip",
@@ -156,7 +143,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
/* Visual mode */ // |gc| |ip|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentVisualInnerParagraph() {
doTest(
"vipgc",
@@ -168,7 +154,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gc| |ip|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineUncommentVisualInnerParagraph() {
doTest(
"vipgc",
@@ -180,7 +165,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
/* Special shortcut gcc is always linewise */ // |gcc|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentShortcut() {
doTest(
"gccj",
@@ -193,7 +177,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gcc|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineCommentShortcutSetsCaretToMotionLocation() {
doTest(
"gcc",
@@ -205,7 +188,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gcc|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testLineUncommentShortcut() {
doTest(
"gcc",
@@ -218,7 +200,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
// |gcc|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun testHTMLCommentShortcut() {
doTest(
"gcc",
@@ -231,7 +212,6 @@ class CommentaryExtensionTest : VimTestCase() {
assertSelection(null)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test comment motion repeat`() {
doTest(
"gcj" + "jj.",
@@ -251,7 +231,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test comment motion right repeat`() {
doTest(
"gciw" + "jj.",
@@ -271,7 +250,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test comment line repeat`() {
doTest(
"gcc" + "j.",
@@ -288,7 +266,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
@VimBehaviorDiffers(description = "IntelliJ's uncomment leaves the leading whitespace")
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test uncomment with gcgc`() {
doTest(
"gcgc",
@@ -309,7 +286,6 @@ class CommentaryExtensionTest : VimTestCase() {
}
@VimBehaviorDiffers(description = "IntelliJ's uncomment leaves the leading whitespace")
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test uncomment with gcu`() {
doTest(
"gcu",
@@ -329,7 +305,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test comment line with count`() {
// Caret position is kept as the position *before* the commenting. This is how Vim works
doTest(
@@ -354,7 +329,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment`() {
doTest(
"dgc",
@@ -369,7 +343,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes multiple line comments`() {
doTest(
"dgc",
@@ -388,7 +361,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes multiple line comments 2`() {
doTest(
"dgc",
@@ -407,7 +379,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment from leading whitespace`() {
doTest(
"dgc",
@@ -422,7 +393,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment from leading whitespace 2`() {
doTest(
"dgc",
@@ -439,7 +409,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment from leading whitespace 3`() {
doTest(
"dgc",
@@ -458,7 +427,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment from trailing whitespace`() {
doTest(
"dgc",
@@ -476,7 +444,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comments separated by whitespace`() {
doTest(
"dgc",
@@ -493,7 +460,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes disjointed single line comments from whitespace`() {
doTest(
"dgc",
@@ -515,7 +481,6 @@ class CommentaryExtensionTest : VimTestCase() {
final Int value = 42;
"""
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment from current line`() {
doTest(
"dgc",
@@ -531,7 +496,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes single line comment from current line 2`() {
doTest(
"dgc",
@@ -548,7 +512,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object does not delete line with comment and text`() {
doTest(
"dgc",
@@ -562,7 +525,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes block comment`() {
doTest(
"dgc",
@@ -577,7 +539,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes multi-line block comment`() {
doTest(
"dgc",
@@ -594,7 +555,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes adjoining multi-line block comments`() {
doTest(
"dgc",
@@ -614,7 +574,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes adjoining multi-line block comments 2`() {
doTest(
"dgc",
@@ -635,7 +594,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object does not delete line with text and block comment`() {
doTest(
"dgc",
@@ -649,7 +607,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes JavaDoc comment`() {
doTest(
"dgc",
@@ -670,7 +627,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes JavaDoc comment from leading whitespace`() {
doTest(
"dgc",
@@ -692,7 +648,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes JavaDoc comment and adjoining comments`() {
doTest(
"dgc",
@@ -714,7 +669,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test text object deletes JavaDoc comment and adjoining comments separated by whitespace`() {
doTest(
"dgc",
@@ -739,7 +693,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test Commentary command comments current line`() {
doTest(
":Commentary<CR>",
@@ -757,7 +710,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test Commentary command comments simple line range`() {
doTest(
":2Commentary<CR>",
@@ -775,7 +727,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test Commentary command comments line range`() {
doTest(
":1,3Commentary<CR>",
@@ -804,7 +755,6 @@ class CommentaryExtensionTest : VimTestCase() {
"Note that Escape exits Visual mode, but leaves the caret where it is",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test Commentary command comments visual range`() {
doTest(
"Vjj" + ":Commentary<CR>",
@@ -822,7 +772,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test Commentary command comments search range`() {
doTest(
":g/value2/Commentary<CR>",
@@ -844,7 +793,6 @@ class CommentaryExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test block comment falls back to line comment when not available`() {
doTest(
"gcw",

View File

@@ -23,8 +23,6 @@ import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.extension.exchange.VimExchangeExtension
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class VimExchangeExtensionTest : VimTestCase() {
@@ -35,7 +33,6 @@ class VimExchangeExtensionTest : VimTestCase() {
}
// |cx|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words left to right`() {
doTest(
listOf("cxe", "w", "cxe"),
@@ -47,7 +44,6 @@ class VimExchangeExtensionTest : VimTestCase() {
}
// |cx|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words dot repeat`() {
doTest(
listOf("cxiw", "w", "."),
@@ -59,7 +55,6 @@ class VimExchangeExtensionTest : VimTestCase() {
}
// |cx|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words right to left`() {
doTest(
listOf("cxe", "b", "cxe"),
@@ -71,7 +66,6 @@ class VimExchangeExtensionTest : VimTestCase() {
}
// |cx|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words right to left with dot`() {
doTest(
listOf("cxe", "b", "."),
@@ -83,7 +77,6 @@ class VimExchangeExtensionTest : VimTestCase() {
}
// |X|
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual exchange words left to right`() {
doTest(
listOf("veX", "w", "veX"),
@@ -99,7 +92,6 @@ class VimExchangeExtensionTest : VimTestCase() {
originalVimAfter = "The ${c}brown catch over the lazy dog",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual exchange words from inside`() {
doTest(
listOf("veX", "b", "v3e", "X"),
@@ -115,7 +107,6 @@ class VimExchangeExtensionTest : VimTestCase() {
originalVimAfter = "The brown ${c}catch over the lazy dog",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual exchange words from outside`() {
doTest(
listOf("v3e", "X", "w", "veX"),
@@ -136,7 +127,6 @@ class VimExchangeExtensionTest : VimTestCase() {
""",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange lines top down`() {
doTest(
listOf("cxx", "j", "cxx"),
@@ -165,7 +155,6 @@ class VimExchangeExtensionTest : VimTestCase() {
""",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange lines top down with dot`() {
doTest(
listOf("cxx", "j", "."),
@@ -192,7 +181,6 @@ class VimExchangeExtensionTest : VimTestCase() {
lazy dog
"""
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange to the line end`() {
doTest(
listOf("v$", "X", "jj^ve", "X"),
@@ -221,7 +209,6 @@ class VimExchangeExtensionTest : VimTestCase() {
""",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange visual lines`() {
doTest(
listOf("Vj", "X", "jj", "Vj", "X"),
@@ -243,7 +230,6 @@ class VimExchangeExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual char highlighter`() {
val before = """
The ${c}quick
@@ -260,7 +246,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual line highdhitligthhter`() {
val before = """
The ${c}quick
@@ -277,7 +262,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test till the line end highlighter`() {
val before = """
The ${c}quick
@@ -292,7 +276,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test pre line end highlighter`() {
val before = """
The ${c}quick
@@ -307,7 +290,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test pre pre line end highlighter`() {
val before = """
The ${c}quick
@@ -322,7 +304,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test to file end highlighter`() {
val before = """
The quick
@@ -344,7 +325,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test to file end with new line highlighter`() {
val before = """
The quick
@@ -367,7 +347,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test back selection`() {
val before = """
The quick
@@ -383,7 +362,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test back selection exchange 1`() {
doTest(
listOf("vb", "X", "bevb", "X"),
@@ -394,7 +372,6 @@ class VimExchangeExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test back selection exchange 2`() {
doTest(
listOf("vb", "X", "wve", "X"),
@@ -405,7 +382,6 @@ class VimExchangeExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test back selection exchange 3`() {
doTest(
listOf("ve", "X", "wevb", "X"),
@@ -416,7 +392,6 @@ class VimExchangeExtensionTest : VimTestCase() {
)
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test change with down motion`() {
val before = """
The ${c}quick
@@ -436,7 +411,6 @@ class VimExchangeExtensionTest : VimTestCase() {
exitExchange()
}
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test cxx`() {
val before = """
The ${c}quick

View File

@@ -25,8 +25,6 @@ import com.maddyhome.idea.vim.extension.exchange.VimExchangeExtension
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import com.maddyhome.idea.vim.options.OptionConstants
import org.jetbrains.plugins.ideavim.OptionValueType
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimOptionTestCase
import org.jetbrains.plugins.ideavim.VimOptionTestConfiguration
import org.jetbrains.plugins.ideavim.VimTestOption
@@ -40,7 +38,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
// |cx|
@VimOptionTestConfiguration(VimTestOption(OptionConstants.clipboardName, OptionValueType.STRING, "unnamed"))
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words left to right`() {
doTest(
listOf("cxe", "w", "cxe"),
@@ -53,7 +50,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
// |cx|
@VimOptionTestConfiguration(VimTestOption(OptionConstants.clipboardName, OptionValueType.STRING, "unnamed"))
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words dot repeat`() {
doTest(
listOf("cxiw", "w", "."),
@@ -66,7 +62,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
// |cx|
@VimOptionTestConfiguration(VimTestOption(OptionConstants.clipboardName, OptionValueType.STRING, "unnamed"))
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words right to left`() {
doTest(
listOf("cxe", "b", "cxe"),
@@ -79,7 +74,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
// |cx|
@VimOptionTestConfiguration(VimTestOption(OptionConstants.clipboardName, OptionValueType.STRING, "unnamed"))
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange words right to left with dot`() {
doTest(
listOf("cxe", "b", "."),
@@ -92,7 +86,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
// |X|
@VimOptionTestConfiguration(VimTestOption(OptionConstants.clipboardName, OptionValueType.STRING, "unnamed"))
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual exchange words left to right`() {
doTest(
listOf("veX", "w", "veX"),
@@ -109,7 +102,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
originalVimAfter = "The ${c}brown catch over the lazy dog",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual exchange words from inside`() {
doTest(
listOf("veX", "b", "v3e", "X"),
@@ -126,7 +118,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
originalVimAfter = "The brown ${c}catch over the lazy dog",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test visual exchange words from outside`() {
doTest(
listOf("v3e", "X", "w", "veX"),
@@ -148,7 +139,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
""",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange lines top down`() {
doTest(
listOf("cxx", "j", "cxx"),
@@ -178,7 +168,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
""",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange lines top down with dot`() {
doTest(
listOf("cxx", "j", "."),
@@ -206,7 +195,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
lazy dog
"""
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange to the line end`() {
doTest(
listOf("v$", "X", "jj^ve", "X"),
@@ -236,7 +224,6 @@ class VimExchangeWithClipboardTest : VimOptionTestCase(OptionConstants.clipboard
""",
shouldBeFixed = true
)
@TestWithoutNeovim(SkipNeovimReason.PLUGIN)
fun `test exchange visual lines`() {
doTest(
listOf("Vj", "X", "jj", "Vj", "X"),

View File

@@ -23,8 +23,6 @@ import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.extension.highlightedyank.DEFAULT_HIGHLIGHT_DURATION
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
import org.jetbrains.plugins.ideavim.assertHappened
@@ -34,7 +32,6 @@ class VimHighlightedYankTest : VimTestCase() {
enableExtensions("highlightedyank")
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test highlighting whole line when whole line is yanked`() {
doTest("yy", code, code, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
@@ -42,7 +39,6 @@ class VimHighlightedYankTest : VimTestCase() {
assertHighlighterRange(1, 40, getFirstHighlighter())
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test highlighting single word when single word is yanked`() {
doTest("yiw", code, code, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
@@ -58,7 +54,6 @@ class VimHighlightedYankTest : VimTestCase() {
assertHighlighterRange(40, 59, getFirstHighlighter())
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test removing previous highlight when entering insert mode`() {
doTest("yyi", code, code, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE)
@@ -110,7 +105,6 @@ class VimHighlightedYankTest : VimTestCase() {
}
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test highlighting with multiple cursors`() {
doTest("yiw", codeWithMultipleCurors, codeWithMultipleCurors, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
@@ -121,14 +115,12 @@ class VimHighlightedYankTest : VimTestCase() {
assertHighlighterRange(28, 31, highlighters[2])
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test clearing all highlighters with multiple cursors`() {
doTest("yiwi", codeWithMultipleCurors, codeWithMultipleCurors, VimStateMachine.Mode.INSERT, VimStateMachine.SubMode.NONE)
assertAllHighlightersCount(0)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test highlighting for a correct default amount of time`() {
doTest("yiw", code, code, VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE)
@@ -137,7 +129,6 @@ class VimHighlightedYankTest : VimTestCase() {
}
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test highlighting for a correct user provided amount of time`() {
configureByJavaText(code)
typeText(injector.parser.parseKeys(":let g:highlightedyank_highlight_duration = \"1000\"<CR>"))

View File

@@ -18,9 +18,6 @@
package org.jetbrains.plugins.ideavim.extension.matchit
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class MatchitCMakeTest : VimTestCase() {
@@ -30,7 +27,6 @@ class MatchitCMakeTest : VimTestCase() {
enableExtensions("matchit")
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from if to else`() {
doTest(
"%",
@@ -48,11 +44,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Non-linux system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from else to endif`() {
doTest(
"%",
@@ -70,11 +65,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Non-linux system")
${c}endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to if`() {
doTest(
"%",
@@ -92,11 +86,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Non-linux system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from if to elseif in if-else structure`() {
doTest(
"%",
@@ -122,11 +115,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from elseif to elseif`() {
doTest(
"%",
@@ -152,11 +144,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from elseif to else`() {
doTest(
"%",
@@ -182,11 +173,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from else to endif in if-else structure`() {
doTest(
"%",
@@ -212,11 +202,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
${c}endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to if in if-else structure`() {
doTest(
"%",
@@ -242,11 +231,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from foreach to endforeach`() {
doTest(
"%",
@@ -260,11 +248,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
${c}endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endforeach to foreach`() {
doTest(
"%",
@@ -278,11 +265,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from foreach to break`() {
doTest(
"%",
@@ -302,11 +288,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from break to endforeach`() {
doTest(
"%",
@@ -326,11 +311,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
${c}endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from while to endwhile`() {
doTest(
"%",
@@ -344,11 +328,10 @@ class MatchitCMakeTest : VimTestCase() {
MATH(EXPR VAR "${"\${index}"}+1")
${c}endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endwhile to while`() {
doTest(
"%",
@@ -362,11 +345,10 @@ class MatchitCMakeTest : VimTestCase() {
MATH(EXPR VAR "${"\${index}"}+1")
endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from while to break`() {
doTest(
"%",
@@ -386,11 +368,10 @@ class MatchitCMakeTest : VimTestCase() {
endif()
endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from break to endwhile`() {
doTest(
"%",
@@ -410,11 +391,10 @@ class MatchitCMakeTest : VimTestCase() {
endif()
${c}endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from function to endfunction`() {
doTest(
"%",
@@ -428,11 +408,10 @@ class MatchitCMakeTest : VimTestCase() {
bar(x y z)
${c}endfunction()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endfunction to function`() {
doTest(
"%",
@@ -446,11 +425,10 @@ class MatchitCMakeTest : VimTestCase() {
bar(x y z)
endfunction()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from macro to endmacro`() {
doTest(
"%",
@@ -464,11 +442,10 @@ class MatchitCMakeTest : VimTestCase() {
message("arg = ${"\${arg}\""}")
${c}endmacro()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endmacro to macro`() {
doTest(
"%",
@@ -482,13 +459,12 @@ class MatchitCMakeTest : VimTestCase() {
message("arg = ${"\${arg}\""}")
endmacro()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
// Tests for reverse motion
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from if to endif`() {
doTest(
"g%",
@@ -506,11 +482,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Non-linux system")
${c}endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from else to if`() {
doTest(
"g%",
@@ -528,11 +503,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Non-linux system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to else`() {
doTest(
"g%",
@@ -550,11 +524,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Non-linux system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from if to endif in if-else block`() {
doTest(
"g%",
@@ -580,11 +553,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
${c}endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from elseif to if`() {
doTest(
"g%",
@@ -610,11 +582,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from elseif in else block to elseif`() {
doTest(
"g%",
@@ -640,11 +611,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from else to elseif`() {
doTest(
"g%",
@@ -670,11 +640,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to else in if-else block`() {
doTest(
"g%",
@@ -700,11 +669,10 @@ class MatchitCMakeTest : VimTestCase() {
message("Unknown system")
endif()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from foreach to endforeach`() {
doTest(
"g%",
@@ -718,11 +686,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
${c}endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endforeach to foreach`() {
doTest(
"g%",
@@ -736,11 +703,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from foreach to endforeach over a break`() {
doTest(
"g%",
@@ -760,11 +726,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
${c}endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endforeach to break`() {
doTest(
"g%",
@@ -784,11 +749,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from break to foreach`() {
doTest(
"g%",
@@ -808,11 +772,10 @@ class MatchitCMakeTest : VimTestCase() {
message(STATUS "X=${"\${X}"}")
endforeach()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from while to endwhile`() {
doTest(
"g%",
@@ -826,11 +789,10 @@ class MatchitCMakeTest : VimTestCase() {
MATH(EXPR VAR "${"\${index}"}+1")
${c}endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endwhile to while`() {
doTest(
"g%",
@@ -844,11 +806,10 @@ class MatchitCMakeTest : VimTestCase() {
MATH(EXPR VAR "${"\${index}"}+1")
endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from while to endwhile over a break`() {
doTest(
"g%",
@@ -868,11 +829,10 @@ class MatchitCMakeTest : VimTestCase() {
endif()
${c}endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endwhile to break`() {
doTest(
"g%",
@@ -892,11 +852,10 @@ class MatchitCMakeTest : VimTestCase() {
endif()
endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from break to while`() {
doTest(
"g%",
@@ -916,11 +875,10 @@ class MatchitCMakeTest : VimTestCase() {
endif()
endwhile()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from function to endfunction`() {
doTest(
"g%",
@@ -934,11 +892,10 @@ class MatchitCMakeTest : VimTestCase() {
bar(x y z)
${c}endfunction()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endfunction to function`() {
doTest(
"g%",
@@ -952,11 +909,10 @@ class MatchitCMakeTest : VimTestCase() {
bar(x y z)
endfunction()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from macro to endmacro`() {
doTest(
"g%",
@@ -970,11 +926,10 @@ class MatchitCMakeTest : VimTestCase() {
message("arg = ${"\${arg}\""}")
${c}endmacro()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endmacro to macro`() {
doTest(
"g%",
@@ -988,7 +943,7 @@ class MatchitCMakeTest : VimTestCase() {
message("arg = ${"\${arg}\""}")
endmacro()
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "CMakeLists.txt"
fileName = "CMakeLists.txt"
)
}
}

View File

@@ -18,9 +18,6 @@
package org.jetbrains.plugins.ideavim.extension.matchit
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class MatchitCTest : VimTestCase() {
@@ -30,7 +27,6 @@ class MatchitCTest : VimTestCase() {
enableExtensions("matchit")
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #if to #endif`() {
doTest(
"%",
@@ -42,11 +38,10 @@ class MatchitCTest : VimTestCase() {
#if !defined (VAL_1)
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from whitespace before #if to #endif`() {
doTest(
"%",
@@ -58,11 +53,10 @@ class MatchitCTest : VimTestCase() {
#if !defined (VAL_1)
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #if to #elif`() {
doTest(
"%",
@@ -78,11 +72,10 @@ class MatchitCTest : VimTestCase() {
$c#elif !defined (VAL_2)
#define VAL_2 2
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #if to #else`() {
doTest(
"%",
@@ -98,11 +91,10 @@ class MatchitCTest : VimTestCase() {
$c#else
#define VAL_2 2
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #elif to #else`() {
doTest(
"%",
@@ -114,11 +106,10 @@ class MatchitCTest : VimTestCase() {
#elif !defined (VAL_2)
$c#else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from whitespace before #elif to #else`() {
doTest(
"%",
@@ -130,11 +121,10 @@ class MatchitCTest : VimTestCase() {
#elif !defined (VAL_2)
$c#else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #else to #endif`() {
doTest(
"%",
@@ -146,11 +136,10 @@ class MatchitCTest : VimTestCase() {
#else
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from whitespace before #else to #endif`() {
doTest(
"%",
@@ -162,11 +151,10 @@ class MatchitCTest : VimTestCase() {
#else !defined (VAL_2)
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #endif to #if`() {
doTest(
"%",
@@ -188,11 +176,10 @@ class MatchitCTest : VimTestCase() {
#define VAL_3 3
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #ifdef to #endif`() {
doTest(
"%",
@@ -204,11 +191,10 @@ class MatchitCTest : VimTestCase() {
#ifdef DEBUG
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #ifdef to #elif`() {
doTest(
"%",
@@ -220,11 +206,10 @@ class MatchitCTest : VimTestCase() {
#ifdef DEBUG
$c#elif PROD
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #ifdef to #else`() {
doTest(
"%",
@@ -236,11 +221,10 @@ class MatchitCTest : VimTestCase() {
#ifdef DEBUG
$c#else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #endif to #ifdef`() {
doTest(
"%",
@@ -252,11 +236,10 @@ class MatchitCTest : VimTestCase() {
$c#ifdef DEBUG
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #ifndef to #endif`() {
doTest(
"%",
@@ -268,11 +251,10 @@ class MatchitCTest : VimTestCase() {
#ifndef DEBUG
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #ifndef to #elif`() {
doTest(
"%",
@@ -284,11 +266,10 @@ class MatchitCTest : VimTestCase() {
#ifndef DEBUG
$c#elif PROD
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #ifndef to #else`() {
doTest(
"%",
@@ -300,11 +281,10 @@ class MatchitCTest : VimTestCase() {
#ifndef DEBUG
$c#else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #endif to #ifndef`() {
doTest(
"%",
@@ -316,11 +296,10 @@ class MatchitCTest : VimTestCase() {
$c#ifndef DEBUG
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test don't jump from malformed #if`() {
doTest(
"%",
@@ -332,11 +311,10 @@ class MatchitCTest : VimTestCase() {
$c#ifff DEBUG
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from #if with whitespace to #endif`() {
doTest(
"%",
@@ -348,11 +326,10 @@ class MatchitCTest : VimTestCase() {
# if DEBUG
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from nested #if to #endif`() {
doTest(
"%",
@@ -368,7 +345,7 @@ class MatchitCTest : VimTestCase() {
$c# endif
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@@ -376,7 +353,6 @@ class MatchitCTest : VimTestCase() {
* Tests for reverse g% motion
*/
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #if to #endif`() {
doTest(
"g%",
@@ -388,11 +364,10 @@ class MatchitCTest : VimTestCase() {
#if !defined (VAL_1)
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from whitespace before #if to #endif`() {
doTest(
"g%",
@@ -404,11 +379,10 @@ class MatchitCTest : VimTestCase() {
#if !defined (VAL_1)
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #endif to #if with whitespace`() {
doTest(
"g%",
@@ -420,11 +394,10 @@ class MatchitCTest : VimTestCase() {
$c# if DEBUG
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #endif to #else`() {
doTest(
"g%",
@@ -438,11 +411,10 @@ class MatchitCTest : VimTestCase() {
#define VAL_3 3
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #else to #elif`() {
doTest(
"g%",
@@ -460,11 +432,10 @@ class MatchitCTest : VimTestCase() {
#define VAL_3 3
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from whitespace before #else to #elif`() {
doTest(
"g%",
@@ -482,11 +453,10 @@ class MatchitCTest : VimTestCase() {
#define VAL_3 3
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #elif to #if`() {
doTest(
"g%",
@@ -502,11 +472,10 @@ class MatchitCTest : VimTestCase() {
#elif !defined (VAL_2)
#define VAL_2 2
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #ifdef to #endif`() {
doTest(
"g%",
@@ -518,11 +487,10 @@ class MatchitCTest : VimTestCase() {
#ifdef DEBUG
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #endif to #ifdef`() {
doTest(
"g%",
@@ -534,11 +502,10 @@ class MatchitCTest : VimTestCase() {
$c#ifdef DEBUG
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #else to #ifdef`() {
doTest(
"g%",
@@ -550,11 +517,10 @@ class MatchitCTest : VimTestCase() {
$c#ifdef DEBUG
#else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #elif to #ifdef`() {
doTest(
"g%",
@@ -566,11 +532,10 @@ class MatchitCTest : VimTestCase() {
$c#ifdef DEBUG
#elif PROD
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #ifndef to #endif`() {
doTest(
"g%",
@@ -582,11 +547,10 @@ class MatchitCTest : VimTestCase() {
#ifndef DEBUG
$c#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #endif to #ifndef`() {
doTest(
"g%",
@@ -598,11 +562,10 @@ class MatchitCTest : VimTestCase() {
$c#ifndef DEBUG
#endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #elif to #ifndef`() {
doTest(
"g%",
@@ -614,11 +577,10 @@ class MatchitCTest : VimTestCase() {
$c#ifndef DEBUG
#elif PROD
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from #else to #ifndef`() {
doTest(
"g%",
@@ -630,7 +592,7 @@ class MatchitCTest : VimTestCase() {
$c#ifndef DEBUG
#else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "main.c"
fileName = "main.c"
)
}
}

View File

@@ -18,9 +18,6 @@
package org.jetbrains.plugins.ideavim.extension.matchit
import com.maddyhome.idea.vim.command.VimStateMachine
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class MatchitGNUMakeTest : VimTestCase() {
@@ -30,7 +27,6 @@ class MatchitGNUMakeTest : VimTestCase() {
enableExtensions("matchit")
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from define to endef`() {
doTest(
"%",
@@ -46,11 +42,10 @@ class MatchitGNUMakeTest : VimTestCase() {
second line
${c}endef
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endef to define`() {
doTest(
"%",
@@ -66,11 +61,10 @@ class MatchitGNUMakeTest : VimTestCase() {
second line
endef
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifdef to endif`() {
doTest(
"%",
@@ -84,11 +78,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info defined)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to ifdef`() {
doTest(
"%",
@@ -102,11 +95,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info defined)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifndef to endif`() {
doTest(
"%",
@@ -120,11 +112,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not defined)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to ifndef`() {
doTest(
"%",
@@ -138,11 +129,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not defined)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifeq to endif`() {
doTest(
"%",
@@ -156,11 +146,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info empty)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to ifeq`() {
doTest(
"%",
@@ -174,11 +163,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info empty)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifneq to endif`() {
doTest(
"%",
@@ -192,11 +180,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not empty)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to ifneq`() {
doTest(
"%",
@@ -210,11 +197,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not empty)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifneq to else`() {
doTest(
"%",
@@ -228,11 +214,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not empty)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifeq to else in ifeq-else block`() {
doTest(
"%",
@@ -254,11 +239,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from else ifeq to else`() {
doTest(
"%",
@@ -280,11 +264,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifeq in else block to else`() {
doTest(
"%",
@@ -306,11 +289,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from else to endif in ifeq-else block`() {
doTest(
"%",
@@ -332,11 +314,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to ifeq in ifeq-else block`() {
doTest(
"%",
@@ -358,11 +339,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifneq to else in ifneq-else block`() {
doTest(
"%",
@@ -384,11 +364,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from else ifneq to else`() {
doTest(
"%",
@@ -410,11 +389,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from ifneq in else block to else`() {
doTest(
"%",
@@ -436,11 +414,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from else to endif in ifneq-else block`() {
doTest(
"%",
@@ -462,11 +439,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from endif to ifneq in ifneq-else block`() {
doTest(
"%",
@@ -488,13 +464,12 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
// Reverse tests
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from define to endef`() {
doTest(
"g%",
@@ -510,11 +485,10 @@ class MatchitGNUMakeTest : VimTestCase() {
second line
${c}endef
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endef to define`() {
doTest(
"g%",
@@ -530,11 +504,10 @@ class MatchitGNUMakeTest : VimTestCase() {
second line
endef
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifdef to endif`() {
doTest(
"g%",
@@ -548,11 +521,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info defined)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to ifdef`() {
doTest(
"g%",
@@ -566,11 +538,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info defined)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifndef to endif`() {
doTest(
"g%",
@@ -584,11 +555,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not defined)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to ifndef`() {
doTest(
"g%",
@@ -602,11 +572,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not defined)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifeq to endif`() {
doTest(
"g%",
@@ -620,11 +589,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info empty)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to ifeq`() {
doTest(
"g%",
@@ -638,11 +606,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info empty)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifneq to endif`() {
doTest(
"g%",
@@ -656,11 +623,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not empty)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to ifneq`() {
doTest(
"g%",
@@ -674,11 +640,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not empty)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifneq to else`() {
doTest(
"g%",
@@ -692,11 +657,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not empty)
else
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifeq to endif in ifeq-else block`() {
doTest(
"g%",
@@ -718,11 +682,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from else ifeq to ifeq`() {
doTest(
"g%",
@@ -744,11 +707,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifeq in else block to ifeq`() {
doTest(
"g%",
@@ -770,11 +732,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from else to else in ifeq-else block`() {
doTest(
"g%",
@@ -796,11 +757,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to else in ifeq-else block`() {
doTest(
"g%",
@@ -822,11 +782,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info not x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifneq to endif in ifneq-else block`() {
doTest(
"g%",
@@ -848,11 +807,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
${c}endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from else ifneq to ifneq`() {
doTest(
"g%",
@@ -874,11 +832,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from ifneq in else block to ifneq`() {
doTest(
"g%",
@@ -900,11 +857,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from else to else in ifneq-else block`() {
doTest(
"g%",
@@ -926,11 +882,10 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test reverse jump from endif to else in ifneq-else block`() {
doTest(
"g%",
@@ -952,7 +907,7 @@ class MatchitGNUMakeTest : VimTestCase() {
$(info x86 based)
endif
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "Makefile"
fileName = "Makefile"
)
}
}

View File

@@ -23,8 +23,6 @@ import com.intellij.ide.highlighter.JavaFileType
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import com.maddyhome.idea.vim.helper.experimentalApi
import org.jetbrains.plugins.ideavim.SkipNeovimReason
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
import org.jetbrains.plugins.ideavim.VimTestCase
class MatchitGeneralTest : VimTestCase() {
@@ -38,7 +36,6 @@ class MatchitGeneralTest : VimTestCase() {
* Tests to make sure we didn't break the default % motion
*/
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from Java comment start to end`() {
doTest(
"%",
@@ -52,11 +49,10 @@ class MatchitGeneralTest : VimTestCase() {
*
*$c/
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, JavaFileType.INSTANCE
fileType = JavaFileType.INSTANCE
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from Java comment end to start`() {
doTest(
"%",
@@ -70,11 +66,10 @@ class MatchitGeneralTest : VimTestCase() {
*
*/
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, JavaFileType.INSTANCE
fileType = JavaFileType.INSTANCE
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test 25 percent jump`() {
doTest(
"25%",
@@ -90,11 +85,10 @@ class MatchitGeneralTest : VimTestCase() {
int c;
int d;
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, HtmlFileType.INSTANCE
fileType = HtmlFileType.INSTANCE
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from visual end of line to opening parenthesis`() {
doTest(
"v$%",
@@ -104,7 +98,6 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from visual end of line to opening parenthesis then back to closing`() {
doTest(
"v$%%",
@@ -114,15 +107,13 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete everything from opening parenthesis to closing parenthesis`() {
doTest(
"d%",
"$c(x == 123)", "", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, HtmlFileType.INSTANCE
"$c(x == 123)", "", fileType = HtmlFileType.INSTANCE
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete everything from closing parenthesis to opening parenthesis`() {
doTest(
"d%",
@@ -130,7 +121,6 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete everything from opening curly brace to closing curly brace`() {
doTest(
"d%",
@@ -138,7 +128,6 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete everything from closing curly brace to opening curly brace`() {
doTest(
"d%",
@@ -146,7 +135,6 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete everything from opening square bracket to closing square bracket`() {
doTest(
"d%",
@@ -154,7 +142,6 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete everything from closing square bracket to opening square bracket`() {
doTest(
"d%",
@@ -165,7 +152,6 @@ class MatchitGeneralTest : VimTestCase() {
/*
* Tests for visual mode and deleting on the new Matchit patterns.
*/
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from visual end of line to opening angle bracket`() {
doTest(
"v$%",
@@ -175,7 +161,6 @@ class MatchitGeneralTest : VimTestCase() {
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test jump from visual end of line to start of for loop`() {
doTest(
"v$%",
@@ -189,7 +174,7 @@ class MatchitGeneralTest : VimTestCase() {
puts n
en${se}d
""".trimIndent(),
VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER, "ruby.rb"
VimStateMachine.Mode.VISUAL, VimStateMachine.SubMode.VISUAL_CHARACTER, fileName = "ruby.rb"
)
}
@@ -203,7 +188,6 @@ class MatchitGeneralTest : VimTestCase() {
""",
description = "Our code changes the motion type to linewise, but it should not"
)
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete from elseif to else`() {
doTest(
"d%",
@@ -232,11 +216,10 @@ class MatchitGeneralTest : VimTestCase() {
end
""".trimIndent()
},
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
fileName = "ruby.rb"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete from elseif to else 2`() {
doTest(
"d%",
@@ -256,11 +239,10 @@ class MatchitGeneralTest : VimTestCase() {
puts "Positive"
end
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
fileName = "ruby.rb"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete from else to elsif with reverse motion`() {
doTest(
"dg%",
@@ -280,11 +262,10 @@ class MatchitGeneralTest : VimTestCase() {
puts "Positive"
end
""".trimIndent(),
VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
fileName = "ruby.rb"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete from opening to closing div`() {
doTest(
"d%",
@@ -293,22 +274,22 @@ class MatchitGeneralTest : VimTestCase() {
<img src="fff">
</div>
""".trimIndent(),
"$c<", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, HtmlFileType.INSTANCE
"$c<",
fileType = HtmlFileType.INSTANCE
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete from opening angle bracket to closing angle bracket`() {
doTest(
"d%",
"""
$c<div></div>
""".trimIndent(),
"$c</div>", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, HtmlFileType.INSTANCE
"$c</div>",
fileType = HtmlFileType.INSTANCE
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete whole function from def`() {
doTest(
"d%",
@@ -317,11 +298,11 @@ class MatchitGeneralTest : VimTestCase() {
puts "hello"
end
""".trimIndent(),
"", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
"",
fileName = "ruby.rb"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete whole function from def with reverse motion`() {
doTest(
"dg%",
@@ -330,11 +311,11 @@ class MatchitGeneralTest : VimTestCase() {
puts "hello"
end
""".trimIndent(),
"", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
"",
fileName = "ruby.rb"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete whole function from end`() {
doTest(
"d%",
@@ -343,11 +324,11 @@ class MatchitGeneralTest : VimTestCase() {
puts "hello"
en${c}d
""".trimIndent(),
"", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
"",
fileName = "ruby.rb"
)
}
@TestWithoutNeovim(reason = SkipNeovimReason.PLUGIN)
fun `test delete whole function from end with reverse motion`() {
doTest(
"dg%",
@@ -356,7 +337,8 @@ class MatchitGeneralTest : VimTestCase() {
puts "hello"
en${c}d
""".trimIndent(),
"", VimStateMachine.Mode.COMMAND, VimStateMachine.SubMode.NONE, "ruby.rb"
"",
fileName = "ruby.rb"
)
}
}

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