mirror of
https://github.com/Eugeny/tabby.git
synced 2025-07-28 00:38:33 +00:00
Compare commits
1018 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0f01aaf44d | ||
![]() |
54531e234e | ||
![]() |
3bda4a9871 | ||
![]() |
c7e3ab42d9 | ||
![]() |
5d2956568e | ||
![]() |
8b3f482682 | ||
![]() |
f38f9882f8 | ||
![]() |
54d71adb26 | ||
![]() |
13eebd8957 | ||
![]() |
6c4f8d2611 | ||
![]() |
897bc77d05 | ||
![]() |
8b5b53ab26 | ||
![]() |
448fe29f50 | ||
![]() |
70ae9f875f | ||
![]() |
75764cd725 | ||
![]() |
5ae2d17cc8 | ||
![]() |
109a83db5b | ||
![]() |
9fe8d2a7df | ||
![]() |
d3bbd045dc | ||
![]() |
eb0fa29fad | ||
![]() |
6289229bf2 | ||
![]() |
b664b9eed9 | ||
![]() |
2569f9e322 | ||
![]() |
95152456ce | ||
![]() |
918761bbdc | ||
![]() |
ceb1b59409 | ||
![]() |
63374f532c | ||
![]() |
c57fe48e73 | ||
![]() |
02a3a8200b | ||
![]() |
3e8e3f7ccd | ||
![]() |
1ec218775e | ||
![]() |
cc8c200da0 | ||
![]() |
0a20716efd | ||
![]() |
9893fb51a7 | ||
![]() |
3466d42cb1 | ||
![]() |
9e9066d3cd | ||
![]() |
b469dd603b | ||
![]() |
f6eaff355b | ||
![]() |
7ff2b31a9f | ||
![]() |
dbf67e77e0 | ||
![]() |
b45769d379 | ||
![]() |
1695c0b522 | ||
![]() |
15d7be05f1 | ||
![]() |
a759c40ec8 | ||
![]() |
a8e977d34c | ||
![]() |
527a951b1e | ||
![]() |
afe9c9a84c | ||
![]() |
372662c787 | ||
![]() |
ca9e6a118e | ||
![]() |
b412bce37d | ||
![]() |
6622cbc550 | ||
![]() |
d3361b6f34 | ||
![]() |
13f715ddfd | ||
![]() |
ccea3572a7 | ||
![]() |
c24c752b76 | ||
![]() |
8751b9831f | ||
![]() |
d4d93cf236 | ||
![]() |
9b305026f7 | ||
![]() |
91fcdbf9b5 | ||
![]() |
b17e23a69e | ||
![]() |
88bbdd0da1 | ||
![]() |
53cbb8a7e3 | ||
![]() |
9df8a1b904 | ||
![]() |
0a0e451e97 | ||
![]() |
5376ac0f07 | ||
![]() |
238482932e | ||
![]() |
d4332ea361 | ||
![]() |
eb49499f09 | ||
![]() |
445a3d02da | ||
![]() |
06e5571812 | ||
![]() |
510edaabb5 | ||
![]() |
5ef36896c5 | ||
![]() |
5d22c15a78 | ||
![]() |
a33e11502b | ||
![]() |
4c9456d98d | ||
![]() |
e1ee818932 | ||
![]() |
e83210f0e6 | ||
![]() |
1d176047c4 | ||
![]() |
bd3ac21fb3 | ||
![]() |
559dd3955c | ||
![]() |
0ed05cb783 | ||
![]() |
87e8eefd49 | ||
![]() |
609b527a7c | ||
![]() |
fee163835f | ||
![]() |
c8b25cf911 | ||
![]() |
eb9698fa66 | ||
![]() |
eb60c3c3c6 | ||
![]() |
f2a48fc0c0 | ||
![]() |
8d01a9ad8d | ||
![]() |
4d8ddba8ea | ||
![]() |
91a7dd8b1d | ||
![]() |
38423eb139 | ||
![]() |
bde6fd6231 | ||
![]() |
14200f848f | ||
![]() |
f6895d7696 | ||
![]() |
64410a9302 | ||
![]() |
45274f9691 | ||
![]() |
54ab2a1f03 | ||
![]() |
782128308c | ||
![]() |
f2b6cdf97c | ||
![]() |
c025c44258 | ||
![]() |
9483d20994 | ||
![]() |
ff25e7fe2e | ||
![]() |
d12a48f3fc | ||
![]() |
1796ce4f1c | ||
![]() |
d404067e77 | ||
![]() |
f7544d0a2e | ||
![]() |
cbdce5c30e | ||
![]() |
d7ab8a00dc | ||
![]() |
6e0ded9a5e | ||
![]() |
f660ece383 | ||
![]() |
b692347c4e | ||
![]() |
9520d31f12 | ||
![]() |
f2afac6ead | ||
![]() |
0dd460a6d7 | ||
![]() |
7c0aacf0ad | ||
![]() |
57bf79ec56 | ||
![]() |
8cfdd43ee1 | ||
![]() |
21f245ddaf | ||
![]() |
00a19769e1 | ||
![]() |
d2a22763de | ||
![]() |
da75e34b95 | ||
![]() |
08a564588c | ||
![]() |
a639d65ed6 | ||
![]() |
b42314b29e | ||
![]() |
17c93aa3fc | ||
![]() |
5b4a1a5581 | ||
![]() |
d82f78a026 | ||
![]() |
9414be9ce0 | ||
![]() |
f2ed1b3df3 | ||
![]() |
f41abea747 | ||
![]() |
21e5d68994 | ||
![]() |
a6a9c149dc | ||
![]() |
61c11abda2 | ||
![]() |
3a11b51729 | ||
![]() |
00ffa24e7d | ||
![]() |
b156752106 | ||
![]() |
6159d0ba9a | ||
![]() |
bf2ab87c44 | ||
![]() |
ff1e2871d4 | ||
![]() |
2d9f3d8216 | ||
![]() |
e7a9b2317d | ||
![]() |
0ab02d032a | ||
![]() |
ab8622c9fd | ||
![]() |
70a12e36e1 | ||
![]() |
9706108185 | ||
![]() |
5138873f43 | ||
![]() |
d8625d6b9f | ||
![]() |
ec4f200435 | ||
![]() |
91f3b78b80 | ||
![]() |
3b321858d2 | ||
![]() |
0814d44207 | ||
![]() |
04010b58bb | ||
![]() |
a68dc35a23 | ||
![]() |
40c4f57b37 | ||
![]() |
652084a140 | ||
![]() |
c29d5bc98a | ||
![]() |
42b5d0824a | ||
![]() |
7226b09214 | ||
![]() |
b97053daee | ||
![]() |
d5d6a486d2 | ||
![]() |
889ab0f147 | ||
![]() |
e6a1f98cf1 | ||
![]() |
5f81a47db9 | ||
![]() |
5d16bb99c7 | ||
![]() |
f24439d580 | ||
![]() |
6d3334543e | ||
![]() |
62019e3ac1 | ||
![]() |
adc9bce844 | ||
![]() |
26b70447da | ||
![]() |
832e408952 | ||
![]() |
b64c2ae14e | ||
![]() |
e63d296457 | ||
![]() |
909c99d1c0 | ||
![]() |
cbd8609c97 | ||
![]() |
b8c1b5e428 | ||
![]() |
cb1b0ac669 | ||
![]() |
bbe7d2186e | ||
![]() |
d0469685d9 | ||
![]() |
32ecd48375 | ||
![]() |
33a715c8c3 | ||
![]() |
eba3d2709e | ||
![]() |
b3af7184e7 | ||
![]() |
54411e59ad | ||
![]() |
f9da76f07e | ||
![]() |
af0ecd2400 | ||
![]() |
f3f730b32e | ||
![]() |
076b1c7129 | ||
![]() |
3298840454 | ||
![]() |
b0c300be43 | ||
![]() |
e86b3cde6f | ||
![]() |
ff55d3d1ef | ||
![]() |
e024390028 | ||
![]() |
c314e4638d | ||
![]() |
bcd2cc50ec | ||
![]() |
8e1f6f894f | ||
![]() |
eab8841cca | ||
![]() |
a78f3399fd | ||
![]() |
44cbc9298f | ||
![]() |
0c601592e3 | ||
![]() |
87ad435a13 | ||
![]() |
d644c299ae | ||
![]() |
6119c2b73d | ||
![]() |
ccf4f05437 | ||
![]() |
5110808069 | ||
![]() |
ba61a7f359 | ||
![]() |
f2aef8d6d5 | ||
![]() |
8587cd31dd | ||
![]() |
8a8e7cd99f | ||
![]() |
ddb01b3722 | ||
![]() |
66bb03a463 | ||
![]() |
5f88a02647 | ||
![]() |
538df37f5e | ||
![]() |
aba5e9dcfa | ||
![]() |
c7589acc87 | ||
![]() |
39786e023e | ||
![]() |
7900134f67 | ||
![]() |
9e3961b83d | ||
![]() |
d080adc19d | ||
![]() |
4f189f6839 | ||
![]() |
87ed979588 | ||
![]() |
e90db7f07f | ||
![]() |
5249a9076a | ||
![]() |
cfc9333c02 | ||
![]() |
5a7b5346ae | ||
![]() |
81aa747d83 | ||
![]() |
0e9723cb3b | ||
![]() |
899484a5d9 | ||
![]() |
4c2feb1b35 | ||
![]() |
d6d75b8c53 | ||
![]() |
6eff3902ca | ||
![]() |
8f71f29007 | ||
![]() |
b6fd909d67 | ||
![]() |
9500fa8770 | ||
![]() |
f92d9c85cb | ||
![]() |
04533a683b | ||
![]() |
08a38bbf61 | ||
![]() |
5f94e84542 | ||
![]() |
bdcd2720c4 | ||
![]() |
4784a076fa | ||
![]() |
07c522385f | ||
![]() |
d039d76cff | ||
![]() |
f91754ce7c | ||
![]() |
5911794b20 | ||
![]() |
f640bf9443 | ||
![]() |
9f50d8506c | ||
![]() |
361f6c2fe5 | ||
![]() |
8cac38e1ef | ||
![]() |
75757d027e | ||
![]() |
0c8b6e56da | ||
![]() |
5be4a12ee5 | ||
![]() |
433c7d33d9 | ||
![]() |
b755346ac0 | ||
![]() |
4c663e4a20 | ||
![]() |
a34e4c236d | ||
![]() |
b2b91f0cfd | ||
![]() |
bbb02f4e64 | ||
![]() |
3eaf46e09d | ||
![]() |
fc02d27056 | ||
![]() |
0fe7d81a5f | ||
![]() |
59dbe6ba83 | ||
![]() |
860a577ddb | ||
![]() |
2edb9cc5b8 | ||
![]() |
5bc13965e1 | ||
![]() |
2ca93fdb98 | ||
![]() |
aa62ca9a6e | ||
![]() |
1928cda394 | ||
![]() |
64f8e033c4 | ||
![]() |
23280c2143 | ||
![]() |
e4037d5aac | ||
![]() |
d2ec08e3f8 | ||
![]() |
b186f986ac | ||
![]() |
dbf91228fe | ||
![]() |
b58198b82b | ||
![]() |
eca92760f3 | ||
![]() |
d4815ca827 | ||
![]() |
4c19122acb | ||
![]() |
6bdbca4e19 | ||
![]() |
bb47a5d76f | ||
![]() |
f308fd481d | ||
![]() |
34adf767eb | ||
![]() |
2c6a26b01a | ||
![]() |
e596553dbf | ||
![]() |
990b1b8623 | ||
![]() |
9856249c88 | ||
![]() |
7818f0642f | ||
![]() |
bcea319eb8 | ||
![]() |
246ae9fe77 | ||
![]() |
b4a678640e | ||
![]() |
8692c17ea4 | ||
![]() |
59ee098fde | ||
![]() |
cd09043558 | ||
![]() |
6998a61f37 | ||
![]() |
be8f8eec70 | ||
![]() |
4986730f44 | ||
![]() |
85fb2c5725 | ||
![]() |
2baede4675 | ||
![]() |
176992a629 | ||
![]() |
905e7ffc43 | ||
![]() |
8ff130ebfd | ||
![]() |
064bcb31d8 | ||
![]() |
25e4e5e8b4 | ||
![]() |
e3018086fb | ||
![]() |
f3908da0a6 | ||
![]() |
2e57ffb169 | ||
![]() |
bda8199e5d | ||
![]() |
a6cbb64f59 | ||
![]() |
8b1efaeb53 | ||
![]() |
fa767adf52 | ||
![]() |
096a6128c9 | ||
![]() |
a5fa022792 | ||
![]() |
2922df08f4 | ||
![]() |
700aae3ab0 | ||
![]() |
cad6b4d1ee | ||
![]() |
2b57061949 | ||
![]() |
ca5b0a95d9 | ||
![]() |
0e3b486e22 | ||
![]() |
f3e5ad4a2a | ||
![]() |
ad2ab61927 | ||
![]() |
e2464cf3b1 | ||
![]() |
4c2959b4c4 | ||
![]() |
4718e9ff22 | ||
![]() |
8899e57f81 | ||
![]() |
14098177e4 | ||
![]() |
3c68e2bd29 | ||
![]() |
bebec4f638 | ||
![]() |
f16f00cc7e | ||
![]() |
b01b25b084 | ||
![]() |
39389f77d0 | ||
![]() |
a1dbcdbae3 | ||
![]() |
92f5b5a4ae | ||
![]() |
f379159a70 | ||
![]() |
ec850344fc | ||
![]() |
824f995209 | ||
![]() |
8a0a9700aa | ||
![]() |
7cd51d5611 | ||
![]() |
eda7b42edb | ||
![]() |
981ab25a91 | ||
![]() |
f0dded8eb5 | ||
![]() |
1f0e7e44cc | ||
![]() |
95c31d99c0 | ||
![]() |
e3db0dfbab | ||
![]() |
559ebf0852 | ||
![]() |
0e8abae46f | ||
![]() |
bfe034d77f | ||
![]() |
50a1656f61 | ||
![]() |
f70780f618 | ||
![]() |
712bd0cd04 | ||
![]() |
123d544cd1 | ||
![]() |
414966732c | ||
![]() |
58de0773f4 | ||
![]() |
22505195ec | ||
![]() |
ea2c9b3d9f | ||
![]() |
f39405640f | ||
![]() |
436b366743 | ||
![]() |
c3719f896d | ||
![]() |
654e5f4453 | ||
![]() |
fa54deb091 | ||
![]() |
346dbdf7bb | ||
![]() |
f246eb7736 | ||
![]() |
f7454c8064 | ||
![]() |
271f8d155c | ||
![]() |
6b93c2609e | ||
![]() |
2c342a7d44 | ||
![]() |
5b18f88b90 | ||
![]() |
d0ae5e42f4 | ||
![]() |
59d642434a | ||
![]() |
f2d6931f1a | ||
![]() |
2fb73b0951 | ||
![]() |
f3312852a9 | ||
![]() |
781a4a76c0 | ||
![]() |
475ff14f78 | ||
![]() |
b6698138b6 | ||
![]() |
6251d7737c | ||
![]() |
06e700c6a2 | ||
![]() |
ff65e2abb4 | ||
![]() |
a16c397843 | ||
![]() |
da2ba0ec49 | ||
![]() |
9d8e19622f | ||
![]() |
f820a2a631 | ||
![]() |
da089fc46a | ||
![]() |
937243a9d9 | ||
![]() |
a2de29e5ac | ||
![]() |
25cdf6d6bf | ||
![]() |
b5cf66c232 | ||
![]() |
7be3904123 | ||
![]() |
3109ea0220 | ||
![]() |
63297cb6a6 | ||
![]() |
ed480a2954 | ||
![]() |
3da6f6ffa6 | ||
![]() |
881d5d599d | ||
![]() |
b0b4614610 | ||
![]() |
f0e96b5f8b | ||
![]() |
6fed2cb9c0 | ||
![]() |
8e2ffa1654 | ||
![]() |
c25d4bd768 | ||
![]() |
9f8f2966d9 | ||
![]() |
5c976948dd | ||
![]() |
ff4b137088 | ||
![]() |
e3214e38d3 | ||
![]() |
4b1553abc7 | ||
![]() |
2fc457dd78 | ||
![]() |
3621ea934c | ||
![]() |
b275dac08a | ||
![]() |
47e1bfc810 | ||
![]() |
37e9ba48b1 | ||
![]() |
a54d537536 | ||
![]() |
0c2b221c06 | ||
![]() |
e3375741af | ||
![]() |
d82a88bcc6 | ||
![]() |
f7cab00e4d | ||
![]() |
7f733b8029 | ||
![]() |
d6291c8af4 | ||
![]() |
563852c024 | ||
![]() |
1941d9b748 | ||
![]() |
3473be99bf | ||
![]() |
10cb6a81c7 | ||
![]() |
cb65906290 | ||
![]() |
7a83d85884 | ||
![]() |
35f0d6908a | ||
![]() |
2c2d100c27 | ||
![]() |
ab623a7a91 | ||
![]() |
e2e606602b | ||
![]() |
cd3149b601 | ||
![]() |
50748db958 | ||
![]() |
8049dc7332 | ||
![]() |
f468796877 | ||
![]() |
c093780230 | ||
![]() |
c67e44cc9d | ||
![]() |
db45d0c87a | ||
![]() |
4107a01a01 | ||
![]() |
5e378844a1 | ||
![]() |
623496ff52 | ||
![]() |
5082814023 | ||
![]() |
9836b7aefb | ||
![]() |
cb9681ef41 | ||
![]() |
7527b8ac2d | ||
![]() |
da081ba706 | ||
![]() |
e6063da813 | ||
![]() |
e6b4cb94bd | ||
![]() |
56b843c007 | ||
![]() |
a26b30f0bc | ||
![]() |
4a1d8cdd0d | ||
![]() |
7a0920b87c | ||
![]() |
26199ebb76 | ||
![]() |
e3e01558b2 | ||
![]() |
1852486818 | ||
![]() |
d7ea394a15 | ||
![]() |
c4a1d8aa56 | ||
![]() |
be39591c54 | ||
![]() |
94320265b8 | ||
![]() |
b94a943694 | ||
![]() |
1674ec1ebf | ||
![]() |
3923e46f22 | ||
![]() |
ed71b499b9 | ||
![]() |
924fb90220 | ||
![]() |
00191763cf | ||
![]() |
555a21d648 | ||
![]() |
9d88db83ee | ||
![]() |
2bdecc899d | ||
![]() |
ab8992f0aa | ||
![]() |
31b203f81a | ||
![]() |
e474ad573a | ||
![]() |
4c6227fccf | ||
![]() |
02b7b12ea5 | ||
![]() |
d319a54fee | ||
![]() |
397a93bd6f | ||
![]() |
8d3f4137a1 | ||
![]() |
3a615a070b | ||
![]() |
95a04788e5 | ||
![]() |
60a1a1f21c | ||
![]() |
4ad5627823 | ||
![]() |
5a83621c64 | ||
![]() |
ed6d2fc005 | ||
![]() |
63f05a7388 | ||
![]() |
a687377d16 | ||
![]() |
9dc8f66153 | ||
![]() |
e155174bd7 | ||
![]() |
6c06e24b48 | ||
![]() |
a99fcbb71d | ||
![]() |
95b8b0b4dd | ||
![]() |
c47fe51422 | ||
![]() |
25b3aa5850 | ||
![]() |
a87d8871ad | ||
![]() |
d6fa3b02a9 | ||
![]() |
8a514fff17 | ||
![]() |
00b43e88dc | ||
![]() |
7048c2c10c | ||
![]() |
3f64789c55 | ||
![]() |
38e7f7f1b6 | ||
![]() |
b337bc5cfd | ||
![]() |
4ac5daed8c | ||
![]() |
82b724174c | ||
![]() |
e7ab2bcffd | ||
![]() |
3518c74508 | ||
![]() |
a9515d38d1 | ||
![]() |
e32bce29e0 | ||
![]() |
48ca696b0b | ||
![]() |
7bd9a887a6 | ||
![]() |
7bc66e9382 | ||
![]() |
ff3feb61bc | ||
![]() |
2cb98d65da | ||
![]() |
b7ac65fce0 | ||
![]() |
601fff454d | ||
![]() |
730084425e | ||
![]() |
646094f210 | ||
![]() |
d5c9e1e9f6 | ||
![]() |
8d0bcb94b1 | ||
![]() |
f681f0e50a | ||
![]() |
2185f59111 | ||
![]() |
c5ba0b1e42 | ||
![]() |
b522284834 | ||
![]() |
3e2adfb0b8 | ||
![]() |
1a6f6759b9 | ||
![]() |
43a67bcd9d | ||
![]() |
5f7621cd8c | ||
![]() |
5e30a0b250 | ||
![]() |
8f02072762 | ||
![]() |
79fdba44c6 | ||
![]() |
efe0bad650 | ||
![]() |
a244362935 | ||
![]() |
924f5f13b1 | ||
![]() |
8f8dbd2023 | ||
![]() |
952d31a7d5 | ||
![]() |
f6e90a3121 | ||
![]() |
2818af7402 | ||
![]() |
9a36bdb9d1 | ||
![]() |
033468b0b0 | ||
![]() |
e6d83c6c58 | ||
![]() |
49d58c69bc | ||
![]() |
67ff355ca3 | ||
![]() |
5b0a7b39b7 | ||
![]() |
4ff5dea346 | ||
![]() |
4f244a126c | ||
![]() |
1926dffb7b | ||
![]() |
8642725b9f | ||
![]() |
7252f80573 | ||
![]() |
2d331332a4 | ||
![]() |
f36e2551b5 | ||
![]() |
bcf09c59e3 | ||
![]() |
b84c41d668 | ||
![]() |
2fbbb18bd9 | ||
![]() |
d48c2ddb36 | ||
![]() |
2b55e72be2 | ||
![]() |
b21fcf8f2b | ||
![]() |
02a99e8118 | ||
![]() |
fa66c96d60 | ||
![]() |
888c8217ca | ||
![]() |
de3aab4996 | ||
![]() |
8d587d27e5 | ||
![]() |
fa7bb79122 | ||
![]() |
f3255a7f31 | ||
![]() |
69680cbb8d | ||
![]() |
69c693a0a3 | ||
![]() |
69cdd5fb4a | ||
![]() |
59101cfcb3 | ||
![]() |
7120e32c91 | ||
![]() |
0a0d94ec91 | ||
![]() |
43e3277c0d | ||
![]() |
da28596968 | ||
![]() |
c1c7654380 | ||
![]() |
20116d7af6 | ||
![]() |
8c32fe010c | ||
![]() |
0a3debb691 | ||
![]() |
a3e5d04aac | ||
![]() |
153c98c03a | ||
![]() |
90fa980b70 | ||
![]() |
42bfde0e7f | ||
![]() |
14122bcfa2 | ||
![]() |
84879af11a | ||
![]() |
1c371347e9 | ||
![]() |
0c08a4d10c | ||
![]() |
3a66aaf9d7 | ||
![]() |
1992d99556 | ||
![]() |
60046da4b3 | ||
![]() |
e33e954e41 | ||
![]() |
f5e5091b10 | ||
![]() |
38691b80f2 | ||
![]() |
8d5eef6fa7 | ||
![]() |
e0f935519a | ||
![]() |
0f6855d978 | ||
![]() |
1b9081ce80 | ||
![]() |
e1098d9502 | ||
![]() |
3102f39706 | ||
![]() |
46ac0a6caf | ||
![]() |
68e1db040a | ||
![]() |
e34772b8b8 | ||
![]() |
14a4acdd92 | ||
![]() |
cf6558ec6a | ||
![]() |
f5f88d3d9d | ||
![]() |
64955bfcd6 | ||
![]() |
9fa9021a81 | ||
![]() |
43183401b7 | ||
![]() |
880b9ce82b | ||
![]() |
3584af524b | ||
![]() |
af174933d6 | ||
![]() |
c4490717c0 | ||
![]() |
70b6be7301 | ||
![]() |
8d5b0fe863 | ||
![]() |
03045eb952 | ||
![]() |
f7b0272be5 | ||
![]() |
4fa16c8a20 | ||
![]() |
855a7bbe14 | ||
![]() |
2b3694f517 | ||
![]() |
101177a865 | ||
![]() |
8b33f98c79 | ||
![]() |
98e52f50a9 | ||
![]() |
7551201796 | ||
![]() |
3fe2dccb94 | ||
![]() |
f53eb31274 | ||
![]() |
81663f351a | ||
![]() |
bf5d037cff | ||
![]() |
53d9af3279 | ||
![]() |
b7dd354313 | ||
![]() |
d8bc9ce859 | ||
![]() |
1bb9358f77 | ||
![]() |
fa77ff3995 | ||
![]() |
1ae8d9c643 | ||
![]() |
a560f0c96e | ||
![]() |
434bacf185 | ||
![]() |
79de7ec015 | ||
![]() |
dfdb3b051b | ||
![]() |
9fbf9136fc | ||
![]() |
25fdba7104 | ||
![]() |
c91707e94f | ||
![]() |
d665eef430 | ||
![]() |
4579e839cd | ||
![]() |
6e952180ec | ||
![]() |
a947254ca8 | ||
![]() |
1eb4a7fc26 | ||
![]() |
78f25a7679 | ||
![]() |
0c4d8b0784 | ||
![]() |
e2c8093b97 | ||
![]() |
c497a71361 | ||
![]() |
ec2982b1c4 | ||
![]() |
be0aeefdb3 | ||
![]() |
eadd8d563e | ||
![]() |
08f1ad4c75 | ||
![]() |
426606ba06 | ||
![]() |
7b59ba4b73 | ||
![]() |
0471fcec15 | ||
![]() |
4110d09dab | ||
![]() |
533837f5b7 | ||
![]() |
144924e579 | ||
![]() |
6902ccdb95 | ||
![]() |
7ed5aff168 | ||
![]() |
3f0db97a68 | ||
![]() |
231594d709 | ||
![]() |
e4ae114c71 | ||
![]() |
20000d16f8 | ||
![]() |
5e0a9b2e52 | ||
![]() |
fa70447223 | ||
![]() |
acf418b52f | ||
![]() |
28b84e38ca | ||
![]() |
3c4a078fa5 | ||
![]() |
52f4e88420 | ||
![]() |
16d9045a80 | ||
![]() |
07d7d8daba | ||
![]() |
b2b9476298 | ||
![]() |
cf7f3dffe3 | ||
![]() |
621005eb27 | ||
![]() |
d46e1de8aa | ||
![]() |
c44f3c5f25 | ||
![]() |
b3f9d48609 | ||
![]() |
edd7e9c7b7 | ||
![]() |
ab8061ab39 | ||
![]() |
c1a1f53707 | ||
![]() |
04097a0ef5 | ||
![]() |
85be974e64 | ||
![]() |
0df5fb4a34 | ||
![]() |
920b2b85b3 | ||
![]() |
4e4788bf57 | ||
![]() |
9aa60a9d0d | ||
![]() |
451ac51520 | ||
![]() |
04084aef33 | ||
![]() |
4198ca3fae | ||
![]() |
3b09dfa145 | ||
![]() |
923b559857 | ||
![]() |
58682b6bf1 | ||
![]() |
88c4198145 | ||
![]() |
a6c535414f | ||
![]() |
6ebb7723ff | ||
![]() |
07dd6600dc | ||
![]() |
cc6cfec907 | ||
![]() |
4ecfcfda36 | ||
![]() |
c5681b1376 | ||
![]() |
1fc57018e3 | ||
![]() |
8b8bacdf69 | ||
![]() |
3aaa419f8b | ||
![]() |
94819019ec | ||
![]() |
7b37035f75 | ||
![]() |
a5ef3507c3 | ||
![]() |
b9c6d30678 | ||
![]() |
009556f984 | ||
![]() |
87007d5ae3 | ||
![]() |
61ea2c77c8 | ||
![]() |
c5dbccf807 | ||
![]() |
ab4bf45c10 | ||
![]() |
61853428de | ||
![]() |
ae8c0128cb | ||
![]() |
744e731a22 | ||
![]() |
bb34e21791 | ||
![]() |
74f91b7cb3 | ||
![]() |
7bcf3dbabe | ||
![]() |
273111fb05 | ||
![]() |
8ba067d90e | ||
![]() |
b68f71ec62 | ||
![]() |
7100d12818 | ||
![]() |
f041f0f07a | ||
![]() |
6deb9ab48a | ||
![]() |
1e1c05c138 | ||
![]() |
8cfc20a81c | ||
![]() |
c853c96ae9 | ||
![]() |
85fe9eb4ec | ||
![]() |
cf5af26d6e | ||
![]() |
90e56e7605 | ||
![]() |
1c4e527db6 | ||
![]() |
75a0aadce4 | ||
![]() |
01e3e91e51 | ||
![]() |
7514fa41a1 | ||
![]() |
69115fb77a | ||
![]() |
99ab8dacd4 | ||
![]() |
e30d2cd85b | ||
![]() |
657915b1fe | ||
![]() |
90149def0a | ||
![]() |
1926eca929 | ||
![]() |
f20ba3e8bc | ||
![]() |
6f972ab4cc | ||
![]() |
129bc8a9f1 | ||
![]() |
4673aa498e | ||
![]() |
a2e0db2a16 | ||
![]() |
8def92eb5e | ||
![]() |
5b7e8f73b5 | ||
![]() |
7fa29b4b37 | ||
![]() |
a859baac97 | ||
![]() |
b7a676f668 | ||
![]() |
26d81f10a6 | ||
![]() |
be4cc804a2 | ||
![]() |
1b253ccb0a | ||
![]() |
8bfc1dc302 | ||
![]() |
ff49b9e38a | ||
![]() |
439e407595 | ||
![]() |
1eed32f8d8 | ||
![]() |
66098b5c6d | ||
![]() |
a725d25e46 | ||
![]() |
4e42dfd46b | ||
![]() |
c2657568a6 | ||
![]() |
dbe7b8cf56 | ||
![]() |
a82a65ed46 | ||
![]() |
893d9a9887 | ||
![]() |
1facd46901 | ||
![]() |
7af89e1d07 | ||
![]() |
50b2040d16 | ||
![]() |
a65505c498 | ||
![]() |
7e8c19e97b | ||
![]() |
8ac101cf9c | ||
![]() |
6297987e4f | ||
![]() |
8c8c49055b | ||
![]() |
cbd7c7c02f | ||
![]() |
57a198b082 | ||
![]() |
e245629c5a | ||
![]() |
760311ffa0 | ||
![]() |
2f13f3a401 | ||
![]() |
5ddf36d4c1 | ||
![]() |
a632a599d3 | ||
![]() |
ca9f11484c | ||
![]() |
9d224cbce2 | ||
![]() |
7df36b89c3 | ||
![]() |
8b62aa24ea | ||
![]() |
9502240480 | ||
![]() |
31efa2f9c1 | ||
![]() |
b40192f2ad | ||
![]() |
489ea5f891 | ||
![]() |
05eb24cd99 | ||
![]() |
5053743b1b | ||
![]() |
6d7f25870e | ||
![]() |
6cdee22164 | ||
![]() |
c043d5bc83 | ||
![]() |
d7741f07a1 | ||
![]() |
14c0b8891d | ||
![]() |
ea1d8e95f3 | ||
![]() |
50c20f08f8 | ||
![]() |
8f55333d23 | ||
![]() |
3be98e6244 | ||
![]() |
5e771534a8 | ||
![]() |
ba33f18af7 | ||
![]() |
82f3b61b5e | ||
![]() |
f587fd279c | ||
![]() |
8d13cb0fe8 | ||
![]() |
d1a6baf858 | ||
![]() |
25034342c3 | ||
![]() |
379775bcd3 | ||
![]() |
ff18926bf9 | ||
![]() |
37e564130e | ||
![]() |
d8a8d41614 | ||
![]() |
7db3335938 | ||
![]() |
c1051379c1 | ||
![]() |
f7a0fb488b | ||
![]() |
2706045cc2 | ||
![]() |
908f90cd52 | ||
![]() |
67bbbd7f65 | ||
![]() |
0008b2f022 | ||
![]() |
3e61630c6a | ||
![]() |
6f912dc12b | ||
![]() |
e1f2e176ce | ||
![]() |
f39b4c6dbe | ||
![]() |
c49ff68ed6 | ||
![]() |
891cf42338 | ||
![]() |
b9763044ee | ||
![]() |
46e0035327 | ||
![]() |
6df8707b6d | ||
![]() |
24b7922539 | ||
![]() |
485665d449 | ||
![]() |
e09a011c23 | ||
![]() |
833a348fdb | ||
![]() |
26ff6f17e7 | ||
![]() |
d026e634e5 | ||
![]() |
356a2f38b6 | ||
![]() |
bdb37a9a18 | ||
![]() |
22d89041f8 | ||
![]() |
d5285cf268 | ||
![]() |
3db98aa421 | ||
![]() |
47dba5b52c | ||
![]() |
72874a1e84 | ||
![]() |
fc1deb67e8 | ||
![]() |
d0bb3c731c | ||
![]() |
13e54a46d7 | ||
![]() |
55a975bc8b | ||
![]() |
a62752efec | ||
![]() |
4e97ce5117 | ||
![]() |
19a5f2dc2d | ||
![]() |
52433afd13 | ||
![]() |
e1d9f50426 | ||
![]() |
5837c61ac4 | ||
![]() |
8c03e5b1aa | ||
![]() |
66074e3eb6 | ||
![]() |
221746f3e7 | ||
![]() |
2c59e30c39 | ||
![]() |
4e13a601cc | ||
![]() |
a159890cba | ||
![]() |
4534eefc1d | ||
![]() |
e06c44f973 | ||
![]() |
c1616b1a7a | ||
![]() |
5b34fa9371 | ||
![]() |
956a923ea2 | ||
![]() |
224abcb2c4 | ||
![]() |
e8af224f7b | ||
![]() |
a1d39563c3 | ||
![]() |
621536a078 | ||
![]() |
3cf9353d08 | ||
![]() |
6a2fa7efa9 | ||
![]() |
6b0fe0e2d1 | ||
![]() |
923876dc23 | ||
![]() |
233ae9cbe6 | ||
![]() |
09daf8102d | ||
![]() |
fd7893e9f8 | ||
![]() |
cf5c3e71f6 | ||
![]() |
5c30bbb7e4 | ||
![]() |
afce339187 | ||
![]() |
d528d1148b | ||
![]() |
786b31e2a2 | ||
![]() |
0ad32fa79d | ||
![]() |
93a89e3c86 | ||
![]() |
4e667edf9f | ||
![]() |
403bafe0a2 | ||
![]() |
40209dc60d | ||
![]() |
1ccd1df6e1 | ||
![]() |
800c1fa039 | ||
![]() |
0a67987e3c | ||
![]() |
6c7a8092a4 | ||
![]() |
9f87886a9b | ||
![]() |
0aa5df421d | ||
![]() |
d3498a6a46 | ||
![]() |
41a53a3e8e | ||
![]() |
636942ff86 | ||
![]() |
d1b874c191 | ||
![]() |
89f369abe6 | ||
![]() |
f7cea92900 | ||
![]() |
9a611709d0 | ||
![]() |
2094409d23 | ||
![]() |
2b061d3f77 | ||
![]() |
ed06c78a16 | ||
![]() |
36a6af05c4 | ||
![]() |
64b4eed9c3 | ||
![]() |
afc9270846 | ||
![]() |
2ea5edc101 | ||
![]() |
869a7e866c | ||
![]() |
1bd3b5301b | ||
![]() |
4ff66a39d8 | ||
![]() |
a3857d5dc8 | ||
![]() |
bf762cc4c7 | ||
![]() |
461cd2bec7 | ||
![]() |
da599567f8 | ||
![]() |
7f921c4d34 | ||
![]() |
0eb006f297 | ||
![]() |
07095f3476 | ||
![]() |
59b283067b | ||
![]() |
3635eee77d | ||
![]() |
64df798dc1 | ||
![]() |
f091206e37 | ||
![]() |
3148927395 | ||
![]() |
fb39bfd560 | ||
![]() |
f8cd9fcea7 | ||
![]() |
f1148cc47f | ||
![]() |
ffcc0d549a | ||
![]() |
861dd8ef86 | ||
![]() |
1e5e46eae1 | ||
![]() |
d644eec56e | ||
![]() |
a656699afd | ||
![]() |
93db8fa046 | ||
![]() |
05669046e9 | ||
![]() |
025d2d1748 | ||
![]() |
e17ba8c351 | ||
![]() |
d3dee44475 | ||
![]() |
0f0699d46a | ||
![]() |
b7540e59a8 | ||
![]() |
827345d899 | ||
![]() |
59de67ca58 | ||
![]() |
ccad826ca9 | ||
![]() |
838acc0a23 | ||
![]() |
804ae44ec8 | ||
![]() |
5f04c3b74b | ||
![]() |
4afd49e38c | ||
![]() |
ba32c69001 | ||
![]() |
e9a3947488 | ||
![]() |
b2f4b44123 | ||
![]() |
f4eacc1d66 | ||
![]() |
9155104662 | ||
![]() |
cbbd38ca83 | ||
![]() |
e5cf72e79b | ||
![]() |
a71d9c0727 | ||
![]() |
26e2c60265 | ||
![]() |
a5a0546e68 | ||
![]() |
92b34fbc08 | ||
![]() |
38b7e44f64 | ||
![]() |
3aa957a3f5 | ||
![]() |
cb06a8e493 | ||
![]() |
4569126322 | ||
![]() |
db8c534d0a | ||
![]() |
4ee4a7e5fa | ||
![]() |
bf6c75de2b | ||
![]() |
ced8557517 | ||
![]() |
093f79df4e | ||
![]() |
5a3a39e795 | ||
![]() |
0cf4945175 | ||
![]() |
43cd3318da | ||
![]() |
1c43eb94f6 | ||
![]() |
972df1ac11 | ||
![]() |
79b15658b9 | ||
![]() |
ef65859c9a | ||
![]() |
e932b07fc1 | ||
![]() |
44f69d66e2 | ||
![]() |
de9d1f2aae | ||
![]() |
ce584fa9b9 | ||
![]() |
2f03c7cea7 | ||
![]() |
c61be3d52b | ||
![]() |
1d6e0ac2e7 | ||
![]() |
758faf3189 | ||
![]() |
0452f42c41 | ||
![]() |
6197215500 | ||
![]() |
6d0293975d | ||
![]() |
30a8a8d287 | ||
![]() |
1198ede0fd | ||
![]() |
90affc3efb | ||
![]() |
3b25645154 | ||
![]() |
30265699d4 | ||
![]() |
63355d1a74 | ||
![]() |
52c37f8988 | ||
![]() |
0ed6575213 | ||
![]() |
406baafd8d | ||
![]() |
45e6844931 | ||
![]() |
4db4d49187 | ||
![]() |
8a1a3ce002 | ||
![]() |
987a02b2fe | ||
![]() |
0267b454d2 | ||
![]() |
310e956ce8 | ||
![]() |
77a2113411 | ||
![]() |
fce8565835 | ||
![]() |
5a894ebfd3 | ||
![]() |
353b9b5ec8 | ||
![]() |
1fc73dca0b | ||
![]() |
009c2e9478 | ||
![]() |
8ee2bff9a8 | ||
![]() |
395bcbc2cb | ||
![]() |
9ef870e793 | ||
![]() |
51eb616750 | ||
![]() |
33c32d8c28 | ||
![]() |
e29e39b5e4 | ||
![]() |
effe66f5b7 | ||
![]() |
a907978825 | ||
![]() |
f42d4e0eb4 | ||
![]() |
f0628e68d5 | ||
![]() |
b3b6ca6f43 | ||
![]() |
722f91da0c | ||
![]() |
655079741a | ||
![]() |
307f598be0 | ||
![]() |
3aeac5610b | ||
![]() |
d1b10fefae | ||
![]() |
a1172cff6a | ||
![]() |
ab8d61067d | ||
![]() |
f36c7e5e3f | ||
![]() |
0839b51837 | ||
![]() |
a9c36e695b | ||
![]() |
cdf8bb34fa | ||
![]() |
fe3a1a58f6 | ||
![]() |
cedbadee39 | ||
![]() |
55b1792720 | ||
![]() |
75db896e0b | ||
![]() |
7cfed6ff23 | ||
![]() |
49f1176591 | ||
![]() |
e9e6211725 | ||
![]() |
170ef76721 | ||
![]() |
e6d449894d | ||
![]() |
acc4eddf8f | ||
![]() |
93f58bb7aa | ||
![]() |
8cc934ad5f | ||
![]() |
a96745b2a7 | ||
![]() |
560045f69d |
@@ -1,6 +1,9 @@
|
|||||||
{
|
{
|
||||||
"files": [
|
"files": [
|
||||||
"README.md"
|
"README.md",
|
||||||
|
"README.zh-CN.md",
|
||||||
|
"README.ru-RU.md",
|
||||||
|
"README.ko-KR.md"
|
||||||
],
|
],
|
||||||
"imageSize": 100,
|
"imageSize": 100,
|
||||||
"commit": false,
|
"commit": false,
|
||||||
@@ -388,10 +391,218 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"design"
|
"design"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "ydcool",
|
||||||
|
"name": "Dominic Yin",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/5668295?v=4",
|
||||||
|
"profile": "https://github.com/ydcool",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "bdr99",
|
||||||
|
"name": "Brandon Rothweiler",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/2292715?v=4",
|
||||||
|
"profile": "https://github.com/bdr99",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "logicmachine123",
|
||||||
|
"name": "Logic Machine",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/63876444?v=4",
|
||||||
|
"profile": "https://git.io/JnP49",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "cypherbits",
|
||||||
|
"name": "cypherbits",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/10424900?v=4",
|
||||||
|
"profile": "https://github.com/cypherbits",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "KingMob",
|
||||||
|
"name": "Matthew Davidson",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/946421?v=4",
|
||||||
|
"profile": "https://modulolotus.net",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "al-wi",
|
||||||
|
"name": "Alexander Wiedemann",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/11092199?v=4",
|
||||||
|
"profile": "https://github.com/al-wi",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "BoYeonJang",
|
||||||
|
"name": "장보연",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/59506394?v=4",
|
||||||
|
"profile": "https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Me1onRind",
|
||||||
|
"name": "zZ",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/19531270?v=4",
|
||||||
|
"profile": "https://github.com/Me1onRind",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "tainoNZ",
|
||||||
|
"name": "Aaron Davison",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/49261322?v=4",
|
||||||
|
"profile": "https://github.com/tainoNZ",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "composer404",
|
||||||
|
"name": "Przemyslaw Kozik",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/58251560?v=4",
|
||||||
|
"profile": "https://github.com/composer404",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "highfredo",
|
||||||
|
"name": "Alfredo Arellano de la Fuente",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/5951524?v=4",
|
||||||
|
"profile": "https://github.com/highfredo",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "NessunKim",
|
||||||
|
"name": "MH Kim",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/12974079?v=4",
|
||||||
|
"profile": "https://github.com/NessunKim",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jaimeadf",
|
||||||
|
"name": "Marmota",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/40345645?v=4",
|
||||||
|
"profile": "https://discord.gg/4c5EVTBhtp",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "TENX-S",
|
||||||
|
"name": "Ares Andrew",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/40336192?v=4",
|
||||||
|
"profile": "https://ares.zone",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "gkor",
|
||||||
|
"name": "George Korsnick",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/780052?v=4",
|
||||||
|
"profile": "https://usual.io/",
|
||||||
|
"contributions": [
|
||||||
|
"financial"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "uluhonolulu",
|
||||||
|
"name": "Artem Smirnov",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/872764?v=4",
|
||||||
|
"profile": "https://about.me/ulu",
|
||||||
|
"contributions": [
|
||||||
|
"financial"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "nevotheless",
|
||||||
|
"name": "Tim Kopplow",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/779797?v=4",
|
||||||
|
"profile": "https://github.com/nevotheless",
|
||||||
|
"contributions": [
|
||||||
|
"financial"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "mrthock",
|
||||||
|
"name": "mrthock",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/88901709?v=4",
|
||||||
|
"profile": "https://github.com/mrthock",
|
||||||
|
"contributions": [
|
||||||
|
"financial"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "lrottach",
|
||||||
|
"name": "Lukas Rottach",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/50323692?v=4",
|
||||||
|
"profile": "https://github.com/lrottach",
|
||||||
|
"contributions": [
|
||||||
|
"financial"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "boonkerz",
|
||||||
|
"name": "boonkerz",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/277321?v=4",
|
||||||
|
"profile": "https://github.com/boonkerz",
|
||||||
|
"contributions": [
|
||||||
|
"code",
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "milotype",
|
||||||
|
"name": "Milo Ivir",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/43657314?v=4",
|
||||||
|
"profile": "https://github.com/milotype",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "JasonCubic",
|
||||||
|
"name": "JasonCubic",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/8921015?v=4",
|
||||||
|
"profile": "https://github.com/JasonCubic",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "MaxWaldorf",
|
||||||
|
"name": "MaxWaldorf",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/15877853?v=4",
|
||||||
|
"profile": "https://github.com/MaxWaldorf",
|
||||||
|
"contributions": [
|
||||||
|
"infra"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
"projectName": "terminus",
|
"projectName": "tabby",
|
||||||
"projectOwner": "Eugeny",
|
"projectOwner": "Eugeny",
|
||||||
"repoType": "github",
|
"repoType": "github",
|
||||||
"repoHost": "https://github.com",
|
"repoHost": "https://github.com",
|
||||||
|
@@ -36,7 +36,9 @@ rules:
|
|||||||
'@typescript-eslint/prefer-readonly': off
|
'@typescript-eslint/prefer-readonly': off
|
||||||
'@typescript-eslint/require-await': off
|
'@typescript-eslint/require-await': off
|
||||||
'@typescript-eslint/strict-boolean-expressions': off
|
'@typescript-eslint/strict-boolean-expressions': off
|
||||||
'@typescript-eslint/no-misused-promises': off
|
'@typescript-eslint/no-misused-promises':
|
||||||
|
- error
|
||||||
|
- checksVoidReturn: false
|
||||||
'@typescript-eslint/typedef': off
|
'@typescript-eslint/typedef': off
|
||||||
'@typescript-eslint/consistent-type-imports': off
|
'@typescript-eslint/consistent-type-imports': off
|
||||||
'@typescript-eslint/sort-type-union-intersection-members': off
|
'@typescript-eslint/sort-type-union-intersection-members': off
|
||||||
@@ -95,7 +97,9 @@ rules:
|
|||||||
- error
|
- error
|
||||||
- single
|
- single
|
||||||
- allowTemplateLiterals: true
|
- allowTemplateLiterals: true
|
||||||
'@typescript-eslint/no-confusing-void-expression': off
|
'@typescript-eslint/no-confusing-void-expression':
|
||||||
|
- error
|
||||||
|
- ignoreArrowShorthand: true
|
||||||
'@typescript-eslint/no-non-null-assertion': off
|
'@typescript-eslint/no-non-null-assertion': off
|
||||||
'@typescript-eslint/no-unnecessary-condition':
|
'@typescript-eslint/no-unnecessary-condition':
|
||||||
- error
|
- error
|
||||||
@@ -116,3 +120,9 @@ rules:
|
|||||||
'@typescript-eslint/no-var-requires': off
|
'@typescript-eslint/no-var-requires': off
|
||||||
'@typescript-eslint/no-unsafe-argument': off
|
'@typescript-eslint/no-unsafe-argument': off
|
||||||
'@typescript-eslint/restrict-plus-operands': off
|
'@typescript-eslint/restrict-plus-operands': off
|
||||||
|
'@typescript-eslint/space-infix-ops': off
|
||||||
|
'@typescript-eslint/no-type-alias':
|
||||||
|
- error
|
||||||
|
- allowAliases: in-unions-and-intersections
|
||||||
|
allowLiterals: always
|
||||||
|
allowCallbacks: always
|
||||||
|
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1,3 +1,3 @@
|
|||||||
github: eugeny
|
github: eugeny
|
||||||
open_collective: terminus
|
open_collective: tabby
|
||||||
ko_fi: eugeny
|
ko_fi: eugeny
|
||||||
|
27
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
27
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
# RULES:
|
||||||
|
|
||||||
|
* **ENGLISH ONLY** - this issue tracker is English-only. Please respect the people who take time to help you with your problems.
|
||||||
|
* Search existing issues first: https://github.com/Eugeny/tabby/issues
|
||||||
|
-->
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
23
.github/ISSUE_TEMPLATE/issue-report.md
vendored
Normal file
23
.github/ISSUE_TEMPLATE/issue-report.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
name: Issue report
|
||||||
|
about: Report a problem
|
||||||
|
title: ''
|
||||||
|
labels: 'T: Bug'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
# READ CAREFULLY:
|
||||||
|
|
||||||
|
* **ENGLISH ONLY** - this issue tracker is English-only. Please respect the people who take time to help you with your problems.
|
||||||
|
* Search existing issues first: https://github.com/Eugeny/tabby/issues
|
||||||
|
* Test with the latest Tabby version: https://github.com/Eugeny/tabby/releases
|
||||||
|
* Disable third-party plugins.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**Describe the problem**:
|
||||||
|
[A clear and concise description of what the bug is.]
|
||||||
|
|
||||||
|
**To Reproduce**:
|
||||||
|
[Steps to reproduce the behavior]
|
18
.github/dependabot.yml
vendored
18
.github/dependabot.yml
vendored
@@ -13,55 +13,55 @@ updates:
|
|||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-core"
|
directory: "/tabby-core"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-settings"
|
directory: "/tabby-settings"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-terminal"
|
directory: "/tabby-terminal"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-local"
|
directory: "/tabby-local"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-community-color-schemes"
|
directory: "/tabby-community-color-schemes"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-electron"
|
directory: "/tabby-electron"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-web"
|
directory: "/tabby-web"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-plugin-manager"
|
directory: "/tabby-plugin-manager"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
open-pull-requests-limit: 20
|
open-pull-requests-limit: 20
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/terminus-ssh"
|
directory: "/tabby-ssh"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
|
313
.github/workflows/build.yml
vendored
Normal file
313
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
name: Package-Build
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
Lint:
|
||||||
|
runs-on: macos-11.0
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.3.4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Installing Node
|
||||||
|
uses: actions/setup-node@v2.5.1
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- name: Install deps
|
||||||
|
run: |
|
||||||
|
npm i -g yarn@1.19.1
|
||||||
|
cd app
|
||||||
|
yarn
|
||||||
|
cd ..
|
||||||
|
rm app/node_modules/.yarn-integrity
|
||||||
|
yarn
|
||||||
|
|
||||||
|
- name: Build typings
|
||||||
|
run: yarn run build:typings
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
run: yarn run lint
|
||||||
|
|
||||||
|
macOS-Build:
|
||||||
|
runs-on: macos-11.0
|
||||||
|
needs: Lint
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x86_64
|
||||||
|
- arch: arm64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.3.4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Installing Node
|
||||||
|
uses: actions/setup-node@v2.5.1
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- name: Install deps
|
||||||
|
run: |
|
||||||
|
sudo npm i -g yarn@1.22.1
|
||||||
|
cd app
|
||||||
|
yarn
|
||||||
|
cd ..
|
||||||
|
rm app/node_modules/.yarn-integrity
|
||||||
|
yarn
|
||||||
|
|
||||||
|
- name: Build native deps
|
||||||
|
run: scripts/build-native.js
|
||||||
|
env:
|
||||||
|
ARCH: ${{matrix.arch}}
|
||||||
|
|
||||||
|
- name: Build native deps
|
||||||
|
run: |
|
||||||
|
rm -rf app/node_modules/cpu-features
|
||||||
|
rm -rf app/node_modules/ssh2/crypto/build
|
||||||
|
if: ${{ matrix.arch == 'arm64' }}
|
||||||
|
|
||||||
|
- name: Webpack
|
||||||
|
run: yarn run build
|
||||||
|
|
||||||
|
- name: Prepackage plugins
|
||||||
|
run: scripts/prepackage-plugins.js
|
||||||
|
env:
|
||||||
|
ARCH: ${{matrix.arch}}
|
||||||
|
|
||||||
|
- run: sed -i '' 's/updateInfo = await/\/\/updateInfo = await/g' node_modules/app-builder-lib/out/targets/ArchiveTarget.js
|
||||||
|
|
||||||
|
- name: Build and sign packages
|
||||||
|
run: scripts/build-macos.js
|
||||||
|
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
|
||||||
|
env:
|
||||||
|
ARCH: ${{matrix.arch}}
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
CSC_LINK: ${{ secrets.CSC_LINK }}
|
||||||
|
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
|
||||||
|
APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}
|
||||||
|
APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }}
|
||||||
|
USE_HARD_LINKS: false
|
||||||
|
# DEBUG: electron-builder,electron-builder:*
|
||||||
|
|
||||||
|
- name: Build packages without signing
|
||||||
|
run: scripts/build-macos.js
|
||||||
|
if: "! (github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||||
|
env:
|
||||||
|
ARCH: ${{matrix.arch}}
|
||||||
|
# DEBUG: electron-builder,electron-builder:*
|
||||||
|
|
||||||
|
- name: Upload symbols
|
||||||
|
run: |
|
||||||
|
sudo npm install -g @sentry/cli --unsafe-perm
|
||||||
|
./scripts/sentry-upload.js
|
||||||
|
env:
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
|
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||||
|
|
||||||
|
- name: Package artifacts
|
||||||
|
run: |
|
||||||
|
mkdir artifact-pkg
|
||||||
|
mv dist/*.pkg artifact-pkg/
|
||||||
|
mkdir artifact-zip
|
||||||
|
mv dist/*.zip artifact-zip/
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload PKG
|
||||||
|
with:
|
||||||
|
name: macOS .pkg (${{matrix.arch}})
|
||||||
|
path: artifact-pkg
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload ZIP
|
||||||
|
with:
|
||||||
|
name: macOS .zip (${{matrix.arch}})
|
||||||
|
path: artifact-zip
|
||||||
|
|
||||||
|
Linux-Build:
|
||||||
|
runs-on: ubuntu-18.04 # build against an older glibc for compatibility
|
||||||
|
needs: Lint
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.3.4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install Node
|
||||||
|
uses: actions/setup-node@v2.5.1
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- name: Install deps
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install libarchive-tools zsh
|
||||||
|
npm i -g yarn@1.19.1
|
||||||
|
cd app
|
||||||
|
yarn
|
||||||
|
cd ..
|
||||||
|
rm app/node_modules/.yarn-integrity
|
||||||
|
yarn
|
||||||
|
|
||||||
|
- name: Build native deps
|
||||||
|
run: scripts/build-native.js
|
||||||
|
|
||||||
|
- name: Webpack
|
||||||
|
run: yarn run build
|
||||||
|
|
||||||
|
- name: Prepackage plugins
|
||||||
|
run: scripts/prepackage-plugins.js
|
||||||
|
|
||||||
|
- name: Build packages
|
||||||
|
run: scripts/build-linux.js
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
USE_HARD_LINKS: false
|
||||||
|
# DEBUG: electron-builder,electron-builder:*
|
||||||
|
|
||||||
|
- name: Build web resources
|
||||||
|
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
|
||||||
|
|
||||||
|
- name: Upload symbols
|
||||||
|
run: |
|
||||||
|
sudo npm install -g @sentry/cli --unsafe-perm
|
||||||
|
./scripts/sentry-upload.js
|
||||||
|
env:
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
|
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||||
|
|
||||||
|
- name: Upload packages to packagecloud.io
|
||||||
|
uses: Eugeny/packagecloud-action@main
|
||||||
|
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
env:
|
||||||
|
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
|
||||||
|
with:
|
||||||
|
repo: 'eugeny/tabby'
|
||||||
|
dir: 'dist'
|
||||||
|
|
||||||
|
- name: Package artifacts
|
||||||
|
run: |
|
||||||
|
mkdir artifact-deb
|
||||||
|
mv dist/*.deb artifact-deb/ || true
|
||||||
|
mkdir artifact-rpm
|
||||||
|
mv dist/*.rpm artifact-rpm/ || true
|
||||||
|
mkdir artifact-pacman
|
||||||
|
mv dist/*.pacman artifact-pacman/ || true
|
||||||
|
mkdir artifact-snap
|
||||||
|
mv dist/*.snap artifact-snap/ || true
|
||||||
|
mkdir artifact-tar.gz
|
||||||
|
mv dist/*.tar.gz artifact-tar.gz/ || true
|
||||||
|
mkdir artifact-web
|
||||||
|
mv tabby-web.tar.gz artifact-web/ || true
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload DEB
|
||||||
|
with:
|
||||||
|
name: Linux DEB
|
||||||
|
path: artifact-deb
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload RPM
|
||||||
|
with:
|
||||||
|
name: Linux RPM
|
||||||
|
path: artifact-rpm
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload Pacman Package
|
||||||
|
with:
|
||||||
|
name: Linux Pacman
|
||||||
|
path: artifact-pacman
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload Snap
|
||||||
|
with:
|
||||||
|
name: Linux Snap
|
||||||
|
path: artifact-snap
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload Linux tarball
|
||||||
|
with:
|
||||||
|
name: Linux tarball
|
||||||
|
path: artifact-tar.gz
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload web tarball
|
||||||
|
with:
|
||||||
|
name: Web tarball
|
||||||
|
path: artifact-web
|
||||||
|
|
||||||
|
Windows-Build:
|
||||||
|
runs-on: windows-2022
|
||||||
|
needs: Lint
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.3.4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Installing Node
|
||||||
|
uses: actions/setup-node@v2.5.1
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- name: Update node-gyp
|
||||||
|
run: |
|
||||||
|
npm install --global node-gyp@8.4.1
|
||||||
|
npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
npm i -g yarn@1.19.1
|
||||||
|
yarn
|
||||||
|
node scripts/build-native.js
|
||||||
|
yarn run build
|
||||||
|
node scripts/prepackage-plugins.js
|
||||||
|
|
||||||
|
- name: Build and sign packages
|
||||||
|
run: node scripts/build-windows.js
|
||||||
|
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
|
||||||
|
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
|
||||||
|
DEBUG: electron-builder,electron-builder:*
|
||||||
|
|
||||||
|
- name: Build packages without signing
|
||||||
|
run: node scripts/build-windows.js
|
||||||
|
if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||||
|
|
||||||
|
- name: Upload symbols
|
||||||
|
run: |
|
||||||
|
npm install @sentry/cli
|
||||||
|
node scripts/sentry-upload.js
|
||||||
|
env:
|
||||||
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
|
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||||
|
|
||||||
|
- name: Package artifacts
|
||||||
|
run: |
|
||||||
|
mkdir artifact-setup
|
||||||
|
mv dist/*-setup.exe artifact-setup/
|
||||||
|
mkdir artifact-portable
|
||||||
|
mv dist/*-portable.zip artifact-portable/
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload installer
|
||||||
|
with:
|
||||||
|
name: Windows installer
|
||||||
|
path: artifact-setup
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload portable build
|
||||||
|
with:
|
||||||
|
name: Windows portable build
|
||||||
|
path: artifact-portable
|
70
.github/workflows/codeql-analysis.yml
vendored
Normal file
70
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# 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: '26 7 * * 4'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'javascript' ]
|
||||||
|
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||||
|
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||||
|
|
||||||
|
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
|
14
.github/workflows/docs.yml
vendored
14
.github/workflows/docs.yml
vendored
@@ -2,7 +2,7 @@ name: Docs
|
|||||||
on: push
|
on: push
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-latest
|
||||||
if: ${{ github.actor != 'dependabot[bot]' }}
|
if: ${{ github.actor != 'dependabot[bot]' }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -12,14 +12,12 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Installing Node
|
- name: Installing Node
|
||||||
uses: actions/setup-node@v2.1.5
|
uses: actions/setup-node@v2.5.1
|
||||||
with:
|
with:
|
||||||
node-version: 14
|
node-version: 14
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
eval $(ssh-agent -s)
|
|
||||||
ssh-add <(echo "$DOCS_PRIVATE_KEY")
|
|
||||||
yarn cache clean
|
yarn cache clean
|
||||||
cd app
|
cd app
|
||||||
yarn
|
yarn
|
||||||
@@ -28,7 +26,13 @@ jobs:
|
|||||||
yarn
|
yarn
|
||||||
yarn run build:typings
|
yarn run build:typings
|
||||||
yarn run docs
|
yarn run docs
|
||||||
rsync -e "ssh -o StrictHostKeyChecking=no" -arv docs/api/ root@ajenti.org:/srv/terminus-docs/
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
DOCS_PRIVATE_KEY: ${{ secrets.DOCS_PRIVATE_KEY }}
|
DOCS_PRIVATE_KEY: ${{ secrets.DOCS_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- uses: FirebaseExtended/action-hosting-deploy@v0
|
||||||
|
with:
|
||||||
|
repoToken: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
|
firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_TABBY_DOCS }}'
|
||||||
|
channelId: live
|
||||||
|
projectId: tabby-docs
|
||||||
|
15
.github/workflows/issue-translator.yml
vendored
Normal file
15
.github/workflows/issue-translator.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: 'issue-translator'
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: tomsun28/issues-translate-action@v2.6
|
||||||
|
with:
|
||||||
|
IS_MODIFY_TITLE: true
|
||||||
|
CUSTOM_BOT_NOTE: The translator bot has detected that this issue body's language is not English, and has translated it automatically.
|
31
.github/workflows/lint.yml
vendored
31
.github/workflows/lint.yml
vendored
@@ -1,31 +0,0 @@
|
|||||||
name: Lint
|
|
||||||
on: [push, pull_request]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: macOS-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Installing Node
|
|
||||||
uses: actions/setup-node@v2.1.5
|
|
||||||
with:
|
|
||||||
node-version: 14
|
|
||||||
|
|
||||||
- name: Install deps
|
|
||||||
run: |
|
|
||||||
npm i -g yarn@1.19.1
|
|
||||||
cd app
|
|
||||||
yarn
|
|
||||||
cd ..
|
|
||||||
rm app/node_modules/.yarn-integrity
|
|
||||||
yarn
|
|
||||||
|
|
||||||
- name: Build typings
|
|
||||||
run: yarn run build:typings
|
|
||||||
|
|
||||||
- name: Lint
|
|
||||||
run: yarn run lint
|
|
107
.github/workflows/linux.yml
vendored
107
.github/workflows/linux.yml
vendored
@@ -1,107 +0,0 @@
|
|||||||
name: Linux Build
|
|
||||||
on: [push, pull_request]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-18.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Install Node
|
|
||||||
uses: actions/setup-node@v2.1.5
|
|
||||||
with:
|
|
||||||
node-version: 14
|
|
||||||
|
|
||||||
- name: Install deps
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install bsdtar zsh
|
|
||||||
npm i -g yarn@1.19.1
|
|
||||||
cd app
|
|
||||||
yarn
|
|
||||||
cd ..
|
|
||||||
rm app/node_modules/.yarn-integrity
|
|
||||||
yarn
|
|
||||||
npm run patch
|
|
||||||
|
|
||||||
- name: Build native deps
|
|
||||||
run: scripts/build-native.js
|
|
||||||
|
|
||||||
- name: Webpack
|
|
||||||
run: yarn run build
|
|
||||||
|
|
||||||
- name: Prepackage plugins
|
|
||||||
run: scripts/prepackage-plugins.js
|
|
||||||
|
|
||||||
- name: Build packages
|
|
||||||
run: scripts/build-linux.js
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
USE_HARD_LINKS: false
|
|
||||||
# DEBUG: electron-builder,electron-builder:*
|
|
||||||
|
|
||||||
- name: Build web resources
|
|
||||||
run: zsh -c 'tar czf terminus-web.tar.gz (terminus-*|web)/dist'
|
|
||||||
|
|
||||||
- name: Upload symbols
|
|
||||||
run: |
|
|
||||||
sudo npm install -g @sentry/cli --unsafe-perm
|
|
||||||
./scripts/sentry-upload.js
|
|
||||||
env:
|
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
|
||||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
|
||||||
|
|
||||||
- name: Package artifacts
|
|
||||||
run: |
|
|
||||||
mkdir artifact-deb
|
|
||||||
mv dist/*.deb artifact-deb/ || true
|
|
||||||
mkdir artifact-rpm
|
|
||||||
mv dist/*.rpm artifact-rpm/ || true
|
|
||||||
mkdir artifact-pacman
|
|
||||||
mv dist/*.pacman artifact-pacman/ || true
|
|
||||||
mkdir artifact-snap
|
|
||||||
mv dist/*.snap artifact-snap/ || true
|
|
||||||
mkdir artifact-tar.gz
|
|
||||||
mv dist/*.tar.gz artifact-tar.gz/ || true
|
|
||||||
mkdir artifact-web
|
|
||||||
mv terminus-web.tar.gz artifact-web/ || true
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload DEB
|
|
||||||
with:
|
|
||||||
name: Linux DEB
|
|
||||||
path: artifact-deb
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload RPM
|
|
||||||
with:
|
|
||||||
name: Linux RPM
|
|
||||||
path: artifact-rpm
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload Pacman Package
|
|
||||||
with:
|
|
||||||
name: Linux Pacman
|
|
||||||
path: artifact-pacman
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload Snap
|
|
||||||
with:
|
|
||||||
name: Linux Snap
|
|
||||||
path: artifact-snap
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload Linux tarball
|
|
||||||
with:
|
|
||||||
name: Linux tarball
|
|
||||||
path: artifact-tar.gz
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload web tarball
|
|
||||||
with:
|
|
||||||
name: Web tarball
|
|
||||||
path: artifact-web
|
|
93
.github/workflows/macos.yml
vendored
93
.github/workflows/macos.yml
vendored
@@ -1,93 +0,0 @@
|
|||||||
name: macOS Build
|
|
||||||
on: [push, pull_request]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: macos-11.0
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: x86_64
|
|
||||||
- arch: arm64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Installing Node
|
|
||||||
uses: actions/setup-node@v2.1.5
|
|
||||||
with:
|
|
||||||
node-version: 14
|
|
||||||
|
|
||||||
- name: Install deps
|
|
||||||
run: |
|
|
||||||
sudo npm i -g yarn@1.22.1
|
|
||||||
cd app
|
|
||||||
yarn
|
|
||||||
cd ..
|
|
||||||
rm app/node_modules/.yarn-integrity
|
|
||||||
yarn
|
|
||||||
|
|
||||||
- name: Build native deps
|
|
||||||
run: scripts/build-native.js
|
|
||||||
env:
|
|
||||||
ARCH: ${{matrix.arch}}
|
|
||||||
|
|
||||||
- name: Webpack
|
|
||||||
run: yarn run build
|
|
||||||
|
|
||||||
- name: Prepackage plugins
|
|
||||||
run: scripts/prepackage-plugins.js
|
|
||||||
env:
|
|
||||||
ARCH: ${{matrix.arch}}
|
|
||||||
|
|
||||||
- run: sed -i '' 's/updateInfo = await/\/\/updateInfo = await/g' node_modules/app-builder-lib/out/targets/ArchiveTarget.js
|
|
||||||
|
|
||||||
- name: Build and sign packages
|
|
||||||
run: scripts/build-macos.js
|
|
||||||
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
|
|
||||||
env:
|
|
||||||
ARCH: ${{matrix.arch}}
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
CSC_LINK: ${{ secrets.CSC_LINK }}
|
|
||||||
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
|
|
||||||
APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}
|
|
||||||
APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }}
|
|
||||||
USE_HARD_LINKS: false
|
|
||||||
# DEBUG: electron-builder,electron-builder:*
|
|
||||||
|
|
||||||
- name: Build packages without signing
|
|
||||||
run: scripts/build-macos.js
|
|
||||||
if: github.repository != 'Eugeny/terminus' || github.event_name != 'push'
|
|
||||||
env:
|
|
||||||
ARCH: ${{matrix.arch}}
|
|
||||||
# DEBUG: electron-builder,electron-builder:*
|
|
||||||
|
|
||||||
- name: Upload symbols
|
|
||||||
run: |
|
|
||||||
sudo npm install -g @sentry/cli --unsafe-perm
|
|
||||||
./scripts/sentry-upload.js
|
|
||||||
env:
|
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
|
||||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
|
||||||
|
|
||||||
- name: Package artifacts
|
|
||||||
run: |
|
|
||||||
mkdir artifact-pkg
|
|
||||||
mv dist/*.pkg artifact-pkg/
|
|
||||||
mkdir artifact-zip
|
|
||||||
mv dist/*.zip artifact-zip/
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload PKG
|
|
||||||
with:
|
|
||||||
name: macOS .pkg (${{matrix.arch}})
|
|
||||||
path: artifact-pkg
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload ZIP
|
|
||||||
with:
|
|
||||||
name: macOS .zip (${{matrix.arch}})
|
|
||||||
path: artifact-zip
|
|
19
.github/workflows/release.yml
vendored
Normal file
19
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: "tagged-release"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tagged-release:
|
||||||
|
name: "Tagged Release"
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: "marvinpinto/action-automatic-releases@latest"
|
||||||
|
with:
|
||||||
|
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
prerelease: false
|
||||||
|
draft: true
|
66
.github/workflows/windows.yml
vendored
66
.github/workflows/windows.yml
vendored
@@ -1,66 +0,0 @@
|
|||||||
name: Windows Build
|
|
||||||
on: [push, pull_request]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: windows-2016
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Installing Node
|
|
||||||
uses: actions/setup-node@v2.1.5
|
|
||||||
with:
|
|
||||||
node-version: 14
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
npm i -g yarn@1.19.1
|
|
||||||
yarn
|
|
||||||
node scripts/build-native.js
|
|
||||||
yarn run build
|
|
||||||
node scripts/prepackage-plugins.js
|
|
||||||
|
|
||||||
- name: Build and sign packages
|
|
||||||
run: node scripts/build-windows.js
|
|
||||||
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
|
|
||||||
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
|
|
||||||
# DEBUG: electron-builder,electron-builder:*
|
|
||||||
|
|
||||||
- name: Build packages without signing
|
|
||||||
run: node scripts/build-windows.js
|
|
||||||
if: github.repository != 'Eugeny/terminus' || github.event_name != 'push'
|
|
||||||
|
|
||||||
- name: Upload symbols
|
|
||||||
run: |
|
|
||||||
npm install @sentry/cli
|
|
||||||
node scripts/sentry-upload.js
|
|
||||||
env:
|
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
|
||||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
|
||||||
|
|
||||||
- name: Package artifacts
|
|
||||||
run: |
|
|
||||||
mkdir artifact-setup
|
|
||||||
mv dist/*-setup.exe artifact-setup/
|
|
||||||
mkdir artifact-portable
|
|
||||||
mv dist/*-portable.zip artifact-portable/
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload installer
|
|
||||||
with:
|
|
||||||
name: Installer
|
|
||||||
path: artifact-setup
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
|
||||||
name: Upload portable build
|
|
||||||
with:
|
|
||||||
name: Portable build
|
|
||||||
path: artifact-portable
|
|
4
.gitignore
vendored
4
.gitignore
vendored
@@ -32,5 +32,7 @@ docs/api
|
|||||||
sentry.properties
|
sentry.properties
|
||||||
sentry-symbols.js
|
sentry-symbols.js
|
||||||
|
|
||||||
terminus-ssh/util/pagent.exe
|
tabby-ssh/util/pagent.exe
|
||||||
*.psd
|
*.psd
|
||||||
|
|
||||||
|
crowdin.yml
|
||||||
|
36
.travis.yml
36
.travis.yml
@@ -1,36 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
node_js: 15
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- Build
|
|
||||||
- name: Docs
|
|
||||||
if: branch = master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- stage: 'Docs'
|
|
||||||
os: linux
|
|
||||||
if: branch = master
|
|
||||||
script:
|
|
||||||
- '[ -z "${encrypted_4e2fb4889ef8_iv}" ] && exit 0 || true'
|
|
||||||
- set -e
|
|
||||||
- openssl aes-256-cbc -K $encrypted_4e2fb4889ef8_key -iv $encrypted_4e2fb4889ef8_iv -in .travis.ssh.key.enc -out .travis.ssh.key -d
|
|
||||||
- eval "$(ssh-agent -s)"
|
|
||||||
- chmod 600 .travis.ssh.key
|
|
||||||
- ssh-add .travis.ssh.key
|
|
||||||
- yarn
|
|
||||||
- yarn run docs
|
|
||||||
- rsync -e "ssh -o StrictHostKeyChecking=no" -arv docs/api/ root@ajenti.org:/srv/terminus-docs/
|
|
||||||
|
|
||||||
dist: xenial
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- rpm
|
|
||||||
- yarn
|
|
||||||
- libsecret-1-dev
|
|
||||||
sources:
|
|
||||||
- sourceline: 'deb https://dl.yarnpkg.com/debian/ stable main'
|
|
||||||
key_url: 'https://dl.yarnpkg.com/debian/pubkey.gpg'
|
|
39
.vscode/launch.json
vendored
Normal file
39
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Electron: Main",
|
||||||
|
"protocol": "inspector",
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
|
||||||
|
"env": {
|
||||||
|
"TABBY_DEV": "1"
|
||||||
|
},
|
||||||
|
"runtimeArgs": [
|
||||||
|
"--remote-debugging-port=9223",
|
||||||
|
"app"
|
||||||
|
],
|
||||||
|
"windows": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Electron: Renderer",
|
||||||
|
"type": "pwa-chrome",
|
||||||
|
"request": "attach",
|
||||||
|
"port": 9223,
|
||||||
|
"webRoot": "${workspaceFolder}",
|
||||||
|
"timeout": 30000
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"compounds": [
|
||||||
|
{
|
||||||
|
"name": "Electron: All",
|
||||||
|
"configurations": [
|
||||||
|
"Electron: Main",
|
||||||
|
"Electron: Renderer"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
67
HACKING.md
67
HACKING.md
@@ -1,18 +1,27 @@
|
|||||||
# Some background
|
# Some background
|
||||||
|
|
||||||
Terminus is an Electron app, with the frontend written in Typescript with the help of Angular framework. It's built using Webpack.
|
Tabby is an Electron app, with the frontend written in Typescript with the help of Angular framework. It's built using Webpack.
|
||||||
|
|
||||||
# Getting started
|
# Getting started
|
||||||
|
|
||||||
First of all, clone this repository. You'll also need a recent version of Node installed.
|
First of all, clone this repository. You'll also need Node.js 14 or newer and Yarn.
|
||||||
|
|
||||||
First, install the dependencies:
|
First, install the dependencies:
|
||||||
|
|
||||||
```
|
```
|
||||||
# macOS/Linux:
|
# macOS:
|
||||||
yarn
|
yarn
|
||||||
./scripts/build-native.js
|
./scripts/build-native.js
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
# Linux (Debian/Ubuntu here as an example)
|
||||||
|
sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 cmake
|
||||||
|
yarn
|
||||||
|
./scripts/build-native.js
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
# Windows:
|
# Windows:
|
||||||
npm -g install windows-build-tools
|
npm -g install windows-build-tools
|
||||||
yarn
|
yarn
|
||||||
@@ -25,34 +34,50 @@ Now, check if your build is working:
|
|||||||
yarn run build
|
yarn run build
|
||||||
```
|
```
|
||||||
|
|
||||||
Start Terminus with
|
Start Tabby with
|
||||||
|
|
||||||
```
|
```
|
||||||
yarn start
|
yarn start
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Building an installer
|
||||||
|
|
||||||
|
To build an installer, first complete a "normal" build as described above and then run:
|
||||||
|
|
||||||
|
```
|
||||||
|
node scripts/prepackage-plugins.js
|
||||||
|
|
||||||
|
node scripts/build-windows.js
|
||||||
|
# or
|
||||||
|
node scripts/build-linux.js
|
||||||
|
# or
|
||||||
|
node scripts/build-macos.js
|
||||||
|
```
|
||||||
|
|
||||||
|
The artifacts will be produced in the `dist` folder.
|
||||||
|
|
||||||
# Project layout
|
# Project layout
|
||||||
```
|
```
|
||||||
terminus
|
tabby
|
||||||
├─ app # Electron app, just the bare essentials
|
├─ app # Electron app, just the bare essentials
|
||||||
| ├─ src # Electron renderer code
|
| ├─ src # Electron renderer code
|
||||||
| └─ main.js # Electron main entry point
|
| └─ main.js # Electron main entry point
|
||||||
├─ build
|
├─ build
|
||||||
├─ clink # Clink distributive, for Windows
|
├─ clink # Clink distributive, for Windows
|
||||||
├─ scripts # Maintenance scripts
|
├─ scripts # Maintenance scripts
|
||||||
├─ terminus-community-color-schemes # Plugin that provides color schemes
|
├─ tabby-community-color-schemes # Plugin that provides color schemes
|
||||||
├─ terminus-core # Plugin that provides base UI and tab management
|
├─ tabby-core # Plugin that provides base UI and tab management
|
||||||
├─ terminus-electron # Plugin that provides Electron-specific functions
|
├─ tabby-electron # Plugin that provides Electron-specific functions
|
||||||
└─ terminus-local # Plugin that provides local shells and profiles
|
├─ tabby-local # Plugin that provides local shells and profiles
|
||||||
├─ terminus-plugin-manager # Plugin that installs other plugins
|
├─ tabby-plugin-manager # Plugin that installs other plugins
|
||||||
├─ terminus-settings # Plugin that provides the settings tab
|
├─ tabby-settings # Plugin that provides the settings tab
|
||||||
└─ terminus-terminal # Plugin that provides terminal tabs
|
├─ tabby-terminal # Plugin that provides terminal tabs
|
||||||
├─ terminus-web # Plugin that provides web-specific functions
|
└─ tabby-web # Plugin that provides web-specific functions
|
||||||
```
|
```
|
||||||
|
|
||||||
# Plugin layout
|
# Plugin layout
|
||||||
```
|
```
|
||||||
terminus-pluginname
|
tabby-pluginname
|
||||||
├─ src # Typescript code
|
├─ src # Typescript code
|
||||||
| ├─ components # Angular components
|
| ├─ components # Angular components
|
||||||
| | ├─ foo.component.ts # Code
|
| | ├─ foo.component.ts # Code
|
||||||
@@ -69,11 +94,11 @@ terminus-pluginname
|
|||||||
|
|
||||||
# Plugins
|
# Plugins
|
||||||
|
|
||||||
The app will load all plugins from the source checkout in the dev mode, from the user's plugins directory at all times (click `Open Plugins Directory` under `Settings` > `Plugins`) and from the directory specified by the `TERMINUS_PLUGINS` environment var.
|
The app will load all plugins from the source checkout in the dev mode, from the user's plugins directory at all times (click `Open Plugins Directory` under `Settings` > `Plugins`) and from the directory specified by the `TABBY_PLUGINS` environment var.
|
||||||
|
|
||||||
Only modules whose `package.json` file contains a `terminus-plugin` keyword will be loaded.
|
Only modules whose `package.json` file contains a `tabby-plugin` keyword will be loaded.
|
||||||
|
|
||||||
If you're currently in your plugin's directory, start Terminus as `TERMINUS_PLUGINS=$(pwd) terminus --debug`
|
If you're currently in your plugin's directory, start Tabby as `TABBY_PLUGINS=$(pwd) tabby --debug`
|
||||||
|
|
||||||
A plugin should only provide a default export, which should be a `NgModule` class (or a `NgModuleWithDependencies` where applicable). This module will be injected as a dependency to the app's root module.
|
A plugin should only provide a default export, which should be a `NgModule` class (or a `NgModuleWithDependencies` where applicable). This module will be injected as a dependency to the app's root module.
|
||||||
|
|
||||||
@@ -93,7 +118,7 @@ Plugins provide functionality by exporting singular or multi providers:
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
import { NgModule, Injectable } from '@angular/core'
|
import { NgModule, Injectable } from '@angular/core'
|
||||||
import { ToolbarButtonProvider, ToolbarButton } from 'terminus-core'
|
import { ToolbarButtonProvider, ToolbarButton } from 'tabby-core'
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class MyButtonProvider extends ToolbarButtonProvider {
|
export class MyButtonProvider extends ToolbarButtonProvider {
|
||||||
@@ -118,6 +143,8 @@ export default class MyModule { }
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
See `terminus-core/src/api.ts`, `terminus-settings/src/api.ts`, `terminus-local/src/api.ts` and `terminus-terminal/src/api.ts` for the available extension points.
|
See `tabby-core/src/api.ts`, `tabby-settings/src/api.ts`, `tabby-local/src/api.ts` and `tabby-terminal/src/api.ts` for the available extension points.
|
||||||
|
|
||||||
Publish your plugin on NPM with a `terminus-plugin` keyword to make it appear in the Plugin Manager.
|
Also check out [the example plugin](https://github.com/Eugeny/tabby-clippy).
|
||||||
|
|
||||||
|
Publish your plugin on NPM with a `tabby-plugin` keyword to make it appear in the Plugin Manager.
|
||||||
|
240
README.ko-KR.md
Normal file
240
README.ko-KR.md
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
[](https://tabby.sh)
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://ko-fi.com/J3J8KWTF">
|
||||||
|
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### 다운로드:
|
||||||
|
|
||||||
|
* [Latest release](https://github.com/Eugeny/tabby/releases/latest)
|
||||||
|
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||||
|
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
**Tabby** (구 **Terminus**)는 Windows, macOS 및 Linux용으로 뛰어난 구성의 터미널 에뮬레이터, SSH 및 시리얼 클라이언트입니다.
|
||||||
|
|
||||||
|
* 통합 SSH 클라이언트 및 연결 관리자
|
||||||
|
* 통합 시리얼 터미널
|
||||||
|
* 테마 및 색 구성표
|
||||||
|
* 전체 구성이 가능한 단축키 및 다중 코드 단축키
|
||||||
|
* 창 분할
|
||||||
|
* 이전 탭 사용을 기억
|
||||||
|
* PowerShell (및 PS Core), WSL, Git-Bash, Cygwin, Cmder 및 CMD 지원
|
||||||
|
* Zmodem을 통한 SSH 세션 간의 직접 파일 전송
|
||||||
|
* 2바이트 문자를 포함한 전체 유니코드 지원
|
||||||
|
* 빠르게 출력되는 것에 대해 휩쓸리지 않음
|
||||||
|
* 탭 완성을 포함한 Windows에서의 적절한 셸 환경 (Clink을 통해)
|
||||||
|
* SSH 시크릿 및 구성을 위한 통합 암호화 컨테이너
|
||||||
|
|
||||||
|
# 목차 <!-- omit in toc -->
|
||||||
|
|
||||||
|
- [Tabby는 무엇인가](#tabby는-무엇인가)
|
||||||
|
- [터미널 기능](#터미널-기능)
|
||||||
|
- [SSH 클라이언트](#ssh-클라이언트)
|
||||||
|
- [시리얼 터미널](#시리얼-터미널)
|
||||||
|
- [포터블](#포터블)
|
||||||
|
- [플러그인](#플러그인)
|
||||||
|
- [테마](#테마)
|
||||||
|
- [기여](#기여)
|
||||||
|
|
||||||
|
<a name="about"></a>
|
||||||
|
|
||||||
|
# Tabby는 무엇인가
|
||||||
|
|
||||||
|
* **Tabby는** Windows의 표준 터미널 (conhost), PowerShell ISE, PuTTY 또는 iTerm의 대안 프로그램입니다.
|
||||||
|
|
||||||
|
* **Tabby는** 새로운 셸이나 MinGW 또는 Cygwin을 대체하지 **않습니다**. 가볍지도 않습니다. - RAM 사용량이 중요한 경우, [Conemu](https://conemu.github.io) 또는 [Alacritty](https://github.com/jwilm/alacritty)를 고려하십시오.
|
||||||
|
|
||||||
|
<a name="terminal"></a>
|
||||||
|
|
||||||
|
# 터미널 기능
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* A V220 터미널 + 다양한 확장
|
||||||
|
* 여러 개의 분할 창 중첩
|
||||||
|
* 모든 측면에 탭이 위치함
|
||||||
|
* 전역 스폰 단축키가 있는 도킹 가능한 윈도우 ("Quake console")
|
||||||
|
* 진행률 탐지
|
||||||
|
* 프로세스 완료 시 알림
|
||||||
|
* 괄호 붙여넣기, 여러 줄 붙여넣기 경고
|
||||||
|
* 폰트 합자(ligatures)
|
||||||
|
* 커스텀 셸 프로필
|
||||||
|
* RMB 붙여넣기 및 복사 선택 옵션 (PuTTY 스타일)
|
||||||
|
|
||||||
|
<a name="ssh"></a>
|
||||||
|
# SSH 클라이언트
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* 연결 관리자가 있는 SSH2 클라이언트
|
||||||
|
* X11 및 포트 포워딩
|
||||||
|
* 자동 jump 호스트 관리
|
||||||
|
* 에이전트 전달 (Pageant 및 Windows 기본 OpenSSH 에이전트 포함)
|
||||||
|
* 로그인 스크립트
|
||||||
|
|
||||||
|
<a name="serial"></a>
|
||||||
|
# 시리얼 터미널
|
||||||
|
|
||||||
|
* 연결 저장
|
||||||
|
* Readline 입력 지원
|
||||||
|
* 선택적 hex byte별 입력 및 hexdump 출력
|
||||||
|
* 개행 변환
|
||||||
|
* 자동 재접속
|
||||||
|
|
||||||
|
<a name="portable"></a>
|
||||||
|
# 포터블
|
||||||
|
|
||||||
|
`Tabby.exe`가 있는 동일한 위치에 `data` 폴더를 생성하면 Windows에서 Tabby가 포터블 앱으로 실행됩니다.
|
||||||
|
|
||||||
|
<a name="plugins"></a>
|
||||||
|
# 플러그인
|
||||||
|
|
||||||
|
플러그인과 테마는 Tabby 내부의 설정에서 직접 설치할 수 있습니다.
|
||||||
|
|
||||||
|
* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - m터미널의 경로 및 URL을 클릭 가능하게
|
||||||
|
* [docker](https://github.com/Eugeny/tabby-docker) - Docker 컨테이너에 연결
|
||||||
|
* [title-control](https://github.com/kbjr/terminus-title-control) - 접두사, 접미사 및/또는 문자열 제거를 제공하여 터미널 탭의 제목을 수정
|
||||||
|
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 하나 또는 모든 터미널 탭에 신속한 명령 전송
|
||||||
|
* [save-output](https://github.com/Eugeny/tabby-save-output) - 터미널 출력을 파일에 기록
|
||||||
|
* [sync-config](https://github.com/starxg/terminus-sync-config) - 구성을 Gist 또는 Gitee에 동기화
|
||||||
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인
|
||||||
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다
|
||||||
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다
|
||||||
|
|
||||||
|
<a name="themes"></a>
|
||||||
|
# 테마
|
||||||
|
|
||||||
|
* [hype](https://github.com/Eugeny/tabby-theme-hype) - Hyper에서 영감을 받은 테마
|
||||||
|
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Tabby를 위해 여유로움을 제공하는 테마
|
||||||
|
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
|
||||||
|
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
|
||||||
|
* [altair](https://github.com/yxuko/terminus-altair)
|
||||||
|
|
||||||
|
# 스폰서 <!-- omit in toc -->
|
||||||
|
|
||||||
|
[](https://packagecloud.io)
|
||||||
|
|
||||||
|
[**packagecloud**](https://packagecloud.io)가 무료 Debian/RPM 저장소 호스팅을 제공하였습니다.
|
||||||
|
|
||||||
|
<a name="contributing"></a>
|
||||||
|
# 기여
|
||||||
|
|
||||||
|
Pull requests and plugins are welcome!
|
||||||
|
|
||||||
|
프로젝트 배치 방법에 대한 자세한 내용과 매우 간단한 플러그인 개발 튜토리얼은 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 및 [API docs](https://docs.tabby.sh/)를 참조하십시오.
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="contributors"></a>
|
||||||
|
|
||||||
|
여기있는 멋진 사람들에게 진심으로 감사합니다. ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
이 프로젝트는 [모든 기여자](https://github.com/all-contributors/all-contributors)의 규격을 따릅니다. 어떠한 종류의 기여도 모두 환영합니다!
|
||||||
|
|
||||||
|
<img src="https://ga-beacon.appspot.com/UA-3278102-18/github/readme" width="1"/>
|
188
README.md
188
README.md
@@ -1,35 +1,50 @@
|
|||||||

|
[](https://tabby.sh)
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/Eugeny/terminus/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/terminus/total.svg?label=RELEASE&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/terminus/workflows/windows/master"><img src="https://shields.io/badge/-Nightly-blue?logo=windows&style=for-the-badge"/></a> <a href="https://nightly.link/Eugeny/terminus/workflows/macos/master"><img src="https://shields.io/badge/-Nightly-black?logo=apple&style=for-the-badge"/></a> <a href="https://nightly.link/Eugeny/terminus/workflows/linux/master"><img src="https://shields.io/badge/-Nightly-orange?logo=linux&style=for-the-badge"/></a> <a href="https://gitter.im/terminus-terminal/community"><img alt="Gitter" src="https://img.shields.io/gitter/room/terminus/community.svg?color=magenta&logo=gitter&style=for-the-badge"></a>
|
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://ko-fi.com/J3J8KWTF">
|
||||||
|
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
**Terminus** is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux
|
### Downloads:
|
||||||
|
|
||||||
* Integrated SSH client and connection manager
|
* [Latest release](https://github.com/Eugeny/tabby/releases/latest)
|
||||||
|
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||||
|
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<p align="center">
|
||||||
|
This README is also available in: <a href="./README.ru-RU.md">Русский</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
[**Tabby**](https://tabby.sh) (formerly **Terminus**) is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux
|
||||||
|
|
||||||
|
* Integrated SSH and Telnet client and connection manager
|
||||||
* Integrated serial terminal
|
* Integrated serial terminal
|
||||||
* Theming and color schemes
|
* Theming and color schemes
|
||||||
* Fully configurable shortcuts and multi-chord shortcuts
|
* Fully configurable shortcuts and multi-chord shortcuts
|
||||||
* Split panes
|
* Split panes
|
||||||
* Remembers your tabs
|
* Remembers your tabs
|
||||||
* PowerShell (and PS Core), WSL, Git-Bash, Cygwin, Cmder and CMD support
|
* PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder and CMD support
|
||||||
* Direct file transfer from/to SSH sessions via Zmodem
|
* Direct file transfer from/to SSH sessions via Zmodem
|
||||||
* Full Unicode support including double-width characters
|
* Full Unicode support including double-width characters
|
||||||
* Doesn't choke on fast-flowing outputs
|
* Doesn't choke on fast-flowing outputs
|
||||||
* Proper shell experience on Windows including tab completion (via Clink)
|
* Proper shell experience on Windows including tab completion (via Clink)
|
||||||
* Integrated encrypted container for SSH secrets and configuration
|
* Integrated encrypted container for SSH secrets and configuration
|
||||||
|
* SSH, SFTP and Telnet client available as a [web app](https://tabby.sh/app) (also [self-hosted](https://github.com/Eugeny/tabby-web)).
|
||||||
|
|
||||||
[](https://ko-fi.com/eugeny)
|
# Contents <!-- omit in toc -->
|
||||||
|
|
||||||
---
|
- [What Tabby is and isn't](#what-tabby-is-and-isnt)
|
||||||
|
|
||||||
# Contents
|
|
||||||
|
|
||||||
- [Contents](#contents)
|
|
||||||
- [What Terminus is and isn't](#what-terminus-is-and-isnt)
|
|
||||||
- [Terminal features](#terminal-features)
|
- [Terminal features](#terminal-features)
|
||||||
- [SSH Client](#ssh-client)
|
- [SSH Client](#ssh-client)
|
||||||
- [Serial Terminal](#serial-terminal)
|
- [Serial Terminal](#serial-terminal)
|
||||||
@@ -39,13 +54,15 @@
|
|||||||
- [Contributing](#contributing)
|
- [Contributing](#contributing)
|
||||||
|
|
||||||
<a name="about"></a>
|
<a name="about"></a>
|
||||||
# What Terminus is and isn't
|
|
||||||
|
|
||||||
* **Terminus is** an alternative to Windows' standard terminal (conhost), PowerShell ISE, PuTTY or iTerm
|
# What Tabby is and isn't
|
||||||
|
|
||||||
* **Terminus is not** a new shell or a MinGW or Cygwin replacement. Neither is it lightweight - if RAM usage is of importance, consider [Conemu](https://conemu.github.io) or [Alacritty](https://github.com/jwilm/alacritty)
|
* **Tabby is** an alternative to Windows' standard terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app and iTerm
|
||||||
|
|
||||||
|
* **Tabby is not** a new shell or a MinGW or Cygwin replacement. Neither is it lightweight - if RAM usage is of importance, consider [Conemu](https://conemu.github.io) or [Alacritty](https://github.com/jwilm/alacritty)
|
||||||
|
|
||||||
<a name="terminal"></a>
|
<a name="terminal"></a>
|
||||||
|
|
||||||
# Terminal features
|
# Terminal features
|
||||||
|
|
||||||

|

|
||||||
@@ -84,35 +101,43 @@
|
|||||||
<a name="portable"></a>
|
<a name="portable"></a>
|
||||||
# Portable
|
# Portable
|
||||||
|
|
||||||
Terminus will run as a portable app on Windows, if you create a `data` folder in the same location where `Terminus.exe` lives.
|
Tabby will run as a portable app on Windows, if you create a `data` folder in the same location where `Tabby.exe` lives.
|
||||||
|
|
||||||
<a name="plugins"></a>
|
<a name="plugins"></a>
|
||||||
# Plugins
|
# Plugins
|
||||||
|
|
||||||
Plugins and themes can be installed directly from the Settings view inside Terminus.
|
Plugins and themes can be installed directly from the Settings view inside Tabby.
|
||||||
|
|
||||||
* [clickable-links](https://github.com/Eugeny/terminus-clickable-links) - makes paths and URLs in the terminal clickable
|
* [docker](https://github.com/Eugeny/tabby-docker) - connect to Docker containers
|
||||||
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
|
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
|
||||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
|
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
|
||||||
* [save-output](https://github.com/Eugeny/terminus-save-output) - record terminal output into a file
|
* [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file
|
||||||
* [scrollbar](https://github.com/kbjr/terminus-scrollbar) - adds a scrollbar to hterm tabs
|
* [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
|
||||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
|
||||||
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - allows creating custom workspace profiles based on the given config
|
||||||
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
# Themes
|
# Themes
|
||||||
|
|
||||||
* [hype](https://github.com/Eugeny/terminus-theme-hype) - a Hyper inspired theme
|
* [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme
|
||||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Terminus
|
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Tabby
|
||||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
|
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
|
||||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
|
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
|
||||||
* [altair](https://github.com/yxuko/terminus-altair)
|
* [altair](https://github.com/yxuko/terminus-altair)
|
||||||
|
|
||||||
|
# Sponsors <!-- omit in toc -->
|
||||||
|
|
||||||
|
[](https://packagecloud.io)
|
||||||
|
|
||||||
|
[**packagecloud**](https://packagecloud.io) has provided free Debian/RPM repository hosting
|
||||||
|
|
||||||
<a name="contributing"></a>
|
<a name="contributing"></a>
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
Pull requests and plugins are welcome!
|
Pull requests and plugins are welcome!
|
||||||
|
|
||||||
See [HACKING.md](https://github.com/Eugeny/terminus/blob/master/HACKING.md) and [API docs](http://ajenti.org/terminus-docs/) for information of how the project is laid out, and a very brief plugin development tutorial.
|
See [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) and [API docs](https://docs.tabby.sh/) for information of how the project is laid out, and a very brief plugin development tutorial.
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="contributors"></a>
|
<a name="contributors"></a>
|
||||||
@@ -124,59 +149,90 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<!-- markdownlint-disable -->
|
<!-- markdownlint-disable -->
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=mezner" title="Code">💻</a></td>
|
<td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=ehwarren" title="Code">💻</a></td>
|
<td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
<td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
||||||
<td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=yxuko" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=BBJip" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
<td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=levrik" title="Code">💻</a></td>
|
<td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=kwonoj" title="Code">💻</a></td>
|
<td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/terminus/commits?author=Domain" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
<td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||||
<td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/terminus/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
<td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
||||||
<td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=baflo" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
<td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=NieLeben" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
<td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
||||||
<td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=IgnusG" title="Code">💻</a></td>
|
<td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=hammster" title="Code">💻</a></td>
|
<td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
<td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=yfwz100" title="Code">💻</a></td>
|
<td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=jack1142" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=hdougie" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=ckaczor" title="Code">💻</a></td>
|
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=boxmein" title="Code">💻</a></td>
|
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
||||||
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=orin220444" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=Goobles" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=3l0w" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=dimitory" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=zend" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=matishadow" title="Code">💻</a></td>
|
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=pinpins" title="Code">💻</a></td>
|
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=frauhottelmann" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
<td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||||
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=clarkwang" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=iamchating" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||||
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<!-- markdownlint-restore -->
|
<!-- markdownlint-restore -->
|
||||||
|
246
README.ru-RU.md
Normal file
246
README.ru-RU.md
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
[](https://tabby.sh)
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://ko-fi.com/J3J8KWTF">
|
||||||
|
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### Загрузки:
|
||||||
|
|
||||||
|
* [Последняя версия](https://github.com/Eugeny/tabby/releases/latest)
|
||||||
|
* [Репозитории](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||||
|
* [Последний nightly-билд](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<p align="center">
|
||||||
|
Этот README также доступен на: <a href="./README.md">Английском</a> <a href="./README.ko-KR.md">Корейском</a> <a href="./README.zh-CN.md">Китайском</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
[**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux:
|
||||||
|
|
||||||
|
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
|
||||||
|
* Встроенный последовтаельный терминал;
|
||||||
|
* Темы и цветовые схемы;
|
||||||
|
* Полностью настраеваемые сочетания клавиш;
|
||||||
|
* Панели;
|
||||||
|
* Запоминание вкладок;
|
||||||
|
* Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD;
|
||||||
|
* Прямая передача файлов из и в SSH-сессии через Zmodem;
|
||||||
|
* Полная поддержка Unicode, включая символы двойной ширины;
|
||||||
|
* Не задыхается при быстром выводе;
|
||||||
|
* Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink);
|
||||||
|
* Втроенное защищённое хранилище для SSH-ключей и настроек;
|
||||||
|
* SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)).
|
||||||
|
|
||||||
|
# Содержание <!-- omit in toc -->
|
||||||
|
|
||||||
|
- [Правда и ложь про Tabby](#правда-и-ложь-про-tabby)
|
||||||
|
- [Функции терминала](#функции-терминала)
|
||||||
|
- [SSH-клиент](#ssh-клиент)
|
||||||
|
- [Терминал последовательного порта](#терминал-последовательного-порта)
|
||||||
|
- [Портативность](#портативность)
|
||||||
|
- [Плагины](#плагины)
|
||||||
|
- [Темы](#темы)
|
||||||
|
- [Внести свой вклад](#внести-свой-вклад)
|
||||||
|
|
||||||
|
<a name="about"></a>
|
||||||
|
|
||||||
|
# Правда и ложь про Tabby
|
||||||
|
|
||||||
|
* **Правда:** Tabby — это альтернатива стандартному терминалу Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app и iTerm.
|
||||||
|
|
||||||
|
* **Ложь:** Tabby — это не новая оболочка или замена MinGW или Cygwin. Также он нелёгок — если потребление ОЗУ крайне важно для вас, лучше взгляните на [Conemu](https://conemu.github.io) или [Alacritty](https://github.com/jwilm/alacritty).
|
||||||
|
|
||||||
|
<a name="terminal"></a>
|
||||||
|
|
||||||
|
# Функции терминала
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* Терминал V220 + различные дополнения;
|
||||||
|
* Деление окна на несколько панелей;
|
||||||
|
* Вкладки на любой стороне окна;
|
||||||
|
* Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»);
|
||||||
|
* Определение прогресса процесса;
|
||||||
|
* Уведомления о завершении процессов;
|
||||||
|
* Защита от выполнения команд при вставке, предупреждения о вставке нескольких строк;
|
||||||
|
* Лигатуры шрифтов;
|
||||||
|
* Пользовательские профили оболочки;
|
||||||
|
* Опциональная ПКМ-вставка и копирование при выделении (в стиле PuTTY).
|
||||||
|
|
||||||
|
<a name="ssh"></a>
|
||||||
|
# SSH-клиент
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* SSH2-клиент с менеджером соединений;
|
||||||
|
* Проброс портов и X11;
|
||||||
|
* Управление автоматическими джамп-хостами;
|
||||||
|
* Проброс агента (включая Pageant и встроеный в Windows OpenSSH Agent);
|
||||||
|
* Скрипты для входа.
|
||||||
|
|
||||||
|
<a name="serial"></a>
|
||||||
|
# Терминал последовательного порта
|
||||||
|
|
||||||
|
* Сохранение соединений;
|
||||||
|
* Поддержка ввода readline;
|
||||||
|
* Опциональый побатный ввод HEX и вывод hexdump;
|
||||||
|
* Преобразование newline;
|
||||||
|
* Автоматическое восстановление соединения.
|
||||||
|
|
||||||
|
<a name="portable"></a>
|
||||||
|
# Портативность
|
||||||
|
|
||||||
|
На Windows Tabby будет работать в портативном режиме, если создать папку `data` там же, где расположен файл `Tabby.exe`.
|
||||||
|
|
||||||
|
<a name="plugins"></a>
|
||||||
|
# Плагины
|
||||||
|
|
||||||
|
Плагины и темы можно установить напрямую из Настроек Tabby.
|
||||||
|
|
||||||
|
* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) — делает пути и URL в терминале гиперссылками;
|
||||||
|
* [docker](https://github.com/Eugeny/tabby-docker) — подключения к Docker-контейнерам;
|
||||||
|
* [title-control](https://github.com/kbjr/terminus-title-control) — позволяет изменять названия вкладок, добавляя префиксы, суффиксы и позволяя удалять строки;
|
||||||
|
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) — быстро передаёт команды в одну или все вкладки терминала;
|
||||||
|
* [save-output](https://github.com/Eugeny/tabby-save-output) — запись вывода терминала в файл;
|
||||||
|
* [sync-config](https://github.com/starxg/terminus-sync-config) — синхронизация конфига в Gist или Gitee;
|
||||||
|
* [clippy](https://github.com/Eugeny/tabby-clippy) — плагин-пример, который постоянно будет вас бесить;
|
||||||
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские провили рабочего окружеиня на основе конфига;
|
||||||
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby.
|
||||||
|
|
||||||
|
<a name="themes"></a>
|
||||||
|
# Темы
|
||||||
|
|
||||||
|
* [hype](https://github.com/Eugeny/tabby-theme-hype) — тема, вдохновлённая Hyper;
|
||||||
|
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) — тема Relaxed для Tabby;
|
||||||
|
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox);
|
||||||
|
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10);
|
||||||
|
* [altair](https://github.com/yxuko/terminus-altair).
|
||||||
|
|
||||||
|
# Спонсоры <!-- omit in toc -->
|
||||||
|
|
||||||
|
[](https://packagecloud.io)
|
||||||
|
|
||||||
|
[**packagecloud**](https://packagecloud.io) предоставил бесплатный хостинг для Debian/RPM репозитория.
|
||||||
|
|
||||||
|
<a name="contributing"></a>
|
||||||
|
# Внести свой вклад
|
||||||
|
|
||||||
|
Pull-запросы и плагины приветствуются!
|
||||||
|
|
||||||
|
Взгляните на [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) и [API docs](https://docs.tabby.sh/), чтобы понять, как устроен проект, и ради очень краткого туториала по созданию плагинов.
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="contributors"></a>
|
||||||
|
|
||||||
|
Огромное спасибо этим прекрасным людям ([описание эмодзи](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
Данный проект следует заветам [all-contributors](https://github.com/all-contributors/all-contributors). Любые созидатели приветствуются!
|
||||||
|
|
||||||
|
<img src="https://ga-beacon.appspot.com/UA-3278102-18/github/readme" width="1"/>
|
243
README.zh-CN.md
Normal file
243
README.zh-CN.md
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
[](https://tabby.sh)
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://ko-fi.com/J3J8KWTF">
|
||||||
|
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### 下载
|
||||||
|
|
||||||
|
* [Latest release](https://github.com/Eugeny/tabby/releases/latest)
|
||||||
|
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||||
|
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<p align="center">
|
||||||
|
本 README 还适用于以下语言: <a href="./README.ru-RU.md">Русский</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
[**Tabby**](https://tabby.sh) (前身是 **Terminus**) 是一个可高度配置的终端模拟器和 SSH 或串口客户端,支持 Windows,macOS 和 Linux
|
||||||
|
|
||||||
|
* 集成 SSH,Telnet 客户端和连接管理器
|
||||||
|
* 集成串行终端
|
||||||
|
* 定制主题和配色方案
|
||||||
|
* 完全可配置的快捷键和多键快捷键
|
||||||
|
* 分体式窗格
|
||||||
|
* 自动保存标签页
|
||||||
|
* 支持 PowerShell(和 PS Core)、WSL、Git-Bash、Cygwin、MSYS2、Cmder 和 CMD
|
||||||
|
* 在 SSH 会话中通过 Zmodem 进行直接文件传输
|
||||||
|
* 完整的 Unicode 支持,包括双角字符
|
||||||
|
* 不会因快速的输出而卡住
|
||||||
|
* Windows 上舒适的 shell 体验,包括 tab 自动补全(通过 Clink)
|
||||||
|
* 为 SSH secrets 和设置集成了加密容器
|
||||||
|
* SSH、SFTP 和 Telnet 客户端可用作 [Web 应用](https://tabby.sh/app)(也可[托管](https://github.com/Eugeny/tabby-web))
|
||||||
|
|
||||||
|
# 目录 <!-- omit in toc -->
|
||||||
|
|
||||||
|
- [Tabby的正确用途](#tabby的正确用途)
|
||||||
|
- [终端特性](#终端特性)
|
||||||
|
- [SSH 客户端](#ssh-客户端)
|
||||||
|
- [串行终端](#串行终端)
|
||||||
|
- [便携式应用](#便携式应用)
|
||||||
|
- [插件](#插件)
|
||||||
|
- [主题](#主题)
|
||||||
|
- [贡献](#贡献)
|
||||||
|
|
||||||
|
<a name="about"></a>
|
||||||
|
|
||||||
|
# Tabby的正确用途
|
||||||
|
|
||||||
|
* **Tabby 是** Windows 标准终端 (conhost)、PowerShell ISE、PuTTY、macOS Terminal.app 和 iTerm 的替代品
|
||||||
|
|
||||||
|
* **Tabby 不是**一个全新的 shell,也不是 MinGW 或 Cygwin 的替代品。它也不是轻量级的 - 如果你对内存的占用很敏感,请考虑 [Conemu](https://conemu.github.io) 或 [Alacritty](https://github.com/jwilm/alacritty)
|
||||||
|
<a name="terminal"></a>
|
||||||
|
|
||||||
|
# 终端特性
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* 一个 V220 终端 + 各种插件
|
||||||
|
* 多个嵌套的拆分窗格
|
||||||
|
* 可以将标签页设置在窗口的任意一侧
|
||||||
|
* 带有全局生成热键的可选可停靠窗口(“Quake console”)
|
||||||
|
* 进度检测
|
||||||
|
* 流程完成通知
|
||||||
|
* 带括号的粘贴,多行粘贴提示
|
||||||
|
* 连体字
|
||||||
|
* 自定义 shell 配置文件
|
||||||
|
* 可选的 RMB 粘贴和复制选择(PuTTY 风格)
|
||||||
|
|
||||||
|
<a name="ssh"></a>
|
||||||
|
# SSH 客户端
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* 带有连接管理器的 SSH2 客户端
|
||||||
|
* X11和端口转发
|
||||||
|
* 自动跳转主机管理
|
||||||
|
* 代理转发(包括 Pageant 和 Windows 原生 OpenSSH 代理)
|
||||||
|
* 登录脚本
|
||||||
|
|
||||||
|
<a name="serial"></a>
|
||||||
|
# 串行终端
|
||||||
|
|
||||||
|
* 保存连接
|
||||||
|
* 逐行读取的输入支持
|
||||||
|
* 可选的十六进制逐字节输入和十六进制转储输出
|
||||||
|
* 换行转换
|
||||||
|
* 自动重连
|
||||||
|
|
||||||
|
<a name="portable"></a>
|
||||||
|
# 便携式应用
|
||||||
|
|
||||||
|
如果在 Tabby.exe 所在的目录创建一个名为`data`文件夹,Tabby 将可以在 Windows 上作为便携式的应用程序运行。
|
||||||
|
|
||||||
|
<a name="plugins"></a>
|
||||||
|
# 插件
|
||||||
|
|
||||||
|
插件和主题可以直接在 Tabby 设置中安装。
|
||||||
|
|
||||||
|
* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 使终端中的路径和 URL 可点击
|
||||||
|
* [docker](https://github.com/Eugeny/tabby-docker) - 连接 Docker 容器
|
||||||
|
* [title-control](https://github.com/kbjr/terminus-title-control) - 允许通过提供要删除的前缀、后缀和/或字符串来修改标签页的标题
|
||||||
|
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 快速向一个或所有标签页发送命令
|
||||||
|
* [save-output](https://github.com/Eugeny/tabby-save-output) - 将终端输出记录到文件中
|
||||||
|
* [sync-config](https://github.com/starxg/terminus-sync-config) - 将配置同步到 Gist 或 Gitee
|
||||||
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - 一个可以一直烦你的示例插件
|
||||||
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件
|
||||||
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器
|
||||||
|
|
||||||
|
<a name="themes"></a>
|
||||||
|
# 主题
|
||||||
|
|
||||||
|
* [hype](https://github.com/Eugeny/tabby-theme-hype) - 受 Hyper 启发的主题
|
||||||
|
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - 为 Tabby 打造的 Relaxed 主题
|
||||||
|
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
|
||||||
|
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
|
||||||
|
* [altair](https://github.com/yxuko/terminus-altair)
|
||||||
|
|
||||||
|
# Sponsors <!-- omit in toc -->
|
||||||
|
|
||||||
|
[](https://packagecloud.io)
|
||||||
|
|
||||||
|
[**packagecloud**](https://packagecloud.io) 提供了免费的 Debian/RPM 存储库托管
|
||||||
|
|
||||||
|
<a name="contributing"></a>
|
||||||
|
# 贡献
|
||||||
|
|
||||||
|
欢迎提交 PR 和插件!
|
||||||
|
|
||||||
|
请参阅 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 和 [API 文档](https://docs.tabby.sh/) 以获取有关项目布局的信息以及非常简短的插件开发教程。
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="contributors"></a>
|
||||||
|
|
||||||
|
感谢这些人,他们棒极了!([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
本项目遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 规范。 欢迎任何形式的贡献!
|
@@ -1,4 +1,4 @@
|
|||||||
owner: eugeny
|
owner: eugeny
|
||||||
repo: terminus
|
repo: tabby
|
||||||
provider: github
|
provider: github
|
||||||
updaterCacheDirName: terminus-updater
|
updaterCacheDirName: tabby-updater
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
doctype html
|
doctype html
|
||||||
html.terminus
|
html.tabby
|
||||||
head
|
head
|
||||||
meta(charset='UTF-8')
|
meta(charset='UTF-8')
|
||||||
base(href='index.html')
|
base(href='index.html')
|
||||||
@@ -15,8 +15,8 @@ html.terminus
|
|||||||
app-root
|
app-root
|
||||||
.preload-logo
|
.preload-logo
|
||||||
div
|
div
|
||||||
.terminus-logo
|
.tabby-logo
|
||||||
h1.terminus-title Terminus
|
h1.tabby-title Tabby
|
||||||
sup α
|
sup α
|
||||||
.progress
|
.progress
|
||||||
.bar(style='width: 0%')
|
.bar(style='width: 0%')
|
||||||
|
@@ -1,8 +1,10 @@
|
|||||||
import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions } from 'electron'
|
import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions } from 'electron'
|
||||||
import * as promiseIpc from 'electron-promise-ipc'
|
import promiseIpc from 'electron-promise-ipc'
|
||||||
import * as remote from '@electron/remote/main'
|
import * as remote from '@electron/remote/main'
|
||||||
|
import { exec } from 'mz/child_process'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
|
import { Subject, throttleTime } from 'rxjs'
|
||||||
|
|
||||||
import { loadConfig } from './config'
|
import { loadConfig } from './config'
|
||||||
import { Window, WindowOptions } from './window'
|
import { Window, WindowOptions } from './window'
|
||||||
@@ -19,6 +21,9 @@ export class Application {
|
|||||||
private tray?: Tray
|
private tray?: Tray
|
||||||
private ptyManager = new PTYManager()
|
private ptyManager = new PTYManager()
|
||||||
private windows: Window[] = []
|
private windows: Window[] = []
|
||||||
|
private globalHotkey$ = new Subject<void>()
|
||||||
|
private quitRequested = false
|
||||||
|
private configStore: any
|
||||||
userPluginsPath: string
|
userPluginsPath: string
|
||||||
|
|
||||||
constructor () {
|
constructor () {
|
||||||
@@ -28,17 +33,20 @@ export class Application {
|
|||||||
|
|
||||||
ipcMain.on('app:config-change', (_event, config) => {
|
ipcMain.on('app:config-change', (_event, config) => {
|
||||||
this.broadcast('host:config-change', config)
|
this.broadcast('host:config-change', config)
|
||||||
|
this.configStore = config
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('app:register-global-hotkey', (_event, specs) => {
|
ipcMain.on('app:register-global-hotkey', (_event, specs) => {
|
||||||
globalShortcut.unregisterAll()
|
globalShortcut.unregisterAll()
|
||||||
for (const spec of specs) {
|
for (const spec of specs) {
|
||||||
globalShortcut.register(spec, () => {
|
globalShortcut.register(spec, () => this.globalHotkey$.next())
|
||||||
this.onGlobalHotkey()
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.globalHotkey$.pipe(throttleTime(100)).subscribe(() => {
|
||||||
|
this.onGlobalHotkey()
|
||||||
|
})
|
||||||
|
|
||||||
;(promiseIpc as any).on('plugin-manager:install', (name, version) => {
|
;(promiseIpc as any).on('plugin-manager:install', (name, version) => {
|
||||||
return pluginManager.install(this.userPluginsPath, name, version)
|
return pluginManager.install(this.userPluginsPath, name, version)
|
||||||
})
|
})
|
||||||
@@ -47,14 +55,26 @@ export class Application {
|
|||||||
return pluginManager.uninstall(this.userPluginsPath, name)
|
return pluginManager.uninstall(this.userPluginsPath, name)
|
||||||
})
|
})
|
||||||
|
|
||||||
const configData = loadConfig()
|
;(promiseIpc as any).on('get-default-mac-shell', async () => {
|
||||||
|
try {
|
||||||
|
return (await exec(`/usr/bin/dscl . -read /Users/${process.env.LOGNAME} UserShell`))[0].toString().split(' ')[1].trim()
|
||||||
|
} catch {
|
||||||
|
return '/bin/bash'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.configStore = loadConfig()
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux') {
|
||||||
app.commandLine.appendSwitch('no-sandbox')
|
app.commandLine.appendSwitch('no-sandbox')
|
||||||
if (((configData.appearance || {}).opacity || 1) !== 1) {
|
if (((this.configStore.appearance || {}).opacity || 1) !== 1) {
|
||||||
app.commandLine.appendSwitch('enable-transparent-visuals')
|
app.commandLine.appendSwitch('enable-transparent-visuals')
|
||||||
app.disableHardwareAcceleration()
|
app.disableHardwareAcceleration()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this.configStore.hacks?.disableGPU) {
|
||||||
|
app.commandLine.appendSwitch('disable-gpu')
|
||||||
|
app.disableHardwareAcceleration()
|
||||||
|
}
|
||||||
|
|
||||||
this.userPluginsPath = path.join(
|
this.userPluginsPath = path.join(
|
||||||
app.getPath('userData'),
|
app.getPath('userData'),
|
||||||
@@ -68,11 +88,16 @@ export class Application {
|
|||||||
app.commandLine.appendSwitch('disable-http-cache')
|
app.commandLine.appendSwitch('disable-http-cache')
|
||||||
app.commandLine.appendSwitch('max-active-webgl-contexts', '9000')
|
app.commandLine.appendSwitch('max-active-webgl-contexts', '9000')
|
||||||
app.commandLine.appendSwitch('lang', 'EN')
|
app.commandLine.appendSwitch('lang', 'EN')
|
||||||
app.allowRendererProcessReuse = false
|
|
||||||
|
|
||||||
for (const flag of configData.flags || [['force_discrete_gpu', '0']]) {
|
for (const flag of this.configStore.flags || [['force_discrete_gpu', '0']]) {
|
||||||
app.commandLine.appendSwitch(flag[0], flag[1])
|
app.commandLine.appendSwitch(flag[0], flag[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (this.quitRequested || process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
init (): void {
|
init (): void {
|
||||||
@@ -84,6 +109,9 @@ export class Application {
|
|||||||
async newWindow (options?: WindowOptions): Promise<Window> {
|
async newWindow (options?: WindowOptions): Promise<Window> {
|
||||||
const window = new Window(this, options)
|
const window = new Window(this, options)
|
||||||
this.windows.push(window)
|
this.windows.push(window)
|
||||||
|
if (this.windows.length === 1){
|
||||||
|
window.makeMain()
|
||||||
|
}
|
||||||
window.visible$.subscribe(visible => {
|
window.visible$.subscribe(visible => {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
this.disableTray()
|
this.disableTray()
|
||||||
@@ -93,6 +121,10 @@ export class Application {
|
|||||||
})
|
})
|
||||||
window.closed$.subscribe(() => {
|
window.closed$.subscribe(() => {
|
||||||
this.windows = this.windows.filter(x => x !== window)
|
this.windows = this.windows.filter(x => x !== window)
|
||||||
|
if (!this.windows.some(x => x.isMainWindow)) {
|
||||||
|
this.windows[0]?.makeMain()
|
||||||
|
this.windows[0]?.present()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
this.setupMenu()
|
this.setupMenu()
|
||||||
@@ -102,7 +134,14 @@ export class Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onGlobalHotkey (): void {
|
onGlobalHotkey (): void {
|
||||||
if (this.windows.some(x => x.isFocused() && x.isVisible())) {
|
let isPresent = this.windows.some(x => x.isFocused() && x.isVisible())
|
||||||
|
const isDockedOnTop = this.windows.some(x => x.isDockedOnTop())
|
||||||
|
if (isDockedOnTop) {
|
||||||
|
// if docked and on top, hide even if not focused right now
|
||||||
|
isPresent = this.windows.some(x => x.isVisible())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isPresent) {
|
||||||
for (const window of this.windows) {
|
for (const window of this.windows) {
|
||||||
window.hide()
|
window.hide()
|
||||||
}
|
}
|
||||||
@@ -154,7 +193,7 @@ export class Application {
|
|||||||
this.tray.setContextMenu(contextMenu)
|
this.tray.setContextMenu(contextMenu)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.tray.setToolTip(`Terminus ${app.getVersion()}`)
|
this.tray.setToolTip(`Tabby ${app.getVersion()}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
disableTray (): void {
|
disableTray (): void {
|
||||||
@@ -171,7 +210,7 @@ export class Application {
|
|||||||
|
|
||||||
focus (): void {
|
focus (): void {
|
||||||
for (const window of this.windows) {
|
for (const window of this.windows) {
|
||||||
window.show()
|
window.present()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +234,7 @@ export class Application {
|
|||||||
{
|
{
|
||||||
label: 'Application',
|
label: 'Application',
|
||||||
submenu: [
|
submenu: [
|
||||||
{ role: 'about', label: 'About Terminus' },
|
{ role: 'about', label: 'About Tabby' },
|
||||||
{ type: 'separator' },
|
{ type: 'separator' },
|
||||||
{
|
{
|
||||||
label: 'Preferences',
|
label: 'Preferences',
|
||||||
@@ -217,7 +256,8 @@ export class Application {
|
|||||||
{
|
{
|
||||||
label: 'Quit',
|
label: 'Quit',
|
||||||
accelerator: 'Cmd+Q',
|
accelerator: 'Cmd+Q',
|
||||||
click () {
|
click: () => {
|
||||||
|
this.quitRequested = true
|
||||||
app.quit()
|
app.quit()
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -240,7 +280,6 @@ export class Application {
|
|||||||
{
|
{
|
||||||
label: 'View',
|
label: 'View',
|
||||||
submenu: [
|
submenu: [
|
||||||
{ role: 'reload' },
|
|
||||||
{ role: 'toggleDevTools' },
|
{ role: 'toggleDevTools' },
|
||||||
{ type: 'separator' },
|
{ type: 'separator' },
|
||||||
{ role: 'togglefullscreen' },
|
{ role: 'togglefullscreen' },
|
||||||
@@ -261,13 +300,17 @@ export class Application {
|
|||||||
{
|
{
|
||||||
label: 'Website',
|
label: 'Website',
|
||||||
click () {
|
click () {
|
||||||
shell.openExternal('https://eugeny.github.io/terminus')
|
shell.openExternal('https://eugeny.github.io/tabby')
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (process.env.TABBY_DEV) {
|
||||||
|
template[2].submenu['unshift']({ role: 'reload' })
|
||||||
|
}
|
||||||
|
|
||||||
Menu.setApplicationMenu(Menu.buildFromTemplate(template))
|
Menu.setApplicationMenu(Menu.buildFromTemplate(template))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@ export function parseArgs (argv: string[], cwd: string): any {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return require('yargs/yargs')(argv.slice(1))
|
return require('yargs/yargs')(argv.slice(1))
|
||||||
.usage('terminus [command] [arguments]')
|
.usage('tabby [command] [arguments]')
|
||||||
.command('open [directory]', 'open a shell in a directory', {
|
.command('open [directory]', 'open a shell in a directory', {
|
||||||
directory: { type: 'string', 'default': cwd },
|
directory: { type: 'string', 'default': cwd },
|
||||||
})
|
})
|
||||||
@@ -16,12 +16,6 @@ export function parseArgs (argv: string[], cwd: string): any {
|
|||||||
.command('profile [profileName]', 'open a tab with specified profile', {
|
.command('profile [profileName]', 'open a tab with specified profile', {
|
||||||
profileName: { type: 'string' },
|
profileName: { type: 'string' },
|
||||||
})
|
})
|
||||||
.command('connect-ssh [connectionName]', 'open a tab for a saved SSH connection', {
|
|
||||||
connectionName: { type: 'string' },
|
|
||||||
})
|
|
||||||
.command('connect-serial [connectionName]', 'open a tab for a saved serial connection', {
|
|
||||||
connectionName: { type: 'string' },
|
|
||||||
})
|
|
||||||
.command('paste [text]', 'paste stdin into the active tab', yargs => {
|
.command('paste [text]', 'paste stdin into the active tab', yargs => {
|
||||||
return yargs.option('escape', {
|
return yargs.option('escape', {
|
||||||
alias: 'e',
|
alias: 'e',
|
||||||
@@ -31,7 +25,7 @@ export function parseArgs (argv: string[], cwd: string): any {
|
|||||||
type: 'string',
|
type: 'string',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.version('version', '', app.getVersion())
|
.version(app.getVersion())
|
||||||
.option('debug', {
|
.option('debug', {
|
||||||
alias: 'd',
|
alias: 'd',
|
||||||
describe: 'Show DevTools on start',
|
describe: 'Show DevTools on start',
|
||||||
@@ -41,11 +35,6 @@ export function parseArgs (argv: string[], cwd: string): any {
|
|||||||
describe: 'Start minimized',
|
describe: 'Start minimized',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
})
|
})
|
||||||
.option('version', {
|
|
||||||
alias: 'v',
|
|
||||||
describe: 'Show version and exit',
|
|
||||||
type: 'boolean',
|
|
||||||
})
|
|
||||||
.help('help')
|
.help('help')
|
||||||
.parse()
|
.parse()
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,20 @@ import * as path from 'path'
|
|||||||
import * as yaml from 'js-yaml'
|
import * as yaml from 'js-yaml'
|
||||||
import { app } from 'electron'
|
import { app } from 'electron'
|
||||||
|
|
||||||
|
export function migrateConfig (): void {
|
||||||
|
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
||||||
|
const legacyConfigPath = path.join(app.getPath('userData'), '../terminus', 'config.yaml')
|
||||||
|
if (fs.existsSync(legacyConfigPath) && (
|
||||||
|
!fs.existsSync(configPath) ||
|
||||||
|
fs.statSync(configPath).mtime < fs.statSync(legacyConfigPath).mtime
|
||||||
|
)) {
|
||||||
|
fs.writeFileSync(configPath, fs.readFileSync(legacyConfigPath))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function loadConfig (): any {
|
export function loadConfig (): any {
|
||||||
|
migrateConfig()
|
||||||
|
|
||||||
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
||||||
if (fs.existsSync(configPath)) {
|
if (fs.existsSync(configPath)) {
|
||||||
return yaml.load(fs.readFileSync(configPath, 'utf8'))
|
return yaml.load(fs.readFileSync(configPath, 'utf8'))
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import 'v8-compile-cache'
|
||||||
import './portable'
|
import './portable'
|
||||||
import 'source-map-support/register'
|
import 'source-map-support/register'
|
||||||
import './sentry'
|
import './sentry'
|
||||||
@@ -7,8 +8,8 @@ import { parseArgs } from './cli'
|
|||||||
import { Application } from './app'
|
import { Application } from './app'
|
||||||
import electronDebug = require('electron-debug')
|
import electronDebug = require('electron-debug')
|
||||||
|
|
||||||
if (!process.env.TERMINUS_PLUGINS) {
|
if (!process.env.TABBY_PLUGINS) {
|
||||||
process.env.TERMINUS_PLUGINS = ''
|
process.env.TABBY_PLUGINS = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
const application = new Application()
|
const application = new Application()
|
||||||
@@ -25,10 +26,6 @@ app.on('activate', () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
app.quit()
|
|
||||||
})
|
|
||||||
|
|
||||||
process.on('uncaughtException' as any, err => {
|
process.on('uncaughtException' as any, err => {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
application.broadcast('uncaughtException', err)
|
application.broadcast('uncaughtException', err)
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import * as LRU from 'lru-cache'
|
import LRU from 'lru-cache'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
const lru = new LRU({ max: 256, maxAge: 250 })
|
const lru = new LRU({ max: 256, maxAge: 250 })
|
||||||
const origLstat = fs.realpathSync.bind(fs)
|
const origLstat = fs.realpathSync.bind(fs)
|
||||||
|
@@ -4,9 +4,6 @@ import * as electron from 'electron'
|
|||||||
|
|
||||||
const appPath = path.dirname(electron.app.getPath('exe'))
|
const appPath = path.dirname(electron.app.getPath('exe'))
|
||||||
|
|
||||||
if (fs.existsSync(path.join(appPath, 'terminus-data'))) {
|
|
||||||
fs.renameSync(path.join(appPath, 'terminus-data'), path.join(appPath, 'data'))
|
|
||||||
}
|
|
||||||
const portableData = path.join(appPath, 'data')
|
const portableData = path.join(appPath, 'data')
|
||||||
if (fs.existsSync(portableData)) {
|
if (fs.existsSync(portableData)) {
|
||||||
console.log('reset user data to ' + portableData)
|
console.log('reset user data to ' + portableData)
|
||||||
|
@@ -1,18 +1,27 @@
|
|||||||
import * as nodePTY from '@terminus-term/node-pty'
|
import * as nodePTY from '@tabby-gang/node-pty'
|
||||||
import { StringDecoder } from './stringDecoder'
|
|
||||||
import { v4 as uuidv4 } from 'uuid'
|
import { v4 as uuidv4 } from 'uuid'
|
||||||
import { ipcMain } from 'electron'
|
import { ipcMain } from 'electron'
|
||||||
import { Application } from './app'
|
import { Application } from './app'
|
||||||
|
import { UTF8Splitter } from './utfSplitter'
|
||||||
|
import { Subject, debounceTime } from 'rxjs'
|
||||||
|
|
||||||
class PTYDataQueue {
|
class PTYDataQueue {
|
||||||
private buffers: Buffer[] = []
|
private buffers: Buffer[] = []
|
||||||
private delta = 0
|
private delta = 0
|
||||||
private maxChunk = 1024
|
private maxChunk = 1024 * 100
|
||||||
private maxDelta = 1024 * 50
|
private maxDelta = this.maxChunk * 5
|
||||||
private flowPaused = false
|
private flowPaused = false
|
||||||
private decoder = new StringDecoder()
|
private decoder = new UTF8Splitter()
|
||||||
|
private output$ = new Subject<Buffer>()
|
||||||
|
|
||||||
constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) { }
|
constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) {
|
||||||
|
this.output$.pipe(debounceTime(500)).subscribe(() => {
|
||||||
|
const remainder = this.decoder.flush()
|
||||||
|
if (remainder.length) {
|
||||||
|
this.onData(remainder)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
push (data: Buffer) {
|
push (data: Buffer) {
|
||||||
this.buffers.push(data)
|
this.buffers.push(data)
|
||||||
@@ -61,7 +70,9 @@ class PTYDataQueue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private emitData (data: Buffer) {
|
private emitData (data: Buffer) {
|
||||||
this.onData(this.decoder.write(data))
|
const validChunk = this.decoder.write(data)
|
||||||
|
this.onData(validChunk)
|
||||||
|
this.output$.next(validChunk)
|
||||||
}
|
}
|
||||||
|
|
||||||
private pause () {
|
private pause () {
|
||||||
@@ -79,6 +90,7 @@ class PTYDataQueue {
|
|||||||
export class PTY {
|
export class PTY {
|
||||||
private pty: nodePTY.IPty
|
private pty: nodePTY.IPty
|
||||||
private outputQueue: PTYDataQueue
|
private outputQueue: PTYDataQueue
|
||||||
|
exited = false
|
||||||
|
|
||||||
constructor (private id: string, private app: Application, ...args: any[]) {
|
constructor (private id: string, private app: Application, ...args: any[]) {
|
||||||
this.pty = (nodePTY as any).spawn(...args)
|
this.pty = (nodePTY as any).spawn(...args)
|
||||||
@@ -90,7 +102,10 @@ export class PTY {
|
|||||||
setImmediate(() => this.emit('data', data))
|
setImmediate(() => this.emit('data', data))
|
||||||
})
|
})
|
||||||
|
|
||||||
this.pty.on('data', data => this.outputQueue.push(Buffer.from(data)))
|
this.pty.onData(data => this.outputQueue.push(Buffer.from(data)))
|
||||||
|
this.pty.onExit(() => {
|
||||||
|
this.exited = true
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
getPID (): number {
|
getPID (): number {
|
||||||
@@ -133,7 +148,7 @@ export class PTYManager {
|
|||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('pty:exists', (event, id) => {
|
ipcMain.on('pty:exists', (event, id) => {
|
||||||
event.returnValue = !!this.ptys[id]
|
event.returnValue = this.ptys[id] && !this.ptys[id].exited
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('pty:get-pid', (event, id) => {
|
ipcMain.on('pty:get-pid', (event, id) => {
|
||||||
|
@@ -8,7 +8,7 @@ try {
|
|||||||
release = require('@electron/remote').app.getVersion()
|
release = require('@electron/remote').app.getVersion()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!process.env.TERMINUS_DEV) {
|
if (!process.env.TABBY_DEV) {
|
||||||
init({
|
init({
|
||||||
dsn: SENTRY_DSN,
|
dsn: SENTRY_DSN,
|
||||||
release,
|
release,
|
||||||
|
32
app/lib/utfSplitter.ts
Normal file
32
app/lib/utfSplitter.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
const partials = [
|
||||||
|
[0b110, 5, 0],
|
||||||
|
[0b1110, 4, 1],
|
||||||
|
[0b11110, 3, 2],
|
||||||
|
]
|
||||||
|
|
||||||
|
export class UTF8Splitter {
|
||||||
|
private internal = Buffer.alloc(0)
|
||||||
|
|
||||||
|
write (data: Buffer): Buffer {
|
||||||
|
this.internal = Buffer.concat([this.internal, data])
|
||||||
|
|
||||||
|
let keep = 0
|
||||||
|
for (const [pattern, shift, maxOffset] of partials) {
|
||||||
|
for (let offset = 0; offset < maxOffset + 1; offset++) {
|
||||||
|
if (this.internal[this.internal.length - offset - 1] >> shift === pattern) {
|
||||||
|
keep = Math.max(keep, offset + 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = this.internal.slice(0, this.internal.length - keep)
|
||||||
|
this.internal = this.internal.slice(this.internal.length - keep)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
flush (): Buffer {
|
||||||
|
const result = this.internal
|
||||||
|
this.internal = Buffer.alloc(0)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
@@ -1,13 +1,13 @@
|
|||||||
import * as glasstron from 'glasstron'
|
import * as glasstron from 'glasstron'
|
||||||
|
|
||||||
import { Subject, Observable } from 'rxjs'
|
import { Subject, Observable, debounceTime } from 'rxjs'
|
||||||
import { debounceTime } from 'rxjs/operators'
|
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage } from 'electron'
|
||||||
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions } from 'electron'
|
|
||||||
import ElectronConfig = require('electron-config')
|
import ElectronConfig = require('electron-config')
|
||||||
|
import { enable as enableRemote } from '@electron/remote/main'
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import macOSRelease from 'macos-release'
|
import macOSRelease from 'macos-release'
|
||||||
import * as compareVersions from 'compare-versions'
|
import { compare as compareVersions } from 'compare-versions'
|
||||||
|
|
||||||
import type { Application } from './app'
|
import type { Application } from './app'
|
||||||
import { parseArgs } from './cli'
|
import { parseArgs } from './cli'
|
||||||
@@ -15,7 +15,7 @@ import { loadConfig } from './config'
|
|||||||
|
|
||||||
let DwmEnableBlurBehindWindow: any = null
|
let DwmEnableBlurBehindWindow: any = null
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow
|
DwmEnableBlurBehindWindow = require('@tabby-gang/windows-blurbehind').DwmEnableBlurBehindWindow
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface WindowOptions {
|
export interface WindowOptions {
|
||||||
@@ -27,10 +27,13 @@ abstract class GlasstronWindow extends BrowserWindow {
|
|||||||
abstract setBlur (_: boolean)
|
abstract setBlur (_: boolean)
|
||||||
}
|
}
|
||||||
|
|
||||||
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions.compare(macOSRelease().version, '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null
|
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions(macOSRelease().version, '10.14', '>=') ? 'under-window' : 'dark' : null
|
||||||
|
|
||||||
|
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
|
||||||
|
|
||||||
export class Window {
|
export class Window {
|
||||||
ready: Promise<void>
|
ready: Promise<void>
|
||||||
|
isMainWindow = false
|
||||||
private visible = new Subject<boolean>()
|
private visible = new Subject<boolean>()
|
||||||
private closed = new Subject<void>()
|
private closed = new Subject<void>()
|
||||||
private window?: GlasstronWindow
|
private window?: GlasstronWindow
|
||||||
@@ -40,6 +43,9 @@ export class Window {
|
|||||||
private lastVibrancy: { enabled: boolean, type?: string } | null = null
|
private lastVibrancy: { enabled: boolean, type?: string } | null = null
|
||||||
private disableVibrancyWhileDragging = false
|
private disableVibrancyWhileDragging = false
|
||||||
private configStore: any
|
private configStore: any
|
||||||
|
private touchBarControl: any
|
||||||
|
private isFluentVibrancy = false
|
||||||
|
private dockHidden = false
|
||||||
|
|
||||||
get visible$ (): Observable<boolean> { return this.visible }
|
get visible$ (): Observable<boolean> { return this.visible }
|
||||||
get closed$ (): Observable<void> { return this.closed }
|
get closed$ (): Observable<void> { return this.closed }
|
||||||
@@ -56,14 +62,13 @@ export class Window {
|
|||||||
const bwOptions: BrowserWindowConstructorOptions = {
|
const bwOptions: BrowserWindowConstructorOptions = {
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
title: 'Terminus',
|
title: 'Tabby',
|
||||||
minWidth: 400,
|
minWidth: 400,
|
||||||
minHeight: 300,
|
minHeight: 300,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true,
|
nodeIntegration: true,
|
||||||
preload: path.join(__dirname, 'sentry.js'),
|
preload: path.join(__dirname, 'sentry.js'),
|
||||||
backgroundThrottling: false,
|
backgroundThrottling: false,
|
||||||
enableRemoteModule: true,
|
|
||||||
contextIsolation: false,
|
contextIsolation: false,
|
||||||
},
|
},
|
||||||
maximizable: true,
|
maximizable: true,
|
||||||
@@ -114,21 +119,32 @@ export class Window {
|
|||||||
}
|
}
|
||||||
this.window.focus()
|
this.window.focus()
|
||||||
this.window.moveTop()
|
this.window.moveTop()
|
||||||
|
application.focus()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.window.on('blur', () => {
|
this.window.on('blur', () => {
|
||||||
if (this.configStore.appearance.dock !== 'off' && this.configStore.appearance?.dockHideOnBlur) {
|
if ((this.configStore.appearance?.dock ?? 'off') !== 'off' && this.configStore.appearance?.dockHideOnBlur) {
|
||||||
this.hide()
|
this.hide()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
enableRemote(this.window.webContents)
|
||||||
|
|
||||||
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' })
|
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' })
|
||||||
|
|
||||||
this.window.webContents.setVisualZoomLevelLimits(1, 1)
|
this.window.webContents.setVisualZoomLevelLimits(1, 1)
|
||||||
this.window.webContents.setZoomFactor(1)
|
this.window.webContents.setZoomFactor(1)
|
||||||
|
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
|
this.touchBarControl = new TouchBar.TouchBarSegmentedControl({
|
||||||
|
segments: [],
|
||||||
|
change: index => this.send('touchbar-selection', index),
|
||||||
|
})
|
||||||
|
this.window.setTouchBar(new TouchBar({
|
||||||
|
items: [this.touchBarControl],
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
this.window.setMenu(null)
|
this.window.setMenu(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,6 +161,11 @@ export class Window {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
makeMain (): void {
|
||||||
|
this.isMainWindow = true
|
||||||
|
this.window.webContents.send('host:became-main-window')
|
||||||
|
}
|
||||||
|
|
||||||
setVibrancy (enabled: boolean, type?: string, userRequested?: boolean): void {
|
setVibrancy (enabled: boolean, type?: string, userRequested?: boolean): void {
|
||||||
if (userRequested ?? true) {
|
if (userRequested ?? true) {
|
||||||
this.lastVibrancy = { enabled, type }
|
this.lastVibrancy = { enabled, type }
|
||||||
@@ -154,6 +175,7 @@ export class Window {
|
|||||||
this.window.blurType = enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null
|
this.window.blurType = enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null
|
||||||
try {
|
try {
|
||||||
this.window.setBlur(enabled)
|
this.window.setBlur(enabled)
|
||||||
|
this.isFluentVibrancy = enabled && type === 'fluent'
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to set window blur', error)
|
console.error('Failed to set window blur', error)
|
||||||
}
|
}
|
||||||
@@ -168,11 +190,6 @@ export class Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
show (): void {
|
|
||||||
this.window.show()
|
|
||||||
this.window.moveTop()
|
|
||||||
}
|
|
||||||
|
|
||||||
focus (): void {
|
focus (): void {
|
||||||
this.window.focus()
|
this.window.focus()
|
||||||
}
|
}
|
||||||
@@ -184,6 +201,7 @@ export class Window {
|
|||||||
this.window.webContents.send(event, ...args)
|
this.window.webContents.send(event, ...args)
|
||||||
if (event === 'host:config-change') {
|
if (event === 'host:config-change') {
|
||||||
this.configStore = args[0]
|
this.configStore = args[0]
|
||||||
|
this.enableDockedWindowStyles(this.isDockedOnTop())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,45 +217,69 @@ export class Window {
|
|||||||
return this.window.isVisible()
|
return this.window.isVisible()
|
||||||
}
|
}
|
||||||
|
|
||||||
hide (): void {
|
isDockedOnTop (): boolean {
|
||||||
|
return this.isMainWindow && this.configStore.appearance?.dock && this.configStore.appearance?.dock !== 'off' && (this.configStore.appearance?.dockAlwaysOnTop ?? true)
|
||||||
|
}
|
||||||
|
|
||||||
|
async hide (): Promise<void> {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
// Lose focus
|
// Lose focus
|
||||||
Menu.sendActionToFirstResponder('hide:')
|
Menu.sendActionToFirstResponder('hide:')
|
||||||
}
|
if (this.isDockedOnTop()) {
|
||||||
this.window.blur()
|
await this.enableDockedWindowStyles(false)
|
||||||
if (process.platform !== 'darwin') {
|
|
||||||
this.window.hide()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
present (): void {
|
|
||||||
if (!this.window.isVisible()) {
|
|
||||||
// unfocused, invisible
|
|
||||||
this.window.show()
|
|
||||||
this.window.focus()
|
|
||||||
} else {
|
|
||||||
if (!this.configStore.appearance?.dock || this.configStore.appearance?.dock === 'off') {
|
|
||||||
// not docked, visible
|
|
||||||
setTimeout(() => {
|
|
||||||
this.window.show()
|
|
||||||
this.window.focus()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
if (this.configStore.appearance?.dockAlwaysOnTop) {
|
|
||||||
// docked, visible, on top
|
|
||||||
this.window.hide()
|
|
||||||
} else {
|
|
||||||
// docked, visible, not on top
|
|
||||||
this.window.focus()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.window.blur()
|
||||||
|
this.window.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
async show (): Promise<void> {
|
||||||
|
await this.enableDockedWindowStyles(this.isDockedOnTop())
|
||||||
|
this.window.show()
|
||||||
|
this.window.focus()
|
||||||
|
}
|
||||||
|
|
||||||
|
async present (): Promise<void> {
|
||||||
|
await this.show()
|
||||||
|
this.window.moveTop()
|
||||||
}
|
}
|
||||||
|
|
||||||
passCliArguments (argv: string[], cwd: string, secondInstance: boolean): void {
|
passCliArguments (argv: string[], cwd: string, secondInstance: boolean): void {
|
||||||
this.send('cli', parseArgs(argv, cwd), cwd, secondInstance)
|
this.send('cli', parseArgs(argv, cwd), cwd, secondInstance)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async enableDockedWindowStyles (enabled: boolean) {
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
if (enabled) {
|
||||||
|
if (!this.dockHidden) {
|
||||||
|
app.dock.hide()
|
||||||
|
this.dockHidden = true
|
||||||
|
}
|
||||||
|
this.window.setAlwaysOnTop(true, 'screen-saver', 1)
|
||||||
|
if (!this.window.isVisibleOnAllWorkspaces()) {
|
||||||
|
this.window.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true })
|
||||||
|
}
|
||||||
|
if (this.window.fullScreenable) {
|
||||||
|
this.window.setFullScreenable(false)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.dockHidden) {
|
||||||
|
await app.dock.show()
|
||||||
|
this.dockHidden = false
|
||||||
|
}
|
||||||
|
if (this.window.isAlwaysOnTop()) {
|
||||||
|
this.window.setAlwaysOnTop(false)
|
||||||
|
}
|
||||||
|
if (this.window.isVisibleOnAllWorkspaces()) {
|
||||||
|
this.window.setVisibleOnAllWorkspaces(false)
|
||||||
|
}
|
||||||
|
if (!this.window.fullScreenable) {
|
||||||
|
this.window.setFullScreenable(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private setupWindowManagement () {
|
private setupWindowManagement () {
|
||||||
this.window.on('show', () => {
|
this.window.on('show', () => {
|
||||||
this.visible.next(true)
|
this.visible.next(true)
|
||||||
@@ -261,6 +303,9 @@ export class Window {
|
|||||||
this.window.on('enter-full-screen', () => this.send('host:window-enter-full-screen'))
|
this.window.on('enter-full-screen', () => this.send('host:window-enter-full-screen'))
|
||||||
this.window.on('leave-full-screen', () => this.send('host:window-leave-full-screen'))
|
this.window.on('leave-full-screen', () => this.send('host:window-leave-full-screen'))
|
||||||
|
|
||||||
|
this.window.on('maximize', () => this.send('host:window-maximized'))
|
||||||
|
this.window.on('unmaximize', () => this.send('host:window-unmaximized'))
|
||||||
|
|
||||||
this.window.on('close', event => {
|
this.window.on('close', event => {
|
||||||
if (!this.closing) {
|
if (!this.closing) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
@@ -299,22 +344,11 @@ export class Window {
|
|||||||
config: this.configStore,
|
config: this.configStore,
|
||||||
executable: app.getPath('exe'),
|
executable: app.getPath('exe'),
|
||||||
windowID: this.window.id,
|
windowID: this.window.id,
|
||||||
isFirstWindow: this.window.id === 1,
|
isMainWindow: this.isMainWindow,
|
||||||
userPluginsPath: this.application.userPluginsPath,
|
userPluginsPath: this.application.userPluginsPath,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-toggle-maximize', event => {
|
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (this.window.isMaximized()) {
|
|
||||||
this.window.unmaximize()
|
|
||||||
} else {
|
|
||||||
this.window.maximize()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
ipcMain.on('window-minimize', event => {
|
ipcMain.on('window-minimize', event => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
if (!this.window || event.sender !== this.window.webContents) {
|
||||||
return
|
return
|
||||||
@@ -357,8 +391,7 @@ export class Window {
|
|||||||
if (this.window.isMinimized()) {
|
if (this.window.isMinimized()) {
|
||||||
this.window.restore()
|
this.window.restore()
|
||||||
}
|
}
|
||||||
this.window.show()
|
this.present()
|
||||||
this.window.moveTop()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-close', event => {
|
ipcMain.on('window-close', event => {
|
||||||
@@ -369,15 +402,23 @@ export class Window {
|
|||||||
this.window.close()
|
this.window.close()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-touch-bar', (_event, segments, selectedIndex) => {
|
||||||
|
this.touchBarControl.segments = segments.map(s => ({
|
||||||
|
label: s.label,
|
||||||
|
icon: s.hasActivity ? activityIcon : undefined,
|
||||||
|
}))
|
||||||
|
this.touchBarControl.selectedIndex = selectedIndex
|
||||||
|
})
|
||||||
|
|
||||||
this.window.webContents.on('new-window', event => event.preventDefault())
|
this.window.webContents.on('new-window', event => event.preventDefault())
|
||||||
|
|
||||||
ipcMain.on('window-set-disable-vibrancy-while-dragging', (_event, value) => {
|
ipcMain.on('window-set-disable-vibrancy-while-dragging', (_event, value) => {
|
||||||
this.disableVibrancyWhileDragging = value
|
this.disableVibrancyWhileDragging = value
|
||||||
})
|
})
|
||||||
|
|
||||||
let moveEndedTimeout: number|null = null
|
let moveEndedTimeout: any = null
|
||||||
const onBoundsChange = () => {
|
const onBoundsChange = () => {
|
||||||
if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging) {
|
if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging || !this.isFluentVibrancy) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.setVibrancy(false, undefined, false)
|
this.setVibrancy(false, undefined, false)
|
||||||
@@ -390,6 +431,18 @@ export class Window {
|
|||||||
}
|
}
|
||||||
this.window.on('move', onBoundsChange)
|
this.window.on('move', onBoundsChange)
|
||||||
this.window.on('resize', onBoundsChange)
|
this.window.on('resize', onBoundsChange)
|
||||||
|
|
||||||
|
ipcMain.on('window-set-traffic-light-position', (_event, x, y) => {
|
||||||
|
this.window.setTrafficLightPosition({ x, y })
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-opacity', (_event, opacity) => {
|
||||||
|
this.window.setOpacity(opacity)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-set-progress-bar', (_event, value) => {
|
||||||
|
this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private destroy () {
|
private destroy () {
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "terminus",
|
"name": "tabby",
|
||||||
"description": "A terminal for a modern age",
|
"description": "A terminal for a modern age",
|
||||||
"private": true,
|
"private": true,
|
||||||
"repository": "https://github.com/eugeny/terminus",
|
"repository": "https://github.com/Eugeny/tabby",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Eugene Pankov",
|
"name": "Eugene Pankov",
|
||||||
"email": "e@ajenti.org"
|
"email": "e@ajenti.org"
|
||||||
@@ -10,61 +10,54 @@
|
|||||||
"main": "dist/main.js",
|
"main": "dist/main.js",
|
||||||
"version": "1.0.0-alpha.1",
|
"version": "1.0.0-alpha.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"postinstall": "patch-package",
|
||||||
"build": "webpack --progress --color --display-modules",
|
"build": "webpack --progress --color --display-modules",
|
||||||
"watch": "webpack --progress --color --watch"
|
"watch": "webpack --progress --color --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "^12.0.0",
|
"@angular/cdk": "^12.2.9",
|
||||||
"@angular/common": "^12.0.0",
|
"@electron/remote": "2.0.1",
|
||||||
"@angular/compiler": "^12.0.0",
|
"@tabby-gang/node-pty": "^0.11.0-beta.200",
|
||||||
"@angular/core": "^12.0.0",
|
|
||||||
"@angular/forms": "^12.0.0",
|
|
||||||
"@angular/platform-browser": "^12.0.0",
|
|
||||||
"@angular/platform-browser-dynamic": "^12.0.0",
|
|
||||||
"@electron/remote": "1.0.4",
|
|
||||||
"@ng-bootstrap/ng-bootstrap": "^9.1.1",
|
|
||||||
"@terminus-term/node-pty": "0.10.0-terminus.3",
|
|
||||||
"any-promise": "^1.3.0",
|
"any-promise": "^1.3.0",
|
||||||
"electron-config": "2.0.0",
|
"electron-config": "2.0.0",
|
||||||
"electron-debug": "^3.2.0",
|
"electron-debug": "^3.2.0",
|
||||||
"electron-promise-ipc": "^2.2.4",
|
"electron-promise-ipc": "^2.2.4",
|
||||||
"fontmanager-redux": "1.0.0",
|
"electron-updater": "^4.6.1",
|
||||||
|
"fontmanager-redux": "1.1.0",
|
||||||
"glasstron": "0.0.7",
|
"glasstron": "0.0.7",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"keytar": "^7.7.0",
|
"keytar": "^7.7.0",
|
||||||
"mz": "^2.7.0",
|
"mz": "^2.7.0",
|
||||||
"native-process-working-directory": "^1.0.2",
|
"native-process-working-directory": "^1.0.2",
|
||||||
"ngx-toastr": "^14.0.0",
|
|
||||||
"npm": "6",
|
"npm": "6",
|
||||||
"rxjs": "^7.1.0",
|
"rxjs": "^7.5.1",
|
||||||
"ssh2": "^1.1.0",
|
"source-map-support": "^0.5.20",
|
||||||
"yargs": "^17.0.1",
|
"v8-compile-cache": "^2.3.0",
|
||||||
"zone.js": "^0.11.4"
|
"yargs": "^17.3.1"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
|
"@tabby-gang/windows-blurbehind": "^3.0.0",
|
||||||
"macos-native-processlist": "^2.0.0",
|
"macos-native-processlist": "^2.0.0",
|
||||||
"serialport": "^9.1.0",
|
"serialport": "^10.0.2",
|
||||||
"windows-blurbehind": "^1.0.1",
|
"windows-native-registry": "^3.1.0",
|
||||||
"windows-native-registry": "^3.0.0",
|
"windows-process-tree": "^0.3.2"
|
||||||
"windows-process-tree": "^0.3.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/mz": "2.7.3",
|
"@types/mz": "2.7.4",
|
||||||
"@types/node": "15.12.1",
|
"@types/node": "16.0.1",
|
||||||
"ngx-filesize": "^2.0.16",
|
"ngx-filesize": "^2.0.16",
|
||||||
"node-abi": "^2.30.0",
|
"patch-package": "^6.4.7"
|
||||||
"source-map-support": "^0.5.19"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"terminus-community-color-schemes": "*",
|
"tabby-community-color-schemes": "*",
|
||||||
"terminus-core": "*",
|
"tabby-core": "*",
|
||||||
"terminus-electron": "*",
|
"tabby-electron": "*",
|
||||||
"terminus-local": "*",
|
"tabby-local": "*",
|
||||||
"terminus-plugin-manager": "*",
|
"tabby-plugin-manager": "*",
|
||||||
"terminus-serial": "*",
|
"tabby-serial": "*",
|
||||||
"terminus-settings": "*",
|
"tabby-settings": "*",
|
||||||
"terminus-ssh": "*",
|
"tabby-ssh": "*",
|
||||||
"terminus-terminal": "*"
|
"tabby-terminal": "*"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"*/node-abi": "^2.20.0"
|
"*/node-abi": "^2.20.0"
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import 'v8-compile-cache'
|
||||||
import '../lib/lru'
|
import '../lib/lru'
|
||||||
import 'source-sans-pro/source-sans-pro.css'
|
import 'source-sans-pro/source-sans-pro.css'
|
||||||
import 'source-code-pro/source-code-pro.css'
|
import 'source-code-pro/source-code-pro.css'
|
||||||
|
@@ -5,14 +5,16 @@ import 'rxjs'
|
|||||||
import './global.scss'
|
import './global.scss'
|
||||||
import './toastr.scss'
|
import './toastr.scss'
|
||||||
|
|
||||||
|
// Importing before @angular/*
|
||||||
|
import { findPlugins, initModuleLookup, loadPlugins } from './plugins'
|
||||||
|
|
||||||
import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core'
|
import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core'
|
||||||
import { enableDebugTools } from '@angular/platform-browser'
|
import { enableDebugTools } from '@angular/platform-browser'
|
||||||
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
|
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
|
||||||
import { ipcRenderer } from 'electron'
|
import { ipcRenderer } from 'electron'
|
||||||
|
|
||||||
import { getRootModule } from './app.module'
|
import { getRootModule } from './app.module'
|
||||||
import { findPlugins, initModuleLookup, loadPlugins } from './plugins'
|
import { BootstrapData, BOOTSTRAP_DATA, PluginInfo } from '../../tabby-core/src/api/mainProcess'
|
||||||
import { BootstrapData, BOOTSTRAP_DATA } from '../../terminus-core/src/api/mainProcess'
|
|
||||||
|
|
||||||
// Always land on the start view
|
// Always land on the start view
|
||||||
location.hash = ''
|
location.hash = ''
|
||||||
@@ -23,18 +25,18 @@ if (process.platform === 'win32' && !('HOME' in process.env)) {
|
|||||||
process.env.HOME = `${process.env.HOMEDRIVE}${process.env.HOMEPATH}`
|
process.env.HOME = `${process.env.HOMEDRIVE}${process.env.HOMEPATH}`
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.TERMINUS_DEV && !process.env.TERMINUS_FORCE_ANGULAR_PROD) {
|
if (process.env.TABBY_DEV && !process.env.TABBY_FORCE_ANGULAR_PROD) {
|
||||||
console.warn('Running in debug mode')
|
console.warn('Running in debug mode')
|
||||||
} else {
|
} else {
|
||||||
enableProdMode()
|
enableProdMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function bootstrap (bootstrapData: BootstrapData, safeMode = false): Promise<NgModuleRef<any>> {
|
async function bootstrap (bootstrapData: BootstrapData, plugins: PluginInfo[], safeMode = false): Promise<NgModuleRef<any>> {
|
||||||
if (safeMode) {
|
if (safeMode) {
|
||||||
bootstrapData.installedPlugins = bootstrapData.installedPlugins.filter(x => x.isBuiltin)
|
plugins = plugins.filter(x => x.isBuiltin)
|
||||||
}
|
}
|
||||||
|
|
||||||
const pluginModules = await loadPlugins(bootstrapData.installedPlugins, (current, total) => {
|
const pluginModules = await loadPlugins(plugins, (current, total) => {
|
||||||
(document.querySelector('.progress .bar') as HTMLElement).style.width = `${100 * current / total}%` // eslint-disable-line
|
(document.querySelector('.progress .bar') as HTMLElement).style.width = `${100 * current / total}%` // eslint-disable-line
|
||||||
})
|
})
|
||||||
const module = getRootModule(pluginModules)
|
const module = getRootModule(pluginModules)
|
||||||
@@ -42,7 +44,7 @@ async function bootstrap (bootstrapData: BootstrapData, safeMode = false): Promi
|
|||||||
const moduleRef = await platformBrowserDynamic([
|
const moduleRef = await platformBrowserDynamic([
|
||||||
{ provide: BOOTSTRAP_DATA, useValue: bootstrapData },
|
{ provide: BOOTSTRAP_DATA, useValue: bootstrapData },
|
||||||
]).bootstrapModule(module)
|
]).bootstrapModule(module)
|
||||||
if (process.env.TERMINUS_DEV) {
|
if (process.env.TABBY_DEV) {
|
||||||
const applicationRef = moduleRef.injector.get(ApplicationRef)
|
const applicationRef = moduleRef.injector.get(ApplicationRef)
|
||||||
const componentRef = applicationRef.components[0]
|
const componentRef = applicationRef.components[0]
|
||||||
enableDebugTools(componentRef)
|
enableDebugTools(componentRef)
|
||||||
@@ -56,21 +58,21 @@ ipcRenderer.once('start', async (_$event, bootstrapData: BootstrapData) => {
|
|||||||
initModuleLookup(bootstrapData.userPluginsPath)
|
initModuleLookup(bootstrapData.userPluginsPath)
|
||||||
|
|
||||||
let plugins = await findPlugins()
|
let plugins = await findPlugins()
|
||||||
|
bootstrapData.installedPlugins = plugins
|
||||||
if (bootstrapData.config.pluginBlacklist) {
|
if (bootstrapData.config.pluginBlacklist) {
|
||||||
plugins = plugins.filter(x => !bootstrapData.config.pluginBlacklist.includes(x.name))
|
plugins = plugins.filter(x => !bootstrapData.config.pluginBlacklist.includes(x.name))
|
||||||
}
|
}
|
||||||
plugins = plugins.filter(x => x.name !== 'web')
|
plugins = plugins.filter(x => x.name !== 'web')
|
||||||
bootstrapData.installedPlugins = plugins
|
|
||||||
|
|
||||||
console.log('Starting with plugins:', plugins)
|
console.log('Starting with plugins:', plugins)
|
||||||
try {
|
try {
|
||||||
await bootstrap(bootstrapData)
|
await bootstrap(bootstrapData, plugins)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Angular bootstrapping error:', error)
|
console.error('Angular bootstrapping error:', error)
|
||||||
console.warn('Trying safe mode')
|
console.warn('Trying safe mode')
|
||||||
window['safeModeReason'] = error
|
window['safeModeReason'] = error
|
||||||
try {
|
try {
|
||||||
await bootstrap(bootstrapData, true)
|
await bootstrap(bootstrapData, plugins, true)
|
||||||
} catch (error2) {
|
} catch (error2) {
|
||||||
console.error('Bootstrap failed:', error2)
|
console.error('Bootstrap failed:', error2)
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
body {
|
body {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: #1D272D;
|
background: transparent !important;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-dialog, .modal-backdrop, .no-drag {
|
.modal-dialog, .modal-backdrop, .no-drag {
|
||||||
@@ -16,19 +17,22 @@ body {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
a, button {
|
||||||
display: inline-flex;
|
&.btn {
|
||||||
align-items: center;
|
display: inline-flex;
|
||||||
flex-wrap: nowrap;
|
align-items: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
|
||||||
& > svg {
|
& > svg {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-line {
|
.form-line {
|
||||||
display: flex;
|
display: flex;
|
||||||
border-top: 1px solid rgba(0, 0, 0, 0.2);
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -115,7 +119,8 @@ ngb-typeahead-window {
|
|||||||
|
|
||||||
.hover-reveal-parent:hover &,
|
.hover-reveal-parent:hover &,
|
||||||
*:hover > &,
|
*:hover > &,
|
||||||
&:hover {
|
&:hover,
|
||||||
|
&.show {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,3 +163,35 @@ ngb-typeahead-window {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-group-item > button {
|
||||||
|
margin: -7px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-box {
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Windows high contrast mode
|
||||||
|
@media screen and (forced-colors: active) {
|
||||||
|
.custom-switch .custom-control-label::before {
|
||||||
|
background: buttonface;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-switch .custom-control-label::after {
|
||||||
|
background: buttontext;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-switch .custom-control-input:checked ~ .custom-control-label::before {
|
||||||
|
background: activetext;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
|
||||||
|
background: canvas;
|
||||||
|
}
|
||||||
|
|
||||||
|
color-scheme-preview, terminaltab > .content {
|
||||||
|
forced-color-adjust: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
7
app/src/pluginBlacklist.ts
Normal file
7
app/src/pluginBlacklist.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export const PLUGIN_BLACKLIST = [
|
||||||
|
'terminus-shell-selector', // superseded by profiles
|
||||||
|
'terminus-scrollbar', // now useless
|
||||||
|
'terminus-clickable-links', // now bundled with Tabby
|
||||||
|
'tabby-clickable-links', // now bundled with Tabby
|
||||||
|
'terminus-clickable-ips', // broken, functionality now bundled with Tabby
|
||||||
|
]
|
@@ -1,7 +1,8 @@
|
|||||||
import * as fs from 'mz/fs'
|
import * as fs from 'mz/fs'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as remote from '@electron/remote'
|
import * as remote from '@electron/remote'
|
||||||
import { PluginInfo } from '../../terminus-core/src/api/mainProcess'
|
import { PluginInfo } from '../../tabby-core/src/api/mainProcess'
|
||||||
|
import { PLUGIN_BLACKLIST } from './pluginBlacklist'
|
||||||
|
|
||||||
const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires
|
const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires
|
||||||
|
|
||||||
@@ -16,70 +17,78 @@ function normalizePath (p: string): string {
|
|||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
const builtinPluginsPath = process.env.TERMINUS_DEV ? path.dirname(remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins')
|
const builtinPluginsPath = process.env.TABBY_DEV ? path.dirname(remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins')
|
||||||
|
|
||||||
|
const cachedBuiltinModules = {
|
||||||
|
'@angular/animations': require('@angular/animations'),
|
||||||
|
'@angular/common': require('@angular/common'),
|
||||||
|
'@angular/compiler': require('@angular/compiler'),
|
||||||
|
'@angular/core': require('@angular/core'),
|
||||||
|
'@angular/forms': require('@angular/forms'),
|
||||||
|
'@angular/platform-browser': require('@angular/platform-browser'),
|
||||||
|
'@angular/platform-browser/animations': require('@angular/platform-browser/animations'),
|
||||||
|
'@angular/platform-browser-dynamic': require('@angular/platform-browser-dynamic'),
|
||||||
|
'@ng-bootstrap/ng-bootstrap': require('@ng-bootstrap/ng-bootstrap'),
|
||||||
|
'ngx-toastr': require('ngx-toastr'),
|
||||||
|
rxjs: require('rxjs'),
|
||||||
|
'rxjs/operators': require('rxjs/operators'),
|
||||||
|
'zone.js/dist/zone.js': require('zone.js/dist/zone.js'),
|
||||||
|
}
|
||||||
|
|
||||||
const builtinModules = [
|
const builtinModules = [
|
||||||
'@angular/animations',
|
...Object.keys(cachedBuiltinModules),
|
||||||
'@angular/common',
|
'tabby-core',
|
||||||
'@angular/compiler',
|
'tabby-local',
|
||||||
'@angular/core',
|
'tabby-settings',
|
||||||
'@angular/forms',
|
'tabby-terminal',
|
||||||
'@angular/platform-browser',
|
|
||||||
'@angular/platform-browser-dynamic',
|
|
||||||
'@ng-bootstrap/ng-bootstrap',
|
|
||||||
'ngx-toastr',
|
|
||||||
'rxjs',
|
|
||||||
'rxjs/operators',
|
|
||||||
'terminus-core',
|
|
||||||
'terminus-local',
|
|
||||||
'terminus-settings',
|
|
||||||
'terminus-terminal',
|
|
||||||
'zone.js/dist/zone.js',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export type ProgressCallback = (current: number, total: number) => void // eslint-disable-line @typescript-eslint/no-type-alias
|
const originalRequire = (global as any).require
|
||||||
|
;(global as any).require = function (query: string) {
|
||||||
|
if (cachedBuiltinModules[query]) {
|
||||||
|
return cachedBuiltinModules[query]
|
||||||
|
}
|
||||||
|
return originalRequire.apply(this, [query])
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalModuleRequire = nodeModule.prototype.require
|
||||||
|
nodeModule.prototype.require = function (query: string) {
|
||||||
|
if (cachedBuiltinModules[query]) {
|
||||||
|
return cachedBuiltinModules[query]
|
||||||
|
}
|
||||||
|
return originalModuleRequire.call(this, query)
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ProgressCallback = (current: number, total: number) => void
|
||||||
|
|
||||||
export function initModuleLookup (userPluginsPath: string): void {
|
export function initModuleLookup (userPluginsPath: string): void {
|
||||||
global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x)))
|
global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x)))
|
||||||
|
|
||||||
if (process.env.TERMINUS_DEV) {
|
nodeModule.globalPaths.unshift(path.join(userPluginsPath, 'node_modules'))
|
||||||
|
|
||||||
|
if (process.env.TABBY_DEV) {
|
||||||
nodeModule.globalPaths.unshift(path.dirname(remote.app.getAppPath()))
|
nodeModule.globalPaths.unshift(path.dirname(remote.app.getAppPath()))
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeModule.globalPaths.unshift(builtinPluginsPath)
|
nodeModule.globalPaths.unshift(builtinPluginsPath)
|
||||||
nodeModule.globalPaths.unshift(path.join(userPluginsPath, 'node_modules'))
|
|
||||||
// nodeModule.globalPaths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules'))
|
// nodeModule.globalPaths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules'))
|
||||||
if (process.env.TERMINUS_PLUGINS) {
|
if (process.env.TABBY_PLUGINS) {
|
||||||
process.env.TERMINUS_PLUGINS.split(':').map(x => nodeModule.globalPaths.push(normalizePath(x)))
|
process.env.TABBY_PLUGINS.split(':').map(x => nodeModule.globalPaths.push(normalizePath(x)))
|
||||||
}
|
}
|
||||||
|
|
||||||
const cachedBuiltinModules = {}
|
|
||||||
builtinModules.forEach(m => {
|
builtinModules.forEach(m => {
|
||||||
cachedBuiltinModules[m] = nodeRequire(m)
|
if (!cachedBuiltinModules[m]) {
|
||||||
|
cachedBuiltinModules[m] = nodeRequire(m)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const originalRequire = (global as any).require
|
|
||||||
;(global as any).require = function (query: string) {
|
|
||||||
if (cachedBuiltinModules[query]) {
|
|
||||||
return cachedBuiltinModules[query]
|
|
||||||
}
|
|
||||||
return originalRequire.apply(this, [query])
|
|
||||||
}
|
|
||||||
|
|
||||||
const originalModuleRequire = nodeModule.prototype.require
|
|
||||||
nodeModule.prototype.require = function (query: string) {
|
|
||||||
if (cachedBuiltinModules[query]) {
|
|
||||||
return cachedBuiltinModules[query]
|
|
||||||
}
|
|
||||||
return originalModuleRequire.call(this, query)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findPlugins (): Promise<PluginInfo[]> {
|
export async function findPlugins (): Promise<PluginInfo[]> {
|
||||||
const paths = nodeModule.globalPaths
|
const paths = nodeModule.globalPaths
|
||||||
let foundPlugins: PluginInfo[] = []
|
let foundPlugins: PluginInfo[] = []
|
||||||
const candidateLocations: { pluginDir: string, packageName: string }[] = []
|
const candidateLocations: { pluginDir: string, packageName: string }[] = []
|
||||||
const PREFIX = 'terminus-'
|
const PREFIX = 'tabby-'
|
||||||
|
const LEGACY_PREFIX = 'terminus-'
|
||||||
|
|
||||||
const processedPaths = []
|
const processedPaths = []
|
||||||
|
|
||||||
@@ -101,7 +110,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
for (const packageName of pluginNames) {
|
for (const packageName of pluginNames) {
|
||||||
if (packageName.startsWith(PREFIX)) {
|
if ((packageName.startsWith(PREFIX) || packageName.startsWith(LEGACY_PREFIX)) && !PLUGIN_BLACKLIST.includes(packageName)) {
|
||||||
candidateLocations.push({ pluginDir, packageName })
|
candidateLocations.push({ pluginDir, packageName })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,7 +123,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = packageName.substring(PREFIX.length)
|
const name = packageName.startsWith(PREFIX) ? packageName.substring(PREFIX.length) : packageName.substring(LEGACY_PREFIX.length)
|
||||||
|
|
||||||
if (builtinModules.includes(packageName) && pluginDir !== builtinPluginsPath) {
|
if (builtinModules.includes(packageName) && pluginDir !== builtinPluginsPath) {
|
||||||
continue
|
continue
|
||||||
@@ -122,14 +131,20 @@ export async function findPlugins (): Promise<PluginInfo[]> {
|
|||||||
|
|
||||||
console.log(`Found ${name} in ${pluginDir}`)
|
console.log(`Found ${name} in ${pluginDir}`)
|
||||||
|
|
||||||
if (foundPlugins.some(x => x.name === name)) {
|
const existing = foundPlugins.find(x => x.name === name)
|
||||||
console.info(`Plugin ${packageName} already exists, overriding`)
|
if (existing) {
|
||||||
foundPlugins = foundPlugins.filter(x => x.name !== name)
|
if (existing.isLegacy) {
|
||||||
|
console.info(`Plugin ${packageName} already exists, overriding`)
|
||||||
|
foundPlugins = foundPlugins.filter(x => x.name !== name)
|
||||||
|
} else {
|
||||||
|
console.info(`Plugin ${packageName} already exists, skipping`)
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const info = JSON.parse(await fs.readFile(infoPath, { encoding: 'utf-8' }))
|
const info = JSON.parse(await fs.readFile(infoPath, { encoding: 'utf-8' }))
|
||||||
if (!info.keywords || !(info.keywords.includes('terminus-plugin') || info.keywords.includes('terminus-builtin-plugin'))) {
|
if (!info.keywords || !(info.keywords.includes('terminus-plugin') || info.keywords.includes('terminus-builtin-plugin') || info.keywords.includes('tabby-plugin') || info.keywords.includes('tabby-builtin-plugin'))) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
let author = info.author
|
let author = info.author
|
||||||
@@ -138,6 +153,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
|
|||||||
name: name,
|
name: name,
|
||||||
packageName: packageName,
|
packageName: packageName,
|
||||||
isBuiltin: pluginDir === builtinPluginsPath,
|
isBuiltin: pluginDir === builtinPluginsPath,
|
||||||
|
isLegacy: info.keywords.includes('terminus-plugin') || info.keywords.includes('terminus-builtin-plugin'),
|
||||||
version: info.version,
|
version: info.version,
|
||||||
description: info.description,
|
description: info.description,
|
||||||
author,
|
author,
|
||||||
@@ -150,6 +166,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
foundPlugins.sort((a, b) => a.name > b.name ? 1 : -1)
|
foundPlugins.sort((a, b) => a.name > b.name ? 1 : -1)
|
||||||
|
foundPlugins.sort((a, b) => a.isBuiltin < b.isBuiltin ? 1 : -1)
|
||||||
return foundPlugins
|
return foundPlugins
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,6 +179,9 @@ export async function loadPlugins (foundPlugins: PluginInfo[], progress: Progres
|
|||||||
progress(index, foundPlugins.length)
|
progress(index, foundPlugins.length)
|
||||||
try {
|
try {
|
||||||
const packageModule = nodeRequire(foundPlugin.path)
|
const packageModule = nodeRequire(foundPlugin.path)
|
||||||
|
if (foundPlugin.packageName.startsWith('tabby-')) {
|
||||||
|
cachedBuiltinModules[foundPlugin.packageName.replace('tabby-', 'terminus-')] = packageModule
|
||||||
|
}
|
||||||
const pluginModule = packageModule.default.forRoot ? packageModule.default.forRoot() : packageModule.default
|
const pluginModule = packageModule.default.forRoot ? packageModule.default.forRoot() : packageModule.default
|
||||||
pluginModule.pluginName = foundPlugin.name
|
pluginModule.pluginName = foundPlugin.name
|
||||||
pluginModule.bootstrap = packageModule.bootstrap
|
pluginModule.bootstrap = packageModule.bootstrap
|
||||||
|
@@ -1,3 +1,7 @@
|
|||||||
|
app-root {
|
||||||
|
background: #1D272D;
|
||||||
|
}
|
||||||
|
|
||||||
.preload-logo {
|
.preload-logo {
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@@ -7,7 +11,8 @@
|
|||||||
height: 100vh;
|
height: 100vh;
|
||||||
display: flex;
|
display: flex;
|
||||||
animation: 0.5s ease-out fadeIn;
|
animation: 0.5s ease-out fadeIn;
|
||||||
background: radial-gradient(#3a66820a 0%, #000e17 30%, black 100%);
|
background-image: radial-gradient(#3a66820a 0%, #000e17 30%, black 100%);
|
||||||
|
background-color: black;
|
||||||
|
|
||||||
&>div {
|
&>div {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
@@ -38,7 +43,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
.terminus-logo {
|
.tabby-logo {
|
||||||
width: 120px;
|
width: 120px;
|
||||||
height: 120px;
|
height: 120px;
|
||||||
background: url('../assets/logo.svg');
|
background: url('../assets/logo.svg');
|
||||||
@@ -48,7 +53,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.terminus-title {
|
.tabby-title {
|
||||||
color: #a1c5e4;
|
color: #a1c5e4;
|
||||||
font-family: 'Source Sans Pro';
|
font-family: 'Source Sans Pro';
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
"declaration": false,
|
"declaration": false,
|
||||||
"noImplicitAny": false,
|
"noImplicitAny": false,
|
||||||
"removeComments": false,
|
"removeComments": false,
|
||||||
|
"esModuleInterop": true,
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
@@ -27,7 +28,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"*/node_modules",
|
"*/node_modules",
|
||||||
"terminus*",
|
"tabby*",
|
||||||
"platforms"
|
"platforms"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -3,11 +3,13 @@
|
|||||||
"baseUrl": "./lib",
|
"baseUrl": "./lib",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"target": "es2017",
|
"target": "es2017",
|
||||||
|
"moduleResolution": "node",
|
||||||
"declaration": false,
|
"declaration": false,
|
||||||
"noImplicitAny": false,
|
"noImplicitAny": false,
|
||||||
"removeComments": false,
|
"removeComments": false,
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"noUnusedParameters": true,
|
"noUnusedParameters": true,
|
||||||
"noImplicitReturns": true,
|
"noImplicitReturns": true,
|
||||||
|
@@ -2,7 +2,7 @@ const path = require('path')
|
|||||||
const webpack = require('webpack')
|
const webpack = require('webpack')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
name: 'terminus',
|
name: 'tabby',
|
||||||
target: 'node',
|
target: 'node',
|
||||||
entry: {
|
entry: {
|
||||||
'index.ignore': 'file-loader?name=index.html!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
|
'index.ignore': 'file-loader?name=index.html!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
|
||||||
@@ -10,7 +10,7 @@ module.exports = {
|
|||||||
preload: path.resolve(__dirname, 'src/entry.preload.ts'),
|
preload: path.resolve(__dirname, 'src/entry.preload.ts'),
|
||||||
bundle: path.resolve(__dirname, 'src/entry.ts'),
|
bundle: path.resolve(__dirname, 'src/entry.ts'),
|
||||||
},
|
},
|
||||||
mode: process.env.TERMINUS_DEV ? 'development' : 'production',
|
mode: process.env.TABBY_DEV ? 'development' : 'production',
|
||||||
optimization:{
|
optimization:{
|
||||||
minimize: false,
|
minimize: false,
|
||||||
},
|
},
|
||||||
@@ -31,52 +31,29 @@ module.exports = {
|
|||||||
{
|
{
|
||||||
test: /\.ts$/,
|
test: /\.ts$/,
|
||||||
use: {
|
use: {
|
||||||
loader: 'awesome-typescript-loader',
|
loader: 'ts-loader',
|
||||||
options: {
|
options: {
|
||||||
configFileName: path.resolve(__dirname, 'tsconfig.json'),
|
configFile: path.resolve(__dirname, 'tsconfig.json'),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
||||||
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
|
||||||
{
|
{
|
||||||
test: /\.(png|svg)$/,
|
test: /\.(png|svg|ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||||||
use: {
|
type: 'asset',
|
||||||
loader: 'url-loader',
|
|
||||||
options: {
|
|
||||||
limit: 999999,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /\.(ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
|
||||||
use: {
|
|
||||||
loader: 'file-loader',
|
|
||||||
options: {
|
|
||||||
name: 'fonts/[name].[ext]',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
externals: {
|
externals: {
|
||||||
'@angular/core': 'commonjs @angular/core',
|
|
||||||
'@angular/compiler': 'commonjs @angular/compiler',
|
|
||||||
'@angular/platform-browser': 'commonjs @angular/platform-browser',
|
|
||||||
'@angular/platform-browser-dynamic': 'commonjs @angular/platform-browser-dynamic',
|
|
||||||
'@angular/forms': 'commonjs @angular/forms',
|
|
||||||
'@angular/common': 'commonjs @angular/common',
|
|
||||||
'@ng-bootstrap/ng-bootstrap': 'commonjs @ng-bootstrap/ng-bootstrap',
|
|
||||||
'@electron/remote': 'commonjs @electron/remote',
|
'@electron/remote': 'commonjs @electron/remote',
|
||||||
|
'v8-compile-cache': 'commonjs v8-compile-cache',
|
||||||
child_process: 'commonjs child_process',
|
child_process: 'commonjs child_process',
|
||||||
electron: 'commonjs electron',
|
electron: 'commonjs electron',
|
||||||
fs: 'commonjs fs',
|
fs: 'commonjs fs',
|
||||||
'ngx-toastr': 'commonjs ngx-toastr',
|
|
||||||
module: 'commonjs module',
|
module: 'commonjs module',
|
||||||
mz: 'commonjs mz',
|
mz: 'commonjs mz',
|
||||||
path: 'commonjs path',
|
path: 'commonjs path',
|
||||||
rxjs: 'commonjs rxjs',
|
|
||||||
'zone.js': 'commonjs zone.js/dist/zone.js',
|
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new webpack.optimize.ModuleConcatenationPlugin(),
|
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||||
|
@@ -3,64 +3,63 @@ const webpack = require('webpack')
|
|||||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
name: 'terminus-main',
|
name: 'tabby-main',
|
||||||
target: 'electron-main',
|
target: 'electron-main',
|
||||||
entry: {
|
entry: {
|
||||||
main: path.resolve(__dirname, 'lib/index.ts'),
|
main: path.resolve(__dirname, 'lib/index.ts'),
|
||||||
},
|
},
|
||||||
mode: process.env.TERMINUS_DEV ? 'development' : 'production',
|
mode: process.env.TABBY_DEV ? 'development' : 'production',
|
||||||
context: __dirname,
|
context: __dirname,
|
||||||
devtool: 'source-map',
|
devtool: 'source-map',
|
||||||
output: {
|
output: {
|
||||||
path: path.join(__dirname, 'dist'),
|
path: path.join(__dirname, 'dist'),
|
||||||
pathinfo: true,
|
pathinfo: true,
|
||||||
filename: '[name].js',
|
filename: '[name].js',
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
modules: ['lib/', 'node_modules', '../node_modules'].map(x => path.join(__dirname, x)),
|
modules: ['lib/', 'node_modules', '../node_modules'].map(x => path.join(__dirname, x)),
|
||||||
extensions: ['.ts', '.js'],
|
extensions: ['.ts', '.js'],
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
test: /\.ts$/,
|
test: /\.ts$/,
|
||||||
use: {
|
use: {
|
||||||
loader: 'awesome-typescript-loader',
|
loader: 'ts-loader',
|
||||||
options: {
|
options: {
|
||||||
configFileName: path.resolve(__dirname, 'tsconfig.main.json'),
|
configFile: path.resolve(__dirname, 'tsconfig.main.json'),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
externals: {
|
||||||
|
'v8-compile-cache': 'commonjs v8-compile-cache',
|
||||||
|
'any-promise': 'commonjs any-promise',
|
||||||
|
electron: 'commonjs electron',
|
||||||
|
'electron-config': 'commonjs electron-config',
|
||||||
|
'electron-debug': 'commonjs electron-debug',
|
||||||
|
'electron-promise-ipc': 'commonjs electron-promise-ipc',
|
||||||
|
fs: 'commonjs fs',
|
||||||
|
glasstron: 'commonjs glasstron',
|
||||||
|
mz: 'commonjs mz',
|
||||||
|
npm: 'commonjs npm',
|
||||||
|
'node:os': 'commonjs os',
|
||||||
|
'@tabby-gang/node-pty': 'commonjs @tabby-gang/node-pty',
|
||||||
|
path: 'commonjs path',
|
||||||
|
util: 'commonjs util',
|
||||||
|
'source-map-support': 'commonjs source-map-support',
|
||||||
|
'windows-swca': 'commonjs windows-swca',
|
||||||
|
'windows-native-registry': 'commonjs windows-native-registry',
|
||||||
|
'@tabby-gang/windows-blurbehind': 'commonjs @tabby-gang/windows-blurbehind',
|
||||||
|
'yargs/yargs': 'commonjs yargs/yargs',
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.type': '"main"',
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
},
|
|
||||||
externals: {
|
|
||||||
'any-promise': 'commonjs any-promise',
|
|
||||||
electron: 'commonjs electron',
|
|
||||||
'electron-config': 'commonjs electron-config',
|
|
||||||
'electron-debug': 'commonjs electron-debug',
|
|
||||||
'electron-promise-ipc': 'commonjs electron-promise-ipc',
|
|
||||||
'electron-vibrancy': 'commonjs electron-vibrancy',
|
|
||||||
fs: 'commonjs fs',
|
|
||||||
glasstron: 'commonjs glasstron',
|
|
||||||
mz: 'commonjs mz',
|
|
||||||
npm: 'commonjs npm',
|
|
||||||
'@terminus-term/node-pty': 'commonjs @terminus-term/node-pty',
|
|
||||||
path: 'commonjs path',
|
|
||||||
rxjs: 'commonjs rxjs',
|
|
||||||
'rxjs/operators': 'commonjs rxjs/operators',
|
|
||||||
util: 'commonjs util',
|
|
||||||
'source-map-support': 'commonjs source-map-support',
|
|
||||||
'windows-swca': 'commonjs windows-swca',
|
|
||||||
'windows-native-registry': 'commonjs windows-native-registry',
|
|
||||||
'windows-blurbehind': 'commonjs windows-blurbehind',
|
|
||||||
'yargs/yargs': 'commonjs yargs/yargs',
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
new webpack.optimize.ModuleConcatenationPlugin(),
|
|
||||||
new webpack.DefinePlugin({
|
|
||||||
'process.type': '"main"',
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.BUNDLE_ANALYZER) {
|
if (process.env.BUNDLE_ANALYZER) {
|
||||||
|
737
app/yarn.lock
737
app/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,3 @@
|
|||||||
!macro customInit
|
!macro customInit
|
||||||
nsExec::Exec '"$LOCALAPPDATA\terminus\Update.exe" --uninstall -s'
|
nsExec::Exec '"$LOCALAPPDATA\tabby\Update.exe" --uninstall -s'
|
||||||
!macroend
|
!macroend
|
||||||
|
@@ -11,7 +11,7 @@ module.exports = async function (params) {
|
|||||||
}
|
}
|
||||||
console.log('afterSign hook triggered', params)
|
console.log('afterSign hook triggered', params)
|
||||||
|
|
||||||
let appId = 'org.terminus'
|
let appId = 'org.tabby'
|
||||||
|
|
||||||
let appPath = path.join(params.appOutDir, params._pathOverride || `${params.packager.appInfo.productFilename}.app`)
|
let appPath = path.join(params.appOutDir, params._pathOverride || `${params.packager.appInfo.productFilename}.app`)
|
||||||
if (!fs.existsSync(appPath)) {
|
if (!fs.existsSync(appPath)) {
|
||||||
|
BIN
docs/readme.png
BIN
docs/readme.png
Binary file not shown.
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.6 MiB |
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
appId: org.terminus
|
appId: org.tabby
|
||||||
productName: Terminus
|
productName: Tabby
|
||||||
compression: normal
|
compression: normal
|
||||||
npmRebuild: false
|
npmRebuild: false
|
||||||
afterSign: "./build/mac/afterSignHook.js"
|
afterSign: "./build/mac/afterSignHook.js"
|
||||||
@@ -33,24 +33,24 @@ extraResources:
|
|||||||
- builtin-plugins
|
- builtin-plugins
|
||||||
- extras
|
- extras
|
||||||
asarUnpack:
|
asarUnpack:
|
||||||
- dist/*.map
|
- 'dist/*.map'
|
||||||
publish:
|
publish:
|
||||||
- provider: github
|
- provider: github
|
||||||
|
|
||||||
win:
|
win:
|
||||||
icon: "./build/windows/icon.ico"
|
icon: "./build/windows/icon.ico"
|
||||||
artifactName: terminus-${version}-portable.${ext}
|
artifactName: tabby-${version}-portable.${ext}
|
||||||
rfc3161TimeStampServer: http://sha256timestamp.ws.symantec.com/sha256/timestamp
|
rfc3161TimeStampServer: http://timestamp.sectigo.com
|
||||||
nsis:
|
nsis:
|
||||||
oneClick: false
|
oneClick: false
|
||||||
artifactName: terminus-${version}-setup.${ext}
|
artifactName: tabby-${version}-setup.${ext}
|
||||||
installerIcon: "./build/windows/icon.ico"
|
installerIcon: "./build/windows/icon.ico"
|
||||||
allowToChangeInstallationDirectory: true
|
allowToChangeInstallationDirectory: true
|
||||||
|
shortcutName: Tabby Terminal
|
||||||
mac:
|
mac:
|
||||||
category: public.app-category.video
|
category: public.app-category.video
|
||||||
icon: "./build/mac/icon.icns"
|
icon: "./build/mac/icon.icns"
|
||||||
artifactName: terminus-${version}-macos-${env.ARCH}.${ext}
|
artifactName: tabby-${version}-macos-${env.ARCH}.${ext}
|
||||||
hardenedRuntime: true
|
hardenedRuntime: true
|
||||||
entitlements: "./build/mac/entitlements.plist"
|
entitlements: "./build/mac/entitlements.plist"
|
||||||
entitlementsInherit: "./build/mac/entitlements.plist"
|
entitlementsInherit: "./build/mac/entitlements.plist"
|
||||||
@@ -66,13 +66,13 @@ mac:
|
|||||||
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
|
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
|
||||||
|
|
||||||
linux:
|
linux:
|
||||||
category: Utility
|
category: "Utility;TerminalEmulator;System"
|
||||||
icon: "./build/icons"
|
icon: "./build/icons"
|
||||||
artifactName: terminus-${version}-linux.${ext}
|
artifactName: tabby-${version}-linux.${ext}
|
||||||
executableArgs:
|
executableArgs:
|
||||||
- "--no-sandbox"
|
- "--no-sandbox"
|
||||||
desktop:
|
desktop:
|
||||||
StartupWMClass: terminus
|
StartupWMClass: tabby
|
||||||
snap:
|
snap:
|
||||||
plugs:
|
plugs:
|
||||||
- default
|
- default
|
||||||
@@ -85,13 +85,12 @@ deb:
|
|||||||
- gnome-keyring
|
- gnome-keyring
|
||||||
- libnotify4
|
- libnotify4
|
||||||
- libsecret-1-0
|
- libsecret-1-0
|
||||||
- libappindicator1
|
|
||||||
- libxtst6
|
- libxtst6
|
||||||
- libnss3
|
- libnss3
|
||||||
afterInstall: build/linux/after-install.tpl
|
afterInstall: build/linux/after-install.tpl
|
||||||
fpm:
|
fpm:
|
||||||
- '--replaces'
|
- '--replaces'
|
||||||
- 'terminus'
|
- 'terminus-terminal'
|
||||||
pacman:
|
pacman:
|
||||||
depends:
|
depends:
|
||||||
- gnome-keyring
|
- gnome-keyring
|
||||||
@@ -103,4 +102,4 @@ rpm:
|
|||||||
- '--rpm-rpmbuild-define'
|
- '--rpm-rpmbuild-define'
|
||||||
- '_build_id_links none'
|
- '_build_id_links none'
|
||||||
- '--replaces'
|
- '--replaces'
|
||||||
- 'terminus'
|
- 'terminus-terminal'
|
||||||
|
BIN
extras/UAC.exe
BIN
extras/UAC.exe
Binary file not shown.
@@ -12,7 +12,7 @@
|
|||||||
<key>NSMenuItem</key>
|
<key>NSMenuItem</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<string>Open Terminus here</string>
|
<string>Open Tabby here</string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSMessage</key>
|
<key>NSMessage</key>
|
||||||
<string>runWorkflowAsService</string>
|
<string>runWorkflowAsService</string>
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
@@ -59,7 +59,7 @@
|
|||||||
<key>ActionParameters</key>
|
<key>ActionParameters</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>COMMAND_STRING</key>
|
<key>COMMAND_STRING</key>
|
||||||
<string>/Applications/Terminus.app/Contents/MacOS/terminus open "$1"</string>
|
<string>/Applications/Tabby.app/Contents/MacOS/tabby open "$1"</string>
|
||||||
<key>CheckedForUserDefaultShell</key>
|
<key>CheckedForUserDefaultShell</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>inputMethod</key>
|
<key>inputMethod</key>
|
@@ -12,7 +12,7 @@
|
|||||||
<key>NSMenuItem</key>
|
<key>NSMenuItem</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<string>Paste path into Terminus</string>
|
<string>Paste path into Tabby</string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSMessage</key>
|
<key>NSMessage</key>
|
||||||
<string>runWorkflowAsService</string>
|
<string>runWorkflowAsService</string>
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
@@ -59,7 +59,7 @@
|
|||||||
<key>ActionParameters</key>
|
<key>ActionParameters</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>COMMAND_STRING</key>
|
<key>COMMAND_STRING</key>
|
||||||
<string>/Applications/Terminus.app/Contents/MacOS/terminus paste --escape "$1"</string>
|
<string>/Applications/Tabby.app/Contents/MacOS/tabby paste --escape "$1"</string>
|
||||||
<key>CheckedForUserDefaultShell</key>
|
<key>CheckedForUserDefaultShell</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>inputMethod</key>
|
<key>inputMethod</key>
|
File diff suppressed because it is too large
Load Diff
10
firebase.json
Normal file
10
firebase.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"hosting": {
|
||||||
|
"public": "docs/api",
|
||||||
|
"ignore": [
|
||||||
|
"firebase.json",
|
||||||
|
"**/.*",
|
||||||
|
"**/node_modules/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
3
locale/STOP.txt
Normal file
3
locale/STOP.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Do not submit pull requests for translations.
|
||||||
|
|
||||||
|
Translations are managed at https://crowdin.com/project/tabby
|
1490
locale/app.pot
Normal file
1490
locale/app.pot
Normal file
File diff suppressed because it is too large
Load Diff
1462
locale/de-DE.po
Normal file
1462
locale/de-DE.po
Normal file
File diff suppressed because it is too large
Load Diff
1489
locale/es-ES.po
Normal file
1489
locale/es-ES.po
Normal file
File diff suppressed because it is too large
Load Diff
1489
locale/fr-FR.po
Normal file
1489
locale/fr-FR.po
Normal file
File diff suppressed because it is too large
Load Diff
1462
locale/hr-HR.po
Normal file
1462
locale/hr-HR.po
Normal file
File diff suppressed because it is too large
Load Diff
1462
locale/pl-PL.po
Normal file
1462
locale/pl-PL.po
Normal file
File diff suppressed because it is too large
Load Diff
1462
locale/ru-RU.po
Normal file
1462
locale/ru-RU.po
Normal file
File diff suppressed because it is too large
Load Diff
1489
locale/zh-CN.po
Normal file
1489
locale/zh-CN.po
Normal file
File diff suppressed because it is too large
Load Diff
1489
locale/zh-TW.po
Normal file
1489
locale/zh-TW.po
Normal file
File diff suppressed because it is too large
Load Diff
122
package.json
122
package.json
@@ -1,80 +1,108 @@
|
|||||||
{
|
{
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@fortawesome/fontawesome-free": "^5.15.3",
|
"@angular/animations": "^12.0.0",
|
||||||
"@sentry/cli": "^1.64.2",
|
"@angular/common": "^12.0.0",
|
||||||
"@sentry/electron": "^2.4.1",
|
"@angular/compiler": "^12.0.0",
|
||||||
"@terminus-term/to-string-loader": "1.1.7-beta.1",
|
"@angular/core": "^12.0.0",
|
||||||
|
"@angular/forms": "^12.0.0",
|
||||||
|
"@angular/platform-browser": "^12.0.0",
|
||||||
|
"@angular/platform-browser-dynamic": "^12.0.0",
|
||||||
|
"@biesbjerg/ngx-translate-extract": "^7.0.4",
|
||||||
|
"@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
|
||||||
|
"@fortawesome/fontawesome-free": "^6.0.0-beta3",
|
||||||
|
"@ng-bootstrap/ng-bootstrap": "^10.0.0",
|
||||||
|
"@sentry/cli": "^1.71.0",
|
||||||
|
"@sentry/electron": "^2.5.4",
|
||||||
|
"@tabby-gang/to-string-loader": "^1.1.7-beta.2",
|
||||||
|
"@types/deep-equal": "1.0.1",
|
||||||
"@types/electron-config": "^3.2.2",
|
"@types/electron-config": "^3.2.2",
|
||||||
"@types/electron-debug": "^2.1.0",
|
"@types/electron-debug": "^2.1.0",
|
||||||
"@types/fs-extra": "^9.0.11",
|
"@types/fs-extra": "^9.0.12",
|
||||||
"@types/js-yaml": "^4.0.1",
|
"@types/js-yaml": "^4.0.5",
|
||||||
"@types/node": "15.6.1",
|
"@types/node": "16.0.1",
|
||||||
"@types/webpack-env": "^1.16.0",
|
"@types/sortablejs": "^1.10.7",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
"@types/webpack-env": "^1.16.3",
|
||||||
"@typescript-eslint/parser": "^4.26.0",
|
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||||
|
"@typescript-eslint/parser": "^4.33.0",
|
||||||
"apply-loader": "2.0.0",
|
"apply-loader": "2.0.0",
|
||||||
"awesome-typescript-loader": "^5.2.1",
|
"axios": "^0.21.2",
|
||||||
"compare-versions": "^3.6.0",
|
"browserify-sign": "^4.2.1",
|
||||||
"core-js": "^3.14.0",
|
"clone-deep": "^4.0.1",
|
||||||
|
"compare-versions": "^4",
|
||||||
|
"core-js": "^3.18.2",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"css-loader": "5.2.6",
|
"css-loader": "^6.5.1",
|
||||||
"electron": "13.1.1",
|
"deep-equal": "2.0.5",
|
||||||
"electron-builder": "22.10.5",
|
"electron": "16.0.8",
|
||||||
|
"electron-builder": "^22.14.5",
|
||||||
"electron-download": "^4.1.1",
|
"electron-download": "^4.1.1",
|
||||||
"electron-installer-snap": "^5.1.0",
|
"electron-installer-snap": "^5.1.0",
|
||||||
"electron-notarize": "^1.0.0",
|
"electron-notarize": "^1.1.1",
|
||||||
"electron-rebuild": "^2.3.5",
|
"electron-rebuild": "^3.2.7",
|
||||||
"eslint": "^7.27.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-plugin-import": "^2.23.4",
|
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"graceful-fs": "^4.2.6",
|
"graceful-fs": "^4.2.9",
|
||||||
"html-loader": "2.1.2",
|
"html-loader": "2.1.2",
|
||||||
"json-loader": "0.5.7",
|
"json-loader": "^0.5.7",
|
||||||
"lru-cache": "^6.0.0",
|
"lru-cache": "^6.0.0",
|
||||||
"macos-release": "^2.4.1",
|
"macos-release": "^3.0.1",
|
||||||
"node-abi": "^2.30.0",
|
"ngx-sortablejs": "^11.1.0",
|
||||||
"node-sass": "^6.0.0",
|
"ngx-toastr": "^14.0.0",
|
||||||
"npmlog": "4.1.2",
|
"node-abi": "^3.2.0",
|
||||||
|
"node-sass": "^7.0.1",
|
||||||
|
"npmlog": "6.0.0",
|
||||||
"npx": "^10.2.2",
|
"npx": "^10.2.2",
|
||||||
"patch-package": "^6.4.7",
|
"patch-package": "^6.4.7",
|
||||||
"pug": "^3.0.2",
|
"po-gettext-loader": "^1.0.0",
|
||||||
|
"pug": "3",
|
||||||
|
"pug-cli": "^1.0.0-alpha6",
|
||||||
"pug-html-loader": "1.1.5",
|
"pug-html-loader": "1.1.5",
|
||||||
"pug-lint": "^2.6.0",
|
"pug-lint": "^2.6.0",
|
||||||
"pug-loader": "^2.4.0",
|
"pug-loader": "^2.4.0",
|
||||||
"pug-static-loader": "2.0.0",
|
"pug-static-loader": "2.0.0",
|
||||||
"raw-loader": "4.0.2",
|
"raw-loader": "4.0.2",
|
||||||
"sass-loader": "^12.0.0",
|
"sass-loader": "^12.4.0",
|
||||||
"shelljs": "0.8.4",
|
"shell-quote": "^1.7.3",
|
||||||
|
"shelljs": "0.8.5",
|
||||||
|
"slugify": "^1.6.5",
|
||||||
|
"sortablejs": "^1.14.0",
|
||||||
"source-code-pro": "^2.38.0",
|
"source-code-pro": "^2.38.0",
|
||||||
|
"source-map-loader": "^3.0.1",
|
||||||
"source-sans-pro": "3.6.0",
|
"source-sans-pro": "3.6.0",
|
||||||
"style-loader": "^2.0.0",
|
"ssh2": "^1.5.0",
|
||||||
|
"style-loader": "^3.2.1",
|
||||||
"svg-inline-loader": "^0.8.2",
|
"svg-inline-loader": "^0.8.2",
|
||||||
"tslib": "^2.2.0",
|
"ts-loader": "^9.2.3",
|
||||||
"typedoc": "^0.20.36",
|
"tslib": "^2.3.1",
|
||||||
"typescript": "^4.2.4",
|
"typedoc": "^0.22.10",
|
||||||
"url-loader": "^4.1.1",
|
"typescript": "^4.3.5",
|
||||||
|
"utils-decorators": "^1.10.4",
|
||||||
"val-loader": "4.0.0",
|
"val-loader": "4.0.0",
|
||||||
"webpack": "^5.38.1",
|
"webpack": "^5.67.0",
|
||||||
"webpack-bundle-analyzer": "^4.4.2",
|
"webpack-bundle-analyzer": "^4.5.0",
|
||||||
"webpack-cli": "^4.7.0",
|
"webpack-cli": "^4.9.2",
|
||||||
"yaml-loader": "0.6.0"
|
"yaml-loader": "0.6.0",
|
||||||
|
"zone.js": "^0.11.4"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"*/node-abi": "^2.30.0",
|
"*/pug": "^3",
|
||||||
|
"lzma-native": "^8.0.0",
|
||||||
|
"*/node-abi": "^3.5.0",
|
||||||
"**/graceful-fs": "^4.2.4"
|
"**/graceful-fs": "^4.2.4"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-local/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js && webpack --color --config terminus-serial/webpack.config.js && webpack --color --config terminus-electron/webpack.config.js && webpack --color --config terminus-web/webpack.config.js",
|
"build": "npm run build:typings && node scripts/build-modules.js",
|
||||||
"build:web": "webpack --color --config web/webpack.config.js",
|
|
||||||
"build:typings": "node scripts/build-typings.js",
|
"build:typings": "node scripts/build-typings.js",
|
||||||
"watch": "cross-env TERMINUS_DEV=1 webpack --progress --color --watch",
|
"watch": "cross-env TABBY_DEV=1 webpack --progress --color --watch",
|
||||||
"start": "cross-env TERMINUS_DEV=1 electron app --debug --inspect",
|
"start": "cross-env TABBY_DEV=1 electron app --debug --inspect",
|
||||||
"start:prod": "electron app --debug",
|
"start:prod": "electron app --debug",
|
||||||
"prod": "cross-env TERMINUS_DEV=1 electron app",
|
"prod": "cross-env TABBY_DEV=1 electron app",
|
||||||
"docs": "typedoc --out docs/api --tsconfig terminus-core/src/tsconfig.typings.json terminus-core/src/index.ts && typedoc --out docs/api/terminal --tsconfig terminus-terminal/tsconfig.typings.json terminus-terminal/src/index.ts && typedoc --out docs/api/local --tsconfig terminus-local/tsconfig.typings.json terminus-local/src/index.ts && typedoc --out docs/api/settings --tsconfig terminus-settings/tsconfig.typings.json terminus-settings/src/index.ts",
|
"docs": "node scripts/build-docs.js",
|
||||||
"lint": "eslint --ext ts */src */lib",
|
"lint": "eslint --ext ts */src */lib",
|
||||||
"postinstall": "node ./scripts/install-deps.js",
|
"postinstall": "patch-package && node ./scripts/install-deps.js",
|
||||||
"patch": "patch-package; cd web; patch-package"
|
"i18n:pull": "crowdin pull --skip-untranslated-strings",
|
||||||
|
"i18n:extract": "node scripts/i18n-extract.js",
|
||||||
|
"i18n:push": "crowdin push"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
|
|
||||||
index 25a159e..d8a0262 100644
|
|
||||||
--- a/node_modules/app-builder-lib/out/appInfo.js
|
|
||||||
+++ b/node_modules/app-builder-lib/out/appInfo.js
|
|
||||||
@@ -165,7 +165,7 @@ class AppInfo {
|
|
||||||
get linuxPackageName() {
|
|
||||||
const name = this.name; // https://github.com/electron-userland/electron-builder/issues/2963
|
|
||||||
|
|
||||||
- return name.startsWith("@") ? this.sanitizedProductName : name;
|
|
||||||
+ return 'terminus-terminal'
|
|
||||||
}
|
|
||||||
|
|
||||||
get sanitizedName() {
|
|
15
patches/app-builder-lib+22.14.5.patch
Normal file
15
patches/app-builder-lib+22.14.5.patch
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
|
||||||
|
index 363f32c..a0434a9 100644
|
||||||
|
--- a/node_modules/app-builder-lib/out/appInfo.js
|
||||||
|
+++ b/node_modules/app-builder-lib/out/appInfo.js
|
||||||
|
@@ -100,9 +100,7 @@ class AppInfo {
|
||||||
|
return this.info.metadata.name;
|
||||||
|
}
|
||||||
|
get linuxPackageName() {
|
||||||
|
- const name = this.name;
|
||||||
|
- // https://github.com/electron-userland/electron-builder/issues/2963
|
||||||
|
- return name.startsWith("@") ? this.sanitizedProductName : name;
|
||||||
|
+ return 'tabby-terminal'
|
||||||
|
}
|
||||||
|
get sanitizedName() {
|
||||||
|
return filename_1.sanitizeFileName(this.name);
|
39
patches/ssh2+1.5.0.patch
Normal file
39
patches/ssh2+1.5.0.patch
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
diff --git a/node_modules/ssh2/lib/protocol/keyParser.js b/node_modules/ssh2/lib/protocol/keyParser.js
|
||||||
|
index 9860e3f..ee82e51 100644
|
||||||
|
--- a/node_modules/ssh2/lib/protocol/keyParser.js
|
||||||
|
+++ b/node_modules/ssh2/lib/protocol/keyParser.js
|
||||||
|
@@ -15,6 +15,7 @@ const {
|
||||||
|
sign: sign_,
|
||||||
|
verify: verify_,
|
||||||
|
} = require('crypto');
|
||||||
|
+const { createVerify: createVerifyDSS } = require('browserify-sign')
|
||||||
|
const supportedOpenSSLCiphers = getCiphers();
|
||||||
|
|
||||||
|
const { Ber } = require('asn1');
|
||||||
|
@@ -404,6 +405,17 @@ const BaseKey = {
|
||||||
|
return new Error('No public key available');
|
||||||
|
if (!algo || typeof algo !== 'string')
|
||||||
|
algo = this[SYM_HASH_ALGO];
|
||||||
|
+
|
||||||
|
+ if (algo === 'dss1') {
|
||||||
|
+ const verifier = createVerifyDSS('DSA-SHA1');
|
||||||
|
+ verifier.update(data);
|
||||||
|
+ try {
|
||||||
|
+ return verifier.verify(pem, signature);
|
||||||
|
+ } catch (ex) {
|
||||||
|
+ return ex;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
try {
|
||||||
|
return verify_(algo, data, pem, signature);
|
||||||
|
} catch (ex) {
|
||||||
|
@@ -1343,7 +1355,7 @@ function parseDER(data, baseType, comment, fullType) {
|
||||||
|
return new Error('Malformed OpenSSH public key');
|
||||||
|
pubPEM = genOpenSSLDSAPub(p, q, g, y);
|
||||||
|
pubSSH = genOpenSSHDSAPub(p, q, g, y);
|
||||||
|
- algo = 'sha1';
|
||||||
|
+ algo = 'dss1';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'ssh-ed25519': {
|
9
scripts/build-docs.js
Executable file
9
scripts/build-docs.js
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const sh = require('shelljs')
|
||||||
|
const vars = require('./vars')
|
||||||
|
const log = require('npmlog')
|
||||||
|
|
||||||
|
vars.packagesWithDocs.forEach(([dest, src]) => {
|
||||||
|
log.info('docs', src)
|
||||||
|
sh.exec(`yarn typedoc --out docs/api/${dest} --tsconfig ${src}/tsconfig.typings.json ${src}/src/index.ts`, { fatal: true })
|
||||||
|
})
|
22
scripts/build-modules.js
Executable file
22
scripts/build-modules.js
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const vars = require('./vars')
|
||||||
|
const log = require('npmlog')
|
||||||
|
const webpack = require('webpack')
|
||||||
|
const { promisify } = require('util')
|
||||||
|
|
||||||
|
const configs = [
|
||||||
|
'../app/webpack.main.config.js',
|
||||||
|
'../app/webpack.config.js',
|
||||||
|
...vars.allPackages.map(x => `../${x}/webpack.config.js`),
|
||||||
|
]
|
||||||
|
|
||||||
|
;(async () => {
|
||||||
|
for (const c of configs) {
|
||||||
|
log.info('build', c)
|
||||||
|
const stats = await promisify(webpack)(require(c))
|
||||||
|
console.log(stats.toString({ colors: true }))
|
||||||
|
if (stats.hasErrors()) {
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
@@ -4,7 +4,7 @@ const path = require('path')
|
|||||||
const vars = require('./vars')
|
const vars = require('./vars')
|
||||||
|
|
||||||
let lifecycles = []
|
let lifecycles = []
|
||||||
for (let dir of ['app', 'terminus-core', 'terminus-local', 'terminus-ssh', 'terminus-terminal']) {
|
for (let dir of ['app', 'tabby-core', 'tabby-local', 'tabby-ssh', 'tabby-terminal']) {
|
||||||
const build = rebuild({
|
const build = rebuild({
|
||||||
buildPath: path.resolve(__dirname, '../' + dir),
|
buildPath: path.resolve(__dirname, '../' + dir),
|
||||||
electronVersion: vars.electronVersion,
|
electronVersion: vars.electronVersion,
|
||||||
|
@@ -5,5 +5,5 @@ const log = require('npmlog')
|
|||||||
|
|
||||||
vars.builtinPlugins.forEach(plugin => {
|
vars.builtinPlugins.forEach(plugin => {
|
||||||
log.info('typings', plugin)
|
log.info('typings', plugin)
|
||||||
sh.exec(`npx tsc --project ${plugin}/tsconfig.typings.json`)
|
sh.exec(`yarn tsc --project ${plugin}/tsconfig.typings.json`, { fatal: true })
|
||||||
})
|
})
|
||||||
|
12
scripts/generate-icon-metadata.js
Executable file
12
scripts/generate-icon-metadata.js
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const jsYaml = require('js-yaml')
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const metadata = jsYaml.load(fs.readFileSync(path.resolve(__dirname, '../node_modules/@fortawesome/fontawesome-free/metadata/icons.yml')))
|
||||||
|
|
||||||
|
let result = {}
|
||||||
|
for (let key in metadata) {
|
||||||
|
result[key] = metadata[key].styles.map(x => x[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(path.resolve(__dirname, '../tabby-core/src/icons.json'), JSON.stringify(result))
|
27
scripts/i18n-extract.js
Executable file
27
scripts/i18n-extract.js
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const sh = require('shelljs')
|
||||||
|
const fs = require('fs/promises')
|
||||||
|
const vars = require('./vars')
|
||||||
|
const log = require('npmlog')
|
||||||
|
|
||||||
|
const tempOutput = 'locale/app.new.pot'
|
||||||
|
const pot = 'locale/app.pot'
|
||||||
|
const tempHtml = 'locale/tmp-html'
|
||||||
|
|
||||||
|
;(async () => {
|
||||||
|
sh.mkdir('-p', tempHtml)
|
||||||
|
for (const plugin of vars.builtinPlugins) {
|
||||||
|
log.info('extract-pug', plugin)
|
||||||
|
|
||||||
|
sh.exec(`yarn pug --doctype html -s --pretty -O '{require: function(){}}' -o ${tempHtml}/${plugin} ${plugin}`, { fatal: true })
|
||||||
|
|
||||||
|
log.info('extract-ts', plugin)
|
||||||
|
sh.exec(`node node_modules/.bin/ngx-translate-extract -i ${plugin}/src -m -s -f pot -o ${tempOutput}`, { fatal: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info('extract-pug')
|
||||||
|
sh.exec(`node node_modules/.bin/ngx-translate-extract -i ${tempHtml} -f pot -s -o ${tempOutput}`, { fatal: true })
|
||||||
|
|
||||||
|
sh.rm('-r', tempHtml)
|
||||||
|
await fs.rename(tempOutput, pot)
|
||||||
|
})()
|
@@ -1,33 +1,33 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
const sh = require('shelljs')
|
const sh = require('shelljs')
|
||||||
const path = require('path')
|
|
||||||
const vars = require('./vars')
|
const vars = require('./vars')
|
||||||
const log = require('npmlog')
|
const log = require('npmlog')
|
||||||
|
|
||||||
const localBinPath = path.resolve(__dirname, '../node_modules/.bin');
|
log.info('patch')
|
||||||
const npx = `${localBinPath}/npx`;
|
sh.exec(`yarn patch-package`, { fatal: true })
|
||||||
|
|
||||||
log.info('deps', 'app')
|
log.info('deps', 'app')
|
||||||
|
|
||||||
sh.cd('app')
|
sh.cd('app')
|
||||||
sh.exec(`${npx} yarn install --force`)
|
sh.exec(`yarn install --force`, { fatal: true })
|
||||||
sh.cd('..')
|
sh.cd('..')
|
||||||
|
|
||||||
sh.cd('web')
|
sh.cd('web')
|
||||||
sh.exec(`${npx} yarn install --force`)
|
sh.exec(`yarn install --force`, { fatal: true })
|
||||||
|
sh.exec(`yarn patch-package`, { fatal: true })
|
||||||
sh.cd('..')
|
sh.cd('..')
|
||||||
|
|
||||||
vars.builtinPlugins.forEach(plugin => {
|
vars.allPackages.forEach(plugin => {
|
||||||
log.info('deps', plugin)
|
log.info('deps', plugin)
|
||||||
sh.cd(plugin)
|
sh.cd(plugin)
|
||||||
sh.exec(`${npx} yarn install --force`)
|
sh.exec(`yarn install --force`, { fatal: true })
|
||||||
sh.cd('..')
|
sh.cd('..')
|
||||||
})
|
})
|
||||||
|
|
||||||
if (['darwin', 'linux'].includes(process.platform)) {
|
if (['darwin', 'linux'].includes(process.platform)) {
|
||||||
sh.cd('node_modules')
|
sh.cd('node_modules')
|
||||||
for (let x of vars.builtinPlugins) {
|
for (let x of vars.builtinPlugins) {
|
||||||
sh.ln('-fs', '../' + x, x)
|
sh.ln('-fs', '../' + x, x)
|
||||||
}
|
}
|
||||||
sh.cd('..')
|
sh.cd('..')
|
||||||
}
|
}
|
||||||
|
@@ -11,25 +11,25 @@ sh.mkdir('-p', target)
|
|||||||
fs.writeFileSync(path.join(target, 'package.json'), '{}')
|
fs.writeFileSync(path.join(target, 'package.json'), '{}')
|
||||||
sh.cd(target)
|
sh.cd(target)
|
||||||
vars.builtinPlugins.forEach(plugin => {
|
vars.builtinPlugins.forEach(plugin => {
|
||||||
if (plugin === 'terminus-web') {
|
if (plugin === 'tabby-web') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.info('install', plugin)
|
log.info('install', plugin)
|
||||||
sh.cp('-r', path.join('..', plugin), '.')
|
sh.cp('-r', path.join('..', plugin), '.')
|
||||||
sh.rm('-rf', path.join(plugin, 'node_modules'))
|
sh.rm('-rf', path.join(plugin, 'node_modules'))
|
||||||
sh.cd(plugin)
|
sh.cd(plugin)
|
||||||
sh.exec(`yarn install --force --production`)
|
sh.exec(`yarn install --force --production`, { fatal: true })
|
||||||
|
|
||||||
|
|
||||||
log.info('rebuild', 'native')
|
log.info('rebuild', 'native')
|
||||||
if (fs.existsSync('node_modules')) {
|
if (fs.existsSync('node_modules')) {
|
||||||
rebuild({
|
rebuild({
|
||||||
buildPath: path.resolve('.'),
|
buildPath: path.resolve('.'),
|
||||||
electronVersion: vars.electronVersion,
|
electronVersion: vars.electronVersion,
|
||||||
arch: process.env.ARCH ?? process.arch,
|
arch: process.env.ARCH ?? process.arch,
|
||||||
force: true,
|
force: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
sh.cd('..')
|
sh.cd('..')
|
||||||
})
|
})
|
||||||
fs.unlinkSync(path.join(target, 'package.json'), '{}')
|
fs.unlinkSync(path.join(target, 'package.json'), '{}')
|
||||||
|
13
scripts/publish-plugins.js
Executable file
13
scripts/publish-plugins.js
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const sh = require('shelljs')
|
||||||
|
const vars = require('./vars')
|
||||||
|
const log = require('npmlog')
|
||||||
|
const { execSync } = require('child_process')
|
||||||
|
|
||||||
|
vars.allPackages.forEach(plugin => {
|
||||||
|
log.info('bump', plugin)
|
||||||
|
sh.cd(plugin)
|
||||||
|
sh.exec('npm --no-git-tag-version version ' + vars.version, { fatal: true })
|
||||||
|
execSync('npm publish', { stdio: 'inherit' })
|
||||||
|
sh.cd('..')
|
||||||
|
})
|
@@ -9,7 +9,7 @@ sh.exec(`${sentryCli} releases new ${vars.version}`)
|
|||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
for (const path of [
|
for (const path of [
|
||||||
'app/node_modules/@serialport/bindings/build/Release/bindings.node',
|
'app/node_modules/@serialport/bindings/build/Release/bindings.node',
|
||||||
'app/node_modules/@terminus-term/node-pty/build/Release/pty.node',
|
'app/node_modules/@tabby-gang/node-pty/build/Release/pty.node',
|
||||||
'app/node_modules/fontmanager-redux/build/Release/fontmanager.node',
|
'app/node_modules/fontmanager-redux/build/Release/fontmanager.node',
|
||||||
'app/node_modules/macos-native-processlist/build/Release/native.node',
|
'app/node_modules/macos-native-processlist/build/Release/native.node',
|
||||||
]) {
|
]) {
|
||||||
|
@@ -1,11 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
const sh = require('shelljs')
|
|
||||||
const vars = require('./vars')
|
|
||||||
const log = require('npmlog')
|
|
||||||
|
|
||||||
vars.builtinPlugins.forEach(plugin => {
|
|
||||||
log.info('bump', plugin)
|
|
||||||
sh.cd(plugin)
|
|
||||||
sh.exec('npm --no-git-tag-version version ' + vars.version)
|
|
||||||
sh.cd('..')
|
|
||||||
})
|
|
@@ -5,28 +5,44 @@ const childProcess = require('child_process')
|
|||||||
|
|
||||||
const electronInfo = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../node_modules/electron/package.json')))
|
const electronInfo = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../node_modules/electron/package.json')))
|
||||||
|
|
||||||
exports.version = childProcess.execSync('git describe --tags', {encoding:'utf-8'})
|
exports.version = childProcess.execSync('git describe --tags', { encoding:'utf-8' })
|
||||||
exports.version = exports.version.substring(1).trim()
|
exports.version = exports.version.substring(1).trim()
|
||||||
exports.version = exports.version.replace('-', '-c')
|
exports.version = exports.version.replace('-', '-c')
|
||||||
|
|
||||||
if (exports.version.includes('-c')) {
|
if (exports.version.includes('-c')) {
|
||||||
exports.version = semver.inc(exports.version, 'prepatch').replace('-0', '-nightly.0')
|
exports.version = semver.inc(exports.version, 'prepatch').replace('-0', `-nightly.${process.env.REV ?? 0}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.builtinPlugins = [
|
exports.builtinPlugins = [
|
||||||
'terminus-core',
|
'tabby-core',
|
||||||
'terminus-settings',
|
'tabby-settings',
|
||||||
'terminus-terminal',
|
'tabby-terminal',
|
||||||
'terminus-electron',
|
'tabby-web',
|
||||||
'terminus-local',
|
'tabby-community-color-schemes',
|
||||||
'terminus-web',
|
'tabby-ssh',
|
||||||
'terminus-community-color-schemes',
|
'tabby-serial',
|
||||||
'terminus-plugin-manager',
|
'tabby-telnet',
|
||||||
'terminus-ssh',
|
'tabby-electron',
|
||||||
'terminus-serial',
|
'tabby-local',
|
||||||
|
'tabby-plugin-manager',
|
||||||
|
'tabby-linkifier',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
exports.packagesWithDocs = [
|
||||||
|
['.', 'tabby-core'],
|
||||||
|
['terminal', 'tabby-terminal'],
|
||||||
|
['local', 'tabby-local'],
|
||||||
|
['settings', 'tabby-settings'],
|
||||||
|
]
|
||||||
|
|
||||||
|
exports.allPackages = [
|
||||||
|
...exports.builtinPlugins,
|
||||||
|
'web',
|
||||||
|
'tabby-web-demo',
|
||||||
|
]
|
||||||
|
|
||||||
exports.bundledModules = [
|
exports.bundledModules = [
|
||||||
'@angular',
|
'@angular',
|
||||||
'@ng-bootstrap',
|
'@ng-bootstrap',
|
||||||
]
|
]
|
||||||
exports.electronVersion = electronInfo.version
|
exports.electronVersion = electronInfo.version
|
||||||
|
@@ -1,26 +1,26 @@
|
|||||||
name: terminus
|
name: tabby
|
||||||
version: '1.0.0'
|
version: '1.0.0'
|
||||||
summary: A terminal for a modern age
|
summary: A terminal for a modern age
|
||||||
description: |
|
description: |
|
||||||
Terminus is a terminal heavily inspired by Hyper. It is, however, designed for people who need to get things done.
|
Tabby is a local, SSH and serial terminal heavily inspired by Hyper.
|
||||||
|
|
||||||
grade: devel
|
grade: devel
|
||||||
confinement: devmode
|
confinement: devmode
|
||||||
|
|
||||||
apps:
|
apps:
|
||||||
terminus:
|
tabby:
|
||||||
command: opt/terminus/terminus
|
command: opt/tabby/tabby
|
||||||
|
|
||||||
parts:
|
parts:
|
||||||
app:
|
app:
|
||||||
plugin: nodejs
|
plugin: nodejs
|
||||||
source: .
|
source: .
|
||||||
build-packages:
|
build-packages:
|
||||||
- libfontconfig-dev
|
- libfontconfig-dev
|
||||||
override-build: |
|
override-build: |
|
||||||
yarn
|
yarn
|
||||||
./scripts/build-native.js
|
./scripts/build-native.js
|
||||||
yarn run build
|
yarn run build
|
||||||
./scripts/build-linux.js
|
./scripts/build-linux.js
|
||||||
mkdir -p $SNAPCRAFT_PART_INSTALL/opt/terminus || true
|
mkdir -p $SNAPCRAFT_PART_INSTALL/opt/tabby || true
|
||||||
cp -ar dist/linux-unpacked/* $SNAPCRAFT_PART_INSTALL/opt/terminus/
|
cp -ar dist/linux-unpacked/* $SNAPCRAFT_PART_INSTALL/opt/tabby/
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "terminus-community-color-schemes",
|
"name": "tabby-community-color-schemes",
|
||||||
"version": "1.0.135-nightly.0",
|
"version": "1.0.170-nightly.0",
|
||||||
"description": "Community color schemes for Terminus",
|
"description": "Community color schemes for Tabby",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"terminus-builtin-plugin"
|
"tabby-builtin-plugin"
|
||||||
],
|
],
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"typings": "typings/index.d.ts",
|
"typings": "typings/index.d.ts",
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^9.1.9",
|
"@angular/core": "^9.1.9",
|
||||||
"terminus-core": "*",
|
"tabby-core": "*",
|
||||||
"terminus-terminal": "*"
|
"tabby-terminal": "*"
|
||||||
}
|
}
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user