mirror of
				https://github.com/chylex/IntelliJ-IdeaVim.git
				synced 2025-10-31 20:17:13 +01:00 
			
		
		
		
	Compare commits
	
		
			925 Commits
		
	
	
		
			3637022890
			...
			customized
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8e162bce95 | |||
| 2cdd62371e | |||
| d461f61438 | |||
| de7fe30a97 | |||
| 6d80c21344 | |||
| a57a80442c | |||
| 866e6dc831 | |||
| f11bb12f19 | |||
| 70ea1bd46f | |||
|   | 2845beaf8a | ||
|   | 1e58ead126 | ||
|   | fafa7572d0 | ||
|   | 4ddeb72bfe | ||
|   | 28ba36dddb | ||
|   | b6c501311c | ||
|   | 01d4ebe254 | ||
|   | 34dd332f0b | ||
|   | 596d0c7115 | ||
|   | 672601b028 | ||
|   | e5045f28ab | ||
|   | 12ba067db3 | ||
|   | 5413606425 | ||
|   | 72ae18557b | ||
|   | 99bd119ed6 | ||
|   | faebf66065 | ||
|   | dc030d6895 | ||
|   | 7f626005a5 | ||
|   | 28d0741e14 | ||
|   | c0e17a6c61 | ||
|   | b5046b089e | ||
|   | 1075112bfa | ||
|   | 37fddacf8e | ||
|   | 2091a59897 | ||
|   | d2a427b38f | ||
|   | c069719c1c | ||
|   | 654a443d4b | ||
|   | a6ec2d5ed7 | ||
|   | 02ac083175 | ||
|   | 561fce5d40 | ||
|   | a88263874a | ||
|   | 943ddeb5ab | ||
|   | 216a3fedd0 | ||
|   | 7b8c335a5b | ||
|   | 8e8efe4862 | ||
|   | e64dc3cc1c | ||
|   | c833691cf6 | ||
|   | ba5e2e8613 | ||
|   | b154e31a28 | ||
|   | 322b888dc5 | ||
|   | 42eefb763b | ||
|   | 27be351636 | ||
|   | 8b20287f93 | ||
|   | 50a7bdb34d | ||
|   | dcac3be0da | ||
|   | ec121fb327 | ||
|   | ccb260b6a7 | ||
|   | c994511ea5 | ||
|   | fb5177633a | ||
|   | b15fde59d1 | ||
|   | 1958974c73 | ||
|   | 00b1b0fea4 | ||
|   | 743b978e6f | ||
|   | cbabd8b76e | ||
|   | 1fd877c597 | ||
|   | 4f64ed07b1 | ||
|   | 4e537b0466 | ||
|   | 2b1198dfd9 | ||
|   | 8db23fba43 | ||
|   | 0451487549 | ||
|   | a16faa97ec | ||
|   | dbf626a53e | ||
|   | 27cc767ec4 | ||
|   | 8d2d08a12b | ||
|   | 7c91d97440 | ||
|   | 0eb7b53801 | ||
|   | 510e31584e | ||
|   | 0efedd7fa5 | ||
|   | 01a32705e4 | ||
|   | 05c1b82bcf | ||
|   | cf04796010 | ||
|   | fd7e66e144 | ||
|   | ceaf290f5e | ||
|   | 5df9ae57ce | ||
|   | 04ed7d413f | ||
|   | f543835921 | ||
|   | 8ae35160e7 | ||
|   | 75516a7217 | ||
|   | 8783fc89e6 | ||
|   | fd0819ca30 | ||
|   | 650b925251 | ||
|   | fd3e32eaa8 | ||
|   | a8bebb88b1 | ||
|   | 3294a74979 | ||
|   | db95804eeb | ||
|   | 15bfc00ddb | ||
|   | 18580e431f | ||
|   | 98624d8701 | ||
|   | 3c03a15831 | ||
|   | 9710a7bfc1 | ||
|   | 34426ae32d | ||
|   | c2f98ee317 | ||
|   | 4df2abba82 | ||
|   | c3cd207b2b | ||
|   | 4f6053f767 | ||
|   | 5578fbdd4f | ||
|   | 84a6c40e13 | ||
|   | 3e91004660 | ||
|   | ac1d334bf1 | ||
|   | 368c840177 | ||
|   | c3a2fd736c | ||
|   | 741987f40b | ||
|   | 375b025e22 | ||
|   | 7324ee5e8d | ||
|   | 54c2299654 | ||
|   | b2cfb6d6ed | ||
|   | e8a11b8f79 | ||
|   | f16890f9a7 | ||
|   | e881bec45d | ||
|   | 18eea7ca2d | ||
|   | 316410a561 | ||
|   | 76a1a190f6 | ||
|   | c243ae9cef | ||
|   | 2722ee63cc | ||
|   | 22e7fa1cf3 | ||
|   | 101dc355ba | ||
|   | f5f3d0b827 | ||
|   | 53cb5d1fe9 | ||
|   | 0978ca616f | ||
|   | bbf42c0a28 | ||
|   | 7df04c6e2e | ||
|   | d3386c8097 | ||
|   | 309197781e | ||
|   | 5a3ee970a0 | ||
|   | 7cbe63e484 | ||
|   | 5342b02091 | ||
|   | 7eeca57135 | ||
|   | 2162985e4a | ||
|   | 5d53f4c13a | ||
|   | 7de2c2692d | ||
|   | 1b9df35a1d | ||
|   | d5d39797bb | ||
|   | 829a228d79 | ||
|   | 4c589c9610 | ||
|   | b9fc58ec45 | ||
|   | 193a84dafd | ||
|   | 3880a33208 | ||
|   | 2edf897e39 | ||
|   | 27d1170c75 | ||
|   | 11c850a41e | ||
|   | ff4ee06a1f | ||
|   | 0549f32d6e | ||
|   | c5ab3490b3 | ||
|   | 50ba1a1c4e | ||
|   | ee45d2fb38 | ||
|   | a94822b79a | ||
|   | b5aba454ae | ||
|   | a49631e986 | ||
|   | bb31b5f2d3 | ||
|   | 8ad08d466e | ||
|   | ab31183a93 | ||
|   | 3257cc82dc | ||
|   | ef73733596 | ||
|   | 4b45d4cf09 | ||
|   | e0b3e1db24 | ||
|   | e0b51d653a | ||
|   | c17ebbf4d7 | ||
|   | 44a26d59a4 | ||
|   | 6b8f81f7eb | ||
|   | 9a4b9419eb | ||
|   | 89548d132a | ||
|   | 45dbb2cd3b | ||
|   | a95203e2c9 | ||
|   | a79fc4980e | ||
|   | 1240781503 | ||
|   | 0875c61bc9 | ||
|   | da60a1c393 | ||
|   | 785f29abf8 | ||
|   | 2a3e96b891 | ||
|   | f1f6dd4c60 | ||
|   | b8a8403dc3 | ||
|   | ab5eb9c401 | ||
|   | 74b7fc9f77 | ||
|   | ca87316691 | ||
|   | cae61587da | ||
|   | 0238d0bf2e | ||
|   | 5be575a078 | ||
|   | 36fbbbf4ae | ||
|   | a87ab3c558 | ||
|   | 75e22a2080 | ||
|   | 6c89799bfb | ||
|   | e0d9a8d0db | ||
|   | 3208f6a1bd | ||
|   | d525be33cf | ||
|   | 64136f0b93 | ||
|   | 238203cf35 | ||
|   | 6b354467ab | ||
|   | 10444e5995 | ||
|   | 42f6ca11db | ||
|   | eed094103d | ||
|   | 5051bcd607 | ||
|   | 74e2bb2d87 | ||
|   | a4a6331935 | ||
|   | 3939144128 | ||
|   | 7791c0b7be | ||
|   | 2cfbff5cf6 | ||
|   | b734153253 | ||
|   | 3df637b265 | ||
|   | ea220d2514 | ||
|   | 8bb75fc376 | ||
|   | d461fe555d | ||
|   | 0bd25f2506 | ||
|   | 2355435275 | ||
|   | cc04ef5869 | ||
|   | 521d8a605d | ||
|   | 3bff1b1ba5 | ||
|   | 15192652f0 | ||
|   | 85873202ca | ||
|   | 706bde03f9 | ||
|   | f855f5f429 | ||
|   | cce557e82a | ||
|   | 7f7d8bd771 | ||
|   | 9a95093b44 | ||
|   | ddf7bbdd31 | ||
|   | 994a811efa | ||
|   | 06efa46f32 | ||
|   | 66778a060c | ||
|   | c9697d6cc8 | ||
|   | b801daa240 | ||
|   | d2f42d67c7 | ||
|   | cb9d750db9 | ||
|   | 0b966c4497 | ||
|   | 0774a822aa | ||
|   | 7e0cdce7ea | ||
|   | e2ed963af5 | ||
|   | 4781d29d67 | ||
|   | f5b6ca50f4 | ||
|   | 05852b07c6 | ||
|   | 689aa4cf95 | ||
|   | 56aad9200a | ||
|   | ac69c0d9c6 | ||
|   | 860592291f | ||
|   | 113597333c | ||
|   | a83d71aa39 | ||
|   | 93299ae843 | ||
|   | 4300cf5330 | ||
|   | 92d08377ce | ||
|   | 19a6284023 | ||
|   | 45908f2a84 | ||
|   | 8648220e21 | ||
|   | 68e285b514 | ||
|   | 5153a42b69 | ||
|   | 42feed710c | ||
|   | 9d049b06c3 | ||
|   | 1105529e91 | ||
|   | 49c1f11503 | ||
|   | f54fd84de3 | ||
|   | da3d83ecc6 | ||
|   | 4af8e574c4 | ||
|   | bdcb5c4f33 | ||
|   | 013f7a42c2 | ||
|   | d03398f3e8 | ||
|   | 7a26307a2b | ||
|   | fa6a0369b8 | ||
|   | ad8cb0ba09 | ||
|   | 8125ce5072 | ||
|   | 6c0cc7285f | ||
|   | d3424021c8 | ||
|   | 623aa40acd | ||
|   | c131cb338e | ||
|   | 14d242a233 | ||
|   | a131b7d29a | ||
|   | 85a1fbe89e | ||
|   | 142550a1f8 | ||
|   | e3d3b73903 | ||
|   | 45f18ff91c | ||
|   | 2103163207 | ||
|   | 19dd49670c | ||
|   | e738a1a821 | ||
|   | 6e0f301fb8 | ||
|   | c76b8db293 | ||
|   | 9fa4ca8fb3 | ||
|   | 871b60fe8d | ||
|   | 6715a5b61f | ||
|   | d7d91f1cc5 | ||
|   | 9f00dbd6f4 | ||
|   | f95cf3d671 | ||
|   | 7fbc17624f | ||
|   | b9c2ea37cb | ||
|   | ca0db15e01 | ||
|   | c32c62eacc | ||
|   | 43a79dbad4 | ||
|   | 2829a13187 | ||
|   | efc8c9207d | ||
|   | 183ed10592 | ||
|   | 926b47a31e | ||
|   | d272c919ea | ||
|   | f6e7d04fd5 | ||
|   | ccdff4f087 | ||
|   | ff14303e88 | ||
|   | 48a592340b | ||
|   | da8f5f3231 | ||
|   | f8fa8b73fa | ||
|   | aee126b625 | ||
|   | 396ac86939 | ||
|   | 81816f903f | ||
|   | 06a85b784b | ||
|   | 7f1e3bb155 | ||
|   | 241f554133 | ||
|   | 9498d0779c | ||
|   | b12fd5100f | ||
|   | 92f622430d | ||
|   | ef518f5b23 | ||
|   | 7acb17ebdb | ||
|   | 479a7dbbaf | ||
|   | 4fd1a25557 | ||
|   | f32d42e625 | ||
|   | 362b9a5c3a | ||
|   | e42b4d0ea3 | ||
|   | 43767b8500 | ||
|   | d05098c870 | ||
|   | 505f485568 | ||
|   | 86f512fb91 | ||
|   | 12903066b9 | ||
|   | 118d0433cb | ||
|   | eb781c3679 | ||
|   | 3c6bffba03 | ||
|   | 89623b04d6 | ||
|   | 444a96132c | ||
|   | c008553127 | ||
|   | 162d7b021f | ||
|   | c82364c1dd | ||
|   | 977402c6b0 | ||
|   | b14e59ab5b | ||
|   | 47dcefcfbf | ||
|   | 2b299cb422 | ||
|   | d0ccbb4620 | ||
|   | 187b207271 | ||
|   | a3e22c844c | ||
|   | f8384b2732 | ||
|   | 2dae43258c | ||
|   | 48033ecb85 | ||
|   | ad8df027ac | ||
|   | 91f580771d | ||
|   | 9c6f0981f5 | ||
|   | 2212569688 | ||
|   | 6711f1dbab | ||
|   | 0b7a883efb | ||
|   | 8ae84c62c0 | ||
|   | 0d168c8115 | ||
| c7b51b7fa5 | |||
|   | 86bf723791 | ||
|   | 71f2e9de4a | ||
|   | 33d3f270a3 | ||
|   | da94edd386 | ||
|   | 90dfaefd11 | ||
|   | 8bc616cc55 | ||
|   | a9e79d62c5 | ||
|   | 1998221a0b | ||
|   | a9b1625749 | ||
|   | b411836570 | ||
|   | df7e0221a8 | ||
|   | 8ff8f2b685 | ||
|   | 65dea7e3f7 | ||
|   | 1942f86633 | ||
|   | ee4ce5033a | ||
|   | 040fe806c8 | ||
|   | 97f5c9225e | ||
|   | 09b86c15f9 | ||
|   | 8f34285d8c | ||
|   | d3c3b71e3e | ||
|   | aa6f49c9b1 | ||
|   | c011628420 | ||
|   | 1c9fa9d662 | ||
|   | 7b9bc64364 | ||
|   | 729062bfdd | ||
|   | bc6c726a45 | ||
|   | dfc3df713e | ||
|   | 42eca1d5f2 | ||
|   | 66245e2730 | ||
|   | d44b82c1d1 | ||
|   | 5440e48fa3 | ||
|   | 1c513cf8aa | ||
|   | a17c4b8d43 | ||
|   | 15eb4ac278 | ||
|   | 0d9b81eab3 | ||
|   | f02e1a20c7 | ||
|   | a11991dad7 | ||
|   | 1238828bfd | ||
|   | ba409cb24c | ||
|   | d597670275 | ||
|   | d8540e95f8 | ||
|   | d35ebf00dd | ||
|   | 2b32cb26b1 | ||
|   | ca95fcb658 | ||
|   | cc18bbd168 | ||
|   | 8c8ea800cb | ||
|   | 0746dcc686 | ||
|   | 930650be9d | ||
|   | 4e3a9ffa40 | ||
|   | 3bf68a2bb8 | ||
|   | a80f6feab0 | ||
|   | 3cf8ae52ed | ||
|   | 62632a4514 | ||
|   | 249bd3778a | ||
|   | ab9e5d7a4a | ||
|   | 083b7dc952 | ||
|   | 1791692d92 | ||
|   | ba23c9ab5e | ||
|   | f96ab37bcb | ||
|   | 0da34bbb34 | ||
|   | 51e7c745ea | ||
|   | 8347251572 | ||
|   | ce8512f4e0 | ||
|   | a724a19d00 | ||
|   | 7eae7a98e8 | ||
|   | fe9566eebd | ||
|   | b69756730f | ||
|   | 6cd1a60b53 | ||
|   | 9d935e47b5 | ||
|   | a7d5372d06 | ||
|   | a575942c81 | ||
|   | 3cf6c53a8e | ||
|   | 91d86680de | ||
|   | d1d082fb99 | ||
|   | 2c634d1bf0 | ||
|   | 02a6fe4dc9 | ||
|   | 223d681526 | ||
|   | f42ef1c2fc | ||
|   | f4817b2111 | ||
|   | 6f5def0abf | ||
|   | f0fcd7f133 | ||
|   | 6115adb72e | ||
|   | bfd0b5fd91 | ||
|   | 6c0a52155b | ||
|   | c7ebce39bf | ||
|   | a0dc7a792f | ||
|   | fdb09a8f1f | ||
|   | 4ac2aa2339 | ||
|   | ebbc20692a | ||
|   | 5c82d112c9 | ||
|   | 40fd50d7f1 | ||
|   | f7b948fee2 | ||
|   | 6cdcf133bb | ||
|   | f3025757b6 | ||
|   | a49811a3f9 | ||
|   | 2ac4b265d1 | ||
|   | 46e994b563 | ||
|   | 81482bd298 | ||
|   | f1a239c085 | ||
|   | a48e38de7b | ||
|   | 0aaacee117 | ||
|   | b8373af69f | ||
|   | e99b2ee73d | ||
|   | 705022331a | ||
|   | bf62d444bf | ||
|   | 5dcff5657b | ||
|   | 7e79d5a960 | ||
|   | c1b480976d | ||
|   | ddabbe6891 | ||
|   | ffa3052b50 | ||
|   | 654ea88851 | ||
|   | 4dc7982baa | ||
|   | ae2fc1cd85 | ||
|   | 78bc8666e6 | ||
|   | 9c2de2cfc7 | ||
|   | 71e81465f3 | ||
|   | 885031e086 | ||
|   | d77c5bb5cf | ||
|   | 781bce0000 | ||
|   | a3ca1b965b | ||
|   | dd20b480a7 | ||
|   | 38292e97af | ||
|   | 46ea752164 | ||
|   | 194b744361 | ||
| b50197f7ce | |||
|   | c00703d1d0 | ||
|   | 6e12377116 | ||
|   | b0c4391ad8 | ||
|   | f43ac2538a | ||
|   | 9eaf8b5d2d | ||
|   | e365d0b07c | ||
|   | 69c273c4a5 | ||
|   | f7950e7adb | ||
|   | 7c1ae9812e | ||
|   | 5c794ac40e | ||
|   | 9dbe3c3363 | ||
|   | 8a98f46235 | ||
|   | 9ed8db4d4a | ||
|   | 5b94276836 | ||
|   | f1e427e2ff | ||
|   | a112cfe35f | ||
|   | 412b60d6b4 | ||
|   | 11d9ef7507 | ||
|   | ca143272f3 | ||
|   | 072449825c | ||
|   | 38ed9c206a | ||
|   | 8235a649a1 | ||
|   | 09efdd076e | ||
|   | da9b6ea762 | ||
|   | 437450a93b | ||
|   | 50fff8871e | ||
|   | 350e9cfca2 | ||
|   | 5639edf173 | ||
|   | f72313df9c | ||
|   | f52eb5e124 | ||
|   | 5da9c5e1cd | ||
|   | 53fdd891fb | ||
|   | 94820d7a83 | ||
|   | fe66d06ce2 | ||
|   | b6e917a2d7 | ||
|   | a6a39d249b | ||
|   | 518784c371 | ||
|   | 51c50cb902 | ||
|   | 6355d7765e | ||
|   | c083631590 | ||
|   | f62575c870 | ||
|   | 01e367cadf | ||
|   | e248bb5565 | ||
|   | 1744ec74c7 | ||
|   | 905f8003da | ||
|   | 3b3a036806 | ||
|   | ccf48d1e53 | ||
|   | d7a74fdf5e | ||
|   | 462c1bc75e | ||
|   | 96b05dcc94 | ||
|   | ceafe9d4e7 | ||
|   | fc9b09cf72 | ||
|   | 11c80b2ea9 | ||
|   | eb536766db | ||
|   | f3b6687d79 | ||
|   | adf483a748 | ||
|   | 7332cd1ed1 | ||
|   | 7726f4347b | ||
|   | ee092d988b | ||
|   | b3db3bb940 | ||
|   | edcb17a436 | ||
|   | f3b4933ef2 | ||
|   | c6fdf9cdf4 | ||
|   | 2244d0f776 | ||
|   | d7c4e4a8dd | ||
|   | b7c54d02cb | ||
|   | 620eca3a0d | ||
|   | aa3b2e988f | ||
|   | 753f589ea5 | ||
|   | 831e4e8c42 | ||
|   | 329722f338 | ||
|   | 2ff429cc76 | ||
|   | 47d4aee986 | ||
|   | 938325b93e | ||
|   | 12d0a2ffb7 | ||
|   | 4ff7e9aefa | ||
|   | f52792e7f0 | ||
|   | cbc6662ef7 | ||
|   | 26ffc2ad32 | ||
|   | df32e573b0 | ||
|   | 19647d96b2 | ||
|   | b1714a2fc1 | ||
|   | 83199d5475 | ||
|   | 4c0af66dff | ||
|   | ccd7204b21 | ||
|   | b82f1e6602 | ||
|   | 4104258219 | ||
|   | 11054f908b | ||
|   | e0dc6f7214 | ||
|   | 735686c415 | ||
|   | 385bcbc383 | ||
|   | f273620466 | ||
|   | acb27d5ccc | ||
|   | 62c79e1470 | ||
|   | 1a99918819 | ||
|   | 7e3a9e0b38 | ||
|   | f51d74f2b8 | ||
|   | 987cba6072 | ||
|   | 770e6371df | ||
|   | 30e660cf19 | ||
|   | 8ccf0b5364 | ||
|   | 3ef86186eb | ||
|   | b8b3669b04 | ||
|   | ac41890759 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | cf85e0f25e | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | a4b52be833 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 4cb8f27ca5 | ||
|   | 9a06ee97c4 | ||
|   | d7dfc6dc05 | ||
|   | 5a6de3afaa | ||
|   | cd242511a8 | ||
|   | 745ae6caa4 | ||
|   | acc7d0954d | ||
|   | 330d64c7cb | ||
|   | 673e43dd77 | ||
|   | c2c5c60899 | ||
|   | 7d5176829b | ||
|   | fd0dc0d445 | ||
|   | be11317667 | ||
|   | 22fce51640 | ||
|   | 4223da47d6 | ||
|   | 64100fea59 | ||
|   | 2244c65233 | ||
|   | e08bffd7ba | ||
|   | 0d5aa52af2 | ||
|   | e617fc4c34 | ||
|   | c34a7f123d | ||
|   | cc029fc98e | ||
|   | feae15c48c | ||
|   | 07485727c4 | ||
|   | 8b0ad7680b | ||
|   | 43d70cd467 | ||
|   | d73b605ef0 | ||
|   | 5afd4df69a | ||
|   | 323c611f87 | ||
|   | 0dd0a4976b | ||
|   | 48820d4dff | ||
|   | 2fbab395f1 | ||
|   | a9fd32f64e | ||
|   | da7a2226d4 | ||
|   | 44b37339dc | ||
|   | db1ec29470 | ||
|   | 713c3f0a3c | ||
|   | c6c2bc5e74 | ||
|   | c8352158b8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 8927c0acfa | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 02dfac8a34 | ||
|   | 8ab3664992 | ||
|   | 03e6101747 | ||
|   | 9f47995c10 | ||
|   | d58f36ea1a | ||
|   | 442970a986 | ||
|   | fcc6c8a3c5 | ||
|   | 1dbd4b4391 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 1943c72c1c | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 7816da3f2d | ||
|   | b25d7e358d | ||
|   | 04b62e6392 | ||
|   | 4ecfb796d4 | ||
|   | de9fa81da3 | ||
|   | be484d381c | ||
|   | 351e3b15ea | ||
|   | 2b9b48ac2f | ||
|   | 7c4ac5f561 | ||
|   | def09b0be8 | ||
|   | 2415b167fb | ||
|   | dfc7aef07d | ||
|   | 276ad276ec | ||
|   | 83da2d304e | ||
|   | 6ddc40d080 | ||
|   | 42fb5487e5 | ||
|   | 1ce35ac233 | ||
|   | 2734202e12 | ||
|   | 6a31fd2732 | ||
|   | 5d84aa6939 | ||
|   | 7173b7960d | ||
|   | bb1c30d6c8 | ||
|   | d70abf6e27 | ||
|   | 8931fdf82a | ||
|   | 25ba72e46b | ||
|   | ebd71d41dc | ||
|   | 4b49bb4737 | ||
|   | eeac47e522 | ||
|   | 335267c0af | ||
|   | c4254dc6dd | ||
|   | 12cb359967 | ||
|   | d73cb274b4 | ||
|   | 6cb6afe032 | ||
|   | 3686f0eb24 | ||
|   | 6cc24fe99e | ||
|   | 3784f1957f | ||
|   | 69fd8d68af | ||
|   | 301d72c169 | ||
|   | ca11974b12 | ||
|   | 8917dbf4bb | ||
|   | 56afa6d564 | ||
|   | 8ecac1a8cf | ||
|   | f742e414e6 | ||
|   | c462af2d10 | ||
|   | 66ede93d95 | ||
|   | c97f5be3fa | ||
|   | c4d35849fd | ||
|   | 88c191bc61 | ||
|   | a1e6318bce | ||
|   | 3606f5ea14 | ||
|   | 38c3b206e2 | ||
|   | e69bf9760d | ||
|   | 0b763e23cf | ||
|   | 311cb0bada | ||
|   | a78782b73a | ||
|   | 54df803ee1 | ||
|   | 2819b782c9 | ||
|   | 38c12660b0 | ||
|   | 3917a8c5e3 | ||
|   | 17c642d5ed | ||
|   | 2d84e2d788 | ||
|   | ca19d2bfd5 | ||
|   | cd56fb87d0 | ||
|   | 7290edd3ae | ||
|   | 8d4e9b8514 | ||
|   | db87b51784 | ||
|   | 96dc9af1e3 | ||
|   | a453cb2582 | ||
|   | b0d53330bb | ||
|   | 99ebcacf31 | ||
|   | 3ec90194d7 | ||
|   | 5ce52f7189 | ||
|   | d163837d8d | ||
|   | 81811530de | ||
|   | 7276bc49a7 | ||
|   | 90cff7e574 | ||
|   | c673550901 | ||
|   | 5b360b6de2 | ||
|   | 8e2783962f | ||
|   | 866b319c5b | ||
|   | 6eb47567e8 | ||
|   | d27f87fbb8 | ||
|   | b2a2299347 | ||
|   | 905862ab9f | ||
|   | 5c307fd22c | ||
|   | e92b69ad3f | ||
|   | c6a5f9c268 | ||
|   | 54f91f2a64 | ||
|   | 4b2ed33cdd | ||
|   | 5fa48fc7dd | ||
|   | e028c269b7 | ||
|   | 9798c7aca2 | ||
|   | b5bca78ef4 | ||
|   | 1c619cfc74 | ||
|   | dc5832a44c | ||
|   | 8fd64afc90 | ||
|   | 1484f4e370 | ||
|   | 32df1597c4 | ||
|   | 707b750ff1 | ||
|   | 3388c8517b | ||
|   | 60a8e0d5f5 | ||
|   | 5a757a58b5 | ||
|   | 2e555b6eaa | ||
|   | c57277cc15 | ||
|   | bf035d42af | ||
|   | 8cb6f9b65f | ||
|   | fcbc4a0688 | ||
|   | 42bc15c8ea | ||
|   | 992231bcad | ||
|   | 6d494c99e3 | ||
|   | a848f2175a | ||
|   | 4e6a2f951b | ||
|   | 5a41bbe806 | ||
|   | 066e6619af | ||
|   | f0dbabd20f | ||
|   | 35c0e33ec4 | ||
|   | a5715dac7d | ||
|   | cdb9af5ab6 | ||
|   | 19c05c23f3 | ||
|   | 12c744c1ba | ||
|   | 604a6a5140 | ||
|   | 62aae7b7c4 | ||
|   | 2ea899330c | ||
|   | 3574db020f | ||
|   | b2ae2a38ec | ||
|   | 04ebb6077a | ||
|   | d5062944d0 | ||
|   | dc181ce0ce | ||
|   | 042e3388b0 | ||
|   | d4a1ffa9a9 | ||
|   | 54927d0af7 | ||
|   | d26765e217 | ||
|   | 277b4e63c3 | ||
|   | 848514405b | ||
|   | 7b8fd0ee55 | ||
|   | d373ebac58 | ||
|   | 370ccc5254 | ||
|   | 9272fc8cd7 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 22cfdbae0a | ||
|   | f49f5e5d25 | ||
|   | 118c12e7fe | ||
|   | 02a7eb34ee | ||
|   | 739390739e | ||
|   | 6b2ead0d4e | ||
|   | 1eaf9e7b17 | ||
|   | 954e1a9099 | ||
|   | 5aeff6f914 | ||
|   | fb15049fbf | ||
|   | 6f3a9c210e | ||
|   | 6fdd6d839e | ||
|   | ac1101a410 | ||
|   | 2fd33e6ec2 | ||
|   | 779c69a982 | ||
|   | 3494286e66 | ||
|   | 139b78d7f4 | ||
|   | daee2f615c | ||
|   | 710825ec28 | ||
|   | 478539911b | ||
|   | b21d984cf8 | ||
|   | 1a92cebf6b | ||
|   | fd3f939526 | ||
|   | 7d28760fa1 | ||
|   | 4a0a1c95a9 | ||
|   | 9da0c10141 | ||
|   | 43b9ecdf3c | ||
|   | 987952a2f2 | ||
|   | 92f6ac57ad | ||
|   | b4af51f3cc | ||
|   | 4ba6e62ada | ||
|   | 58d5924e80 | ||
|   | 8f55551339 | ||
|   | 9229497be8 | ||
|   | 99e77cd8ed | ||
|   | 8d8809238c | ||
|   | f03d574e86 | ||
|   | cbb5fbe92e | ||
|   | 6a376ad62c | ||
|   | 8e61853459 | ||
|   | b17bc1bb3e | ||
|   | 1343c7603b | ||
|   | 5b5a4b1347 | ||
|   | 62fb3f9c5a | ||
|   | 986378db42 | ||
|   | ce99c26c03 | ||
|   | 3571595838 | ||
|   | c0c450124f | ||
|   | aa62022218 | ||
|   | 71c27babfd | ||
|   | 2ff93270d7 | ||
|   | c07719dd3d | ||
|   | 6b7ef88418 | ||
|   | ee9f12180d | ||
|   | 8df3bc57c5 | ||
|   | 0aabb2971e | ||
|   | e5740bf496 | ||
|   | e8f1dff61c | ||
|   | 267fc62865 | ||
|   | 05a64f51f7 | ||
|   | e5460d7a31 | ||
|   | 1826a31e2f | ||
|   | 2bb44c414f | ||
|   | ef7442c488 | ||
|   | 775bde62c8 | ||
|   | c5a504bde3 | ||
|   | f7f7e010c4 | ||
|   | aa82f7ed64 | ||
|   | 684d192b4b | ||
|   | aed2d1159d | ||
|   | d2500df05e | ||
|   | 8922303a72 | ||
|   | cea4de03cd | ||
|   | 9529c19b9b | ||
|   | b0f5c502d9 | ||
|   | c3fc369bc4 | ||
|   | a5ef0d5edf | ||
|   | 26e9056f17 | ||
|   | 1553aa774b | ||
|   | 2ebdbc5ac4 | ||
|   | e3ca172101 | ||
|   | 17d4ec6c29 | ||
|   | bec317615d | ||
|   | d00fd767ff | ||
|   | 557652c526 | ||
|   | e138541495 | ||
|   | f6dfbcad0d | ||
|   | 2518be2704 | ||
|   | 42ec2b9dce | ||
|   | 9484599bfd | ||
|   | 5e6d3ddae8 | ||
|   | 13cce3afcc | ||
|   | 9743cb1424 | ||
|   | dbbcf3860a | ||
|   | ae983be0a8 | ||
|   | f8156fbbca | ||
|   | 1909547543 | ||
|   | e47c0c1914 | ||
|   | 1a122337fe | ||
|   | bcf2578da9 | ||
|   | 06cd41ba0e | ||
|   | 64ec421cfc | ||
|   | 86fcda5afc | ||
|   | e799d40803 | ||
|   | c84325a37c | ||
|   | 3b6d57849c | ||
|   | 9b4825db77 | ||
|   | 6a4bb7395b | ||
|   | c8463d9b3e | ||
|   | 376ca4e93b | ||
|   | 6a43e558fd | ||
|   | 05414276f2 | ||
|   | bec73749c2 | ||
|   | 0d4f9891c3 | ||
|   | f082ab4b68 | ||
|   | d4f4765ffd | ||
|   | 8902c0839c | ||
|   | 66fc8034ba | ||
|   | 109cb58d68 | ||
|   | a71916df84 | ||
|   | 5f10eb808e | ||
|   | 6c1e7b0b60 | ||
|   | 792c22a90a | ||
|   | eff2cd02f9 | ||
|   | 163e7751f2 | ||
|   | 370c22b2f5 | ||
|   | a251ac55e5 | ||
|   | 987df6958e | ||
|   | 60ae189442 | ||
|   | ce734906d4 | ||
|   | 3b26572731 | ||
|   | 4d9c606c79 | ||
|   | 22050fc16d | ||
|   | 2fb419253c | ||
|   | 3bb4fc67bf | ||
|   | a0a009cb59 | ||
|   | ce2bb85e18 | ||
|   | 7ff8ac76fa | ||
|   | 935c51c985 | ||
|   | a8d0e698eb | ||
|   | 5b13ad6726 | ||
|   | e88d0d1493 | ||
|   | 898af47f89 | ||
|   | 84868c0fb5 | ||
|   | 8e2b7d2089 | ||
|   | f359ac49f3 | ||
|   | 37ce0925a5 | ||
|   | 23985aea7d | ||
|   | 3bd5ab970f | ||
|   | fbdcbdc626 | ||
|   | f197ee54d1 | ||
|   | efa0489f7b | ||
|   | 66dd90a090 | ||
|   | 68cfb12746 | ||
|   | 4ad14f3404 | ||
|   | 4bcf44570b | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | b6128418be | 
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| * text=auto eol=lf | ||||
							
								
								
									
										31
									
								
								.github/workflows/checkNewPlugins.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.github/workflows/checkNewPlugins.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| # This workflow syncs changes from the docs folder of IdeaVim to the IdeaVim.wiki repository | ||||
