Compare commits
1602 Commits
0.64.2-EAP
...
customized
Author | SHA1 | Date | |
---|---|---|---|
9f469d0eb2
|
|||
f59d2f769c
|
|||
dc00b59733
|
|||
bc20e6af9c
|
|||
c40f07714a
|
|||
fa68842c2d
|
|||
eca9258607
|
|||
46fb030977
|
|||
![]() |
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 | ||
![]() |
cf85e0f25e | ||
![]() |
a4b52be833 | ||
![]() |
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 | ||
![]() |
8927c0acfa | ||
![]() |
02dfac8a34 | ||
![]() |
8ab3664992 | ||
![]() |
03e6101747 | ||
![]() |
9f47995c10 | ||
![]() |
d58f36ea1a | ||
![]() |
442970a986 | ||
![]() |
fcc6c8a3c5 | ||
![]() |
1dbd4b4391 | ||
![]() |
1943c72c1c | ||
![]() |
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 | ||
![]() |
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 | ||
![]() |
3637022890 | ||
![]() |
5f3a78e7ce | ||
![]() |
c7872ad841 | ||
![]() |
9eeab756e4 | ||
![]() |
ef971a1236 | ||
![]() |
5ec851a120 | ||
![]() |
2a94ff2ef6 | ||
![]() |
1738892500 | ||
![]() |
765d876a51 | ||
![]() |
a0c8e26b38 | ||
![]() |
4b4f4b3d8f | ||
![]() |
63fe7a88eb | ||
![]() |
871ee1a6b6 | ||
![]() |
6a36599a29 | ||
![]() |
d11ab20617 | ||
![]() |
ea713edfb5 | ||
![]() |
ff48a9dea2 | ||
![]() |
0a1812ec8c | ||
![]() |
113d4ac078 | ||
![]() |
4d49385529 | ||
![]() |
94a8455267 | ||
![]() |
406d2a054c | ||
![]() |
932296afb6 | ||
![]() |
27fb36a6c5 | ||
![]() |
f5e0f21869 | ||
![]() |
180c35d5c2 | ||
![]() |
4bd25f3220 | ||
![]() |
1299f107dd | ||
![]() |
43ae40e077 | ||
![]() |
1af0b00892 | ||
![]() |
36f7219964 | ||
![]() |
529ad853ee | ||
![]() |
4e37ccfff8 | ||
![]() |
134c68c705 | ||
![]() |
ea61e87b31 | ||
![]() |
6e82008ffa | ||
![]() |
016bcc00d8 | ||
![]() |
936e7508e3 | ||
![]() |
34220ab759 | ||
![]() |
51ba63faae | ||
![]() |
f4f1e397cb | ||
![]() |
721117ce1b | ||
![]() |
b6128418be | ||
![]() |
2da917add7 | ||
![]() |
678c53dc39 | ||
![]() |
d57359b2ff | ||
![]() |
3796d9f8b4 | ||
b6d84e0e66 | |||
![]() |
3dbdbefc58 | ||
![]() |
23570c7270 | ||
![]() |
4d5024f8b8 | ||
![]() |
ea8670702a | ||
![]() |
b8828f48c9 | ||
![]() |
b468fef242 | ||
![]() |
358f8eeca3 | ||
![]() |
150a70e69f | ||
![]() |
b9fb0f2bcd | ||
![]() |
d4a8b8e400 | ||
![]() |
8009c9a5f9 | ||
![]() |
177115e2fc | ||
![]() |
85bc12df59 | ||
![]() |
1da818b0d5 | ||
![]() |
c23d3f1442 | ||
![]() |
6500ce9154 | ||
![]() |
63ecaff1bc | ||
![]() |
e29c268d0b | ||
![]() |
2758e89a51 | ||
![]() |
d0670d0244 | ||
![]() |
1e2005451c | ||
![]() |
29a95ca592 | ||
![]() |
5bfff2a398 | ||
![]() |
4d26947208 | ||
![]() |
f1de741bd5 | ||
![]() |
3394d93b43 | ||
![]() |
02c64feff8 | ||
![]() |
f2ba162359 | ||
![]() |
16c5d11ead | ||
![]() |
3e97c5d5fc | ||
![]() |
cb5499f82f | ||
![]() |
3d71c1bcbe | ||
![]() |
a12793e67a | ||
![]() |
affec9bb61 | ||
![]() |
fb62ec4c77 | ||
![]() |
c48cf1a2f7 | ||
![]() |
cf5cc92258 | ||
![]() |
ca934fe514 | ||
![]() |
d6ca75006a | ||
![]() |
51a9878363 | ||
![]() |
7664c44697 | ||
![]() |
5a8ee72622 | ||
![]() |
492b2de520 | ||
![]() |
900d3212a4 | ||
![]() |
d8997e1239 | ||
![]() |
e1001534e4 | ||
![]() |
59a69ed486 | ||
![]() |
437574328e | ||
![]() |
87af7ada40 | ||
![]() |
aa01730c13 | ||
![]() |
0803b401e7 | ||
![]() |
6d974d799b | ||
![]() |
1fa779b21f | ||
![]() |
2c5442c044 | ||
![]() |
db4324c478 | ||
![]() |
a8afca4ccf | ||
![]() |
6849bab741 | ||
![]() |
ff72f24433 | ||
![]() |
19ea1b204c | ||
![]() |
a9e8dc7b9f | ||
![]() |
ee14eac009 | ||
![]() |
3c1bbd5a7f | ||
![]() |
218cfaca44 | ||
![]() |
8a78d76a20 | ||
![]() |
1ead9f1443 | ||
![]() |
c53dd48437 | ||
![]() |
001a1d648c | ||
![]() |
6bbd162c72 | ||
![]() |
8fb8476994 | ||
![]() |
8d7a2faf1b | ||
![]() |
df946f8525 | ||
![]() |
58f8c315e6 | ||
![]() |
c6a379048e | ||
![]() |
02dd52ccb9 | ||
![]() |
abb93af3fb | ||
![]() |
06b18b8fb9 | ||
![]() |
88772a0d8e | ||
![]() |
89c2bf0932 | ||
![]() |
9a0e6336b7 | ||
![]() |
550a754fab | ||
![]() |
5921f7f889 | ||
![]() |
e097880e95 | ||
![]() |
99a0dc6c53 | ||
![]() |
ef7e4a752d | ||
![]() |
cded8e54fb | ||
![]() |
f17a903555 | ||
![]() |
191aba1f95 | ||
![]() |
e8d7a7f8bf | ||
![]() |
836c1084c4 | ||
![]() |
649bfdc220 | ||
![]() |
8d6529ccf1 | ||
![]() |
c936692403 | ||
![]() |
c3d3f2ab50 | ||
![]() |
f289b19310 | ||
![]() |
9866231129 | ||
![]() |
e0b5b54dda | ||
![]() |
2687ecc02e | ||
![]() |
3699920515 | ||
![]() |
4481da75b7 | ||
![]() |
037b636be9 | ||
![]() |
12ded24cd4 | ||
![]() |
2b5c13e3da | ||
![]() |
043f07190c | ||
![]() |
dc0758274e | ||
![]() |
0d9aa85a6a | ||
![]() |
810440abe7 | ||
![]() |
177aaebaf8 | ||
![]() |
ba11c565d8 | ||
![]() |
5320d3a4fd | ||
![]() |
82f181b80b | ||
![]() |
eb43fa7c4c | ||
![]() |
86c0357725 | ||
![]() |
844dac6106 | ||
![]() |
0a923e98ab | ||
![]() |
a85a5bd055 | ||
![]() |
ca51798445 | ||
![]() |
73146ea643 | ||
![]() |
f186f4aa5c | ||
![]() |
a4d89af418 | ||
![]() |
4eb755fed6 | ||
![]() |
95837605b8 | ||
![]() |
3f4bf3f6fd | ||
![]() |
adb71068e3 | ||
![]() |
68f898dbf8 | ||
![]() |
296b714282 | ||
![]() |
d88f38cf2a | ||
![]() |
a8098c2c4c | ||
![]() |
1eb91889d4 | ||
![]() |
ac451d0fcd | ||
![]() |
5d7e0a1260 | ||
![]() |
8344207608 | ||
![]() |
cc45168e25 | ||
![]() |
81c898dd9e | ||
![]() |
87aa50c7be | ||
![]() |
a080047632 | ||
![]() |
bb4b3dfe61 | ||
![]() |
55aaa6e2c6 | ||
![]() |
1fc866eeee | ||
![]() |
15e0692b41 | ||
![]() |
6db42dc736 | ||
![]() |
c1d86a4238 | ||
![]() |
ec761dbe3d | ||
![]() |
1328a314de | ||
![]() |
06b0a1292f | ||
![]() |
11a16a54fc | ||
![]() |
548cbb4bda | ||
637ae21089 | |||
![]() |
6febc4d2fc | ||
![]() |
8253db1486 | ||
![]() |
8fe1b0891b | ||
![]() |
ff1d7f7f1c | ||
![]() |
c437a18288 | ||
![]() |
0992c39132 | ||
![]() |
610f978c44 | ||
![]() |
84ea9266c2 | ||
![]() |
54abaebe17 | ||
![]() |
a16c860ba8 | ||
![]() |
b1b7e3439f | ||
![]() |
1df75fe25c | ||
![]() |
4d0e0b8ef8 | ||
![]() |
36002def70 | ||
![]() |
8247ac54a1 | ||
![]() |
f4fe80b28a | ||
![]() |
9e052d6e3a | ||
![]() |
0da18b81b6 | ||
![]() |
fc81c6329b | ||
![]() |
3d92b989ce | ||
![]() |
b942e8a950 | ||
![]() |
29131b4644 | ||
![]() |
b897b118ca | ||
![]() |
145af2b6ee | ||
![]() |
09a38a854c | ||
![]() |
995779a294 | ||
![]() |
67f38fc646 | ||
![]() |
316f1fa925 | ||
![]() |
21f5ad6c0a | ||
![]() |
6e6e52f316 | ||
![]() |
71c19b3ef2 | ||
![]() |
0befc6385d | ||
![]() |
22371b4b07 | ||
![]() |
913d711b80 | ||
![]() |
d17d12c805 | ||
![]() |
4d64109e2c | ||
![]() |
d66d807cff | ||
![]() |
e7a68f06b3 | ||
![]() |
fd49e86e17 | ||
![]() |
337621ca4a | ||
![]() |
0e38a4e4f0 | ||
![]() |
c19a160c9c | ||
![]() |
c390e06e63 | ||
![]() |
00d6a948d0 | ||
![]() |
6f1c2a1a81 | ||
![]() |
47ba907eb7 | ||
![]() |
a14252493f | ||
![]() |
328c4288c2 | ||
![]() |
b7c11ff852 | ||
![]() |
add1d6225d | ||
![]() |
182424ba05 | ||
![]() |
bf86cd2a51 | ||
![]() |
2085e9cafd | ||
![]() |
fb51236ae2 | ||
![]() |
9509b5825c | ||
![]() |
b8a8acdad7 | ||
![]() |
898e5f8bda | ||
![]() |
30a39497aa | ||
![]() |
852a220076 | ||
![]() |
a34d56b7df | ||
![]() |
13feaa7581 | ||
![]() |
14df9ea705 | ||
![]() |
6bd2bb884a | ||
![]() |
89cdaa611a | ||
![]() |
cc476a26b4 | ||
![]() |
14d132638d | ||
![]() |
9e62636059 | ||
![]() |
a3b2b4920a | ||
![]() |
e7f128ee59 | ||
![]() |
e1069c265e | ||
![]() |
e0b356c12d | ||
![]() |
769d900383 | ||
![]() |
8d99100601 | ||
![]() |
0c1c8080a6 | ||
![]() |
1742541b03 | ||
![]() |
d66e6967ee | ||
![]() |
559879301d | ||
![]() |
c524c92062 | ||
![]() |
b329329333 | ||
![]() |
5df8ef98a1 | ||
![]() |
55154b2996 | ||
![]() |
89aa6aecff | ||
![]() |
970456e6b0 | ||
![]() |
97effae8dc | ||
![]() |
f26755045d | ||
![]() |
067af8356c | ||
![]() |
ee743674c2 | ||
![]() |
362f8a3c99 | ||
![]() |
9f0ecd7f73 | ||
![]() |
d01f582646 | ||
![]() |
cdc8f159f5 | ||
![]() |
b481b6e1b5 | ||
![]() |
505aeff544 | ||
![]() |
dbf0444110 | ||
![]() |
07d753f413 | ||
![]() |
f516e89a5f | ||
![]() |
5f15bca561 | ||
![]() |
d98acd8c39 | ||
![]() |
97502a5bd5 | ||
![]() |
806184aa5d | ||
![]() |
d93fb1fdfc | ||
![]() |
9cf922ae80 | ||
![]() |
2070efc35a | ||
![]() |
1dc4dbf7af | ||
![]() |
c10634f1e3 | ||
![]() |
c0f8fd8c6b | ||
![]() |
95f89792d4 | ||
![]() |
a299abf18f | ||
![]() |
0cc15390a4 | ||
![]() |
379b23b42d | ||
![]() |
160b1b240a | ||
![]() |
5af69377e5 | ||
![]() |
bcee0a5964 | ||
![]() |
804128c3d3 | ||
![]() |
4e3ee024ac | ||
![]() |
c300fdbfb1 | ||
![]() |
840ff11335 | ||
![]() |
8d76b51683 | ||
![]() |
a78bb51831 | ||
![]() |
db19d0819e | ||
![]() |
72b76221f7 | ||
![]() |
9eb32034b7 | ||
![]() |
24f88b5ffe | ||
![]() |
d27ebad011 | ||
![]() |
1cebd8551b | ||
![]() |
446d5aeb15 | ||
![]() |
58f8ce605d | ||
![]() |
3fae2fdae5 | ||
![]() |
c268407ce3 | ||
![]() |
cd435c5f41 | ||
![]() |
74b0e3bded | ||
![]() |
edc0a14ef1 | ||
![]() |
011be78b27 | ||
![]() |
58008e6758 | ||
![]() |
ae21727c12 | ||
![]() |
a480372d3d | ||
![]() |
0bc298014d | ||
![]() |
63f85a8099 | ||
![]() |
cc16d5ba15 | ||
![]() |
fa3afe188e | ||
![]() |
6df2db86c3 | ||
![]() |
7791de490d | ||
![]() |
754a8c7250 | ||
![]() |
88b0f31590 | ||
![]() |
b17dbb37e4 | ||
![]() |
4ec360219a | ||
![]() |
b4d4da7250 | ||
![]() |
8bf809a888 | ||
![]() |
90e0cee86c | ||
![]() |
5b571362e3 | ||
![]() |
9537003a6d | ||
![]() |
bdc50283d2 | ||
![]() |
85c8968d75 | ||
![]() |
1466ad9bef | ||
![]() |
0cda2241ed | ||
![]() |
3ac96d9ed4 | ||
![]() |
9f7b6a281b | ||
![]() |
96bd5f8259 | ||
![]() |
62917c2a50 | ||
![]() |
10ea780cdc | ||
![]() |
19561bb1f1 | ||
![]() |
8088789f51 | ||
![]() |
5dec91caa3 | ||
![]() |
0c28a9a79b | ||
![]() |
8c2b715f93 | ||
![]() |
0fe75031a9 | ||
![]() |
0ec01f8d6f | ||
![]() |
fbcb3f8cbc | ||
![]() |
3f6a454052 | ||
![]() |
088fda12f8 | ||
![]() |
b207b30108 | ||
![]() |
f12b67088f | ||
![]() |
2643daf0b2 | ||
![]() |
21188dad73 | ||
![]() |
0476854d7c | ||
![]() |
b9ab4f6484 | ||
![]() |
759d92db4d | ||
![]() |
263fea1c52 | ||
![]() |
949e9216ff | ||
![]() |
547835f59d | ||
![]() |
464ed17741 | ||
![]() |
1ca8b06d74 | ||
![]() |
5312549db1 | ||
![]() |
21a8a0467f | ||
![]() |
c5dfd43e48 | ||
![]() |
879bc9bd98 | ||
![]() |
5a484c3952 | ||
![]() |
a1dd917227 | ||
![]() |
6186fa7e1b | ||
![]() |
2c227955c7 | ||
![]() |
1ac50714f5 | ||
![]() |
fd1d6a98f1 | ||
![]() |
43b5e7e644 | ||
![]() |
13ab68e5b1 | ||
![]() |
165caab526 | ||
![]() |
187e5a752a | ||
![]() |
dc81568c45 | ||
![]() |
9fe9d92e04 | ||
![]() |
1e550ac0a3 | ||
![]() |
1190209409 | ||
![]() |
c7cc6b54bf | ||
![]() |
c1afce2939 | ||
![]() |
aa40c04302 | ||
![]() |
bddf07efee | ||
![]() |
c8a45cb085 | ||
![]() |
f6720b3d37 | ||
![]() |
dc8f5e9b25 | ||
![]() |
8a2d3e1aed | ||
![]() |
afeaf4444b | ||
![]() |
f69a284b3f | ||
![]() |
9f1bb44824 | ||
![]() |
037a29551c | ||
![]() |
b4ea970c29 | ||
![]() |
719b80baa1 | ||
![]() |
f6002f05e0 | ||
![]() |
0867654347 | ||
![]() |
687a6d8693 | ||
![]() |
6fc362cae2 | ||
![]() |
5d03bae931 | ||
![]() |
408e51535d | ||
![]() |
d4749f4eb8 | ||
![]() |
829501c1b1 | ||
![]() |
88ef5a3467 | ||
![]() |
e52948efcc | ||
![]() |
56466f889b | ||
![]() |
5ecfab65fa | ||
![]() |
98fc65ec43 | ||
![]() |
3e37e2cdc4 | ||
![]() |
2efb08197f | ||
![]() |
dd7cb72a25 | ||
![]() |
b73fc88313 | ||
![]() |
465db2cd22 | ||
![]() |
73c1dc8118 | ||
![]() |
509a202f93 | ||
![]() |
09a9884b9f | ||
![]() |
6afc5aa98e | ||
![]() |
9e497fb5e8 | ||
![]() |
16476256c3 | ||
![]() |
623430359a | ||
![]() |
6ab53802df | ||
![]() |
d5f877b83d | ||
![]() |
0b33702712 | ||
![]() |
10fce45248 | ||
![]() |
b39e5ba1d5 | ||
![]() |
700df030f0 | ||
![]() |
a44fe15fea | ||
![]() |
12d1553f5a | ||
![]() |
503c2580d7 | ||
![]() |
8ab9509ceb | ||
![]() |
197eded6d0 | ||
![]() |
1813ad400a | ||
![]() |
a1b048a2f9 | ||
![]() |
cb43ad3488 | ||
![]() |
e8daf67276 | ||
![]() |
00ef191ad0 | ||
![]() |
e8d559f6d0 | ||
![]() |
82ed892166 | ||
![]() |
45bd4a72a4 | ||
![]() |
7196d83833 | ||
![]() |
2b7c311a2b | ||
![]() |
7ef4e45945 | ||
![]() |
db08ea1587 | ||
![]() |
af3227684b | ||
![]() |
46788cc6c6 | ||
![]() |
70a45f3dc8 | ||
![]() |
d63e3dadbc | ||
![]() |
93109f1e19 | ||
![]() |
c4e74ee8a5 | ||
![]() |
534fbe1a6b | ||
![]() |
e9f0c032a4 | ||
![]() |
293307e63d | ||
![]() |
2701522605 | ||
![]() |
98666855ad | ||
![]() |
adca9cf292 | ||
![]() |
fc20acd8cb | ||
![]() |
6744e86b62 | ||
![]() |
5ad202f482 | ||
![]() |
80edb3b8f2 | ||
![]() |
3bc8c80422 | ||
![]() |
4ac19ef8da | ||
![]() |
797bce2eac | ||
![]() |
807e80780d | ||
![]() |
a58ca80fc9 | ||
![]() |
4158bf1663 | ||
![]() |
cd0c594efb | ||
![]() |
648d4d961d | ||
![]() |
9bca6f77d6 | ||
![]() |
c33718c39d | ||
![]() |
19b51a4a69 | ||
![]() |
f9e5bc43c6 | ||
![]() |
42383948b7 | ||
![]() |
5f8a1723ba | ||
![]() |
b8086cb509 | ||
![]() |
e2cd0d1246 | ||
![]() |
9fbb9ac957 | ||
![]() |
f64439dab9 | ||
![]() |
fe423d0b46 | ||
![]() |
5018b0e9ff | ||
![]() |
8b0a650631 | ||
![]() |
81076d9c43 | ||
![]() |
b610af30ab | ||
![]() |
bbc10cd3db | ||
![]() |
6690139c66 | ||
![]() |
df9d5bfe25 | ||
![]() |
4a0dd31b2c | ||
![]() |
afbfacb462 | ||
![]() |
5d68e76b30 | ||
![]() |
246cc1479a | ||
![]() |
408cd0e037 | ||
![]() |
43884c791f | ||
![]() |
c15eccf49a | ||
![]() |
ddb159eec8 | ||
![]() |
af8edae1d3 | ||
![]() |
91585e1059 | ||
![]() |
d6a99d4354 | ||
![]() |
0d840b2c41 | ||
![]() |
0288a0f2b5 | ||
![]() |
fe7dc4902b | ||
![]() |
1caf380505 | ||
![]() |
628ce16e99 | ||
![]() |
f822b04a6f | ||
![]() |
a61747cd94 | ||
![]() |
86c97f5566 | ||
![]() |
31e633f55e | ||
![]() |
e3aa3e24f5 | ||
![]() |
b7396fdf8c | ||
![]() |
e8f0e31a27 | ||
![]() |
d759c6bc24 | ||
![]() |
f76d0d2f81 | ||
![]() |
ec8b02e1c1 | ||
![]() |
c27ac06f1b | ||
![]() |
24f8f9ca14 | ||
![]() |
8b8bbba85d | ||
![]() |
64be75142e | ||
![]() |
f2070bad08 | ||
![]() |
52a3b680a6 | ||
![]() |
735bfbae3b | ||
![]() |
9140234b2c | ||
![]() |
cbf35c276e | ||
![]() |
ab1b8572f3 | ||
![]() |
960de8647c | ||
![]() |
acf80417d1 | ||
![]() |
43a3db178f | ||
![]() |
f05123123c | ||
![]() |
2f73dac57a | ||
![]() |
a6087dd08f | ||
![]() |
b4d40fae3b | ||
![]() |
ad19dc0100 | ||
![]() |
d19c776ec3 | ||
![]() |
ccd792bf62 | ||
![]() |
8a55199d62 | ||
![]() |
9cf0a1ac26 | ||
![]() |
43620c280d | ||
![]() |
98ffb3bf9e | ||
![]() |
4cc4fb4d3c | ||
![]() |
1f9718a3c1 | ||
![]() |
16d9a3ba8b | ||
![]() |
a01fc5d72c | ||
![]() |
f4e777b8df | ||
![]() |
e8b55881bd | ||
![]() |
232dd34717 | ||
![]() |
e244109073 | ||
![]() |
e6324a2182 | ||
![]() |
46bc66d08c | ||
![]() |
73fe85018e | ||
![]() |
982d6921cb | ||
![]() |
bb28b76a5b | ||
![]() |
67fed0da9e | ||
![]() |
e3cf50b4c9 | ||
![]() |
f72bb31b8e | ||
![]() |
001f13398c | ||
![]() |
dcfe93e4a1 | ||
![]() |
d3e7b5838f | ||
![]() |
8788d109e3 | ||
![]() |
8b1839ff1b | ||
![]() |
9f46e1960e | ||
![]() |
e93a619859 | ||
![]() |
287ba7055e | ||
![]() |
dfbec1f23a | ||
![]() |
55dedb4c4d | ||
![]() |
9c71b444c6 | ||
![]() |
e859b1c131 | ||
![]() |
6c4bd9cc10 | ||
![]() |
b50281f8d5 | ||
![]() |
2be0f5cedb | ||
![]() |
646a89d52a | ||
![]() |
fea71903de | ||
![]() |
0220d2b40f | ||
![]() |
c751c51b25 | ||
![]() |
8fedf78e03 | ||
![]() |
bd3c86e068 | ||
![]() |
46d459bd73 | ||
![]() |
d1feaad5a9 | ||
![]() |
b5b6c8f37a | ||
![]() |
067aaa798d | ||
![]() |
c85d7dcd7a | ||
![]() |
c1b1f1efd8 | ||
![]() |
68dcd21c4e | ||
![]() |
748484e129 | ||
![]() |
293e9988c7 | ||
![]() |
c390a295cd | ||
![]() |
bdf1f3c33d | ||
![]() |
a0b8685f7d | ||
![]() |
06fc25cf3b | ||
![]() |
18e76c5f12 | ||
![]() |
53e1bc5b83 | ||
![]() |
f3b77663f8 | ||
![]() |
fb25ea7cf9 | ||
![]() |
33dec9746a | ||
![]() |
079006e3ce | ||
![]() |
b32befe5df | ||
![]() |
91139005dc | ||
![]() |
9c53f8608a | ||
![]() |
7144491d0c | ||
![]() |
a9831ccf40 | ||
![]() |
fa3e18fe58 | ||
![]() |
08f29bacfd | ||
![]() |
5a6803551b | ||
![]() |
a5f612c85a | ||
![]() |
dab69249d0 | ||
![]() |
e1f0098164 | ||
![]() |
14428aaf49 | ||
![]() |
f9ebfcc467 | ||
![]() |
07446309d3 | ||
![]() |
d2de23481a | ||
![]() |
d8ead10c0f | ||
![]() |
6a38188602 | ||
![]() |
13884e9524 | ||
![]() |
1ff629e257 | ||
![]() |
67649a1746 | ||
![]() |
3a2f370c8c | ||
![]() |
6380608fa2 | ||
![]() |
4df53701a1 | ||
![]() |
3050b19366 | ||
![]() |
4c0a9b3797 | ||
![]() |
7850508cfe | ||
![]() |
dfbb36eb53 | ||
![]() |
e55fbe9159 | ||
![]() |
8a3af47b35 | ||
![]() |
11dc8cf982 | ||
![]() |
b91a3c16fc | ||
![]() |
abfe2bbe37 | ||
![]() |
f8bc330909 | ||
![]() |
999cf39aec | ||
![]() |
661a6563b0 | ||
![]() |
e33cf5b4ed | ||
![]() |
d401b6483c | ||
![]() |
5a855659b0 | ||
![]() |
e21e1b0b3d | ||
![]() |
232cb3ee7d | ||
![]() |
8bdefd85d4 | ||
![]() |
1719775ffc | ||
![]() |
86296e4066 | ||
![]() |
8c8c2ae271 | ||
![]() |
25f1674619 | ||
![]() |
29b3d6de3f | ||
![]() |
d6c76c9298 | ||
![]() |
b0168f46d7 | ||
![]() |
117990cd46 | ||
![]() |
6d238b382f | ||
![]() |
75fb384109 | ||
![]() |
e2a7a3686b | ||
![]() |
e29b42c4b1 | ||
![]() |
717806e821 | ||
![]() |
0a4f20b60c | ||
![]() |
90de8f3900 | ||
![]() |
09d4c727b1 | ||
![]() |
5a88c982cb | ||
![]() |
13a0e1d725 | ||
![]() |
7c06243d54 | ||
![]() |
ecd3b90300 | ||
![]() |
dc5a38ccba | ||
![]() |
406675f750 | ||
![]() |
a5e0572600 | ||
![]() |
3e5106525d | ||
![]() |
60b1e14e54 | ||
![]() |
31e667a421 | ||
![]() |
02428776a7 | ||
![]() |
7c1ab73f11 | ||
![]() |
8b5758fc37 | ||
![]() |
cb9eb8f67e | ||
![]() |
b496f13c3c | ||
![]() |
f21a0622b0 | ||
![]() |
5ddf8f2c34 | ||
![]() |
31655aace4 | ||
![]() |
32dca0799c | ||
![]() |
79cb90e642 | ||
![]() |
56bde906d9 | ||
![]() |
315af4cd5b | ||
![]() |
4abc72f05a | ||
![]() |
393aba90e9 | ||
![]() |
90624c03d2 | ||
![]() |
f75599805f | ||
![]() |
cc343fae9e | ||
![]() |
c22b299bed | ||
![]() |
28c806bfee | ||
![]() |
0bde71d4dd | ||
![]() |
aa51dcddc6 | ||
![]() |
8ca865e5aa | ||
![]() |
a9f1d2ac14 | ||
![]() |
018e5cba83 | ||
![]() |
bbcfee3ad6 | ||
![]() |
df52f37b69 | ||
![]() |
308ab4b4f5 | ||
![]() |
f07b6e28c1 | ||
![]() |
790fc92916 | ||
![]() |
bb5632c98d | ||
![]() |
879a73494b | ||
![]() |
93d80b8dfb | ||
![]() |
edf6a04a36 | ||
![]() |
b1662cdc1a | ||
![]() |
cec56e78bf | ||
![]() |
b0bfd0f56e | ||
![]() |
4312aceae7 | ||
![]() |
a646a59d8d | ||
![]() |
c9eafe1db3 | ||
![]() |
270ba9d196 | ||
![]() |
7300d252f8 | ||
![]() |
9b73cc16e6 | ||
![]() |
b7da57d6d1 | ||
![]() |
dee78cd503 | ||
![]() |
383e1d5245 | ||
![]() |
2ec9329f2e | ||
![]() |
15fc2c01bd | ||
![]() |
4fdd9b4710 | ||
![]() |
7765c464f3 | ||
![]() |
43eba0aa1d | ||
![]() |
e097cd2daa | ||
![]() |
ad6b5719d2 | ||
![]() |
5d344e3193 | ||
![]() |
0cd86282d2 | ||
![]() |
6b8d00decf | ||
![]() |
85aae4d408 | ||
![]() |
92b0a3abb2 | ||
![]() |
444a48f2a1 | ||
![]() |
039b44b07a | ||
![]() |
d7ed33c351 | ||
![]() |
0edff4665c | ||
![]() |
66b2fee823 | ||
![]() |
2139e31754 | ||
![]() |
3752d35229 | ||
![]() |
9a90e80da1 | ||
![]() |
5d3ec771c4 | ||
![]() |
6785d17ab3 | ||
![]() |
99a0415235 | ||
![]() |
0fe3f50d93 | ||
![]() |
06647a4cf6 | ||
![]() |
66b1e4a327 | ||
![]() |
a5e1a8116f | ||
![]() |
0bf77e1737 | ||
![]() |
038f0a5135 | ||
![]() |
e7d4dde9d9 | ||
![]() |
96dbbcff3e | ||
![]() |
1479742fe8 | ||
![]() |
45bebd898d | ||
![]() |
2f99cf81fc | ||
![]() |
0aa5450dc6 | ||
![]() |
5cdca0b7c1 | ||
![]() |
58ed857724 | ||
![]() |
66536a59a9 | ||
![]() |
35ab292c9f | ||
![]() |
341f1e915f | ||
![]() |
28da9da752 | ||
![]() |
6ce9330d3b | ||
![]() |
c251ee2d22 | ||
![]() |
cee5137603 | ||
![]() |
fd5c6d0024 | ||
![]() |
3d5a962332 | ||
![]() |
f096b290a7 | ||
![]() |
5a9281ece4 | ||
![]() |
b1367ec0a9 | ||
![]() |
e73d919ed7 | ||
![]() |
9bcb5e73ba | ||
![]() |
87f7510007 | ||
![]() |
814e3d8ee7 | ||
![]() |
d2cc6cca36 | ||
![]() |
ea5a95d536 | ||
![]() |
a845eb3942 | ||
![]() |
f87fb34943 | ||
![]() |
4dc9c1f433 | ||
![]() |
d885a63c7d | ||
![]() |
62833f2fa9 | ||
![]() |
e6ff69d6fc | ||
![]() |
176f840cb6 | ||
![]() |
76f06170ad | ||
![]() |
b6561cd940 | ||
![]() |
878d7070a4 | ||
![]() |
5f71198c88 | ||
![]() |
8d941913aa | ||
![]() |
599571e6ea | ||
![]() |
90709ef4d0 | ||
![]() |
378aa1026d | ||
![]() |
4fb1761fa5 | ||
![]() |
254193eb8c | ||
![]() |
d92e260ffd | ||
![]() |
8f5a5e4d57 | ||
![]() |
d0d9535d2f | ||
![]() |
df1409af76 | ||
![]() |
cfe34733e9 | ||
![]() |
e916cbe762 | ||
![]() |
a8a4142cef | ||
![]() |
3b3fffe838 | ||
![]() |
d32b8a1e71 | ||
![]() |
05e547edb5 | ||
![]() |
1b25430fe7 | ||
![]() |
278dc6880c | ||
![]() |
0bd1761077 | ||
![]() |
b1ae964ca3 | ||
![]() |
56cbb9e9af | ||
![]() |
70558574a8 | ||
![]() |
dab8375f5e | ||
![]() |
ccd9d05ac7 | ||
![]() |
69a045c144 | ||
![]() |
8f7b609c7c | ||
![]() |
0019dd6c7a | ||
![]() |
305a99afc8 | ||
![]() |
eec23d9640 | ||
![]() |
76f28ef94a | ||
![]() |
3b89d96553 | ||
![]() |
0fba78f885 | ||
![]() |
ee38944cf9 | ||
![]() |
c24cbcfbc0 | ||
![]() |
28c01f0a43 | ||
![]() |
182f671e35 | ||
![]() |
788495aac8 | ||
![]() |
7cbeb821f5 | ||
![]() |
36901194dc | ||
![]() |
58071007bd | ||
![]() |
07bafdf416 | ||
![]() |
f7bb5ec500 | ||
![]() |
b92114fec6 | ||
![]() |
fe9bb2a712 | ||
![]() |
81996f8051 | ||
![]() |
a0a976c345 | ||
![]() |
9315f36f16 | ||
![]() |
cdc03836d2 | ||
![]() |
a14e95ad6c | ||
![]() |
dd230f720f | ||
![]() |
fa781de76f | ||
![]() |
377e085aa0 | ||
![]() |
3642b32ed6 | ||
![]() |
8a6ecf005b | ||
![]() |
6866fdbdf5 | ||
![]() |
78bc4060b3 | ||
![]() |
16b901ea9e | ||
![]() |
26a3974477 | ||
![]() |
9a10d6fe6c | ||
![]() |
eb72def6d0 | ||
![]() |
3fe2a2e3b0 | ||
![]() |
d22d0f67b5 | ||
![]() |
e56e944309 | ||
![]() |
2d853d8d28 | ||
![]() |
e5d086dace | ||
![]() |
eccdd725b7 | ||
![]() |
284e0b4bf5 | ||
![]() |
47becb2721 | ||
![]() |
0b64e26235 | ||
![]() |
d90db8157c | ||
![]() |
11da530151 | ||
![]() |
c067c67e34 | ||
![]() |
89913ad4d7 | ||
![]() |
b73f34ad8c | ||
![]() |
17cf68d8a5 | ||
![]() |
5c1795ee03 | ||
![]() |
19a8480a88 | ||
![]() |
e0e80d2ea8 | ||
![]() |
adab2326ed | ||
![]() |
4ef629950d | ||
![]() |
39197df0c7 | ||
![]() |
1d3d6f0ea1 | ||
![]() |
9272ffa52c | ||
![]() |
187e5864ac | ||
![]() |
e0711248a0 | ||
![]() |
bbbcf0502e | ||
![]() |
0498fac291 | ||
![]() |
fa007148da | ||
![]() |
7e69e5704a | ||
![]() |
8579229797 | ||
![]() |
59d8f4c1cf | ||
![]() |
d05942ebe1 | ||
![]() |
1b9457bdff | ||
![]() |
05f2848d41 | ||
![]() |
ab3a28e50d | ||
![]() |
121daa81cc | ||
![]() |
17e1d75238 | ||
![]() |
597cdf4398 | ||
![]() |
215ca7806e | ||
![]() |
92f0d28d24 | ||
![]() |
d964a0c375 | ||
![]() |
332f04fdfe | ||
![]() |
291ea3bfb0 | ||
![]() |
51dbef9060 | ||
![]() |
d6f771f6c3 | ||
![]() |
d659ee2880 | ||
![]() |
7b37a5e611 | ||
![]() |
b99f2a23a8 | ||
![]() |
a54d8af051 | ||
![]() |
62a309cba6 | ||
![]() |
b7c0e4725d | ||
![]() |
53a21fb5fe | ||
![]() |
5802f7c2c5 | ||
![]() |
3c2640c90d | ||
![]() |
6f2ea9e893 | ||
![]() |
8b06bdfc29 | ||
![]() |
b6a5e60b68 | ||
![]() |
e16857457c | ||
![]() |
20663ec854 | ||
![]() |
f0166dd18f | ||
![]() |
5b8fe2393e | ||
![]() |
b08408c3c7 | ||
![]() |
060f8ece8a | ||
![]() |
eedc50b4fe | ||
![]() |
d7a636e4de | ||
![]() |
9e9319f117 | ||
![]() |
928162798f | ||
![]() |
b5b71a2dc6 | ||
![]() |
033b792b54 | ||
![]() |
7ab53edbbf | ||
![]() |
624c3bf223 | ||
![]() |
cf28312740 | ||
![]() |
a1e2beb1cf | ||
![]() |
4af9ab0bcb | ||
![]() |
8d3bde86e3 | ||
![]() |
7011a4fe07 | ||
![]() |
76f14fc4ba | ||
![]() |
923c0fee7a | ||
![]() |
b62680137e | ||
![]() |
cd5c4247a6 | ||
![]() |
d1e1692581 | ||
![]() |
82e39c9236 | ||
![]() |
1e69e98b92 |
@@ -1,102 +0,0 @@
|
||||
<?xml version="1.0" ?>
|
||||
<SmellBaseline>
|
||||
<ManuallySuppressedIssues>
|
||||
<ID>ComplexMethod:CmdHandler.kt$CmdHandler$private fun addAlias(cmd: ExCommand, editor: Editor?): Boolean</ID>
|
||||
<ID>ComplexMethod:CommandState.kt$CommandState$ fun toVimNotation(): String</ID>
|
||||
</ManuallySuppressedIssues>
|
||||
<CurrentIssues>
|
||||
<ID>ComplexCondition:CommandParser.kt$CommandParser$Character.isLetter(ch) || command.isEmpty() && "~<>@=#*&!".indexOf(ch) >= 0 || command.isNotEmpty() && ch == command[command.length - 1] && "<>".indexOf(ch) >= 0</ID>
|
||||
<ID>ComplexMethod:CommandParser.kt$CommandParser$ @kotlin.jvm.Throws(ExException::class) fun parse(cmd: String): ExCommand</ID>
|
||||
<ID>ComplexMethod:HistoryHandler.kt$HistoryHandler$override fun execute(editor: Editor, context: DataContext, cmd: ExCommand): Boolean</ID>
|
||||
<ID>ComplexMethod:NerdTree.kt$NerdTree$private fun registerCommands()</ID>
|
||||
<ID>ComplexMethod:OptionsManager.kt$OptionsManager$ fun parseOptionLine(editor: Editor?, args: String, failOnBad: Boolean): Boolean</ID>
|
||||
<ID>ComplexMethod:PutGroup.kt$PutGroup$private fun prepareDocumentAndGetStartOffsets( editor: Editor, caret: Caret, typeInRegister: SelectionType, data: PutData, additionalData: Map<String, Any> ): List<Int></ID>
|
||||
<ID>ComplexMethod:SearchHelperKt.kt$// bounds are considered inside corresponding quotes fun checkInString(chars: CharSequence, currentPos: Int, str: Boolean): Boolean</ID>
|
||||
<ID>ComplexMethod:SearchHighlightsHelper.kt$ private fun updateSearchHighlights( pattern: String?, shouldIgnoreSmartCase: Boolean, showHighlights: Boolean, initialOffset: Int, searchRange: LineRange?, forwards: Boolean, forceUpdate: Boolean ): Int</ID>
|
||||
<ID>ComplexMethod:TabCloseHandler.kt$TabCloseHandler$ private fun getTabIndexToClose(arg: String, current: Int, last: Int): Int?</ID>
|
||||
<ID>ComplexMethod:VimExchangeExtension.kt$VimExchangeExtension.Operator$private fun compareExchanges(x: Exchange, y: Exchange): ExchangeCompareResult</ID>
|
||||
<ID>ComplexMethod:VimMultipleCursorsExtension.kt$VimMultipleCursorsExtension.NextOccurrenceHandler$override fun executeInWriteAction(editor: Editor, context: DataContext)</ID>
|
||||
<ID>ComplexMethod:VimShortcutKeyAction.kt$VimShortcutKeyAction$private fun isEnabled(e: AnActionEvent): Boolean</ID>
|
||||
<ID>LongMethod:CmdHandler.kt$CmdHandler$private fun addAlias(cmd: ExCommand, editor: Editor?): Boolean</ID>
|
||||
<ID>LongMethod:CommandParser.kt$CommandParser$ @kotlin.jvm.Throws(ExException::class) fun parse(cmd: String): ExCommand</ID>
|
||||
<ID>LongMethod:HistoryHandler.kt$HistoryHandler$override fun execute(editor: Editor, context: DataContext, cmd: ExCommand): Boolean</ID>
|
||||
<ID>LongMethod:NerdTree.kt$NerdTree$private fun registerCommands()</ID>
|
||||
<ID>LongMethod:OptionsManager.kt$OptionsManager$ fun parseOptionLine(editor: Editor?, args: String, failOnBad: Boolean): Boolean</ID>
|
||||
<ID>LongMethod:PutGroup.kt$PutGroup$private fun prepareDocumentAndGetStartOffsets( editor: Editor, caret: Caret, typeInRegister: SelectionType, data: PutData, additionalData: Map<String, Any> ): List<Int></ID>
|
||||
<ID>LongMethod:VimMultipleCursorsExtension.kt$VimMultipleCursorsExtension.NextOccurrenceHandler$override fun executeInWriteAction(editor: Editor, context: DataContext)</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:NerdTree.kt$NerdTree$while (true) { row++ val nextPath = tree.getPathForRow(row) ?: break val pathCount = nextPath.pathCount if (pathCount == currentPathCount) expectedRow = row if (pathCount < currentPathCount) break }</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:SearchHighlightsHelper.kt$for (project in projectManager.openProjects) { val current = FileEditorManager.getInstance(project).selectedTextEditor ?: continue // [VERSION UPDATE] 202+ Use editors val editors = EditorFactory.getInstance().getEditors(current.document, project) ?: continue for (editor in editors) { // Try to keep existing highlights if possible. Update if hlsearch has changed or if the pattern has changed. // Force update for the situations where the text is the same, but the ignore case values have changed. // E.g. Use `*` to search for a word (which ignores smartcase), then use `/<Up>` to search for the same pattern, // which will match smartcase. Or changing the smartcase/ignorecase settings if (shouldRemoveSearchHighlights(editor, pattern, showHighlights) || forceUpdate) { removeSearchHighlights(editor) } if (pattern == null) continue if (shouldAddAllSearchHighlights(editor, pattern, showHighlights)) { // hlsearch (+ incsearch/noincsearch) val startLine = searchRange?.startLine ?: 0 val endLine = searchRange?.endLine ?: -1 val results = SearchHelper.findAll(editor, pattern, startLine, endLine, shouldIgnoreCase(pattern, shouldIgnoreSmartCase)) if (results.isNotEmpty()) { currentMatchOffset = findClosestMatch(editor, results, initialOffset, forwards) highlightSearchResults(editor, pattern, results, currentMatchOffset) } editor.vimLastSearch = pattern } else if (shouldAddCurrentMatchSearchHighlight(pattern, showHighlights, initialOffset)) { // nohlsearch + incsearch val searchOptions = EnumSet.of(SearchOptions.WHOLE_FILE) if (wrapscan.isSet) searchOptions.add(SearchOptions.WRAP) if (shouldIgnoreSmartCase) searchOptions.add(SearchOptions.IGNORE_SMARTCASE) if (!forwards) searchOptions.add(SearchOptions.BACKWARDS) val result = SearchHelper.findPattern(editor, pattern, initialOffset, 1, searchOptions) if (result != null) { currentMatchOffset = result.startOffset val results = listOf(result) highlightSearchResults(editor, pattern, results, currentMatchOffset) } } else if (shouldMaintainCurrentMatchOffset(pattern, initialOffset)) { // incsearch. If nothing has changed (e.g. we've edited offset values in `/foo/e+2`) make sure we return the // current match offset so the caret remains at the current incsarch match val offset = editor.vimIncsearchCurrentMatchOffset if (offset != null) { currentMatchOffset = offset } } } }</ID>
|
||||
<ID>MagicNumber:ActionListHandler.kt$ActionListHandler$50</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$0.9f</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$1.75f</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$10</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$3</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$5</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$6</ID>
|
||||
<ID>MagicNumber:AddBlockInlaysAction.kt$AddBlockInlaysAction$7</ID>
|
||||
<ID>MagicNumber:AddInlineInlaysAction.kt$AddInlineInlaysAction$10</ID>
|
||||
<ID>MagicNumber:AddInlineInlaysAction.kt$AddInlineInlaysAction$20</ID>
|
||||
<ID>MagicNumber:AddInlineInlaysAction.kt$AddInlineInlaysAction$5</ID>
|
||||
<ID>MagicNumber:AddInlineInlaysAction.kt$AddInlineInlaysAction$7</ID>
|
||||
<ID>MagicNumber:BufferListHandler.kt$3</ID>
|
||||
<ID>MagicNumber:CmdHandler.kt$CmdHandler$11</ID>
|
||||
<ID>MagicNumber:CmdHandler.kt$CmdHandler$12</ID>
|
||||
<ID>MagicNumber:CommandBuilder.kt$CommandBuilder$10</ID>
|
||||
<ID>MagicNumber:CommandBuilder.kt$CommandBuilder$999999999</ID>
|
||||
<ID>MagicNumber:CommandParser.kt$CommandParser$10</ID>
|
||||
<ID>MagicNumber:CommandParser.kt$CommandParser$3</ID>
|
||||
<ID>MagicNumber:ConfigurationMigrators.kt$Version 6 to 7 config migration$6</ID>
|
||||
<ID>MagicNumber:ConfigurationMigrators.kt$Version 6 to 7 config migration$7</ID>
|
||||
<ID>MagicNumber:ExKeyBindings.kt$ExKeyBindings$0x05</ID>
|
||||
<ID>MagicNumber:ExKeyBindings.kt$ExKeyBindings$0x08</ID>
|
||||
<ID>MagicNumber:HistoryHandler.kt$HistoryHandler$7</ID>
|
||||
<ID>MagicNumber:JumpsHandler.kt$JumpsHandler$200</ID>
|
||||
<ID>MagicNumber:JumpsHandler.kt$JumpsHandler$3</ID>
|
||||
<ID>MagicNumber:JumpsHandler.kt$JumpsHandler$5</ID>
|
||||
<ID>MagicNumber:MarksHandler.kt$MarksHandler$200</ID>
|
||||
<ID>MagicNumber:MarksHandler.kt$MarksHandler$3</ID>
|
||||
<ID>MagicNumber:MarksHandler.kt$MarksHandler$5</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$100</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$1000</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$19</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$20</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$3</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$50</ID>
|
||||
<ID>MagicNumber:OptionsManager.kt$OptionsManager$80</ID>
|
||||
<ID>MagicNumber:ProcessExEntryAction.kt$ProcessExEntryAction$0x0a</ID>
|
||||
<ID>MagicNumber:RegistersHandler.kt$RegistersHandler$200</ID>
|
||||
<ID>MagicNumber:SearchHelperKt.kt$3</ID>
|
||||
<ID>MagicNumber:SelectLastFileHandler.kt$SelectLastFileHandler$999</ID>
|
||||
<ID>MagicNumber:SelectionType.kt$SelectionType.BLOCK_WISE$3</ID>
|
||||
<ID>MagicNumber:ShiftLeftHandler.kt$ShiftLeftHandler$31</ID>
|
||||
<ID>MagicNumber:ShiftRightHandler.kt$ShiftRightHandler$31</ID>
|
||||
<ID>MagicNumber:VimHighlightedYank.kt$VimHighlightedYank.HighlightHandler$3</ID>
|
||||
<ID>MagicNumber:VimHighlightedYank.kt$VimHighlightedYank.HighlightHandler$4</ID>
|
||||
<ID>MatchingDeclarationName:CommandDefinition.kt$CommandName</ID>
|
||||
<ID>MaxLineLength:EditorDataContext.kt$EditorDataContext$class</ID>
|
||||
<ID>MaxLineLength:ExBeanClass.kt$ExBeanClass$logger<ExBeanClass>().error("IdeaVim doesn't accept contributions to `vimActions` extension points. Please create a plugin using `VimExtension`. Plugin to blame: ${this.pluginDescriptor.pluginId}")</ID>
|
||||
<ID>MaxLineLength:NotificationService.kt$NotificationService$notification.addAction(AppendToIdeaVimRcAction(notification, "set clipboard+=ideaput", "ideaput") { OptionsManager.clipboard.append(ClipboardOptionsData.ideaput) })</ID>
|
||||
<ID>MaxLineLength:NotificationService.kt$NotificationService.AppendToIdeaVimRcAction$private inner</ID>
|
||||
<ID>MaxLineLength:NotificationService.kt$NotificationService.AppendToIdeaVimRcAction$val successNotification = Notification(IDEAVIM_NOTIFICATION_ID, IDEAVIM_NOTIFICATION_TITLE, "<code>$optionName</code> is enabled", NotificationType.INFORMATION)</ID>
|
||||
<ID>MaxLineLength:OptionsManager.kt$OptionsManager$val clipboard = addOption(ListOption(ClipboardOptionsData.name, ClipboardOptionsData.abbr, arrayOf(ClipboardOptionsData.ideaput, "autoselect,exclude:cons\\|linux"), null))</ID>
|
||||
<ID>MaxLineLength:ReplaceWithRegister.kt$ReplaceWithRegister.Operator$val visualSelection = PutData.VisualSelection(mapOf(editor.caretModel.primaryCaret to VimSelection.create(range.startOffset, range.endOffset - 1, selectionType, editor)), selectionType)</ID>
|
||||
<ID>MaxLineLength:StatisticReporter.kt$StatisticReporter$val url = "https://plugins.jetbrains.com/plugins/list?pluginId=${VimPlugin.getPluginId().idString}&build=$buildNumber&pluginVersion=$version&os=$os&uuid=$uid"</ID>
|
||||
<ID>MemberNameEqualsClassName:Ranges.kt$Ranges$private val ranges: MutableList<Range> = mutableListOf()</ID>
|
||||
<ID>NestedBlockDepth:OptionsManager.kt$OptionsManager$ fun parseOptionLine(editor: Editor?, args: String, failOnBad: Boolean): Boolean</ID>
|
||||
<ID>ReturnCount:CmdHandler.kt$CmdHandler$private fun addAlias(cmd: ExCommand, editor: Editor?): Boolean</ID>
|
||||
<ID>ReturnCount:ExRanges.kt$Range.Companion$ @JvmStatic fun createRange(str: String, offset: Int, move: Boolean): Array<Range>?</ID>
|
||||
<ID>ReturnCount:VimMultipleCursorsExtension.kt$VimMultipleCursorsExtension.AllOccurrencesHandler$override fun executeInWriteAction(editor: Editor, context: DataContext)</ID>
|
||||
<ID>ReturnCount:VimMultipleCursorsExtension.kt$VimMultipleCursorsExtension.NextOccurrenceHandler$override fun executeInWriteAction(editor: Editor, context: DataContext)</ID>
|
||||
<ID>ReturnCount:VimShortcutKeyAction.kt$VimShortcutKeyAction$private fun isEnabled(e: AnActionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:VisualMotionGroup.kt$VisualMotionGroup$private fun seemsLikeBlockMode(editor: Editor): Boolean</ID>
|
||||
<ID>ThrowsCount:CommandHandler.kt$CommandHandler$private fun checkArgs(cmd: ExCommand)</ID>
|
||||
<ID>TooGenericExceptionThrown:CommandParser.kt$CommandParser$throw RuntimeException("Cannot create an ex command: $handlerHolder")</ID>
|
||||
<ID>TooManyFunctions:CommandBuilder.kt$CommandBuilder</ID>
|
||||
<ID>TooManyFunctions:CommandState.kt$CommandState</ID>
|
||||
<ID>TooManyFunctions:PutGroup.kt$PutGroup</ID>
|
||||
<ID>TooManyFunctions:Ranges.kt$Ranges</ID>
|
||||
<ID>TooManyFunctions:SearchHighlightsHelper.kt$com.maddyhome.idea.vim.helper.SearchHighlightsHelper.kt</ID>
|
||||
<ID>TooManyFunctions:VisualGroup.kt$com.maddyhome.idea.vim.group.visual.VisualGroup.kt</ID>
|
||||
<ID>TooManyFunctions:VisualMotionGroup.kt$VisualMotionGroup</ID>
|
||||
</CurrentIssues>
|
||||
</SmellBaseline>
|
@@ -1,31 +0,0 @@
|
||||
formatting:
|
||||
Indentation:
|
||||
indentSize: 2
|
||||
continuationIndentSize: 8
|
||||
ParameterListWrapping:
|
||||
indentSize: 8
|
||||
complexity:
|
||||
LongParameterList:
|
||||
functionThreshold: 12
|
||||
NestedBlockDepth:
|
||||
threshold: 6
|
||||
ComplexCondition:
|
||||
threshold: 6
|
||||
ComplexMethod:
|
||||
threshold: 20
|
||||
exceptions:
|
||||
TooGenericExceptionCaught:
|
||||
active: false
|
||||
naming:
|
||||
ClassNaming:
|
||||
excludes: "**/ConfigurationMigrators.kt, **/VersionDetectors.kt"
|
||||
performance:
|
||||
SpreadOperator:
|
||||
active: false
|
||||
style:
|
||||
ForbiddenComment:
|
||||
active: false
|
||||
MaxLineLength:
|
||||
maxLineLength: 160
|
||||
ReturnCount:
|
||||
max: 5
|
67
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '44 12 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'java' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
43
.github/workflows/mergePr.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
|
||||
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle
|
||||
|
||||
name: Update Changelog On PR
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
types: [ closed ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
if: github.event.pull_request.merged == true
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 50
|
||||
- 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: Update authors
|
||||
id: update_authors
|
||||
run: ./gradlew updateMergedPr -PprId=${{ github.event.number }}
|
||||
env:
|
||||
GITHUB_OAUTH: ${{ secrets.MERGE_PR }}
|
||||
|
||||
- name: Commit changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
branch: master
|
||||
commit_message: Update changelog after merging PR
|
||||
commit_user_name: Alex Plate
|
||||
commit_user_email: aleksei.plate@jetbrains.com
|
||||
commit_author: Alex Plate <aleksei.plate@jetbrains.com>
|
||||
file_pattern: CHANGES.md
|
40
.github/workflows/mergePrTest.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
|
||||
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle
|
||||
|
||||
name: Update Changelog On PR (Test)
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 50
|
||||
- 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: Update authors
|
||||
id: update_authors
|
||||
run: ./gradlew updateMergedPr -PprId=525
|
||||
env:
|
||||
GITHUB_OAUTH: ${{ secrets.MERGE_PR }}
|
||||
|
||||
# - name: Commit changes
|
||||
# uses: stefanzweifel/git-auto-commit-action@v4
|
||||
# with:
|
||||
# branch: master
|
||||
# commit_message: Update changelog after merging PR
|
||||
# commit_user_name: Alex Plate
|
||||
# commit_user_email: aleksei.plate@jetbrains.com
|
||||
# commit_author: Alex Plate <aleksei.plate@jetbrains.com>
|
||||
# file_pattern: CHANGES.md
|
77
.github/workflows/runUiTests.yml
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
name: Run UI Tests
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 12 * * *'
|
||||
jobs:
|
||||
build-for-ui-test-mac-os:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v2.1.0
|
||||
with:
|
||||
distribution: zulu
|
||||
java-version: 11
|
||||
- name: Setup FFmpeg
|
||||
uses: FedericoCarboni/setup-ffmpeg@v1
|
||||
with:
|
||||
# Not strictly necessary, but it may prevent rate limit
|
||||
# errors especially on GitHub-hosted macos machines.
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Build Plugin
|
||||
run: gradle :buildPlugin
|
||||
- name: Run Idea
|
||||
run: |
|
||||
mkdir -p build/reports
|
||||
gradle :runIdeForUiTests > build/reports/idea.log &
|
||||
- name: Wait for Idea started
|
||||
uses: jtalk/url-health-check-action@1.5
|
||||
with:
|
||||
url: http://127.0.0.1:8082
|
||||
max-attempts: 20
|
||||
retry-delay: 10s
|
||||
- name: Tests
|
||||
run: gradle :testUi
|
||||
- name: Move video
|
||||
if: ${{ failure() }}
|
||||
run: mv video build/reports
|
||||
- name: Save fails report
|
||||
if: ${{ failure() }}
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ui-test-fails-report-mac
|
||||
path: |
|
||||
build/reports
|
||||
# build-for-ui-test-linux:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - name: Setup Java
|
||||
# uses: actions/setup-java@v2.1.0
|
||||
# with:
|
||||
# distribution: zulu
|
||||
# java-version: 11
|
||||
# - name: Build Plugin
|
||||
# run: gradle :buildPlugin
|
||||
# - name: Run Idea
|
||||
# run: |
|
||||
# export DISPLAY=:99.0
|
||||
# Xvfb -ac :99 -screen 0 1920x1080x16 &
|
||||
# mkdir -p build/reports
|
||||
# gradle :runIdeForUiTests #> build/reports/idea.log
|
||||
# - name: Wait for Idea started
|
||||
# uses: jtalk/url-health-check-action@1.5
|
||||
# with:
|
||||
# url: http://127.0.0.1:8082
|
||||
# max-attempts: 15
|
||||
# retry-delay: 30s
|
||||
# - name: Tests
|
||||
# run: gradle :testUi
|
||||
# - name: Save fails report
|
||||
# if: ${{ failure() }}
|
||||
# uses: actions/upload-artifact@v2
|
||||
# with:
|
||||
# name: ui-test-fails-report-linux
|
||||
# path: |
|
||||
# ui-test-example/build/reports
|
49
.github/workflows/updateAuthors.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
|
||||
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle
|
||||
|
||||
name: Update Authors
|
||||
|
||||
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: 'updateAuthors.yml'
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Update authors
|
||||
id: update_authors
|
||||
run: ./gradlew updateAuthors --stacktrace
|
||||
env:
|
||||
SUCCESS_COMMIT: ${{ steps.last_successful_commit.outputs.commit_hash }}
|
||||
GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Commit changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
commit_message: Add ${{ steps.update_authors.outputs.authors }} to contributors list
|
||||
commit_user_name: Alex Plate
|
||||
commit_user_email: aleksei.plate@jetbrains.com
|
||||
commit_author: Alex Plate <aleksei.plate@jetbrains.com>
|
||||
file_pattern: AUTHORS.md
|
47
.github/workflows/updateChangelog.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
|
||||
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle
|
||||
|
||||
name: Update Changelog
|
||||
|
||||
on:
|
||||
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: '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
|
||||
with:
|
||||
commit_message: Update changelog
|
||||
commit_user_name: Alex Plate
|
||||
commit_user_email: aleksei.plate@jetbrains.com
|
||||
commit_author: Alex Plate <aleksei.plate@jetbrains.com>
|
||||
file_pattern: CHANGES.md
|
37
.github/workflows/updateFormatting.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
|
||||
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle
|
||||
|
||||
name: Update Formatting
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * 0'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 50
|
||||
- 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: Format files
|
||||
run: ./gradlew ktlintFormat
|
||||
|
||||
- name: Commit changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
commit_message: Update formatting
|
||||
commit_user_name: Alex Plate
|
||||
commit_user_email: aleksei.plate@jetbrains.com
|
||||
commit_author: Alex Plate <aleksei.plate@jetbrains.com>
|
13
.gitignore
vendored
@@ -8,13 +8,20 @@
|
||||
!/.idea/inspectionProfiles
|
||||
!/.idea/fileTemplates
|
||||
!/.idea/runConfigurations
|
||||
!/.idea/codeStyles
|
||||
|
||||
/build/
|
||||
/out/
|
||||
/tmp/
|
||||
**/build/
|
||||
**/out/
|
||||
**/tmp/
|
||||
|
||||
*.DS_Store
|
||||
|
||||
.teamcity/.idea
|
||||
.teamcity/target
|
||||
.teamcity/*.iml
|
||||
|
||||
# Generated by gradle task "generateGrammarSource"
|
||||
src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated
|
||||
|
||||
# Created by github automation
|
||||
settings.xml
|
||||
|
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
||||
[submodule "doc"]
|
||||
path = doc
|
||||
url = https://github.com/JetBrains/ideavim.wiki.git
|
196
.idea/codeStyles/Project.xml
generated
Normal file
@@ -0,0 +1,196 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<option name="AUTODETECT_INDENTS" value="false" />
|
||||
<option name="OTHER_INDENT_OPTIONS">
|
||||
<value>
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
</value>
|
||||
</option>
|
||||
<JavaCodeStyleSettings>
|
||||
<option name="FIELD_NAME_PREFIX" value="my" />
|
||||
<option name="STATIC_FIELD_NAME_PREFIX" value="our" />
|
||||
</JavaCodeStyleSettings>
|
||||
<JetCodeStyleSettings>
|
||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
||||
<option name="ALLOW_TRAILING_COMMA" value="true" />
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
</JetCodeStyleSettings>
|
||||
<ScalaCodeStyleSettings>
|
||||
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
|
||||
</ScalaCodeStyleSettings>
|
||||
<ADDITIONAL_INDENT_OPTIONS fileType="rb">
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
</ADDITIONAL_INDENT_OPTIONS>
|
||||
<codeStyleSettings language="CFML">
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||
<option name="WHILE_ON_NEW_LINE" value="true" />
|
||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
|
||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
|
||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
||||
<option name="METHOD_PARAMETERS_WRAP" value="5" />
|
||||
<option name="BINARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
|
||||
<option name="FOR_STATEMENT_WRAP" value="5" />
|
||||
<option name="ASSIGNMENT_WRAP" value="1" />
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="ECMA Script Level 4">
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||
<option name="WHILE_ON_NEW_LINE" value="true" />
|
||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
|
||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
|
||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
||||
<option name="METHOD_PARAMETERS_WRAP" value="5" />
|
||||
<option name="EXTENDS_LIST_WRAP" value="1" />
|
||||
<option name="EXTENDS_KEYWORD_WRAP" value="1" />
|
||||
<option name="BINARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
|
||||
<option name="FOR_STATEMENT_WRAP" value="5" />
|
||||
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
|
||||
<option name="ASSIGNMENT_WRAP" value="1" />
|
||||
<option name="IF_BRACE_FORCE" value="1" />
|
||||
<option name="DOWHILE_BRACE_FORCE" value="1" />
|
||||
<option name="WHILE_BRACE_FORCE" value="1" />
|
||||
<option name="FOR_BRACE_FORCE" value="1" />
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="GSP">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="Groovy">
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
|
||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_ASSIGNMENT" value="true" />
|
||||
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_THROWS_LIST" value="true" />
|
||||
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
|
||||
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
|
||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
||||
<option name="METHOD_PARAMETERS_WRAP" value="5" />
|
||||
<option name="EXTENDS_LIST_WRAP" value="1" />
|
||||
<option name="THROWS_LIST_WRAP" value="5" />
|
||||
<option name="EXTENDS_KEYWORD_WRAP" value="1" />
|
||||
<option name="THROWS_KEYWORD_WRAP" value="1" />
|
||||
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
|
||||
<option name="BINARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_WRAP" value="5" />
|
||||
<option name="FOR_STATEMENT_WRAP" value="5" />
|
||||
<option name="ASSIGNMENT_WRAP" value="1" />
|
||||
<option name="IF_BRACE_FORCE" value="1" />
|
||||
<option name="WHILE_BRACE_FORCE" value="1" />
|
||||
<option name="FOR_BRACE_FORCE" value="1" />
|
||||
<option name="FIELD_ANNOTATION_WRAP" value="0" />
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="HTML">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
<option name="TAB_SIZE" value="8" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="JAVA">
|
||||
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="false" />
|
||||
<option name="BLOCK_COMMENT_AT_FIRST_COLUMN" value="false" />
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||
<option name="WHILE_ON_NEW_LINE" value="true" />
|
||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
|
||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_ASSIGNMENT" value="true" />
|
||||
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_THROWS_LIST" value="true" />
|
||||
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="true" />
|
||||
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
|
||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
||||
<option name="METHOD_PARAMETERS_WRAP" value="5" />
|
||||
<option name="EXTENDS_LIST_WRAP" value="1" />
|
||||
<option name="THROWS_LIST_WRAP" value="5" />
|
||||
<option name="EXTENDS_KEYWORD_WRAP" value="1" />
|
||||
<option name="THROWS_KEYWORD_WRAP" value="1" />
|
||||
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
|
||||
<option name="BINARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
|
||||
<option name="FOR_STATEMENT_WRAP" value="5" />
|
||||
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
|
||||
<option name="ASSIGNMENT_WRAP" value="1" />
|
||||
<option name="IF_BRACE_FORCE" value="1" />
|
||||
<option name="DOWHILE_BRACE_FORCE" value="1" />
|
||||
<option name="WHILE_BRACE_FORCE" value="1" />
|
||||
<option name="FOR_BRACE_FORCE" value="1" />
|
||||
<option name="FIELD_ANNOTATION_WRAP" value="0" />
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
<option name="TAB_SIZE" value="8" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="JSON">
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="JSP">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
<option name="TAB_SIZE" value="8" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="JavaScript">
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||
<option name="WHILE_ON_NEW_LINE" value="true" />
|
||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
||||
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
|
||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
||||
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
|
||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
||||
<option name="METHOD_PARAMETERS_WRAP" value="5" />
|
||||
<option name="BINARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_WRAP" value="5" />
|
||||
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
|
||||
<option name="FOR_STATEMENT_WRAP" value="5" />
|
||||
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
|
||||
<option name="ASSIGNMENT_WRAP" value="1" />
|
||||
<option name="IF_BRACE_FORCE" value="1" />
|
||||
<option name="DOWHILE_BRACE_FORCE" value="1" />
|
||||
<option name="WHILE_BRACE_FORCE" value="1" />
|
||||
<option name="FOR_BRACE_FORCE" value="1" />
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="Python">
|
||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="PARENT_SETTINGS_INSTALLED" value="true" />
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="XML">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
<option name="TAB_SIZE" value="8" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="kotlin">
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</state>
|
||||
</component>
|
33
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -31,6 +31,39 @@
|
||||
</inspection_tool>
|
||||
<inspection_tool class="MoveVariableDeclarationIntoWhen" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="PluginXmlI18n" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="SSBasedInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<replaceConfiguration name="IdeaVim run for each caret" description="Please use IdeaVim version of `runForEachCaret` function" suppressId="ideavimRunForEachCaret" problemDescriptor="Replace with IdeaVim version" text="$editor$.caretModel.runForEachCaret { $expr$ }" recursive="false" caseInsensitive="false" type="Kotlin" pattern_context="default" reformatAccordingToStyle="true" shortenFQN="false" replacement="$editor$.vimForEachCaret { $expr$ }">
|
||||
<constraint name="__context__" within="" contains="" />
|
||||
<constraint name="editor" within="" contains="" />
|
||||
<constraint name="expr" minCount="0" maxCount="2147483647" within="" contains="" />
|
||||
</replaceConfiguration>
|
||||
<replaceConfiguration name="Use IdeaVim method instead of the fixture" uuid="0f74da52-7360-33ae-9b40-d771aa128de6" description="Use assertState and other functions instead of myFixture.checkResult. This function also preformes assertion in neovim" suppressId="IdeaVimAssertState" problemDescriptor="Use IdeaVim testing methods" text="$fixture$.$check$($data$)" recursive="false" caseInsensitive="false" type="Kotlin" pattern_context="default" reformatAccordingToStyle="true" shortenFQN="false" replacement="assertState($data$)">
|
||||
<constraint name="__context__" within="" contains="" />
|
||||
<constraint name="fixture" regexp="myFixture" nameOfExprType="CodeInsightTestFixture" within="" contains="" />
|
||||
<constraint name="check" regexp="checkResult" within="" contains="" />
|
||||
<constraint name="data" within="" contains="" />
|
||||
</replaceConfiguration>
|
||||
<replaceConfiguration name="Use IdeaVim method instead of the fixture" uuid="0f74da52-7360-33ae-9b40-d771aa128de6" text="$fixture$.$check$($fileName$, $text$)" recursive="false" caseInsensitive="false" type="Kotlin" pattern_context="default" reformatAccordingToStyle="true" shortenFQN="false" replacement="configureByText($text$)">
|
||||
<constraint name="__context__" within="" contains="" />
|
||||
<constraint name="fixture" regexp="myFixture" nameOfExprType="CodeInsightTestFixture" within="" contains="" />
|
||||
<constraint name="check" regexp="configureByText" within="" contains="" />
|
||||
<constraint name="text" within="" contains="" />
|
||||
<constraint name="fileName" within="" contains="" />
|
||||
</replaceConfiguration>
|
||||
<replaceConfiguration name="Use IdeaVim method instead of the fixture" uuid="0f74da52-7360-33ae-9b40-d771aa128de6" text="$fixture$.$check$($data$)" recursive="false" caseInsensitive="false" type="JAVA" pattern_context="default" reformatAccordingToStyle="true" shortenFQN="true" replacement="assertState($data$)">
|
||||
<constraint name="__context__" within="" contains="" />
|
||||
<constraint name="fixture" regexp="myFixture" within="" contains="" />
|
||||
<constraint name="check" regexp="checkResult" within="" contains="" />
|
||||
<constraint name="data" within="" contains="" />
|
||||
</replaceConfiguration>
|
||||
<replaceConfiguration name="Use IdeaVim method instead of the fixture" uuid="0f74da52-7360-33ae-9b40-d771aa128de6" text="$fixture$.$configure$($first$, $second$)" recursive="false" caseInsensitive="false" type="JAVA" pattern_context="default" reformatAccordingToStyle="true" shortenFQN="true" replacement="configureByText($second$)">
|
||||
<constraint name="__context__" within="" contains="" />
|
||||
<constraint name="fixture" regexp="myFixture" within="" contains="" />
|
||||
<constraint name="configure" regexp="configureByText" within="" contains="" />
|
||||
<constraint name="first" within="" contains="" />
|
||||
<constraint name="second" within="" contains="" />
|
||||
</replaceConfiguration>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="UnstableApiUsage" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
</profile>
|
||||
</component>
|
2
.idea/scopes/Copyright.xml
generated
@@ -1,3 +1,3 @@
|
||||
<component name="DependencyValidationManager">
|
||||
<scope name="Copyright" pattern="file[IdeaVIM.main]:com//*||file[IdeaVIM.test]:*/" />
|
||||
<scope name="Copyright" pattern="(file[IdeaVIM.main]:*/||file[IdeaVIM.test]:*/)&&!file[IdeaVIM.main]:resources//*" />
|
||||
</component>
|
20
.teamcity/_Self/Constants.kt
vendored
@@ -1,10 +1,20 @@
|
||||
package _Self
|
||||
|
||||
object Constants {
|
||||
const val DEFAULT = "default"
|
||||
const val EAP = "eap"
|
||||
const val DEV = "Dev"
|
||||
const val DEFAULT_CHANNEL = "default"
|
||||
const val EAP_CHANNEL = "eap"
|
||||
const val DEV_CHANNEL = "Dev"
|
||||
|
||||
const val VERSION = "0.64"
|
||||
const val DEV_VERSION = "0.65"
|
||||
const val VERSION = "1.11.1"
|
||||
const val DEV_VERSION = "1.12.0"
|
||||
|
||||
const val GITHUB_TESTS = "LATEST-EAP-SNAPSHOT"
|
||||
const val NVIM_TESTS = "LATEST-EAP-SNAPSHOT"
|
||||
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 = "LATEST-EAP-SNAPSHOT"
|
||||
|
||||
const val RELEASE_DEV = "LATEST-EAP-SNAPSHOT"
|
||||
const val RELEASE_EAP = "LATEST-EAP-SNAPSHOT"
|
||||
}
|
||||
|
38
.teamcity/_Self/Project.kt
vendored
@@ -1,45 +1,53 @@
|
||||
package _Self
|
||||
|
||||
import _Self.buildTypes.GitHubPullRequests
|
||||
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.TestsForIntelliJ20202
|
||||
import _Self.buildTypes.TestsForIntelliJ20203
|
||||
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.Branch_203_212
|
||||
import _Self.vcsRoots.Branch_213_221
|
||||
import _Self.vcsRoots.Branch_Release
|
||||
import _Self.vcsRoots.GitHubPullRequest
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.Project
|
||||
|
||||
object Project : Project({
|
||||
description = "Vim emulation plugin for the IntelliJ platform products"
|
||||
|
||||
subProjects(Releases, OldTests)
|
||||
subProjects(Releases, OldTests, GitHub)
|
||||
|
||||
// VCS roots
|
||||
vcsRoot(Branch_183)
|
||||
vcsRoot(Branch_181)
|
||||
vcsRoot(Branch_191_193)
|
||||
vcsRoot(Branch_201)
|
||||
vcsRoot(Branch_202)
|
||||
vcsRoot(Branch_203_212)
|
||||
vcsRoot(Branch_213_221)
|
||||
vcsRoot(Branch_Release)
|
||||
vcsRoot(GitHubPullRequest)
|
||||
|
||||
// Builds
|
||||
buildType(GitHubPullRequests)
|
||||
|
||||
buildType(TestsForIntelliJ20202)
|
||||
buildType(TestsForIntelliJ20203)
|
||||
buildType(TestsForIntelliJEAP)
|
||||
buildType(TestsForIntelliJ20222)
|
||||
|
||||
buildType(PropertyBased)
|
||||
buildType(LongRunning)
|
||||
|
||||
buildType(Nvim)
|
||||
buildType(PluginVerifier)
|
||||
buildType(Compatibility)
|
||||
|
||||
buildType(Qodana)
|
||||
|
||||
@@ -49,21 +57,21 @@ 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")
|
||||
param("instance-type", "c5d.large")
|
||||
param("instance-type", "c5d.xlarge")
|
||||
param("key-pair-name", "teamcity-prod-pub")
|
||||
param("profileId", "amazon-48")
|
||||
param("security-group-ids", "sg-eda08696,sg-7332cf0f,")
|
||||
param("source-id", "BuildAgentsIdeaVim")
|
||||
param("spot-instance-price", "0.1")
|
||||
param("spot-instance-price", "0.12")
|
||||
param("subnet-id", "subnet-58839511")
|
||||
param("use-spot-instances", "true")
|
||||
param("user-tags", "project=idea-vim")
|
||||
param("instance-type", "c5d.xlarge")
|
||||
param("spot-instance-price", "0.12")
|
||||
param("key-pair-name", "")
|
||||
param("spot-instance-price", "")
|
||||
}
|
||||
feature {
|
||||
type = "CloudProfile"
|
||||
@@ -84,6 +92,10 @@ object Project : Project({
|
||||
param("system.cloud.profile_id", "amazon-48")
|
||||
param("terminate-idle-time", "15")
|
||||
param("total-work-time", "")
|
||||
param("user-script", "")
|
||||
param("spot-fleet-config", "")
|
||||
param("terminate-after-build", "true")
|
||||
param("name", "Cloud Agents - Single Build")
|
||||
}
|
||||
}
|
||||
})
|
||||
|
21
.teamcity/_Self/buildTypes/ActiveTests.kt
vendored
@@ -4,6 +4,8 @@ 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.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 ActiveTests(buildName: String, ijVersion: String) : BuildType({
|
||||
@@ -17,12 +19,12 @@ sealed class ActiveTests(buildName: String, ijVersion: String) : BuildType({
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
gradle {
|
||||
tasks = "clean check"
|
||||
tasks = "clean check -x ktlintMainSourceSetCheck -x ktlintTestSourceSetCheck"
|
||||
buildFile = ""
|
||||
enableStacktrace = true
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
||||
@@ -38,8 +40,19 @@ sealed class ActiveTests(buildName: String, ijVersion: String) : BuildType({
|
||||
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 TestsForIntelliJEAP : ActiveTests("Tests for IntelliJ Latest EAP", "LATEST-EAP-SNAPSHOT")
|
||||
object TestsForIntelliJ20203 : ActiveTests("Tests for IntelliJ 2020.3", "2020.3")
|
||||
object TestsForIntelliJ20202 : ActiveTests("Tests for IntelliJ 2020.2", "2020.2")
|
||||
object TestsForIntelliJ20222 : ActiveTests("Tests for IntelliJ 2022.2", "2022.2.1")
|
||||
|
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"
|
||||
}
|
||||
}
|
||||
})
|
@@ -1,5 +1,6 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.GITHUB_TESTS
|
||||
import _Self.vcsRoots.GitHubPullRequest
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.CheckoutMode
|
||||
@@ -10,20 +11,22 @@ import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.VcsTrigger
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs
|
||||
|
||||
object GitHubPullRequests : BuildType({
|
||||
name = "GitHub Pull Requests"
|
||||
description = "Test GitHub pull requests"
|
||||
object GithubTests : Github("clean test", "Tests")
|
||||
|
||||
sealed class Github(command: String, desc: String) : BuildType({
|
||||
name = "GitHub Pull Requests $desc"
|
||||
description = "Test GitHub pull requests $desc"
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "2020.3")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", GITHUB_TESTS)
|
||||
param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false")
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(_Self.vcsRoots.GitHubPullRequest)
|
||||
root(GitHubPullRequest)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
branchFilter = """
|
||||
+:*
|
||||
-:<default>
|
||||
@@ -32,7 +35,7 @@ object GitHubPullRequests : BuildType({
|
||||
|
||||
steps {
|
||||
gradle {
|
||||
tasks = "clean test"
|
||||
tasks = command
|
||||
buildFile = ""
|
||||
enableStacktrace = true
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
42
.teamcity/_Self/buildTypes/LongRunning.kt
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.LONG_RUNNING_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.gradle
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs
|
||||
|
||||
object LongRunning : BuildType({
|
||||
name = "Long running tests"
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", LONG_RUNNING_TESTS)
|
||||
param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false")
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
gradle {
|
||||
tasks = "clean testLongRunning"
|
||||
buildFile = ""
|
||||
enableStacktrace = true
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
||||
}
|
||||
}
|
||||
|
||||
triggers {
|
||||
vcs {
|
||||
branchFilter = ""
|
||||
}
|
||||
}
|
||||
|
||||
requirements {
|
||||
noLessThanVer("teamcity.agent.jvm.version", "1.8")
|
||||
}
|
||||
})
|
21
.teamcity/_Self/buildTypes/Nvim.kt
vendored
@@ -1,10 +1,13 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.NVIM_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.gradle
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script
|
||||
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
|
||||
|
||||
object Nvim : BuildType({
|
||||
@@ -13,7 +16,7 @@ object Nvim : BuildType({
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "LATEST-EAP-SNAPSHOT")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", NVIM_TESTS)
|
||||
param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false")
|
||||
param("env.ideavim.nvim.path", "./nvim-linux64/bin/nvim")
|
||||
}
|
||||
@@ -21,14 +24,14 @@ object Nvim : BuildType({
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
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
|
||||
@@ -51,4 +54,16 @@ object Nvim : BuildType({
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
2
.teamcity/_Self/buildTypes/PluginVerifier.kt
vendored
@@ -16,7 +16,7 @@ object PluginVerifier : BuildType({
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
|
5
.teamcity/_Self/buildTypes/PropertyBased.kt
vendored
@@ -1,5 +1,6 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.PROPERTY_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
|
||||
@@ -10,14 +11,14 @@ object PropertyBased : BuildType({
|
||||
name = "Property based tests"
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "LATEST-EAP-SNAPSHOT")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", PROPERTY_TESTS)
|
||||
param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false")
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
|
46
.teamcity/_Self/buildTypes/Qodana.kt
vendored
@@ -1,39 +1,81 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
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
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.ScheduleTrigger
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs
|
||||
|
||||
object Qodana : BuildType({
|
||||
name = "Qodana checks"
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "LATEST-EAP-SNAPSHOT")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", QODANA_TESTS)
|
||||
param("env.ORG_GRADLE_PROJECT_instrumentPluginCode", "false")
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
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", "")
|
||||
param("clonefinder-languages-container", "Java Kotlin")
|
||||
param("namesAndTagsCustom", "repo.labs.intellij.net/static-analyser/qodana")
|
||||
param("clonefinder-queried-project", "src")
|
||||
param("clonefinder-enable", "true")
|
||||
param("clonefinder-reference-projects", "src")
|
||||
param("yaml-configuration", "")
|
||||
linter = jvm {
|
||||
version = Qodana.JVMVersion.LATEST
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
triggers {
|
||||
vcs {
|
||||
enabled = true
|
||||
branchFilter = ""
|
||||
}
|
||||
schedule {
|
||||
schedulingPolicy = weekly {
|
||||
dayOfWeek = ScheduleTrigger.DAY.Tuesday
|
||||
}
|
||||
branchFilter = ""
|
||||
triggerBuild = always()
|
||||
}
|
||||
}
|
||||
|
||||
failureConditions {
|
||||
failOnMetricChange {
|
||||
threshold = 0
|
||||
units = BuildFailureOnMetric.MetricUnit.DEFAULT_UNIT
|
||||
comparison = BuildFailureOnMetric.MetricComparison.MORE
|
||||
compareTo = value()
|
||||
metric = BuildFailureOnMetric.MetricType.TEST_FAILED_COUNT
|
||||
param("metricKey", "QodanaProblemsTotal")
|
||||
}
|
||||
}
|
||||
|
||||
requirements {
|
||||
|
48
.teamcity/_Self/buildTypes/Release.kt
vendored
@@ -1,13 +1,18 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.DEFAULT
|
||||
import _Self.Constants.DEV
|
||||
import _Self.Constants.EAP
|
||||
import _Self.Constants.DEFAULT_CHANNEL
|
||||
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
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.vcsLabeling
|
||||
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
|
||||
|
||||
object Release : BuildType({
|
||||
name = "Publish Release"
|
||||
@@ -17,30 +22,55 @@ object Release : BuildType({
|
||||
buildNumberPattern = VERSION
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "2020.2")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", RELEASE)
|
||||
password(
|
||||
"env.ORG_GRADLE_PROJECT_publishToken",
|
||||
"credentialsJSON:61a36031-4da1-4226-a876-b8148bf32bde",
|
||||
label = "Password"
|
||||
)
|
||||
param("env.ORG_GRADLE_PROJECT_publishUsername", "Aleksei.Plate")
|
||||
param("env.ORG_GRADLE_PROJECT_version", "%build.number%")
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", "$DEFAULT,$EAP,$DEV")
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", "$DEFAULT_CHANNEL,$EAP_CHANNEL,$DEV_CHANNEL")
|
||||
password(
|
||||
"env.ORG_GRADLE_PROJECT_slackUrl",
|
||||
"credentialsJSON:a8ab8150-e6f8-4eaf-987c-bcd65eac50b5",
|
||||
label = "Slack Token"
|
||||
)
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
root(Branch_Release)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
gradle {
|
||||
tasks = "clean publishPlugin"
|
||||
tasks = "clean publishPlugin slackNotification"
|
||||
buildFile = ""
|
||||
enableStacktrace = true
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
||||
}
|
||||
}
|
||||
|
||||
features {
|
||||
vcsLabeling {
|
||||
vcsRootId = "${DslContext.settingsRoot.id}"
|
||||
labelingPattern = "%system.build.number%"
|
||||
successfulOnly = true
|
||||
branchFilter = ""
|
||||
}
|
||||
}
|
||||
|
||||
failureConditions {
|
||||
failOnMetricChange {
|
||||
metric = BuildFailureOnMetric.MetricType.ARTIFACT_SIZE
|
||||
threshold = 5
|
||||
units = BuildFailureOnMetric.MetricUnit.PERCENTS
|
||||
comparison = BuildFailureOnMetric.MetricComparison.DIFF
|
||||
compareTo = build {
|
||||
buildRule = lastSuccessful()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
26
.teamcity/_Self/buildTypes/ReleaseDev.kt
vendored
@@ -1,11 +1,14 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.DEV
|
||||
import _Self.Constants.DEV_CHANNEL
|
||||
import _Self.Constants.DEV_VERSION
|
||||
import _Self.Constants.RELEASE_DEV
|
||||
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.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.schedule
|
||||
|
||||
object ReleaseDev : BuildType({
|
||||
@@ -16,22 +19,21 @@ object ReleaseDev : BuildType({
|
||||
buildNumberPattern = "$DEV_VERSION-dev.%build.counter%"
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "2020.2")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", RELEASE_DEV)
|
||||
password(
|
||||
"env.ORG_GRADLE_PROJECT_publishToken",
|
||||
"credentialsJSON:61a36031-4da1-4226-a876-b8148bf32bde",
|
||||
label = "Password"
|
||||
)
|
||||
param("env.ORG_GRADLE_PROJECT_publishUsername", "Aleksei.Plate")
|
||||
param("env.ORG_GRADLE_PROJECT_version", "%build.number%")
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", DEV)
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", DEV_CHANNEL)
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
@@ -47,9 +49,21 @@ object ReleaseDev : BuildType({
|
||||
schedule {
|
||||
enabled = true
|
||||
schedulingPolicy = daily {
|
||||
hour = 22
|
||||
hour = 2
|
||||
}
|
||||
branchFilter = ""
|
||||
}
|
||||
}
|
||||
|
||||
failureConditions {
|
||||
failOnMetricChange {
|
||||
metric = BuildFailureOnMetric.MetricType.ARTIFACT_SIZE
|
||||
threshold = 5
|
||||
units = BuildFailureOnMetric.MetricUnit.PERCENTS
|
||||
comparison = BuildFailureOnMetric.MetricComparison.DIFF
|
||||
compareTo = build {
|
||||
buildRule = lastSuccessful()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
34
.teamcity/_Self/buildTypes/ReleaseEap.kt
vendored
@@ -1,33 +1,33 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.EAP
|
||||
import _Self.Constants.VERSION
|
||||
import _Self.Constants.DEV_VERSION
|
||||
import _Self.Constants.EAP_CHANNEL
|
||||
import _Self.Constants.RELEASE_EAP
|
||||
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.buildFeatures.vcsLabeling
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.gradle
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.ScheduleTrigger
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.BuildFailureOnMetric
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.failureConditions.failOnMetricChange
|
||||
|
||||
object ReleaseEap : BuildType({
|
||||
name = "Publish EAP Build"
|
||||
description = "Build and publish EAP of IdeaVim plugin"
|
||||
|
||||
artifactRules = "build/distributions/*"
|
||||
buildNumberPattern = "$VERSION.%build.counter%"
|
||||
buildNumberPattern = "$DEV_VERSION-eap.%build.counter%"
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "2020.2")
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", RELEASE_EAP)
|
||||
password(
|
||||
"env.ORG_GRADLE_PROJECT_publishToken",
|
||||
"credentialsJSON:61a36031-4da1-4226-a876-b8148bf32bde",
|
||||
label = "Password"
|
||||
)
|
||||
param("env.ORG_GRADLE_PROJECT_publishUsername", "Aleksei.Plate")
|
||||
param("env.ORG_GRADLE_PROJECT_version", "%build.number%")
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", EAP)
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", EAP_CHANNEL)
|
||||
password(
|
||||
"env.ORG_GRADLE_PROJECT_slackUrl",
|
||||
"credentialsJSON:a8ab8150-e6f8-4eaf-987c-bcd65eac50b5",
|
||||
@@ -38,12 +38,12 @@ object ReleaseEap : BuildType({
|
||||
vcs {
|
||||
root(DslContext.settingsRoot)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
gradle {
|
||||
tasks = "clean publishPlugin slackEapNotification"
|
||||
tasks = "clean publishPlugin"
|
||||
buildFile = ""
|
||||
enableStacktrace = true
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
||||
@@ -53,9 +53,21 @@ object ReleaseEap : BuildType({
|
||||
features {
|
||||
vcsLabeling {
|
||||
vcsRootId = "${DslContext.settingsRoot.id}"
|
||||
labelingPattern = "%system.build.number%-EAP"
|
||||
labelingPattern = "%system.build.number%"
|
||||
successfulOnly = true
|
||||
branchFilter = ""
|
||||
}
|
||||
}
|
||||
|
||||
failureConditions {
|
||||
failOnMetricChange {
|
||||
metric = BuildFailureOnMetric.MetricType.ARTIFACT_SIZE
|
||||
threshold = 5
|
||||
units = BuildFailureOnMetric.MetricUnit.PERCENTS
|
||||
comparison = BuildFailureOnMetric.MetricComparison.DIFF
|
||||
compareTo = build {
|
||||
buildRule = lastSuccessful()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
45
.teamcity/_Self/buildTypes/Release_201.kt
vendored
@@ -1,45 +0,0 @@
|
||||
package _Self.buildTypes
|
||||
|
||||
import _Self.Constants.DEFAULT
|
||||
import _Self.Constants.DEV
|
||||
import _Self.Constants.EAP
|
||||
import _Self.Constants.VERSION
|
||||
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
|
||||
|
||||
object Release_201 : BuildType({
|
||||
name = "Publish Release 2020.1"
|
||||
description = "Build and publish IdeaVim plugin"
|
||||
|
||||
artifactRules = "build/distributions/*"
|
||||
buildNumberPattern = "$VERSION-2020.1"
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_ideaVersion", "2020.1")
|
||||
password(
|
||||
"env.ORG_GRADLE_PROJECT_publishToken",
|
||||
"credentialsJSON:61a36031-4da1-4226-a876-b8148bf32bde",
|
||||
label = "Password"
|
||||
)
|
||||
param("env.ORG_GRADLE_PROJECT_publishUsername", "Aleksei.Plate")
|
||||
param("env.ORG_GRADLE_PROJECT_version", "%build.number%")
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
param("env.ORG_GRADLE_PROJECT_publishChannels", "$DEFAULT,$EAP,$DEV")
|
||||
}
|
||||
|
||||
vcs {
|
||||
root(_Self.vcsRoots.Branch_201)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
}
|
||||
|
||||
steps {
|
||||
gradle {
|
||||
tasks = "clean publishPlugin"
|
||||
buildFile = ""
|
||||
enableStacktrace = true
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
||||
}
|
||||
}
|
||||
})
|
@@ -3,6 +3,8 @@ 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
|
||||
|
||||
object TestsForIntelliJ20183 : BuildType({
|
||||
@@ -20,7 +22,7 @@ object TestsForIntelliJ20183 : BuildType({
|
||||
vcs {
|
||||
root(_Self.vcsRoots.Branch_183)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
@@ -41,4 +43,16 @@ object TestsForIntelliJ20183 : BuildType({
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@@ -5,6 +5,8 @@ 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_181_branch(private val version: String) : BuildType({
|
||||
@@ -20,7 +22,7 @@ sealed class TestsForIntelliJ_181_branch(private val version: String) : BuildTyp
|
||||
vcs {
|
||||
root(_Self.vcsRoots.Branch_181)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
@@ -41,6 +43,18 @@ sealed class TestsForIntelliJ_181_branch(private val version: String) : BuildTyp
|
||||
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 TestsForIntelliJ20181 : TestsForIntelliJ_181_branch("2018.1")
|
||||
|
@@ -5,6 +5,8 @@ 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_191_193_branch(private val version: String) : BuildType({
|
||||
@@ -21,7 +23,7 @@ sealed class TestsForIntelliJ_191_193_branch(private val version: String) : Buil
|
||||
vcs {
|
||||
root(_Self.vcsRoots.Branch_191_193)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
@@ -42,6 +44,18 @@ sealed class TestsForIntelliJ_191_193_branch(private val version: String) : Buil
|
||||
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 TestsForIntelliJ20191 : TestsForIntelliJ_191_193_branch("2019.1")
|
||||
|
@@ -5,6 +5,8 @@ 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_201_branch(private val version: String) : BuildType({
|
||||
@@ -20,7 +22,7 @@ sealed class TestsForIntelliJ_201_branch(private val version: String) : BuildTyp
|
||||
vcs {
|
||||
root(_Self.vcsRoots.Branch_201)
|
||||
|
||||
checkoutMode = CheckoutMode.ON_SERVER
|
||||
checkoutMode = CheckoutMode.AUTO
|
||||
}
|
||||
|
||||
steps {
|
||||
@@ -41,6 +43,18 @@ sealed class TestsForIntelliJ_201_branch(private val version: String) : BuildTyp
|
||||
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 TestsForIntelliJ20201 : TestsForIntelliJ_201_branch("2020.1")
|
||||
|
60
.teamcity/_Self/buildTypes/TestsForIntelliJ_202.kt
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
@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_202_branch(private val version: String) : BuildType({
|
||||
name = "Tests for IntelliJ $version"
|
||||
|
||||
params {
|
||||
param("env.ORG_GRADLE_PROJECT_downloadIdeaSources", "false")
|
||||
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_202)
|
||||
|
||||
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 TestsForIntelliJ20202 : TestsForIntelliJ_202_branch("2020.2")
|
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
@@ -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")
|
11
.teamcity/_Self/subprojects/GitHub.kt
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package _Self.subprojects
|
||||
|
||||
import _Self.buildTypes.GithubTests
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.Project
|
||||
|
||||
object GitHub : Project({
|
||||
name = "Pull Requests checks"
|
||||
description = "Automatic checking of GitHub Pull Requests"
|
||||
|
||||
buildType(GithubTests)
|
||||
})
|
18
.teamcity/_Self/subprojects/OldTests.kt
vendored
@@ -7,17 +7,27 @@ import _Self.buildTypes.TestsForIntelliJ20191
|
||||
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 jetbrains.buildServer.configs.kotlin.v2019_2.Project
|
||||
|
||||
object OldTests : Project({
|
||||
name = "Old IdeaVim tests"
|
||||
description = "Tests for older versions of IJ"
|
||||
|
||||
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)
|
||||
})
|
||||
|
2
.teamcity/_Self/subprojects/Releases.kt
vendored
@@ -3,7 +3,6 @@ package _Self.subprojects
|
||||
import _Self.buildTypes.Release
|
||||
import _Self.buildTypes.ReleaseDev
|
||||
import _Self.buildTypes.ReleaseEap
|
||||
import _Self.buildTypes.Release_201
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.Project
|
||||
|
||||
object Releases : Project({
|
||||
@@ -11,7 +10,6 @@ object Releases : Project({
|
||||
description = "Stable and EAP releases for IdeaVim"
|
||||
|
||||
buildType(Release)
|
||||
buildType(Release_201)
|
||||
buildType(ReleaseEap)
|
||||
buildType(ReleaseDev)
|
||||
})
|
||||
|
12
.teamcity/_Self/vcsRoots/Branch_202.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_202 : GitVcsRoot({
|
||||
name = "https://github.com/JetBrains/ideavim (branch 202)"
|
||||
url = "https://github.com/JetBrains/ideavim.git"
|
||||
branch = "202"
|
||||
useMirrors = false
|
||||
})
|
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
@@ -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"
|
||||
})
|
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"
|
||||
})
|
55
.teamcity/patches/buildTypes/Qodana.kts
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
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.ui.*
|
||||
|
||||
/*
|
||||
This patch script was generated by TeamCity on settings change in UI.
|
||||
To apply the patch, change the buildType with id = 'Qodana'
|
||||
accordingly, and delete the patch script.
|
||||
*/
|
||||
changeBuildType(RelativeId("Qodana")) {
|
||||
expectSteps {
|
||||
qodana {
|
||||
name = "Qodana"
|
||||
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 {
|
||||
insert(0) {
|
||||
gradle {
|
||||
name = "Generate grammar"
|
||||
tasks = "generateGrammarSource"
|
||||
param("org.jfrog.artifactory.selectedDeployableServer.defaultModuleVersionConfiguration", "GLOBAL")
|
||||
}
|
||||
}
|
||||
update<Qodana>(1) {
|
||||
clearConditions()
|
||||
reportAsTests = true
|
||||
argumentsCommandDocker = "-e QODANA_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJvcmdhbml6YXRpb24iOiIzUFZrQSIsInByb2plY3QiOiIzN1FlQSIsInRva2VuIjoiM0t2bXoifQ.uohp81tM7iAfvvB6k8faarfpV-OjusAaEbWQ8iNrOgs"
|
||||
argumentsEntryPointDocker = "--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", "")
|
||||
}
|
||||
}
|
||||
}
|
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
|
||||
}
|
||||
}
|
||||
}
|
68
.teamcity/patches/projects/_Self.kts
vendored
@@ -1,68 +0,0 @@
|
||||
package patches.projects
|
||||
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.*
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.Project
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.ProjectFeature
|
||||
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<ProjectFeature> {
|
||||
feature {
|
||||
type = "CloudImage"
|
||||
id = "PROJECT_EXT_768"
|
||||
param("agent_pool_id", "41")
|
||||
param("amazon-id", "ami-0d1a6a32faa92923e")
|
||||
param("ebs-optimized", "false")
|
||||
param("image-instances-limit", "")
|
||||
param("image-name-prefix", "BuildAgentsIdeaVim")
|
||||
param("instance-type", "c5d.xlarge")
|
||||
param("key-pair-name", "teamcity-prod-pub")
|
||||
param("profileId", "amazon-48")
|
||||
param("security-group-ids", "sg-eda08696,sg-7332cf0f,")
|
||||
param("source-id", "BuildAgentsIdeaVim")
|
||||
param("spot-instance-price", "0.12")
|
||||
param("subnet-id", "subnet-58839511")
|
||||
param("use-spot-instances", "true")
|
||||
param("user-tags", "project=idea-vim")
|
||||
}
|
||||
}
|
||||
feature1.apply {
|
||||
param("spot-instance-price", "")
|
||||
param("key-pair-name", "")
|
||||
}
|
||||
val feature2 = find<ProjectFeature> {
|
||||
feature {
|
||||
type = "CloudProfile"
|
||||
id = "amazon-48"
|
||||
param("agentPushPreset", "")
|
||||
param("cloud-code", "amazon")
|
||||
param("description", "")
|
||||
param("enabled", "true")
|
||||
param("max-running-instances", "10")
|
||||
param("name", "Cloud Agents")
|
||||
param("next-hour", "")
|
||||
param("not-checked", "")
|
||||
param("profileId", "amazon-48")
|
||||
param("profileServerUrl", "")
|
||||
param("region", "eu-west-1")
|
||||
param("secure:access-id", "credentialsJSON:dbcdb2a2-de5f-4bc9-9421-292b19e83947")
|
||||
param("secure:secret-key", "credentialsJSON:65a87fe7-0977-4af9-96f1-344f2b82d269")
|
||||
param("system.cloud.profile_id", "amazon-48")
|
||||
param("terminate-idle-time", "15")
|
||||
param("total-work-time", "")
|
||||
}
|
||||
}
|
||||
feature2.apply {
|
||||
param("user-script", "")
|
||||
param("spot-fleet-config", "")
|
||||
param("terminate-after-build", "true")
|
||||
param("name", "Cloud Agents - Single Build")
|
||||
}
|
||||
}
|
||||
}
|
156
AUTHORS.md
@@ -10,10 +10,6 @@ The original author:
|
||||
|
||||
The current maintainers:
|
||||
|
||||
* [![icon][mail]](mailto:andrey.vlasovskikh@gmail.com)
|
||||
[![icon][github]](https://github.com/vlasovskikh)
|
||||
|
||||
Andrey Vlasovskikh
|
||||
* [![icon][mail]](mailto:alexpl292@gmail.com)
|
||||
[![icon][github]](https://github.com/AlexPl292)
|
||||
|
||||
@@ -25,22 +21,59 @@ Previous maintainers:
|
||||
[![icon][github]](https://github.com/olegs)
|
||||
|
||||
Oleg Shpynov
|
||||
* [![icon][mail]](mailto:andrey.vlasovskikh@gmail.com)
|
||||
[![icon][github]](https://github.com/vlasovskikh)
|
||||
|
||||
Andrey Vlasovskikh
|
||||
|
||||
Contributors:
|
||||
|
||||
* [![icon][mail]](mailto:yole@jetbrains.com)
|
||||
[![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)
|
||||
@@ -56,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)
|
||||
@@ -64,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)
|
||||
@@ -76,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)
|
||||
@@ -88,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)
|
||||
@@ -108,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)
|
||||
@@ -136,7 +169,7 @@ Contributors:
|
||||
|
||||
tieTYT
|
||||
* [![icon][mail]](mailto:nickgieschen@gmail.com)
|
||||
[![icon][github-off]](#)
|
||||
[![icon][github]](https://github.com/nickgieschen)
|
||||
|
||||
Nick Gieschen
|
||||
* [![icon][mail]](mailto:ikenox@gmail.com)
|
||||
@@ -148,7 +181,7 @@ Contributors:
|
||||
|
||||
Maximilian Luz
|
||||
* [![icon][mail]](mailto:vparfinenko@excelsior-usa.com)
|
||||
[![icon][github-off]](#)
|
||||
[![icon][github]](https://github.com/cypok)
|
||||
|
||||
Vladimir Parfinenko
|
||||
* [![icon][mail]](mailto:hassmann@hwdev.de)
|
||||
@@ -192,7 +225,7 @@ Contributors:
|
||||
|
||||
Marcel Hild
|
||||
* [![icon][mail]](mailto:vedranb@gmail.com)
|
||||
[![icon][github-off]](#)
|
||||
[![icon][github]](https://github.com/vedran)
|
||||
|
||||
Vedran Budimcic
|
||||
* [![icon][mail]](mailto:andreigasparovici1@gmail.com)
|
||||
@@ -207,10 +240,13 @@ Contributors:
|
||||
[![icon][github]](https://github.com/TonyArra)
|
||||
|
||||
Tony Arra
|
||||
* [![icon][mail]](mailto:bradziolko@gmail.com)
|
||||
[![icon][github]](https://github.com/bradziolko)
|
||||
* [![icon][mail]](mailto:mj@ziolko.dev)
|
||||
[![icon][github]](https://github.com/mjziolko)
|
||||
|
||||
Brad Ziolko
|
||||
Madeline Ziolko
|
||||
[Original contribution from:
|
||||
[![icon][mail]](mailto:bradziolko@gmail.com)
|
||||
[![icon][github]](https://github.com/bradziolko)]
|
||||
* [![icon][mail]](mailto:sumoooru2@gmail.com)
|
||||
[![icon][github]](https://github.com/sumoooru2)
|
||||
|
||||
@@ -347,13 +383,85 @@ Contributors:
|
||||
[![icon][github]](https://github.com/daya0576)
|
||||
|
||||
大牙(Henry Zhu)
|
||||
* [![icon][mail]](mailto:mplacek@skilltech.pl)
|
||||
[![icon][github]](https://github.com/MichalPlacek)
|
||||
|
||||
MichalPlacek
|
||||
* [![icon][mail]](mailto:shrikantsharat.k@gmail.com)
|
||||
[![icon][github]](https://github.com/sharat87)
|
||||
|
||||
Shrikant Sharat Kandula
|
||||
* [![icon][mail]](mailto:michal.placek@yandex.com)
|
||||
[![icon][github]](https://github.com/MichalPlacek)
|
||||
|
||||
Michal Placek
|
||||
* [![icon][mail]](mailto:eugene.nizienko@jetbrains.com)
|
||||
[![icon][github]](https://github.com/nizienko)
|
||||
|
||||
eugene nizienko
|
||||
* [![icon][mail]](mailto:x@lipp.fi)
|
||||
[![icon][github]](https://github.com/lippfi)
|
||||
|
||||
Filipp Vakhitov
|
||||
* [![icon][mail]](mailto:yzeiri.1@osu.edu)
|
||||
[![icon][github]](https://github.com/myzeiri)
|
||||
|
||||
Martin Yzeiri
|
||||
* [![icon][mail]](mailto:jeyko1@gmail.com)
|
||||
[![icon][github]](https://github.com/wrightwriter)
|
||||
|
||||
Petar Guglev
|
||||
* [![icon][mail]](mailto:contact@chylex.com)
|
||||
[![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
|
||||
|
||||
If you are a contributor and your name is not listed here, feel free to
|
||||
contact the maintainers.
|
||||
|
||||
<a href="https://icons8.com">Icons by Icons8</a>
|
||||
|
||||
[mail]: resources/icons/mail.png
|
||||
[github]: resources/icons/github.png
|
||||
[mail]: assets/icons/mail.png
|
||||
[github]: assets/icons/github.png
|
||||
|
||||
[github-off]: resources/icons/github-off.png
|
||||
[github-off]: assets/icons/github-off.png
|
||||
|
274
CHANGES.md
@@ -4,17 +4,18 @@ The Changelog
|
||||
History of changes in IdeaVim for the IntelliJ platform.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project DOES NOT adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
Before version 1.7.0:
|
||||
Stable versions use X.Y format.
|
||||
EAP versions use X.Y.Z format.
|
||||
EAP ([Early Access Program](https://jb.gg/ideavim-eap)) versions use X.Y.Z format.
|
||||
|
||||
|
||||
Get an Early Access
|
||||
-------------------
|
||||
|
||||
Would you like to try new features and fixes? Join the Early Access Program and
|
||||
receive EAP builds as updates! Use the `EAP` option in the status bar or
|
||||
receive EAP builds as updates! Use the `Early Access Program` option in the status bar or
|
||||
add this URL to "Settings | Plugins | Manage Plugin Repositories":
|
||||
`https://plugins.jetbrains.com/plugins/eap/ideavim`
|
||||
|
||||
@@ -24,18 +25,279 @@ usual beta standards.
|
||||
|
||||
## To Be Released
|
||||
|
||||
### Fixes:
|
||||
* [VIM-1758](https://youtrack.jetbrains.com/issue/VIM-1758) Commentary plugin in rider
|
||||
* [VIM-1903](https://youtrack.jetbrains.com/issue/VIM-1903) Autoindent now works in rider
|
||||
* [VIM-2744](https://youtrack.jetbrains.com/issue/VIM-2744) Fix undo from ex line
|
||||
* [VIM-2749](https://youtrack.jetbrains.com/issue/VIM-2749) Fix :tabn and :tabN commands
|
||||
* [VIM-2718](https://youtrack.jetbrains.com/issue/VIM-2718) Fixed case where the primary caret was changed
|
||||
* [VIM-2766](https://youtrack.jetbrains.com/issue/VIM-2766) Move NERDTree update to background thread
|
||||
* [VIM-2768](https://youtrack.jetbrains.com/issue/VIM-2768) Refactor listeners
|
||||
|
||||
## 1.11.0, 2022-08-09
|
||||
|
||||
### Features:
|
||||
* Add `gcu` command for Commentary plugin
|
||||
* Add `:Commentary` command, which works great for commands such as `:%g/fun/Commentary`
|
||||
* 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
|
||||
|
||||
### Features:
|
||||
* Make IdeaVim compatible with CodeWithMe | [VIM-2332](https://youtrack.jetbrains.com/issue/VIM-2332)
|
||||
* expression register `<C-R>=` | [VIM-521](https://youtrack.jetbrains.com/issue/VIM-521)
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2442](https://youtrack.jetbrains.com/issue/VIM-2442) Fix `!` command
|
||||
* [VIM-2255](https://youtrack.jetbrains.com/issue/VIM-2255) Fix reload icon on windows
|
||||
* [VIM-2199](https://youtrack.jetbrains.com/issue/VIM-2199) Fix autocompletion for AppCode
|
||||
* [VIM-2445](https://youtrack.jetbrains.com/issue/VIM-2445) Fix spaces in range
|
||||
* [VIM-2450](https://youtrack.jetbrains.com/issue/VIM-2450) Fix set command
|
||||
* [VIM-2451](https://youtrack.jetbrains.com/issue/VIM-2451) Fix comments
|
||||
* [VIM-2452](https://youtrack.jetbrains.com/issue/VIM-2452) Fix augroup
|
||||
* [VIM-2453](https://youtrack.jetbrains.com/issue/VIM-2453) Fix split command
|
||||
* [VIM-2397](https://youtrack.jetbrains.com/issue/VIM-2397) Fix dollar motion as an operator
|
||||
* [VIM-2432](https://youtrack.jetbrains.com/issue/VIM-2432) Fix ctrl-d and ctrl-u motions with scrolloff
|
||||
* [VIM-2462](https://youtrack.jetbrains.com/issue/VIM-2462) Reset caret shape when disabling plugin
|
||||
* [VIM-2449](https://youtrack.jetbrains.com/issue/VIM-2449) Fix `I` for one-line block selection
|
||||
* [VIM-2213](https://youtrack.jetbrains.com/issue/VIM-2213) Close VCS change popup on esc
|
||||
* [VIM-2435](https://youtrack.jetbrains.com/issue/VIM-2435) Close diff window on esc
|
||||
* [VIM-2461](https://youtrack.jetbrains.com/issue/VIM-2461) Show action id before action execution
|
||||
* [VIM-2026](https://youtrack.jetbrains.com/issue/VIM-2026) Keep global marks after restart
|
||||
* [VIM-1691](https://youtrack.jetbrains.com/issue/VIM-1691) Fix default path for `!` command
|
||||
* [VIM-2487](https://youtrack.jetbrains.com/issue/VIM-2487)
|
||||
[VIM-2434](https://youtrack.jetbrains.com/issue/VIM-2434)
|
||||
Fix IdeaVim in PyCharm notebooks
|
||||
|
||||
### Merged PRs:
|
||||
* [390](https://github.com/JetBrains/ideavim/pull/390) by [chylex](https://github.com/chylex): [VIM-2255] Missing reload icon in .ideavimrc on Windows
|
||||
* [391](https://github.com/JetBrains/ideavim/pull/391) by [Matt Ellis](https://github.com/citizenmatt): fix(VIM-2432): handle scrolloff with <C-D> and <C-U>
|
||||
* [401](https://github.com/JetBrains/ideavim/pull/401) by [Matt Ellis](https://github.com/citizenmatt): Reset caret shape when disabling plugin
|
||||
* [407](https://github.com/JetBrains/ideavim/pull/407) by [eugene nizienko](https://github.com/nizienko): Video recording for ui tests
|
||||
* [418](https://github.com/JetBrains/ideavim/pull/418) by [chylex](https://github.com/chylex): Fix compile errors in unit tests on Windows
|
||||
|
||||
## 1.8.0, 2021-10-27
|
||||
|
||||
### Features:
|
||||
* Support `matchit.vim` extension for Ruby and XML/HTML [VIM-539](https://youtrack.jetbrains.com/issue/VIM-539) | [matchit.vim](https://github.com/chrisbra/matchit)
|
||||
* IDE-specific configuration [VIM-1573](https://youtrack.jetbrains.com/issue/VIM-1573)
|
||||
* Call command [VIM-2416](https://youtrack.jetbrains.com/issue/VIM-2416)
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2417](https://youtrack.jetbrains.com/issue/VIM-2417) Fix bars in substitute command
|
||||
* [VIM-2425](https://youtrack.jetbrains.com/issue/VIM-2425) Fix reload button
|
||||
* [VIM-2422](https://youtrack.jetbrains.com/issue/VIM-2422) Fix freeze
|
||||
* [VIM-2420](https://youtrack.jetbrains.com/issue/VIM-2420) Fix freeze
|
||||
* [VIM-2359](https://youtrack.jetbrains.com/issue/VIM-2359) Fix selection with VimExchange
|
||||
* [VIM-2426](https://youtrack.jetbrains.com/issue/VIM-2426) Fix marks in commands
|
||||
* [VIM-2438](https://youtrack.jetbrains.com/issue/VIM-2438) Fix marks in commands
|
||||
* [DISCUSSION-386](https://github.com/JetBrains/ideavim/discussions/386) Fixed command with no spaces before argument
|
||||
|
||||
### Merged PRs:
|
||||
* [337](https://github.com/JetBrains/ideavim/pull/337) by [Matt Ellis](https://github.com/citizenmatt): guicursor!
|
||||
* [343](https://github.com/JetBrains/ideavim/pull/343) by [Martin Yzeiri](https://github.com/myzeiri): Emulate matchit.vim
|
||||
* [387](https://github.com/JetBrains/ideavim/pull/387) by [Petar Guglev](https://github.com/wrightwriter): Update README.md link
|
||||
|
||||
## 1.7.2, 2021-09-30
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2405](https://youtrack.jetbrains.com/issue/VIM-2405) ExExceptions during `map <expr>` execution are now displayed in status bar
|
||||
* [VIM-2406](https://youtrack.jetbrains.com/issue/VIM-2406) Fix go to line command
|
||||
* [VIM-2408](https://youtrack.jetbrains.com/issue/VIM-2408) Fix vim script parser
|
||||
* [VIM-2409](https://youtrack.jetbrains.com/issue/VIM-2409) Fix substitute command
|
||||
* [VIM-2411](https://youtrack.jetbrains.com/issue/VIM-2411) Fix vim script parser
|
||||
|
||||
## 1.7.1, 2021-09-20
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2400](https://youtrack.jetbrains.com/issue/VIM-2400) Fix vim script parser
|
||||
* [VIM-2401](https://youtrack.jetbrains.com/issue/VIM-2401) Exceptions occurred during execution of `map<expr>` are now shown in status bar
|
||||
* [VIM-2404](https://youtrack.jetbrains.com/issue/VIM-2404) Fix multiple pastes from unnamed clipboard
|
||||
|
||||
## 1.7.0, 2021-09-16
|
||||
|
||||
### Features:
|
||||
* New engine for Vim Script execution. Check out the [GitHub Discussion](https://jb.gg/vim-script-discussion).
|
||||
* Mapping keys to expressions (map \<expr>). See `:h map-expression`.
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2368](https://youtrack.jetbrains.com/issue/VIM-2368) Do not remove selection on right click
|
||||
* [VIM-2392](https://youtrack.jetbrains.com/issue/VIM-2392) Fix possible out of bounds exception
|
||||
* [VIM-2387](https://youtrack.jetbrains.com/issue/VIM-2387) Fix coping with unnamed and ideaput
|
||||
|
||||
### Changes:
|
||||
* New versioning scheme. Current version is `1.7.0` instead of `0.70`.
|
||||
|
||||
### Merged PRs:
|
||||
* [349](https://github.com/JetBrains/ideavim/pull/349) by [eugene nizienko](https://github.com/nizienko): Run UI test ci
|
||||
|
||||
## 0.69, 2021-07-20
|
||||
|
||||
### Features:
|
||||
* Support several buffer management commands [VIM-1062](https://youtrack.jetbrains.com/issue/VIM-1062), [VIM-2335](https://youtrack.jetbrains.com/issue/VIM-2335)
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2317](https://youtrack.jetbrains.com/issue/VIM-2317) Fix memory leak
|
||||
* [VIM-1357](https://youtrack.jetbrains.com/issue/VIM-1357)
|
||||
[VIM-1566](https://youtrack.jetbrains.com/issue/VIM-1566) Fix external filters
|
||||
* [VIM-2336](https://youtrack.jetbrains.com/issue/VIM-2336) Fix repeat for the `T` movement
|
||||
* [VIM-1192](https://youtrack.jetbrains.com/issue/VIM-1192) Fix dollar motion from single command
|
||||
* [VIM-1672](https://youtrack.jetbrains.com/issue/VIM-1672) IdeaVim correctly populates clipboard history
|
||||
* [VIM-2351](https://youtrack.jetbrains.com/issue/VIM-2351) Correctly select last character when selecting with mouse
|
||||
|
||||
### Merged PRs:
|
||||
* [332](https://github.com/JetBrains/ideavim/pull/332) by [Matt Ellis](https://github.com/citizenmatt): VIM-1357+VIM-1566: Use OS shell to run filter command
|
||||
* [333](https://github.com/JetBrains/ideavim/pull/333) by [Michal Placek](https://github.com/MichalPlacek): VIM-1062
|
||||
* [334](https://github.com/JetBrains/ideavim/pull/334) by [Michal Placek](https://github.com/MichalPlacek): vim-2335 Support for navigation to previous buffer with :b#
|
||||
|
||||
## 0.68, 2021-06-22
|
||||
|
||||
### Features:
|
||||
* Support `:global` and `:vglobal` commands [VIM-831](https://youtrack.jetbrains.com/issue/VIM-831), [VIM-832](https://youtrack.jetbrains.com/issue/VIM-832)
|
||||
* Support `vim-indent-object` extension [VIM-1151](https://youtrack.jetbrains.com/issue/VIM-1151) | [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object)
|
||||
* Support `:print` command
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2308](https://youtrack.jetbrains.com/issue/VIM-2308) Go to next tab doesn't move scrolling
|
||||
|
||||
### Merged PRs:
|
||||
* [261](https://github.com/JetBrains/ideavim/pull/261) by [Shrikant Sharat Kandula](https://github.com/sharat87): New extension: Indentation based text objects
|
||||
* [308](https://github.com/JetBrains/ideavim/pull/308) by [Matt Ellis](https://github.com/citizenmatt): Fix unnecessary caret movement when switching tabs
|
||||
|
||||
## 0.67, 2021-05-20
|
||||
|
||||
### Features:
|
||||
* Support `sethandler` command to configure shortcuts conflicts via `~/.ideavimrc` file. See [docs](https://jb.gg/vim-sethandler).
|
||||
* Support `vim-paragraph-motion` extension [VIM-2290](https://youtrack.jetbrains.com/issue/VIM-2290) | [vim-paragraph-motion](https://github.com/dbakker/vim-paragraph-motion)
|
||||
* Add "Reset Handlers" button for "Conflicting Shortcuts" setting table
|
||||
|
||||
### Changes:
|
||||
* Rename "Vim Emulation" in settings to "Vim"
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2230](https://youtrack.jetbrains.com/issue/VIM-2230) Tweak caret position with inline rename options inlay
|
||||
* [VIM-2177](https://youtrack.jetbrains.com/issue/VIM-2177) Fix scrolling issues near bottom of file
|
||||
* [VIM-2276](https://youtrack.jetbrains.com/issue/VIM-2276) `:ls` returns correct path for files on Microsoft Windows.
|
||||
* [VIM-1953](https://youtrack.jetbrains.com/issue/VIM-1953) Execute live testing for `:w` command
|
||||
* [VIM-2284](https://youtrack.jetbrains.com/issue/VIM-2284) Values are not duplicated in set command
|
||||
* [VIM-2289](https://youtrack.jetbrains.com/issue/VIM-2289) Fix `<End>` command behaviour
|
||||
* [VIM-1476](https://youtrack.jetbrains.com/issue/VIM-1476) Last inserted text is stored in `.` register
|
||||
* [VIM-2295](https://youtrack.jetbrains.com/issue/VIM-2295) Fix `<S-Space>` in insert mode with an existing mapping
|
||||
* [VIM-1401](https://youtrack.jetbrains.com/issue/VIM-1401) IdeaVim triggers readonly handler
|
||||
* [VIM-1856](https://youtrack.jetbrains.com/issue/VIM-1856) Support defining shortcuts in .ideavimrc
|
||||
* [VIM-1523](https://youtrack.jetbrains.com/issue/VIM-1523) Allow different shortcut handlers in different modes
|
||||
|
||||
### Merged PRs:
|
||||
* [280](https://github.com/JetBrains/ideavim/pull/280) by [Matt Ellis](https://github.com/citizenmatt): Caret position and view scrolling fixes
|
||||
* [289](https://github.com/JetBrains/ideavim/pull/289) by [MichalPlacek](https://github.com/MichalPlacek): VIM-2276 ls returns "absolute path" for files on Microsoft Windows.
|
||||
* [295](https://github.com/JetBrains/ideavim/pull/295) by [MichalPlacek](https://github.com/MichalPlacek): VIM-1476
|
||||
|
||||
## 0.66, 2021-04-09
|
||||
|
||||
Not a lot of changes for this release. Focused on internal improvements.
|
||||
|
||||
### Features:
|
||||
* Support `startofline` option
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2238](https://youtrack.jetbrains.com/issue/VIM-2238) Fix `M` command for small files
|
||||
|
||||
### Merged PRs:
|
||||
* [275](https://github.com/JetBrains/ideavim/pull/275) by [Matt Ellis](https://github.com/citizenmatt): Fix edge cases for H, L and M and introduce 'startofline' option
|
||||
* [276](https://github.com/JetBrains/ideavim/pull/276) by [Matt Ellis](https://github.com/citizenmatt): More refactoring of SearchGroup
|
||||
|
||||
## 0.65, 2021-02-17
|
||||
|
||||
### Features:
|
||||
* Support `NERDTree` extension [VIM-1042](https://youtrack.jetbrains.com/issue/VIM-1042) | [NERDTree](https://github.com/preservim/nerdtree)
|
||||
|
||||
* <details>
|
||||
<summary><strong>Click to see details</strong></summary>
|
||||
<img src="assets/changes/0.65/nerdtree.gif" alt="NERDTree example"/>
|
||||
</details>
|
||||
* Support `maxmapdepth` option to define the maximum depth of mappings
|
||||
|
||||
### Fixes:
|
||||
* [VIM-2202](https://youtrack.jetbrains.com/issue/VIM-2202) Fix macro recording for ex command and search
|
||||
* [VIM-1799](https://youtrack.jetbrains.com/issue/VIM-1799)
|
||||
[VIM-1794](https://youtrack.jetbrains.com/issue/VIM-179a)
|
||||
[VIM-1794](https://youtrack.jetbrains.com/issue/VIM-1794)
|
||||
Special characters are not interpreted on yanking
|
||||
* [VIM-2218](https://youtrack.jetbrains.com/issue/VIM-2218) Fix some shortcuts for 2021.+
|
||||
* [VIM-2217](https://youtrack.jetbrains.com/issue/VIM-2217) Fix adding new line at the end of the file for the AppCode
|
||||
* [VIM-2220](https://youtrack.jetbrains.com/issue/VIM-2220) Do not try to get a commandState for null editor
|
||||
* [VIM-2153](https://youtrack.jetbrains.com/issue/VIM-2153) Fix storing special characters after IDE closing
|
||||
|
||||
### Merged PRs:
|
||||
* [269](https://github.com/JetBrains/ideavim/pull/269) by [大牙(Henry Zhu)](https://github.com/daya0576): fix invalid link of submodule docs
|
||||
@@ -156,7 +418,7 @@ Use `set ideavimsupport=` to disable IdeaVim in dialog editors.
|
||||
|
||||
* <details>
|
||||
<summary><strong>Click to see details</strong></summary>
|
||||
<img src="resources/changes/0.59/highlight_yank.gif" alt="highlight yank"/>
|
||||
<img src="assets/changes/0.59/highlight_yank.gif" alt="highlight yank"/>
|
||||
</details>
|
||||
|
||||
* [VIM-2068](https://youtrack.jetbrains.com/issue/VIM-2068) `:tabclose` command
|
||||
@@ -181,7 +443,7 @@ Use `set ideavimsupport=` to disable IdeaVim in dialog editors.
|
||||
|
||||
* <details>
|
||||
<summary><strong>Click to see details</strong></summary>
|
||||
<img src="resources/changes/0.58/reload_ideavimrc.png" alt="IdeaVimRc reload"/>
|
||||
<img src="assets/changes/0.58/reload_ideavimrc.png" alt="IdeaVimRc reload"/>
|
||||
</details>
|
||||
|
||||
* Add `:buffer` command.
|
||||
|
@@ -1,9 +1,12 @@
|
||||
[![TeamCity Build][teamcity-build-status-svg]][teamcity-build-status]
|
||||
|
||||
IdeaVim is an open source project created by 60+ contributors. Would you like to make it even better? That’s wonderful!
|
||||
IdeaVim is an open source project created by 80+ contributors. Would you like to make it even better? That’s wonderful!
|
||||
|
||||
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:
|
||||
|
||||
@@ -61,7 +64,9 @@ If you are looking for:
|
||||
|
||||
- Ex commands (`:set`, `:s`, `:nohlsearch`):
|
||||
- Any particular ex command: package `com.maddyhome.idea.vim.ex.handler`.
|
||||
- Ex command executor: `CommandHandler`.
|
||||
- Vim script grammar: `Vimscript.g4`.
|
||||
- Vim script parsing: package `com.maddyhome.idea.vim.vimscript.parser`.
|
||||
- Vim script executor: `Executor`.
|
||||
|
||||
- Extensions:
|
||||
- Extensions handler: `VimExtensionHandler`.
|
||||
@@ -69,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`.
|
||||
@@ -115,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.
|
||||
@@ -136,7 +152,7 @@ This is just terrible. [You know what to do](https://github.com/JetBrains/ideavi
|
||||
* [Continuous integration builds](https://teamcity.jetbrains.com/project.html?projectId=IdeaVim&guest=1)
|
||||
* [Bug tracker](https://youtrack.jetbrains.com/issues/VIM)
|
||||
* [Chat on gitter](https://gitter.im/JetBrains/ideavim)
|
||||
* [Unofficial discord server](https://jb.gg/bi6zp7)
|
||||
* [IdeaVim Channel](https://jb.gg/bi6zp7) on [JetBrains Server](https://discord.gg/jetbrains)
|
||||
* [Plugin homepage](https://plugins.jetbrains.com/plugin/164-ideavim)
|
||||
* [Changelog](CHANGES.md)
|
||||
* [Contributors listing](AUTHORS.md)
|
||||
|
126
README.md
@@ -1,4 +1,4 @@
|
||||
<img src="resources/META-INF/pluginIcon.svg" width="80" height="80" alt="icon" align="left"/>
|
||||
<img src="src/main/resources/META-INF/pluginIcon.svg" width="80" height="80" alt="icon" align="left"/>
|
||||
|
||||
IdeaVim
|
||||
===
|
||||
@@ -11,13 +11,13 @@ IdeaVim
|
||||
[![Gitter][gitter-svg]][gitter]
|
||||
[![Twitter][twitter-svg]][twitter]
|
||||
|
||||
IdeaVim is a Vim emulation plugin for IntelliJ Platform-based IDEs.
|
||||
IdeaVim is a Vim engine for JetBrains IDEs.
|
||||
|
||||
##### Contact maintainers:
|
||||
* [Bug tracker](https://youtrack.jetbrains.com/issues/VIM)
|
||||
* [@IdeaVim](https://twitter.com/ideavim) on Twitter
|
||||
* [Chat on gitter](https://gitter.im/JetBrains/ideavim)
|
||||
* [Unofficial discord server](https://jb.gg/bi6zp7)
|
||||
* [IdeaVim Channel](https://jb.gg/bi6zp7) on [JetBrains Server](https://discord.gg/jetbrains)
|
||||
|
||||
##### Resources:
|
||||
|
||||
@@ -36,13 +36,13 @@ 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` 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.
|
||||
|
||||
- Shortcut conflicts can be resolved by using:
|
||||
- On Linux & Windows: `File | Settings | Editor | Vim Emulation` & `File | Settings | Keymap`,
|
||||
- On macOS: `Preferences | Editor | Vim Emulation` & `Preferences | Keymap`,
|
||||
- On Linux & Windows: `File | Settings | Editor | Vim` & `File | Settings | Keymap`,
|
||||
- On macOS: `Preferences | Editor | Vim` & `Preferences | Keymap`,
|
||||
- Regular Vim mappings in the `~/.ideavimrc` file.
|
||||
|
||||
Get Early Access
|
||||
@@ -51,15 +51,17 @@ Get Early Access
|
||||
Would you like to try new features and fixes? Join the Early Access Program and
|
||||
receive EAP builds as updates!
|
||||
|
||||
1. Click the IdeaVim icon <img src="resources/META-INF/pluginIcon_noBorders.svg" width="16" height="16" alt="icon"/>
|
||||
in the status bar | `EAP` | `Get Early Access...`
|
||||
1. Click the IdeaVim icon <img src="src/main/resources/META-INF/pluginIcon_noBorders.svg" width="16" height="16" alt="icon"/>
|
||||
in the status bar | `Early Access Program` | `Subscibe to EAP`
|
||||
|
||||
|
||||
Or subscribe to EAP updates manually:
|
||||
|
||||
1. Open `Settings | Plugins`
|
||||
2. Click the gear icon :gear:, select `Manage Plugin Repositories`, and add the following url:
|
||||
`https://plugins.jetbrains.com/plugins/eap/ideavim`
|
||||
```
|
||||
https://plugins.jetbrains.com/plugins/eap/ideavim
|
||||
```
|
||||
|
||||
See [the changelog](CHANGES.md) for the list of unreleased features.
|
||||
|
||||
@@ -86,9 +88,10 @@ Here are some examples of supported vim features and commands:
|
||||
* Vim web help
|
||||
* `~/.ideavimrc` configuration file
|
||||
|
||||
[Emulated Vim plugins](https://github.com/JetBrains/ideavim/wiki/Emulated-plugins):
|
||||
[IdeaVim plugins](https://github.com/JetBrains/ideavim/wiki/Emulated-plugins):
|
||||
|
||||
* vim-easymotion
|
||||
* NERDTree
|
||||
* vim-surround
|
||||
* vim-multiple-cursors
|
||||
* vim-commentary
|
||||
@@ -97,12 +100,16 @@ Here are some examples of supported vim features and commands:
|
||||
* ReplaceWithRegister
|
||||
* vim-exchange
|
||||
* vim-highlightedyank
|
||||
* vim-paragraph-motion
|
||||
* vim-indent-object
|
||||
* match.it
|
||||
|
||||
See also:
|
||||
|
||||
* [The list of all supported commands](src/com/maddyhome/idea/vim/package-info.java)
|
||||
* [The list of all supported commands](src/main/java/com/maddyhome/idea/vim/package-info.java)
|
||||
* [Top feature requests and bugs](https://youtrack.jetbrains.com/issues/VIM?q=%23Unresolved+sort+by%3A+votes)
|
||||
|
||||
* [Vimscript support roadmap](vimscript-info/VIMSCRIPT_ROADMAP.md)
|
||||
* [List of supported in-build functions](vimscript-info/FUNCTIONS_INFO.MD)
|
||||
|
||||
Files
|
||||
-----
|
||||
@@ -169,7 +176,7 @@ Here is also a list of the suggested options from [defaults.vim](https://github.
|
||||
" text scroll if you mouse-click near the start or end of the window.
|
||||
set scrolloff=5
|
||||
|
||||
" Do incremental searching
|
||||
" Do incremental searching.
|
||||
set incsearch
|
||||
|
||||
" Don't use Ex mode, use Q for formatting.
|
||||
@@ -182,10 +189,6 @@ You can read your `~/.vimrc` file from `~/.ideavimrc` with this command:
|
||||
|
||||
source ~/.vimrc
|
||||
|
||||
> :warning: Please note that IdeaVim currently parses `~/.ideavimrc` & `~/.vimrc` files via simple pattern-matching.
|
||||
See [VIM-669](https://youtrack.jetbrains.com/issue/VIM-669) for proper parsing
|
||||
of VimL files.
|
||||
|
||||
Also note that if you have overridden the `user.home` JVM option, this
|
||||
will affect where IdeaVim looks for your `.ideavimrc` file. For example, if you
|
||||
have `-Duser.home=/my/alternate/home` then IdeaVim will source
|
||||
@@ -195,7 +198,7 @@ Alternatively, you can set up initialization commands using [XDG](https://specif
|
||||
Put your settings to `$XDG_CONFIG_HOME/ideavim/ideavimrc` file.
|
||||
|
||||
|
||||
Emulated Vim Plugins
|
||||
IdeaVim Plugins
|
||||
--------------------
|
||||
|
||||
See [doc/emulated-plugins.md](https://github.com/JetBrains/ideavim/wiki/Emulated-plugins)
|
||||
@@ -206,25 +209,34 @@ Executing IDE Actions
|
||||
IdeaVim adds various commands for listing and executing arbitrary IDE actions as
|
||||
Ex commands or via `:map` command mappings:
|
||||
|
||||
**Executing actions:**
|
||||
### Executing actions:
|
||||
* `:action {action_id}`
|
||||
* Execute an action by id. Works from Ex command line.
|
||||
* `<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`.
|
||||
* :warning: Mappings to `<Action>` don't work with `noremap`.
|
||||
If you know the case when it's needed, please [let us know](https://github.com/JetBrains/ideavim#contact-maintainers).
|
||||
|
||||
**Finding actions:**
|
||||
* `:actionlist [pattern]`
|
||||
* Find IDE actions by id or keymap pattern (E.g. `:actionlist extract`, `:actionlist <C-D`)
|
||||
### Finding action ids:
|
||||
|
||||
* In addition to `:actionlist` command, IdeaVim provides `IdeaVim: track action Ids` option to
|
||||
extract the ids of executed command. This option can be found in "Search everywhere" (double `shift`).
|
||||
* IJ provides `IdeaVim: track action Ids` command to show the id of the executed actions.
|
||||
This command can be found in "Search everywhere" (double `shift`).
|
||||
|
||||
<details>
|
||||
<summary><strong>"Track action Ids" Details</strong> (click to see)</summary>
|
||||
<img src="resources/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>
|
||||
|
||||
Examples:
|
||||
|
||||
* `:actionlist [pattern]`
|
||||
* Find IDE actions by id or keymap pattern (E.g. `:actionlist extract`, `:actionlist <C-D`)
|
||||
|
||||
##### Examples:
|
||||
|
||||
```vim
|
||||
" Map \r to the Reformat Code action
|
||||
@@ -237,6 +249,60 @@ Examples:
|
||||
:map \b <Action>(ToggleLineBreakpoint)
|
||||
```
|
||||
|
||||
##### Some popular actions:
|
||||
|
||||
```
|
||||
QuickJavaDoc - Quick Documentation (not only for java, all languages)
|
||||
ShowErrorDescription - Show description of the error under the caret (cursor hovering)
|
||||
QuickImplementations - Quick Definition
|
||||
```
|
||||
|
||||
Vim Script
|
||||
------------
|
||||
|
||||
IdeaVim can execute custom scripts that are written with Vim Script.
|
||||
At the moment we support all language features, but not all of the built-in functions and options are supported.
|
||||
|
||||
Additionally, you may be interested in the
|
||||
[Vim Script Discussion](https://github.com/JetBrains/ideavim/discussions/357) or
|
||||
[Vim Script Roadmap](https://github.com/JetBrains/ideavim/blob/master/vimscript-info/VIMSCRIPT_ROADMAP.md).
|
||||
|
||||
|
||||
### IDE specific options
|
||||
|
||||
You can evaluate the `has('ide')` function call and get `1` if it was called with IdeaVim or `0` if the function was called from Vim/NeoVim.
|
||||
The option `&ide` contains the name and edition of your IDE, for example, "IntelliJ IDEA Ultimate Edition".
|
||||
To see its value for the current IDE you are using, execute the `:echo &ide` command.
|
||||
To write an IDE-specific configuration, use Vim's regexp match operators `=~?` (case-insensitive) / `=~#` (case-sensitive)
|
||||
|
||||
**Example config:**
|
||||
|
||||
```vim
|
||||
" options and mappings that are supported by both Vim and IdeaVim
|
||||
set nu
|
||||
set relativenumber
|
||||
|
||||
if has('ide')
|
||||
" mappings and options that exist only in IdeaVim
|
||||
map <leader>f <Action>(GotoFile)
|
||||
map <leader>g <Action>(FindInPath)
|
||||
map <leader>b <Action>(Switcher)
|
||||
|
||||
if &ide =~? 'intellij idea'
|
||||
if &ide =~? 'community'
|
||||
" some mappings and options for IntelliJ IDEA Community Edition
|
||||
elseif &ide =~? 'ultimate'
|
||||
" some mappings and options for IntelliJ IDEA Ultimate Edition
|
||||
endif
|
||||
elseif &ide =~? 'pycharm'
|
||||
" PyCharm specific mappings and options
|
||||
endif
|
||||
else
|
||||
" some mappings for Vim/Neovim
|
||||
nnoremap <leader>f <cmd>Telescope find_files<cr>
|
||||
endif
|
||||
```
|
||||
|
||||
:gem: Contributing
|
||||
------------
|
||||
|
||||
@@ -260,10 +326,6 @@ IdeaVim tips and tricks
|
||||
- Check out more [ex commands](https://github.com/JetBrains/ideavim/wiki/%22set%22-commands).
|
||||
|
||||
- Use your vim settings with IdeaVim. Put `source ~/.vimrc` in `~/.ideavimrc`.
|
||||
> :warning: Please note that IdeaVim currently parses `~/.ideavimrc` & `~/.vimrc` files via simple pattern-matching.
|
||||
See [VIM-669](https://youtrack.jetbrains.com/issue/VIM-669) for proper parsing
|
||||
of VimL files.
|
||||
|
||||
- Control the status bar icon via the [`ideastatusicon` option](https://github.com/JetBrains/ideavim/wiki/%22set%22-commands).
|
||||
- Not familiar with the default behaviour during a refactoring? See the [`idearefactormode` option](https://github.com/JetBrains/ideavim/wiki/%22set%22-commands).
|
||||
|
||||
|
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 194 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 128 KiB |
BIN
assets/changes/0.65/nerdtree.gif
Normal file
After Width: | Height: | Size: 32 MiB |
BIN
assets/contributing/configs-dark.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
assets/contributing/configs-light.png
Normal file
After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 638 B After Width: | Height: | Size: 638 B |
Before Width: | Height: | Size: 364 B After Width: | Height: | Size: 364 B |
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 282 B |
BIN
assets/readme/track_action_dark.gif
Normal file
After Width: | Height: | Size: 1.0 MiB |
BIN
assets/readme/track_action_light.gif
Normal file
After Width: | Height: | Size: 981 KiB |
181
build.gradle
@@ -1,181 +0,0 @@
|
||||
import dev.feedforward.markdownto.DownParser
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
|
||||
classpath "com.github.AlexPl292:mark-down-to-slack:1.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'org.jetbrains.intellij' version '0.6.5'
|
||||
id 'io.gitlab.arturbosch.detekt' version '1.15.0'
|
||||
id "org.jetbrains.changelog" version "1.0.1"
|
||||
}
|
||||
|
||||
apply plugin: 'java'
|
||||
apply plugin: 'kotlin'
|
||||
|
||||
sourceCompatibility = javaVersion
|
||||
targetCompatibility = javaVersion
|
||||
|
||||
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
java.srcDir 'src'
|
||||
resources.srcDir 'resources'
|
||||
}
|
||||
test {
|
||||
java.srcDir 'test'
|
||||
}
|
||||
}
|
||||
|
||||
intellij {
|
||||
version ideaVersion
|
||||
pluginName 'IdeaVim'
|
||||
updateSinceUntilBuild false
|
||||
downloadSources Boolean.valueOf(downloadIdeaSources)
|
||||
instrumentCode Boolean.valueOf(instrumentPluginCode)
|
||||
intellijRepo = "https://www.jetbrains.com/intellij-repository"
|
||||
plugins = ['java']
|
||||
|
||||
downloadRobotServerPlugin.version = "0.10.0"
|
||||
|
||||
publishPlugin {
|
||||
channels publishChannels.split(',')
|
||||
username publishUsername
|
||||
token publishToken
|
||||
}
|
||||
}
|
||||
|
||||
runIdeForUiTests {
|
||||
systemProperty "robot-server.port", "8082"
|
||||
}
|
||||
|
||||
runPluginVerifier {
|
||||
ideVersions = ["IC-2020.2.3", "IC-2020.3.2"]
|
||||
downloadDirectory = "${project.buildDir}/pluginVerifier/ides"
|
||||
teamCityOutputFormat = true
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
maven { url = "https://jetbrains.bintray.com/intellij-third-party-dependencies" }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"
|
||||
compileOnly "org.jetbrains:annotations:20.1.0"
|
||||
|
||||
// https://mvnrepository.com/artifact/com.ensarsarajcic.neovim.java/neovim-api
|
||||
testImplementation("com.ensarsarajcic.neovim.java:neovim-api:0.2.0")
|
||||
testImplementation 'com.ensarsarajcic.neovim.java:core-rpc:0.2.0'
|
||||
|
||||
testImplementation("com.intellij.remoterobot:remote-robot:0.10.3")
|
||||
testImplementation("com.intellij.remoterobot:remote-fixtures:1.1.18")
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = javaVersion
|
||||
}
|
||||
}
|
||||
compileTestKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = javaVersion
|
||||
}
|
||||
}
|
||||
|
||||
detekt {
|
||||
config = files("${rootProject.projectDir}/.detekt/config.yaml")
|
||||
baseline = file("${rootProject.projectDir}/.detekt/baseline.xml")
|
||||
input = files("src")
|
||||
|
||||
buildUponDefaultConfig = true
|
||||
|
||||
reports {
|
||||
html.enabled = false
|
||||
xml.enabled = false
|
||||
txt.enabled = false
|
||||
}
|
||||
}
|
||||
|
||||
tasks.detekt.jvmTarget = javaVersion
|
||||
|
||||
task testWithNeovim(type: Test) {
|
||||
group = "verification"
|
||||
systemProperty "ideavim.nvim.test", 'true'
|
||||
exclude '/ui/**'
|
||||
}
|
||||
|
||||
test {
|
||||
exclude '**/propertybased/**'
|
||||
exclude '/ui/**'
|
||||
}
|
||||
|
||||
task testPropertyBased(type: Test) {
|
||||
group = "verification"
|
||||
include '**/propertybased/**'
|
||||
}
|
||||
|
||||
task testUi(type: Test) {
|
||||
group = "verification"
|
||||
include '/ui/**'
|
||||
}
|
||||
|
||||
changelog {
|
||||
groups = ["Features:", "Changes:", "Deprecations:", "Fixes:", "Merged PRs:"]
|
||||
itemPrefix = "*"
|
||||
path = "${project.projectDir}/CHANGES.md"
|
||||
unreleasedTerm = "To Be Released"
|
||||
headerParserRegex = /0\.\d{2}(.\d+)?/
|
||||
// header = { "${project.version}" }
|
||||
// version = "0.60"
|
||||
}
|
||||
|
||||
task getUnreleasedChangelog() {
|
||||
group = "changelog"
|
||||
doLast {
|
||||
def log = changelog.getUnreleased().toHTML()
|
||||
println log
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("slackEapNotification") {
|
||||
doLast {
|
||||
if (!slackUrl) return
|
||||
def post = new URL(slackUrl).openConnection()
|
||||
def changeLog = changelog.getUnreleased().toText()
|
||||
def slackDown = new DownParser(changeLog, true).toSlack().toString()
|
||||
def message = """
|
||||
{
|
||||
"text": "New version of IdeaVim",
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "IdeaVim EAP $version has been released\\n$slackDown"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
"""
|
||||
post.setRequestMethod("POST")
|
||||
post.setDoOutput(true)
|
||||
post.setRequestProperty("Content-Type", "application/json")
|
||||
post.getOutputStream().write(message.getBytes("UTF-8"))
|
||||
def postRC = post.getResponseCode()
|
||||
println(postRC)
|
||||
if (postRC == 200) {
|
||||
println(post.getInputStream().getText())
|
||||
}
|
||||
}
|
||||
}
|
634
build.gradle.kts
Normal file
@@ -0,0 +1,634 @@
|
||||
|
||||
import dev.feedforward.markdownto.DownParser
|
||||
import org.intellij.markdown.ast.getTextInNode
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = uri("https://jitpack.io") }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21")
|
||||
classpath("com.github.AlexPl292:mark-down-to-slack:1.1.2")
|
||||
classpath("org.eclipse.jgit:org.eclipse.jgit:6.1.0.202203080745-r")
|
||||
classpath("org.kohsuke:github-api:1.305")
|
||||
|
||||
// This comes from the changelog plugin
|
||||
// classpath("org.jetbrains:markdown:0.3.1")
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
antlr
|
||||
java
|
||||
kotlin("jvm") version "1.6.21"
|
||||
|
||||
id("org.jetbrains.intellij") version "1.10.0-SNAPSHOT"
|
||||
id("org.jetbrains.changelog") version "1.3.1"
|
||||
|
||||
// ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle
|
||||
id("org.jlleitschuh.gradle.ktlint") version "10.3.0"
|
||||
}
|
||||
|
||||
// Import variables from gradle.properties file
|
||||
val javaVersion: String by project
|
||||
val kotlinVersion: String by project
|
||||
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
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = uri("https://cache-redirector.jetbrains.com/intellij-dependencies") }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
||||
compileOnly("org.jetbrains:annotations:23.0.0")
|
||||
|
||||
// https://mvnrepository.com/artifact/com.ensarsarajcic.neovim.java/neovim-api
|
||||
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:$antlrVersion")
|
||||
antlr("org.antlr:antlr4:$antlrVersion")
|
||||
|
||||
api(project(":vim-engine"))
|
||||
|
||||
testApi("com.squareup.okhttp3:okhttp:4.10.0")
|
||||
}
|
||||
|
||||
configurations {
|
||||
runtimeClasspath {
|
||||
exclude(group = "org.antlr", module = "antlr4")
|
||||
}
|
||||
}
|
||||
|
||||
// --- 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
|
||||
val test 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")
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = javaVersion
|
||||
apiVersion = "1.6"
|
||||
freeCompilerArgs = listOf("-Xjvm-default=all-compatibility")
|
||||
// allWarningsAsErrors = true
|
||||
}
|
||||
}
|
||||
compileTestKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = javaVersion
|
||||
apiVersion = "1.6"
|
||||
// allWarningsAsErrors = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion.set(JavaLanguageVersion.of(javaVersion))
|
||||
}
|
||||
}
|
||||
|
||||
kotlin {
|
||||
jvmToolchain {
|
||||
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(javaVersion))
|
||||
}
|
||||
}
|
||||
|
||||
gradle.projectsEvaluated {
|
||||
tasks.compileJava {
|
||||
// options.compilerArgs.add("-Werror")
|
||||
options.compilerArgs.add("-Xlint:deprecation")
|
||||
}
|
||||
}
|
||||
|
||||
// --- Intellij plugin
|
||||
|
||||
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")
|
||||
// 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 {
|
||||
downloadRobotServerPlugin {
|
||||
version.set(remoteRobotVersion)
|
||||
}
|
||||
|
||||
publishPlugin {
|
||||
channels.set(publishChannels.split(","))
|
||||
token.set(publishToken)
|
||||
}
|
||||
|
||||
runIdeForUiTests {
|
||||
systemProperty("robot-server.port", "8082")
|
||||
systemProperty("ide.mac.message.dialogs.as.sheets", "false")
|
||||
systemProperty("jb.privacy.policy.text", "<!--999.999-->")
|
||||
systemProperty("jb.consents.confirmation.enabled", "false")
|
||||
}
|
||||
|
||||
runPluginVerifier {
|
||||
downloadDir.set("${project.buildDir}/pluginVerifier/ides")
|
||||
teamCityOutputFormat.set(true)
|
||||
// ideVersions.set(listOf("IC-2021.3.4"))
|
||||
}
|
||||
|
||||
generateGrammarSource {
|
||||
maxHeapSize = "128m"
|
||||
arguments.addAll(listOf("-package", "com.maddyhome.idea.vim.vimscript.parser.generated", "-visitor"))
|
||||
outputDirectory = file("src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated")
|
||||
}
|
||||
|
||||
named("compileKotlin") {
|
||||
dependsOn("generateGrammarSource")
|
||||
}
|
||||
|
||||
// Add plugin open API sources to the plugin ZIP
|
||||
val createOpenApiSourceJar by registering(Jar::class) {
|
||||
// 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("222")
|
||||
}
|
||||
}
|
||||
|
||||
// --- Linting
|
||||
|
||||
ktlint {
|
||||
disabledRules.add("no-wildcard-imports")
|
||||
version.set("0.43.0")
|
||||
}
|
||||
|
||||
// --- Tests
|
||||
|
||||
tasks {
|
||||
test {
|
||||
exclude("**/propertybased/**")
|
||||
exclude("**/longrunning/**")
|
||||
exclude("/ui/**")
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register<Test>("testUi") {
|
||||
group = "verification"
|
||||
include("/ui/**")
|
||||
}
|
||||
|
||||
// --- Changelog
|
||||
|
||||
changelog {
|
||||
groups.set(listOf("Features:", "Changes:", "Deprecations:", "Fixes:", "Merged PRs:"))
|
||||
itemPrefix.set("*")
|
||||
path.set("${project.projectDir}/CHANGES.md")
|
||||
unreleasedTerm.set("To Be Released")
|
||||
headerParserRegex.set("(\\d\\.\\d+(.\\d+)?)".toRegex())
|
||||
// header = { "${project.version}" }
|
||||
// version = "0.60"
|
||||
}
|
||||
|
||||
tasks.register("getUnreleasedChangelog") {
|
||||
group = "changelog"
|
||||
doLast {
|
||||
val log = changelog.getUnreleased().toHTML()
|
||||
println(log)
|
||||
}
|
||||
}
|
||||
|
||||
// --- Slack notification
|
||||
|
||||
tasks.register("slackNotification") {
|
||||
doLast {
|
||||
if (slackUrl.isBlank()) {
|
||||
println("Slack Url is not defined")
|
||||
return@doLast
|
||||
}
|
||||
val changeLog = changelog.getLatest().toText()
|
||||
val slackDown = DownParser(changeLog, true).toSlack().toString()
|
||||
|
||||
//language=JSON
|
||||
val message = """
|
||||
{
|
||||
"text": "New version of IdeaVim",
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "IdeaVim $version has been released\n$slackDown"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
""".trimIndent()
|
||||
|
||||
println("Parsed data: $slackDown")
|
||||
val post = URL(slackUrl)
|
||||
with(post.openConnection() as HttpURLConnection) {
|
||||
requestMethod = "POST"
|
||||
doOutput = true
|
||||
setRequestProperty("Content-Type", "application/json")
|
||||
|
||||
outputStream.write(message.toByteArray())
|
||||
|
||||
val postRc = responseCode
|
||||
println("Response code: $postRc")
|
||||
if (postRc == 200) {
|
||||
println(inputStream.bufferedReader().use { it.readText() })
|
||||
} else {
|
||||
println(errorStream.bufferedReader().use { it.readText() })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uncomment to enable FUS testing mode
|
||||
// tasks {
|
||||
// withType<org.jetbrains.intellij.tasks.RunIdeTask> {
|
||||
// jvmArgs("-Didea.is.internal=true")
|
||||
// jvmArgs("-Dfus.internal.test.mode=true")
|
||||
// }
|
||||
// }
|
||||
|
||||
// --- Update authors
|
||||
tasks.register("updateAuthors") {
|
||||
doLast {
|
||||
val uncheckedEmails = setOf(
|
||||
"aleksei.plate@jetbrains.com",
|
||||
"aleksei.plate@teamcity",
|
||||
"aleksei.plate@TeamCity",
|
||||
"alex.plate@192.168.0.109",
|
||||
"nikita.koshcheev@TeamCity",
|
||||
)
|
||||
updateAuthors(uncheckedEmails)
|
||||
}
|
||||
}
|
||||
|
||||
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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("updateChangelog") {
|
||||
doLast {
|
||||
updateChangelog()
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("testUpdateChangelog") {
|
||||
group = "verification"
|
||||
description = "This is a task to manually assert the correctness of the update tasks"
|
||||
doLast {
|
||||
val changesFile = File("$projectDir/CHANGES.md")
|
||||
val changes = changesFile.readText()
|
||||
|
||||
val changesBuilder = StringBuilder(changes)
|
||||
val insertOffset = setupSection(changes, changesBuilder, "### Changes:")
|
||||
|
||||
changesBuilder.insert(insertOffset, "--Hello--\n")
|
||||
|
||||
changesFile.writeText(changesBuilder.toString())
|
||||
}
|
||||
}
|
||||
|
||||
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")
|
||||
}
|
||||
}
|
||||
|
||||
// Update changes file
|
||||
val changesFile = File("$projectDir/CHANGES.md")
|
||||
val changes = changesFile.readText()
|
||||
|
||||
val changesBuilder = StringBuilder(changes)
|
||||
val insertOffset = setupSection(changes, changesBuilder, "### Fixes:")
|
||||
|
||||
if (insertOffset < 50) error("Incorrect offset: $insertOffset")
|
||||
|
||||
val firstPartOfChanges = changes.take(insertOffset)
|
||||
val actualFixes = newFixes
|
||||
.filterNot { it.id in firstPartOfChanges }
|
||||
val newUpdates = actualFixes
|
||||
.joinToString("") { "* [${it.id}](https://youtrack.jetbrains.com/issue/${it.id}) ${it.text}\n" }
|
||||
|
||||
changesBuilder.insert(insertOffset, newUpdates)
|
||||
if (actualFixes.isNotEmpty()) {
|
||||
changesFile.writeText(changesBuilder.toString())
|
||||
}
|
||||
}
|
||||
|
||||
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 lastSuccessfulCommit = System.getenv("SUCCESS_COMMIT")!!
|
||||
val hashesAndEmailes = git.log().call()
|
||||
.takeWhile {
|
||||
!it.id.name.equals(lastSuccessfulCommit, ignoreCase = true)
|
||||
}
|
||||
.associate { it.authorIdent.emailAddress to it.name }
|
||||
|
||||
println("Last successful commit: $lastSuccessfulCommit")
|
||||
println("Amount of commits: ${hashesAndEmailes.size}")
|
||||
println("Emails: ${hashesAndEmailes.keys}")
|
||||
val gitHub = org.kohsuke.github.GitHub.connect()
|
||||
val ghRepository = gitHub.getRepository("JetBrains/ideavim")
|
||||
val users = mutableSetOf<Author>()
|
||||
println("Start emails processing")
|
||||
for ((email, hash) in hashesAndEmailes) {
|
||||
println("Processing '$email'...")
|
||||
if (email in uncheckedEmails) {
|
||||
println("Email '$email' is in unchecked emails. Skip it")
|
||||
continue
|
||||
}
|
||||
if ("dependabot[bot]@users.noreply.github.com" in email) {
|
||||
println("Email '$email' is from dependabot. Skip it")
|
||||
continue
|
||||
}
|
||||
val user = ghRepository.getCommit(hash).author
|
||||
val htmlUrl = user.htmlUrl.toString()
|
||||
val name = user.name ?: user.login
|
||||
users.add(Author(name, htmlUrl, email))
|
||||
}
|
||||
|
||||
println("Emails processed")
|
||||
val authorsFile = File("$projectDir/AUTHORS.md")
|
||||
val authors = authorsFile.readText()
|
||||
val parser =
|
||||
org.intellij.markdown.parser.MarkdownParser(org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor())
|
||||
val tree = parser.buildMarkdownTreeFromString(authors)
|
||||
|
||||
val contributorsSection = tree.children[24]
|
||||
val existingEmails = mutableSetOf<String>()
|
||||
for (child in contributorsSection.children) {
|
||||
if (child.children.size > 1) {
|
||||
existingEmails.add(
|
||||
child.children[1].children[0].children[2].children[2].getTextInNode(authors).toString()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val newAuthors = users.filterNot { it.mail in existingEmails }
|
||||
if (newAuthors.isEmpty()) return
|
||||
|
||||
val authorNames = newAuthors.joinToString(", ") { it.name }
|
||||
println("::set-output name=authors::$authorNames")
|
||||
|
||||
val insertionString = newAuthors.toMdString()
|
||||
val resultingString = StringBuffer(authors).insert(contributorsSection.endOffset, insertionString).toString()
|
||||
|
||||
authorsFile.writeText(resultingString)
|
||||
}
|
||||
|
||||
fun List<Author>.toMdString(): String {
|
||||
return this.joinToString {
|
||||
"""
|
||||
|
|
||||
|* [![icon][mail]](mailto:${it.mail})
|
||||
| [![icon][github]](${it.url})
|
||||
|
|
||||
| ${it.name}
|
||||
""".trimMargin()
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
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
|
||||
|
||||
val changesFile = File("$projectDir/CHANGES.md")
|
||||
val changes = changesFile.readText()
|
||||
|
||||
val changesBuilder = StringBuilder(changes)
|
||||
val insertOffset = setupSection(changes, changesBuilder, "### Merged PRs:")
|
||||
|
||||
if (insertOffset < 50) error("Incorrect offset: $insertOffset")
|
||||
if (pullRequest.user.login == "dependabot[bot]") return
|
||||
|
||||
val prNumber = pullRequest.number
|
||||
val userName = pullRequest.user.name
|
||||
val login = pullRequest.user.login
|
||||
val title = pullRequest.title
|
||||
val section =
|
||||
"* [$prNumber](https://github.com/JetBrains/ideavim/pull/$prNumber) by [$userName](https://github.com/$login): $title\n"
|
||||
changesBuilder.insert(insertOffset, section)
|
||||
|
||||
changesFile.writeText(changesBuilder.toString())
|
||||
}
|
||||
|
||||
fun setupSection(
|
||||
changes: String,
|
||||
authorsBuilder: StringBuilder,
|
||||
sectionName: String,
|
||||
): Int {
|
||||
val parser =
|
||||
org.intellij.markdown.parser.MarkdownParser(org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor())
|
||||
val tree = parser.buildMarkdownTreeFromString(changes)
|
||||
|
||||
var idx = -1
|
||||
for (index in tree.children.indices) {
|
||||
if (tree.children[index].getTextInNode(changes).startsWith("## ")) {
|
||||
idx = index
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
val hasToBeReleased = tree.children[idx].getTextInNode(changes).contains("To Be Released")
|
||||
return if (hasToBeReleased) {
|
||||
var mrgIdx = -1
|
||||
for (index in (idx + 1) until tree.children.lastIndex) {
|
||||
val textInNode = tree.children[index].getTextInNode(changes)
|
||||
val foundIndex = textInNode.startsWith(sectionName)
|
||||
if (foundIndex) {
|
||||
var filledPr = index + 2
|
||||
while (tree.children[filledPr].getTextInNode(changes).startsWith("*")) {
|
||||
filledPr++
|
||||
}
|
||||
mrgIdx = tree.children[filledPr].startOffset + 1
|
||||
break
|
||||
} else {
|
||||
val currentSectionIndex = sections.indexOf(sectionName)
|
||||
val insertHere = textInNode.startsWith("## ") ||
|
||||
textInNode.startsWith("### ") &&
|
||||
sections.indexOfFirst { textInNode.startsWith(it) }
|
||||
.let { if (it < 0) false else it > currentSectionIndex }
|
||||
if (insertHere) {
|
||||
val section = """
|
||||
$sectionName
|
||||
|
||||
|
||||
""".trimIndent()
|
||||
authorsBuilder.insert(tree.children[index].startOffset, section)
|
||||
mrgIdx = tree.children[index].startOffset + (section.length - 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
mrgIdx
|
||||
} else {
|
||||
val section = """
|
||||
## To Be Released
|
||||
|
||||
$sectionName
|
||||
|
||||
|
||||
""".trimIndent()
|
||||
authorsBuilder.insert(tree.children[idx].startOffset, section)
|
||||
tree.children[idx].startOffset + (section.length - 1)
|
||||
}
|
||||
}
|
||||
|
||||
val sections = listOf(
|
||||
"### Features:",
|
||||
"### Changes:",
|
||||
"### Fixes:",
|
||||
"### Merged PRs:",
|
||||
)
|
6
config/ktlint/baseline.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<baseline version="1.0">
|
||||
<file name="src/main/java/com/maddyhome/idea/vim/listener/RiderSpecifics.kt">
|
||||
<error line="1" column="1" source="filename" />
|
||||
</file>
|
||||
</baseline>
|
1
doc
248
doc/Emulated-plugins.md
Normal file
@@ -0,0 +1,248 @@
|
||||
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)
|
6
doc/Home.md
Normal file
@@ -0,0 +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]]
|
||||
- Docs about "select" mode in vim: [[select mode|Select-mode]]
|
73
doc/NERDTree-support.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# NERDTree
|
||||
|
||||
IdeaVim supports emulation of the NERDTree plugin. Update your `~/.ideavimrc` to turn it on:
|
||||
```vim
|
||||
Plug 'preservim/nerdtree`
|
||||
```
|
||||
or
|
||||
```vim
|
||||
set NERDTree
|
||||
```
|
||||
Use `set noNERDTree` to disable this extension.
|
||||
|
||||
<details>
|
||||
<summary>Full list of aliases</summary>
|
||||
|
||||
```vim
|
||||
set NERDTree
|
||||
Plug 'preservim/nerdtree`
|
||||
Plug 'https://github.com/preservim/nerdtree'
|
||||
Plug 'https://github.com/scrooloose/nerdtree'
|
||||
Plug 'scrooloose/nerdtree'
|
||||
Plug 'nerdtree'
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
### Preview
|
||||
|
||||
<details>
|
||||
<summary>Click to the the preview</summary>
|
||||
<img src="images/nerdtree.gif" alt="NERDTree example"/>
|
||||
</details>
|
||||
|
||||
### Supported commands
|
||||
|
||||
- `:NERDTree`
|
||||
- `:NERDTreeFocus`
|
||||
- `:NERDTreeToggle`
|
||||
- `:NERDTreeClose`
|
||||
- `:NERDTreeFind`
|
||||
- `:NERDTreeRefreshRoot`
|
||||
|
||||
| Key | Description | Map Setting |
|
||||
|---------|---------------------------------------------------------|--------------------------------|
|
||||
| `o` | Open files, directories and bookmarks | `g:NERDTreeMapActivateNode` |
|
||||
| `go` | Open selected file, but leave cursor in the NERDTree | `g:NERDTreeMapPreview` |
|
||||
| `t` | Open selected node/bookmark in a new tab | `g:NERDTreeMapOpenInTab` |
|
||||
| `T` | Same as 't' but keep the focus on the current tab | `g:NERDTreeMapOpenInTabSilent` |
|
||||
| `i` | Open selected file in a split window | `g:NERDTreeMapOpenSplit` |
|
||||
| `gi` | Same as i, but leave the cursor on the NERDTree | `g:NERDTreeMapPreviewSplit` |
|
||||
| `s` | Open selected file in a new vsplit | `g:NERDTreeMapOpenVSplit` |
|
||||
| `gs` | Same as s, but leave the cursor on the NERDTree | `g:NERDTreeMapPreviewVSplit` |
|
||||
| `O` | Recursively open the selected directory | `g:NERDTreeMapOpenRecursively` |
|
||||
| `x` | Close the current nodes parent | `g:NERDTreeMapCloseDir` |
|
||||
| `X` | Recursively close all children of the current node | `g:NERDTreeMapCloseChildren` |
|
||||
| `P` | Jump to the root node | `g:NERDTreeMapJumpRoot` |
|
||||
| `p` | Jump to current nodes parent | `g:NERDTreeMapJumpParent` |
|
||||
| `K` | Jump up inside directories at the current tree depth | `g:NERDTreeMapJumpFirstChild` |
|
||||
| `J` | Jump down inside directories at the current tree depth | `g:NERDTreeMapJumpLastChild` |
|
||||
| `<C-J>` | Jump down to next sibling of the current directory | `g:NERDTreeMapJumpNextSibling` |
|
||||
| `<C-K>` | Jump up to previous sibling of the current directory | `g:NERDTreeMapJumpPrevSibling` |
|
||||
| `r` | Recursively refresh the current directory | `g:NERDTreeMapRefresh` |
|
||||
| `R` | Recursively refresh the current root | `g:NERDTreeMapRefreshRoot` |
|
||||
| `m` | Display the NERDTree menu | `g:NERDTreeMapMenu` |
|
||||
| `q` | Close the NERDTree window | `g:NERDTreeMapQuit` |
|
||||
| `A` | Zoom (maximize/minimize) the NERDTree window | `g:NERDTreeMapToggleZoom` |
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
If you see the the file is opened automatically on every movement in the Project View (`j`, `k`, etc.)
|
||||
please make sure that you have "Open Files with Single click" disabled.
|
||||
|
||||
<img src="images/disable-one-click.png" alt="Disable one click"/>
|
24
doc/Select-mode.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# FAQ
|
||||
|
||||
## What is select mode?
|
||||
|
||||
This mode is where the selection works the same as system selection. When you start typing, the text in the selected area is removed and replaced by the new characters that are being typed in.
|
||||
|
||||
## Why is select mode enabled during refactoring?
|
||||
|
||||
With the help of the select mode, you can immediately enter the variable name during refactoring. You can go to the beginning or the end of a variable using the arrow keys. If you need to make more complex changes, you can always go back to normal mode with `<ESC>`.
|
||||
|
||||
## What if I want to use visual mode during refactoring?
|
||||
|
||||
Select mode is controlled by the `keymodel`, `selectmode` and `idearefactormode` options. Set `idearefactormode` to `visual` to adjust this behavior.
|
||||
`set idearefactormode=visual`
|
||||
|
||||
## What if I don't want to change the mode during refactoring?
|
||||
|
||||
`set idearefactormode=keep`
|
||||
|
||||
# See Also
|
||||
|
||||
* IdeaVim options: https://github.com/JetBrains/ideavim/blob/master/doc/set-commands.md
|
||||
* Vim documentation about select mode: https://vimhelp.org/visual.txt.html#Select-mode
|
||||
* Stackoverflow explanation: https://vi.stackexchange.com/questions/4891/what-is-the-select-mode-and-when-is-it-relevant-to-use-it
|
60
doc/ideajoin-examples.md
Normal file
@@ -0,0 +1,60 @@
|
||||
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:
|
||||
|
||||
```
|
||||
"Hello" + -> "Hello world"
|
||||
" world!"
|
||||
```
|
||||
|
||||
* Nested if's:
|
||||
|
||||
```
|
||||
if (a) { -> if (a && b) {
|
||||
if (b) { ...
|
||||
... }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* Comments:
|
||||
|
||||
```
|
||||
// Hello -> // Hello world
|
||||
// world
|
||||
```
|
||||
|
||||
* Remove braces from one line for / if / while:
|
||||
|
||||
```
|
||||
if (fail) { -> if (fail) return;
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
* Kotlin one line method:
|
||||
|
||||
```
|
||||
fun myNumber(): Int { -> fun myNumber(): Int = 42
|
||||
return 42
|
||||
}
|
||||
```
|
||||
|
||||
* Join declaration and initialization:
|
||||
|
||||
```
|
||||
int a; -> int a = 5;
|
||||
a = 5;
|
||||
```
|
||||
|
||||
* Chain call:
|
||||
|
||||
```
|
||||
sb.append("a"); -> sb.append("a").append("b");
|
||||
sb.append("b");
|
||||
```
|
||||
|
||||
And other features provided by the plugins.
|
BIN
doc/images/disable-one-click.png
Normal file
After Width: | Height: | Size: 223 KiB |
BIN
doc/images/nerdtree.gif
Normal file
After Width: | Height: | Size: 32 MiB |
140
doc/set-commands.md
Normal file
@@ -0,0 +1,140 @@
|
||||
List of Supported Set Commands
|
||||
==============================
|
||||
|
||||
The following `:set` commands can appear in `~/.ideavimrc` or be set manually in the command mode:
|
||||
|
||||
'clipboard' 'cb' clipboard options
|
||||
Standard clipboard options plus
|
||||
|
||||
`ideaput` (default on) - IdeaVim ONLY
|
||||
enable native idea paste action for put operations
|
||||
|
||||
'digraph' 'dg' enable the entering of digraphs in Insert mode
|
||||
'gdefault' 'gd' the ":substitute" flag 'g' is by default
|
||||
'history' 'hi' number of command-lines that are remembered
|
||||
'hlsearch' 'hls' highlight matches with the last search pattern
|
||||
'ignorecase' 'ic' ignore case in search patterns
|
||||
'iskeyword' 'isk' defines keywords for commands like 'w', '*', etc.
|
||||
'incsearch' 'is' show where search pattern typed so far matches
|
||||
|
||||
`keymodel` `km` String (default "continueselect,stopselect")
|
||||
|
||||
List of comma separated words, which enable special things that keys
|
||||
can do. These values can be used:
|
||||
startsel Using a shifted special[1] key starts selection (either
|
||||
Select mode or Visual mode, depending on "key" being
|
||||
present in 'selectmode').
|
||||
stopsel Using a NOT-shifted special[1] key stops selection.
|
||||
Automatically enables `stopselect` and `stopvisual`
|
||||
stopselect Using a NOT-shifted special[1] key stops - IdeaVim ONLY
|
||||
select mode and removes selection.
|
||||
stopvisual Using a NOT-shifted special[1] key stops - IdeaVim ONLY
|
||||
visual mode and removes selection.
|
||||
continueselect Using a shifted arrow key doesn't - IdeaVim ONLY
|
||||
start selection, but in select mode
|
||||
acts like startsel is enabled
|
||||
continuevisual Using a shifted arrow key doesn't - IdeaVim ONLY
|
||||
start selection, but in visual mode
|
||||
acts like startsel is enabled
|
||||
|
||||
'matchpairs' 'mps' pairs of characters that "%" can match
|
||||
'maxmapdepth' 'mmd' Maximum depth of mappings
|
||||
'more' 'more' When on, listings pause when the whole screen is filled.
|
||||
'nrformats' 'nf' number formats recognized for CTRL-A command
|
||||
'number' 'nu' print the line number in front of each line
|
||||
'relativenumber' 'rnu' show the line number relative to the line with
|
||||
the cursor
|
||||
'scroll' 'scr' lines to scroll with CTRL-U and CTRL-D
|
||||
'scrolljump' 'sj' minimum number of lines to scroll
|
||||
'scrolloff' 'so' minimum number of lines above and below the cursor
|
||||
'selection' 'sel' what type of selection to use
|
||||
|
||||
`selectmode` `slm` String (default "")
|
||||
|
||||
This is a comma-separated list of words, which specify when to start
|
||||
Select mode instead of Visual mode, when a selection is started.
|
||||
Possible values:
|
||||
mouse when using the mouse
|
||||
key when using shifted special[1] keys
|
||||
cmd when using "v", "V", or <C-V>
|
||||
ideaselection when IDE sets a selection - IdeaVim ONLY
|
||||
(examples: extend selection, wrap with while, etc.)
|
||||
|
||||
`startofline` `sol` When "on" some commands move the cursor to the first non-blank of the line.
|
||||
When off the cursor is kept in the same column (if possible).
|
||||
|
||||
'showmode' 'smd' message on the status line to show current mode
|
||||
'showcmd' 'sc' show (partial) command in the status bar
|
||||
'sidescroll' 'ss' minimum number of columns to scroll horizontally
|
||||
'sidescrolloff' 'siso' min. number of columns to left and right of cursor
|
||||
'smartcase' 'scs' no ignore case when pattern is uppercase
|
||||
'timeout' 'to' use timeout for mapped key sequences
|
||||
'timeoutlen' 'tm' timeout duration for a mapped key sequence
|
||||
'undolevels' 'ul' maximum number of changes that can be undone
|
||||
'viminfo' 'vi' information to remember after restart
|
||||
'visualbell' 'vb' use visual bell instead of beeping
|
||||
'wrapscan' 'ws' searches wrap around the end of file
|
||||
|
||||
|
||||
|
||||
IdeaVim only commands:
|
||||
|
||||
`ideamarks` `ideamarks` Boolean (default true)
|
||||
|
||||
If true, creation of global mark will trigger creation of IDE's bookmark
|
||||
and vice versa.
|
||||
|
||||
`idearefactormode` `idearefactormode` String(default "select")
|
||||
|
||||
Define the mode that would be enabled during
|
||||
the refactoring (renaming, live template, introduce variable, etc)
|
||||
|
||||
Use one of the following values:
|
||||
- keep - keep the mode that was enabled before starting a refactoring
|
||||
- select - start refactoring in select mode
|
||||
- visual - start refactoring in visual mode
|
||||
|
||||
This option has effect if you are in normal, insert or replace mode before refactoring start.
|
||||
Visual or select mode are not changed.
|
||||
|
||||
|
||||
`ideajoin` `ideajoin` Boolean (default false)
|
||||
|
||||
If true, join command will be performed via IDE
|
||||
See wiki/`ideajoin` examples
|
||||
|
||||
`ideastatusicon` `ideastatusicon` String(default "enabled")
|
||||
|
||||
Define the behavior of IdeaVim icon in the status bar.
|
||||
|
||||
Use one of the following values:
|
||||
- enabled - icon is shown in the status bar
|
||||
- gray - use the gray version of the icon
|
||||
- disabled - hide the icon
|
||||
|
||||
`ideawrite` `ideawrite` String (default "all")
|
||||
"file" or "all". Defines the behaviour of ":w" command.
|
||||
Value "all" enables execution of ":wa" (save all) command on ":w" (save).
|
||||
This feature exists because some IJ options like "Prettier on save" or "ESlint on save"
|
||||
work only with "save all" action. If this option is set to "all", these actions work
|
||||
also with ":w" command.
|
||||
|
||||
`lookupkeys` `lookupkeys` List of strings
|
||||
|
||||
List of keys that should be processed by the IDE during the active lookup (autocompletion).
|
||||
For example, <Tab> and <Enter> are used by the IDE to finish the lookup,
|
||||
but <C-W> should be passed to IdeaVim.
|
||||
Default value:
|
||||
"<Tab>", "<Down>", "<Up>", "<Enter>", "<Left>", "<Right>",
|
||||
"<C-Down>", "<C-Up>", "<PageUp>", "<PageDown>",
|
||||
"<C-J>", "<C-Q>"
|
||||
|
||||
`ideavimsupport` `ideavimsupport` List of strings (default "dialog")
|
||||
|
||||
Define the list of additional buffers where IdeaVim is enabled.
|
||||
|
||||
- dialog - enable IdeaVim in dialogs
|
||||
- singleline - enable IdeaVim in single line editors (not suggested)
|
||||
|
||||
----------
|
||||
[1] - cursor keys, <End>, <Home>, <PageUp> and <PageDown>
|
34
doc/sethandler.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Configuring conflicting keys via .ideavimrc
|
||||
|
||||
IdeaVim allows defining handlers for the shortcuts that exist for both IDE and Vim (e.g. `<C-C>`).
|
||||
|
||||
```vim
|
||||
" Use ctrl-c as an ide shortcut in normal and visual modes
|
||||
sethandler <C-C> n-v:ide i:vim
|
||||
```
|
||||
|
||||
This option consist of an optional shortcut and a list of space separated list of handlers:
|
||||
`mode-list:handler mode-list:handler ...`
|
||||
The `mode-list` is a dash separated list of modes that is similar to `guicursor` notation
|
||||
and defines the following modes:
|
||||
- n - normal mode
|
||||
- i - insert mode
|
||||
- x - visual mode
|
||||
- v - visual and select modes
|
||||
- a - all modes
|
||||
|
||||
The `handler` is an argument that may accept the following values:
|
||||
- ide - use IDE handler
|
||||
- vim - use Vim handler
|
||||
|
||||
Examples:
|
||||
- `n:ide` - use IDE handler in normal mode
|
||||
- `i-v:vim` - use Vim handler in normal, visual, and select modes
|
||||
- `a:ide` - use IDE handler in all modes
|
||||
|
||||
By using `sethandler` you can define handlers:
|
||||
- For a single shortcut: `sethandler <C-A> n:vim i-x:ide` - use Vim handler in normal mode and IDE handler in insert and visual modes,
|
||||
- For all shortcuts: `sethandler n:vim i:ide` - use Vim handlers in normal mode and IDE handlers in insert mode.
|
||||
|
||||
If the definition of the handler is missing for some mode, it defaults to `vim`:
|
||||
`sethandler <C-X> i:ide` - use IDE handler in insert mode and Vim handler in all other modes.
|
@@ -1,13 +1,19 @@
|
||||
# suppress inspection "UnusedProperty" for whole file
|
||||
|
||||
ideaVersion=LATEST-EAP-SNAPSHOT
|
||||
ideaVersion=2022.2.2
|
||||
downloadIdeaSources=true
|
||||
instrumentPluginCode=true
|
||||
version=SNAPSHOT
|
||||
javaVersion=1.8
|
||||
kotlinVersion=1.3.71
|
||||
publishUsername=username
|
||||
version=chylex-13
|
||||
javaVersion=17
|
||||
remoteRobotVersion=0.11.15
|
||||
antlrVersion=4.10.1
|
||||
|
||||
# Please don't forget to update kotlin version in buildscript section
|
||||
kotlinVersion=1.6.21
|
||||
publishToken=token
|
||||
publishChannels=eap
|
||||
|
||||
slackUrl=
|
||||
|
||||
# Gradle settings
|
||||
org.gradle.jvmargs='-Dfile.encoding=UTF-8'
|
||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
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-6.8-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
269
gradlew
vendored
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env sh
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -17,67 +17,101 @@
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
APP_BASE_NAME=${0##*/}
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
@@ -106,80 +140,95 @@ location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=`save "$@"`
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
79982
qodana.sarif.json
Normal file
25
qodana.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
version: 1.0
|
||||
profile:
|
||||
name: Qodana
|
||||
include:
|
||||
- name: CheckDependencyLicenses
|
||||
exclude:
|
||||
- name: MoveVariableDeclarationIntoWhen
|
||||
- name: PluginXmlValidity
|
||||
- name: RedundantThrows
|
||||
- name: SuperTearDownInFinally
|
||||
- name: UnusedReturnValue
|
||||
- name: All
|
||||
paths:
|
||||
- build.gradle.kts
|
||||
- gradle/wrapper/gradle-wrapper.properties
|
||||
- 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/VimscriptListener.java
|
||||
- src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptLexer.java
|
||||
- src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptParser.java
|
||||
- src/main/java/com/maddyhome/idea/vim/vimscript/parser/generated/VimscriptVisitor.java
|
@@ -1,23 +0,0 @@
|
||||
<idea-plugin>
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.MotionGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.ChangeGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.CommandGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.MarkGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.RegisterGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.FileGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.SearchGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.ProcessGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.MacroGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.DigraphGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.HistoryGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.KeyGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.WindowGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.EditorGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.visual.VisualMotionGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.YankGroup"/>
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.copy.PutGroup"/>
|
||||
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.group.NotificationService"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
@@ -1,71 +0,0 @@
|
||||
<idea-plugin>
|
||||
<extensions defaultExtensionNs="IdeaVIM">
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ActionListHandler" names="actionlist"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.AsciiHandler" names="as[cii]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CmdFilterHandler" names="!"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CmdHandler" names="com[mand]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CmdClearHandler" names="comc[lear]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.CopyTextHandler" names="co[py],t"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DelCmdHandler" names="delc[ommand]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DeleteLinesHandler" names="d[elete]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DeleteMarksHandler" names="delm[arks]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DigraphHandler" names="dig[raphs]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.DumpLineHandler" names="dump[line]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.EditFileHandler" names="bro[wse],e[dit]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ActionHandler" names="action"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.EchoHandler" names="ec[ho]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ExitHandler" names="qa[ll],quita[ll],wqa[ll],xa[ll]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FileHandler" names="f[ile]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FindClassHandler" names="cla[ss]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FindFileHandler" names="fin[d]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.FindSymbolHandler" names="sym[bol]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.GotoCharacterHandler" names="go[to]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.HelpHandler" names="h[elp]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.HistoryHandler" names="his[tory]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.JoinLinesHandler" names="j[oin]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.JumpsHandler" names="ju[mps]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.LetHandler" names="let"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.mapping.MapHandler"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.mapping.UnMapHandler"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.mapping.MapClearHandler"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MarkHandler" names="ma[rk],k"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MarksHandler" names="marks"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.MoveTextHandler" names="m[ove]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.NextFileHandler" names="n[ext]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.NoHLSearchHandler" names="noh[lsearch]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.OnlyHandler" names="on[ly]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PreviousFileHandler" names="N[ext],prev[ious]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PromptFindHandler" names="pro[mptfind]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PromptReplaceHandler" names="promptr[epl]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PutLinesHandler" names="pu[t]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.QuitHandler" names="q[uit],clo[se],hid[e]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.RedoHandler" names="red[o]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.RegistersHandler" names="di[splay],reg[isters]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.RepeatHandler" names="@"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SelectFileHandler" names="argu[ment]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SelectFirstFileHandler" names="fir[st],rew[ind]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SelectLastFileHandler" names="la[st]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SetHandler" names="se[t]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ShiftLeftHandler"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ShiftRightHandler"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SourceHandler" names="so[urce]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SortHandler" names="sor[t]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SplitHandler" names="vs[plit],sp[lit]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.SubstituteHandler" names="s[ubstitute],&,~"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.UndoHandler" names="u[ndo]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteAllHandler" names="wa[ll]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteHandler" names="w[rite]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteNextFileHandler" names="wn[ext]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WritePreviousFileHandler" names="wN[ext],wp[revious]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.WriteQuitHandler" names="wq,exi[t],x[it]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.YankLinesHandler" names="y[ank]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.ShellHandler" names="sh[ell]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.NextTabHandler" names="tabn[ext]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PreviousTabHandler" names="tabp[revious],tabN[ext]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.TabOnlyHandler" names="tabo[nly]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.TabCloseHandler" names="tabc[lose]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.BufferListHandler" names="buffers,ls,files"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.BufferHandler" names="b[uffer]"/>
|
||||
<vimExCommand implementation="com.maddyhome.idea.vim.ex.handler.PlugHandler" names="Plug[in]"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
@@ -1,120 +0,0 @@
|
||||
<idea-plugin url="https://plugins.jetbrains.com/plugin/164" xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<name>IdeaVim</name>
|
||||
<id>IdeaVIM</id>
|
||||
<change-notes><![CDATA[
|
||||
<h3>Features:</h3>
|
||||
<ul>
|
||||
<li>Support <code>NERDTree</code> extension <a href="https://youtrack.jetbrains.com/issue/VIM-1042">VIM-1042</a> | <a
|
||||
href="https://github.com/preservim/nerdtree">NERDTree</a></li>
|
||||
<li>Support <code>maxmapdepth</code> option to define the maximum depth of mappings</li>
|
||||
</ul>
|
||||
|
||||
<h3>Fixes:</h3>
|
||||
<ul>
|
||||
<li><a href="https://youtrack.jetbrains.com/issue/VIM-2202">VIM-2202</a> Fix macro recording for ex command and search
|
||||
</li>
|
||||
<li><a href="https://youtrack.jetbrains.com/issue/VIM-1799">VIM-1799</a>
|
||||
<a href="https://youtrack.jetbrains.com/issue/VIM-179a">VIM-1794</a>
|
||||
Special characters are not interpreted on yanking
|
||||
</li>
|
||||
</ul>
|
||||
]]>
|
||||
</change-notes>
|
||||
<description><![CDATA[
|
||||
<p>Vim emulation plugin for IntelliJ Platform-based IDEs.</p>
|
||||
<br/>
|
||||
<p>IdeaVim supports many Vim features including normal/insert/visual modes, motion keys, deletion/changing,
|
||||
marks, registers, some Ex commands, Vim regexps, configuration via ~/.ideavimrc, macros, Vim plugins, etc.</p>
|
||||
<br/>
|
||||
<p>See also:</p>
|
||||
<ul>
|
||||
<li><a href="https://github.com/JetBrains/ideavim">GitHub repository</a>: documentation and contributing</li>
|
||||
<li><a href="https://youtrack.jetbrains.com/issues/VIM">Issue tracker</a>: feature requests and bug reports</li>
|
||||
</ul>
|
||||
]]></description>
|
||||
<version>SNAPSHOT</version>
|
||||
<vendor>JetBrains</vendor>
|
||||
|
||||
<!-- Please search for "[VERSION UPDATE]" in project in case you update the since-build version -->
|
||||
<!-- Check for [Version Update] tag in YouTrack as well -->
|
||||
<idea-version since-build="202.5103.13"/>
|
||||
|
||||
<!-- Mark the plugin as compatible with RubyMine and other products based on the IntelliJ platform -->
|
||||
<depends>com.intellij.modules.lang</depends>
|
||||
<resource-bundle>messages.IdeaVimBundle</resource-bundle>
|
||||
|
||||
<application-components>
|
||||
<component>
|
||||
<implementation-class>com.maddyhome.idea.vim.DynamicLoaderStopper</implementation-class>
|
||||
</component>
|
||||
</application-components>
|
||||
|
||||
<extensionPoints>
|
||||
<extensionPoint name="vimExtension" beanClass="com.maddyhome.idea.vim.extension.ExtensionBeanClass" dynamic="true">
|
||||
<with attribute="implementation" implements="com.maddyhome.idea.vim.extension.VimExtension"/>
|
||||
|
||||
</extensionPoint>
|
||||
|
||||
<!-- For internal use only -->
|
||||
<extensionPoint name="vimExCommand" beanClass="com.maddyhome.idea.vim.ex.ExBeanClass" dynamic="true">
|
||||
<with attribute="implementation" implements="com.maddyhome.idea.vim.ex.CommandHandler"/>
|
||||
</extensionPoint>
|
||||
<!-- For internal use only -->
|
||||
<extensionPoint name="vimAction" beanClass="com.maddyhome.idea.vim.handler.ActionBeanClass" dynamic="true">
|
||||
<with attribute="implementation" implements="com.maddyhome.idea.vim.handler.EditorActionHandlerBase"/>
|
||||
</extensionPoint>
|
||||
</extensionPoints>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<applicationConfigurable groupId="editor" instance="com.maddyhome.idea.vim.ui.VimEmulationConfigurable"/>
|
||||
<projectService serviceImplementation="com.maddyhome.idea.vim.group.NotificationService"/>
|
||||
<statusBarWidgetFactory implementation="com.maddyhome.idea.vim.ui.StatusBarIconFactory"/>
|
||||
<statusBarWidgetFactory implementation="com.maddyhome.idea.vim.ui.ShowCmdStatusBarWidgetFactory" order="first"/>
|
||||
|
||||
<applicationService serviceImplementation="com.maddyhome.idea.vim.VimPlugin"/>
|
||||
|
||||
<!-- Initialise as early as possible so that we're ready to edit quickly. This is especially important for Rider,
|
||||
which (at least for 2020.1) has some long running activities that block other startup extensions. None of the
|
||||
core platform activities have IDs, so we can't use "before ID". We have to use "first" -->
|
||||
<postStartupActivity implementation="com.maddyhome.idea.vim.PluginStartup" order="first"/>
|
||||
|
||||
<editorFloatingToolbarProvider implementation="com.maddyhome.idea.vim.ui.ReloadFloatingToolbar"/>
|
||||
|
||||
<actionPromoter implementation="com.maddyhome.idea.vim.key.VimActionsPromoter" order="last"/>
|
||||
</extensions>
|
||||
|
||||
<xi:include href="/META-INF/includes/ApplicationServices.xml" xpointer="xpointer(/idea-plugin/*)"/>
|
||||
<xi:include href="/META-INF/includes/VimActions.xml" xpointer="xpointer(/idea-plugin/*)"/>
|
||||
<xi:include href="/META-INF/includes/VimExCommands.xml" xpointer="xpointer(/idea-plugin/*)"/>
|
||||
<xi:include href="/META-INF/includes/VimExtensions.xml" xpointer="xpointer(/idea-plugin/*)"/>
|
||||
<xi:include href="/META-INF/includes/VimListeners.xml" xpointer="xpointer(/idea-plugin/*)"/>
|
||||
|
||||
<actions resource-bundle="messages.IdeaVimBundle">
|
||||
<action id="VimPluginToggle" class="com.maddyhome.idea.vim.action.VimPluginToggleAction">
|
||||
<add-to-group group-id="ToolsMenu" anchor="last"/>
|
||||
</action>
|
||||
|
||||
<!-- Internal -->
|
||||
<action id="VimInternalAddBlockInlays" class="com.maddyhome.idea.vim.action.internal.AddBlockInlaysAction" text="Add Test Block Inlays | IdeaVim Internal" internal="true"/>
|
||||
<action id="VimInternalAddInlineInlays" class="com.maddyhome.idea.vim.action.internal.AddInlineInlaysAction" text="Add Test Inline Inlays | IdeaVim Internal" internal="true"/>
|
||||
|
||||
<action id="VimShortcutKeyAction" class="com.maddyhome.idea.vim.action.VimShortcutKeyAction"/>
|
||||
<action id="VimActions" class="com.maddyhome.idea.vim.ui.VimActions"/>
|
||||
|
||||
<!-- [Version Update] 202+ use-shortcut-of="ExternalSystem.ProjectRefreshAction" -->
|
||||
<group id="IdeaVim.ReloadVimRc.group" class="com.maddyhome.idea.vim.ui.ReloadFloatingToolbarActionGroup">
|
||||
<action id="IdeaVim.ReloadVimRc.reload" class="com.maddyhome.idea.vim.ui.ReloadVimRc">
|
||||
<keyboard-shortcut first-keystroke="control shift O" keymap="$default"/>
|
||||
<keyboard-shortcut first-keystroke="control shift O" keymap="Eclipse" remove="true"/>
|
||||
<keyboard-shortcut first-keystroke="control shift O" keymap="NetBeans 6.5" remove="true"/>
|
||||
<keyboard-shortcut first-keystroke="control shift O" keymap="Visual Studio" remove="true"/>
|
||||
<keyboard-shortcut first-keystroke="meta shift O" keymap="Mac OS X" replace-all="true"/>
|
||||
<keyboard-shortcut first-keystroke="meta shift O" keymap="Eclipse (Mac OS X)" replace-all="true" remove="true"/>
|
||||
<keyboard-shortcut first-keystroke="meta shift O" keymap="Xcode" replace-all="true" remove="true"/>
|
||||
<keyboard-shortcut first-keystroke="meta shift I" keymap="Mac OS X 10.5+" replace-all="true"/>
|
||||
</action>
|
||||
</group>
|
||||
|
||||
<action id="VimFindActionIdAction" class="com.maddyhome.idea.vim.listener.FindActionIdAction"/>
|
||||
</actions>
|
||||
</idea-plugin>
|
Before Width: | Height: | Size: 22 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
|
||||
<path
|
||||
d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 824 B |
Before Width: | Height: | Size: 2.1 MiB |
@@ -1,19 +1,13 @@
|
||||
/*
|
||||
* 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'
|
||||
|
||||
|
@@ -1,972 +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;
|
||||
|
||||
import com.intellij.ide.DataManager;
|
||||
import com.intellij.ide.IdeEventQueue;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.application.Application;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.command.UndoConfirmationPolicy;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.actionSystem.ActionPlan;
|
||||
import com.intellij.openapi.editor.actionSystem.DocCommandGroupId;
|
||||
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.ListPopup;
|
||||
import com.maddyhome.idea.vim.action.change.VimRepeater;
|
||||
import com.maddyhome.idea.vim.action.change.insert.InsertCompletedDigraphAction;
|
||||
import com.maddyhome.idea.vim.action.change.insert.InsertCompletedLiteralAction;
|
||||
import com.maddyhome.idea.vim.action.macro.ToggleRecordingAction;
|
||||
import com.maddyhome.idea.vim.command.*;
|
||||
import com.maddyhome.idea.vim.group.ChangeGroup;
|
||||
import com.maddyhome.idea.vim.group.RegisterGroup;
|
||||
import com.maddyhome.idea.vim.group.visual.VisualGroupKt;
|
||||
import com.maddyhome.idea.vim.handler.ActionBeanClass;
|
||||
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
|
||||
import com.maddyhome.idea.vim.helper.*;
|
||||
import com.maddyhome.idea.vim.key.*;
|
||||
import com.maddyhome.idea.vim.option.OptionsManager;
|
||||
import com.maddyhome.idea.vim.ui.ShowCmd;
|
||||
import com.maddyhome.idea.vim.ui.ex.ExEntryPanel;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.intellij.openapi.actionSystem.CommonDataKeys.*;
|
||||
import static com.intellij.openapi.actionSystem.PlatformDataKeys.PROJECT_FILE_DIRECTORY;
|
||||
|
||||
/**
|
||||
* This handles every keystroke that the user can argType except those that are still valid hotkeys for various Idea
|
||||
* actions. This is a singleton.
|
||||
*/
|
||||
public class KeyHandler {
|
||||
/**
|
||||
* Returns a reference to the singleton instance of this class
|
||||
*
|
||||
* @return A reference to the singleton
|
||||
*/
|
||||
public static @NotNull KeyHandler getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new KeyHandler();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance
|
||||
*/
|
||||
private KeyHandler() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the original key handler
|
||||
*
|
||||
* @param origHandler The original key handler
|
||||
*/
|
||||
public void setOriginalHandler(TypedActionHandler origHandler) {
|
||||
this.origHandler = origHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the original key handler
|
||||
*
|
||||
* @return The original key handler
|
||||
*/
|
||||
public TypedActionHandler getOriginalHandler() {
|
||||
return origHandler;
|
||||
}
|
||||
|
||||
public static void executeVimAction(@NotNull Editor editor,
|
||||
@NotNull EditorActionHandlerBase cmd,
|
||||
DataContext context) {
|
||||
CommandProcessor.getInstance()
|
||||
.executeCommand(editor.getProject(), () -> cmd.execute(editor, getProjectAwareDataContext(editor, context)),
|
||||
cmd.getId(), DocCommandGroupId.noneGroupId(editor.getDocument()), UndoConfirmationPolicy.DEFAULT,
|
||||
editor.getDocument());
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute an action
|
||||
*
|
||||
* @param action The action to execute
|
||||
* @param context The context to run it in
|
||||
*/
|
||||
public static boolean executeAction(@NotNull AnAction action, @NotNull DataContext context) {
|
||||
final AnActionEvent event =
|
||||
new AnActionEvent(null, context, ActionPlaces.ACTION_SEARCH, action.getTemplatePresentation(),
|
||||
ActionManager.getInstance(), 0);
|
||||
|
||||
if (action instanceof ActionGroup && !((ActionGroup)action).canBePerformed(context)) {
|
||||
// Some ActionGroups should not be performed, but shown as a popup
|
||||
ListPopup popup = JBPopupFactory.getInstance()
|
||||
.createActionGroupPopup(event.getPresentation().getText(), (ActionGroup)action, context, false, null, -1);
|
||||
|
||||
Component component = context.getData(PlatformDataKeys.CONTEXT_COMPONENT);
|
||||
if (component != null) {
|
||||
Window window = SwingUtilities.getWindowAncestor(component);
|
||||
if (window != null) {
|
||||
popup.showInCenterOf(window);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
popup.showInFocusCenter();
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
// beforeActionPerformedUpdate should be called to update the action. It fixes some rider-specific problems.
|
||||
// because rider use async update method. See VIM-1819.
|
||||
action.beforeActionPerformedUpdate(event);
|
||||
if (event.getPresentation().isEnabled()) {
|
||||
action.actionPerformed(event);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the main key handler for the Vim plugin. Every keystroke not handled directly by Idea is sent here for
|
||||
* processing.
|
||||
*
|
||||
* @param editor The editor the key was typed into
|
||||
* @param key The keystroke typed by the user
|
||||
* @param context The data context
|
||||
*/
|
||||
public void handleKey(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context) {
|
||||
handleKey(editor, key, context, true, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked before acquiring a write lock and actually handling the keystroke.
|
||||
* <p>
|
||||
* Drafts an optional {@link ActionPlan} that will be used as a base for zero-latency rendering in editor.
|
||||
*
|
||||
* @param editor The editor the key was typed into
|
||||
* @param key The keystroke typed by the user
|
||||
* @param context The data context
|
||||
* @param plan The current action plan
|
||||
*/
|
||||
public void beforeHandleKey(@NotNull Editor editor,
|
||||
@NotNull KeyStroke key,
|
||||
@NotNull DataContext context,
|
||||
@NotNull ActionPlan plan) {
|
||||
|
||||
final CommandState.Mode mode = CommandState.getInstance(editor).getMode();
|
||||
|
||||
if (mode == CommandState.Mode.INSERT || mode == CommandState.Mode.REPLACE) {
|
||||
VimPlugin.getChange().beforeProcessKey(editor, context, key, plan);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handling input keys with additional parameters
|
||||
*
|
||||
* @param allowKeyMappings - If we allow key mappings or not
|
||||
* @param mappingCompleted - if true, we don't check if the mapping is incomplete
|
||||
*
|
||||
* TODO mappingCompleted and recursionCounter - we should find a more beautiful way to use them
|
||||
*/
|
||||
public void handleKey(@NotNull Editor editor,
|
||||
@NotNull KeyStroke key,
|
||||
@NotNull DataContext context,
|
||||
boolean allowKeyMappings,
|
||||
boolean mappingCompleted) {
|
||||
if (handleKeyRecursionCount >= OptionsManager.INSTANCE.getMaxmapdepth().value()) {
|
||||
VimPlugin.showMessage(MessageHelper.message("E223"));
|
||||
VimPlugin.indicateError();
|
||||
return;
|
||||
}
|
||||
|
||||
VimPlugin.clearError();
|
||||
// All the editor actions should be performed with top level editor!!!
|
||||
// Be careful: all the EditorActionHandler implementation should correctly process InjectedEditors
|
||||
editor = HelperKt.getTopLevelEditor(editor);
|
||||
|
||||
final CommandState editorState = CommandState.getInstance(editor);
|
||||
final CommandBuilder commandBuilder = editorState.getCommandBuilder();
|
||||
|
||||
// If this is a "regular" character keystroke, get the character
|
||||
char chKey = key.getKeyChar() == KeyEvent.CHAR_UNDEFINED ? 0 : key.getKeyChar();
|
||||
|
||||
// We only record unmapped keystrokes. If we've recursed to handle mapping, don't record anything.
|
||||
boolean shouldRecord = handleKeyRecursionCount == 0 && editorState.isRecording();
|
||||
handleKeyRecursionCount++;
|
||||
|
||||
try {
|
||||
if (!allowKeyMappings || !handleKeyMapping(editor, key, context, mappingCompleted)) {
|
||||
if (isCommandCountKey(chKey, editorState)) {
|
||||
commandBuilder.addCountCharacter(key);
|
||||
} else if (isDeleteCommandCountKey(key, editorState)) {
|
||||
commandBuilder.deleteCountCharacter();
|
||||
} else if (isEditorReset(key, editorState)) {
|
||||
handleEditorReset(editor, key, context, editorState);
|
||||
}
|
||||
// If we got this far the user is entering a command or supplying an argument to an entered command.
|
||||
// First let's check to see if we are at the point of expecting a single character argument to a command.
|
||||
else if (isExpectingCharArgument(commandBuilder)) {
|
||||
handleCharArgument(key, chKey, editorState);
|
||||
}
|
||||
else if (editorState.getSubMode() == CommandState.SubMode.REGISTER_PENDING) {
|
||||
commandBuilder.addKey(key);
|
||||
handleSelectRegister(editorState, chKey);
|
||||
}
|
||||
// If we are this far, then the user must be entering a command or a non-single-character argument
|
||||
// to an entered command. Let's figure out which it is.
|
||||
else if (!handleDigraph(editor, key, context, editorState)) {
|
||||
// Ask the key/action tree if this is an appropriate key at this point in the command and if so,
|
||||
// return the node matching this keystroke
|
||||
final Node<ActionBeanClass> node = mapOpCommand(key, commandBuilder.getChildNode(key), editorState);
|
||||
|
||||
if (node instanceof CommandNode) {
|
||||
handleCommandNode(editor, context, key, (CommandNode<ActionBeanClass>) node, editorState);
|
||||
commandBuilder.addKey(key);
|
||||
} else if (node instanceof CommandPartNode) {
|
||||
commandBuilder.setCurrentCommandPartNode((CommandPartNode<ActionBeanClass>) node);
|
||||
commandBuilder.addKey(key);
|
||||
} else if (isSelectRegister(key, editorState)) {
|
||||
editorState.pushModes(CommandState.Mode.COMMAND, CommandState.SubMode.REGISTER_PENDING);
|
||||
commandBuilder.addKey(key);
|
||||
}
|
||||
else { // node == null
|
||||
|
||||
// If we are in insert/replace mode send this key in for processing
|
||||
if (editorState.getMode() == CommandState.Mode.INSERT || editorState.getMode() == CommandState.Mode.REPLACE) {
|
||||
shouldRecord &= VimPlugin.getChange().processKey(editor, context, key);
|
||||
} else if (editorState.getMode() == CommandState.Mode.SELECT) {
|
||||
shouldRecord &= VimPlugin.getChange().processKeyInSelectMode(editor, context, key);
|
||||
} else if (editorState.getMappingState().getMappingMode() == MappingMode.CMD_LINE) {
|
||||
shouldRecord &= VimPlugin.getProcess().processExKey(editor, key);
|
||||
}
|
||||
// If we get here then the user has entered an unrecognized series of keystrokes
|
||||
else {
|
||||
commandBuilder.setCommandState(CurrentCommandState.BAD_COMMAND);
|
||||
}
|
||||
|
||||
partialReset(editor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
handleKeyRecursionCount--;
|
||||
}
|
||||
|
||||
// Do we have a fully entered command at this point? If so, let's execute it.
|
||||
if (commandBuilder.isReady()) {
|
||||
executeCommand(editor, context, editorState);
|
||||
}
|
||||
else if (commandBuilder.isBad()) {
|
||||
editorState.resetOpPending();
|
||||
editorState.resetRegisterPending();
|
||||
VimPlugin.indicateError();
|
||||
reset(editor);
|
||||
}
|
||||
|
||||
// Don't record the keystroke that stops the recording (unmapped this is `q`)
|
||||
if (shouldRecord && editorState.isRecording()) {
|
||||
VimPlugin.getRegister().recordKeyStroke(key);
|
||||
}
|
||||
|
||||
// This will update immediately, if we're on the EDT (which we are)
|
||||
ShowCmd.INSTANCE.update();
|
||||
}
|
||||
|
||||
/**
|
||||
* See the description for {@link com.maddyhome.idea.vim.action.DuplicableOperatorAction}
|
||||
*/
|
||||
private Node<ActionBeanClass> mapOpCommand(KeyStroke key, Node<ActionBeanClass> node, @NotNull CommandState editorState) {
|
||||
if (editorState.isDuplicateOperatorKeyStroke(key)) {
|
||||
return editorState.getCommandBuilder().getChildNode(KeyStroke.getKeyStroke('_'));
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
public static <T> boolean isPrefix(@NotNull List<T> list1, @NotNull List<T> list2) {
|
||||
if (list1.size() > list2.size()) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < list1.size(); i++) {
|
||||
if (!list1.get(i).equals(list2.get(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void handleEditorReset(@NotNull Editor editor, @NotNull KeyStroke key, final @NotNull DataContext context, @NotNull CommandState editorState) {
|
||||
if (editorState.getCommandBuilder().isAtDefaultState()) {
|
||||
RegisterGroup register = VimPlugin.getRegister();
|
||||
if (register.getCurrentRegister() == register.getDefaultRegister()) {
|
||||
if (key.getKeyCode() == KeyEvent.VK_ESCAPE) {
|
||||
CommandProcessor.getInstance()
|
||||
.executeCommand(editor.getProject(), () -> KeyHandler.executeAction("EditorEscape", context), "", null);
|
||||
}
|
||||
VimPlugin.indicateError();
|
||||
}
|
||||
}
|
||||
reset(editor);
|
||||
ChangeGroup.resetCaret(editor, false);
|
||||
}
|
||||
|
||||
private boolean handleKeyMapping(final @NotNull Editor editor,
|
||||
final @NotNull KeyStroke key,
|
||||
final @NotNull DataContext context,
|
||||
boolean mappingCompleted) {
|
||||
|
||||
final CommandState commandState = CommandState.getInstance(editor);
|
||||
final MappingState mappingState = commandState.getMappingState();
|
||||
final CommandBuilder commandBuilder = commandState.getCommandBuilder();
|
||||
|
||||
if (commandBuilder.isAwaitingCharOrDigraphArgument()
|
||||
|| commandBuilder.isBuildingMultiKeyCommand()
|
||||
|| isMappingDisabledForKey(key, commandState)
|
||||
|| commandState.getSubMode() == CommandState.SubMode.REGISTER_PENDING) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mappingState.stopMappingTimer();
|
||||
|
||||
// Save the unhandled key strokes until we either complete or abandon the sequence.
|
||||
mappingState.addKey(key);
|
||||
|
||||
final KeyMapping mapping = VimPlugin.getKey().getKeyMapping(mappingState.getMappingMode());
|
||||
|
||||
// Returns true if any of these methods handle the key. False means that the key is unrelated to mapping and should
|
||||
// be processed as normal.
|
||||
return (handleUnfinishedMappingSequence(editor, mappingState, mapping, mappingCompleted))
|
||||
|| handleCompleteMappingSequence(editor, context, mappingState, mapping, key)
|
||||
|| handleAbandonedMappingSequence(editor, mappingState, context);
|
||||
}
|
||||
|
||||
private boolean isMappingDisabledForKey(@NotNull KeyStroke key, @NotNull CommandState commandState) {
|
||||
// "0" can be mapped, but the mapping isn't applied when entering a count. Other digits are always mapped, even when
|
||||
// entering a count.
|
||||
// See `:help :map-modes`
|
||||
return key.getKeyChar() == '0' && commandState.getCommandBuilder().getCount() > 0;
|
||||
}
|
||||
|
||||
private boolean handleUnfinishedMappingSequence(@NotNull Editor editor,
|
||||
@NotNull MappingState mappingState,
|
||||
@NotNull KeyMapping mapping,
|
||||
boolean mappingCompleted) {
|
||||
if (mappingCompleted) return false;
|
||||
|
||||
// Is there at least one mapping that starts with the current sequence? This does not include complete matches,
|
||||
// unless a sequence is also a prefix for another mapping. We eagerly evaluate the shortest mapping, so even if a
|
||||
// mapping is a prefix, it will get evaluated when the next character is entered.
|
||||
// Note that currentlyUnhandledKeySequence is the same as the state after commandState.getMappingKeys().add(key). It
|
||||
// would be nice to tidy ths up
|
||||
if (!mapping.isPrefix(mappingState.getKeys())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the timeout option is set, set a timer that will abandon the sequence and replay the unhandled keys unmapped.
|
||||
// Every time a key is pressed and handled, the timer is stopped. E.g. if there is a mapping for "dweri", and the
|
||||
// user has typed "dw" wait for the timeout, and then replay "d" and "w" without any mapping (which will of course
|
||||
// delete a word)
|
||||
final Application application = ApplicationManager.getApplication();
|
||||
if (OptionsManager.INSTANCE.getTimeout().isSet()) {
|
||||
mappingState.startMappingTimer(actionEvent -> application.invokeLater(() -> {
|
||||
|
||||
final List<KeyStroke> unhandledKeys = mappingState.detachKeys();
|
||||
|
||||
if (editor.isDisposed() || isPluginMapping(unhandledKeys)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (KeyStroke keyStroke : unhandledKeys) {
|
||||
handleKey(editor, keyStroke, EditorDataContext.init(editor, null), true, true);
|
||||
}
|
||||
}, ModalityState.stateForComponent(editor.getComponent())));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleCompleteMappingSequence(@NotNull Editor editor,
|
||||
@NotNull DataContext context,
|
||||
@NotNull MappingState mappingState,
|
||||
@NotNull KeyMapping mapping,
|
||||
KeyStroke key) {
|
||||
|
||||
// The current sequence isn't a prefix, check to see if it's a completed sequence.
|
||||
final MappingInfo currentMappingInfo = mapping.get(mappingState.getKeys());
|
||||
MappingInfo mappingInfo = currentMappingInfo;
|
||||
if (mappingInfo == null) {
|
||||
// It's an abandoned sequence, check to see if the previous sequence was a complete sequence.
|
||||
// TODO: This is incorrect behaviour
|
||||
// What about sequences that were completed N keys ago?
|
||||
// This should really be handled as part of an abandoned key sequence. We should also consolidate the replay
|
||||
// of cached keys - this happens in timeout, here and also in abandoned sequences.
|
||||
// Extract most of this method into handleMappingInfo. If we have a complete sequence, call it and we're done.
|
||||
// If it's not a complete sequence, handleAbandonedMappingSequence should do something like call
|
||||
// mappingState.detachKeys and look for the longest complete sequence in the returned list, evaluate it, and then
|
||||
// replay any keys not yet handled. NB: The actual implementation should be compared to Vim behaviour to see what
|
||||
// should actually happen.
|
||||
final ArrayList<KeyStroke> previouslyUnhandledKeySequence = new ArrayList<>();
|
||||
mappingState.getKeys().forEach(previouslyUnhandledKeySequence::add);
|
||||
if (previouslyUnhandledKeySequence.size() > 1) {
|
||||
previouslyUnhandledKeySequence.remove(previouslyUnhandledKeySequence.size() - 1);
|
||||
mappingInfo = mapping.get(previouslyUnhandledKeySequence);
|
||||
}
|
||||
}
|
||||
|
||||
if (mappingInfo == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mappingState.resetMappingSequence();
|
||||
|
||||
final EditorDataContext currentContext = EditorDataContext.init(editor, context);
|
||||
|
||||
mappingInfo.execute(editor, context);
|
||||
|
||||
// If we've just evaluated the previous key sequence, make sure to also handle the current key
|
||||
if (mappingInfo != currentMappingInfo) {
|
||||
handleKey(editor, key, currentContext, true, false);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleAbandonedMappingSequence(@NotNull Editor editor,
|
||||
@NotNull MappingState mappingState,
|
||||
DataContext context) {
|
||||
|
||||
// The user has terminated a mapping sequence with an unexpected key
|
||||
// E.g. if there is a mapping for "hello" and user enters command "help" the processing of "h", "e" and "l" will be
|
||||
// prevented by this handler. Make sure the currently unhandled keys are processed as normal.
|
||||
|
||||
final List<KeyStroke> unhandledKeyStrokes = mappingState.detachKeys();
|
||||
|
||||
// If there is only the current key to handle, do nothing
|
||||
if (unhandledKeyStrokes.size() == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Okay, look at the code below. Why is the first key handled separately?
|
||||
// Let's assume the next mappings:
|
||||
// - map ds j
|
||||
// - map I 2l
|
||||
// If user enters `dI`, the first `d` will be caught be this handler because it's a prefix for `ds` command.
|
||||
// After the user enters `I`, the caught `d` should be processed without mapping, and the rest of keys
|
||||
// should be processed with mappings (to make I work)
|
||||
|
||||
if (isPluginMapping(unhandledKeyStrokes)) {
|
||||
handleKey(editor, unhandledKeyStrokes.get(unhandledKeyStrokes.size() - 1), context, true, false);
|
||||
} else {
|
||||
handleKey(editor, unhandledKeyStrokes.get(0), context, false, false);
|
||||
|
||||
for (KeyStroke keyStroke : unhandledKeyStrokes.subList(1, unhandledKeyStrokes.size())) {
|
||||
handleKey(editor, keyStroke, context, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// The <Plug>mappings are not executed if they fail to map to something.
|
||||
// E.g.
|
||||
// - map <Plug>iA someAction
|
||||
// - map I <Plug>i
|
||||
// For `IA` someAction should be executed.
|
||||
// But if the user types `Ib`, `<Plug>i` won't be executed again. Only `b` will be passed to keyHandler.
|
||||
private boolean isPluginMapping(List<KeyStroke> unhandledKeyStrokes) {
|
||||
return unhandledKeyStrokes.get(0).equals(StringHelper.PlugKeyStroke);
|
||||
}
|
||||
|
||||
@SuppressWarnings("RedundantIfStatement")
|
||||
private boolean isCommandCountKey(char chKey, @NotNull CommandState editorState) {
|
||||
// Make sure to avoid handling '0' as the start of a count.
|
||||
final CommandBuilder commandBuilder = editorState.getCommandBuilder();
|
||||
boolean notRegisterPendingCommand = editorState.getMode() == CommandState.Mode.COMMAND &&
|
||||
editorState.getSubMode() != CommandState.SubMode.REGISTER_PENDING;
|
||||
boolean visualMode = editorState.getMode() == CommandState.Mode.VISUAL;
|
||||
boolean opPendingMode = editorState.getMode() == CommandState.Mode.OP_PENDING;
|
||||
if (notRegisterPendingCommand || visualMode || opPendingMode) {
|
||||
if (commandBuilder.isExpectingCount() &&
|
||||
Character.isDigit(chKey) &&
|
||||
(commandBuilder.getCount() > 0 || chKey != '0')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isDeleteCommandCountKey(@NotNull KeyStroke key, @NotNull CommandState editorState) {
|
||||
// See `:help N<Del>`
|
||||
final CommandBuilder commandBuilder = editorState.getCommandBuilder();
|
||||
return (editorState.getMode() == CommandState.Mode.COMMAND ||
|
||||
editorState.getMode() == CommandState.Mode.VISUAL ||
|
||||
editorState.getMode() == CommandState.Mode.OP_PENDING) &&
|
||||
commandBuilder.isExpectingCount() &&
|
||||
commandBuilder.getCount() > 0 &&
|
||||
key.getKeyCode() == KeyEvent.VK_DELETE;
|
||||
}
|
||||
|
||||
private boolean isEditorReset(@NotNull KeyStroke key, @NotNull CommandState editorState) {
|
||||
return editorState.getMode() == CommandState.Mode.COMMAND && StringHelper.isCloseKeyStroke(key);
|
||||
}
|
||||
|
||||
private boolean isSelectRegister(@NotNull KeyStroke key, @NotNull CommandState editorState) {
|
||||
if (editorState.getMode() != CommandState.Mode.COMMAND && editorState.getMode() != CommandState.Mode.VISUAL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (editorState.getSubMode() == CommandState.SubMode.REGISTER_PENDING) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return key.getKeyChar() == '"' && !editorState.isOperatorPending() && editorState.getCommandBuilder().getExpectedArgumentType() == null;
|
||||
}
|
||||
|
||||
private void handleSelectRegister(@NotNull CommandState commandState, char chKey) {
|
||||
commandState.resetRegisterPending();
|
||||
if (VimPlugin.getRegister().isValid(chKey)) {
|
||||
commandState.getCommandBuilder().pushCommandPart(chKey);
|
||||
}
|
||||
else {
|
||||
commandState.getCommandBuilder().setCommandState(CurrentCommandState.BAD_COMMAND);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isExpectingCharArgument(@NotNull CommandBuilder commandBuilder) {
|
||||
return commandBuilder.getExpectedArgumentType() == Argument.Type.CHARACTER;
|
||||
}
|
||||
|
||||
private void handleCharArgument(@NotNull KeyStroke key, char chKey, @NotNull CommandState commandState) {
|
||||
// We are expecting a character argument - is this a regular character the user typed?
|
||||
// Some special keys can be handled as character arguments - let's check for them here.
|
||||
if (chKey == 0) {
|
||||
switch (key.getKeyCode()) {
|
||||
case KeyEvent.VK_TAB:
|
||||
chKey = '\t';
|
||||
break;
|
||||
case KeyEvent.VK_ENTER:
|
||||
chKey = '\n';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
final CommandBuilder commandBuilder = commandState.getCommandBuilder();
|
||||
if (chKey != 0) {
|
||||
// Create the character argument, add it to the current command, and signal we are ready to process the command
|
||||
commandBuilder.completeCommandPart(new Argument(chKey));
|
||||
}
|
||||
else {
|
||||
// Oops - this isn't a valid character argument
|
||||
commandBuilder.setCommandState(CurrentCommandState.BAD_COMMAND);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean handleDigraph(@NotNull Editor editor,
|
||||
@NotNull KeyStroke key,
|
||||
@NotNull DataContext context,
|
||||
@NotNull CommandState editorState) {
|
||||
|
||||
// Support starting a digraph/literal sequence if the operator accepts one as an argument, e.g. 'r' or 'f'.
|
||||
// Normally, we start the sequence (in Insert or CmdLine mode) through a VimAction that can be mapped. Our
|
||||
// VimActions don't work as arguments for operators, so we have to special case here. Helpfully, Vim appears to
|
||||
// hardcode the shortcuts, and doesn't support mapping, so everything works nicely.
|
||||
final CommandBuilder commandBuilder = editorState.getCommandBuilder();
|
||||
if (commandBuilder.getExpectedArgumentType() == Argument.Type.DIGRAPH) {
|
||||
if (DigraphSequence.isDigraphStart(key)) {
|
||||
editorState.startDigraphSequence();
|
||||
editorState.getCommandBuilder().addKey(key);
|
||||
return true;
|
||||
}
|
||||
if (DigraphSequence.isLiteralStart(key)) {
|
||||
editorState.startLiteralSequence();
|
||||
editorState.getCommandBuilder().addKey(key);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
DigraphResult res = editorState.processDigraphKey(key, editor);
|
||||
if (ExEntryPanel.getInstance().isActive()) {
|
||||
switch (res.getResult()) {
|
||||
case DigraphResult.RES_HANDLED:
|
||||
setPromptCharacterEx(commandBuilder.isPuttingLiteral() ? '^' : key.getKeyChar());
|
||||
break;
|
||||
case DigraphResult.RES_DONE:
|
||||
case DigraphResult.RES_BAD:
|
||||
if (key.getKeyCode() == KeyEvent.VK_C && (key.getModifiers() & InputEvent.CTRL_DOWN_MASK) != 0) {
|
||||
return false;
|
||||
} else {
|
||||
ExEntryPanel.getInstance().getEntry().clearCurrentAction();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (res.getResult()) {
|
||||
case DigraphResult.RES_HANDLED:
|
||||
editorState.getCommandBuilder().addKey(key);
|
||||
return true;
|
||||
|
||||
case DigraphResult.RES_DONE:
|
||||
if (commandBuilder.getExpectedArgumentType() == Argument.Type.DIGRAPH) {
|
||||
commandBuilder.fallbackToCharacterArgument();
|
||||
}
|
||||
final KeyStroke stroke = res.getStroke();
|
||||
if (stroke == null) {
|
||||
return false;
|
||||
}
|
||||
editorState.getCommandBuilder().addKey(key);
|
||||
handleKey(editor, stroke, context);
|
||||
return true;
|
||||
|
||||
case DigraphResult.RES_BAD:
|
||||
// BAD is an error. We were expecting a valid character, and we didn't get it.
|
||||
if (commandBuilder.getExpectedArgumentType() != null) {
|
||||
commandBuilder.setCommandState(CurrentCommandState.BAD_COMMAND);
|
||||
}
|
||||
return true;
|
||||
|
||||
case DigraphResult.RES_UNHANDLED:
|
||||
// UNHANDLED means the key stroke made no sense in the context of a digraph, but isn't an error in the current
|
||||
// state. E.g. waiting for {char} <BS> {char}. Let the key handler have a go at it.
|
||||
if (commandBuilder.getExpectedArgumentType() == Argument.Type.DIGRAPH) {
|
||||
commandBuilder.fallbackToCharacterArgument();
|
||||
handleKey(editor, key, context);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void executeCommand(@NotNull Editor editor,
|
||||
@NotNull DataContext context,
|
||||
@NotNull CommandState editorState) {
|
||||
final Command command = editorState.getCommandBuilder().buildCommand();
|
||||
|
||||
// If we were in "operator pending" mode, reset back to normal mode.
|
||||
editorState.resetOpPending();
|
||||
|
||||
// Save off the command we are about to execute
|
||||
editorState.setExecutingCommand(command);
|
||||
|
||||
Project project = editor.getProject();
|
||||
final Command.Type type = command.getType();
|
||||
if (type.isWrite() && !editor.getDocument().isWritable()) {
|
||||
VimPlugin.indicateError();
|
||||
reset(editor);
|
||||
}
|
||||
|
||||
if (!command.getFlags().contains(CommandFlags.FLAG_TYPEAHEAD_SELF_MANAGE)) {
|
||||
IdeEventQueue.getInstance().flushDelayedKeyEvents();
|
||||
}
|
||||
|
||||
if (ApplicationManager.getApplication().isDispatchThread()) {
|
||||
Runnable action = new ActionRunner(editor, context, command);
|
||||
EditorActionHandlerBase cmdAction = command.getAction();
|
||||
String name = cmdAction.getId();
|
||||
|
||||
if (type.isWrite()) {
|
||||
RunnableHelper.runWriteCommand(project, action, name, action);
|
||||
}
|
||||
else if (type.isRead()) {
|
||||
RunnableHelper.runReadCommand(project, action, name, action);
|
||||
}
|
||||
else {
|
||||
CommandProcessor.getInstance().executeCommand(project, action, name, action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleCommandNode(Editor editor,
|
||||
DataContext context,
|
||||
KeyStroke key,
|
||||
@NotNull CommandNode<ActionBeanClass> node,
|
||||
CommandState editorState) {
|
||||
// The user entered a valid command. Create the command and add it to the stack.
|
||||
final EditorActionHandlerBase action = node.getActionHolder().getInstance();
|
||||
final CommandBuilder commandBuilder = editorState.getCommandBuilder();
|
||||
final Argument.Type expectedArgumentType = commandBuilder.getExpectedArgumentType();
|
||||
|
||||
commandBuilder.pushCommandPart(action);
|
||||
|
||||
if (!checkArgumentCompatibility(expectedArgumentType, action)) {
|
||||
commandBuilder.setCommandState(CurrentCommandState.BAD_COMMAND);
|
||||
return;
|
||||
}
|
||||
|
||||
if (action.getArgumentType() == null || stopMacroRecord(node, editorState)) {
|
||||
commandBuilder.setCommandState(CurrentCommandState.READY);
|
||||
}
|
||||
else {
|
||||
final Argument.Type argumentType = action.getArgumentType();
|
||||
startWaitingForArgument(editor, context, key.getKeyChar(), action, argumentType, editorState);
|
||||
partialReset(editor);
|
||||
}
|
||||
|
||||
// TODO In the name of God, get rid of EX_STRING, FLAG_COMPLETE_EX and all the related staff
|
||||
if (expectedArgumentType == Argument.Type.EX_STRING && action.getFlags().contains(CommandFlags.FLAG_COMPLETE_EX)) {
|
||||
/* The only action that implements FLAG_COMPLETE_EX is ProcessExEntryAction.
|
||||
* When pressing ':', ExEntryAction is chosen as the command. Since it expects no arguments, it is invoked and
|
||||
calls ProcessGroup#startExCommand, pushes CMD_LINE mode, and the action is popped. The ex handler will push
|
||||
the final <CR> through handleKey, which chooses ProcessExEntryAction. Because we're not expecting EX_STRING,
|
||||
this branch does NOT fire, and ProcessExEntryAction handles the ex cmd line entry.
|
||||
* When pressing '/' or '?', SearchEntry(Fwd|Rev)Action is chosen as the command. This expects an argument of
|
||||
EX_STRING, so startWaitingForArgument calls ProcessGroup#startSearchCommand. The ex handler pushes the final
|
||||
<CR> through handleKey, which chooses ProcessExEntryAction, and we hit this branch. We don't invoke
|
||||
ProcessExEntryAction, but pop it, set the search text as an argument on SearchEntry(Fwd|Rev)Action and invoke
|
||||
that instead.
|
||||
* When using '/' or '?' as part of a motion (e.g. "d/foo"), the above happens again, and all is good. Because
|
||||
the text has been applied as an argument on the last command, '.' will correctly repeat it.
|
||||
|
||||
It's hard to see how to improve this. Removing EX_STRING means starting ex input has to happen in ExEntryAction
|
||||
and SearchEntry(Fwd|Rev)Action, and the ex command invoked in ProcessExEntryAction, but that breaks any initial
|
||||
operator, which would be invoked first (e.g. 'd' in "d/foo").
|
||||
*/
|
||||
String text = VimPlugin.getProcess().endSearchCommand(editor);
|
||||
commandBuilder.popCommandPart(); // Pop ProcessExEntryAction
|
||||
commandBuilder.completeCommandPart(new Argument(text)); // Set search text on SearchEntry(Fwd|Rev)Action
|
||||
editorState.popModes(); // Pop CMD_LINE
|
||||
}
|
||||
}
|
||||
|
||||
private boolean stopMacroRecord(CommandNode<ActionBeanClass> node, @NotNull CommandState editorState) {
|
||||
return editorState.isRecording() && node.getActionHolder().getInstance() instanceof ToggleRecordingAction;
|
||||
}
|
||||
|
||||
private void startWaitingForArgument(Editor editor,
|
||||
DataContext context,
|
||||
char key,
|
||||
@NotNull EditorActionHandlerBase action,
|
||||
@NotNull Argument.Type argument,
|
||||
CommandState editorState) {
|
||||
final CommandBuilder commandBuilder = editorState.getCommandBuilder();
|
||||
switch (argument) {
|
||||
case MOTION:
|
||||
if (editorState.isDotRepeatInProgress() && VimRepeater.Extension.INSTANCE.getArgumentCaptured() != null) {
|
||||
commandBuilder.completeCommandPart(VimRepeater.Extension.INSTANCE.getArgumentCaptured());
|
||||
}
|
||||
editorState.pushModes(CommandState.Mode.OP_PENDING, CommandState.SubMode.NONE);
|
||||
break;
|
||||
case DIGRAPH:
|
||||
// Command actions represent the completion of a command. Showcmd relies on this - if the action represents a
|
||||
// part of a command, the showcmd output is reset part way through. This means we need to special case entering
|
||||
// digraph/literal input mode. We have an action that takes a digraph as an argument, and pushes it back through
|
||||
// the key handler when it's complete.
|
||||
if (action instanceof InsertCompletedDigraphAction) {
|
||||
editorState.startDigraphSequence();
|
||||
setPromptCharacterEx('?');
|
||||
} else if (action instanceof InsertCompletedLiteralAction) {
|
||||
editorState.startLiteralSequence();
|
||||
setPromptCharacterEx('^');
|
||||
}
|
||||
break;
|
||||
case EX_STRING:
|
||||
// The current Command expects an EX_STRING argument. E.g. SearchEntry(Fwd|Rev)Action. This won't execute until
|
||||
// state hits READY. Start the ex input field, push CMD_LINE mode and wait for the argument.
|
||||
VimPlugin.getProcess().startSearchCommand(editor, context, commandBuilder.getCount(), key);
|
||||
commandBuilder.setCommandState(CurrentCommandState.NEW_COMMAND);
|
||||
editorState.pushModes(CommandState.Mode.CMD_LINE, CommandState.SubMode.NONE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkArgumentCompatibility(@Nullable Argument.Type expectedArgumentType, @NotNull EditorActionHandlerBase action) {
|
||||
return !(expectedArgumentType == Argument.Type.MOTION && action.getType() != Command.Type.MOTION);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute an action by name
|
||||
*
|
||||
* @param name The name of the action to execute
|
||||
* @param context The context to run it in
|
||||
*/
|
||||
public static boolean executeAction(@NotNull @NonNls String name, @NotNull DataContext context) {
|
||||
ActionManager aMgr = ActionManager.getInstance();
|
||||
AnAction action = aMgr.getAction(name);
|
||||
return action != null && executeAction(action, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Partially resets the state of this handler. Resets the command count, clears the key list, resets the key tree
|
||||
* node to the root for the current mode we are in.
|
||||
*
|
||||
* @param editor The editor to reset.
|
||||
*/
|
||||
public void partialReset(@NotNull Editor editor) {
|
||||
CommandState editorState = CommandState.getInstance(editor);
|
||||
editorState.getMappingState().resetMappingSequence();
|
||||
editorState.getCommandBuilder().resetInProgressCommandPart(getKeyRoot(editorState.getMappingState().getMappingMode()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the state of this handler. Does a partial reset then resets the mode, the command, and the argument.
|
||||
*
|
||||
* @param editor The editor to reset.
|
||||
*/
|
||||
public void reset(@NotNull Editor editor) {
|
||||
partialReset(editor);
|
||||
CommandState editorState = CommandState.getInstance(editor);
|
||||
editorState.getCommandBuilder().resetAll(getKeyRoot(editorState.getMappingState().getMappingMode()));
|
||||
}
|
||||
|
||||
private @NotNull CommandPartNode<ActionBeanClass> getKeyRoot(MappingMode mappingMode) {
|
||||
return VimPlugin.getKey().getKeyRoot(mappingMode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Completely resets the state of this handler. Resets the command mode to normal, resets, and clears the selected
|
||||
* register.
|
||||
*
|
||||
* @param editor The editor to reset.
|
||||
*/
|
||||
public void fullReset(@NotNull Editor editor) {
|
||||
VimPlugin.clearError();
|
||||
CommandState.getInstance(editor).reset();
|
||||
reset(editor);
|
||||
RegisterGroup registerGroup = VimPlugin.getRegisterIfCreated();
|
||||
if (registerGroup != null) {
|
||||
registerGroup.resetRegister();
|
||||
}
|
||||
VisualGroupKt.updateCaretState(editor);
|
||||
editor.getSelectionModel().removeSelection();
|
||||
}
|
||||
|
||||
// This method is copied from com.intellij.openapi.editor.actionSystem.EditorAction.getProjectAwareDataContext
|
||||
private static @NotNull DataContext getProjectAwareDataContext(final @NotNull Editor editor,
|
||||
final @NotNull DataContext original) {
|
||||
if (PROJECT.getData(original) == editor.getProject()) {
|
||||
return new DialogAwareDataContext(original);
|
||||
}
|
||||
|
||||
return dataId -> {
|
||||
if (PROJECT.is(dataId)) {
|
||||
final Project project = editor.getProject();
|
||||
if (project != null) {
|
||||
return project;
|
||||
}
|
||||
}
|
||||
return original.getData(dataId);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private void setPromptCharacterEx(final char promptCharacter) {
|
||||
final ExEntryPanel exEntryPanel = ExEntryPanel.getInstance();
|
||||
if (exEntryPanel.isActive()) {
|
||||
exEntryPanel.getEntry().setCurrentActionPromptCharacter(promptCharacter);
|
||||
}
|
||||
}
|
||||
|
||||
// This class is copied from com.intellij.openapi.editor.actionSystem.DialogAwareDataContext.DialogAwareDataContext
|
||||
private static final class DialogAwareDataContext implements DataContext {
|
||||
@SuppressWarnings("rawtypes")
|
||||
private static final DataKey[] keys = {PROJECT, PROJECT_FILE_DIRECTORY, EDITOR, VIRTUAL_FILE, PSI_FILE};
|
||||
private final Map<String, Object> values = new HashMap<>();
|
||||
|
||||
DialogAwareDataContext(DataContext context) {
|
||||
//noinspection rawtypes
|
||||
for (DataKey key : keys) {
|
||||
values.put(key.getName(), key.getData(context));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Object getData(@NotNull @NonNls String dataId) {
|
||||
if (values.containsKey(dataId)) {
|
||||
return values.get(dataId);
|
||||
}
|
||||
final Editor editor = (Editor)values.get(EDITOR.getName());
|
||||
if (editor != null) {
|
||||
return DataManager.getInstance().getDataContext(editor.getContentComponent()).getData(dataId);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This was used as an experiment to execute actions as a runnable.
|
||||
*/
|
||||
static class ActionRunner implements Runnable {
|
||||
@Contract(pure = true)
|
||||
ActionRunner(Editor editor, DataContext context, Command cmd) {
|
||||
this.editor = editor;
|
||||
this.context = context;
|
||||
this.cmd = cmd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
CommandState editorState = CommandState.getInstance(editor);
|
||||
|
||||
editorState.getCommandBuilder().setCommandState(CurrentCommandState.NEW_COMMAND);
|
||||
|
||||
final Character register = cmd.getRegister();
|
||||
if (register != null) {
|
||||
VimPlugin.getRegister().selectRegister(register);
|
||||
}
|
||||
|
||||
executeVimAction(editor, cmd.getAction(), context);
|
||||
if (editorState.getMode() == CommandState.Mode.INSERT || editorState.getMode() == CommandState.Mode.REPLACE) {
|
||||
VimPlugin.getChange().processCommand(editor, cmd);
|
||||
}
|
||||
|
||||
// Now the command has been executed let's clean up a few things.
|
||||
|
||||
// By default, the "empty" register is used by all commands, so we want to reset whatever the last register
|
||||
// selected by the user was to the empty register
|
||||
VimPlugin.getRegister().resetRegister();
|
||||
|
||||
// If, at this point, we are not in insert, replace, or visual modes, we need to restore the previous
|
||||
// mode we were in. This handles commands in those modes that temporarily allow us to execute normal
|
||||
// mode commands. An exception is if this command should leave us in the temporary mode such as
|
||||
// "select register"
|
||||
if (editorState.getSubMode() == CommandState.SubMode.SINGLE_COMMAND &&
|
||||
(!cmd.getFlags().contains(CommandFlags.FLAG_EXPECT_MORE))) {
|
||||
editorState.popModes();
|
||||
VisualGroupKt.resetShape(CommandStateHelper.getMode(editor), editor);
|
||||
}
|
||||
|
||||
if (editorState.getCommandBuilder().isDone()) {
|
||||
KeyHandler.getInstance().reset(editor);
|
||||
}
|
||||
}
|
||||
|
||||
private final Editor editor;
|
||||
private final DataContext context;
|
||||
private final Command cmd;
|
||||
}
|
||||
|
||||
private TypedActionHandler origHandler;
|
||||
private int handleKeyRecursionCount = 0;
|
||||
|
||||
private static KeyHandler instance;
|
||||
}
|
@@ -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
|
||||
|
||||
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.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): 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,66 +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.KeyHandler
|
||||
import com.maddyhome.idea.vim.VimPlugin
|
||||
import com.maddyhome.idea.vim.command.Argument
|
||||
import com.maddyhome.idea.vim.command.Command
|
||||
import com.maddyhome.idea.vim.command.SelectionType
|
||||
import com.maddyhome.idea.vim.group.MotionGroup
|
||||
import com.maddyhome.idea.vim.handler.VimActionHandler
|
||||
import com.maddyhome.idea.vim.helper.MessageHelper
|
||||
import com.maddyhome.idea.vim.helper.commandState
|
||||
|
||||
/**
|
||||
* @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): Boolean {
|
||||
val operatorFunction = VimPlugin.getKey().operatorFunction
|
||||
if (operatorFunction != null) {
|
||||
val argument = cmd.argument
|
||||
if (argument != null) {
|
||||
if (!editor.commandState.isDotRepeatInProgress) {
|
||||
VimRepeater.Extension.argumentCaptured = argument
|
||||
}
|
||||
val saveRepeatHandler = VimRepeater.repeatHandler
|
||||
val motion = argument.motion
|
||||
val range = MotionGroup
|
||||
.getMotionRange(editor, editor.caretModel.primaryCaret, context, cmd.count, cmd.rawCount, argument)
|
||||
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
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
VimPlugin.showMessage(MessageHelper.message("E774"))
|
||||
return false
|
||||
}
|
||||
}
|
@@ -1,141 +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.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.command.Command
|
||||
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
|
||||
|
||||
class RepeatChangeAction : VimActionHandler.SingleExecution() {
|
||||
override val type: Command.Type = Command.Type.OTHER_WRITABLE
|
||||
|
||||
override fun execute(editor: Editor, context: DataContext, cmd: Command): Boolean {
|
||||
val state = editor.commandState
|
||||
val lastCommand = VimRepeater.lastChangeCommand
|
||||
|
||||
if (lastCommand == null && VimRepeater.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 repeatHandler = VimRepeater.repeatHandler
|
||||
|
||||
state.isDotRepeatInProgress = true
|
||||
VimPlugin.getRegister().selectRegister(VimRepeater.lastChangeRegister)
|
||||
|
||||
try {
|
||||
if (repeatHandler && lastHandler != null) {
|
||||
val processor = CommandProcessor.getInstance()
|
||||
processor.executeCommand(editor.project, { lastHandler.execute(editor, context) }, "Vim " + lastHandler.javaClass.simpleName, null)
|
||||
} else if (!repeatHandler && lastCommand != null) {
|
||||
if (cmd.rawCount > 0) {
|
||||
lastCommand.count = cmd.count
|
||||
val arg = lastCommand.argument
|
||||
if (arg != null) {
|
||||
val mot = arg.motion
|
||||
mot.count = 0
|
||||
}
|
||||
}
|
||||
state.setExecutingCommand(lastCommand)
|
||||
|
||||
KeyHandler.executeVimAction(editor, lastCommand.action, context)
|
||||
|
||||
VimRepeater.saveLastChange(lastCommand)
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
|
||||
state.isDotRepeatInProgress = false
|
||||
|
||||
// Restore state
|
||||
if (save != null) state.setExecutingCommand(save)
|
||||
VimPlugin.getMotion().setLastFTCmd(lastFTCmd, lastFTChar)
|
||||
if (lastHandler != null) VimRepeater.Extension.lastExtensionHandler = lastHandler
|
||||
VimRepeater.repeatHandler = repeatHandler
|
||||
VimRepeater.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,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.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,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?
|
||||
): Boolean {
|
||||
return argument != null && VimPlugin.getChange().changeCharacter(editor, caret, count, argument.character)
|
||||
}
|
||||
}
|
@@ -1,47 +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.delete
|
||||
|
||||
import com.intellij.openapi.actionSystem.DataContext
|
||||
import com.intellij.openapi.editor.Caret
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import com.intellij.openapi.util.Ref
|
||||
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.handler.ChangeEditorActionHandler
|
||||
import com.maddyhome.idea.vim.option.OptionsManager.ideajoin
|
||||
|
||||
class DeleteJoinLinesSpacesAction : ChangeEditorActionHandler.SingleExecution() {
|
||||
override val type: Command.Type = Command.Type.DELETE
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
if (editor.isOneLineMode) return false
|
||||
if (ideajoin.isSet) {
|
||||
return VimPlugin.getChange().joinViaIdeaByCount(editor, context, count)
|
||||
}
|
||||
VimPlugin.getEditor().notifyIdeaJoin(editor.project)
|
||||
val res = Ref.create(true)
|
||||
editor.caretModel.runForEachCaret({ caret: Caret -> if (!VimPlugin.getChange().deleteJoinLines(editor, caret, count, true)) res.set(false) }, true)
|
||||
return res.get()
|
||||
}
|
||||
}
|
@@ -1,60 +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.delete
|
||||
|
||||
import com.intellij.openapi.actionSystem.DataContext
|
||||
import com.intellij.openapi.editor.Caret
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import com.intellij.openapi.util.Ref
|
||||
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.group.visual.VimSelection
|
||||
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler
|
||||
import com.maddyhome.idea.vim.helper.enumSetOf
|
||||
import com.maddyhome.idea.vim.option.OptionsManager.ideajoin
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* @author vlan
|
||||
*/
|
||||
class DeleteJoinVisualLinesAction : VisualOperatorActionHandler.SingleExecution() {
|
||||
override val type: Command.Type = Command.Type.DELETE
|
||||
|
||||
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_EXIT_VISUAL)
|
||||
|
||||
override fun executeForAllCarets(editor: Editor,
|
||||
context: DataContext,
|
||||
cmd: Command,
|
||||
caretsAndSelections: Map<Caret, VimSelection>): Boolean {
|
||||
if (editor.isOneLineMode) return false
|
||||
if (ideajoin.isSet) {
|
||||
VimPlugin.getChange().joinViaIdeaBySelections(editor, context, caretsAndSelections)
|
||||
return true
|
||||
}
|
||||
val res = Ref.create(true)
|
||||
editor.caretModel.runForEachCaret({ caret: Caret ->
|
||||
if (!caret.isValid) return@runForEachCaret
|
||||
val range = caretsAndSelections[caret] ?: return@runForEachCaret
|
||||
if (!VimPlugin.getChange().deleteJoinRange(editor, caret, range.toVimTextRange(true).normalize(), false)) {
|
||||
res.set(false)
|
||||
}
|
||||
}, true)
|
||||
return res.get()
|
||||
}
|
||||
}
|
@@ -1,60 +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.delete
|
||||
|
||||
import com.intellij.openapi.actionSystem.DataContext
|
||||
import com.intellij.openapi.editor.Caret
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import com.intellij.openapi.util.Ref
|
||||
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.group.visual.VimSelection
|
||||
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler
|
||||
import com.maddyhome.idea.vim.helper.enumSetOf
|
||||
import com.maddyhome.idea.vim.option.OptionsManager.ideajoin
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* @author vlan
|
||||
*/
|
||||
class DeleteJoinVisualLinesSpacesAction : VisualOperatorActionHandler.SingleExecution() {
|
||||
override val type: Command.Type = Command.Type.DELETE
|
||||
|
||||
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_EXIT_VISUAL)
|
||||
|
||||
override fun executeForAllCarets(editor: Editor,
|
||||
context: DataContext,
|
||||
cmd: Command,
|
||||
caretsAndSelections: Map<Caret, VimSelection>): Boolean {
|
||||
if (editor.isOneLineMode) return false
|
||||
if (ideajoin.isSet) {
|
||||
VimPlugin.getChange().joinViaIdeaBySelections(editor, context, caretsAndSelections)
|
||||
return true
|
||||
}
|
||||
val res = Ref.create(true)
|
||||
editor.caretModel.runForEachCaret({ caret: Caret ->
|
||||
if (!caret.isValid) return@runForEachCaret
|
||||
val range = caretsAndSelections[caret] ?: return@runForEachCaret
|
||||
if (!VimPlugin.getChange().deleteJoinRange(editor, caret, range.toVimTextRange(true).normalize(), true)) {
|
||||
res.set(false)
|
||||
}
|
||||
}, true)
|
||||
return res.get()
|
||||
}
|
||||
}
|
@@ -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.insert
|
||||
|
||||
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.handler.ChangeEditorActionHandler
|
||||
|
||||
class InsertCharacterAboveCursorAction : ChangeEditorActionHandler.ForEachCaret() {
|
||||
override val type: Command.Type = Command.Type.INSERT
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
caret: Caret,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
return if (editor.isOneLineMode) {
|
||||
false
|
||||
} else VimPlugin.getChange().insertCharacterAroundCursor(editor, caret, -1)
|
||||
}
|
||||
}
|
@@ -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.insert
|
||||
|
||||
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.handler.ChangeEditorActionHandler
|
||||
|
||||
class InsertCharacterBelowCursorAction : ChangeEditorActionHandler.ForEachCaret() {
|
||||
override val type: Command.Type = Command.Type.INSERT
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
caret: Caret,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
return if (editor.isOneLineMode) {
|
||||
false
|
||||
} else VimPlugin.getChange().insertCharacterAroundCursor(editor, caret, 1)
|
||||
}
|
||||
}
|
@@ -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.insert
|
||||
|
||||
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.handler.ChangeEditorActionHandler
|
||||
import com.maddyhome.idea.vim.helper.enumSetOf
|
||||
import java.util.*
|
||||
|
||||
class InsertDeleteInsertedTextAction : ChangeEditorActionHandler.ForEachCaret() {
|
||||
override val type: Command.Type = Command.Type.INSERT
|
||||
|
||||
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_CLEAR_STROKES)
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
caret: Caret,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
return VimPlugin.getChange().insertDeleteInsertedText(editor, caret)
|
||||
}
|
||||
}
|
@@ -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.insert
|
||||
|
||||
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.handler.ChangeEditorActionHandler
|
||||
import com.maddyhome.idea.vim.helper.enumSetOf
|
||||
import java.util.*
|
||||
|
||||
class InsertDeletePreviousWordAction : ChangeEditorActionHandler.ForEachCaret() {
|
||||
override val type: Command.Type = Command.Type.INSERT
|
||||
|
||||
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_CLEAR_STROKES)
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
caret: Caret,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
return VimPlugin.getChange().insertDeletePreviousWord(editor, caret)
|
||||
}
|
||||
}
|
@@ -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.insert
|
||||
|
||||
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.handler.ChangeEditorActionHandler
|
||||
import com.maddyhome.idea.vim.helper.enumSetOf
|
||||
import java.util.*
|
||||
|
||||
class InsertNewLineAboveAction : ChangeEditorActionHandler.SingleExecution() {
|
||||
override val type: Command.Type = Command.Type.INSERT
|
||||
|
||||
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_MULTIKEY_UNDO)
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
if (editor.isOneLineMode) return false
|
||||
VimPlugin.getChange().insertNewLineAbove(editor, context)
|
||||
return true
|
||||
}
|
||||
}
|
@@ -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.insert
|
||||
|
||||
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.handler.ChangeEditorActionHandler
|
||||
import com.maddyhome.idea.vim.helper.enumSetOf
|
||||
import java.util.*
|
||||
|
||||
class InsertNewLineBelowAction : ChangeEditorActionHandler.SingleExecution() {
|
||||
override val type: Command.Type = Command.Type.INSERT
|
||||
|
||||
override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_MULTIKEY_UNDO)
|
||||
|
||||
override fun execute(editor: Editor,
|
||||
context: DataContext,
|
||||
count: Int,
|
||||
rawCount: Int,
|
||||
argument: Argument?): Boolean {
|
||||
if (editor.isOneLineMode) return false
|
||||
VimPlugin.getChange().insertNewLineBelow(editor, context)
|
||||
return true
|
||||
}
|
||||
}
|