|  | ||||
| name: Check new plugin dependencies | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   schedule: | ||||
|     - cron: '0 5 * * *' | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - name: Fetch origin repo | ||||
|         uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Set up JDK 17 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
|           java-version: '17' | ||||
|           distribution: 'adopt' | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
|  | ||||
|       - name: Check new plugins | ||||
|         run: ./gradlew scripts:checkNewPluginDependencies | ||||
							
								
								
									
										39
									
								
								.github/workflows/closeYoutrackOnCommit.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								.github/workflows/closeYoutrackOnCommit.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| name: Close YouTrack on commit | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 300 | ||||
|       - name: Set up JDK 11 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
|           java-version: '11' | ||||
|           distribution: 'adopt' | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
|  | ||||
|       - uses: nrwl/last-successful-commit-action@v1 | ||||
|         id: last_successful_commit | ||||
|         with: | ||||
|           branch: 'master' | ||||
|           workflow_id: 'closeYoutrackOnCommit.yml' | ||||
|           github_token: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Update YouTrack | ||||
|         run: ./gradlew updateYoutrackOnCommit | ||||
|         env: | ||||
|           SUCCESS_COMMIT: ${{ steps.last_successful_commit.outputs.commit_hash }} | ||||
|           YOUTRACK_TOKEN: ${{ secrets.YOUTRACK_TOKEN }} | ||||
							
								
								
									
										32
									
								
								.github/workflows/integrationsTest.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.github/workflows/integrationsTest.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| name: Testing CI integrations | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   schedule: | ||||
|     - cron: '0 5 * * *' | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 300 | ||||
|       - name: Set up JDK 11 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
|           java-version: '11' | ||||
|           distribution: 'adopt' | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
|  | ||||
|       - name: Run tests | ||||
|         run: ./gradlew integrationsTest | ||||
|         env: | ||||
|           YOUTRACK_TOKEN: ${{ secrets.YOUTRACK_TOKEN }} | ||||
|           GITHUB_OAUTH: ${{ secrets.MERGE_PR }} | ||||
							
								
								
									
										35
									
								
								.github/workflows/kover.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								.github/workflows/kover.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| name: Kover | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 300 | ||||
|       - name: Set up JDK 11 | ||||
|         uses: actions/setup-java@v2 | ||||
|         with: | ||||
|           java-version: '11' | ||||
|           distribution: 'adopt' | ||||
|           server-id: github # Value of the distributionManagement/repository/id field of the pom.xml | ||||
|           settings-path: ${{ github.workspace }} # location for the settings.xml file | ||||
|  | ||||
|       - name: Run tests | ||||
|         run: ./gradlew koverXmlReport | ||||
|  | ||||
|  | ||||
|       # Upload Kover report to CodeCov | ||||
|       - uses: codecov/codecov-action@v3 | ||||
|         with: | ||||
|           files: ${{ github.workspace }}/build/reports/kover/xml/report.xml | ||||
							
								
								
									
										18
									
								
								.github/workflows/mergePr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/mergePr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -4,7 +4,8 @@ | ||||
| name: Update Changelog On PR | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|   workflow_dispatch: | ||||
|   pull_request_target: | ||||
|     types: [ closed ] | ||||
|  | ||||
| jobs: | ||||
| @@ -29,7 +30,20 @@ jobs: | ||||
|         id: update_authors | ||||
|         run: ./gradlew updateMergedPr -PprId=${{ github.event.number }} | ||||
|         env: | ||||
|           GITHUB_OAUTH: ${{ secrets.AUTOMATION_TOKEN }} | ||||
|           GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       # Reuse from update changelog | ||||
|       - uses: nrwl/last-successful-commit-action@v1 | ||||
|         id: last_successful_commit | ||||
|         with: | ||||
|           branch: 'master' | ||||
|           workflow_id: 'updateChangelog.yml' | ||||
|           github_token: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Update changelog | ||||
|         run: ./gradlew updateChangelog | ||||
|         env: | ||||
|           SUCCESS_COMMIT: ${{ steps.last_successful_commit.outputs.commit_hash }} | ||||
|  | ||||
|       - name: Commit changes | ||||
|         uses: stefanzweifel/git-auto-commit-action@v4 | ||||
|   | ||||
							
								
								
									
										42
									
								
								.github/workflows/syncDoc.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								.github/workflows/syncDoc.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created | ||||
| # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle | ||||
|  | ||||
| # This workflow syncs changes from the docs folder of IdeaVim to the IdeaVim.wiki repository | ||||
|  | ||||
| name: Sync docs | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: [ master ] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - name: Fetch origin repo | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           path: origin | ||||
|  | ||||
|       - name: Fetch docs repo | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           repository: JetBrains/ideavim.wiki | ||||
|           path: docs | ||||
|  | ||||
|       - name: Sync docs | ||||
|         id: update_authors | ||||
|         run: cp -a origin/doc/. docs | ||||
|  | ||||
|       - name: Commit changes | ||||
|         uses: stefanzweifel/git-auto-commit-action@v4 | ||||
|         with: | ||||
|           branch: master | ||||
|           repository: docs | ||||
|           commit_message: Update docs | ||||
|           commit_user_name: Alex Plate | ||||
|           commit_user_email: aleksei.plate@jetbrains.com | ||||
|           commit_author: Alex Plate <aleksei.plate@jetbrains.com> | ||||
							
								
								
									
										2
									
								
								.github/workflows/updateAuthors.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/updateAuthors.yml
									
									
									
									
										vendored
									
									
								
							| @@ -37,7 +37,7 @@ jobs: | ||||
|         run: ./gradlew updateAuthors --stacktrace | ||||
|         env: | ||||
|           SUCCESS_COMMIT: ${{ steps.last_successful_commit.outputs.commit_hash }} | ||||
|           GITHUB_OAUTH: ${{ secrets.AUTOMATION_TOKEN }} | ||||
|           GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Commit changes | ||||
|         uses: stefanzweifel/git-auto-commit-action@v4 | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/updateChangelog.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/updateChangelog.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,6 +11,7 @@ on: | ||||
| jobs: | ||||
|   build: | ||||
|  | ||||
|     if: github.event.pull_request.merged != true | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
| @@ -45,3 +46,4 @@ jobs: | ||||
|           commit_user_email: aleksei.plate@jetbrains.com | ||||
|           commit_author: Alex Plate <aleksei.plate@jetbrains.com> | ||||
|           file_pattern: CHANGES.md | ||||
|           skip_fetch: false | ||||
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -9,10 +9,11 @@ | ||||
| !/.idea/fileTemplates | ||||
| !/.idea/runConfigurations | ||||
| !/.idea/codeStyles | ||||
| !/.idea/vcs.xml | ||||
|  | ||||
| /build/ | ||||
| /out/ | ||||
| /tmp/ | ||||
| **/build/ | ||||
| **/out/ | ||||
| **/tmp/ | ||||
|  | ||||
| *.DS_Store | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								.idea/copyright/IdeaVim.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/copyright/IdeaVim.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| <component name="CopyrightManager"> | ||||
|   <copyright> | ||||
|     <option name="notice" value="IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
Copyright (C) 2003-&#36;today.year The IdeaVim authors

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>." /> | ||||
|     <option name="notice" value="Copyright 2003-2022 The IdeaVim authors

Use of this source code is governed by an MIT-style
license that can be found in the LICENSE.txt file or at
https://opensource.org/licenses/MIT." /> | ||||
|     <option name="myName" value="IdeaVim" /> | ||||
|   </copyright> | ||||
| </component> | ||||
							
								
								
									
										14
									
								
								.idea/inspectionProfiles/Qodana.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								.idea/inspectionProfiles/Qodana.xml
									
									
									
										generated
									
									
									
								
							| @@ -33,9 +33,11 @@ | ||||
|       <option name="ignoreToString" value="false" /> | ||||
|       <option name="nonNlsCommentPattern" value="NON-NLS" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="MagicConstant" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="MissortedModifiers" enabled="true" level="WARNING" enabled_by_default="true"> | ||||
|       <option name="m_requireAnnotationsFirst" value="true" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="SameParameterValue" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="SameReturnValue" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false"> | ||||
|       <option name="processCode" value="true" /> | ||||
| @@ -44,5 +46,17 @@ | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="SuperTearDownInFinally" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="UnstableApiUsage" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="unused" enabled="false" level="WARNING" enabled_by_default="false" checkParameterExcludingHierarchy="false"> | ||||
|       <option name="LOCAL_VARIABLE" value="true" /> | ||||
|       <option name="FIELD" value="true" /> | ||||
|       <option name="METHOD" value="true" /> | ||||
|       <option name="CLASS" value="true" /> | ||||
|       <option name="PARAMETER" value="true" /> | ||||
|       <option name="REPORT_PARAMETER_FOR_PUBLIC_METHODS" value="true" /> | ||||
|       <option name="ADD_MAINS_TO_ENTRIES" value="true" /> | ||||
|       <option name="ADD_APPLET_TO_ENTRIES" value="true" /> | ||||
|       <option name="ADD_SERVLET_TO_ENTRIES" value="true" /> | ||||
|       <option name="ADD_NONJAVA_TO_ENTRIES" value="true" /> | ||||
|     </inspection_tool> | ||||
|   </profile> | ||||
| </component> | ||||
							
								
								
									
										2
									
								
								.idea/scopes/Copyright.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/scopes/Copyright.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,3 +1,3 @@ | ||||
| <component name="DependencyValidationManager"> | ||||
|   <scope name="Copyright" pattern="(file[IdeaVIM.main]:*/||file[IdeaVIM.test]:*/)&&!file[IdeaVIM.main]:resources//*" /> | ||||
|   <scope name="Copyright" pattern="file:*/&&!file:.github//*&&!file:.idea//*&&!file:.teamcity//*&&!file:assets//*&&!file:config//*&&!file:doc//*&&!file:gradle//*&&!file:gradlew&&!file:gradlew.bat&&!file:src/main/resources//*&&!file:antlr//*&&!file:java/com/maddyhome/idea/vim/regexp/RegExp.kt" /> | ||||
| </component> | ||||
							
								
								
									
										16
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="IssueNavigationConfiguration"> | ||||
|     <option name="links"> | ||||
|       <list> | ||||
|         <IssueNavigationLink> | ||||
|           <option name="issueRegexp" value="[A-Z]+\-\d+" /> | ||||
|           <option name="linkRegexp" value="https://youtrack.jetbrains.com/issue/$0" /> | ||||
|         </IssueNavigationLink> | ||||
|       </list> | ||||
|     </option> | ||||
|   </component> | ||||
|   <component name="VcsDirectoryMappings"> | ||||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										8
									
								
								.teamcity/_Self/Constants.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.teamcity/_Self/Constants.kt
									
									
									
									
										vendored
									
									
								
							| @@ -5,16 +5,16 @@ object Constants { | ||||
|   const val EAP_CHANNEL = "eap" | ||||
|   const val DEV_CHANNEL = "Dev" | ||||
|  | ||||
|   const val VERSION = "1.9.3" | ||||
|   const val DEV_VERSION = "1.10.0" | ||||
|   const val VERSION = "2.0.0" | ||||
|   const val DEV_VERSION = "2.1.0" | ||||
|  | ||||
|   const val GITHUB_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val LINTING_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val NVIM_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val PROPERTY_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val LONG_RUNNING_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val QODANA_TESTS = "LATEST-EAP-SNAPSHOT" | ||||
|   const val RELEASE = "2021.3" | ||||
|   const val RELEASE = "LATEST-EAP-SNAPSHOT" | ||||
|  | ||||
|   const val RELEASE_DEV = "LATEST-EAP-SNAPSHOT" | ||||
|   const val RELEASE_EAP = "LATEST-EAP-SNAPSHOT" | ||||
| } | ||||
|   | ||||
							
								
								
									
										26
									
								
								.teamcity/_Self/Project.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.teamcity/_Self/Project.kt
									
									
									
									
										vendored
									
									
								
							| @@ -1,15 +1,17 @@ | ||||
| package _Self | ||||
|  | ||||
| import _Self.buildTypes.* | ||||
| import _Self.buildTypes.Compatibility | ||||
| import _Self.buildTypes.LongRunning | ||||
| 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 | ||||
| import _Self.subprojects.Releases | ||||
| import _Self.vcsRoots.Branch_181 | ||||
| import _Self.vcsRoots.Branch_183 | ||||
| import _Self.vcsRoots.Branch_191_193 | ||||
| import _Self.vcsRoots.Branch_201 | ||||
| import _Self.vcsRoots.Branch_202 | ||||
| import _Self.vcsRoots.GitHubPullRequest | ||||
| import _Self.vcsRoots.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.Project | ||||
|  | ||||
| object Project : Project({ | ||||
| @@ -23,12 +25,13 @@ object Project : Project({ | ||||
|   vcsRoot(Branch_191_193) | ||||
|   vcsRoot(Branch_201) | ||||
|   vcsRoot(Branch_202) | ||||
|   vcsRoot(Branch_203_212) | ||||
|   vcsRoot(Branch_213_221) | ||||
|   vcsRoot(Branch_222) | ||||
|   vcsRoot(Branch_Release) | ||||
|   vcsRoot(GitHubPullRequest) | ||||
|  | ||||
|   // Builds | ||||
|   buildType(TestsForIntelliJ20203) | ||||
|   buildType(TestsForIntelliJ20211) | ||||
|   buildType(TestsForIntelliJ20212) | ||||
|   buildType(TestsForIntelliJEAP) | ||||
|  | ||||
|   buildType(PropertyBased) | ||||
| @@ -36,6 +39,7 @@ object Project : Project({ | ||||
|  | ||||
|   buildType(Nvim) | ||||
|   buildType(PluginVerifier) | ||||
|   buildType(Compatibility) | ||||
|  | ||||
|   buildType(Qodana) | ||||
|  | ||||
| @@ -45,7 +49,7 @@ object Project : Project({ | ||||
|       type = "CloudImage" | ||||
|       id = "PROJECT_EXT_768" | ||||
|       param("agent_pool_id", "41") | ||||
|       param("amazon-id", "ami-0d1a6a32faa92923e") | ||||
|       param("amazon-id", "ami-0fa17ce8238eb8868") | ||||
|       param("ebs-optimized", "false") | ||||
|       param("image-instances-limit", "") | ||||
|       param("image-name-prefix", "BuildAgentsIdeaVim") | ||||
|   | ||||
							
								
								
									
										3
									
								
								.teamcity/_Self/buildTypes/ActiveTests.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.teamcity/_Self/buildTypes/ActiveTests.kt
									
									
									
									
										vendored
									
									
								
							| @@ -55,6 +55,3 @@ sealed class ActiveTests(buildName: String, ijVersion: String) : BuildType({ | ||||
| }) | ||||
|  | ||||
| object TestsForIntelliJEAP : ActiveTests("Tests for IntelliJ Latest EAP", "LATEST-EAP-SNAPSHOT") | ||||
| object TestsForIntelliJ20212 : ActiveTests("Tests for IntelliJ 2021.2", "2021.2.2") | ||||
| object TestsForIntelliJ20211 : ActiveTests("Tests for IntelliJ 2021.1", "2021.1") | ||||
| object TestsForIntelliJ20203 : ActiveTests("Tests for IntelliJ 2020.3", "2020.3") | ||||
|   | ||||
							
								
								
									
										49
									
								
								.teamcity/_Self/buildTypes/Compatibility.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								.teamcity/_Self/buildTypes/Compatibility.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| package _Self.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.DslContext | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.golang | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule | ||||
|  | ||||
| object Compatibility : BuildType({ | ||||
|   id("IdeaVimCompatibility") | ||||
|   name = "IdeaVim compatibility with external plugins" | ||||
|  | ||||
|   vcs { | ||||
|     root(DslContext.settingsRoot) | ||||
|   } | ||||
|  | ||||
|   steps { | ||||
|     script { | ||||
|       name = "Check" | ||||
|       scriptContent = """ | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}org.jetbrains.IdeaVim-EasyMotion' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}io.github.mishkun.ideavimsneak' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}eu.theblob42.idea.whichkey' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}IdeaVimExtension' [latest-IU] -team-city | ||||
|                 # Outdated java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}github.zgqq.intellij-enhance' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.github.copilot' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.github.dankinsoid.multicursor' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.joshestein.ideavim-quickscope' [latest-IU] -team-city | ||||
|             """.trimIndent() | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   triggers { | ||||
|     schedule { | ||||
|       schedulingPolicy = daily { | ||||
|         hour = 4 | ||||
|       } | ||||
|       branchFilter = "" | ||||
|       triggerBuild = always() | ||||
|       withPendingChangesOnly = false | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   features { | ||||
|     golang { | ||||
|       testFormat = "json" | ||||
|     } | ||||
|   } | ||||
| }) | ||||
							
								
								
									
										2
									
								
								.teamcity/_Self/buildTypes/Nvim.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.teamcity/_Self/buildTypes/Nvim.kt
									
									
									
									
										vendored
									
									
								
							| @@ -31,7 +31,7 @@ object Nvim : BuildType({ | ||||
|     script { | ||||
|       name = "Set up NeoVim" | ||||
|       scriptContent = """ | ||||
|               wget https://github.com/neovim/neovim/releases/download/v0.4.4/nvim-linux64.tar.gz | ||||
|               wget https://github.com/neovim/neovim/releases/download/v0.7.2/nvim-linux64.tar.gz | ||||
|               tar xzf nvim-linux64.tar.gz | ||||
|               cd nvim-linux64/bin | ||||
|               chmod +x nvim | ||||
|   | ||||
							
								
								
									
										10
									
								
								.teamcity/_Self/buildTypes/Qodana.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.teamcity/_Self/buildTypes/Qodana.kt
									
									
									
									
										vendored
									
									
								
							| @@ -4,6 +4,7 @@ import _Self.Constants.QODANA_TESTS | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.DslContext | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.Qodana | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.qodana | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| @@ -28,11 +29,15 @@ object Qodana : BuildType({ | ||||
|   steps { | ||||
|     qodana { | ||||
|       name = "Qodana" | ||||
| /* | ||||
|       reportAsTestsEnable = "" | ||||
|       failBuildOnErrors = "" | ||||
|       codeInspectionXmlConfig = "Custom" | ||||
|       codeInspectionCustomXmlConfigPath = ".idea/inspectionProfiles/Qodana.xml" | ||||
|       reportAsTestsEnable = "true" | ||||
| */ | ||||
|       clearConditions() | ||||
|       param("licenseaudit-enable", "true") | ||||
|       param("clonefinder-languages", "Java") | ||||
|       param("clonefinder-mode", "") | ||||
|       param("report-version", "") | ||||
| @@ -42,12 +47,15 @@ object Qodana : BuildType({ | ||||
|       param("clonefinder-enable", "true") | ||||
|       param("clonefinder-reference-projects", "src") | ||||
|       param("yaml-configuration", "") | ||||
|       linter = jvm { | ||||
|         version = Qodana.JVMVersion.LATEST | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   triggers { | ||||
|     vcs { | ||||
|       enabled = false | ||||
|       enabled = true | ||||
|       branchFilter = "" | ||||
|     } | ||||
|     schedule { | ||||
|   | ||||
							
								
								
									
										3
									
								
								.teamcity/_Self/buildTypes/Release.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.teamcity/_Self/buildTypes/Release.kt
									
									
									
									
										vendored
									
									
								
							| @@ -5,6 +5,7 @@ import _Self.Constants.DEV_CHANNEL | ||||
| import _Self.Constants.EAP_CHANNEL | ||||
| import _Self.Constants.RELEASE | ||||
| import _Self.Constants.VERSION | ||||
| import _Self.vcsRoots.Branch_Release | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.DslContext | ||||
| @@ -38,7 +39,7 @@ object Release : BuildType({ | ||||
|   } | ||||
|  | ||||
|   vcs { | ||||
|     root(DslContext.settingsRoot) | ||||
|     root(Branch_Release) | ||||
|  | ||||
|     checkoutMode = CheckoutMode.AUTO | ||||
|   } | ||||
|   | ||||
							
								
								
									
										64
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_203-212.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_203-212.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs | ||||
|  | ||||
| sealed class TestsForIntelliJ_203_212_branch(private val version: String) : BuildType({ | ||||
|   name = "Tests for IntelliJ $version" | ||||
|  | ||||
|   params { | ||||
|     param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false") | ||||
|     param("env.ORG_GRADLE_PROJECT_legacyNoJavaPlugin", "true") | ||||
|     param("env.ORG_GRADLE_PROJECT_ideaVersion", "IC-$version") | ||||
|     param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false") | ||||
|     param("env.ORG_GRADLE_PROJECT_javaVersion", "1.8") | ||||
|   } | ||||
|  | ||||
|   vcs { | ||||
|     root(_Self.vcsRoots.Branch_203_212) | ||||
|  | ||||
|     checkoutMode = CheckoutMode.AUTO | ||||
|   } | ||||
|  | ||||
|   steps { | ||||
|     gradle { | ||||
|       tasks = "clean test" | ||||
|       buildFile = "" | ||||
|       enableStacktrace = true | ||||
|       param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   triggers { | ||||
|     vcs { | ||||
|       branchFilter = "" | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   requirements { | ||||
|     noLessThanVer("teamcity.agent.jvm.version", "1.8") | ||||
|   } | ||||
|  | ||||
|   failureConditions { | ||||
|     failOnMetricChange { | ||||
|       metric = BuildFailureOnMetric.MetricType.TEST_COUNT | ||||
|       threshold = 20 | ||||
|       units = BuildFailureOnMetric.MetricUnit.PERCENTS | ||||
|       comparison = BuildFailureOnMetric.MetricComparison.LESS | ||||
|       compareTo = build { | ||||
|         buildRule = lastSuccessful() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
|  | ||||
| object TestsForIntelliJ20212 : TestsForIntelliJ_203_212_branch("2021.2.2") | ||||
| object TestsForIntelliJ20211 : TestsForIntelliJ_203_212_branch("2021.1") | ||||
| object TestsForIntelliJ20203 : TestsForIntelliJ_203_212_branch("2020.3") | ||||
							
								
								
									
										62
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_213-221.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_213-221.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs | ||||
|  | ||||
| sealed class TestsForIntelliJ_213_221_branch(private val version: String) : BuildType({ | ||||
|   name = "Tests for IntelliJ $version" | ||||
|  | ||||
|   params { | ||||
|     param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false") | ||||
|     param("env.ORG_GRADLE_PROJECT_legacyNoJavaPlugin", "true") | ||||
|     param("env.ORG_GRADLE_PROJECT_ideaVersion", "IC-$version") | ||||
|     param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false") | ||||
|     param("env.ORG_GRADLE_PROJECT_javaVersion", "1.8") | ||||
|   } | ||||
|  | ||||
|   vcs { | ||||
|     root(_Self.vcsRoots.Branch_213_221) | ||||
|  | ||||
|     checkoutMode = CheckoutMode.AUTO | ||||
|   } | ||||
|  | ||||
|   steps { | ||||
|     gradle { | ||||
|       tasks = "clean test" | ||||
|       buildFile = "" | ||||
|       enableStacktrace = true | ||||
|       param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   triggers { | ||||
|     vcs { | ||||
|       branchFilter = "" | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   requirements { | ||||
|     noLessThanVer("teamcity.agent.jvm.version", "1.8") | ||||
|   } | ||||
|  | ||||
|   failureConditions { | ||||
|     failOnMetricChange { | ||||
|       metric = BuildFailureOnMetric.MetricType.TEST_COUNT | ||||
|       threshold = 20 | ||||
|       units = BuildFailureOnMetric.MetricUnit.PERCENTS | ||||
|       comparison = BuildFailureOnMetric.MetricComparison.LESS | ||||
|       compareTo = build { | ||||
|         buildRule = lastSuccessful() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
|  | ||||
| object TestsForIntelliJ20213 : TestsForIntelliJ_213_221_branch("2021.3.2") | ||||
							
								
								
									
										57
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								.teamcity/_Self/buildTypes/TestsForIntelliJ_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs | ||||
|  | ||||
| sealed class TestsForIntelliJ_222_branch(private val version: String) : BuildType({ | ||||
|   name = "Tests for IntelliJ $version" | ||||
|  | ||||
|   params { | ||||
|     param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false") | ||||
|     param("env.ORG_GRADLE_PROJECT_legacyNoJavaPlugin", "true") | ||||
|     param("env.ORG_GRADLE_PROJECT_ideaVersion", "IC-$version") | ||||
|     param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false") | ||||
|   } | ||||
|  | ||||
|   vcs { | ||||
|     root(_Self.vcsRoots.Branch_222) | ||||
|  | ||||
|     checkoutMode = CheckoutMode.AUTO | ||||
|   } | ||||
|  | ||||
|   steps { | ||||
|     gradle { | ||||
|       tasks = "clean test" | ||||
|       buildFile = "" | ||||
|       enableStacktrace = true | ||||
|       param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   triggers { | ||||
|     vcs { | ||||
|       branchFilter = "" | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   failureConditions { | ||||
|     failOnMetricChange { | ||||
|       metric = BuildFailureOnMetric.MetricType.TEST_COUNT | ||||
|       threshold = 20 | ||||
|       units = BuildFailureOnMetric.MetricUnit.PERCENTS | ||||
|       comparison = BuildFailureOnMetric.MetricComparison.LESS | ||||
|       compareTo = build { | ||||
|         buildRule = lastSuccessful() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
|  | ||||
| object TestsForIntelliJ20222 : TestsForIntelliJ_222_branch("2022.2.3") | ||||
							
								
								
									
										20
									
								
								.teamcity/_Self/subprojects/OldTests.kt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.teamcity/_Self/subprojects/OldTests.kt
									
									
									
									
										vendored
									
									
								
							| @@ -8,18 +8,28 @@ import _Self.buildTypes.TestsForIntelliJ20192 | ||||
| import _Self.buildTypes.TestsForIntelliJ20193 | ||||
| import _Self.buildTypes.TestsForIntelliJ20201 | ||||
| import _Self.buildTypes.TestsForIntelliJ20202 | ||||
| import _Self.buildTypes.TestsForIntelliJ20203 | ||||
| import _Self.buildTypes.TestsForIntelliJ20211 | ||||
| import _Self.buildTypes.TestsForIntelliJ20212 | ||||
| import _Self.buildTypes.TestsForIntelliJ20213 | ||||
| import _Self.buildTypes.TestsForIntelliJ20222 | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.Project | ||||
|  | ||||
| object OldTests : Project({ | ||||
|   name = "Old IdeaVim tests" | ||||
|   description = "Tests for older versions of IJ" | ||||
|  | ||||
|   buildType(TestsForIntelliJ20202) | ||||
|   buildType(TestsForIntelliJ20201) | ||||
|   buildType(TestsForIntelliJ20191) | ||||
|   buildType(TestsForIntelliJ20181) | ||||
|   buildType(TestsForIntelliJ20192) | ||||
|   buildType(TestsForIntelliJ20182) | ||||
|   buildType(TestsForIntelliJ20193) | ||||
|   buildType(TestsForIntelliJ20183) | ||||
|   buildType(TestsForIntelliJ20191) | ||||
|   buildType(TestsForIntelliJ20192) | ||||
|   buildType(TestsForIntelliJ20193) | ||||
|   buildType(TestsForIntelliJ20201) | ||||
|   buildType(TestsForIntelliJ20202) | ||||
|   buildType(TestsForIntelliJ20203) | ||||
|   buildType(TestsForIntelliJ20211) | ||||
|   buildType(TestsForIntelliJ20212) | ||||
|   buildType(TestsForIntelliJ20213) | ||||
|   buildType(TestsForIntelliJ20222) | ||||
| }) | ||||
|   | ||||
							
								
								
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_203_212.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_203_212.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.vcsRoots | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||
|  | ||||
| object Branch_203_212 : GitVcsRoot({ | ||||
|   name = "https://github.com/JetBrains/ideavim (branch 203-212)" | ||||
|   url = "https://github.com/JetBrains/ideavim.git" | ||||
|   branch = "203-212" | ||||
|   useMirrors = false | ||||
| }) | ||||
							
								
								
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_213_221.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_213_221.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.vcsRoots | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||
|  | ||||
| object Branch_213_221 : GitVcsRoot({ | ||||
|   id("HttpsGithubComJetBrainsIdeavimBranch213221") | ||||
|   name = "https://github.com/JetBrains/ideavim (branch 213-221)" | ||||
|   url = "https://github.com/JetBrains/ideavim.git" | ||||
|   branch = "213-221" | ||||
| }) | ||||
							
								
								
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.teamcity/_Self/vcsRoots/Branch_222.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.vcsRoots | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||
|  | ||||
| object Branch_222 : GitVcsRoot({ | ||||
|   id("HttpsGithubComJetBrainsIdeavimBranch222") | ||||
|   name = "https://github.com/JetBrains/ideavim (branch 222)" | ||||
|   url = "https://github.com/JetBrains/ideavim.git" | ||||
|   branch = "222" | ||||
| }) | ||||
							
								
								
									
										11
									
								
								.teamcity/_Self/vcsRoots/Branch_Release.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.teamcity/_Self/vcsRoots/Branch_Release.kt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| @file:Suppress("ClassName") | ||||
|  | ||||
| package _Self.vcsRoots | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||
|  | ||||
| object Branch_Release : GitVcsRoot({ | ||||
|   name = "https://github.com/JetBrains/ideavim (branch release)" | ||||
|   url = "https://github.com/JetBrains/ideavim.git" | ||||
|   branch = "release" | ||||
| }) | ||||
							
								
								
									
										65
									
								
								.teamcity/patches/buildTypes/IdeaVimCompatibility.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								.teamcity/patches/buildTypes/IdeaVimCompatibility.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| package patches.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.ScriptBuildStep | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
|  | ||||
| /* | ||||
| This patch script was generated by TeamCity on settings change in UI. | ||||
| To apply the patch, change the buildType with id = 'IdeaVimCompatibility' | ||||
| accordingly, and delete the patch script. | ||||
| */ | ||||
| changeBuildType(RelativeId("IdeaVimCompatibility")) { | ||||
|     vcs { | ||||
|         remove(DslContext.settingsRoot.id!!) | ||||
|     } | ||||
|  | ||||
|     expectSteps { | ||||
|         script { | ||||
|             name = "Check" | ||||
|             scriptContent = """ | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}org.jetbrains.IdeaVim-EasyMotion' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}io.github.mishkun.ideavimsneak' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}eu.theblob42.idea.whichkey' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}IdeaVimExtension' [latest-IU] -team-city | ||||
|                 # Outdated java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}github.zgqq.intellij-enhance' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.github.copilot' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.github.dankinsoid.multicursor' [latest-IU] -team-city | ||||
|                 java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}com.joshestein.ideavim-quickscope' [latest-IU] -team-city | ||||
|             """.trimIndent() | ||||
|         } | ||||
|     } | ||||
|     steps { | ||||
|         update<ScriptBuildStep>(0) { | ||||
|             name = "Load Verifier" | ||||
|             clearConditions() | ||||
|             scriptContent = """ | ||||
|                 mkdir verifier1 | ||||
|                 curl -f -L -o verifier1/verifier-cli-dev-all-1.jar "https://packages.jetbrains.team/files/p/ideavim/plugin-verifier/verifier-cli-dev-all-1.jar" | ||||
|             """.trimIndent() | ||||
|         } | ||||
|         insert(1) { | ||||
|             script { | ||||
|                 name = "Check" | ||||
|                 scriptContent = """ | ||||
|                     # We use a custom build of verifier that downloads IdeaVim from dev channel | ||||
|                     # To create a custom build: Download plugin verifier repo, add an if that switches to dev channel for IdeaVim repo | ||||
|                     # At the moment it's com.jetbrains.pluginverifier.repository.repositories.marketplace.MarketplaceRepository#getLastCompatibleVersionOfPlugin | ||||
|                     # Build using gradlew :intellij-plugin-verifier:verifier-cli:shadowJar | ||||
|                     # Upload verifier-cli-dev-all.jar artifact to the repo in IdeaVim space repo | ||||
|                      | ||||
|                     java --version | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}org.jetbrains.IdeaVim-EasyMotion' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}io.github.mishkun.ideavimsneak' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}eu.theblob42.idea.whichkey' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}IdeaVimExtension' [latest-IU] -team-city | ||||
|                     # Outdated java -jar verifier/verifier-cli-dev-all.jar check-plugin '${'$'}github.zgqq.intellij-enhance' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}com.github.copilot' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}com.github.dankinsoid.multicursor' [latest-IU] -team-city | ||||
|                     java -jar verifier1/verifier-cli-dev-all-1.jar check-plugin '${'$'}com.joshestein.ideavim-quickscope' [latest-IU] -team-city | ||||
|                 """.trimIndent() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										75
									
								
								.teamcity/patches/buildTypes/Qodana.kts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								.teamcity/patches/buildTypes/Qodana.kts
									
									
									
									
										vendored
									
									
								
							| @@ -2,7 +2,14 @@ package patches.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.Qodana | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.qodana | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.ScheduleTrigger | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.VcsTrigger | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
|  | ||||
| /* | ||||
| @@ -14,25 +21,81 @@ changeBuildType(RelativeId("Qodana")) { | ||||
|     expectSteps { | ||||
|         qodana { | ||||
|             name = "Qodana" | ||||
|             reportAsTestsEnable = "true" | ||||
|             failBuildOnErrors = "" | ||||
|             codeInspectionXmlConfig = "Custom" | ||||
|             codeInspectionCustomXmlConfigPath = ".idea/inspectionProfiles/Qodana.xml" | ||||
|             linter = jvm { | ||||
|                 version = Qodana.JVMVersion.LATEST | ||||
|             } | ||||
|             param("clonefinder-enable", "true") | ||||
|             param("clonefinder-languages", "Java") | ||||
|             param("clonefinder-languages-container", "Java Kotlin") | ||||
|             param("clonefinder-mode", "") | ||||
|             param("clonefinder-queried-project", "src") | ||||
|             param("clonefinder-reference-projects", "src") | ||||
|             param("licenseaudit-enable", "true") | ||||
|             param("namesAndTagsCustom", "repo.labs.intellij.net/static-analyser/qodana") | ||||
|             param("report-version", "") | ||||
|             param("yaml-configuration", "") | ||||
|         } | ||||
|     } | ||||
|     steps { | ||||
|         update<Qodana>(0) { | ||||
|         insert(0) { | ||||
|             gradle { | ||||
|                 name = "Generate grammar" | ||||
|                 tasks = "generateGrammarSource" | ||||
|                 param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|             } | ||||
|         } | ||||
|         update<Qodana>(1) { | ||||
|             clearConditions() | ||||
|             param("licenseaudit-enable", "true") | ||||
|             reportAsTests = true | ||||
|             additionalDockerArguments = "-e QODANA_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJvcmdhbml6YXRpb24iOiIzUFZrQSIsInByb2plY3QiOiIzN1FlQSIsInRva2VuIjoiM0t2bXoifQ.uohp81tM7iAfvvB6k8faarfpV-OjusAaEbWQ8iNrOgs" | ||||
|             additionalQodanaArguments = "--baseline qodana.sarif.json" | ||||
|             param("clonefinder-languages", "") | ||||
|             param("collect-anonymous-statistics", "") | ||||
|             param("licenseaudit-enable", "") | ||||
|             param("clonefinder-languages-container", "") | ||||
|             param("clonefinder-queried-project", "") | ||||
|             param("clonefinder-enable", "") | ||||
|             param("clonefinder-reference-projects", "") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     triggers { | ||||
|         val trigger1 = find<VcsTrigger> { | ||||
|             vcs { | ||||
|                 branchFilter = "" | ||||
|             } | ||||
|         } | ||||
|         trigger1.apply { | ||||
|             enabled = false | ||||
|  | ||||
|         } | ||||
|         val trigger2 = find<ScheduleTrigger> { | ||||
|             schedule { | ||||
|                 schedulingPolicy = weekly { | ||||
|                     dayOfWeek = ScheduleTrigger.DAY.Tuesday | ||||
|                 } | ||||
|                 branchFilter = "" | ||||
|                 triggerBuild = always() | ||||
|             } | ||||
|         } | ||||
|         trigger2.apply { | ||||
|             enabled = false | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     failureConditions { | ||||
|         val feature1 = find<BuildFailureOnMetric> { | ||||
|             failOnMetricChange { | ||||
|                 metric = BuildFailureOnMetric.MetricType.QODANA_TOTAL_PROBLEMS_COUNT | ||||
|                 threshold = 0 | ||||
|                 units = BuildFailureOnMetric.MetricUnit.DEFAULT_UNIT | ||||
|                 comparison = BuildFailureOnMetric.MetricComparison.MORE | ||||
|                 compareTo = value() | ||||
|             } | ||||
|         } | ||||
|         feature1.apply { | ||||
|             param("metricKey", "QodanaProblemsNew") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										38
									
								
								.teamcity/patches/buildTypes/Release.kts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								.teamcity/patches/buildTypes/Release.kts
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,8 @@ | ||||
| package patches.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.GradleBuildStep | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
|  | ||||
| /* | ||||
| @@ -9,8 +11,38 @@ To apply the patch, change the buildType with id = 'Release' | ||||
| accordingly, and delete the patch script. | ||||
| */ | ||||
| changeBuildType(RelativeId("Release")) { | ||||
|     vcs { | ||||
|         remove(DslContext.settingsRoot.id!!) | ||||
|         add(RelativeId("Branch_Release")) | ||||
|     params { | ||||
|         add { | ||||
|             password("env.ORG_GRADLE_PROJECT_youtrackToken", "credentialsJSON:3cd3e867-282c-451f-b958-bc95d56a8450", display = ParameterDisplay.HIDDEN) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     expectSteps { | ||||
|         gradle { | ||||
|             tasks = "clean publishPlugin slackNotification" | ||||
|             buildFile = "" | ||||
|             enableStacktrace = true | ||||
|             param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|         } | ||||
|     } | ||||
|     steps { | ||||
|         update<GradleBuildStep>(0) { | ||||
|             clearConditions() | ||||
|             tasks = "clean publishPlugin" | ||||
|         } | ||||
|         insert(1) { | ||||
|             gradle { | ||||
|                 name = "Run Integrations" | ||||
|                 tasks = "releaseActions" | ||||
|                 param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|             } | ||||
|         } | ||||
|         insert(2) { | ||||
|             gradle { | ||||
|                 name = "Slack Notification" | ||||
|                 tasks = "slackNotification" | ||||
|                 param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										27
									
								
								.teamcity/patches/buildTypes/ReleaseEap.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.teamcity/patches/buildTypes/ReleaseEap.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| package patches.buildTypes | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.VcsLabeling | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.vcsLabeling | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
|  | ||||
| /* | ||||
| This patch script was generated by TeamCity on settings change in UI. | ||||
| To apply the patch, change the buildType with id = 'ReleaseEap' | ||||
| accordingly, and delete the patch script. | ||||
| */ | ||||
| changeBuildType(RelativeId("ReleaseEap")) { | ||||
|     features { | ||||
|         val feature1 = find<VcsLabeling> { | ||||
|             vcsLabeling { | ||||
|                 vcsRootId = "${DslContext.settingsRoot.id}" | ||||
|                 labelingPattern = "%system.build.number%" | ||||
|                 successfulOnly = true | ||||
|                 branchFilter = "" | ||||
|             } | ||||
|         } | ||||
|         feature1.apply { | ||||
|             successfulOnly = false | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										50
									
								
								.teamcity/patches/projects/_Self.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								.teamcity/patches/projects/_Self.kts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| package patches.projects | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.AmazonEC2CloudImage | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.Project | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.amazonEC2CloudImage | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
|  | ||||
| /* | ||||
| This patch script was generated by TeamCity on settings change in UI. | ||||
| To apply the patch, change the root project | ||||
| accordingly, and delete the patch script. | ||||
| */ | ||||
| changeProject(DslContext.projectId) { | ||||
|     features { | ||||
|         val feature1 = find<AmazonEC2CloudImage> { | ||||
|             amazonEC2CloudImage { | ||||
|                 id = "PROJECT_EXT_768" | ||||
|                 profileId = "amazon-48" | ||||
|                 agentPoolId = "41" | ||||
|                 name = "BuildAgentsIdeaVim" | ||||
|                 vpcSubnetId = "subnet-58839511" | ||||
|                 keyPairName = "" | ||||
|                 instanceType = "c5d.xlarge" | ||||
|                 securityGroups = listOf("sg-eda08696", "sg-7332cf0f") | ||||
|                 useSpotInstances = true | ||||
|                 instanceTags = mapOf( | ||||
|                     "project" to "idea-vim" | ||||
|                 ) | ||||
|                 source = Source("ami-0fa17ce8238eb8868") | ||||
|                 param("image-instances-limit", "") | ||||
|                 param("spot-instance-price", "") | ||||
|             } | ||||
|         } | ||||
|         feature1.apply { | ||||
|             profileId = "amazon-48" | ||||
|             agentPoolId = "41" | ||||
|             name = "BuildAgentsIdeaVim" | ||||
|             vpcSubnetId = "subnet-58839511" | ||||
|             keyPairName = "" | ||||
|             instanceType = "c5d.xlarge" | ||||
|             securityGroups = listOf("sg-eda08696", "sg-7332cf0f") | ||||
|             useSpotInstances = true | ||||
|             instanceTags = mapOf( | ||||
|                 "project" to "idea-vim" | ||||
|             ) | ||||
|             source = Source("ami-07c529efaddafcf86") | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										18
									
								
								.teamcity/patches/vcsRoots/Branch_Release.kts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.teamcity/patches/vcsRoots/Branch_Release.kts
									
									
									
									
										vendored
									
									
								
							| @@ -1,18 +0,0 @@ | ||||
| package patches.vcsRoots | ||||
|  | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.ui.* | ||||
| import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot | ||||
|  | ||||
| /* | ||||
| This patch script was generated by TeamCity on settings change in UI. | ||||
| To apply the patch, create a vcsRoot with id = 'Branch_Release' | ||||
| in the root project, and delete the patch script. | ||||
| */ | ||||
| create(DslContext.projectId, GitVcsRoot({ | ||||
|     id("Branch_Release") | ||||
|     name = "https://github.com/JetBrains/ideavim (branch release)" | ||||
|     url = "https://github.com/JetBrains/ideavim.git" | ||||
|     branch = "release" | ||||
| })) | ||||
|  | ||||
							
								
								
									
										143
									
								
								AUTHORS.md
									
									
									
									
									
								
							
							
						
						
									
										143
									
								
								AUTHORS.md
									
									
									
									
									
								
							| @@ -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) | ||||
| @@ -133,11 +165,11 @@ Contributors: | ||||
|     | ||||
|   Pavel Fatin | ||||
| * [![icon][mail]](mailto:tietyt@gmail.com) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github-off]](https://github.com/DanKaplanSES) | ||||
|     | ||||
|   tieTYT | ||||
| * [![icon][mail]](mailto:nickgieschen@gmail.com) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github]](https://github.com/nickgieschen) | ||||
|     | ||||
|   Nick Gieschen | ||||
| * [![icon][mail]](mailto:ikenox@gmail.com) | ||||
| @@ -149,11 +181,11 @@ 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) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github-off]](https://github.com/lumie1337) | ||||
|     | ||||
|   Florian Hassmann | ||||
| * [![icon][mail]](mailto:jpalus@fastmail.com) | ||||
| @@ -161,7 +193,7 @@ Contributors: | ||||
|     | ||||
|   Jan Palus | ||||
| * [![icon][mail]](mailto:kpetrov@ripe.net) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github-off]](https://github.com/constpetrov) | ||||
|     | ||||
|   Konstantin Petrov | ||||
| * [![icon][mail]](mailto:ya-ikmik2012@yandex.ru) | ||||
| @@ -188,12 +220,8 @@ Contributors: | ||||
|   [![icon][github]](https://github.com/johngrib) | ||||
|     | ||||
|   John Grib | ||||
| * [![icon][mail]](mailto:hild@b4mad.net) | ||||
|   [![icon][github-off]](#) | ||||
|     | ||||
|   Marcel Hild | ||||
| * [![icon][mail]](mailto:vedranb@gmail.com) | ||||
|   [![icon][github-off]](#) | ||||
|   [![icon][github]](https://github.com/vedran) | ||||
|     | ||||
|   Vedran Budimcic | ||||
| * [![icon][mail]](mailto:andreigasparovici1@gmail.com) | ||||
| @@ -208,10 +236,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) | ||||
|     | ||||
| @@ -284,10 +315,6 @@ Contributors: | ||||
|   [![icon][github]](https://github.com/angelbot) | ||||
|     | ||||
|   John Weigel | ||||
| * [![icon][mail]](mailto:kevinz@weghst.com) | ||||
|   [![icon][github]](https://github.com/kevin70) | ||||
|     | ||||
|   kk | ||||
| * [![icon][mail]](mailto:runforprogram@163.com) | ||||
|   [![icon][github]](https://github.com/runforprogram) | ||||
|     | ||||
| @@ -380,6 +407,66 @@ Contributors: | ||||
|   [![icon][github]](https://github.com/chylex) | ||||
|     | ||||
|   chylex | ||||
| * [![icon][mail]](mailto:daniel.egger@gmail.com) | ||||
|   [![icon][github]](https://github.com/DanEEStar) | ||||
|     | ||||
|   DanEEStar | ||||
| * [![icon][mail]](mailto:ksrbkevinsuen@gmail.com) | ||||
|   [![icon][github]](https://github.com/ksrb) | ||||
|     | ||||
|   Kevin Suen | ||||
| * [![icon][mail]](mailto:michael.schertenleib@inftec.ch) | ||||
|   [![icon][github]](https://github.com/cravay) | ||||
|     | ||||
|   Michael Schertenleib | ||||
| * [![icon][mail]](mailto:piotr@near.org) | ||||
|   [![icon][github]](https://github.com/pmnoxx) | ||||
|     | ||||
|   Piotr Mikulski | ||||
| * [![icon][mail]](mailto:lonrevip@gmail.com) | ||||
|   [![icon][github]](https://github.com/lonre) | ||||
|     | ||||
|   Lonre Wang | ||||
| * [![icon][mail]](mailto:AlexPl292@gmail.com) | ||||
|   [![icon][github]](https://github.com/AlexPl292) | ||||
|     | ||||
|   Alex Pláte | ||||
| * [![icon][mail]](mailto:david@dadon.fr) | ||||
|   [![icon][github]](https://github.com/ddadon10) | ||||
|     | ||||
|   David Dadon | ||||
| * [![icon][mail]](mailto:hollandpirates@gmail.com) | ||||
|   [![icon][github]](https://github.com/PHPirates) | ||||
|     | ||||
|   Thomas Schouten | ||||
| * [![icon][mail]](mailto:sr@mail25.de) | ||||
|   [![icon][github]](https://github.com/Vvalter) | ||||
|     | ||||
|   Simon Rainer | ||||
| * [![icon][mail]](mailto:filipp.vakhitov@jetbrains.com) | ||||
|   [![icon][github]](https://github.com/lippfi) | ||||
|     | ||||
|   lippfi | ||||
| * [![icon][mail]](mailto:3237686+Runinho@users.noreply.github.com) | ||||
|   [![icon][github]](https://github.com/Runinho) | ||||
|     | ||||
|   Runinho | ||||
| * [![icon][mail]](mailto:me@yuhaowen.com) | ||||
|   [![icon][github]](https://github.com/adaext) | ||||
|     | ||||
|   Ada | ||||
|  | ||||
| Previous contributors: | ||||
|  | ||||
| * [![icon][mail]](mailto:hild@b4mad.net) | ||||
|   [![icon][github-off]](#) | ||||
|     | ||||
|   Marcel Hild | ||||
| * [![icon][mail]](mailto:kevinz@weghst.com) | ||||
|   [![icon][github]](https://github.com/kevin70) | ||||
|     | ||||
|   kk | ||||
|  | ||||
|                          | ||||
| If you are a contributor and your name is not listed here, feel free to | ||||
| contact the maintainers. | ||||
|   | ||||
							
								
								
									
										114
									
								
								CHANGES.md
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								CHANGES.md
									
									
									
									
									
								
							| @@ -26,14 +26,122 @@ usual beta standards. | ||||
| ## To Be Released | ||||
|  | ||||
| ### Features: | ||||
| * Add register support to let command | [VIM-749](https://youtrack.jetbrains.com/issue/VIM-749) | ||||
| * Add register support to let command | [VIM-1783](https://youtrack.jetbrains.com/issue/VIM-1783) | ||||
| * Add `trackactionids`/`tai` option to track action ids | ||||
| * Add IdeaVim tutor. You can access it via the status bar icon. | ||||
|  | ||||
| ### Fixes: | ||||
| * [VIM-2797](https://youtrack.jetbrains.com/issue/VIM-2797) Introduce variable to mute default argtextobj mappings | ||||
| * [VIM-758](https://youtrack.jetbrains.com/issue/VIM-758) Support d mappings | ||||
| * [VIM-2577](https://youtrack.jetbrains.com/issue/VIM-2577) Fix paste at the end of notebook cell | ||||
| * [VIM-2813](https://youtrack.jetbrains.com/issue/VIM-2813) Migrate update checker to VimStandalonePluginUpdateChecker | ||||
|  | ||||
| ### Merged PRs: | ||||
| * [558](https://github.com/JetBrains/ideavim/pull/558) by [Matt Ellis](https://github.com/citizenmatt): Fix incorrect normalising for trailing inlay | ||||
| * [554](https://github.com/JetBrains/ideavim/pull/554) by [Matt Ellis](https://github.com/citizenmatt): Refactor "last column" calculations | ||||
| * [553](https://github.com/JetBrains/ideavim/pull/553) by [Matt Ellis](https://github.com/citizenmatt): Rearrange and rename some code in engine | ||||
| * [560](https://github.com/JetBrains/ideavim/pull/560) by [Runinho](https://github.com/Runinho): Fix(VIM-2577) paste not working at end of notebook cell | ||||
| * [571](https://github.com/JetBrains/ideavim/pull/571) by [Ada](https://github.com/adaext): Remove the redundant quotation mark at the end of "packadd matchit" command | ||||
| * [561](https://github.com/JetBrains/ideavim/pull/561) by [Matt Ellis](https://github.com/citizenmatt): Fix incremental search not scrolling to current match | ||||
| * [559](https://github.com/JetBrains/ideavim/pull/559) by [Runinho](https://github.com/Runinho): Fix(VIM-2760) notebookCommandMode detection | ||||
| * [579](https://github.com/JetBrains/ideavim/pull/579) by [Martin Yzeiri](https://github.com/myzeiri): VIM-2799: Add Matchit support for cshtml files | ||||
|  | ||||
| ## 2.0.0, 2022-11-01 | ||||
|  | ||||
| ### Changes: | ||||
| * IdeaVim changes license from GPL-2.0 or later to MIT. [VIM-2782](https://youtrack.jetbrains.com/issue/VIM-2782) | ||||
|  | ||||
| ## 1.12.0, 2022-11-01 | ||||
|  | ||||
| ### Fixes: | ||||
| * [VIM-1758](https://youtrack.jetbrains.com/issue/VIM-1758) Commentary plugin in rider | ||||
| * [VIM-1903](https://youtrack.jetbrains.com/issue/VIM-1903) Autoindent now works in rider | ||||
| * [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 | ||||
| * [VIM-2776](https://youtrack.jetbrains.com/issue/VIM-2776) Use filename index for file search | ||||
|  | ||||
| ### Merged PRs: | ||||
| * [550](https://github.com/JetBrains/ideavim/pull/550) by [Matt Ellis](https://github.com/citizenmatt): Fix(VIM-2778) Remove override of editor scroll setting | ||||
|  | ||||
| ## 1.11.0, 2022-08-09 | ||||
|  | ||||
| ### Features: | ||||
| * Add `gcu` command for Commentary plugin | ||||
| * Add `:Commentary` command, which works great for commands such as `:%g/fun/Commentary` | ||||
| * Support `gc` – commentary text objects. E.g. `dgc`: delete commented text. | ||||
| * Support `redo-register feature` | [VIM-2643](https://youtrack.jetbrains.com/issue/VIM-2643/Dot-operator-doesn-t-increment-number-register-after-pasting-fro) | [viminfo](http://vimdoc.sourceforge.net/htmldoc/undo.html#redo-register) | ||||
|  | ||||
| ### Changes: | ||||
| * Uses the same mappings as Commentary, so custom bindings for the Vim plugin will work with IdeaVim, too. | ||||
|   E.g. `<Plug>Commentary` instead of `<Plug>(CommentMotion)`. Old mappings are maintained for compatibility. | ||||
| * If you open `~/.ideavimrc` in IDE, remove a mapping, and reload the config using the reload button, | ||||
|   the mapping will actually be unmapped. | ||||
| * New vim (and IdeaVim) behaviour: `ci(`& friends searches for the brackets in the line. | ||||
|  | ||||
| ### Fixes: | ||||
| * [VIM-2587](https://youtrack.jetbrains.com/issue/VIM-2587) Use ctrl-6 as ctrl-^ | ||||
| * [VIM-2590](https://youtrack.jetbrains.com/issue/VIM-2590) Fix caret shape in PyCharm | ||||
| * [VIM-2553](https://youtrack.jetbrains.com/issue/VIM-2553) Substitute consecutive matches | ||||
| * [VIM-1687](https://youtrack.jetbrains.com/issue/VIM-1687) Support count for `gcc` | ||||
| * [VIM-2381](https://youtrack.jetbrains.com/issue/VIM-2381) Fall back to line comment if block comment is not available | ||||
| * [VIM-2589](https://youtrack.jetbrains.com/issue/VIM-2589) Add `gc` text object | ||||
| * [VIM-2604](https://youtrack.jetbrains.com/issue/VIM-2604) Update action execution rules | ||||
| * [VIM-2654](https://youtrack.jetbrains.com/issue/VIM-2654) Add support for `return` without expression | ||||
| * [VIM-2630](https://youtrack.jetbrains.com/issue/VIM-2630/Please-fix-warning-Shall-not-be-called-on-a-template-presentatio) Fix IDE freeze | ||||
| * [VIM-2661](https://youtrack.jetbrains.com/issue/VIM-2661/Spamming-does-not-work) Fix repeating the `@@` command | ||||
| * [VIM-2668](https://youtrack.jetbrains.com/issue/VIM-2668/tabm-or-tabm-with-no-number-does-not-match-vim-behavior) Fix omitted numbers in `tabm` command | ||||
| * [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-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 | ||||
| * [483](https://github.com/JetBrains/ideavim/pull/483) by [Simon Rainer](https://github.com/Vvalter): Fix(VIM-2553): Substitute consecutive matches | ||||
| * [488](https://github.com/JetBrains/ideavim/pull/488) by [Martin Yzeiri](https://github.com/myzeiri): Add Matchit support for the C family of languages | ||||
| * [493](https://github.com/JetBrains/ideavim/pull/493) by [Matt Ellis](https://github.com/citizenmatt): Improvements to Commentary extension | ||||
| * [494](https://github.com/JetBrains/ideavim/pull/494) by [Matt Ellis](https://github.com/citizenmatt): Cleanup pre-212 CaretVisualAttributes compatibility code | ||||
| * [504](https://github.com/JetBrains/ideavim/pull/504) by [Matt Ellis](https://github.com/citizenmatt): Minor bug fixes | ||||
| * [519](https://github.com/JetBrains/ideavim/pull/519) by [chylex](https://github.com/chylex): Fix(VIM-2227): Wrong behavior when deleting / changing surround with invalid character | ||||
| * [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 | ||||
|  | ||||
| ### Features: | ||||
| * Add register support to let command | [VIM-749](https://youtrack.jetbrains.com/issue/VIM-749), [VIM-1783](https://youtrack.jetbrains.com/issue/VIM-1783) | ||||
| * Add tabmove command | [VIM-1164](https://youtrack.jetbrains.com/issue/VIM-1164) | ||||
|  | ||||
| ### Fixes: | ||||
| * [VIM-2502](https://youtrack.jetbrains.com/issue/VIM-2502) Fix the shape of new carets | ||||
| * [VIM-2499](https://youtrack.jetbrains.com/issue/VIM-2499) Fix mapping to esc | ||||
| * [VIM-2500](https://youtrack.jetbrains.com/issue/VIM-2500) Fix esc for normal mode | ||||
| * [VIM-2523](https://youtrack.jetbrains.com/issue/VIM-2523) `i` command for the folder in the project tree | ||||
| * [VIM-2471](https://youtrack.jetbrains.com/issue/VIM-2471) Multiple [{ and ]} actions | ||||
| * [VIM-2504](https://youtrack.jetbrains.com/issue/VIM-2504) Fix esc with using python notebooks | ||||
| * [VIM-2540](https://youtrack.jetbrains.com/issue/VIM-2540) Fix option listeners | ||||
| * [VIM-2548](https://youtrack.jetbrains.com/issue/VIM-2548) Fix paste | ||||
| * [VIM-2470](https://youtrack.jetbrains.com/issue/VIM-2470) Fix incorrect reset of cursor shape | ||||
| * [VIM-2223](https://youtrack.jetbrains.com/issue/VIM-2223), [VIM-1684](https://youtrack.jetbrains.com/issue/VIM-1684), [VIM-2491](https://youtrack.jetbrains.com/issue/VIM-2491) Fix `gv` | ||||
|  | ||||
| ### Merged PRs: | ||||
| * [441](https://github.com/JetBrains/ideavim/pull/441) by [DanEEStar](https://github.com/DanEEStar): Add Matchit support for Vue.js files | ||||
| * [440](https://github.com/JetBrains/ideavim/pull/440) by [Kevin Suen](https://github.com/ksrb): Add matchit support for handlebars | ||||
| * [448](https://github.com/JetBrains/ideavim/pull/448) by [Michael Schertenleib](https://github.com/cravay): Support custom element names in vim-surround | ||||
| * [435](https://github.com/JetBrains/ideavim/pull/435) by [Piotr Mikulski](https://github.com/pmnoxx): Print stderr when running a command just like vim does | ||||
| * [449](https://github.com/JetBrains/ideavim/pull/449) by [Lonre Wang](https://github.com/lonre): Typo fix | ||||
| * [453](https://github.com/JetBrains/ideavim/pull/453) by [Matt Ellis](https://github.com/citizenmatt): fix(VIM-2470): Fix incorrect reset of cursor shape | ||||
| * [461](https://github.com/JetBrains/ideavim/pull/461) by [David Dadon](https://github.com/ddadon10): Add shortcut to ideajoin example | ||||
|  | ||||
| ## 1.9.0, 2021-12-10 | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,9 @@ IdeaVim is an open source project created by 80+ contributors. Would you like to | ||||
|  | ||||
| This page is created to help you start contributing. And who knows, maybe in a few days this project will be brighter than ever! | ||||
|  | ||||
| :warning: The plugin is currently under a huge refactoring aiming to split into vim-engine and IdeaVim in order to | ||||
| support the new [Fleet IDE](https://www.jetbrains.com/fleet/). Please see [Fleet refactoring](#Fleet-refactoring). | ||||
|  | ||||
| ## Before you begin | ||||
|  | ||||
| - The project is written in Kotlin and Java. Choose whichever language you feel more comfortable with, | ||||
| @@ -29,7 +32,7 @@ OK, ready to do some coding? | ||||
| Yoo hoo! You’re all set to begin contributing. | ||||
| We've prepared some useful configurations for you: | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| And here are useful gradle commands: | ||||
|  | ||||
| @@ -71,7 +74,7 @@ If you are looking for: | ||||
|  | ||||
| - Common features: | ||||
|     - State machine. How every particular keystroke is parsed in IdeaVim: `KeyHandler.handleKey()`. | ||||
|     - Options (`incsearch`, `iskeyword`, `relativenumber`): `OptionsManager`. | ||||
|     - Options (`incsearch`, `iskeyword`, `relativenumber`): `OptionServiceImpl`. | ||||
|     - Plugin startup: `PluginStartup`. | ||||
|     - Notifications: `NotificationService`. | ||||
|     - Status bar icon: `StatusBar.kt`. | ||||
| @@ -117,6 +120,17 @@ so you can reuse your `.vimrc` settings. | ||||
| We also support proper command mappings (functions are mapped to `<Plug>...`), the operator function (`OperatorFunction`), and so on. | ||||
| - Magic is supported as well. See `Magic`. | ||||
|  | ||||
|  | ||||
| ## Fleet refactoring | ||||
| At the moment, IdeaVim is under an active refactoring aiming to split IdeaVim into two modules: vim-engine and IdeaVim. | ||||
|  | ||||
| If you develop a plugin that depends on IdeaVim: We have an instrument to check that our changes don't affect | ||||
| the plugins in the marketplace. Also, we commit to support currently used API at least till the end of 2022. | ||||
| If you still encounter any issues with the newer versions of IdeaVim, please [contact maintainers](https://github.com/JetBrains/ideavim#contact-maintainers). | ||||
| We kindly ask you not to use anything from the new API (like `VimEditor`, `injector`) because at the moment we don't | ||||
| guarantee the compatibility of this API in the future versions. | ||||
|  | ||||
|  | ||||
| ----- | ||||
|  | ||||
| ### I read the whole page but something is still unclear. | ||||
|   | ||||
							
								
								
									
										352
									
								
								LICENSE.txt
									
									
									
									
									
								
							
							
						
						
									
										352
									
								
								LICENSE.txt
									
									
									
									
									
								
							| @@ -1,339 +1,21 @@ | ||||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|                        Version 2, June 1991 | ||||
| MIT License | ||||
|  | ||||
|  Copyright (C) 1989, 1991 Free Software Foundation, Inc., | ||||
|  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
| Copyright (c) 2003-present The IdeaVim authors | ||||
|  | ||||
|                             Preamble | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| License is intended to guarantee your freedom to share and change free | ||||
| software--to make sure the software is free for all its users.  This | ||||
| General Public License applies to most of the Free Software | ||||
| Foundation's software and to any other program whose authors commit to | ||||
| using it.  (Some other Free Software Foundation software is covered by | ||||
| the GNU Lesser General Public License instead.)  You can apply it to | ||||
| your programs, too. | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| this service if you wish), that you receive source code or can get it | ||||
| if you want it, that you can change the software or use pieces of it | ||||
| in new free programs; and that you know you can do these things. | ||||
|  | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| anyone to deny you these rights or to ask you to surrender the rights. | ||||
| These restrictions translate to certain responsibilities for you if you | ||||
| distribute copies of the software, or if you modify it. | ||||
|  | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must give the recipients all the rights that | ||||
| you have.  You must make sure that they, too, receive or can get the | ||||
| source code.  And you must show them these terms so they know their | ||||
| rights. | ||||
|  | ||||
|   We protect your rights with two steps: (1) copyright the software, and | ||||
| (2) offer you this license which gives you legal permission to copy, | ||||
| distribute and/or modify the software. | ||||
|  | ||||
|   Also, for each author's protection and ours, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| software.  If the software is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original, so | ||||
| that any problems introduced by others will not reflect on the original | ||||
| authors' reputations. | ||||
|  | ||||
|   Finally, any free program is threatened constantly by software | ||||
| patents.  We wish to avoid the danger that redistributors of a free | ||||
| program will individually obtain patent licenses, in effect making the | ||||
| program proprietary.  To prevent this, we have made it clear that any | ||||
| patent must be licensed for everyone's free use or not licensed at all. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
|   0. This License applies to any program or other work which contains | ||||
| a notice placed by the copyright holder saying it may be distributed | ||||
| under the terms of this General Public License.  The "Program", below, | ||||
| refers to any such program or work, and a "work based on the Program" | ||||
| means either the Program or any derivative work under copyright law: | ||||
| that is to say, a work containing the Program or a portion of it, | ||||
| either verbatim or with modifications and/or translated into another | ||||
| language.  (Hereinafter, translation is included without limitation in | ||||
| the term "modification".)  Each licensee is addressed as "you". | ||||
|  | ||||
| Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running the Program is not restricted, and the output from the Program | ||||
| is covered only if its contents constitute a work based on the | ||||
| Program (independent of having been made by running the Program). | ||||
| Whether that is true depends on what the Program does. | ||||
|  | ||||
|   1. You may copy and distribute verbatim copies of the Program's | ||||
| source code as you receive it, in any medium, provided that you | ||||
| conspicuously and appropriately publish on each copy an appropriate | ||||
| copyright notice and disclaimer of warranty; keep intact all the | ||||
| notices that refer to this License and to the absence of any warranty; | ||||
| and give any other recipients of the Program a copy of this License | ||||
| along with the Program. | ||||
|  | ||||
| You may charge a fee for the physical act of transferring a copy, and | ||||
| you may at your option offer warranty protection in exchange for a fee. | ||||
|  | ||||
|   2. You may modify your copy or copies of the Program or any portion | ||||
| of it, thus forming a work based on the Program, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) You must cause the modified files to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
|  | ||||
|     b) You must cause any work that you distribute or publish, that in | ||||
|     whole or in part contains or is derived from the Program or any | ||||
|     part thereof, to be licensed as a whole at no charge to all third | ||||
|     parties under the terms of this License. | ||||
|  | ||||
|     c) If the modified program normally reads commands interactively | ||||
|     when run, you must cause it, when started running for such | ||||
|     interactive use in the most ordinary way, to print or display an | ||||
|     announcement including an appropriate copyright notice and a | ||||
|     notice that there is no warranty (or else, saying that you provide | ||||
|     a warranty) and that users may redistribute the program under | ||||
|     these conditions, and telling the user how to view a copy of this | ||||
|     License.  (Exception: if the Program itself is interactive but | ||||
|     does not normally print such an announcement, your work based on | ||||
|     the Program is not required to print an announcement.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Program, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Program, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote it. | ||||
|  | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Program. | ||||
|  | ||||
| In addition, mere aggregation of another work not based on the Program | ||||
| with the Program (or with a work based on the Program) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
|  | ||||
|   3. You may copy and distribute the Program (or a work based on it, | ||||
| under Section 2) in object code or executable form under the terms of | ||||
| Sections 1 and 2 above provided that you also do one of the following: | ||||
|  | ||||
|     a) Accompany it with the complete corresponding machine-readable | ||||
|     source code, which must be distributed under the terms of Sections | ||||
|     1 and 2 above on a medium customarily used for software interchange; or, | ||||
|  | ||||
|     b) Accompany it with a written offer, valid for at least three | ||||
|     years, to give any third party, for a charge no more than your | ||||
|     cost of physically performing source distribution, a complete | ||||
|     machine-readable copy of the corresponding source code, to be | ||||
|     distributed under the terms of Sections 1 and 2 above on a medium | ||||
|     customarily used for software interchange; or, | ||||
|  | ||||
|     c) Accompany it with the information you received as to the offer | ||||
|     to distribute corresponding source code.  (This alternative is | ||||
|     allowed only for noncommercial distribution and only if you | ||||
|     received the program in object code or executable form with such | ||||
|     an offer, in accord with Subsection b above.) | ||||
|  | ||||
| The source code for a work means the preferred form of the work for | ||||
| making modifications to it.  For an executable work, complete source | ||||
| code means all the source code for all modules it contains, plus any | ||||
| associated interface definition files, plus the scripts used to | ||||
| control compilation and installation of the executable.  However, as a | ||||
| special exception, the source code distributed need not include | ||||
| anything that is normally distributed (in either source or binary | ||||
| form) with the major components (compiler, kernel, and so on) of the | ||||
| operating system on which the executable runs, unless that component | ||||
| itself accompanies the executable. | ||||
|  | ||||
| If distribution of executable or object code is made by offering | ||||
| access to copy from a designated place, then offering equivalent | ||||
| access to copy the source code from the same place counts as | ||||
| distribution of the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   4. You may not copy, modify, sublicense, or distribute the Program | ||||
| except as expressly provided under this License.  Any attempt | ||||
| otherwise to copy, modify, sublicense or distribute the Program is | ||||
| void, and will automatically terminate your rights under this License. | ||||
| However, parties who have received copies, or rights, from you under | ||||
| this License will not have their licenses terminated so long as such | ||||
| parties remain in full compliance. | ||||
|  | ||||
|   5. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Program or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Program (or any work based on the | ||||
| Program), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Program or works based on it. | ||||
|  | ||||
|   6. Each time you redistribute the Program (or any work based on the | ||||
| Program), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute or modify the Program subject to | ||||
| these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties to | ||||
| this License. | ||||
|  | ||||
|   7. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Program at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Program by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Program. | ||||
|  | ||||
| If any portion of this section is held invalid or unenforceable under | ||||
| any particular circumstance, the balance of the section is intended to | ||||
| apply and the section as a whole is intended to apply in other | ||||
| circumstances. | ||||
|  | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system, which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
|  | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   8. If the distribution and/or use of the Program is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Program under this License | ||||
| may add an explicit geographical distribution limitation excluding | ||||
| those countries, so that distribution is permitted only in or among | ||||
| countries not thus excluded.  In such case, this License incorporates | ||||
| the limitation as if written in the body of this License. | ||||
|  | ||||
|   9. The Free Software Foundation may publish revised and/or new versions | ||||
| of the General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
| Each version is given a distinguishing version number.  If the Program | ||||
| specifies a version number of this License which applies to it and "any | ||||
| later version", you have the option of following the terms and conditions | ||||
| either of that version or of any later version published by the Free | ||||
| Software Foundation.  If the Program does not specify a version number of | ||||
| this License, you may choose any version ever published by the Free Software | ||||
| Foundation. | ||||
|  | ||||
|   10. If you wish to incorporate parts of the Program into other free | ||||
| programs whose distribution conditions are different, write to the author | ||||
| to ask for permission.  For software which is copyrighted by the Free | ||||
| Software Foundation, write to the Free Software Foundation; we sometimes | ||||
| make exceptions for this.  Our decision will be guided by the two goals | ||||
| of preserving the free status of all derivatives of our free software and | ||||
| of promoting the sharing and reuse of software generally. | ||||
|  | ||||
|                             NO WARRANTY | ||||
|  | ||||
|   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||
| REPAIR OR CORRECTION. | ||||
|  | ||||
|   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGES. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| convey the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU General Public License along | ||||
|     with this program; if not, write to the Free Software Foundation, Inc., | ||||
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
| If the program is interactive, make it output a short notice like this | ||||
| when it starts in an interactive mode: | ||||
|  | ||||
|     Gnomovision version 69, Copyright (C) year name of author | ||||
|     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
|  | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, the commands you use may | ||||
| be called something other than `show w' and `show c'; they could even be | ||||
| mouse-clicks or menu items--whatever suits your program. | ||||
|  | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the program, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
|  | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||
|   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||
|  | ||||
|   <signature of Ty Coon>, 1 April 1989 | ||||
|   Ty Coon, President of Vice | ||||
|  | ||||
| This General Public License does not permit incorporating your program into | ||||
| proprietary programs.  If your program is a subroutine library, you may | ||||
| consider it more useful to permit linking proprietary applications with the | ||||
| library.  If this is what you want to do, use the GNU Lesser General | ||||
| Public License instead of this License. | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|   | ||||
							
								
								
									
										27
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								README.md
									
									
									
									
									
								
							| @@ -9,9 +9,10 @@ IdeaVim | ||||
| [![Rating][plugin-rating-svg]][plugin-repo] | ||||
| [![Version][plugin-version-svg]][plugin-repo] | ||||
| [![Gitter][gitter-svg]][gitter] | ||||
| [](https://codecov.io/gh/JetBrains/ideavim) | ||||
| [![Twitter][twitter-svg]][twitter] | ||||
|  | ||||
| IdeaVim is a Vim 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 +37,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 +89,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/IdeaVim-Plugins): | ||||
|  | ||||
| * vim-easymotion | ||||
| * NERDTree | ||||
| @@ -103,6 +104,7 @@ Here are some examples of supported vim features and commands: | ||||
| * vim-paragraph-motion | ||||
| * vim-indent-object | ||||
| * match.it   | ||||
| etc | ||||
|  | ||||
| See also: | ||||
|  | ||||
| @@ -198,10 +200,10 @@ 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) | ||||
| See [doc/emulated-plugins.md](https://github.com/JetBrains/ideavim/wiki/IdeaVim-Plugins) | ||||
|  | ||||
| Executing IDE Actions | ||||
| --------------------- | ||||
| @@ -212,6 +214,7 @@ Ex commands or via `:map` command mappings: | ||||
| ### Executing actions: | ||||
| * `:action {action_id}` | ||||
|     * Execute an action by `{action_id}`. Works from Ex command line. | ||||
|     * Please don't use `:action` in mappings. Use `<Action>` instead. | ||||
| * `<Action>({action_id})` | ||||
|     * For the mappings you can use a special `<Action>` keyword. Don't forget the parentheses. | ||||
|     * E.g. `map gh <Action>(ShowErrorDescription)`  <- execute hover on `gh`. | ||||
| @@ -225,7 +228,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> | ||||
|  | ||||
|  | ||||
| @@ -360,8 +366,13 @@ is the full list of synonyms. | ||||
| License | ||||
| ------- | ||||
|  | ||||
| IdeaVim is licensed under the terms of the GNU Public License version 2 | ||||
| or any later version. | ||||
| IdeaVim is licensed under the MIT license. | ||||
|  | ||||
| Third-party components and licenses are listed in [ThirdPartyLicenses.md](ThirdPartyLicenses.md). | ||||
|  | ||||
| All releases before 2.0.0 were licensed under terms of GPL-2.0 or later. | ||||
| The last commit before switch to MIT is 05852b07c6090ad40fde7d3cafe0b074604f7ac5. | ||||
| You can read more about the license change here: https://github.com/JetBrains/ideavim/discussions/543 | ||||
|  | ||||
|  | ||||
| <!-- Badges --> | ||||
|   | ||||
							
								
								
									
										85
									
								
								ThirdPartyLicenses.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								ThirdPartyLicenses.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| IdeaVim project is licensed under MIT license except the following parts of it: | ||||
|  | ||||
| File [RegExp.kt](src/main/java/com/maddyhome/idea/vim/regexp/RegExp.kt) is licensed under Vim License.   | ||||
| File [Tutor.kt](src/main/java/com/maddyhome/idea/vim/ui/Tutor.kt) is licensed under Vim License. | ||||
|  | ||||
| ``` | ||||
| VIM LICENSE | ||||
|  | ||||
| I)  There are no restrictions on distributing unmodified copies of Vim except | ||||
|     that they must include this license text.  You can also distribute | ||||
|     unmodified parts of Vim, likewise unrestricted except that they must | ||||
|     include this license text.  You are also allowed to include executables | ||||
|     that you made from the unmodified Vim sources, plus your own usage | ||||
|     examples and Vim scripts. | ||||
|  | ||||
| II) It is allowed to distribute a modified (or extended) version of Vim, | ||||
|     including executables and/or source code, when the following four | ||||
|     conditions are met: | ||||
|     1) This license text must be included unmodified. | ||||
|     2) The modified Vim must be distributed in one of the following five ways: | ||||
|        a) If you make changes to Vim yourself, you must clearly describe in | ||||
|           the distribution how to contact you.  When the maintainer asks you | ||||
|           (in any way) for a copy of the modified Vim you distributed, you | ||||
|           must make your changes, including source code, available to the | ||||
|           maintainer without fee.  The maintainer reserves the right to | ||||
|           include your changes in the official version of Vim.  What the | ||||
|           maintainer will do with your changes and under what license they | ||||
|           will be distributed is negotiable.  If there has been no negotiation | ||||
|           then this license, or a later version, also applies to your changes. | ||||
|           The current maintainer is Bram Moolenaar <Bram@vim.org>.  If this | ||||
|           changes it will be announced in appropriate places (most likely | ||||
|           vim.sf.net, www.vim.org and/or comp.editors). When it is completely | ||||
|           impossible to contact the maintainer, the obligation to send him | ||||
|           your changes ceases.  Once the maintainer has confirmed that he has | ||||
|           received your changes they will not have to be sent again. | ||||
|        b) If you have received a modified Vim that was distributed as | ||||
|           mentioned under a) you are allowed to further distribute it | ||||
|           unmodified, as mentioned at I).  If you make additional changes the | ||||
|           text under a) applies to those changes. | ||||
|        c) Provide all the changes, including source code, with every copy of | ||||
|           the modified Vim you distribute.  This may be done in the form of a | ||||
|           context diff.  You can choose what license to use for new code you | ||||
|           add.  The changes and their license must not restrict others from | ||||
|           making their own changes to the official version of Vim. | ||||
|        d) When you have a modified Vim which includes changes as mentioned | ||||
|           under c), you can distribute it without the source code for the | ||||
|           changes if the following three conditions are met: | ||||
|           - The license that applies to the changes permits you to distribute | ||||
|             the changes to the Vim maintainer without fee or restriction, and | ||||
|             permits the Vim maintainer to include the changes in the official | ||||
|             version of Vim without fee or restriction. | ||||
|           - You keep the changes for at least three years after last | ||||
|             distributing the corresponding modified Vim.  When the maintainer | ||||
|             or someone who you distributed the modified Vim to asks you (in | ||||
|             any way) for the changes within this period, you must make them | ||||
|             available to him. | ||||
|           - You clearly describe in the distribution how to contact you.  This | ||||
|             contact information must remain valid for at least three years | ||||
|             after last distributing the corresponding modified Vim, or as long | ||||
|             as possible. | ||||
|        e) When the GNU General Public License (GPL) applies to the changes, | ||||
|           you can distribute the modified Vim under the GNU GPL version 2 or | ||||
|           any later version. | ||||
|     3) A message must be added, at least in the output of the ":version" | ||||
|        command and in the intro screen, such that the user of the modified Vim | ||||
|        is able to see that it was modified.  When distributing as mentioned | ||||
|        under 2)e) adding the message is only required for as far as this does | ||||
|        not conflict with the license used for the changes. | ||||
|     4) The contact information as required under 2)a) and 2)d) must not be | ||||
|        removed or changed, except that the person himself can make | ||||
|        corrections. | ||||
|  | ||||
| III) If you distribute a modified version of Vim, you are encouraged to use | ||||
|      the Vim license for your changes and make them available to the | ||||
|      maintainer, including the source code.  The preferred way to do this is | ||||
|      by e-mail or by uploading the files to a server and e-mailing the URL. | ||||
|      If the number of changes is small (e.g., a modified Makefile) e-mailing a | ||||
|      context diff will do.  The e-mail address to be used is | ||||
|      <maintainer@vim.org> | ||||
|  | ||||
| IV)  It is not allowed to remove this license from the distribution of the Vim | ||||
|      sources, parts of it or from a modified version.  You may use this | ||||
|      license for previous Vim releases instead of the license that they came | ||||
|      with, at your option. | ||||
| ``` | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/contributing/configs-dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/contributing/configs-dark.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 27 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/contributing/configs-light.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/contributing/configs-light.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 31 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 22 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/readme/track_action_dark.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/readme/track_action_dark.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.0 MiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 2.1 MiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/readme/track_action_light.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/readme/track_action_light.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 981 KiB | 
							
								
								
									
										533
									
								
								build.gradle.kts
									
									
									
									
									
								
							
							
						
						
									
										533
									
								
								build.gradle.kts
									
									
									
									
									
								
							| @@ -1,5 +1,35 @@ | ||||
| /* | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| import dev.feedforward.markdownto.DownParser | ||||
| import io.ktor.client.* | ||||
| import io.ktor.client.call.* | ||||
| import io.ktor.client.engine.cio.* | ||||
| import io.ktor.client.plugins.auth.* | ||||
| import io.ktor.client.plugins.auth.providers.* | ||||
| import io.ktor.client.plugins.contentnegotiation.* | ||||
| import io.ktor.client.request.* | ||||
| import io.ktor.http.* | ||||
| import io.ktor.serialization.kotlinx.json.* | ||||
| import kotlinx.coroutines.runBlocking | ||||
| import kotlinx.serialization.json.Json | ||||
| import kotlinx.serialization.json.JsonArray | ||||
| import kotlinx.serialization.json.JsonObject | ||||
| import kotlinx.serialization.json.addJsonObject | ||||
| import kotlinx.serialization.json.buildJsonObject | ||||
| import kotlinx.serialization.json.jsonArray | ||||
| import kotlinx.serialization.json.jsonObject | ||||
| import kotlinx.serialization.json.jsonPrimitive | ||||
| import kotlinx.serialization.json.put | ||||
| import kotlinx.serialization.json.putJsonArray | ||||
| import kotlinx.serialization.json.putJsonObject | ||||
| import org.eclipse.jgit.api.Git | ||||
| import org.eclipse.jgit.lib.RepositoryBuilder | ||||
| import org.intellij.markdown.ast.getTextInNode | ||||
| import java.net.HttpURLConnection | ||||
| import java.net.URL | ||||
| @@ -11,24 +41,36 @@ buildscript { | ||||
|     } | ||||
|  | ||||
|     dependencies { | ||||
|         classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10") | ||||
|         classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20") | ||||
|         classpath("com.github.AlexPl292:mark-down-to-slack:1.1.2") | ||||
|         classpath("org.eclipse.jgit:org.eclipse.jgit:5.13.0.202109080827-r") | ||||
|         classpath("org.kohsuke:github-api:1.301") | ||||
|         classpath("org.jetbrains:markdown:0.2.4") | ||||
|         classpath("org.eclipse.jgit:org.eclipse.jgit:6.1.0.202203080745-r") | ||||
|         classpath("org.kohsuke:github-api:1.305") | ||||
|  | ||||
|         classpath("io.ktor:ktor-client-core:2.1.3") | ||||
|         classpath("io.ktor:ktor-client-cio:2.1.3") | ||||
|         classpath("io.ktor:ktor-client-auth:2.1.3") | ||||
|         classpath("io.ktor:ktor-client-content-negotiation:2.1.3") | ||||
|         classpath("io.ktor:ktor-serialization-kotlinx-json:2.1.3") | ||||
|  | ||||
|         // This comes from the changelog plugin | ||||
| //        classpath("org.jetbrains:markdown:0.3.1") | ||||
|     } | ||||
| } | ||||
|  | ||||
| plugins { | ||||
|     antlr | ||||
|     java | ||||
|     kotlin("jvm") version "1.5.10" | ||||
|     kotlin("jvm") version "1.7.20" | ||||
|     application | ||||
|  | ||||
|     id("org.jetbrains.intellij") version "1.3.0" | ||||
|     id("org.jetbrains.intellij") version "1.11.1-SNAPSHOT" | ||||
|     id("org.jetbrains.changelog") version "1.3.1" | ||||
|  | ||||
|     // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle | ||||
|     id("org.jlleitschuh.gradle.ktlint") version "10.2.0" | ||||
|     id("org.jlleitschuh.gradle.ktlint") version "10.3.0" | ||||
|  | ||||
|     id("org.jetbrains.kotlinx.kover") version "0.6.1" | ||||
|     id("com.dorongold.task-tree") version "2.1.0" | ||||
| } | ||||
|  | ||||
| // Import variables from gradle.properties file | ||||
| @@ -38,11 +80,13 @@ val ideaVersion: String by project | ||||
| val downloadIdeaSources: String by project | ||||
| val instrumentPluginCode: String by project | ||||
| val remoteRobotVersion: String by project | ||||
| val antlrVersion: String by project | ||||
|  | ||||
| val publishChannels: String by project | ||||
| val publishToken: String by project | ||||
|  | ||||
| val slackUrl: String by project | ||||
| val youtrackToken: String by project | ||||
|  | ||||
| repositories { | ||||
|     mavenCentral() | ||||
| @@ -57,11 +101,21 @@ dependencies { | ||||
|     testImplementation("com.ensarsarajcic.neovim.java:neovim-api:0.2.3") | ||||
|     testImplementation("com.ensarsarajcic.neovim.java:core-rpc:0.2.3") | ||||
|  | ||||
|     // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-test | ||||
|     testImplementation("org.jetbrains.kotlin:kotlin-test:$kotlinVersion") | ||||
|  | ||||
|     // https://mvnrepository.com/artifact/org.mockito.kotlin/mockito-kotlin | ||||
|     testImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0") | ||||
|  | ||||
|     testImplementation("com.intellij.remoterobot:remote-robot:$remoteRobotVersion") | ||||
|     testImplementation("com.intellij.remoterobot:remote-fixtures:$remoteRobotVersion") | ||||
|     testImplementation("com.automation-remarks:video-recorder-junit:2.0") | ||||
|     runtimeOnly("org.antlr:antlr4-runtime:4.9.3") | ||||
|     antlr("org.antlr:antlr4:4.9.3") | ||||
|     runtimeOnly("org.antlr:antlr4-runtime:$antlrVersion") | ||||
|     antlr("org.antlr:antlr4:$antlrVersion") | ||||
|  | ||||
|     api(project(":vim-engine")) | ||||
|  | ||||
|     testApi("com.squareup.okhttp3:okhttp:4.10.0") | ||||
| } | ||||
|  | ||||
| configurations { | ||||
| @@ -71,6 +125,24 @@ configurations { | ||||
| } | ||||
|  | ||||
| // --- Compilation | ||||
| // This can be moved to other test registration when issue with tests in gradle will be fixed | ||||
| tasks.register<Test>("testWithNeovim") { | ||||
|     group = "verification" | ||||
|     systemProperty("ideavim.nvim.test", "true") | ||||
|     exclude("/ui/**") | ||||
|     exclude("**/longrunning/**") | ||||
|     exclude("**/propertybased/**") | ||||
| } | ||||
|  | ||||
| tasks.register<Test>("testPropertyBased") { | ||||
|     group = "verification" | ||||
| //    include("**/propertybased/**") | ||||
| } | ||||
|  | ||||
| tasks.register<Test>("testLongRunning") { | ||||
|     group = "verification" | ||||
| //    include("**/longrunning/**") | ||||
| } | ||||
|  | ||||
| tasks { | ||||
|     // Issue in gradle 7.3 | ||||
| @@ -83,6 +155,34 @@ tasks { | ||||
|         exclude("**/ParserTest.class") | ||||
|     } | ||||
|  | ||||
|     val testWithNeovim by getting(Test::class) { | ||||
|         isScanForTestClasses = false | ||||
|         // Only run tests from classes that end with "Test" | ||||
|         include("**/*Test.class") | ||||
|         include("**/*test.class") | ||||
|         include("**/*Tests.class") | ||||
|         exclude("**/ParserTest.class") | ||||
|         exclude("**/longrunning/**") | ||||
|         exclude("**/propertybased/**") | ||||
|     } | ||||
|  | ||||
|     val testPropertyBased by getting(Test::class) { | ||||
|         isScanForTestClasses = false | ||||
|         // Only run tests from classes that end with "Test" | ||||
|         include("**/propertybased/*Test.class") | ||||
|         include("**/propertybased/*test.class") | ||||
|         include("**/propertybased/*Tests.class") | ||||
|     } | ||||
|  | ||||
|     val testLongRunning by getting(Test::class) { | ||||
|         isScanForTestClasses = false | ||||
|         // Only run tests from classes that end with "Test" | ||||
|         include("**/longrunning/**/*Test.class") | ||||
|         include("**/longrunning/**/*test.class") | ||||
|         include("**/longrunning/**/*Tests.class") | ||||
|         exclude("**/longrunning/**/ParserTest.class") | ||||
|     } | ||||
|  | ||||
|     compileJava { | ||||
|         sourceCompatibility = javaVersion | ||||
|         targetCompatibility = javaVersion | ||||
| @@ -93,19 +193,32 @@ tasks { | ||||
|     compileKotlin { | ||||
|         kotlinOptions { | ||||
|             jvmTarget = javaVersion | ||||
|             apiVersion = "1.4" | ||||
|             apiVersion = "1.6" | ||||
|             freeCompilerArgs = listOf("-Xjvm-default=all-compatibility") | ||||
| //            allWarningsAsErrors = true | ||||
|         } | ||||
|     } | ||||
|     compileTestKotlin { | ||||
|         kotlinOptions { | ||||
|             jvmTarget = javaVersion | ||||
|             apiVersion = "1.4" | ||||
|             apiVersion = "1.6" | ||||
| //            allWarningsAsErrors = true | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| java { | ||||
|     toolchain { | ||||
|         languageVersion.set(JavaLanguageVersion.of(javaVersion)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| kotlin { | ||||
|     jvmToolchain { | ||||
|         languageVersion.set(JavaLanguageVersion.of(javaVersion)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| gradle.projectsEvaluated { | ||||
|     tasks.compileJava { | ||||
| //        options.compilerArgs.add("-Werror") | ||||
| @@ -118,11 +231,14 @@ gradle.projectsEvaluated { | ||||
| intellij { | ||||
|     version.set(ideaVersion) | ||||
|     pluginName.set("IdeaVim") | ||||
|  | ||||
|     updateSinceUntilBuild.set(false) | ||||
|  | ||||
|     downloadSources.set(downloadIdeaSources.toBoolean()) | ||||
|     instrumentCode.set(instrumentPluginCode.toBoolean()) | ||||
|     intellijRepository.set("https://www.jetbrains.com/intellij-repository") | ||||
|     plugins.set(listOf("java", "AceJump:3.8.4")) | ||||
|     // Yaml is only used for testing. It's part of the IdeaIC distribution, but needs to be included as a reference | ||||
|     plugins.set(listOf("java", "AceJump:3.8.4", "yaml")) | ||||
| } | ||||
|  | ||||
| tasks { | ||||
| @@ -145,6 +261,7 @@ tasks { | ||||
|     runPluginVerifier { | ||||
|         downloadDir.set("${project.buildDir}/pluginVerifier/ides") | ||||
|         teamCityOutputFormat.set(true) | ||||
| //        ideVersions.set(listOf("IC-2021.3.4")) | ||||
|     } | ||||
|  | ||||
|     generateGrammarSource { | ||||
| @@ -156,12 +273,41 @@ tasks { | ||||
|     named("compileKotlin") { | ||||
|         dependsOn("generateGrammarSource") | ||||
|     } | ||||
|     named("compileTestKotlin") { | ||||
|         dependsOn("generateTestGrammarSource") | ||||
|     } | ||||
|  | ||||
|     // Add plugin open API sources to the plugin ZIP | ||||
|     val createOpenApiSourceJar by registering(Jar::class) { | ||||
|         dependsOn("generateGrammarSource") | ||||
|         // Java sources | ||||
|         from(sourceSets.main.get().java) { | ||||
|             include("**/com/maddyhome/idea/vim/**/*.java") | ||||
|         } | ||||
|         // Kotlin sources | ||||
|         from(kotlin.sourceSets.main.get().kotlin) { | ||||
|             include("**/com/maddyhome/idea/vim/**/*.kt") | ||||
|         } | ||||
|         destinationDirectory.set(layout.buildDirectory.dir("libs")) | ||||
|         archiveClassifier.set("src") | ||||
|     } | ||||
|  | ||||
|     buildPlugin { | ||||
|         dependsOn(createOpenApiSourceJar) | ||||
|         from(createOpenApiSourceJar) { into("lib/src") } | ||||
|     } | ||||
|  | ||||
|     // Don't forget to update plugin.xml | ||||
|     patchPluginXml { | ||||
|         sinceBuild.set("223.7401.7") | ||||
|     } | ||||
| } | ||||
|  | ||||
| // --- Linting | ||||
|  | ||||
| ktlint { | ||||
|     disabledRules.add("no-wildcard-imports") | ||||
|     version.set("0.43.0") | ||||
| } | ||||
|  | ||||
| // --- Tests | ||||
| @@ -174,22 +320,6 @@ tasks { | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register<Test>("testWithNeovim") { | ||||
|     group = "verification" | ||||
|     systemProperty("ideavim.nvim.test", "true") | ||||
|     exclude("/ui/**") | ||||
| } | ||||
|  | ||||
| tasks.register<Test>("testPropertyBased") { | ||||
|     group = "verification" | ||||
|     include("**/propertybased/**") | ||||
| } | ||||
|  | ||||
| tasks.register<Test>("testLongRunning") { | ||||
|     group = "verification" | ||||
|     include("**/longrunning/**") | ||||
| } | ||||
|  | ||||
| tasks.register<Test>("testUi") { | ||||
|     group = "verification" | ||||
|     include("/ui/**") | ||||
| @@ -202,7 +332,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" | ||||
| } | ||||
| @@ -215,6 +345,22 @@ tasks.register("getUnreleasedChangelog") { | ||||
|     } | ||||
| } | ||||
|  | ||||
| // --- Kover | ||||
|  | ||||
| koverMerged { | ||||
|     enable() | ||||
| } | ||||
|  | ||||
| kover { | ||||
|     instrumentation { | ||||
|         // set of test tasks names to exclude from instrumentation. The results of their execution will not be presented in the report | ||||
|         excludeTasks += "testPropertyBased" | ||||
|         excludeTasks += "testLongRunning" | ||||
|         excludeTasks += "testWithNeovim" | ||||
|         excludeTasks += "testUi" | ||||
|     } | ||||
| } | ||||
|  | ||||
| // --- Slack notification | ||||
|  | ||||
| tasks.register("slackNotification") { | ||||
| @@ -255,20 +401,31 @@ tasks.register("slackNotification") { | ||||
|             println("Response code: $postRc") | ||||
|             if (postRc == 200) { | ||||
|                 println(inputStream.bufferedReader().use { it.readText() }) | ||||
|             } else { | ||||
|                 println(errorStream.bufferedReader().use { it.readText() }) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // --- Update authors | ||||
| // 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( | ||||
|             "aleksei.plate@jetbrains.com", | ||||
|             "aleksei.plate@teamcity", | ||||
|             "aleksei.plate@TeamCity", | ||||
|             "alex.plate@192.168.0.109" | ||||
|             "alex.plate@192.168.0.109", | ||||
|             "nikita.koshcheev@TeamCity", | ||||
|             "TeamCity@TeamCity", | ||||
|         ) | ||||
|         updateAuthors(uncheckedEmails) | ||||
|     } | ||||
| @@ -279,6 +436,7 @@ val prId: String by project | ||||
| tasks.register("updateMergedPr") { | ||||
|     doLast { | ||||
|         if (project.hasProperty("prId")) { | ||||
|             println("Got pr id: $prId") | ||||
|             updateMergedPr(prId.toInt()) | ||||
|         } else { | ||||
|             error("Cannot get prId") | ||||
| @@ -292,6 +450,82 @@ tasks.register("updateChangelog") { | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("updateYoutrackOnCommit") { | ||||
|     doLast { | ||||
|         updateYoutrackOnCommit() | ||||
|     } | ||||
| } | ||||
|  | ||||
| val vimProjectId = "22-43" | ||||
| val fixVersionsFieldId = "123-285" | ||||
| val fixVersionsFieldType = "VersionProjectCustomField" | ||||
| val fixVersionsElementType = "VersionBundleElement" | ||||
|  | ||||
| tasks.register("releaseActions") { | ||||
|     group = "other" | ||||
|     doLast { | ||||
|         val tickets = getYoutrackTicketsByQuery("%23%7BReady+To+Release%7D") | ||||
|         if (tickets.isNotEmpty()) { | ||||
|             println("Updating statuses for tickets: $tickets") | ||||
|             setYoutrackStatus(tickets, "Fixed") | ||||
|             if (!checkReleaseVersionExists(version.toString())) { | ||||
|                 addReleaseToYoutrack(version.toString()) | ||||
|             } else { | ||||
|                 println("Version $version is already exists in YouTrack") | ||||
|             } | ||||
|             setYoutrackFixVersion(tickets, version.toString()) | ||||
|         } else { | ||||
|             println("No tickets to update statuses") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("integrationsTest") { | ||||
|     group = "other" | ||||
|     doLast { | ||||
|         val testTicketId = "VIM-2784" | ||||
|  | ||||
|         // YouTrack set to Ready To Release on Fix commit | ||||
|         setYoutrackStatus(listOf(testTicketId), "Ready To Release") | ||||
|         if ("Ready To Release" != getYoutrackStatus(testTicketId)) { | ||||
|             error("Ticket status was not updated") | ||||
|         } | ||||
|         setYoutrackStatus(listOf(testTicketId), "Open") | ||||
|  | ||||
|         // Check YouTrack requests | ||||
|         val prevStatus = getYoutrackStatus(testTicketId) | ||||
|         setYoutrackStatus(listOf(testTicketId), "Ready To Release") | ||||
|         val tickets = getYoutrackTicketsByQuery("%23%7BReady+To+Release%7D") | ||||
|         if (testTicketId !in tickets) { | ||||
|             error("Test ticket is not found in request") | ||||
|         } | ||||
|         setYoutrackStatus(listOf(testTicketId), prevStatus) | ||||
|  | ||||
|         // Check adding and removing release | ||||
|         guard(!checkReleaseVersionExists("TEST_VERSION")) { "Test version already exists" } | ||||
|         val versionId = addReleaseToYoutrack("TEST_VERSION") | ||||
|         guard(checkReleaseVersionExists("TEST_VERSION")) { "Test version isn't created" } | ||||
|         setYoutrackStatus(listOf(testTicketId), "Fixed") | ||||
|         setYoutrackFixVersion(listOf(testTicketId), "TEST_VERSION") | ||||
|         deleteVersionById(versionId) | ||||
|         setYoutrackStatus(listOf(testTicketId), "Open") | ||||
|         guard(!checkReleaseVersionExists("TEST_VERSION")) { "Test version isn't deleted" } | ||||
|  | ||||
|         updateMergedPr(525) | ||||
|         // TODO: test Ticket parsing | ||||
|         // TODO: test Update CHANGES | ||||
|         // TODO: test Update AUTHORS | ||||
|         // TODO: test Slack notification | ||||
|         // TODO: Add a comment on EAP release | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun guard(check: Boolean, ifWrong: () -> String) { | ||||
|     if (!check) { | ||||
|         error(ifWrong()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("testUpdateChangelog") { | ||||
|     group = "verification" | ||||
|     description = "This is a task to manually assert the correctness of the update tasks" | ||||
| @@ -308,37 +542,152 @@ tasks.register("testUpdateChangelog") { | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun addReleaseToYoutrack(name: String): String { | ||||
|     val client = httpClient() | ||||
|     println("Creating new release version in YouTrack: $name") | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.post("https://youtrack.jetbrains.com/api/admin/projects/$vimProjectId/customFields/$fixVersionsFieldId/bundle/values?fields=id,name") { | ||||
|             contentType(ContentType.Application.Json) | ||||
|             accept(ContentType.Application.Json) | ||||
|             val request = buildJsonObject { | ||||
|                 put("name", name) | ||||
|                 put("\$type", fixVersionsElementType) | ||||
|             } | ||||
|             setBody(request) | ||||
|         } | ||||
|         response.body<JsonObject>().getValue("id").jsonPrimitive.content | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun checkReleaseVersionExists(name: String): Boolean { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.get("https://youtrack.jetbrains.com/api/admin/projects/$vimProjectId/customFields/$fixVersionsFieldId/bundle/values?fields=id,name&query=$name") | ||||
|         response.body<JsonArray>().isNotEmpty() | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun deleteVersionById(id: String) { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     runBlocking { | ||||
|         client.delete("https://youtrack.jetbrains.com/api/admin/projects/$vimProjectId/customFields/$fixVersionsFieldId/bundle/values/$id") | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun updateYoutrackOnCommit() { | ||||
|     println("Start updating youtrack") | ||||
|     println(projectDir) | ||||
|  | ||||
|     val newFixes = changes() | ||||
|     val newTickets = newFixes.map { it.id } | ||||
|     println("Set new status for $newTickets") | ||||
|     setYoutrackStatus(newTickets, "Ready To Release") | ||||
| } | ||||
|  | ||||
| fun getYoutrackTicketsByQuery(query: String): Set<String> { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.get("https://youtrack.jetbrains.com/api/issues/?fields=idReadable&query=project:VIM+$query") | ||||
|         response.body<JsonArray>().mapTo(HashSet()) { it.jsonObject.getValue("idReadable").jsonPrimitive.content } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun setYoutrackStatus(tickets: Collection<String>, status: String) { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     runBlocking { | ||||
|         for (ticket in tickets) { | ||||
|             println("Try to set $ticket to $status") | ||||
|             val response = client.post("https://youtrack.jetbrains.com/api/issues/$ticket?fields=customFields(id,name,value(id,name))") { | ||||
|                 contentType(ContentType.Application.Json) | ||||
|                 accept(ContentType.Application.Json) | ||||
|                 val request = buildJsonObject { | ||||
|                     putJsonArray("customFields") { | ||||
|                         addJsonObject { | ||||
|                             put("name", "State") | ||||
|                             put("\$type", "SingleEnumIssueCustomField") | ||||
|                             putJsonObject("value") { | ||||
|                                 put("name", status) | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 setBody(request) | ||||
|             } | ||||
|             println(response) | ||||
|             println(response.body<String>()) | ||||
|             if (!response.status.isSuccess()) { | ||||
|                 error("Request failed. $ticket, ${response.body<String>()}") | ||||
|             } | ||||
|             val finalState = response.body<JsonObject>()["customFields"]!!.jsonArray | ||||
|                 .single { it.jsonObject["name"]!!.jsonPrimitive.content == "State" } | ||||
|                 .jsonObject["value"]!! | ||||
|                 .jsonObject["name"]!! | ||||
|                 .jsonPrimitive.content | ||||
|             if (finalState != status) { | ||||
|                 error("Ticket $ticket is not updated! Expected status $status, but actually $finalState") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun setYoutrackFixVersion(tickets: Collection<String>, version: String) { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     runBlocking { | ||||
|         for (ticket in tickets) { | ||||
|             println("Try to set fix version $version for $ticket") | ||||
|             val response = client.post("https://youtrack.jetbrains.com/api/issues/$ticket?fields=customFields(id,name,value(id,name))") { | ||||
|                 contentType(ContentType.Application.Json) | ||||
|                 accept(ContentType.Application.Json) | ||||
|                 val request = buildJsonObject { | ||||
|                     putJsonArray("customFields") { | ||||
|                         addJsonObject { | ||||
|                             put("name", "Fix versions") | ||||
|                             put("\$type", "MultiVersionIssueCustomField") | ||||
|                             putJsonArray("value") { | ||||
|                                 addJsonObject { put("name", version) } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 setBody(request) | ||||
|             } | ||||
|             println(response) | ||||
|             println(response.body<String>()) | ||||
|             if (!response.status.isSuccess()) { | ||||
|                 error("Request failed. $ticket, ${response.body<String>()}") | ||||
|             } | ||||
|             val finalState = response.body<JsonObject>()["customFields"]!!.jsonArray | ||||
|                 .single { it.jsonObject["name"]!!.jsonPrimitive.content == "Fix versions" } | ||||
|                 .jsonObject["value"]!! | ||||
|                 .jsonArray[0] | ||||
|                 .jsonObject["name"]!! | ||||
|                 .jsonPrimitive.content | ||||
|             if (finalState != version) { | ||||
|                 error("Ticket $ticket is not updated! Expected fix version $version, but actually $finalState") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun getYoutrackStatus(ticket: String): String { | ||||
|     val client = httpClient() | ||||
|  | ||||
|     return runBlocking { | ||||
|         val response = client.get("https://youtrack.jetbrains.com/api/issues/$ticket/customFields/123-129?fields=value(name)") | ||||
|         response.body<JsonObject>()["value"]!!.jsonObject.getValue("name").jsonPrimitive.content | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun updateChangelog() { | ||||
|     println("Start update authors") | ||||
|     println(projectDir) | ||||
|     val repository = org.eclipse.jgit.lib.RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = org.eclipse.jgit.api.Git(repository) | ||||
|     val lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!! | ||||
|     val messages = git.log().call() | ||||
|         .takeWhile { | ||||
|             !it.id.name.equals(lastSuccessfulCommit, ignoreCase = true) | ||||
|         } | ||||
|         .map { it.shortMessage } | ||||
|  | ||||
|     // Collect fixes | ||||
|     val newFixes = mutableListOf<Change>() | ||||
|     println("Last successful commit: $lastSuccessfulCommit") | ||||
|     println("Amount of commits: ${messages.size}") | ||||
|     println("Start emails processing") | ||||
|     for (message in messages) { | ||||
|         println("Processing '$message'...") | ||||
|         val lowercaseMessage = message.toLowerCase() | ||||
|         val regex = "^fix\\((vim-\\d+)\\):".toRegex() | ||||
|         val findResult = regex.find(lowercaseMessage) | ||||
|         if (findResult != null) { | ||||
|             println("Message matches") | ||||
|             val value = findResult.groups[1]!!.value.toUpperCase() | ||||
|             val shortMessage = message.drop(findResult.range.last + 1).trim() | ||||
|             newFixes += Change(value, shortMessage) | ||||
|         } else { | ||||
|             println("Message doesn't match") | ||||
|         } | ||||
|     } | ||||
|     val newFixes = changes() | ||||
|  | ||||
|     // Update changes file | ||||
|     val changesFile = File("$projectDir/CHANGES.md") | ||||
| @@ -364,8 +713,8 @@ fun updateChangelog() { | ||||
| fun updateAuthors(uncheckedEmails: Set<String>) { | ||||
|     println("Start update authors") | ||||
|     println(projectDir) | ||||
|     val repository = org.eclipse.jgit.lib.RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = org.eclipse.jgit.api.Git(repository) | ||||
|     val repository = RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = Git(repository) | ||||
|     val lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!! | ||||
|     val hashesAndEmailes = git.log().call() | ||||
|         .takeWhile { | ||||
| @@ -441,8 +790,12 @@ data class Author(val name: String, val url: String, val mail: String) | ||||
| data class Change(val id: String, val text: String) | ||||
|  | ||||
| fun updateMergedPr(number: Int) { | ||||
|     val gitHub = org.kohsuke.github.GitHub.connect() | ||||
|     val token = System.getenv("GITHUB_OAUTH") | ||||
|     println("Token size: ${token.length}") | ||||
|     val gitHub = org.kohsuke.github.GitHubBuilder().withOAuthToken(token).build() | ||||
|     println("Connecting to the repo...") | ||||
|     val repository = gitHub.getRepository("JetBrains/ideavim") | ||||
|     println("Getting pull requests...") | ||||
|     val pullRequest = repository.getPullRequest(number) | ||||
|     if (pullRequest.user.login == "dependabot[bot]") return | ||||
|  | ||||
| @@ -456,7 +809,7 @@ fun updateMergedPr(number: Int) { | ||||
|     if (pullRequest.user.login == "dependabot[bot]") return | ||||
|  | ||||
|     val prNumber = pullRequest.number | ||||
|     val userName = pullRequest.user.name | ||||
|     val userName = pullRequest.user.name ?: pullRequest.user.login | ||||
|     val login = pullRequest.user.login | ||||
|     val title = pullRequest.title | ||||
|     val section = | ||||
| @@ -534,3 +887,57 @@ val sections = listOf( | ||||
|     "### Fixes:", | ||||
|     "### Merged PRs:", | ||||
| ) | ||||
|  | ||||
| fun changes(): List<Change> { | ||||
|     val repository = RepositoryBuilder().setGitDir(File("$projectDir/.git")).build() | ||||
|     val git = Git(repository) | ||||
|     val lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!! | ||||
|     val messages = git.log().call() | ||||
|         .takeWhile { | ||||
|             !it.id.name.equals(lastSuccessfulCommit, ignoreCase = true) | ||||
|         } | ||||
|         .map { it.shortMessage } | ||||
|  | ||||
|     // Collect fixes | ||||
|     val newFixes = mutableListOf<Change>() | ||||
|     println("Last successful commit: $lastSuccessfulCommit") | ||||
|     println("Amount of commits: ${messages.size}") | ||||
|     println("Start emails processing") | ||||
|     for (message in messages) { | ||||
|         println("Processing '$message'...") | ||||
|         val lowercaseMessage = message.toLowerCase() | ||||
|         val regex = "^fix\\((vim-\\d+)\\):".toRegex() | ||||
|         val findResult = regex.find(lowercaseMessage) | ||||
|         if (findResult != null) { | ||||
|             println("Message matches") | ||||
|             val value = findResult.groups[1]!!.value.toUpperCase() | ||||
|             val shortMessage = message.drop(findResult.range.last + 1).trim() | ||||
|             newFixes += Change(value, shortMessage) | ||||
|         } else { | ||||
|             println("Message doesn't match") | ||||
|         } | ||||
|     } | ||||
|     return newFixes | ||||
| } | ||||
|  | ||||
| fun httpClient(): HttpClient { | ||||
|     return HttpClient(CIO) { | ||||
|         expectSuccess = true | ||||
|         install(Auth) { | ||||
|             bearer { | ||||
|                 loadTokens { | ||||
|                     val accessToken = youtrackToken.ifBlank { System.getenv("YOUTRACK_TOKEN")!! } | ||||
|                     BearerTokens(accessToken, "") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         install(ContentNegotiation) { | ||||
|             json( | ||||
|                 Json { | ||||
|                     prettyPrint = true | ||||
|                     isLenient = true | ||||
|                 } | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,248 +0,0 @@ | ||||
| Emulated Vim Plugins | ||||
| -------------------- | ||||
|  | ||||
| IdeaVim extensions emulate plugins of the original Vim. In order to use | ||||
| IdeaVim extensions, you have to enable them via this command in your `~/.ideavimrc`: | ||||
|  | ||||
| ``` | ||||
| Plug '<extension-github-reference>' | ||||
| ``` | ||||
|  | ||||
| If you reuse your existing `.vimrc` file using `source ~/.vimrc`, IdeaVim can parse and enable plugins that are defined | ||||
| using [vim-plug](https://github.com/junegunn/vim-plug) or [vundle](https://github.com/VundleVim/Vundle.vim). | ||||
| No additional set commands in `~/.ideavimrc` are required.   | ||||
| If you'd like to disable some plugin that's enabled in `.vimrc`, you can use `set no<extension-name>` | ||||
| in `~/.ideavimrc`. E.g. `set nosurround`. | ||||
|  | ||||
| Available extensions: | ||||
|  | ||||
| ## easymotion | ||||
|  | ||||
| * Setup: | ||||
|     * Install [IdeaVim-EasyMotion](https://plugins.jetbrains.com/plugin/13360-ideavim-easymotion/) | ||||
|       and [AceJump](https://plugins.jetbrains.com/plugin/7086-acejump/) plugins. | ||||
|     * `Plug 'easymotion/vim-easymotion'` | ||||
|     * <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plug 'https://github.com/easymotion/vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>set easymotion</code> | ||||
|       </details> | ||||
| * Emulates [vim-easymotion](https://github.com/easymotion/vim-easymotion) | ||||
| * Commands: All commands with the mappings are supported. See the [full list of supported commands](https://github.com/AlexPl292/IdeaVim-EasyMotion#supported-commands). | ||||
|  | ||||
| ## NERDTree | ||||
| * Setup: `Plug 'preservim/nerdtree'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/preservim/nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>set NERDTree</code> | ||||
|       </details> | ||||
| * Emulates [NERDTree](https://github.com/preservim/nerdtree) | ||||
| * Commands: [[see here|NERDTree-support]] | ||||
|  | ||||
| ## surround | ||||
|  | ||||
| * Setup: `Plug 'tpope/vim-surround'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/tpope/vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=1697'</code> | ||||
|       <br/> | ||||
|       <code>set surround</code> | ||||
|       </details> | ||||
| * Emulates [vim-surround](https://github.com/tpope/vim-surround) | ||||
| * Commands: `ys`, `cs`, `ds`, `S` | ||||
|  | ||||
| ## multiple-cursors | ||||
|  | ||||
| * Setup: `Plug 'terryma/vim-multiple-cursors'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/terryma/vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>set multiple-cursors</code> | ||||
|       </details> | ||||
| * Emulates [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors) | ||||
| * Commands: `<A-n>`, `<A-x>`, `<A-p>`, `g<A-n>` | ||||
|  | ||||
| ## commentary | ||||
|  | ||||
| * Setup: `Plug 'tpope/vim-commentary'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/tpope/vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=3695'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'tomtom/tcomment_vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'tcomment_vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=1173'</code> | ||||
|       <br/> | ||||
|       <code>set commentary</code> | ||||
|       </details> | ||||
| * Emulates [commentary.vim](https://github.com/tpope/vim-commentary) | ||||
| * Commands: `gcc`, `gc + motion`, `v_gc` | ||||
| * By [Daniel Leong](https://github.com/dhleong) | ||||
|  | ||||
| ## ReplaceWithRegister | ||||
|  | ||||
| * Setup: `Plug 'vim-scripts/ReplaceWithRegister'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/vim-scripts/ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2703'</code> | ||||
|       <br/> | ||||
|       <code>set ReplaceWithRegister</code> | ||||
|       </details> | ||||
| * Emulates [ReplaceWithRegister](https://github.com/vim-scripts/ReplaceWithRegister) | ||||
| * Commands: `gr`, `grr` | ||||
| * By [igrekster](https://github.com/igrekster) | ||||
|  | ||||
| ## argtextobj | ||||
|  | ||||
| * Setup: | ||||
|     * `Plug 'vim-scripts/argtextobj.vim'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/vim-scripts/argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2699'</code> | ||||
|       <br/> | ||||
|       <code>set argtextobj</code> | ||||
|       </details> | ||||
|     * By default, only the arguments inside parenthesis are considered. To extend the functionality | ||||
|       to other types of brackets, set `g:argtextobj_pairs` variable to a comma-separated | ||||
|       list of colon-separated pairs (same as VIM's `matchpairs` option), like | ||||
|       `let g:argtextobj_pairs="(:),{:},<:>"`. The order of pairs matters when | ||||
|       handling symbols that can also be operators: `func(x << 5, 20) >> 17`. To handle | ||||
|       this syntax parenthesis, must come before angle brackets in the list. | ||||
| * Emulates [argtextobj.vim](https://www.vim.org/scripts/script.php?script_id=2699) | ||||
| * Additional text objects: `aa`, `ia` | ||||
|  | ||||
| ## exchange | ||||
|  | ||||
| * Setup: `Plug 'tommcdo/vim-exchange'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/tommcdo/vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>set exchange</code> | ||||
|       </details> | ||||
| * Emulates [vim-exchange](https://github.com/tommcdo/vim-exchange) | ||||
| * Commands: `cx`, `cxx`, `X`, `cxc` | ||||
| * By [fan-tom](https://github.com/fan-tom) | ||||
|  | ||||
| ## textobj-entire | ||||
|  | ||||
| * Setup: `Plug 'kana/vim-textobj-entire'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/kana/vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2610'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-entire</code> | ||||
|       </details> | ||||
| * Emulates [vim-textobj-entire](https://github.com/kana/vim-textobj-entire) | ||||
| * Additional text objects: `ae`, `ie` | ||||
| * By [Alexandre Grison](https://github.com/agrison) | ||||
|  | ||||
| ## highlightedyank | ||||
|  | ||||
| * Setup: | ||||
|     * `Plug 'machakann/vim-highlightedyank'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/machakann/vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>set highlightedyank</code> | ||||
|       </details> | ||||
|     * if you want to optimize highlight duration, assign a time in milliseconds:   | ||||
|       `let g:highlightedyank_highlight_duration = "1000"`   | ||||
|       A negative number makes the highlight persistent.   | ||||
|       `let g:highlightedyank_highlight_duration = "-1"` | ||||
|     * if you want to change background color of highlight you can provide the rgba of the color you want e.g.   | ||||
|       `let g:highlightedyank_highlight_color = "rgba(160, 160, 160, 155)"` | ||||
| * Emulates [vim-highlightedyank](https://github.com/machakann/vim-highlightedyank) | ||||
| * By [KostkaBrukowa](https://github.com/KostkaBrukowa) | ||||
|  | ||||
| ## vim-paragraph-motion | ||||
|  | ||||
| * Setup: `Plug 'dbakker/vim-paragraph-motion'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/dbakker/vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>set vim-paragraph-motion</code> | ||||
|       </details> | ||||
| * Emulates [vim-paragraph-motion](https://github.com/dbakker/vim-paragraph-motion) | ||||
|  | ||||
| ## vim-indent-object | ||||
|  | ||||
| * Setup: `Plug 'michaeljsmith/vim-indent-object'` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'https://github.com/michaeljsmith/vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-indent</code> | ||||
|       </details> | ||||
| * Emulates [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object) | ||||
| * Additional text objects: `ai`, `ii`, `aI` | ||||
| * By [Shrikant Sharat Kandula](https://github.com/sharat87) | ||||
|  | ||||
| ## matchit.vim | ||||
|  | ||||
| * Setup: `packadd matchit` | ||||
|     * <details> | ||||
|       <summary>Alternative vim-plug / vundle syntax</summary> | ||||
|       <code>Plug 'vim-matchit'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'chrisbra/matchit'</code> | ||||
|       <br/> | ||||
|       <code>set matchit</code> | ||||
|       </details> | ||||
| * Emulates [matchit.vim](https://github.com/chrisbra/matchit) | ||||
| * Currently works for HTML/XML and ruby | ||||
| * By [Martin Yzeiri](https://github.com/myzeiri) | ||||
| @@ -1,6 +1,6 @@ | ||||
| Welcome to the IdeaVim wiki! | ||||
|  | ||||
| - List of emulated plugins: [[plugins|Emulated-plugins]] | ||||
| - Examples of `ideajoin` option (also known as "smart join"): [["ideajoin" examples|"ideajoin"-examples]] | ||||
| - List of "set" commands: [["set" commands|"set"-commands]] | ||||
| - List of IdeaVim plugins: [[plugins|IdeaVim Plugins]] | ||||
| - Examples of `ideajoin` option (also known as "smart join"): [["ideajoin" examples|ideajoin-examples]] | ||||
| - List of "set" commands: [["set" commands|set-commands]] | ||||
| - Docs about "select" mode in vim: [[select mode|Select-mode]] | ||||
|   | ||||
							
								
								
									
										398
									
								
								doc/IdeaVim Plugins.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										398
									
								
								doc/IdeaVim Plugins.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,398 @@ | ||||
| IdeaVim Plugins | ||||
| -------------------- | ||||
|  | ||||
| IdeaVim plugins work like the original Vim plugins. If you want to turn of any of them, you have to enable it via this command in your `~/.ideavimrc`: | ||||
|  | ||||
| ``` | ||||
| Plug '<plugin-github-reference>' | ||||
| ``` | ||||
|  | ||||
| If you reuse your existing `.vimrc` file using `source ~/.vimrc`, IdeaVim can parse and enable plugins that are defined | ||||
| using [vim-plug](https://github.com/junegunn/vim-plug) or [vundle](https://github.com/VundleVim/Vundle.vim). | ||||
| No additional set commands in `~/.ideavimrc` are required.   | ||||
| If you'd like to disable some plugin that's enabled in `.vimrc`, you can use `set no<extension-name>` | ||||
| in `~/.ideavimrc`. E.g. `set nosurround`. | ||||
|  | ||||
| Available plugins: | ||||
|  | ||||
| <details> | ||||
| <summary><h2>easymotion</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-easymotion](https://github.com/easymotion/vim-easymotion). | ||||
|     | ||||
| ### Setup: | ||||
| - Install [IdeaVim-EasyMotion](https://plugins.jetbrains.com/plugin/13360-ideavim-easymotion/) | ||||
|       and [AceJump](https://plugins.jetbrains.com/plugin/7086-acejump/) plugins. | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'easymotion/vim-easymotion'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'easymotion/vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/easymotion/vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-easymotion'</code> | ||||
|       <br/> | ||||
|       <code>set easymotion</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| All commands with the mappings are supported. See the [full list of supported commands](https://github.com/AlexPl292/IdeaVim-EasyMotion#supported-commands). | ||||
|  | ||||
| </details> | ||||
|  | ||||
|  | ||||
| <details> | ||||
| <summary><h2>sneak</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-sneak](https://github.com/justinmk/vim-sneak). | ||||
|     | ||||
| ### Setup: | ||||
| - Install [IdeaVim-sneak](https://plugins.jetbrains.com/plugin/15348-ideavim-sneak) plugin. | ||||
| - Add the following command to `~/.ideavimrc`: `set sneak` | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| See the [docs](https://github.com/Mishkun/ideavim-sneak#usage) | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>NERDTree</h2></summary> | ||||
|     | ||||
| Original plugin: [NERDTree](https://github.com/preservim/nerdtree). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'preservim/nerdtree'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'preservim/nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/preservim/nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'nerdtree'</code> | ||||
|       <br/> | ||||
|       <code>set NERDTree</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| [[See here|NERDTree-support]]. | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>surround</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-surround](https://github.com/tpope/vim-surround). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'tpope/vim-surround'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'tpope/vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=1697'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-surround'</code> | ||||
|       <br/> | ||||
|       <code>set surround</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/tpope/vim-surround/blob/master/doc/surround.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>multiple-cursors</h2></summary> | ||||
|     | ||||
| Original plugin: [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'terryma/vim-multiple-cursors'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'terryma/vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/terryma/vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-multiple-cursors'</code> | ||||
|       <br/> | ||||
|       <code>set multiple-cursors</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/terryma/vim-multiple-cursors/blob/master/doc/multiple_cursors.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>commentary</h2></summary> | ||||
|  | ||||
| By [Daniel Leong](https://github.com/dhleong)   | ||||
| Original plugin: [commentary.vim](https://github.com/tpope/vim-commentary). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'tpope/vim-commentary'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'tpope/vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/tpope/vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-commentary'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'tcomment_vim'</code> | ||||
|       <br/> | ||||
|       <code>set commentary</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/tpope/vim-commentary/blob/master/doc/commentary.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>ReplaceWithRegister</h2></summary> | ||||
|     | ||||
| By [igrekster](https://github.com/igrekster)   | ||||
| Original plugin: [ReplaceWithRegister](https://github.com/vim-scripts/ReplaceWithRegister). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'vim-scripts/ReplaceWithRegister'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'vim-scripts/ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'inkarkat/vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-ReplaceWithRegister'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2703'</code> | ||||
|       <br/> | ||||
|       <code>set ReplaceWithRegister</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/vim-scripts/ReplaceWithRegister/blob/master/doc/ReplaceWithRegister.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>argtextobj</h2></summary> | ||||
|  | ||||
| Original plugin: [argtextobj.vim](https://www.vim.org/scripts/script.php?script_id=2699). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'vim-scripts/argtextobj.vim'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'vim-scripts/argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/vim-scripts/argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'argtextobj.vim'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2699'</code> | ||||
|       <br/> | ||||
|       <code>set argtextobj</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| By default, only the arguments inside parenthesis are considered. To extend the functionality | ||||
|       to other types of brackets, set `g:argtextobj_pairs` variable to a comma-separated | ||||
|       list of colon-separated pairs (same as VIM's `matchpairs` option), like | ||||
|       `let g:argtextobj_pairs="(:),{:},<:>"`. The order of pairs matters when | ||||
|       handling symbols that can also be operators: `func(x << 5, 20) >> 17`. To handle | ||||
|       this syntax parenthesis, must come before angle brackets in the list. | ||||
|     | ||||
| https://www.vim.org/scripts/script.php?script_id=2699 | ||||
|  | ||||
| </details> | ||||
|     | ||||
|  | ||||
| <details> | ||||
| <summary><h2>exchange</h2></summary> | ||||
|  | ||||
| By [fan-tom](https://github.com/fan-tom)   | ||||
| Original plugin: [vim-exchange](https://github.com/tommcdo/vim-exchange). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'tommcdo/vim-exchange'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'tommcdo/vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/tommcdo/vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-exchange'</code> | ||||
|       <br/> | ||||
|       <code>set exchange</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/tommcdo/vim-exchange/blob/master/doc/exchange.txt | ||||
|  | ||||
| </details> | ||||
|     | ||||
| <details> | ||||
| <summary><h2>textobj-entire</h2></summary> | ||||
|  | ||||
| By [Alexandre Grison](https://github.com/agrison)   | ||||
| Original plugin: [vim-textobj-entire](https://github.com/kana/vim-textobj-entire). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'kana/vim-textobj-entire'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'kana/vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-textobj-entire'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://www.vim.org/scripts/script.php?script_id=2610'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-entire</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/kana/vim-textobj-entire/blob/master/doc/textobj-entire.txt | ||||
|  | ||||
| </details> | ||||
|     | ||||
| <details> | ||||
| <summary><h2>highlightedyank</h2></summary> | ||||
|  | ||||
| By [KostkaBrukowa](https://github.com/KostkaBrukowa)   | ||||
| Original plugin: [vim-highlightedyank](https://github.com/machakann/vim-highlightedyank). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'machakann/vim-highlightedyank'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'machakann/vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/machakann/vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-highlightedyank'</code> | ||||
|       <br/> | ||||
|       <code>set highlightedyank</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| If you want to optimize highlight duration, assign a time in milliseconds:   | ||||
|       `let g:highlightedyank_highlight_duration = "1000"`   | ||||
|       A negative number makes the highlight persistent.   | ||||
|     | ||||
| If you want to change background color of highlight you can provide the rgba of the color you want e.g.   | ||||
|       `let g:highlightedyank_highlight_color = "rgba(160, 160, 160, 155)"` | ||||
|     | ||||
| https://github.com/machakann/vim-highlightedyank/blob/master/doc/highlightedyank.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>vim-paragraph-motion</h2></summary> | ||||
|  | ||||
| Original plugin: [vim-paragraph-motion](https://github.com/dbakker/vim-paragraph-motion). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'dbakker/vim-paragraph-motion'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'dbakker/vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/dbakker/vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-scripts/Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'Improved-paragraph-motion'</code> | ||||
|       <br/> | ||||
|       <code>set vim-paragraph-motion</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/dbakker/vim-paragraph-motion#vim-paragraph-motion | ||||
|  | ||||
| </details> | ||||
|     | ||||
| <details> | ||||
| <summary><h2>vim-indent-object</h2></summary> | ||||
|  | ||||
| By [Shrikant Sharat Kandula](https://github.com/sharat87)   | ||||
| Original plugin: [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `Plug 'michaeljsmith/vim-indent-object'` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plugin 'michaeljsmith/vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'https://github.com/michaeljsmith/vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'vim-indent-object'</code> | ||||
|       <br/> | ||||
|       <code>set textobj-indent</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/michaeljsmith/vim-indent-object/blob/master/doc/indent-object.txt | ||||
|  | ||||
| </details> | ||||
|     | ||||
|     | ||||
| <details> | ||||
| <summary><h2>matchit.vim</h2></summary> | ||||
|  | ||||
| By [Martin Yzeiri](https://github.com/myzeiri) | ||||
| Original plugin: [matchit.vim](https://github.com/chrisbra/matchit). | ||||
|     | ||||
| ### Setup: | ||||
| - Add the following command to `~/.ideavimrc`: `packadd matchit` | ||||
|     <details> | ||||
|       <summary>Alternative syntax</summary> | ||||
|       <code>Plug 'vim-matchit'</code> | ||||
|       <br/> | ||||
|       <code>Plug 'chrisbra/matchit'</code> | ||||
|       <br/> | ||||
|       <code>set matchit</code> | ||||
|       </details> | ||||
|     | ||||
| ### Instructions | ||||
|     | ||||
| https://github.com/adelarsq/vim-matchit/blob/master/doc/matchit.txt | ||||
|  | ||||
| </details> | ||||
|  | ||||
| <details> | ||||
| <summary><h2>IdeaVim-Quickscope</h2></summary> | ||||
|  | ||||
| Original plugin: [quick-scope](https://github.com/unblevable/quick-scope). | ||||
|  | ||||
| ### Setup: | ||||
| - Install [IdeaVim-sneak](https://plugins.jetbrains.com/plugin/15348-ideavim-sneak) plugin. | ||||
| - Add the following command to `~/.ideavimrc`: `set quickscope` | ||||
|  | ||||
| ### Instructions | ||||
|  | ||||
| https://plugins.jetbrains.com/plugin/19417-ideavim-quickscope | ||||
|  | ||||
| </details> | ||||
| @@ -1,6 +1,6 @@ | ||||
| # NERDTree | ||||
|  | ||||
| IdeaVim supports emulation of the NERDTree plugin. Update your `~/.ideavimrc` to turn it on: | ||||
| IdeaVim supports the NERDTree plugin. Update your `~/.ideavimrc` to turn it on: | ||||
| ```vim | ||||
| Plug 'preservim/nerdtree` | ||||
| ``` | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| Some examples of join command with `ideajoin` option enabled.   | ||||
| Put `set ideajoin` to your `~/.ideavimrc` to enable this functionality. | ||||
|  | ||||
| Now, you can press `J` (`shift+j`) on a line or a selected block of text to join the lines together. | ||||
|  | ||||
| * Automatic join concatenated lines: | ||||
|  | ||||
| ``` | ||||
|   | ||||
| @@ -1,18 +1,31 @@ | ||||
| # | ||||
| # Copyright 2003-2022 The IdeaVim authors | ||||
| # | ||||
| # Use of this source code is governed by an MIT-style | ||||
| # license that can be found in the LICENSE.txt file or at | ||||
| # https://opensource.org/licenses/MIT. | ||||
| # | ||||
|  | ||||
| # suppress inspection "UnusedProperty" for whole file | ||||
|  | ||||
| ideaVersion=LATEST-EAP-SNAPSHOT | ||||
| ideaVersion=2022.3 | ||||
| downloadIdeaSources=true | ||||
| instrumentPluginCode=true | ||||
| version=SNAPSHOT | ||||
| javaVersion=11 | ||||
| remoteRobotVersion=0.11.10 | ||||
| version=chylex-15 | ||||
| javaVersion=17 | ||||
| remoteRobotVersion=0.11.15 | ||||
| antlrVersion=4.10.1 | ||||
|  | ||||
| # Please don't forget to update kotlin version in buildscript section | ||||
| kotlinVersion=1.5.10 | ||||
| kotlinVersion=1.7.20 | ||||
| publishToken=token | ||||
| publishChannels=eap | ||||
|  | ||||
| slackUrl= | ||||
| youtrackToken= | ||||
|  | ||||
| # Gradle settings | ||||
| org.gradle.jvmargs='-Dfile.encoding=UTF-8' | ||||
|  | ||||
| # Disable warning from gradle-intellij-plugin. Kotlin stdlib is included as compileOnly, so the warning is unnecessary | ||||
| kotlin.stdlib.default.dependency=false | ||||
|   | ||||
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
|   | ||||
							
								
								
									
										79982
									
								
								qodana.sarif.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79982
									
								
								qodana.sarif.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								qodana.yaml
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								qodana.yaml
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | ||||
| version: 1.0 | ||||
| profile: | ||||
|   name: Qodana | ||||
| include: | ||||
|   - name: CheckDependencyLicenses | ||||
| exclude: | ||||
|   - name: MoveVariableDeclarationIntoWhen | ||||
|   - name: PluginXmlValidity | ||||
| @@ -9,12 +11,18 @@ exclude: | ||||
|   - name: UnusedReturnValue | ||||
|   - name: All | ||||
|     paths: | ||||
|       - build.gradle | ||||
|       - build.gradle.kts | ||||
|       - gradle/wrapper/gradle-wrapper.properties | ||||
|       - resources/icons/youtrack.svg | ||||
|       - src/com/maddyhome/idea/vim/ex/vimscript/VimScriptCommandHandler.java | ||||
|       - src/com/maddyhome/idea/vim/helper/SearchHelper.java | ||||
|       - src/com/maddyhome/idea/vim/regexp/RegExp.java | ||||
|       - test/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt | ||||
|       - test/org/jetbrains/plugins/ideavim/propertybased/samples/LoremText.kt | ||||
|       - test/org/jetbrains/plugins/ideavim/propertybased/samples/SimpleText.kt | ||||
|       - src/main/resources/icons/youtrack.svg | ||||
|       - src/main/java/com/maddyhome/idea/vim/helper/SearchHelper.java | ||||
|       - src/main/java/com/maddyhome/idea/vim/regexp/RegExp.kt | ||||
|       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt | ||||
|       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/LoremText.kt | ||||
|       - src/test/java/org/jetbrains/plugins/ideavim/propertybased/samples/SimpleText.kt | ||||
|       - src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated | ||||
|       - src/main/java/com/maddyhome/idea/vim/package-info.java | ||||
| dependencyIgnores: | ||||
|   - name: "acejump" | ||||
|   - name: "icu4j" | ||||
|   - name: "antlr-runtime" | ||||
|   - name: "javax.json" | ||||
							
								
								
									
										51
									
								
								scripts/build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								scripts/build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| /* | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| plugins { | ||||
|     java | ||||
|     kotlin("jvm") | ||||
|     application | ||||
| } | ||||
|  | ||||
| // group 'org.jetbrains.ideavim' | ||||
| // version 'SNAPSHOT' | ||||
|  | ||||
| repositories { | ||||
|     mavenCentral() | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20") | ||||
|  | ||||
|     implementation("io.ktor:ktor-client-core:2.1.3") | ||||
|     implementation("io.ktor:ktor-client-cio:2.1.3") | ||||
|     implementation("io.ktor:ktor-client-content-negotiation:2.1.3") | ||||
|     implementation("io.ktor:ktor-serialization-kotlinx-json:2.1.3") | ||||
| } | ||||
|  | ||||
| tasks { | ||||
|     compileKotlin { | ||||
|         kotlinOptions { | ||||
|             freeCompilerArgs = listOf("-Xjvm-default=all-compatibility") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| tasks.register("generateIdeaVimConfigurations", JavaExec::class) { | ||||
|     group = "verification" | ||||
|     description = "This job tracks if there are any new plugins in marketplace we don't know about" | ||||
|     mainClass.set("scripts.MainKt") | ||||
|     classpath = sourceSets["main"].runtimeClasspath | ||||
| } | ||||
|  | ||||
| tasks.register("checkNewPluginDependencies", JavaExec::class) { | ||||
|     group = "verification" | ||||
|     description = "This job tracks if there are any new plugins in marketplace we don't know about" | ||||
|     mainClass.set("scripts.CheckNewPluginDependenciesKt") | ||||
|     classpath = sourceSets["main"].runtimeClasspath | ||||
| } | ||||
							
								
								
									
										13
									
								
								scripts/src/main/kotlin/scripts/Main.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								scripts/src/main/kotlin/scripts/Main.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| /* | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package scripts | ||||
|  | ||||
| fun main() { | ||||
|   println("Hello") | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| /* | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package scripts | ||||
|  | ||||
| import io.ktor.client.* | ||||
| import io.ktor.client.call.* | ||||
| import io.ktor.client.engine.cio.* | ||||
| import io.ktor.client.plugins.contentnegotiation.* | ||||
| import io.ktor.client.request.* | ||||
| import io.ktor.serialization.kotlinx.json.* | ||||
| import kotlinx.coroutines.runBlocking | ||||
|  | ||||
| /** | ||||
|  * Marketplace has a API to get all plugins that depend on our plugin. | ||||
|  * Here we have a list of dependent plugins at some moment and we check if something changed in that. | ||||
|  * If so, we need to update our list of plugins. | ||||
|  * | ||||
|  * This script makes no actions and aimed to notify the devs in case they need to update the list of IdeaVim plugins. | ||||
|  */ | ||||
|  | ||||
| val knownPlugins = listOf( | ||||
|   "IdeaVimExtension", | ||||
|   "github.zgqq.intellij-enhance", | ||||
|   "org.jetbrains.IdeaVim-EasyMotion", | ||||
|   "io.github.mishkun.ideavimsneak", | ||||
|   "eu.theblob42.idea.whichkey", | ||||
|   "com.github.copilot", | ||||
|   "com.github.dankinsoid.multicursor", | ||||
|   "com.joshestein.ideavim-quickscope", | ||||
| ) | ||||
|  | ||||
| fun main() { | ||||
|   val client = HttpClient(CIO) { | ||||
|     install(ContentNegotiation) { | ||||
|       json() | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   runBlocking { | ||||
|     val res = client.get("https://plugins.jetbrains.com/api/plugins/") { | ||||
|       parameter("dependency", "IdeaVIM") | ||||
|       parameter("includeOptional", true) | ||||
|     } | ||||
|     val output = res.body<List<String>>() | ||||
|     println(output) | ||||
|     if (knownPlugins != output) error("Unknown plugins list: ${output}") | ||||
|   } | ||||
| } | ||||
| @@ -1,19 +1,14 @@ | ||||
| /* | ||||
|  * 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/>. | ||||
|  */ | ||||
| // Set repository for snapshot versions of gradle plugin | ||||
| pluginManagement { | ||||
|   repositories { | ||||
|     maven { | ||||
|       url 'https://oss.sonatype.org/content/repositories/snapshots/' | ||||
|     } | ||||
|     gradlePluginPortal() | ||||
|   } | ||||
| } | ||||
|  | ||||
| rootProject.name = 'IdeaVIM' | ||||
| include 'vim-engine' | ||||
| include 'scripts' | ||||
|  | ||||
|   | ||||
| @@ -28,7 +28,7 @@ comment:                (WS | COLON)* QUOTE ~(NEW_LINE)* NEW_LINE; | ||||
| finishStatement:        (WS | COLON)* FINISH WS* (NEW_LINE | BAR); | ||||
| continueStatement:      (WS | COLON)* CONTINUE WS* (NEW_LINE | BAR); | ||||
| breakStatement:         (WS | COLON)* BREAK WS* (NEW_LINE | BAR); | ||||
| returnStatement:        (WS | COLON)* range? (WS | COLON)* RETURN WS+ expr WS* (NEW_LINE | BAR); | ||||
| returnStatement:        (WS | COLON)* range? (WS | COLON)* RETURN (WS+ expr)? WS* (NEW_LINE | BAR); | ||||
| throwStatement:         (WS | COLON)* THROW WS+ expr WS* (NEW_LINE | BAR); | ||||
|  | ||||
| ifStatement:            ifBlock | ||||
| @@ -117,7 +117,7 @@ command: | ||||
|         | MARK_COMMAND | JUMPS | J_LOWERCASE | JOIN_LINES | HISTORY | GO_TO_CHAR | SYMBOL | FIND | CLASS | F_LOWERCASE | ||||
|         | FILE | EXIT | E_LOWERCASE | EDIT_FILE | DUMP_LINE | DIGRAPH | DEL_MARKS | D_LOWERCASE | DEL_LINES | DELCMD | ||||
|         | T_LOWERCASE | COPY | CMD_CLEAR | BUFFER_LIST | BUFFER_CLOSE | B_LOWERCASE | BUFFER | ASCII | ||||
|         | ACTIONLIST | ACTION | LOCKVAR | UNLOCKVAR | PACKADD | ||||
|         | ACTIONLIST | ACTION | LOCKVAR | UNLOCKVAR | PACKADD | TABMOVE | ||||
|       ) | ||||
|     WS* ((commandArgumentWithoutBars? inline_comment NEW_LINE) | (commandArgumentWithoutBars? NEW_LINE) | (commandArgumentWithoutBars? BAR)) (NEW_LINE | BAR)* | ||||
|     #CommandWithComment| | ||||
| @@ -146,7 +146,7 @@ rShift: GREATER+; | ||||
|  | ||||
| letCommands: | ||||
|     (WS | COLON)* range? (WS | COLON)* LET WS+ expr WS* | ||||
|         assignmentOperator =  (ASSIGN | PLUS_ASSIGN | MINUS_ASSIGN | STAR_ASSIGN | DIV_ASSIGN | MOD_ASSIGN | DOT_ASSIGN) | ||||
|         assignmentOperator | ||||
|         WS* expr WS* ((inline_comment NEW_LINE) | (NEW_LINE | BAR)+) | ||||
|     #Let1Command| | ||||
|  | ||||
| @@ -154,6 +154,21 @@ letCommands: | ||||
|     #Let2Command | ||||
| ; | ||||
|  | ||||
| assignmentOperator: | ||||
|     ASSIGN | plusAssign | minusAssign | startAssign | divAssign | modAssign | dotAssign; | ||||
| plusAssign: | ||||
|     PLUS ASSIGN; | ||||
| minusAssign: | ||||
|     MINUS ASSIGN; | ||||
| startAssign: | ||||
|     STAR ASSIGN; | ||||
| divAssign: | ||||
|     DIV ASSIGN; | ||||
| modAssign: | ||||
|     MOD ASSIGN; | ||||
| dotAssign: | ||||
|     DOT ASSIGN; | ||||
|  | ||||
| shortRange: | ||||
|     ((QUESTION (~QUESTION)* QUESTION?) | (DIV (~DIV)* DIV?)); | ||||
| range: | ||||
| @@ -492,6 +507,7 @@ existingCommands:       RETURN | ||||
|                     |   EXECUTE | ||||
|                     |   CALL | ||||
|                     |   NORMAL | ||||
|                     |   TABMOVE | ||||
| ; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| // | ||||
| @@ -684,6 +700,7 @@ EXECUTE:                'exe' | 'exec' | 'execu' | 'execut' | 'execute'; | ||||
| LOCKVAR:                'lockv' | 'lockva' | 'lockvar'; | ||||
| UNLOCKVAR:              'unlo' | 'unloc' | 'unlock' | 'unlockv' | 'unlockva' | 'unlockvar'; | ||||
| NORMAL:                 'norm' | 'norma' | 'normal'; | ||||
| TABMOVE:                'tabm' | 'tabmo' | 'tabmov' | 'tabmove'; | ||||
|  | ||||
| // Types | ||||
| DIGIT:                  [0-9]; | ||||
| @@ -776,12 +793,12 @@ IS_NOT_CS:              'isnot#'; | ||||
|  | ||||
| // Assignment operators | ||||
| ASSIGN:                 '='; | ||||
| PLUS_ASSIGN:            '+='; | ||||
| MINUS_ASSIGN:           '-='; | ||||
| STAR_ASSIGN:            '*='; | ||||
| DIV_ASSIGN:             '/='; | ||||
| MOD_ASSIGN:             '%='; | ||||
| DOT_ASSIGN:             '.='; | ||||
| //PLUS_ASSIGN:            '+='; | ||||
| //MINUS_ASSIGN:           '-='; | ||||
| //STAR_ASSIGN:            '*='; | ||||
| //DIV_ASSIGN:             '/='; | ||||
| //MOD_ASSIGN:             '%='; | ||||
| //DOT_ASSIGN:             '.='; | ||||
|  | ||||
| // Escaped chars | ||||
| ESCAPED_QUESTION:       '\\?'; | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim; | ||||
| @@ -27,6 +17,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; | ||||
| @@ -53,7 +44,7 @@ public class EventFacade { | ||||
|   public void setupTypedActionHandler(@NotNull VimTypedActionHandler handler) { | ||||
|     final TypedAction typedAction = getTypedAction(); | ||||
|  | ||||
|     if (HandlerInjector.notebookCommandMode()) { | ||||
|     if (HandlerInjector.notebookCommandMode(null)) { | ||||
|       TypedActionHandler result = HandlerInjector.inject(); | ||||
|       if (result != null) { | ||||
|         myOriginalTypedActionHandler = result; | ||||
| @@ -101,38 +92,51 @@ public class EventFacade { | ||||
|     EditorFactory.getInstance().addEditorFactoryListener(listener, parentDisposable); | ||||
|   } | ||||
|  | ||||
|   @SuppressWarnings("deprecation") | ||||
|   public void removeEditorFactoryListener(@NotNull EditorFactoryListener listener) { | ||||
|     // Listener is removed not only if application is disposed | ||||
|     EditorFactory.getInstance().removeEditorFactoryListener(listener); | ||||
|   public void addCaretListener(@NotNull Editor editor, | ||||
|                                @NotNull CaretListener listener, | ||||
|                                @NotNull Disposable disposable) { | ||||
|     editor.getCaretModel().addCaretListener(listener, disposable); | ||||
|   } | ||||
|  | ||||
|   public void addEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) { | ||||
|     editor.addEditorMouseListener(listener); | ||||
|   public void removeCaretListener(@NotNull Editor editor, @NotNull CaretListener listener) { | ||||
|     editor.getCaretModel().removeCaretListener(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) { | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,25 +1,21 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|  | ||||
| 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 +32,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) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim; | ||||
|  | ||||
| @@ -22,6 +12,7 @@ import com.maddyhome.idea.vim.group.KeyGroup; | ||||
| import com.maddyhome.idea.vim.handler.ActionBeanClass; | ||||
| import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; | ||||
| import com.maddyhome.idea.vim.key.MappingOwner; | ||||
| import com.maddyhome.idea.vim.newapi.IjVimActionsInitiator; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| import org.jetbrains.annotations.Nullable; | ||||
|  | ||||
| @@ -71,7 +62,7 @@ public class RegisterActions { | ||||
|  | ||||
|   private static void registerVimCommandActions() { | ||||
|     KeyGroup parser = VimPlugin.getKey(); | ||||
|     VIM_ACTIONS_EP.extensions().forEach(parser::registerCommandAction); | ||||
|     VIM_ACTIONS_EP.extensions().map(IjVimActionsInitiator::new).forEach(parser::registerCommandAction); | ||||
|   } | ||||
|  | ||||
|   private static void registerEmptyShortcuts() { | ||||
| @@ -80,6 +71,6 @@ public class RegisterActions { | ||||
|     // The {char1} <BS> {char2} shortcut is handled directly by KeyHandler#handleKey, so doesn't have an action. But we | ||||
|     // still need to register the shortcut, to make sure the editor doesn't swallow it. | ||||
|     parser | ||||
|       .registerShortcutWithoutAction(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), MappingOwner.IdeaVim.INSTANCE); | ||||
|       .registerShortcutWithoutAction(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), MappingOwner.IdeaVim.System.INSTANCE); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,31 +1,18 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim; | ||||
|  | ||||
| import com.intellij.ide.plugins.IdeaPluginDescriptor; | ||||
| import com.intellij.ide.plugins.PluginManagerCore; | ||||
| import com.intellij.notification.Notification; | ||||
| import com.intellij.notification.NotificationListener; | ||||
| import com.intellij.openapi.Disposable; | ||||
| import com.intellij.openapi.application.Application; | ||||
| import com.intellij.openapi.application.ApplicationManager; | ||||
| import com.intellij.openapi.components.PersistentStateComponent; | ||||
| import com.intellij.openapi.components.ServiceManager; | ||||
| import com.intellij.openapi.components.State; | ||||
| import com.intellij.openapi.components.Storage; | ||||
| import com.intellij.openapi.diagnostic.Logger; | ||||
| @@ -33,38 +20,33 @@ import com.intellij.openapi.extensions.PluginId; | ||||
| import com.intellij.openapi.keymap.Keymap; | ||||
| import com.intellij.openapi.keymap.ex.KeymapManagerEx; | ||||
| import com.intellij.openapi.keymap.impl.DefaultKeymap; | ||||
| import com.intellij.openapi.options.ShowSettingsUtil; | ||||
| import com.intellij.openapi.project.Project; | ||||
| import com.intellij.openapi.project.ProjectManager; | ||||
| import com.intellij.openapi.ui.Messages; | ||||
| import com.intellij.openapi.util.Disposer; | ||||
| import com.intellij.openapi.util.SystemInfo; | ||||
| import com.intellij.openapi.wm.StatusBar; | ||||
| import com.intellij.openapi.wm.WindowManager; | ||||
| import com.maddyhome.idea.vim.api.VimInjectorKt; | ||||
| import com.maddyhome.idea.vim.api.VimKeyGroup; | ||||
| import com.maddyhome.idea.vim.config.VimState; | ||||
| import com.maddyhome.idea.vim.config.migration.ApplicationConfigurationMigrator; | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionRegistrar; | ||||
| import com.maddyhome.idea.vim.group.*; | ||||
| import com.maddyhome.idea.vim.group.copy.PutGroup; | ||||
| import com.maddyhome.idea.vim.group.copy.YankGroup; | ||||
| import com.maddyhome.idea.vim.group.visual.VisualMotionGroup; | ||||
| import com.maddyhome.idea.vim.helper.MacKeyRepeat; | ||||
| import com.maddyhome.idea.vim.listener.VimListenerManager; | ||||
| import com.maddyhome.idea.vim.option.OptionsManager; | ||||
| import com.maddyhome.idea.vim.newapi.IjVimInjector; | ||||
| import com.maddyhome.idea.vim.ui.StatusBarIconFactory; | ||||
| import com.maddyhome.idea.vim.ui.VimEmulationConfigurable; | ||||
| import com.maddyhome.idea.vim.ui.ex.ExEntryPanel; | ||||
| import com.maddyhome.idea.vim.vimscript.services.FunctionStorage; | ||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService; | ||||
| import com.maddyhome.idea.vim.vimscript.services.OptionService; | ||||
| import com.maddyhome.idea.vim.vimscript.services.VariableService; | ||||
| import com.maddyhome.idea.vim.vimscript.services.VariableServiceImpl; | ||||
| import com.maddyhome.idea.vim.yank.YankGroupBase; | ||||
| import org.jdom.Element; | ||||
| import org.jetbrains.annotations.Nls; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| import org.jetbrains.annotations.Nullable; | ||||
|  | ||||
| import javax.swing.event.HyperlinkEvent; | ||||
| import java.awt.*; | ||||
|  | ||||
| import static com.maddyhome.idea.vim.group.EditorGroup.EDITOR_STORE_ELEMENT; | ||||
| import static com.maddyhome.idea.vim.group.KeyGroup.SHORTCUT_CONFLICTS_ELEMENT; | ||||
| import static com.maddyhome.idea.vim.vimscript.services.VimRcService.executeIdeaVimRc; | ||||
| @@ -77,18 +59,16 @@ import static com.maddyhome.idea.vim.vimscript.services.VimRcService.executeIdea | ||||
|  * This is an application level plugin meaning that all open projects will share a common instance of the plugin. | ||||
|  * Registers and marks are shared across open projects so you can copy and paste between files of different projects. | ||||
|  */ | ||||
| @SuppressWarnings("deprecation") | ||||
| // [VERSION UPDATE] 212+ getService | ||||
| @State(name = "VimSettings", storages = {@Storage("$APP_CONFIG$/vim_settings.xml")}) | ||||
| public class VimPlugin implements PersistentStateComponent<Element>, Disposable { | ||||
|  | ||||
|   static { | ||||
|     VimInjectorKt.setInjector(new IjVimInjector()); | ||||
|   } | ||||
|  | ||||
|   private static final String IDEAVIM_PLUGIN_ID = "IdeaVIM"; | ||||
|   public static final int STATE_VERSION = 7; | ||||
|  | ||||
|   private static long lastBeepTimeMillis; | ||||
|  | ||||
|   private boolean error = false; | ||||
|   private String message = null; | ||||
|  | ||||
|   private int previousStateVersion = 0; | ||||
|   private String previousKeyMap = ""; | ||||
|  | ||||
| @@ -99,6 +79,8 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|  | ||||
|   private final @NotNull VimState state = new VimState(); | ||||
|  | ||||
|   public Disposable onOffDisposable; | ||||
|  | ||||
|   VimPlugin() { | ||||
|     ApplicationConfigurationMigrator.getInstance().migrate(); | ||||
|   } | ||||
| @@ -122,7 +104,7 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|   @Override | ||||
|   public void dispose() { | ||||
|     LOG.debug("disposeComponent"); | ||||
|     turnOffPlugin(); | ||||
|     turnOffPlugin(false); | ||||
|     LOG.debug("done"); | ||||
|   } | ||||
|  | ||||
| @@ -131,10 +113,10 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|    */ | ||||
|   public static @NotNull NotificationService getNotifications(@Nullable Project project) { | ||||
|     if (project == null) { | ||||
|       return ServiceManager.getService(NotificationService.class); | ||||
|       return ApplicationManager.getApplication().getService(NotificationService.class); | ||||
|     } | ||||
|     else { | ||||
|       return ServiceManager.getService(project, NotificationService.class); | ||||
|       return project.getService(NotificationService.class); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -144,35 +126,35 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|  | ||||
|  | ||||
|   public static @NotNull MotionGroup getMotion() { | ||||
|     return ServiceManager.getService(MotionGroup.class); | ||||
|     return ApplicationManager.getApplication().getService(MotionGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull XMLGroup getXML() { | ||||
|     return ApplicationManager.getApplication().getService(XMLGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull ChangeGroup getChange() { | ||||
|     return ServiceManager.getService(ChangeGroup.class); | ||||
|     return ((ChangeGroup)VimInjectorKt.getInjector().getChangeGroup()); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull CommandGroup getCommand() { | ||||
|     return ServiceManager.getService(CommandGroup.class); | ||||
|     return ApplicationManager.getApplication().getService(CommandGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull MarkGroup getMark() { | ||||
|     return ServiceManager.getService(MarkGroup.class); | ||||
|     return ((MarkGroup)VimInjectorKt.getInjector().getMarkGroup()); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull RegisterGroup getRegister() { | ||||
|     return ServiceManager.getService(RegisterGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @Nullable RegisterGroup getRegisterIfCreated() { | ||||
|     return ApplicationManager.getApplication().getServiceIfCreated(RegisterGroup.class); | ||||
|     return ((RegisterGroup)VimInjectorKt.getInjector().getRegisterGroup()); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull FileGroup getFile() { | ||||
|     return ServiceManager.getService(FileGroup.class); | ||||
|     return (FileGroup)VimInjectorKt.getInjector().getFile(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull SearchGroup getSearch() { | ||||
|     return ServiceManager.getService(SearchGroup.class); | ||||
|     return ApplicationManager.getApplication().getService(SearchGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @Nullable SearchGroup getSearchIfCreated() { | ||||
| @@ -180,35 +162,35 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|   } | ||||
|  | ||||
|   public static @NotNull ProcessGroup getProcess() { | ||||
|     return ServiceManager.getService(ProcessGroup.class); | ||||
|     return ((ProcessGroup)VimInjectorKt.getInjector().getProcessGroup()); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull MacroGroup getMacro() { | ||||
|     return ServiceManager.getService(MacroGroup.class); | ||||
|     return (MacroGroup)VimInjectorKt.getInjector().getMacro(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull DigraphGroup getDigraph() { | ||||
|     return ServiceManager.getService(DigraphGroup.class); | ||||
|     return (DigraphGroup)VimInjectorKt.getInjector().getDigraphGroup(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull HistoryGroup getHistory() { | ||||
|     return ServiceManager.getService(HistoryGroup.class); | ||||
|     return ApplicationManager.getApplication().getService(HistoryGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull KeyGroup getKey() { | ||||
|     return ServiceManager.getService(KeyGroup.class); | ||||
|     return ((KeyGroup)VimInjectorKt.getInjector().getKeyGroup()); | ||||
|   } | ||||
|  | ||||
|   public static @Nullable KeyGroup getKeyIfCreated() { | ||||
|     return ApplicationManager.getApplication().getServiceIfCreated(KeyGroup.class); | ||||
|     return ((KeyGroup)ApplicationManager.getApplication().getServiceIfCreated(VimKeyGroup.class)); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull WindowGroup getWindow() { | ||||
|     return ServiceManager.getService(WindowGroup.class); | ||||
|     return ((WindowGroup)VimInjectorKt.getInjector().getWindow()); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull EditorGroup getEditor() { | ||||
|     return ServiceManager.getService(EditorGroup.class); | ||||
|     return ApplicationManager.getApplication().getService(EditorGroup.class); | ||||
|   } | ||||
|  | ||||
|   public static @Nullable EditorGroup getEditorIfCreated() { | ||||
| @@ -216,23 +198,27 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|   } | ||||
|  | ||||
|   public static @NotNull VisualMotionGroup getVisualMotion() { | ||||
|     return ServiceManager.getService(VisualMotionGroup.class); | ||||
|     return (VisualMotionGroup)VimInjectorKt.getInjector().getVisualMotionGroup(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull YankGroup getYank() { | ||||
|     return ServiceManager.getService(YankGroup.class); | ||||
|   public static @NotNull YankGroupBase getYank() { | ||||
|     return (YankGroupBase)VimInjectorKt.getInjector().getYank(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull PutGroup getPut() { | ||||
|     return ServiceManager.getService(PutGroup.class); | ||||
|     return (PutGroup)VimInjectorKt.getInjector().getPut(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull VariableService getVariableService() { | ||||
|     return ServiceManager.getService(VariableService.class); | ||||
|     return ApplicationManager.getApplication().getService(VariableService.class); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull OptionService getOptionService() { | ||||
|     return ServiceManager.getService(OptionService.class); | ||||
|     return VimInjectorKt.getInjector().getOptionService(); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull IjVimOptionService getOptionServiceImpl() { | ||||
|     return (IjVimOptionService)VimInjectorKt.getInjector().getOptionService(); | ||||
|   } | ||||
|  | ||||
|   private static @NotNull NotificationService getNotifications() { | ||||
| @@ -256,13 +242,8 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|  | ||||
|   public static @NotNull String getVersion() { | ||||
|     final IdeaPluginDescriptor plugin = PluginManagerCore.getPlugin(getPluginId()); | ||||
|     if (!ApplicationManager.getApplication().isInternal()) { | ||||
|     return plugin != null ? plugin.getVersion() : "SNAPSHOT"; | ||||
|   } | ||||
|     else { | ||||
|       return "INTERNAL" + (plugin != null ? " - " + plugin.getVersion() : ""); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public static boolean isEnabled() { | ||||
|     return getInstance().enabled; | ||||
| @@ -272,7 +253,7 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|     if (isEnabled() == enabled) return; | ||||
|  | ||||
|     if (!enabled) { | ||||
|       getInstance().turnOffPlugin(); | ||||
|       getInstance().turnOffPlugin(true); | ||||
|     } | ||||
|  | ||||
|     getInstance().enabled = enabled; | ||||
| @@ -285,100 +266,96 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|   } | ||||
|  | ||||
|   public static boolean isError() { | ||||
|     return getInstance().error; | ||||
|     return VimInjectorKt.getInjector().getMessages().isError(); | ||||
|   } | ||||
|  | ||||
|   public static String getMessage() { | ||||
|     return getInstance().message; | ||||
|     return VimInjectorKt.getInjector().getMessages().getStatusBarMessage(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Indicate to the user that an error has occurred. Just beep. | ||||
|    */ | ||||
|   public static void indicateError() { | ||||
|     if (ApplicationManager.getApplication().isUnitTestMode()) { | ||||
|       getInstance().error = true; | ||||
|     } | ||||
|     else if (!VimPlugin.getOptionService().isSet(OptionService.Scope.GLOBAL.INSTANCE, "visualbell", "visualbell")) { | ||||
|       // Vim only allows a beep once every half second - :help 'visualbell' | ||||
|       final long currentTimeMillis = System.currentTimeMillis(); | ||||
|       if (currentTimeMillis - lastBeepTimeMillis > 500) { | ||||
|         Toolkit.getDefaultToolkit().beep(); | ||||
|         lastBeepTimeMillis = currentTimeMillis; | ||||
|       } | ||||
|     } | ||||
|     VimInjectorKt.getInjector().getMessages().indicateError(); | ||||
|   } | ||||
|  | ||||
|   public static void clearError() { | ||||
|     if (ApplicationManager.getApplication().isUnitTestMode()) { | ||||
|       getInstance().error = false; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public static void showMode(String msg) { | ||||
|     showMessage(msg); | ||||
|     VimInjectorKt.getInjector().getMessages().clearError(); | ||||
|   } | ||||
|  | ||||
|   public static void showMessage(@Nls(capitalization = Nls.Capitalization.Sentence) @Nullable String msg) { | ||||
|     if (ApplicationManager.getApplication().isUnitTestMode()) { | ||||
|       getInstance().message = msg; | ||||
|     } | ||||
|     ProjectManager pm = ProjectManager.getInstance(); | ||||
|     Project[] projects = pm.getOpenProjects(); | ||||
|     for (Project project : projects) { | ||||
|       StatusBar bar = WindowManager.getInstance().getStatusBar(project); | ||||
|       if (bar != null) { | ||||
|         if (msg == null || msg.length() == 0) { | ||||
|           bar.setInfo(""); | ||||
|         } | ||||
|         else { | ||||
|           bar.setInfo("VIM - " + msg); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     VimInjectorKt.getInjector().getMessages().showStatusBarMessage(null, msg); | ||||
|   } | ||||
|  | ||||
|   public static @NotNull VimPlugin getInstance() { | ||||
|     return ServiceManager.getService(VimPlugin.class); | ||||
|     return ApplicationManager.getApplication().getService(VimPlugin.class); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * IdeaVim plugin initialization. | ||||
|    * This is an important operation and some commands ordering should be preserved. | ||||
|    * Please make sure that the documentation of this function is in sync with the code | ||||
|    * | ||||
|    * 1) Update state | ||||
|    *    This schedules a state update. In most cases it just shows some dialogs to the user. As I know, there are | ||||
|    *      no special reasons to keep this command as a first line, so it seems safe to move it. | ||||
|    * 2) Command registration | ||||
|    *    This block should be located BEFORE ~/.ideavimrc execution. Without it the commands won't be registered | ||||
|    *      and initialized, but ~/.ideavimrc file may refer or execute some commands or functions. | ||||
|    *    This block DOES NOT initialize extensions, but only registers the available ones. | ||||
|    * 3) ~/.ideavimrc execution | ||||
|    *    3.1 executes commands from the .ideavimrc file and 3.2 initializes extensions. | ||||
|    *    3.1 MUST BE BEFORE 3.2. This is a flow of vim/IdeaVim initialization, firstly .ideavimrc is executed and then | ||||
|    *      the extensions are initialized. | ||||
|    * 4) Components initialization | ||||
|    *    This should happen after ideavimrc execution because VimListenerManager accesses `number` option | ||||
|    *      to init line numbers and guicaret to initialize carets. | ||||
|    *    However, there is a question about listeners attaching. Listeners registration happens after the .ideavimrc | ||||
|    *      execution, what theoretically may cause bugs (e.g. VIM-2540) | ||||
|    */ | ||||
|   private void turnOnPlugin() { | ||||
|     onOffDisposable = Disposer.newDisposable(this, "IdeaVimOnOffDisposer"); | ||||
|  | ||||
|     // 1) Update state | ||||
|     ApplicationManager.getApplication().invokeLater(this::updateState); | ||||
|  | ||||
|     // Register vim actions in command mode | ||||
|     // 2) Command registration | ||||
|     // 2.1) Register vim actions in command mode | ||||
|     RegisterActions.registerActions(); | ||||
|  | ||||
|     // Register extensions | ||||
|     // 2.2) Register extensions | ||||
|     VimExtensionRegistrar.registerExtensions(); | ||||
|  | ||||
|     // Register functions | ||||
|     // 2.3) Register functions | ||||
|     FunctionStorage.INSTANCE.registerHandlers(); | ||||
|  | ||||
|     // Execute ~/.ideavimrc | ||||
|     // 3) ~/.ideavimrc execution | ||||
|     // 3.1) Execute ~/.ideavimrc | ||||
|     registerIdeavimrc(); | ||||
|  | ||||
|     // Initialize extensions | ||||
|     // 3.2) Initialize extensions. Always after 3.1 | ||||
|     VimExtensionRegistrar.enableDelayedExtensions(); | ||||
|  | ||||
|     // Some options' default values are based on values set in .ideavimrc, e.g. 'shellxquote' on Windows when 'shell' | ||||
|     // is cmd.exe has a different default to when 'shell' contains "sh" | ||||
|     OptionsManager.INSTANCE.completeInitialisation(); | ||||
|  | ||||
|     // Turing on should be performed after all commands registration | ||||
|     getSearch().turnOn(); | ||||
|     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 | ||||
|     RegisterActions.unregisterActions(); | ||||
|  | ||||
|     Disposer.dispose(onOffDisposable); | ||||
|   } | ||||
|  | ||||
|   private boolean stateUpdated = false; | ||||
| @@ -392,7 +369,9 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|         final Boolean enabled = keyRepeat.isEnabled(); | ||||
|         final Boolean isKeyRepeat = getEditor().isKeyRepeat(); | ||||
|         if ((enabled == null || !enabled) && (isKeyRepeat == null || isKeyRepeat)) { | ||||
|           if (VimPlugin.getNotifications().enableRepeatingMode() == Messages.YES) { | ||||
|           // This system property is used in IJ ui robot to hide the startup tips | ||||
|           boolean showNotification = Boolean.getBoolean("ide.show.tips.on.startup.default.value"); | ||||
|           if (showNotification && VimPlugin.getNotifications().enableRepeatingMode() == Messages.YES) { | ||||
|             getEditor().setKeyRepeat(true); | ||||
|             keyRepeat.setEnabled(true); | ||||
|           } | ||||
| @@ -411,12 +390,6 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable | ||||
|           keymap = manager.getKeymap(DefaultKeymap.getInstance().getDefaultKeymapName()); | ||||
|         } | ||||
|         assert keymap != null : "Default keymap not found"; | ||||
|         VimPlugin.getNotifications().specialKeymap(keymap, new NotificationListener.Adapter() { | ||||
|           @Override | ||||
|           protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent e) { | ||||
|             ShowSettingsUtil.getInstance().showSettingsDialog(null, VimEmulationConfigurable.class); | ||||
|           } | ||||
|         }); | ||||
|         manager.setActiveKeymap(keymap); | ||||
|       } | ||||
|       if (previousStateVersion > 0 && previousStateVersion < 4) { | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim | ||||
|   | ||||
| @@ -1,19 +1,9 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim | ||||
|  | ||||
| @@ -25,8 +15,12 @@ import com.intellij.openapi.editor.actionSystem.TypedActionHandler | ||||
| import com.intellij.openapi.editor.actionSystem.TypedActionHandlerEx | ||||
| import com.intellij.openapi.progress.ProcessCanceledException | ||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | ||||
| import com.maddyhome.idea.vim.helper.inInsertMode | ||||
| import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere | ||||
| import com.maddyhome.idea.vim.vimscript.services.OptionService | ||||
| import com.maddyhome.idea.vim.key.KeyHandlerKeeper | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
| import com.maddyhome.idea.vim.options.OptionConstants | ||||
| import com.maddyhome.idea.vim.options.OptionScope | ||||
| import java.awt.event.KeyAdapter | ||||
| import java.awt.event.KeyEvent | ||||
| import javax.swing.KeyStroke | ||||
| @@ -36,33 +30,43 @@ import javax.swing.KeyStroke | ||||
|  * | ||||
|  * IDE shortcut keys used by Vim commands are handled by [com.maddyhome.idea.vim.action.VimShortcutKeyAction]. | ||||
|  */ | ||||
| class VimTypedActionHandler(origHandler: TypedActionHandler?) : TypedActionHandlerEx { | ||||
| class VimTypedActionHandler(origHandler: TypedActionHandler) : TypedActionHandlerEx { | ||||
|   private val handler = KeyHandler.getInstance() | ||||
|   private val traceTime = VimPlugin.getOptionService().isSet(OptionService.Scope.GLOBAL, "ideatracetime") | ||||
|   private val traceTime = VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.ideatracetimeName) | ||||
|  | ||||
|   init { | ||||
|     handler.originalHandler = origHandler | ||||
|     KeyHandlerKeeper.getInstance().originalHandler = origHandler | ||||
|   } | ||||
|  | ||||
|   override fun beforeExecute(editor: Editor, charTyped: Char, context: DataContext, plan: ActionPlan) { | ||||
|     LOG.trace("Before execute for typed action") | ||||
|     if (editor.isIdeaVimDisabledHere) { | ||||
|       LOG.trace("IdeaVim disabled here, finish") | ||||
|       (handler.originalHandler as? TypedActionHandlerEx)?.beforeExecute(editor, charTyped, context, plan) | ||||
|       (KeyHandlerKeeper.getInstance().originalHandler as? TypedActionHandlerEx)?.beforeExecute(editor, charTyped, context, plan) | ||||
|       return | ||||
|     } | ||||
|  | ||||
|     LOG.trace("Executing before execute") | ||||
|     val modifiers = if (charTyped == ' ' && VimKeyListener.isSpaceShift) KeyEvent.SHIFT_DOWN_MASK else 0 | ||||
|     val keyStroke = KeyStroke.getKeyStroke(charTyped, modifiers) | ||||
|     handler.beforeHandleKey(editor, keyStroke, context, plan) | ||||
|  | ||||
|     /* Invoked before acquiring a write lock and actually handling the keystroke. | ||||
|      * | ||||
|      * Drafts an optional [ActionPlan] that will be used as a base for zero-latency rendering in editor. | ||||
|      */ | ||||
|     if (editor.inInsertMode) { | ||||
|       val originalHandler = KeyHandlerKeeper.getInstance().originalHandler | ||||
|       if (originalHandler is TypedActionHandlerEx) { | ||||
|         originalHandler.beforeExecute(editor, keyStroke.keyChar, context, plan) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   override fun execute(editor: Editor, charTyped: Char, context: DataContext) { | ||||
|     LOG.trace("Execute for typed action") | ||||
|     if (editor.isIdeaVimDisabledHere) { | ||||
|       LOG.trace("IdeaVim disabled here, finish") | ||||
|       handler.originalHandler.execute(editor, charTyped, context) | ||||
|       KeyHandlerKeeper.getInstance().originalHandler.execute(editor, charTyped, context) | ||||
|       return | ||||
|     } | ||||
|  | ||||
| @@ -71,7 +75,7 @@ class VimTypedActionHandler(origHandler: TypedActionHandler?) : TypedActionHandl | ||||
|       val modifiers = if (charTyped == ' ' && VimKeyListener.isSpaceShift) KeyEvent.SHIFT_DOWN_MASK else 0 | ||||
|       val keyStroke = KeyStroke.getKeyStroke(charTyped, modifiers) | ||||
|       val startTime = if (traceTime) System.currentTimeMillis() else null | ||||
|       handler.handleKey(editor, keyStroke, EditorDataContext.init(editor, context)) | ||||
|       handler.handleKey(editor.vim, keyStroke, EditorDataContext.init(editor, context).vim) | ||||
|       if (startTime != null) { | ||||
|         val duration = System.currentTimeMillis() - startTime | ||||
|         LOG.info("VimTypedAction '$charTyped': $duration ms") | ||||
|   | ||||
| @@ -1,25 +0,0 @@ | ||||
| /* | ||||
|  * 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.action | ||||
|  | ||||
| import javax.swing.KeyStroke | ||||
|  | ||||
| interface ComplicatedKeysAction { | ||||
|   val keyStrokesSet: Set<List<KeyStroke>> | ||||
| } | ||||
| @@ -1,34 +0,0 @@ | ||||
| /* | ||||
|  * 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.action | ||||
|  | ||||
| /** | ||||
|  * There are some double-character commands like `cc`, `dd`, `yy`. | ||||
|  * During the execution these commands are replaced with `c_`, `d_`, `y_`, etc. | ||||
|  * | ||||
|  * This is not any kind of workaround, this is exactly how the original vim works. | ||||
|  *   The `dd` command (and others) should not be processed as a monolith command, or it will lead to problems | ||||
|  *   like this: https://youtrack.jetbrains.com/issue/VIM-1189 | ||||
|  * | ||||
|  * If some command implements this interface, and the user enters motion operator that is the same as the command itself, the | ||||
|  *   motion operator will be replaced with `_`. | ||||
|  */ | ||||
| interface DuplicableOperatorAction { | ||||
|   val duplicateWith: Char | ||||
| } | ||||
| @@ -1,25 +1,15 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action | ||||
|  | ||||
| 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 | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| @@ -27,7 +17,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| class ExEntryAction : VimActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_READONLY | ||||
|  | ||||
|   override fun execute(editor: Editor, context: DataContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|     VimPlugin.getProcess().startExCommand(editor, context, cmd) | ||||
|     return true | ||||
|   } | ||||
|   | ||||
| @@ -1,49 +0,0 @@ | ||||
| /* | ||||
|  * 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.action | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.KeyHandler | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandState | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.MotionGroup | ||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| import com.maddyhome.idea.vim.helper.getTopLevelEditor | ||||
| import com.maddyhome.idea.vim.helper.mode | ||||
| import com.maddyhome.idea.vim.helper.vimForEachCaret | ||||
|  | ||||
| class ResetModeAction : VimActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_WRITABLE | ||||
|  | ||||
|   override fun execute(editor: Editor, context: DataContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|     val modeBeforeReset = editor.mode | ||||
|     KeyHandler.getInstance().fullReset(editor.getTopLevelEditor()) | ||||
|  | ||||
|     if (modeBeforeReset == CommandState.Mode.INSERT) { | ||||
|       editor.vimForEachCaret { caret -> | ||||
|         val position = VimPlugin.getMotion().getOffsetOfHorizontalMotion(editor, caret, -1, false) | ||||
|         MotionGroup.moveCaret(editor, caret, position) | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return true | ||||
|   } | ||||
| } | ||||
| @@ -1,24 +1,15 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
|  | ||||
| package com.maddyhome.idea.vim.action | ||||
|  | ||||
| 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 +33,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 | ||||
| } | ||||
|   | ||||
| @@ -1,25 +1,16 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action | ||||
|  | ||||
| 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 | ||||
| @@ -34,10 +25,10 @@ import com.intellij.openapi.util.Key | ||||
| import com.intellij.ui.KeyStrokeAdapter | ||||
| import com.maddyhome.idea.vim.KeyHandler | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.helper.EditorDataContext | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.HandlerInjector | ||||
| import com.maddyhome.idea.vim.helper.StringHelper | ||||
| import com.maddyhome.idea.vim.helper.inInsertMode | ||||
| import com.maddyhome.idea.vim.helper.inNormalMode | ||||
| import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere | ||||
| @@ -48,10 +39,14 @@ import com.maddyhome.idea.vim.key.ShortcutOwner | ||||
| import com.maddyhome.idea.vim.key.ShortcutOwnerInfo | ||||
| import com.maddyhome.idea.vim.listener.AceJumpService | ||||
| import com.maddyhome.idea.vim.listener.AppCodeTemplates.appCodeTemplateCaptured | ||||
| import com.maddyhome.idea.vim.newapi.IjVimEditor | ||||
| import com.maddyhome.idea.vim.newapi.vim | ||||
| import com.maddyhome.idea.vim.options.OptionChangeListener | ||||
| import com.maddyhome.idea.vim.options.OptionConstants | ||||
| import com.maddyhome.idea.vim.options.OptionScope | ||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType | ||||
| import com.maddyhome.idea.vim.vimscript.model.datatypes.VimString | ||||
| import com.maddyhome.idea.vim.vimscript.model.options.OptionChangeListener | ||||
| import com.maddyhome.idea.vim.vimscript.services.OptionService | ||||
| import com.maddyhome.idea.vim.vimscript.services.IjVimOptionService | ||||
| import java.awt.event.InputEvent | ||||
| import java.awt.event.KeyEvent | ||||
| import javax.swing.KeyStroke | ||||
| @@ -63,7 +58,7 @@ import javax.swing.KeyStroke | ||||
|  * These keys are not passed to [com.maddyhome.idea.vim.VimTypedActionHandler] and should be handled by actions. | ||||
|  */ | ||||
| class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|   private val traceTime = VimPlugin.getOptionService().isSet(OptionService.Scope.GLOBAL, "ideatracetime") | ||||
|   private val traceTime = VimPlugin.getOptionService().isSet(OptionScope.GLOBAL, OptionConstants.ideatracetimeName) | ||||
|  | ||||
|   override fun actionPerformed(e: AnActionEvent) { | ||||
|     LOG.trace("Executing shortcut key action") | ||||
| @@ -77,7 +72,7 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|       // Should we use HelperKt.getTopLevelEditor(editor) here, as we did in former EditorKeyHandler? | ||||
|       try { | ||||
|         val start = if (traceTime) System.currentTimeMillis() else null | ||||
|         KeyHandler.getInstance().handleKey(editor, keyStroke, EditorDataContext.init(editor, e.dataContext)) | ||||
|         KeyHandler.getInstance().handleKey(editor.vim, keyStroke, EditorDataContext.init(editor, e.dataContext).vim) | ||||
|         if (start != null) { | ||||
|           val duration = System.currentTimeMillis() - start | ||||
|           LOG.info("VimShortcut update '$keyStroke': $duration ms") | ||||
| @@ -91,6 +86,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) | ||||
| @@ -121,8 +120,8 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|  | ||||
|       val keyCode = keyStroke.keyCode | ||||
|  | ||||
|       if (HandlerInjector.notebookCommandMode()) { | ||||
|         LOG.trace("Python Notebook command mode") | ||||
|       if (HandlerInjector.notebookCommandMode(editor)) { | ||||
|         LOG.debug("Python Notebook command mode") | ||||
|         if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_KP_RIGHT || keyCode == KeyEvent.VK_ENTER) { | ||||
|           invokeLater { editor.updateCaretsVisualAttributes() } | ||||
|         } | ||||
| @@ -145,6 +144,10 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|  | ||||
|       if ((keyCode == KeyEvent.VK_TAB || keyCode == KeyEvent.VK_ENTER) && editor.appCodeTemplateCaptured()) return false | ||||
|        | ||||
|       if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) return false | ||||
|       if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN) return false | ||||
|       if (keyCode == KeyEvent.VK_HOME || keyCode == KeyEvent.VK_END) return false | ||||
|  | ||||
|       if (editor.inInsertMode) { | ||||
|         if (keyCode == KeyEvent.VK_TAB) { | ||||
|           // TODO: This stops VimEditorTab seeing <Tab> in insert mode and correctly scrolling the view | ||||
| @@ -170,19 +173,7 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|  | ||||
|       val savedShortcutConflicts = VimPlugin.getKey().savedShortcutConflicts | ||||
|       val info = savedShortcutConflicts[keyStroke] | ||||
|       if (info is ShortcutOwner) { | ||||
|         return when (info) { | ||||
|           ShortcutOwner.VIM -> true | ||||
|           ShortcutOwner.IDE -> !isShortcutConflict(keyStroke) | ||||
|           else -> { | ||||
|             if (isShortcutConflict(keyStroke)) { | ||||
|               savedShortcutConflicts[keyStroke] = ShortcutOwnerInfo.allUndefined | ||||
|             } | ||||
|             true | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       return when ((info as? ShortcutOwnerInfo)?.forEditor(editor)) { | ||||
|       return when (info?.forEditor(editor.vim)) { | ||||
|         ShortcutOwner.VIM -> true | ||||
|         ShortcutOwner.IDE -> !isShortcutConflict(keyStroke) | ||||
|         else -> { | ||||
| @@ -197,10 +188,10 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|   } | ||||
|  | ||||
|   private fun isEnabledForEscape(editor: Editor): Boolean { | ||||
|     val ideaVimSupportValue = (VimPlugin.getOptionService().getOptionValue(OptionService.Scope.LOCAL(editor), "ideavimsupport") as VimString).value | ||||
|     val ideaVimSupportValue = (VimPlugin.getOptionService().getOptionValue(OptionScope.LOCAL(IjVimEditor(editor)), IjVimOptionService.ideavimsupportName) as VimString).value | ||||
|     return editor.isPrimaryEditor() || | ||||
|       EditorHelper.isFileEditor(editor) && !editor.inNormalMode || | ||||
|       ideaVimSupportValue.contains("dialog") && !editor.inNormalMode | ||||
|       ideaVimSupportValue.contains(IjVimOptionService.ideavimsupport_dialog) && !editor.inNormalMode | ||||
|   } | ||||
|  | ||||
|   private fun isShortcutConflict(keyStroke: KeyStroke): Boolean { | ||||
| @@ -246,7 +237,7 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|  | ||||
|     init { | ||||
|       VimPlugin.getOptionService().addListener( | ||||
|         "lookupkeys", | ||||
|         OptionConstants.lookupkeysName, | ||||
|         object : OptionChangeListener<VimDataType> { | ||||
|           override fun processGlobalValueChange(oldValue: VimDataType?) { | ||||
|             parsedLookupKeys = parseLookupKeys() | ||||
| @@ -257,9 +248,9 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ { | ||||
|  | ||||
|     fun isEnabledForLookup(keyStroke: KeyStroke): Boolean = keyStroke !in parsedLookupKeys | ||||
|  | ||||
|     private fun parseLookupKeys() = (VimPlugin.getOptionService().getOptionValue(OptionService.Scope.GLOBAL, "lookupkeys") as VimString).value | ||||
|     private fun parseLookupKeys() = (VimPlugin.getOptionService().getOptionValue(OptionScope.GLOBAL, OptionConstants.lookupkeysName) as VimString).value | ||||
|       .split(",") | ||||
|       .map { StringHelper.parseKeys(it) } | ||||
|       .map { injector.parser.parseKeys(it) } | ||||
|       .filter { it.isNotEmpty() } | ||||
|       .map { it.first() } | ||||
|       .toSet() | ||||
|   | ||||
| @@ -1,73 +1,115 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.KeyHandler | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.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 | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.command.SelectionType | ||||
| import com.maddyhome.idea.vim.common.TextRange | ||||
| import com.maddyhome.idea.vim.common.argumentCaptured | ||||
| import com.maddyhome.idea.vim.group.MotionGroup | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.MessageHelper | ||||
| import com.maddyhome.idea.vim.helper.commandState | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import com.maddyhome.idea.vim.helper.vimStateMachine | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
| import java.util.* | ||||
|  | ||||
| private fun doOperatorAction(editor: VimEditor, context: ExecutionContext, textRange: TextRange, selectionType: SelectionType): Boolean { | ||||
|   val operatorFunction = injector.keyGroup.operatorFunction | ||||
|   if (operatorFunction == null) { | ||||
|     VimPlugin.showMessage(MessageHelper.message("E774")) | ||||
|     return false | ||||
|   } | ||||
|  | ||||
|   val saveRepeatHandler = VimRepeater.repeatHandler | ||||
|   VimPlugin.getMark().setChangeMarks(editor, textRange) | ||||
|   KeyHandler.getInstance().reset(editor) | ||||
|   val result = operatorFunction.apply(editor, context, selectionType) | ||||
|   VimRepeater.repeatHandler = saveRepeatHandler | ||||
|   return result | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class OperatorAction : VimActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.MOTION | ||||
|  | ||||
|   override fun execute(editor: Editor, context: DataContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|     val operatorFunction = VimPlugin.getKey().operatorFunction | ||||
|     if (operatorFunction != null) { | ||||
|       val argument = cmd.argument | ||||
|       if (argument != null) { | ||||
|         if (!editor.commandState.isDotRepeatInProgress) { | ||||
|           VimRepeater.Extension.argumentCaptured = argument | ||||
|   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|     val argument = cmd.argument ?: return false | ||||
|     if (!editor.vimStateMachine.isDotRepeatInProgress) { | ||||
|       argumentCaptured = argument | ||||
|     } | ||||
|         val saveRepeatHandler = VimRepeater.repeatHandler | ||||
|         val motion = argument.motion | ||||
|         val range = MotionGroup | ||||
|           .getMotionRange( | ||||
|             editor, | ||||
|             editor.caretModel.primaryCaret, | ||||
|             context, | ||||
|     val range = getMotionRange(editor, context, argument, operatorArguments) | ||||
|  | ||||
|     if (range != null) { | ||||
|       val selectionType = if (argument.motion.isLinewiseMotion()) { | ||||
|         SelectionType.LINE_WISE | ||||
|       } else { | ||||
|         SelectionType.CHARACTER_WISE | ||||
|       } | ||||
|       return doOperatorAction(editor, context, range, selectionType) | ||||
|     } | ||||
|     return false | ||||
|   } | ||||
|  | ||||
|   private fun getMotionRange( | ||||
|     editor: VimEditor, | ||||
|     context: ExecutionContext, | ||||
|     argument: Argument, | ||||
|     operatorArguments: OperatorArguments | ||||
|   ): TextRange? { | ||||
|  | ||||
|     // Note that we're using getMotionRange2 in order to avoid normalising the linewise range into line start | ||||
|     // offsets that will be used to set the change marks. This affects things like the location of the caret in the | ||||
|     // Commentary extension | ||||
|     val ijEditor = editor.ij | ||||
|     return MotionGroup.getMotionRange2( | ||||
|       ijEditor, | ||||
|       ijEditor.caretModel.primaryCaret, | ||||
|       context.ij, | ||||
|       argument, | ||||
|       operatorArguments | ||||
|           ) | ||||
|         if (range != null) { | ||||
|           VimPlugin.getMark().setChangeMarks(editor, range) | ||||
|           val selectionType = if (motion.isLinewiseMotion()) SelectionType.LINE_WISE else SelectionType.CHARACTER_WISE | ||||
|           KeyHandler.getInstance().reset(editor) | ||||
|           val result = operatorFunction.apply(editor, context, selectionType) | ||||
|           VimRepeater.repeatHandler = saveRepeatHandler | ||||
|           return result | ||||
|     )?.normalize()?.let { | ||||
|  | ||||
|       // If we're linewise, make sure the end offset isn't just the EOL char | ||||
|       if (argument.motion.isLinewiseMotion() && it.endOffset < editor.fileSize()) { | ||||
|         TextRange(it.startOffset, it.endOffset + 1) | ||||
|       } else { | ||||
|         it | ||||
|       } | ||||
|     } | ||||
|       return false | ||||
|     } | ||||
|     VimPlugin.showMessage(MessageHelper.message("E774")) | ||||
|     return false | ||||
|   } | ||||
| } | ||||
|  | ||||
| class VisualOperatorAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: VimEditor, | ||||
|     caret: VimCaret, | ||||
|     context: ExecutionContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return doOperatorAction(editor, context, range.toVimTextRange(), range.type) | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,31 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| import com.maddyhome.idea.vim.helper.UndoRedoHelper.redo | ||||
|  | ||||
| class RedoAction : VimActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED | ||||
|  | ||||
|   override fun execute(editor: Editor, context: DataContext, cmd: Command, operatorArguments: OperatorArguments): Boolean = redo(context) | ||||
| } | ||||
| @@ -1,60 +1,55 @@ | ||||
| /* | ||||
|  * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform | ||||
|  * Copyright (C) 2003-2021 The IdeaVim authors | ||||
|  * Copyright 2003-2022 The IdeaVim authors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
|  * Use of this source code is governed by an MIT-style | ||||
|  * license that can be found in the LICENSE.txt file or at | ||||
|  * https://opensource.org/licenses/MIT. | ||||
|  */ | ||||
| package com.maddyhome.idea.vim.action.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.command.CommandProcessor | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.KeyHandler | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.api.ExecutionContext | ||||
| import com.maddyhome.idea.vim.api.VimEditor | ||||
| import com.maddyhome.idea.vim.api.injector | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.extension.VimExtensionHandler | ||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| import com.maddyhome.idea.vim.helper.commandState | ||||
| import javax.swing.KeyStroke | ||||
| import com.maddyhome.idea.vim.helper.vimStateMachine | ||||
| import com.maddyhome.idea.vim.newapi.ij | ||||
|  | ||||
| class RepeatChangeAction : VimActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_WRITABLE | ||||
|  | ||||
|   override fun execute(editor: Editor, context: DataContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|     val state = editor.commandState | ||||
|   override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { | ||||
|     val state = editor.vimStateMachine | ||||
|     val lastCommand = VimRepeater.lastChangeCommand | ||||
|  | ||||
|     if (lastCommand == null && VimRepeater.Extension.lastExtensionHandler == null) return false | ||||
|     if (lastCommand == null && Extension.lastExtensionHandler == null) return false | ||||
|  | ||||
|     // Save state | ||||
|     val save = state.executingCommand | ||||
|     val lastFTCmd = VimPlugin.getMotion().lastFTCmd | ||||
|     val lastFTChar = VimPlugin.getMotion().lastFTChar | ||||
|     val reg = VimPlugin.getRegister().currentRegister | ||||
|     val lastHandler = VimRepeater.Extension.lastExtensionHandler | ||||
|     val lastFTCmd = injector.motion.lastFTCmd | ||||
|     val lastFTChar = injector.motion.lastFTChar | ||||
|     val reg = injector.registerGroup.currentRegister | ||||
|     val lastHandler = Extension.lastExtensionHandler | ||||
|     val repeatHandler = VimRepeater.repeatHandler | ||||
|  | ||||
|     state.isDotRepeatInProgress = true | ||||
|     VimPlugin.getRegister().selectRegister(VimRepeater.lastChangeRegister) | ||||
|  | ||||
|     // A fancy 'redo-register' feature | ||||
|     // VIM-2643, :h redo-register | ||||
|     if (VimRepeater.lastChangeRegister in '1'..'8') { | ||||
|       VimRepeater.lastChangeRegister = VimRepeater.lastChangeRegister.inc() | ||||
|     } | ||||
|  | ||||
|     injector.registerGroup.selectRegister(VimRepeater.lastChangeRegister) | ||||
|  | ||||
|     try { | ||||
|       if (repeatHandler && lastHandler != null) { | ||||
|         val processor = CommandProcessor.getInstance() | ||||
|         processor.executeCommand( | ||||
|           editor.project, | ||||
|           editor.ij.project, | ||||
|           { lastHandler.execute(editor, context) }, | ||||
|           "Vim " + lastHandler.javaClass.simpleName, | ||||
|           null | ||||
| @@ -71,7 +66,7 @@ class RepeatChangeAction : VimActionHandler.SingleExecution() { | ||||
|         state.setExecutingCommand(lastCommand) | ||||
|  | ||||
|         val arguments = operatorArguments.copy(count0 = lastCommand.rawCount) | ||||
|         KeyHandler.executeVimAction(editor, lastCommand.action, context, arguments) | ||||
|         injector.actionExecutor.executeVimAction(editor, lastCommand.action, context, arguments) | ||||
|  | ||||
|         VimRepeater.saveLastChange(lastCommand) | ||||
|       } | ||||
| @@ -83,66 +78,10 @@ class RepeatChangeAction : VimActionHandler.SingleExecution() { | ||||
|     // Restore state | ||||
|     if (save != null) state.setExecutingCommand(save) | ||||
|     VimPlugin.getMotion().setLastFTCmd(lastFTCmd, lastFTChar) | ||||
|     if (lastHandler != null) VimRepeater.Extension.lastExtensionHandler = lastHandler | ||||
|     if (lastHandler != null) Extension.lastExtensionHandler = lastHandler | ||||
|     VimRepeater.repeatHandler = repeatHandler | ||||
|     VimRepeater.Extension.reset() | ||||
|     Extension.reset() | ||||
|     VimPlugin.getRegister().selectRegister(reg) | ||||
|     return true | ||||
|   } | ||||
| } | ||||
|  | ||||
| object VimRepeater { | ||||
|   var repeatHandler = false | ||||
|  | ||||
|   var lastChangeCommand: Command? = null | ||||
|     private set | ||||
|   var lastChangeRegister = VimPlugin.getRegister().defaultRegister | ||||
|     private set | ||||
|  | ||||
|   fun saveLastChange(command: Command) { | ||||
|     lastChangeCommand = command | ||||
|     lastChangeRegister = VimPlugin.getRegister().currentRegister | ||||
|   } | ||||
|  | ||||
|   object Extension { | ||||
|     var lastExtensionHandler: VimExtensionHandler? = null | ||||
|     var argumentCaptured: Argument? = null | ||||
|  | ||||
|     private val keyStrokes = mutableListOf<KeyStroke>() | ||||
|     private val strings = mutableListOf<String>() | ||||
|  | ||||
|     private var keystrokePointer = 0 | ||||
|     private var stringPointer = 0 | ||||
|  | ||||
|     fun addKeystroke(key: KeyStroke) = keyStrokes.add(key) | ||||
|     fun addString(key: String) = strings.add(key) | ||||
|  | ||||
|     fun consumeKeystroke(): KeyStroke? { | ||||
|       if (keystrokePointer in keyStrokes.indices) { | ||||
|         keystrokePointer += 1 | ||||
|         return keyStrokes[keystrokePointer - 1] | ||||
|       } | ||||
|       return null | ||||
|     } | ||||
|  | ||||
|     fun consumeString(): String? { | ||||
|       if (stringPointer in strings.indices) { | ||||
|         stringPointer += 1 | ||||
|         return strings[stringPointer - 1] | ||||
|       } | ||||
|       return null | ||||
|     } | ||||
|  | ||||
|     fun reset() { | ||||
|       keystrokePointer = 0 | ||||
|       stringPointer = 0 | ||||
|     } | ||||
|  | ||||
|     fun clean() { | ||||
|       keyStrokes.clear() | ||||
|       strings.clear() | ||||
|       keystrokePointer = 0 | ||||
|       stringPointer = 0 | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,40 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.action.ComplicatedKeysAction | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.VimActionHandler | ||||
| import com.maddyhome.idea.vim.helper.StringHelper | ||||
| import com.maddyhome.idea.vim.helper.UndoRedoHelper.undo | ||||
| import java.awt.event.KeyEvent | ||||
| import javax.swing.KeyStroke | ||||
|  | ||||
| class UndoAction : VimActionHandler.SingleExecution(), ComplicatedKeysAction { | ||||
|   override val keyStrokesSet: Set<List<KeyStroke>> = setOf( | ||||
|     StringHelper.parseKeys("u"), | ||||
|     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_UNDO, 0)) | ||||
|   ) | ||||
|  | ||||
|   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED | ||||
|  | ||||
|   override fun execute(editor: Editor, context: DataContext, cmd: Command, operatorArguments: OperatorArguments): Boolean = undo(context) | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class AutoIndentLinesVisualAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_MOT_LINEWISE, CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     VimPlugin.getChange().autoIndentRange(editor, caret, context, range.toVimTextRange(true)) | ||||
|     return true | ||||
|   } | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.action.DuplicableOperatorAction | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.CharacterHelper | ||||
|  | ||||
| class ChangeCaseLowerMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.MOTION | ||||
|  | ||||
|   override val duplicateWith: Char = 'u' | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return argument != null && | ||||
|       VimPlugin.getChange() | ||||
|         .changeCaseMotion( | ||||
|           editor, | ||||
|           caret, | ||||
|           context, | ||||
|           CharacterHelper.CASE_LOWER, | ||||
|           argument, | ||||
|           operatorArguments | ||||
|         ) | ||||
|   } | ||||
| } | ||||
| @@ -1,54 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.CharacterHelper | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import com.maddyhome.idea.vim.helper.getTopLevelEditor | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeCaseLowerVisualAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     val topLevelEditor = editor.getTopLevelEditor() | ||||
|     return VimPlugin.getChange() | ||||
|       .changeCaseRange(topLevelEditor, caret, range.toVimTextRange(false), CharacterHelper.CASE_LOWER) | ||||
|   } | ||||
| } | ||||
| @@ -1,41 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
|  | ||||
| class ChangeCaseToggleCharacterAction : ChangeEditorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return VimPlugin.getChange().changeCaseToggleCharacter(editor, caret, operatorArguments.count1) | ||||
|   } | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.action.DuplicableOperatorAction | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.CharacterHelper | ||||
|  | ||||
| class ChangeCaseToggleMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.MOTION | ||||
|  | ||||
|   override val duplicateWith: Char = '~' | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return argument != null && | ||||
|       VimPlugin.getChange() | ||||
|         .changeCaseMotion( | ||||
|           editor, | ||||
|           caret, | ||||
|           context, | ||||
|           CharacterHelper.CASE_TOGGLE, | ||||
|           argument, | ||||
|           operatorArguments | ||||
|         ) | ||||
|   } | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.CharacterHelper | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeCaseToggleVisualAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return VimPlugin.getChange() | ||||
|       .changeCaseRange(editor, caret, range.toVimTextRange(false), CharacterHelper.CASE_TOGGLE) | ||||
|   } | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.action.DuplicableOperatorAction | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.CharacterHelper | ||||
|  | ||||
| class ChangeCaseUpperMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.MOTION | ||||
|  | ||||
|   override val duplicateWith: Char = 'U' | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return argument != null && | ||||
|       VimPlugin.getChange() | ||||
|         .changeCaseMotion( | ||||
|           editor, | ||||
|           caret, | ||||
|           context, | ||||
|           CharacterHelper.CASE_UPPER, | ||||
|           argument, | ||||
|           operatorArguments | ||||
|         ) | ||||
|   } | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.CharacterHelper | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeCaseUpperVisualAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return VimPlugin.getChange() | ||||
|       .changeCaseRange(editor, caret, range.toVimTextRange(false), CharacterHelper.CASE_UPPER) | ||||
|   } | ||||
| } | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| class ChangeCharacterAction : ChangeEditorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.DIGRAPH | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_ALLOW_DIGRAPH) | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return argument != null && VimPlugin.getChange().changeCharacter(editor, caret, operatorArguments.count1, argument.character) | ||||
|   } | ||||
| } | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_MULTIKEY_UNDO | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_NO_REPEAT_INSERT | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| class ChangeCharactersAction : ChangeEditorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(FLAG_NO_REPEAT_INSERT, FLAG_MULTIKEY_UNDO) | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return VimPlugin.getChange().changeCharacters(editor, caret, operatorArguments.count1) | ||||
|   } | ||||
| } | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_MULTIKEY_UNDO | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_NO_REPEAT_INSERT | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| class ChangeEndOfLineAction : ChangeEditorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(FLAG_NO_REPEAT_INSERT, FLAG_MULTIKEY_UNDO) | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return VimPlugin.getChange().changeEndOfLine(editor, caret, operatorArguments.count1) | ||||
|   } | ||||
| } | ||||
| @@ -1,44 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.ex.ranges.LineRange | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.vimscript.model.Script | ||||
|  | ||||
| class ChangeLastGlobalSearchReplaceAction : ChangeEditorActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     val range = LineRange(0, EditorHelper.getLineCount(editor) - 1) | ||||
|     return VimPlugin.getSearch() | ||||
|       .processSubstituteCommand(editor, editor.caretModel.primaryCaret, range, "s", "//~/&", Script(listOf())) | ||||
|   } | ||||
| } | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.ex.ranges.LineRange | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.vimscript.model.Script | ||||
|  | ||||
| class ChangeLastSearchReplaceAction : ChangeEditorActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     var result = true | ||||
|     for (caret in editor.caretModel.allCarets) { | ||||
|       val line = caret.logicalPosition.line | ||||
|       if (!VimPlugin.getSearch().processSubstituteCommand(editor, caret, LineRange(line, line), "s", "//~/", Script(listOf()))) { | ||||
|         result = false | ||||
|       } | ||||
|     } | ||||
|     return result | ||||
|   } | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.action.DuplicableOperatorAction | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
|  | ||||
| class ChangeMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.MOTION | ||||
|  | ||||
|   override val duplicateWith: Char = 'c' | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return argument != null && VimPlugin.getChange().changeMotion( | ||||
|       editor, | ||||
|       caret, | ||||
|       context, | ||||
|       argument, | ||||
|       operatorArguments | ||||
|     ) | ||||
|   } | ||||
| } | ||||
| @@ -1,45 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| class ChangeReplaceAction : ChangeEditorActionHandler.SingleExecution() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_MULTIKEY_UNDO) | ||||
|  | ||||
|   override fun execute( | ||||
|     editor: Editor, | ||||
|     context: DataContext, | ||||
|     argument: Argument?, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     VimPlugin.getChange().changeReplace(editor, context) | ||||
|     return true | ||||
|   } | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeVisualAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_MULTIKEY_UNDO, CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     return VimPlugin.getChange().changeRange( | ||||
|       editor, | ||||
|       caret, | ||||
|       range.toVimTextRange(false), | ||||
|       range.type, | ||||
|       context | ||||
|     ) | ||||
|   } | ||||
| } | ||||
| @@ -1,55 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Argument | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeVisualCharacterAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val argumentType: Argument.Type = Argument.Type.DIGRAPH | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_ALLOW_DIGRAPH, CommandFlags.FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     val argument = cmd.argument | ||||
|     return argument != null && | ||||
|       VimPlugin.getChange().changeCharacterRange(editor, range.toVimTextRange(false), argument.character) | ||||
|   } | ||||
| } | ||||
| @@ -1,70 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_EXIT_VISUAL | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_MOT_LINEWISE | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_MULTIKEY_UNDO | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.command.SelectionType | ||||
| import com.maddyhome.idea.vim.common.TextRange | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import com.maddyhome.idea.vim.helper.fileSize | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeVisualLinesAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(FLAG_MOT_LINEWISE, FLAG_MULTIKEY_UNDO, FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     val textRange = range.toVimTextRange(true) | ||||
|     val lineEndForOffset = EditorHelper.getLineEndForOffset(editor, textRange.endOffset) | ||||
|     val endsWithNewLine = if (lineEndForOffset == editor.fileSize) 0 else 1 | ||||
|     val lineRange = TextRange( | ||||
|       EditorHelper.getLineStartForOffset(editor, textRange.startOffset), | ||||
|       lineEndForOffset + endsWithNewLine | ||||
|     ) | ||||
|     return VimPlugin.getChange().changeRange( | ||||
|       editor, | ||||
|       caret, | ||||
|       lineRange, | ||||
|       SelectionType.LINE_WISE, | ||||
|       context | ||||
|     ) | ||||
|   } | ||||
| } | ||||
| @@ -1,76 +0,0 @@ | ||||
| /* | ||||
|  * 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.action.change.change | ||||
|  | ||||
| import com.intellij.openapi.actionSystem.DataContext | ||||
| import com.intellij.openapi.editor.Caret | ||||
| import com.intellij.openapi.editor.Editor | ||||
| import com.maddyhome.idea.vim.VimPlugin | ||||
| import com.maddyhome.idea.vim.command.Command | ||||
| import com.maddyhome.idea.vim.command.CommandFlags | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_EXIT_VISUAL | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_MOT_LINEWISE | ||||
| import com.maddyhome.idea.vim.command.CommandFlags.FLAG_MULTIKEY_UNDO | ||||
| import com.maddyhome.idea.vim.command.OperatorArguments | ||||
| import com.maddyhome.idea.vim.command.SelectionType | ||||
| import com.maddyhome.idea.vim.common.TextRange | ||||
| import com.maddyhome.idea.vim.group.visual.VimSelection | ||||
| import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler | ||||
| import com.maddyhome.idea.vim.helper.EditorHelper | ||||
| import com.maddyhome.idea.vim.helper.enumSetOf | ||||
| import com.maddyhome.idea.vim.helper.fileSize | ||||
| import java.util.* | ||||
|  | ||||
| /** | ||||
|  * @author vlan | ||||
|  */ | ||||
| class ChangeVisualLinesEndAction : VisualOperatorActionHandler.ForEachCaret() { | ||||
|   override val type: Command.Type = Command.Type.CHANGE | ||||
|  | ||||
|   override val flags: EnumSet<CommandFlags> = enumSetOf(FLAG_MOT_LINEWISE, FLAG_MULTIKEY_UNDO, FLAG_EXIT_VISUAL) | ||||
|  | ||||
|   override fun executeAction( | ||||
|     editor: Editor, | ||||
|     caret: Caret, | ||||
|     context: DataContext, | ||||
|     cmd: Command, | ||||
|     range: VimSelection, | ||||
|     operatorArguments: OperatorArguments, | ||||
|   ): Boolean { | ||||
|     val vimTextRange = range.toVimTextRange(true) | ||||
|     return if (range.type == SelectionType.BLOCK_WISE && vimTextRange.isMultiple) { | ||||
|       val starts = vimTextRange.startOffsets | ||||
|       val ends = vimTextRange.endOffsets | ||||
|       for (i in starts.indices) { | ||||
|         if (ends[i] > starts[i]) { | ||||
|           ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]) | ||||
|         } | ||||
|       } | ||||
|       val blockRange = TextRange(starts, ends) | ||||
|       VimPlugin.getChange().changeRange(editor, caret, blockRange, SelectionType.BLOCK_WISE, context) | ||||
|     } else { | ||||
|       val lineEndForOffset = EditorHelper.getLineEndForOffset(editor, vimTextRange.endOffset) | ||||
|       val endsWithNewLine = if (lineEndForOffset == editor.fileSize) 0 else 1 | ||||
|       val lineRange = TextRange( | ||||
|         EditorHelper.getLineStartForOffset(editor, vimTextRange.startOffset), | ||||
|         lineEndForOffset + endsWithNewLine | ||||
|       ) | ||||
|       VimPlugin.getChange().changeRange(editor, caret, lineRange, SelectionType.LINE_WISE, context) | ||||
|     } | ||||
|   } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user