mirror of
https://github.com/Eugeny/tabby.git
synced 2025-08-10 11:21:53 +00:00
Compare commits
379 Commits
dependabot
...
v1.0.212
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f71a58ea85 | ||
![]() |
6f451ab735 | ||
![]() |
3145429856 | ||
![]() |
44b2757975 | ||
![]() |
ac8dd9f290 | ||
![]() |
0f3aeb6a40 | ||
![]() |
c7ca4d6aa1 | ||
![]() |
fa4c544c9c | ||
![]() |
ace5ac79a4 | ||
![]() |
af0e25ea09 | ||
![]() |
f0d228bb60 | ||
![]() |
0241623d27 | ||
![]() |
f4992c3f70 | ||
![]() |
5fca7ccf7b | ||
![]() |
3740166ace | ||
![]() |
82013e3139 | ||
![]() |
4d60ae2e90 | ||
![]() |
d6c2c5de31 | ||
![]() |
ccb59c3eae | ||
![]() |
2966c1fdad | ||
![]() |
42eefe8ef0 | ||
![]() |
1c62438f9d | ||
![]() |
e9f17ea597 | ||
![]() |
838d4afb94 | ||
![]() |
09194a964e | ||
![]() |
a5188f4cf5 | ||
![]() |
d7b7e6bcfd | ||
![]() |
37b1c1c750 | ||
![]() |
09b261e265 | ||
![]() |
df75f2bdb7 | ||
![]() |
ccee879b16 | ||
![]() |
5587e10dc8 | ||
![]() |
856a800cb2 | ||
![]() |
3c5f2ba28c | ||
![]() |
aa105bdf4d | ||
![]() |
b0dcc5f9df | ||
![]() |
fdda602a76 | ||
![]() |
f630b53e0a | ||
![]() |
89dd0773ee | ||
![]() |
deaa529c07 | ||
![]() |
69fc7803b8 | ||
![]() |
3f0b78edd0 | ||
![]() |
f523b114ca | ||
![]() |
af98505ea4 | ||
![]() |
6c9754c967 | ||
![]() |
92bce02f3c | ||
![]() |
72a5da5ac3 | ||
![]() |
4485e9a917 | ||
![]() |
3d7308cea0 | ||
![]() |
b4c3ac8ab6 | ||
![]() |
a769fdd036 | ||
![]() |
9d11730417 | ||
![]() |
4d63422b78 | ||
![]() |
e9ae253a6c | ||
![]() |
ff49b50d7d | ||
![]() |
b436eac973 | ||
![]() |
64195940a1 | ||
![]() |
69dd2993af | ||
![]() |
2b65bb4b14 | ||
![]() |
4ed4d756c9 | ||
![]() |
fa9ee756d2 | ||
![]() |
223d8549ad | ||
![]() |
1e6c2cba76 | ||
![]() |
bba72b4bb8 | ||
![]() |
3739455f32 | ||
![]() |
ab4899043f | ||
![]() |
1776b840f4 | ||
![]() |
3ea1b7f561 | ||
![]() |
cee39b3b9f | ||
![]() |
218fb8130c | ||
![]() |
d718f437f0 | ||
![]() |
defe30781b | ||
![]() |
a3a6e3d137 | ||
![]() |
a5f4f23301 | ||
![]() |
bdcfba10a3 | ||
![]() |
e120031cb0 | ||
![]() |
5adfdd432a | ||
![]() |
897e06d329 | ||
![]() |
db2280e147 | ||
![]() |
8a49c738b4 | ||
![]() |
439a7a8d44 | ||
![]() |
c681902929 | ||
![]() |
a3fd6f5846 | ||
![]() |
de81f12a17 | ||
![]() |
242f136a41 | ||
![]() |
9425920f94 | ||
![]() |
d15b67a05f | ||
![]() |
8237785409 | ||
![]() |
8f68105460 | ||
![]() |
66b7632958 | ||
![]() |
c906af5bec | ||
![]() |
24c64a5e24 | ||
![]() |
ebf0d89b07 | ||
![]() |
bacb458df3 | ||
![]() |
49d05cc23b | ||
![]() |
0894c305ad | ||
![]() |
c3baad4525 | ||
![]() |
3b15b35447 | ||
![]() |
fc72b4d160 | ||
![]() |
eaf335fe29 | ||
![]() |
68ca4ac9c0 | ||
![]() |
3f160eee46 | ||
![]() |
5d8ff72850 | ||
![]() |
e247ff73b2 | ||
![]() |
ed5ff1113c | ||
![]() |
a5fcb83ad0 | ||
![]() |
da5342b4a7 | ||
![]() |
3c7f1079dd | ||
![]() |
c7e01eab0f | ||
![]() |
ffddc36ee0 | ||
![]() |
b2671826c6 | ||
![]() |
fec5d809b7 | ||
![]() |
cf09d95602 | ||
![]() |
266dfe15a3 | ||
![]() |
868f7ba70e | ||
![]() |
b7f8652f5f | ||
![]() |
1f06800c39 | ||
![]() |
7239193a4b | ||
![]() |
35cb81c854 | ||
![]() |
614c1adf96 | ||
![]() |
eb15fe6aa6 | ||
![]() |
afe716fcf4 | ||
![]() |
2e50c18dba | ||
![]() |
209d3a9c5b | ||
![]() |
efc462ee4e | ||
![]() |
7b4af46bd4 | ||
![]() |
c9339ea76a | ||
![]() |
ac95f550d9 | ||
![]() |
cc3af1aa03 | ||
![]() |
a6ac5a2898 | ||
![]() |
353e5a9550 | ||
![]() |
2507317d6b | ||
![]() |
78a64a9025 | ||
![]() |
1369b5b299 | ||
![]() |
76931e69ad | ||
![]() |
e4ceb3ee6a | ||
![]() |
dd9a13c917 | ||
![]() |
9da21a82a8 | ||
![]() |
f0a83c68dc | ||
![]() |
7fbe3405fe | ||
![]() |
59c5491432 | ||
![]() |
9b985698ff | ||
![]() |
7af6a31f55 | ||
![]() |
50c534789a | ||
![]() |
64d9c98538 | ||
![]() |
86196c9f7d | ||
![]() |
62e54cbf6e | ||
![]() |
cd8e414fc0 | ||
![]() |
60be3722a2 | ||
![]() |
4e4ee4fc98 | ||
![]() |
d3b5a53179 | ||
![]() |
2a51ce556f | ||
![]() |
62dc3e04d0 | ||
![]() |
db9d90e9b0 | ||
![]() |
86469334a0 | ||
![]() |
eec294fa2e | ||
![]() |
aac1976baa | ||
![]() |
a4aa07c1f1 | ||
![]() |
2437dc5bdc | ||
![]() |
a8ef5963c3 | ||
![]() |
2dc64ae51b | ||
![]() |
0ba5517a31 | ||
![]() |
9f6263f3d4 | ||
![]() |
f80db81857 | ||
![]() |
3794081cef | ||
![]() |
38c9714c75 | ||
![]() |
3823efc82a | ||
![]() |
977deea2a0 | ||
![]() |
0153bdf490 | ||
![]() |
0b608bdb24 | ||
![]() |
8180530892 | ||
![]() |
0e58bb28f9 | ||
![]() |
7908de9634 | ||
![]() |
2743c332d5 | ||
![]() |
1e8693a47d | ||
![]() |
c97f88fde6 | ||
![]() |
b97d73e912 | ||
![]() |
e16cc34b4e | ||
![]() |
a2b87ea8cb | ||
![]() |
fda98f7434 | ||
![]() |
aae0147d7d | ||
![]() |
c59e9c1d82 | ||
![]() |
b4abe29c51 | ||
![]() |
1e096ede77 | ||
![]() |
2be079a51b | ||
![]() |
be0d129c28 | ||
![]() |
191807c09a | ||
![]() |
f4af21bf71 | ||
![]() |
845d6c6373 | ||
![]() |
066a1a6bac | ||
![]() |
b4777fd4a8 | ||
![]() |
3d83bc6e4e | ||
![]() |
102c0f5ce7 | ||
![]() |
345e90c1f6 | ||
![]() |
787936babd | ||
![]() |
6c1b0c3ae7 | ||
![]() |
efe1772e8d | ||
![]() |
d1311ba53f | ||
![]() |
5a6911f928 | ||
![]() |
2254436365 | ||
![]() |
2c70c0fff5 | ||
![]() |
ff450527ab | ||
![]() |
3ba6ce889e | ||
![]() |
4ca425c2a8 | ||
![]() |
70fb882e4d | ||
![]() |
86664c4eba | ||
![]() |
72149d2cb0 | ||
![]() |
04a1b0fb44 | ||
![]() |
f8614dffbc | ||
![]() |
37ccba5c90 | ||
![]() |
98719aafdc | ||
![]() |
860ee3eaa9 | ||
![]() |
454391d31e | ||
![]() |
4c0231cd67 | ||
![]() |
31b063a964 | ||
![]() |
26a2a0c44e | ||
![]() |
f0a84d4d76 | ||
![]() |
ae6c1308a8 | ||
![]() |
c3a9f35953 | ||
![]() |
dc6c0357c2 | ||
![]() |
f706d7d6cb | ||
![]() |
56d5d34bfd | ||
![]() |
40246a409d | ||
![]() |
0f6561e859 | ||
![]() |
72c0692843 | ||
![]() |
26d6d14703 | ||
![]() |
6a458d8b9b | ||
![]() |
3e9ee5b235 | ||
![]() |
4740824dd1 | ||
![]() |
51d48f07d7 | ||
![]() |
a8d7fa33b5 | ||
![]() |
34fee58a7d | ||
![]() |
f276c50326 | ||
![]() |
ca1241ee52 | ||
![]() |
000bdde0cd | ||
![]() |
34daa4c412 | ||
![]() |
39596588bb | ||
![]() |
1228b1a29a | ||
![]() |
f0636623ae | ||
![]() |
4057e0cf59 | ||
![]() |
0e8164fe4c | ||
![]() |
2b8fed164f | ||
![]() |
e68bd6c746 | ||
![]() |
f3196ac045 | ||
![]() |
57f20eca4f | ||
![]() |
5d1a35a285 | ||
![]() |
642db6a14a | ||
![]() |
e739883840 | ||
![]() |
bb27314696 | ||
![]() |
adeb6031dd | ||
![]() |
34aeb797f3 | ||
![]() |
7d5128a8ce | ||
![]() |
83c0892546 | ||
![]() |
9e705fb273 | ||
![]() |
c2b349de8f | ||
![]() |
3176a7744b | ||
![]() |
98dd4a0017 | ||
![]() |
cfce2687bd | ||
![]() |
2af7ad85f8 | ||
![]() |
8616bdbea3 | ||
![]() |
0505e5615d | ||
![]() |
8c2820056a | ||
![]() |
b1108a7b32 | ||
![]() |
bfe3430e9a | ||
![]() |
612d6ef089 | ||
![]() |
bd31db9c56 | ||
![]() |
d1a837b11d | ||
![]() |
d70be3abf9 | ||
![]() |
422df52fea | ||
![]() |
140d7e9f96 | ||
![]() |
9a3bb1ae4b | ||
![]() |
169adedc48 | ||
![]() |
90ccd969f2 | ||
![]() |
6ebfccda28 | ||
![]() |
27bf7c4ad6 | ||
![]() |
651861cd4a | ||
![]() |
3ce2bb68c6 | ||
![]() |
e4169a54aa | ||
![]() |
0d0bde82a0 | ||
![]() |
04b53ab366 | ||
![]() |
7cde5c0807 | ||
![]() |
cb71c79ecc | ||
![]() |
6843b87493 | ||
![]() |
a17da4b4af | ||
![]() |
5d5c545b4e | ||
![]() |
f7299ee321 | ||
![]() |
d1e97bf737 | ||
![]() |
f9f1a809a1 | ||
![]() |
d881da94de | ||
![]() |
3aaa68fe09 | ||
![]() |
ea84612788 | ||
![]() |
16fcf3d7f8 | ||
![]() |
4a02abdcc3 | ||
![]() |
98a5bfd338 | ||
![]() |
2dbc43f828 | ||
![]() |
0c93010da7 | ||
![]() |
0329e7a8b6 | ||
![]() |
26ac6b0aa3 | ||
![]() |
8bc2375aab | ||
![]() |
dc9a7d8fac | ||
![]() |
0becf8cc76 | ||
![]() |
6042a5290c | ||
![]() |
344244297c | ||
![]() |
75eedafbc9 | ||
![]() |
1b0ce6d684 | ||
![]() |
4684b0d6f5 | ||
![]() |
eddb50b529 | ||
![]() |
96eee51590 | ||
![]() |
f963167b70 | ||
![]() |
0128013308 | ||
![]() |
5e5c80832d | ||
![]() |
06859de2de | ||
![]() |
49f9a10372 | ||
![]() |
85d988f6b3 | ||
![]() |
7bc549b555 | ||
![]() |
d6bdecb9c4 | ||
![]() |
7687972e65 | ||
![]() |
34786b1459 | ||
![]() |
634d88d220 | ||
![]() |
ad3b03cb83 | ||
![]() |
d354520910 | ||
![]() |
a9c63b5305 | ||
![]() |
d21282501f | ||
![]() |
d2752382aa | ||
![]() |
5eeaef954c | ||
![]() |
ef6b8a4eaa | ||
![]() |
7be6fca493 | ||
![]() |
21e38c8453 | ||
![]() |
2262d59866 | ||
![]() |
9b0fbcfc56 | ||
![]() |
8adb9a6806 | ||
![]() |
164d34c543 | ||
![]() |
f369b140c6 | ||
![]() |
c108476262 | ||
![]() |
695c5ba670 | ||
![]() |
e23765045c | ||
![]() |
d6705c20ad | ||
![]() |
79cabb6eda | ||
![]() |
3024e633a9 | ||
![]() |
743ea04d0b | ||
![]() |
6d0a84c94e | ||
![]() |
0ef24ddf1d | ||
![]() |
935c981d2b | ||
![]() |
951c69b31a | ||
![]() |
30936b739e | ||
![]() |
44c449bd4c | ||
![]() |
2cfc64911b | ||
![]() |
240c542665 | ||
![]() |
555d3c8478 | ||
![]() |
aafe510803 | ||
![]() |
217ab641b5 | ||
![]() |
7572f3c26f | ||
![]() |
326d8b3fb1 | ||
![]() |
9b4f1a3a0d | ||
![]() |
0d275595cf | ||
![]() |
7860c73e49 | ||
![]() |
fa9dea0f64 | ||
![]() |
6813fd54cd | ||
![]() |
1c06a510bd | ||
![]() |
a0804cc564 | ||
![]() |
b751e10082 | ||
![]() |
48d4b8e8f8 | ||
![]() |
ef040ee342 | ||
![]() |
8e9156e250 | ||
![]() |
1903ec5995 | ||
![]() |
21df033012 | ||
![]() |
4d146941f4 | ||
![]() |
5ba6bfbd7d | ||
![]() |
f0e2482dd6 | ||
![]() |
5763919d85 | ||
![]() |
c1e03ed532 | ||
![]() |
8a85fcac21 | ||
![]() |
ee4487a517 | ||
![]() |
272b9ee5dc | ||
![]() |
d57757c66c | ||
![]() |
4dedbbc25a | ||
![]() |
91cb9e5c63 | ||
![]() |
e2cc9b98ee | ||
![]() |
a585cf306c |
@@ -635,10 +635,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"login": "X-0x01",
|
"login": "0x973",
|
||||||
"name": "X-0x01",
|
"name": "0x973",
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/19320096?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/19320096?v=4",
|
||||||
"profile": "http://pingbase.cn",
|
"profile": "https://github.com/0x973",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
@@ -1220,6 +1220,114 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "siebsie23",
|
||||||
|
"name": "Sibren",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/25083973?v=4",
|
||||||
|
"profile": "https://siebsie23.nl/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "nwalser",
|
||||||
|
"name": "Nathaniel Walser",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/33339996?v=4",
|
||||||
|
"profile": "https://www.nathaniel-walser.com",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "aaronhuggins",
|
||||||
|
"name": "Aaron Huggins",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/16567111?v=4",
|
||||||
|
"profile": "https://github.com/aaronhuggins",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "zKXDEX",
|
||||||
|
"name": "KDex",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/66271780?v=4",
|
||||||
|
"profile": "https://zkxdex.github.io/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "kimbob13",
|
||||||
|
"name": "ChangHwan Kim",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/26755098?v=4",
|
||||||
|
"profile": "https://github.com/kimbob13",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "ashneilson",
|
||||||
|
"name": "Ash Neilson",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/35913512?v=4",
|
||||||
|
"profile": "https://github.com/ashneilson",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "cfs4819",
|
||||||
|
"name": "Chen Fansong",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/53071761?v=4",
|
||||||
|
"profile": "https://github.com/cfs4819",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Mxmilu666",
|
||||||
|
"name": "Mxmilu",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/82694310?v=4",
|
||||||
|
"profile": "https://5k.work/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "C41M50N",
|
||||||
|
"name": "Charles Buffington",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/29805363?v=4",
|
||||||
|
"profile": "https://cbuff.dev",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "GeminiLn",
|
||||||
|
"name": "Yu Qin",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/12425057?v=4",
|
||||||
|
"profile": "https://github.com/GeminiLn",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "fireblue",
|
||||||
|
"name": "fireblue",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/1034929?v=4",
|
||||||
|
"profile": "https://github.com/fireblue",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "marko1616",
|
||||||
|
"name": "marko1616",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/45327989?v=4",
|
||||||
|
"profile": "https://github.com/marko1616",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
@@ -1,7 +1,13 @@
|
|||||||
settings:
|
settings:
|
||||||
|
import/parsers:
|
||||||
|
'@typescript-eslint/parser': ['.ts']
|
||||||
import/resolver:
|
import/resolver:
|
||||||
typescript: true
|
typescript:
|
||||||
|
project:
|
||||||
|
- tsconfig.json
|
||||||
|
- tabby-*/tsconfig.json
|
||||||
node: true
|
node: true
|
||||||
|
|
||||||
env:
|
env:
|
||||||
browser: true
|
browser: true
|
||||||
es6: true
|
es6: true
|
||||||
@@ -28,7 +34,7 @@ overrides:
|
|||||||
- plugin:import/typescript
|
- plugin:import/typescript
|
||||||
plugins:
|
plugins:
|
||||||
- '@typescript-eslint'
|
- '@typescript-eslint'
|
||||||
- 'import'
|
- import
|
||||||
rules:
|
rules:
|
||||||
'@typescript-eslint/semi':
|
'@typescript-eslint/semi':
|
||||||
- error
|
- error
|
||||||
@@ -130,6 +136,7 @@ overrides:
|
|||||||
'@typescript-eslint/naming-convention': off
|
'@typescript-eslint/naming-convention': off
|
||||||
'@typescript-eslint/lines-between-class-members':
|
'@typescript-eslint/lines-between-class-members':
|
||||||
- error
|
- error
|
||||||
|
- always
|
||||||
- exceptAfterSingleLine: true
|
- exceptAfterSingleLine: true
|
||||||
'@typescript-eslint/dot-notation': off
|
'@typescript-eslint/dot-notation': off
|
||||||
'@typescript-eslint/no-implicit-any-catch': off
|
'@typescript-eslint/no-implicit-any-catch': off
|
||||||
@@ -152,3 +159,6 @@ overrides:
|
|||||||
'@typescript-eslint/consistent-generic-constructors': off
|
'@typescript-eslint/consistent-generic-constructors': off
|
||||||
'keyword-spacing': off
|
'keyword-spacing': off
|
||||||
'@typescript-eslint/keyword-spacing': off
|
'@typescript-eslint/keyword-spacing': off
|
||||||
|
'@typescript-eslint/class-methods-use-this': off
|
||||||
|
'@typescript-eslint/lines-around-comment': off
|
||||||
|
'@typescript-eslint/no-redundant-type-constituents': off # broken
|
||||||
|
174
.github/workflows/build.yml
vendored
174
.github/workflows/build.yml
vendored
@@ -2,7 +2,7 @@ name: Package-Build
|
|||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
jobs:
|
jobs:
|
||||||
Lint:
|
Lint:
|
||||||
runs-on: macos-11
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -11,13 +11,13 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Installing Node
|
- name: Installing Node
|
||||||
uses: actions/setup-node@v3.6.0
|
uses: actions/setup-node@v3.7.0
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 18
|
||||||
|
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
npm i -g yarn@1.19.1
|
npm i -g yarn
|
||||||
cd app
|
cd app
|
||||||
yarn
|
yarn
|
||||||
cd ..
|
cd ..
|
||||||
@@ -31,7 +31,7 @@ jobs:
|
|||||||
run: yarn run lint
|
run: yarn run lint
|
||||||
|
|
||||||
macOS-Build:
|
macOS-Build:
|
||||||
runs-on: macos-11
|
runs-on: macos-12
|
||||||
needs: Lint
|
needs: Lint
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -47,13 +47,14 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Installing Node
|
- name: Installing Node
|
||||||
uses: actions/setup-node@v3.6.0
|
uses: actions/setup-node@v3.7.0
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 18
|
||||||
|
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
sudo npm i -g yarn@1.22.1
|
sudo -H pip3 install setuptools
|
||||||
|
sudo npm i -g yarn
|
||||||
yarn --network-timeout 1000000
|
yarn --network-timeout 1000000
|
||||||
env:
|
env:
|
||||||
ARCH: ${{matrix.arch}}
|
ARCH: ${{matrix.arch}}
|
||||||
@@ -110,16 +111,16 @@ jobs:
|
|||||||
|
|
||||||
- name: Package artifacts
|
- name: Package artifacts
|
||||||
run: |
|
run: |
|
||||||
mkdir artifact-pkg
|
mkdir artifact-dmg
|
||||||
mv dist/*.pkg artifact-pkg/
|
mv dist/*.dmg artifact-dmg/
|
||||||
mkdir artifact-zip
|
mkdir artifact-zip
|
||||||
mv dist/*.zip artifact-zip/
|
mv dist/*.zip artifact-zip/
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@master
|
||||||
name: Upload PKG
|
name: Upload DMG
|
||||||
with:
|
with:
|
||||||
name: macOS .pkg (${{matrix.arch}})
|
name: macOS .dmg (${{matrix.arch}})
|
||||||
path: artifact-pkg
|
path: artifact-dmg
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@master
|
||||||
name: Upload ZIP
|
name: Upload ZIP
|
||||||
@@ -155,56 +156,53 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@v3.6.0
|
uses: actions/setup-node@v3.7.0
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|
||||||
- name: Install deps (amd64)
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install libarchive-tools zsh
|
sudo apt-get install libarchive-tools zsh crossbuild-essential-${{matrix.arch}}
|
||||||
|
|
||||||
|
- name: Setup tar to run as root
|
||||||
|
run: sudo chmod u+s "$(command -v tar)"
|
||||||
|
if: matrix.build-arch != 'x64'
|
||||||
|
|
||||||
|
- name: Download cached sysroot
|
||||||
|
uses: actions/cache@v3
|
||||||
|
id: dl-cached-sysroot
|
||||||
|
if: matrix.build-arch !='x64'
|
||||||
|
with:
|
||||||
|
key: sysroot-${{matrix.build-arch}}
|
||||||
|
path: /${{matrix.build-arch}}-sysroot
|
||||||
|
|
||||||
|
- name: Setup crossbuild sysroot
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y && sudo apt-get install debootstrap qemu-user-static binfmt-support -y
|
||||||
|
sudo qemu-debootstrap --include=libfontconfig1-dev,libsecret-1-dev,libnss3,libatk1.0-0,libatk-bridge2.0-0,libgdk-pixbuf2.0-0,libgtk-3-0,libgbm1 --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb --arch ${{matrix.arch}} bionic /${{matrix.build-arch}}-sysroot/ http://ports.ubuntu.com/ubuntu-ports/
|
||||||
|
sudo find /${{matrix.build-arch}}-sysroot -type l -lname '/*' -exec sh -c 'file="$0"; dir=$(dirname "$file"); target=$(readlink "$0"); prefix=$(dirname "$dir" | sed 's@[^/]*@\.\.@g'); newtarget="$prefix$target"; ln -snf $newtarget $file' {} \; ;
|
||||||
|
if: matrix.build-arch != 'x64' && steps.dl-cached-sysroot.outputs.cache-hit != 'true'
|
||||||
|
|
||||||
|
- name: Setup env to use ${{matrix.build-arch}} sysroot
|
||||||
|
run: |
|
||||||
|
echo "CFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||||
|
echo "CXXFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||||
|
echo "LDFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
[[ ${npm_config_arch} == 'arm' ]] && echo "npm_config_arch=armv7l" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
if [[ ${{matrix.arch}} == 'armhf' ]]; then
|
||||||
|
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/" >> $GITHUB_ENV
|
||||||
|
elif [[ ${{matrix.arch}} == 'arm64' ]]; then
|
||||||
|
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
if: matrix.build-arch != 'x64'
|
||||||
|
|
||||||
- name: Install npm_modules (amd64)
|
- name: Install npm_modules (amd64)
|
||||||
run: |
|
run: |
|
||||||
npm i -g yarn
|
npm i -g yarn node-gyp
|
||||||
yarn --network-timeout 1000000
|
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target-arch=${{matrix.build-arch}}
|
||||||
if: matrix.build-arch == 'x64'
|
|
||||||
|
|
||||||
- name: Setup Crossbuild (${{matrix.arch}})
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -y && sudo apt-get install schroot sbuild debootstrap -y
|
|
||||||
sudo debootstrap --include=git,curl,gnupg,ca-certificates,crossbuild-essential-${{matrix.arch}},python-dev,python3-dev,libarchive-tools,cmake --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb bionic /build-chroot/
|
|
||||||
echo 'deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse' | sudo tee /build-chroot/etc/apt/sources.list >/dev/null
|
|
||||||
echo 'deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse' | sudo tee -a /build-chroot/etc/apt/sources.list >/dev/null
|
|
||||||
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /build-chroot/etc/apt/trusted.gpg.d/nodesource.gpg >/dev/null
|
|
||||||
echo 'deb http://deb.nodesource.com/node_16.x bionic main' | sudo tee /build-chroot/etc/apt/sources.list.d/nodesource.list >/dev/null
|
|
||||||
echo "[build-chroot]
|
|
||||||
description=Ubuntu 18.04 Build chroot
|
|
||||||
type=directory
|
|
||||||
directory=/build-chroot
|
|
||||||
root-groups=root,sudo
|
|
||||||
profile=buildd
|
|
||||||
personality=linux
|
|
||||||
union-type=overlay" | sudo tee /etc/schroot/chroot.d/build-chroot.pref >/dev/null
|
|
||||||
echo "/home /home none rw,bind 0 0" | sudo tee -a /etc/schroot/buildd/fstab >/dev/null
|
|
||||||
|
|
||||||
if: matrix.build-arch != 'x64'
|
|
||||||
|
|
||||||
- name: Install node_modules & CrossBuild native modules for ${{matrix.arch}}
|
|
||||||
run: |
|
|
||||||
sudo schroot -c build-chroot -u root -- bash -c "apt-get update -y
|
|
||||||
dpkg --add-architecture ${{matrix.arch}}
|
|
||||||
apt-get install -y nodejs libfontconfig-dev:${{matrix.arch}} libsecret-1-dev:${{matrix.arch}} libnss3:${{matrix.arch}} libatk1.0-0:${{matrix.arch}} libatk-bridge2.0-0:${{matrix.arch}} libgdk-pixbuf2.0-0:${{matrix.arch}} libgtk-3-0:${{matrix.arch}} libgbm1:${{matrix.arch}}
|
|
||||||
export CC=${{matrix.triplet}}gcc CXX=${{matrix.triplet}}g++ LD=${{matrix.triplet}}ld
|
|
||||||
if [[ ${{matrix.arch}} == 'arm64' ]]; then
|
|
||||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig/
|
|
||||||
elif [[ ${{matrix.arch}} == 'armhf' ]]; then
|
|
||||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/arm-linux-gnueabihf/pkgconfig/
|
|
||||||
fi
|
|
||||||
export ARCH=${{matrix.build-arch}} npm_config_arch=${{matrix.build-arch}} npm_config_target_arch=${{matrix.build-arch}}
|
|
||||||
npm i -g yarn
|
|
||||||
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}"
|
|
||||||
if: matrix.build-arch != 'x64'
|
|
||||||
|
|
||||||
- name: Webpack (${{matrix.arch}})
|
- name: Webpack (${{matrix.arch}})
|
||||||
run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
|
run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
|
||||||
@@ -220,57 +218,10 @@ jobs:
|
|||||||
USE_HARD_LINKS: false
|
USE_HARD_LINKS: false
|
||||||
# DEBUG: electron-builder,electron-builder:*
|
# DEBUG: electron-builder,electron-builder:*
|
||||||
|
|
||||||
- name: Build web resources
|
- name: Build web resources (amd64 only)
|
||||||
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
|
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
|
||||||
if: matrix.build-arch == 'x64'
|
if: matrix.build-arch == 'x64'
|
||||||
|
|
||||||
# - name: Install deps and Build (arm64)
|
|
||||||
# uses: docker://multiarch/ubuntu-core:arm64-bionic
|
|
||||||
# with:
|
|
||||||
# args: >
|
|
||||||
# bash -c
|
|
||||||
# "apt update && apt install curl lsb-release gnupg -y &&
|
|
||||||
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
|
|
||||||
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
|
|
||||||
# git config --global --add safe.directory /github/workspace &&
|
|
||||||
# gem install public_suffix -v 4.0.7 &&
|
|
||||||
# gem install fpm --no-document &&
|
|
||||||
# npm i -g yarn &&
|
|
||||||
# cd /github/workspace &&
|
|
||||||
# yarn --network-timeout 1000000 &&
|
|
||||||
# yarn run build &&
|
|
||||||
# scripts/prepackage-plugins.mjs &&
|
|
||||||
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
|
|
||||||
# env:
|
|
||||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
|
|
||||||
# USE_HARD_LINKS: false
|
|
||||||
# if: matrix.build-arch == 'arm64' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
|
|
||||||
|
|
||||||
# - name: Install deps and Build (armv7l)
|
|
||||||
# uses: docker://multiarch/ubuntu-core:armhf-bionic
|
|
||||||
# with:
|
|
||||||
# args: >
|
|
||||||
# bash -c
|
|
||||||
# "apt update && apt install curl lsb-release gnupg -y &&
|
|
||||||
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
|
|
||||||
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
|
|
||||||
# git config --global --add safe.directory /github/workspace &&
|
|
||||||
# gem install public_suffix -v 4.0.7 &&
|
|
||||||
# gem install fpm --no-document &&
|
|
||||||
# npm i -g yarn &&
|
|
||||||
# cd /github/workspace &&
|
|
||||||
# sed -i '/ \"electron\":/c\ \"electron\": \"17.0.0\",' package.json &&
|
|
||||||
# yarn --network-timeout 1000000 &&
|
|
||||||
# yarn run build &&
|
|
||||||
# scripts/prepackage-plugins.mjs &&
|
|
||||||
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
|
|
||||||
# env:
|
|
||||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
|
|
||||||
# USE_HARD_LINKS: false
|
|
||||||
# if: matrix.build-arch == 'arm' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
|
|
||||||
|
|
||||||
- name: Upload symbols (amd64 only)
|
- name: Upload symbols (amd64 only)
|
||||||
run: |
|
run: |
|
||||||
sudo npm install -g @sentry/cli --unsafe-perm
|
sudo npm install -g @sentry/cli --unsafe-perm
|
||||||
@@ -282,13 +233,15 @@ jobs:
|
|||||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||||
|
|
||||||
- name: Upload packages to packagecloud.io
|
- name: Upload packages to packagecloud.io
|
||||||
uses: Eugeny/packagecloud-action@main
|
uses: TykTechnologies/packagecloud-action@main
|
||||||
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
env:
|
env:
|
||||||
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
|
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
|
||||||
with:
|
with:
|
||||||
repo: 'eugeny/tabby'
|
repo: 'eugeny/tabby'
|
||||||
dir: 'dist'
|
dir: 'dist'
|
||||||
|
rpmvers: 'el/9 el/8 ol/6 ol/7'
|
||||||
|
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble debian/jessie debian/stretch debian/buster'
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@master
|
||||||
name: Upload AppImage (${{matrix.arch}})
|
name: Upload AppImage (${{matrix.arch}})
|
||||||
@@ -345,19 +298,14 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Installing Node
|
- name: Installing Node
|
||||||
uses: actions/setup-node@v3.6.0
|
uses: actions/setup-node@v3.7.0
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 18
|
||||||
|
|
||||||
- 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
|
- name: Build
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
npm i -g yarn@1.19.1
|
npm i -g yar node-gyp
|
||||||
yarn --network-timeout 1000000
|
yarn --network-timeout 1000000
|
||||||
yarn run build
|
yarn run build
|
||||||
node scripts/prepackage-plugins.mjs
|
node scripts/prepackage-plugins.mjs
|
||||||
@@ -377,7 +325,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build packages without signing
|
- name: Build packages without signing
|
||||||
run: node scripts/build-windows.mjs
|
run: node scripts/build-windows.mjs
|
||||||
if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
if: "! (github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||||
env:
|
env:
|
||||||
ARCH: ${{matrix.arch}}
|
ARCH: ${{matrix.arch}}
|
||||||
|
|
||||||
|
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
@@ -12,9 +12,9 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Installing Node
|
- name: Installing Node
|
||||||
uses: actions/setup-node@v3.6.0
|
uses: actions/setup-node@v3.7.0
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 20
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
15
.github/workflows/issue-translator.yml
vendored
15
.github/workflows/issue-translator.yml
vendored
@@ -1,15 +0,0 @@
|
|||||||
name: 'issue-translator'
|
|
||||||
on:
|
|
||||||
issue_comment:
|
|
||||||
types: [created]
|
|
||||||
issues:
|
|
||||||
types: [opened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: tomsun28/issues-translate-action@v2.7
|
|
||||||
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.
|
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -37,3 +37,4 @@ tabby-ssh/util/pagent.exe
|
|||||||
*.psd
|
*.psd
|
||||||
|
|
||||||
crowdin.yml
|
crowdin.yml
|
||||||
|
.crowdin.env
|
||||||
|
@@ -23,6 +23,8 @@ sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 liba
|
|||||||
yarn
|
yarn
|
||||||
```
|
```
|
||||||
|
|
||||||
|
_⚠️Note: If you forked this repository, you may need to pull down the tags from this repository before installing node modules. `git pull --tags upstream master`_
|
||||||
|
|
||||||
Build Tabby:
|
Build Tabby:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -119,6 +119,7 @@ Plugins und Themen können direkt aus der Ansicht "Einstellungen" in Tabby insta
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
|
|
||||||
@@ -242,7 +243,7 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -326,6 +327,22 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Este fichero README está disponible en: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
Este fichero README está disponible en: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -120,6 +120,7 @@ Los plugins y los temas se pueden instalar directamente desde la vista de Config
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - un ejemplo de plugin que te molesta todo el tiempo
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - un ejemplo de plugin que te molesta todo el tiempo
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite crear perfiles de espacio de trabajo personalizados basados en la configuración dada
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite crear perfiles de espacio de trabajo personalizados basados en la configuración dada
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre el navegador del sistema por defecto con un texto seleccionado en la pestaña de Tabby's
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre el navegador del sistema por defecto con un texto seleccionado en la pestaña de Tabby's
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
|
|
||||||
# Temas
|
# Temas
|
||||||
@@ -244,7 +245,7 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -328,6 +329,22 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -120,6 +120,7 @@ Tema dan Plugin bisa langsung di install dari Pengaturan di dalam Tabby.
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - suatu contoh plugin yang akan mengganggu anda setiap saat
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - suatu contoh plugin yang akan mengganggu anda setiap saat
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - memperbolehkan membuat kustom profil workspace dari konfigurasi yang diberikan
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - memperbolehkan membuat kustom profil workspace dari konfigurasi yang diberikan
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - membuka browser default dengan text yang dipilih dari Tab Tabby
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - membuka browser default dengan text yang dipilih dari Tab Tabby
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
|
|
||||||
@@ -241,7 +242,7 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -325,6 +326,22 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Questo README è disponibile anche in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
Questo README è disponibile anche in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -117,6 +117,7 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
|
* [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
|
* [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
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
# Temi
|
# Temi
|
||||||
@@ -237,7 +238,7 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -321,6 +322,22 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
このREADMEは次の言語でもご覧いただけます: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
このREADMEは次の言語でもご覧いただけます: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -127,6 +127,7 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - プラグインの作例として、いつも厄介なあいつが出てくるプラグイン
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - プラグインの作例として、いつも厄介なあいつが出てくるプラグイン
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 指定された設定からカスタマイズされたワークスペースを作成することができます
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 指定された設定からカスタマイズされたワークスペースを作成することができます
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby内の端末で選択したテキストを既定ブラウザで開くことができます。
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby内の端末で選択したテキストを既定ブラウザで開くことができます。
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
|
|
||||||
@@ -252,7 +253,7 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -336,6 +337,22 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -19,6 +19,11 @@
|
|||||||
* [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)
|
* [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)
|
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<p align="center">
|
||||||
|
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
**Tabby** (구 **Terminus**)는 Windows, macOS 및 Linux용으로 뛰어난 구성의 터미널 에뮬레이터, SSH 및 시리얼 클라이언트입니다.
|
**Tabby** (구 **Terminus**)는 Windows, macOS 및 Linux용으로 뛰어난 구성의 터미널 에뮬레이터, SSH 및 시리얼 클라이언트입니다.
|
||||||
@@ -111,6 +116,7 @@
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
# 테마
|
# 테마
|
||||||
@@ -231,7 +237,7 @@ Pull requests and plugins are welcome!
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -315,6 +321,22 @@ Pull requests and plugins are welcome!
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
34
README.md
34
README.md
@@ -16,9 +16,6 @@
|
|||||||
|
|
||||||
> 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it.
|
> 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it.
|
||||||
|
|
||||||
> 👋 [Tabby-web](https://github.com/Eugeny/tabby-web) is looking for sponsors. As I can't afford to host it myself any longer, I'm looking for a sponsor to cover the hosting costs. If you're interested, please [get in touch](https://twitter.com/eugeeeeny)!
|
|
||||||
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
### Downloads:
|
### Downloads:
|
||||||
@@ -29,7 +26,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
This README is also available in: <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">🇧🇷 Português</a>
|
This README is also available in: <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -128,6 +125,10 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
|
* [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
|
* [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
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
* [background](https://github.com/moemoechu/tabby-background) - change Tabby background image and more...
|
||||||
|
* [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin
|
||||||
|
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-app web authentication popups (Built primarily for warpgate in-browser auth)
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
|
|
||||||
@@ -138,6 +139,8 @@ Plugins and themes can be installed directly from the Settings view inside 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)
|
||||||
|
* [catppuccin](https://github.com/catppuccin/tabby) - Soothing pastel theme for Tabby
|
||||||
|
* [noctis](https://github.com/aaronhuggins/tabby-colors-noctis) - color themes inspired by Noctis VS Code theme
|
||||||
|
|
||||||
# Sponsors <!-- omit in toc -->
|
# Sponsors <!-- omit in toc -->
|
||||||
|
|
||||||
@@ -149,6 +152,11 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
|||||||
|
|
||||||
[**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting
|
[**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting
|
||||||
|
|
||||||
|
<a href="https://iqhive.com/"><img src="https://private-user-images.githubusercontent.com/161476/361584584-ed292436-1d50-46bc-b479-78222c83ed22.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MDg3NjgsIm5iZiI6MTcyNDcwODQ2OCwicGF0aCI6Ii8xNjE0NzYvMzYxNTg0NTg0LWVkMjkyNDM2LTFkNTAtNDZiYy1iNDc5LTc4MjIyYzgzZWQyMi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyNlQyMTQxMDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYzNlZjIxN2JiYzBkYTU5NGE4YmZlZDJiNmIxZWE1ZTAyOTNhYjJlZTRhOGZjYTk4N2E4MzMzZjg0ZTNkZWQ0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.pQzR2d71YV4TIxOH3Lg20HpNKrm_r2D-xfkEM_F2DTs" width="100"></a>
|
||||||
|
|
||||||
|
[**IQ Hive**](https://iqhive.com) is providing financial support for the project development
|
||||||
|
|
||||||
|
|
||||||
<a name="contributing"></a>
|
<a name="contributing"></a>
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
@@ -253,7 +261,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -337,6 +345,22 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
363
README.pl-PL.md
Normal file
363
README.pl-PL.md
Normal file
@@ -0,0 +1,363 @@
|
|||||||
|
[](https://tabby.sh)
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="Wszystkie wydania na GitHubie" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=POBRANIA&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="Przetłumacz" 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>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
> 👋 Zarządzasz zdalnymi środowiskami? Rzuć okiem na [WarpGate, inteligentny serwer typu bastion SSH/HTTP/MySQL](https://github.com/warp-tech/warpgate), świetnie współdziała z Tabby, pokochasz go!
|
||||||
|
|
||||||
|
> 👋 [Tabby-Web](https://github.com/Eugeny/tabby-web) poszukuje sponsorów. Nie jestem w stanie pokryć kosztów hostowania całej infrastruktury, jeśli jesteś zainteresowany wsparciem, proszę [skontakuj się ze mną!](https://twitter.com/eugeeeeny)
|
||||||
|
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### Pobieranie:
|
||||||
|
|
||||||
|
* [Ostatnie wydania](https://github.com/Eugeny/tabby/releases/latest)
|
||||||
|
* [Repozytoria](https://packagecloud.io/eugeny/tabby): [Systemy Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [Środowiska RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||||
|
* [Ostatnie wydania developerskie](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<p align="center">
|
||||||
|
Ten plik README jest również dostępny w językach: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">🇧🇷 Português</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
[**Tabby**](https://tabby.sh) (formalnie **Terminus**) to wysoce konfigurowalny emulator konsoli, SSH oraz klienta konsoli szeregowej na systemy Windows 10, macOS oraz Linux
|
||||||
|
|
||||||
|
* Zintegrowany klient SSH i Telnet oraz menedżer sesji
|
||||||
|
* Zintegrowany klient terminala szeregowego
|
||||||
|
* Motywy and palety kolorów
|
||||||
|
* W pełni konfigurowalne skróty klawiszowe
|
||||||
|
* Dzielenie ekranu
|
||||||
|
* Zapamiętywanie okien z poprzednich sesji
|
||||||
|
* PowerShell (oraz PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder i wsparcie dla CMD
|
||||||
|
* Bezpośredni transfer plików sesji SSH przez Zmodem
|
||||||
|
* Pełne wsparcie dla znaków Unicode wraz z podwójnymi znakami
|
||||||
|
* Nie zawieszanie się przy szybko wyświetlanych wynikach
|
||||||
|
* Pełne doświadczenie powłoki na systemie Windows zawierającej podpowiedzi (przez Clink)
|
||||||
|
* Zintegrowany zaszyfrowany kontener na klucze SSH i jego konfigurację
|
||||||
|
* Klient SSH, SFTP oraz Telnet dostępny jako [aplikacja webowa](https://tabby.sh/app) (również jako [własna instacja](https://github.com/Eugeny/tabby-web)).
|
||||||
|
|
||||||
|
# Spis treści <!-- omit in toc -->
|
||||||
|
|
||||||
|
- [Czym jest, a czym nie jest Tabby](#what-tabby-is-and-isnt)
|
||||||
|
- [Funkcje konsoli](#terminal-features)
|
||||||
|
- [Klient SSH](#ssh-client)
|
||||||
|
- [Konsola szeregowa](#serial-terminal)
|
||||||
|
- [Wersja przenośna](#portable)
|
||||||
|
- [Wtyczki](#plugins)
|
||||||
|
- [Motywy i palety kolorów](#themes)
|
||||||
|
- [Współtworzenie](#contributing)
|
||||||
|
|
||||||
|
<a name="about"></a>
|
||||||
|
|
||||||
|
# Czym jest, a czym nie jest Tabby
|
||||||
|
|
||||||
|
* **Tabby jest** alternatywą dla standardowej konsoli Windows (conhost), PowerShell ISE, PuTTY, Terminal.app oraz iTerm z macOS
|
||||||
|
|
||||||
|
* **Tabby nie jest** nową powłoką lub zamiennikiem dla MinGW czy Cygwin. Nie jest również zatrważająco szybki - jeśli ważne jest dla Ciebie użycie pamięci RAM, rozważ użycie [Conemu](https://conemu.github.io) lub [Alacritty](https://github.com/jwilm/alacritty)
|
||||||
|
|
||||||
|
<a name="terminal"></a>
|
||||||
|
|
||||||
|
# Funkcje konsoli
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* Konsola V220 + wiele rozszerzeń
|
||||||
|
* Wiele nakładających się podzielonych okien
|
||||||
|
* Okna na każdej stronie ekranu
|
||||||
|
* Opcjonalne dokowanie okna za pomocą skrótu ("Quake console")
|
||||||
|
* Wykrywanie postępu (Pasek)
|
||||||
|
* Powiadomienia przy ukończeniu procesu podczas postępu
|
||||||
|
* Wklejanie z nawiasami, ostrzeżenie przy wielu liniach
|
||||||
|
* Wsparcie różnych czcionek
|
||||||
|
* Niestandardowe profile powłoki
|
||||||
|
* Opcjonalne wklejanie PPM oraz kopiowanie na zaznaczeniu (Styl PuTTY)
|
||||||
|
|
||||||
|
<a name="ssh"></a>
|
||||||
|
|
||||||
|
# Klient SSH
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* Klient SSH2 z zarządzaniem połączeń
|
||||||
|
* X11 oraz przekierowywanie portów
|
||||||
|
* Automatyczne przejście między hostami
|
||||||
|
* Przekierowanie agenta (Pageant oraz Windowsowy natywny "OpenSSH Agent")
|
||||||
|
* Skrypty logowania
|
||||||
|
|
||||||
|
<a name="serial"></a>
|
||||||
|
|
||||||
|
# Konsola Szeregowa
|
||||||
|
|
||||||
|
* Zapisane połączenia
|
||||||
|
* Wczytywanie danych wejścia linii
|
||||||
|
* Opcjonalna konwersja danych wejścia i wyjścia na szesnastkowe "byte-by-byte"
|
||||||
|
* Konwersja na nową linię
|
||||||
|
* Automatyczne połączenie po rozłączeniu
|
||||||
|
|
||||||
|
<a name="portable"></a>
|
||||||
|
|
||||||
|
# Wersja przenośna
|
||||||
|
|
||||||
|
Tabby będzie uruchamiał się jako aplikacja przenośna, tylko wtedy, kiedy utworzysz folder `data` w tej samej lokacji, w której znajduje się `Tabby.exe`.
|
||||||
|
|
||||||
|
<a name="plugins"></a>
|
||||||
|
|
||||||
|
# Wtyczki
|
||||||
|
|
||||||
|
Wtyczki (jak i motywy) mogą być instalowane bezpośrednio z widoku ustawień w środku aplikacji Tabby.
|
||||||
|
|
||||||
|
* [docker](https://github.com/Eugeny/tabby-docker) - połączenie z kontenerami Docker
|
||||||
|
* [title-control](https://github.com/kbjr/terminus-title-control) - pozwala na zmienianie tytułu konsoli jako prefiks, sufiks lub/albo tekst do usunięcia
|
||||||
|
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - szybko wysyłaj komendy z jednej konsoli do wielu
|
||||||
|
* [save-output](https://github.com/Eugeny/tabby-save-output) - zapisuj dane wyjściowe do pliku
|
||||||
|
* [sync-config](https://github.com/starxg/terminus-sync-config) - synchronizuj konfigurację przez Gista lub Gitee
|
||||||
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - przykładowa wtyczka, która zwyczajnie denerwuje
|
||||||
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - pozwala na utworzenie niestandardowego profilu pracy w aplikacji odpowiednio do konfiguracji
|
||||||
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - otwiera domyślną przeglądarkę z zaznaczonym tekstem w oknie Tabby
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - otwiera okno z połączeniem SFTP dla połączeń SSH jak SecureCRT
|
||||||
|
* [background](https://github.com/moemoechu/tabby-background) - zmień tło Tabby oraz wiele więcej
|
||||||
|
* [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin
|
||||||
|
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - okienka autoryzacji wewnątrz konsoli (Zbudowany głównie pod autoryzację projektu Warpgate w przeglądarce)
|
||||||
|
|
||||||
|
<a name="themes"></a>
|
||||||
|
|
||||||
|
# Motywy i palety kolorów
|
||||||
|
|
||||||
|
* [hype](https://github.com/Eugeny/tabby-theme-hype) - Motyw zainspirowany konsolą "Hyper"
|
||||||
|
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Motyw "pełnej relaksacji"
|
||||||
|
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) - Motyw zainspirowany konsolą "Hyper" (kolejny)
|
||||||
|
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10) - Motyw zainspirowany Microsoftem
|
||||||
|
* [altair](https://github.com/yxuko/terminus-altair) - Motwy autorstwa Yacine Kanzari
|
||||||
|
* [catppuccin](https://github.com/catppuccin/tabby) - Paleta pastelowa dla Tabby
|
||||||
|
* [noctis](https://github.com/aaronhuggins/tabby-colors-noctis) - Paleta kolorów zainspirowana motywem Noctis z VS Code
|
||||||
|
|
||||||
|
# Sponsorzy <!-- omit in toc -->
|
||||||
|
|
||||||
|
[](https://packagecloud.io)
|
||||||
|
|
||||||
|
[**packagecloud**](https://packagecloud.io) zapewnia darmowe utrzymanie repozytorium Debian/RPM
|
||||||
|
|
||||||
|
[](https://keygen.sh/?via=eugene)
|
||||||
|
|
||||||
|
[**keygen**](https://keygen.sh/?via=eugene) zapewnia darmowe wydawanie oraz automatycznie utrzymywanie strony
|
||||||
|
|
||||||
|
<a name="contributing"></a>
|
||||||
|
# Współtworzenie
|
||||||
|
|
||||||
|
Pull requesty and dodawanie nowych wtyczek jest mile widziane!
|
||||||
|
|
||||||
|
Zobacz plik [HAKOWANIE.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) oraz [Dokumentację API](https://docs.tabby.sh/), aby poznać, jak projekt jest prowadzony wraz ze wstępnym poradnikiem jak tworzyć wtyczki.
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="contributors"></a>
|
||||||
|
|
||||||
|
Dziękujemy wszystkim osobom współtworzącym ten projekt ([emotki są specjalizacją](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt="Russell Myers"/><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" valign="top" width="14.28%"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt="Austin Warren"/><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" valign="top" width="14.28%"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt="Felicia Hummel"/><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" valign="top" width="14.28%"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt="Mike MacCana"/><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" valign="top" width="14.28%"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt="Yacine Kanzari"/><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" valign="top" width="14.28%"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt="BBJip"/><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" valign="top" width="14.28%"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt="Futagirl"/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt="Levin Rickert"/><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" valign="top" width="14.28%"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt="OJ Kwon"/><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" valign="top" width="14.28%"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt="domain"/><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" valign="top" width="14.28%"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt="James Brumond"/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt="Daniel Imms"/><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" valign="top" width="14.28%"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt="Florian Bachmann"/><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" valign="top" width="14.28%"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt="Michael Kühnel"/><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" valign="top" width="14.28%"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt="Tilmann Meyer"/><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" valign="top" width="14.28%"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt="PM Extra"/><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" valign="top" width="14.28%"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt="Jonathan"/><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" valign="top" width="14.28%"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt="Hans Koch"/><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" valign="top" width="14.28%"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt="Dak Smyth"/><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" valign="top" width="14.28%"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt="Wang Zhi"/><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" valign="top" width="14.28%"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt="jack1142"/><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" valign="top" width="14.28%"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt="Howie Douglas"/><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" valign="top" width="14.28%"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt="Chris Kaczor"/><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" valign="top" width="14.28%"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt="Johannes Kadak"/><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" valign="top" width="14.28%"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt="LeSeulArtichaut"/><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" valign="top" width="14.28%"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt="Cyril Taylor"/><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" valign="top" width="14.28%"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt="nstefanou"/><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" valign="top" width="14.28%"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt="orin220444"/><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" valign="top" width="14.28%"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt="Gobius Dolhain"/><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" valign="top" width="14.28%"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt="Gwilherm Folliot"/><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" valign="top" width="14.28%"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt="Dmitry Pronin"/><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" valign="top" width="14.28%"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt="Jonathan Beverley"/><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" valign="top" width="14.28%"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt="Zenghai Liang"/><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" valign="top" width="14.28%"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt="Mateusz Tracz"/><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" valign="top" width="14.28%"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt="pinpin"/><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" valign="top" width="14.28%"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt="Takuro Onoda"/><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" valign="top" width="14.28%"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt="frauhottelmann"/><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" valign="top" width="14.28%"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt="Piotr Patalong"/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt="Clark Wang"/><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" valign="top" width="14.28%"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt="iamchating"/><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" valign="top" width="14.28%"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt="starxg"/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt="Alisue"/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt="Dominic Yin"/><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" valign="top" width="14.28%"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt="Brandon Rothweiler"/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt="Logic Machine"/><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" valign="top" width="14.28%"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt="cypherbits"/><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" valign="top" width="14.28%"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt="Matthew Davidson"/><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" valign="top" width="14.28%"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt="Alexander Wiedemann"/><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" valign="top" width="14.28%"><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" valign="top" width="14.28%"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt="zZ"/><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" valign="top" width="14.28%"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt="Aaron Davison"/><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" valign="top" width="14.28%"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt="Przemyslaw Kozik"/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt="Alfredo Arellano de la Fuente"/><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" valign="top" width="14.28%"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt="MH Kim"/><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" valign="top" width="14.28%"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt="Marmota"/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt="Ares Andrew"/><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" valign="top" width="14.28%"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt="George Korsnick"/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt="Artem Smirnov"/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt="Tim Kopplow"/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt="mrthock"/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt="Lukas Rottach"/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt="boonkerz"/><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" valign="top" width="14.28%"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt="Milo Ivir"/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt="JasonCubic"/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt="MaxWaldorf"/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt="Matheus Castello"/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt="Jai A P"/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt="Richard Yu"/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt="artu-ole"/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt="Timofey Gribanov"/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt="Christian Bingman"/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt="zhipeng"/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt="woodmeal"/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt="MagicLike"/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt="Hisam Fahri"/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt="Liangcheng Juves"/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt="Atte Timonen"/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/joaolmpinto/"><img src="https://avatars.githubusercontent.com/u/1143125?v=4?s=100" width="100px;" alt="João Pinto"/><br /><sub><b>João Pinto</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joaompinto" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Qiming-Liu"><img src="https://avatars.githubusercontent.com/u/68600416?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Qiming-Liu" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://74th.tech/"><img src="https://avatars.githubusercontent.com/u/1060011?v=4?s=100" width="100px;" alt="Atsushi Morimoto"/><br /><sub><b>Atsushi Morimoto</b></sub></a><br /><a href="#financial-74th" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://arles.red/"><img src="https://avatars.githubusercontent.com/u/5369096?v=4?s=100" width="100px;" alt="Arles"/><br /><sub><b>Arles</b></sub></a><br /><a href="#financial-aarles" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://pentestbook.six2dez.com/"><img src="https://avatars.githubusercontent.com/u/24670991?v=4?s=100" width="100px;" alt="six2dez"/><br /><sub><b>six2dez</b></sub></a><br /><a href="#financial-six2dez" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CandiceJoy"><img src="https://avatars.githubusercontent.com/u/8854890?v=4?s=100" width="100px;" alt="Candice"/><br /><sub><b>Candice</b></sub></a><br /><a href="#financial-CandiceJoy" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kingrowen"><img src="https://avatars.githubusercontent.com/u/13178700?v=4?s=100" width="100px;" alt="Rowen Willabus"/><br /><sub><b>Rowen Willabus</b></sub></a><br /><a href="#financial-kingrowen" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Sky" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FrancisHG"><img src="https://avatars.githubusercontent.com/u/1611626?v=4?s=100" width="100px;" alt="Francis Gelderloos"/><br /><sub><b>Francis Gelderloos</b></sub></a><br /><a href="#financial-FrancisHG" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/astromasoud"><img src="https://avatars.githubusercontent.com/u/18737721?v=4?s=100" width="100px;" alt="astromasoud"/><br /><sub><b>astromasoud</b></sub></a><br /><a href="#financial-astromasoud" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://spirit55555.dk/"><img src="https://avatars.githubusercontent.com/u/2357565?v=4?s=100" width="100px;" alt="Anders G. Jørgensen"/><br /><sub><b>Anders G. Jørgensen</b></sub></a><br /><a href="#financial-Spirit55555" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/djradon"><img src="https://avatars.githubusercontent.com/u/5224156?v=4?s=100" width="100px;" alt="Dave Richardson"/><br /><sub><b>Dave Richardson</b></sub></a><br /><a href="#financial-djradon" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/tpberntsen"><img src="https://avatars.githubusercontent.com/u/922318?v=4?s=100" width="100px;" alt="Thomas Peter Berntsen"/><br /><sub><b>Thomas Peter Berntsen</b></sub></a><br /><a href="#financial-tpberntsen" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=eltociear" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giejqf"><img src="https://avatars.githubusercontent.com/u/9211230?v=4?s=100" width="100px;" alt="giejqf"/><br /><sub><b>giejqf</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=giejqf" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LacazeThomas"><img src="https://avatars.githubusercontent.com/u/19855907?v=4?s=100" width="100px;" alt="Thomas LACAZE"/><br /><sub><b>Thomas LACAZE</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LacazeThomas" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://pochen.me/"><img src="https://avatars.githubusercontent.com/u/1329716?v=4?s=100" width="100px;" alt="Po Chen"/><br /><sub><b>Po Chen</b></sub></a><br /><a href="#financial-princemaple" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://victorchandra.carrd.co/"><img src="https://avatars.githubusercontent.com/u/41635105?v=4?s=100" width="100px;" alt="Victor Chandra"/><br /><sub><b>Victor Chandra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mzmznasipadang" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/daniel347x"><img src="https://avatars.githubusercontent.com/u/309746?v=4?s=100" width="100px;" alt="Dan Nissenbaum"/><br /><sub><b>Dan Nissenbaum</b></sub></a><br /><a href="#financial-daniel347x" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DunklerPhoenix"><img src="https://avatars.githubusercontent.com/u/1261305?v=4?s=100" width="100px;" alt="RogueThorn"/><br /><sub><b>RogueThorn</b></sub></a><br /><a href="#financial-DunklerPhoenix" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://spenserblack.github.io"><img src="https://avatars.githubusercontent.com/u/8546709?v=4?s=100" width="100px;" alt="Spenser Black"/><br /><sub><b>Spenser Black</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=spenserblack" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zuedev"><img src="https://avatars.githubusercontent.com/u/24614929?v=4?s=100" width="100px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="#financial-zuedev" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Cola" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.stackscale.com/"><img src="https://avatars.githubusercontent.com/u/195768?v=4?s=100" width="100px;" alt="David Carrero"/><br /><sub><b>David Carrero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dcarrero" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhoro"><img src="https://avatars.githubusercontent.com/u/1105687?v=4?s=100" width="100px;" alt="Andrii Zhovtiak"/><br /><sub><b>Andrii Zhovtiak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zhoro" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JohnMasoner"><img src="https://avatars.githubusercontent.com/u/42313377?v=4?s=100" width="100px;" alt="Mason Ma"/><br /><sub><b>Mason Ma</b></sub></a><br /><a href="#financial-JohnMasoner" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ntimo"><img src="https://avatars.githubusercontent.com/u/6145026?v=4?s=100" width="100px;" alt="Timo"/><br /><sub><b>Timo</b></sub></a><br /><a href="#financial-ntimo" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/evinwatson/"><img src="https://avatars.githubusercontent.com/u/24227251?v=4?s=100" width="100px;" alt="Evin Watson"/><br /><sub><b>Evin Watson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=EvinRWatson" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://t.me/hendrjl"><img src="https://avatars.githubusercontent.com/u/15981200?v=4?s=100" width="100px;" alt="Hendra Juli"/><br /><sub><b>Hendra Juli</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=deulizealand" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wkricowski"><img src="https://avatars.githubusercontent.com/u/36803521?v=4?s=100" width="100px;" alt="Wellinton Kricowski"/><br /><sub><b>Wellinton Kricowski</b></sub></a><br /><a href="#financial-wkricowski" title="Financial">💵</a> <a href="https://github.com/Eugeny/tabby/commits?author=wkricowski" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/almzau"><img src="https://avatars.githubusercontent.com/u/29115846?v=4?s=100" width="100px;" alt="Allan"/><br /><sub><b>Allan</b></sub></a><br /><a href="#design-almzau" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://oidamo.de"><img src="https://avatars.githubusercontent.com/u/17959794?v=4?s=100" width="100px;" alt="Benjamin Brandmeier"/><br /><sub><b>Benjamin Brandmeier</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BenjaminBrandmeier" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/patric1025"><img src="https://avatars.githubusercontent.com/u/65654040?v=4?s=100" width="100px;" alt="patric1025"/><br /><sub><b>patric1025</b></sub></a><br /><a href="#translation-patric1025" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hermitpopcorn"><img src="https://avatars.githubusercontent.com/u/16042129?v=4?s=100" width="100px;" alt="hermitpopcorn"/><br /><sub><b>hermitpopcorn</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hermitpopcorn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://joshuatz.com/"><img src="https://avatars.githubusercontent.com/u/17817563?v=4?s=100" width="100px;" alt="Joshua Tzucker"/><br /><sub><b>Joshua Tzucker</b></sub></a><br /><a href="#financial-joshuatz" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luxifr"><img src="https://avatars.githubusercontent.com/u/665715?v=4?s=100" width="100px;" alt="luxifr"/><br /><sub><b>luxifr</b></sub></a><br /><a href="#financial-luxifr" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ukulanne"><img src="https://avatars.githubusercontent.com/u/28586666?v=4?s=100" width="100px;" alt="Anne Summers"/><br /><sub><b>Anne Summers</b></sub></a><br /><a href="#financial-ukulanne" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Clem-Fern"><img src="https://avatars.githubusercontent.com/u/20025949?v=4?s=100" width="100px;" alt="Clem"/><br /><sub><b>Clem</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Clem-Fern" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/elizabeth-dev"><img src="https://avatars.githubusercontent.com/u/13015727?v=4?s=100" width="100px;" alt="Elizabeth Martín Campos"/><br /><sub><b>Elizabeth Martín Campos</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=elizabeth-dev" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/siccous"><img src="https://avatars.githubusercontent.com/u/7812885?v=4?s=100" width="100px;" alt="Tomáš Hruška"/><br /><sub><b>Tomáš Hruška</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siccous" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karaketir16"><img src="https://avatars.githubusercontent.com/u/27349806?v=4?s=100" width="100px;" alt="Osman Karaketir"/><br /><sub><b>Osman Karaketir</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=karaketir16" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.gnomegarden.io/"><img src="https://avatars.githubusercontent.com/u/33667144?v=4?s=100" width="100px;" alt="Crypto Gnome"/><br /><sub><b>Crypto Gnome</b></sub></a><br /><a href="#financial-CryptoGnome" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rbukovansky"><img src="https://avatars.githubusercontent.com/u/1004491?v=4?s=100" width="100px;" alt="Richard Bukovansky"/><br /><sub><b>Richard Bukovansky</b></sub></a><br /><a href="#financial-rbukovansky" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pseudocc"><img src="https://avatars.githubusercontent.com/u/85104110?v=4?s=100" width="100px;" alt="catlas"/><br /><sub><b>catlas</b></sub></a><br /><a href="#financial-pseudocc" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://kapocsi.ca"><img src="https://avatars.githubusercontent.com/u/84490604?v=4?s=100" width="100px;" alt="Thomas Kapocsi"/><br /><sub><b>Thomas Kapocsi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Kapocsi" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://dylhack.dev/"><img src="https://avatars.githubusercontent.com/u/27179786?v=4?s=100" width="100px;" alt="Dylan Hackworth"/><br /><sub><b>Dylan Hackworth</b></sub></a><br /><a href="#financial-dylhack" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/echo304"><img src="https://avatars.githubusercontent.com/u/16456651?v=4?s=100" width="100px;" alt="Sangboak Lee"/><br /><sub><b>Sangboak Lee</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=echo304" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qyecst"><img src="https://avatars.githubusercontent.com/u/13901864?v=4?s=100" width="100px;" alt="qyecst"/><br /><sub><b>qyecst</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=qyecst" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DehanLUO"><img src="https://avatars.githubusercontent.com/u/53093688?v=4?s=100" width="100px;" alt="Han"/><br /><sub><b>Han</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=DehanLUO" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
Ten projekt podlega specyfikacji [dla współautorów](https://github.com/all-contributors/all-contributors). Wszelkiego rodzaju przyczynianie się do rozwoju jest tu mile widziane!
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Esse README também está disponível em: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a>
|
Esse README também está disponível em: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -120,6 +120,7 @@ Plugins e temas podem ser instalados durante a execução na pagina de configura
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - um plugin de exemplo que te incomoda o tempo todo
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - um plugin de exemplo que te incomoda o tempo todo
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite criar perfis de espaço de trabalho personalizados com base na configuração fornecida
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite criar perfis de espaço de trabalho personalizados com base na configuração fornecida
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre o navegador padrão do sistema com um texto selecionado na guia do Tabby
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre o navegador padrão do sistema com um texto selecionado na guia do Tabby
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
|
|
||||||
@@ -245,7 +246,7 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -329,6 +330,22 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Этот README также доступен на: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
Этот README также доступен на: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
[**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux:
|
[**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux:
|
||||||
|
|
||||||
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
|
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
|
||||||
* Встроенный последовтаельный терминал;
|
* Встроенный последовательный терминал;
|
||||||
* Темы и цветовые схемы;
|
* Темы и цветовые схемы;
|
||||||
* Полностью настраеваемые сочетания клавиш;
|
* Полностью настраеваемые сочетания клавиш;
|
||||||
* Панели;
|
* Панели;
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
* Полная поддержка Unicode, включая символы двойной ширины;
|
* Полная поддержка Unicode, включая символы двойной ширины;
|
||||||
* Не задыхается при быстром выводе;
|
* Не задыхается при быстром выводе;
|
||||||
* Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink);
|
* Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink);
|
||||||
* Втроенное защищённое хранилище для SSH-ключей и настроек;
|
* Встроенное защищённое хранилище для SSH-ключей и настроек;
|
||||||
* SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)).
|
* SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)).
|
||||||
|
|
||||||
# Содержание <!-- omit in toc -->
|
# Содержание <!-- omit in toc -->
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
* Деление окна на несколько панелей;
|
* Деление окна на несколько панелей;
|
||||||
* Вкладки на любой стороне окна;
|
* Вкладки на любой стороне окна;
|
||||||
* Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»);
|
* Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»);
|
||||||
* Определение прогресса процесса;
|
* Определение прогресса выполняемого процесса;
|
||||||
* Уведомления о завершении процессов;
|
* Уведомления о завершении процессов;
|
||||||
* Защита от выполнения команд при вставке, предупреждения о вставке нескольких строк;
|
* Защита от выполнения команд при вставке, предупреждения о вставке нескольких строк;
|
||||||
* Лигатуры шрифтов;
|
* Лигатуры шрифтов;
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
|
|
||||||
* Сохранение соединений;
|
* Сохранение соединений;
|
||||||
* Поддержка ввода readline;
|
* Поддержка ввода readline;
|
||||||
* Опциональый побатный ввод HEX и вывод hexdump;
|
* Опциональный побатный ввод HEX и вывод hexdump;
|
||||||
* Преобразование newline;
|
* Преобразование newline;
|
||||||
* Автоматическое восстановление соединения.
|
* Автоматическое восстановление соединения.
|
||||||
|
|
||||||
@@ -115,8 +115,9 @@
|
|||||||
* [save-output](https://github.com/Eugeny/tabby-save-output) — запись вывода терминала в файл;
|
* [save-output](https://github.com/Eugeny/tabby-save-output) — запись вывода терминала в файл;
|
||||||
* [sync-config](https://github.com/starxg/terminus-sync-config) — синхронизация конфига в Gist или Gitee;
|
* [sync-config](https://github.com/starxg/terminus-sync-config) — синхронизация конфига в Gist или Gitee;
|
||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) — плагин-пример, который постоянно будет вас бесить;
|
* [clippy](https://github.com/Eugeny/tabby-clippy) — плагин-пример, который постоянно будет вас бесить;
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские провили рабочего окружеиня на основе конфига;
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские профили рабочего окружения на основе конфига;
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby.
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby.
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - открывает sftp вкладку для ssh соединения, похож на SecureCRT
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
# Темы
|
# Темы
|
||||||
@@ -237,7 +238,7 @@ Pull-запросы и плагины приветствуются!
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -321,6 +322,22 @@ Pull-запросы и плагины приветствуются!
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
本 README 还适用于以下语言: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
本 README 还适用于以下语言: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
----
|
----
|
||||||
@@ -116,6 +116,7 @@
|
|||||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - 一个可以一直烦你的示例插件
|
* [clippy](https://github.com/Eugeny/tabby-clippy) - 一个可以一直烦你的示例插件
|
||||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件
|
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件
|
||||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器
|
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器
|
||||||
|
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - 为ssh连接打开类似SecureCRT的sftp标签页
|
||||||
|
|
||||||
<a name="themes"></a>
|
<a name="themes"></a>
|
||||||
# 主题
|
# 主题
|
||||||
@@ -236,7 +237,7 @@
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -320,6 +321,22 @@
|
|||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -183,9 +183,10 @@ export class Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enableTray (): void {
|
enableTray (): void {
|
||||||
if (this.tray || process.platform === 'linux') {
|
if (!!this.tray || process.platform === 'linux' || (this.configStore.hideTray ?? false) === true) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
this.tray = new Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`)
|
this.tray = new Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`)
|
||||||
this.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`)
|
this.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`)
|
||||||
|
@@ -28,6 +28,16 @@ export function parseArgs (argv: string[], cwd: string): any {
|
|||||||
.command('recent [index]', 'open a tab with a recent profile', {
|
.command('recent [index]', 'open a tab with a recent profile', {
|
||||||
profileNumber: { type: 'number' },
|
profileNumber: { type: 'number' },
|
||||||
})
|
})
|
||||||
|
.command('quickConnect <providerId> <query>', 'open a tab for specified quick connect provider', yargs => {
|
||||||
|
return yargs.positional('providerId', {
|
||||||
|
describe: 'The name of a quick connect profile provider',
|
||||||
|
type: 'string',
|
||||||
|
choices: ['ssh', 'telnet'],
|
||||||
|
}).positional('query', {
|
||||||
|
describe: 'The quick connect query string',
|
||||||
|
type: 'string',
|
||||||
|
})
|
||||||
|
})
|
||||||
.version(app.getVersion())
|
.version(app.getVersion())
|
||||||
.option('debug', {
|
.option('debug', {
|
||||||
alias: 'd',
|
alias: 'd',
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as yaml from 'js-yaml'
|
import * as yaml from 'js-yaml'
|
||||||
import { app } from 'electron'
|
|
||||||
import { writeFile } from 'atomically'
|
import { writeFile } from 'atomically'
|
||||||
|
|
||||||
|
|
||||||
|
export const configPath = path.join(process.env.TABBY_CONFIG_DIRECTORY!, 'config.yaml')
|
||||||
|
const legacyConfigPath = path.join(process.env.TABBY_CONFIG_DIRECTORY!, '../terminus', 'config.yaml')
|
||||||
|
|
||||||
|
|
||||||
export function migrateConfig (): void {
|
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) && (
|
if (fs.existsSync(legacyConfigPath) && (
|
||||||
!fs.existsSync(configPath) ||
|
!fs.existsSync(configPath) ||
|
||||||
fs.statSync(configPath).mtime < fs.statSync(legacyConfigPath).mtime
|
fs.statSync(configPath).mtime < fs.statSync(legacyConfigPath).mtime
|
||||||
@@ -19,7 +20,6 @@ export function migrateConfig (): void {
|
|||||||
export function loadConfig (): any {
|
export function loadConfig (): any {
|
||||||
migrateConfig()
|
migrateConfig()
|
||||||
|
|
||||||
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'))
|
||||||
} else {
|
} else {
|
||||||
@@ -27,8 +27,6 @@ export function loadConfig (): any {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
|
||||||
|
|
||||||
export async function saveConfig (content: string): Promise<void> {
|
export async function saveConfig (content: string): Promise<void> {
|
||||||
await writeFile(configPath, content, { encoding: 'utf8' })
|
await writeFile(configPath, content, { encoding: 'utf8' })
|
||||||
await writeFile(configPath + '.backup', content, { encoding: 'utf8' })
|
await writeFile(configPath + '.backup', content, { encoding: 'utf8' })
|
||||||
|
@@ -1,17 +1,23 @@
|
|||||||
import 'v8-compile-cache'
|
import { app, ipcMain, Menu, dialog } from 'electron'
|
||||||
|
|
||||||
|
// set userData Path on portable version
|
||||||
import './portable'
|
import './portable'
|
||||||
|
|
||||||
|
// set defaults of environment variables
|
||||||
|
import 'dotenv/config'
|
||||||
|
process.env.TABBY_PLUGINS ??= ''
|
||||||
|
process.env.TABBY_CONFIG_DIRECTORY ??= app.getPath('userData')
|
||||||
|
|
||||||
|
|
||||||
|
import 'v8-compile-cache'
|
||||||
import 'source-map-support/register'
|
import 'source-map-support/register'
|
||||||
import './sentry'
|
import './sentry'
|
||||||
import './lru'
|
import './lru'
|
||||||
import { app, ipcMain, Menu, dialog } from 'electron'
|
|
||||||
import { parseArgs } from './cli'
|
import { parseArgs } from './cli'
|
||||||
import { Application } from './app'
|
import { Application } from './app'
|
||||||
import electronDebug = require('electron-debug')
|
import electronDebug = require('electron-debug')
|
||||||
import { loadConfig } from './config'
|
import { loadConfig } from './config'
|
||||||
|
|
||||||
if (!process.env.TABBY_PLUGINS) {
|
|
||||||
process.env.TABBY_PLUGINS = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
const argv = parseArgs(process.argv, process.cwd())
|
const argv = parseArgs(process.argv, process.cwd())
|
||||||
|
|
||||||
@@ -25,6 +31,8 @@ try {
|
|||||||
app.exit(1)
|
app.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process.mainModule = module
|
||||||
|
|
||||||
const application = new Application(configStore)
|
const application = new Application(configStore)
|
||||||
|
|
||||||
ipcMain.on('app:new-window', () => {
|
ipcMain.on('app:new-window', () => {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import * as glasstron from 'glasstron'
|
import * as glasstron from 'glasstron'
|
||||||
|
import { autoUpdater } from 'electron-updater'
|
||||||
import { Subject, Observable, debounceTime } from 'rxjs'
|
import { Subject, Observable, debounceTime } from 'rxjs'
|
||||||
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents } from 'electron'
|
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents } from 'electron'
|
||||||
import ElectronConfig = require('electron-config')
|
import ElectronConfig = require('electron-config')
|
||||||
@@ -26,7 +26,7 @@ abstract class GlasstronWindow extends BrowserWindow {
|
|||||||
abstract setBlur (_: boolean)
|
abstract setBlur (_: boolean)
|
||||||
}
|
}
|
||||||
|
|
||||||
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'under-window' : 'dark' : null
|
const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null
|
||||||
|
|
||||||
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
|
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
|
||||||
|
|
||||||
@@ -159,6 +159,7 @@ export class Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.setupWindowManagement()
|
this.setupWindowManagement()
|
||||||
|
this.setupUpdater()
|
||||||
|
|
||||||
this.ready = new Promise(resolve => {
|
this.ready = new Promise(resolve => {
|
||||||
const listener = event => {
|
const listener = event => {
|
||||||
@@ -346,11 +347,8 @@ export class Window {
|
|||||||
this.send('host:window-focused')
|
this.send('host:window-focused')
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('ready', event => {
|
this.on('ready', () => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
this.window?.webContents.send('start', {
|
||||||
return
|
|
||||||
}
|
|
||||||
this.window.webContents.send('start', {
|
|
||||||
config: this.configStore,
|
config: this.configStore,
|
||||||
executable: app.getPath('exe'),
|
executable: app.getPath('exe'),
|
||||||
windowID: this.window.id,
|
windowID: this.window.id,
|
||||||
@@ -359,75 +357,51 @@ export class Window {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-minimize', event => {
|
this.on('window-minimize', () => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
this.window?.minimize()
|
||||||
return
|
|
||||||
}
|
|
||||||
this.window.minimize()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-bounds', (event, bounds) => {
|
this.on('window-set-bounds', (_, bounds) => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
this.window?.setBounds(bounds)
|
||||||
return
|
|
||||||
}
|
|
||||||
this.window.setBounds(bounds)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-always-on-top', (event, flag) => {
|
this.on('window-set-always-on-top', (_, flag) => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
this.window?.setAlwaysOnTop(flag)
|
||||||
return
|
|
||||||
}
|
|
||||||
this.window.setAlwaysOnTop(flag)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-vibrancy', (event, enabled, type) => {
|
this.on('window-set-vibrancy', (_, enabled, type) => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.setVibrancy(enabled, type)
|
this.setVibrancy(enabled, type)
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-window-controls-color', (event, theme) => {
|
this.on('window-set-window-controls-color', (_, theme) => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
if (process.platform === 'win32') {
|
||||||
return
|
const symbolColor: string = theme.foreground
|
||||||
|
this.window?.setTitleBarOverlay(
|
||||||
|
{
|
||||||
|
symbolColor: symbolColor,
|
||||||
|
height: 32,
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const symbolColor: string = theme.foreground
|
|
||||||
|
|
||||||
this.window.setTitleBarOverlay(
|
|
||||||
{
|
|
||||||
symbolColor: symbolColor,
|
|
||||||
height: 32,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-title', (event, title) => {
|
this.on('window-set-title', (_, title) => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
this.window?.setTitle(title)
|
||||||
return
|
|
||||||
}
|
|
||||||
this.window.setTitle(title)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-bring-to-front', event => {
|
this.on('window-bring-to-front', () => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
if (this.window?.isMinimized()) {
|
||||||
return
|
|
||||||
}
|
|
||||||
if (this.window.isMinimized()) {
|
|
||||||
this.window.restore()
|
this.window.restore()
|
||||||
}
|
}
|
||||||
this.present()
|
this.present()
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-close', event => {
|
this.on('window-close', () => {
|
||||||
if (!this.window || event.sender !== this.window.webContents) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.closing = true
|
this.closing = true
|
||||||
this.window.close()
|
this.window.close()
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-touch-bar', (_event, segments, selectedIndex) => {
|
this.on('window-set-touch-bar', (_, segments, selectedIndex) => {
|
||||||
this.touchBarControl.segments = segments.map(s => ({
|
this.touchBarControl.segments = segments.map(s => ({
|
||||||
label: s.label,
|
label: s.label,
|
||||||
icon: s.hasActivity ? activityIcon : undefined,
|
icon: s.hasActivity ? activityIcon : undefined,
|
||||||
@@ -467,8 +441,46 @@ export class Window {
|
|||||||
this.window.setOpacity(opacity)
|
this.window.setOpacity(opacity)
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('window-set-progress-bar', (_event, value) => {
|
this.on('window-set-progress-bar', (_, value) => {
|
||||||
this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
this.window?.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
on (event: string, listener: (...args: any[]) => void): void {
|
||||||
|
ipcMain.on(event, (e, ...args) => {
|
||||||
|
if (!this.window || e.sender !== this.window.webContents) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
listener(e, ...args)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private setupUpdater () {
|
||||||
|
autoUpdater.autoDownload = true
|
||||||
|
autoUpdater.autoInstallOnAppQuit = true
|
||||||
|
|
||||||
|
autoUpdater.on('update-available', () => {
|
||||||
|
this.send('updater:update-available')
|
||||||
|
})
|
||||||
|
|
||||||
|
autoUpdater.on('update-not-available', () => {
|
||||||
|
this.send('updater:update-not-available')
|
||||||
|
})
|
||||||
|
|
||||||
|
autoUpdater.on('error', err => {
|
||||||
|
this.send('updater:error', err)
|
||||||
|
})
|
||||||
|
|
||||||
|
autoUpdater.on('update-downloaded', () => {
|
||||||
|
this.send('updater:update-downloaded')
|
||||||
|
})
|
||||||
|
|
||||||
|
this.on('updater:check-for-updates', () => {
|
||||||
|
autoUpdater.checkForUpdates()
|
||||||
|
})
|
||||||
|
|
||||||
|
this.on('updater:quit-and-install', () => {
|
||||||
|
autoUpdater.quitAndInstall()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"watch": "webpack --progress --color --watch"
|
"watch": "webpack --progress --color --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "2.0.10",
|
"@electron/remote": "^2",
|
||||||
"node-pty": "^1.0",
|
"node-pty": "^1.0",
|
||||||
"any-promise": "^1.3.0",
|
"any-promise": "^1.3.0",
|
||||||
"electron-config": "2.0.0",
|
"electron-config": "2.0.0",
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"@tabby-gang/windows-blurbehind": "^3.0.0",
|
"@tabby-gang/windows-blurbehind": "^3.0.0",
|
||||||
"macos-native-processlist": "^2.1.0",
|
"macos-native-processlist": "^2.1.0",
|
||||||
"patch-package": "^6.5.0",
|
"patch-package": "^6.5.0",
|
||||||
"serialport": "11.0.0",
|
"serialport": "11.0.1",
|
||||||
"serialport-binding-webserialapi": "^1.0.3",
|
"serialport-binding-webserialapi": "^1.0.3",
|
||||||
"windows-native-registry": "^3.2.1",
|
"windows-native-registry": "^3.2.1",
|
||||||
"windows-process-tree": "^0.4.0"
|
"windows-process-tree": "^0.4.0"
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
"@ngx-translate/core": "^14.0.0",
|
"@ngx-translate/core": "^14.0.0",
|
||||||
"@types/mz": "2.7.4",
|
"@types/mz": "2.7.4",
|
||||||
"@types/node": "20.3.1",
|
"@types/node": "20.3.1",
|
||||||
"atomically": "^1.7.0",
|
"atomically": "^2.0.2",
|
||||||
"filesize": "^9",
|
"filesize": "^9",
|
||||||
"ngx-filesize": "^3.0.2"
|
"ngx-filesize": "^3.0.2"
|
||||||
},
|
},
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
"tabby-terminal": "*"
|
"tabby-terminal": "*"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"*/node-abi": "^2.20.0",
|
"*/node-abi": "^3",
|
||||||
"nan": "github:jkleinsc/nan#remove_accessor_signature"
|
"node-gyp": "^10.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -42,6 +42,7 @@ const config = {
|
|||||||
'electron-config': 'commonjs electron-config',
|
'electron-config': 'commonjs electron-config',
|
||||||
'electron-debug': 'commonjs electron-debug',
|
'electron-debug': 'commonjs electron-debug',
|
||||||
'electron-promise-ipc': 'commonjs electron-promise-ipc',
|
'electron-promise-ipc': 'commonjs electron-promise-ipc',
|
||||||
|
'electron-updater': 'commonjs electron-updater',
|
||||||
fs: 'commonjs fs',
|
fs: 'commonjs fs',
|
||||||
glasstron: 'commonjs glasstron',
|
glasstron: 'commonjs glasstron',
|
||||||
mz: 'commonjs mz',
|
mz: 'commonjs mz',
|
||||||
|
733
app/yarn.lock
733
app/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
cat > '/usr/bin/${executable}' << END
|
cat > '/usr/bin/${executable}' << END
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
'/opt/${productFilename}/${executable}' --no-sandbox $@
|
'/opt/${productFilename}/${executable}' --no-sandbox \$@
|
||||||
END
|
END
|
||||||
|
|
||||||
chmod +x '/usr/bin/${executable}'
|
chmod +x '/usr/bin/${executable}'
|
||||||
|
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>com.apple.security.automation.apple-events</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.app-sandbox</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.cs.allow-jit</key>
|
<key>com.apple.security.cs.allow-jit</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||||
|
@@ -51,6 +51,7 @@ mac:
|
|||||||
entitlements: "./build/mac/entitlements.plist"
|
entitlements: "./build/mac/entitlements.plist"
|
||||||
entitlementsInherit: "./build/mac/entitlements.plist"
|
entitlementsInherit: "./build/mac/entitlements.plist"
|
||||||
extendInfo:
|
extendInfo:
|
||||||
|
ElectronTeamID: ${teamId}
|
||||||
NSRequiresAquaSystemAppearance: false
|
NSRequiresAquaSystemAppearance: false
|
||||||
NSCameraUsageDescription: "A subprocess requests access to the device's camera."
|
NSCameraUsageDescription: "A subprocess requests access to the device's camera."
|
||||||
NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone."
|
NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone."
|
||||||
@@ -60,6 +61,7 @@ mac:
|
|||||||
NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder."
|
NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder."
|
||||||
NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.'
|
NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.'
|
||||||
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
|
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
|
||||||
|
NSAppleEventsUsageDescription: 'A subprocess requests permission to send AppleScript events to another application.'
|
||||||
|
|
||||||
linux:
|
linux:
|
||||||
category: "Utility;TerminalEmulator;System"
|
category: "Utility;TerminalEmulator;System"
|
||||||
@@ -76,8 +78,6 @@ snap:
|
|||||||
- system-observe
|
- system-observe
|
||||||
deb:
|
deb:
|
||||||
depends:
|
depends:
|
||||||
- gconf2
|
|
||||||
- gconf-service
|
|
||||||
- gnome-keyring
|
- gnome-keyring
|
||||||
- libnotify4
|
- libnotify4
|
||||||
- libsecret-1-0
|
- libsecret-1-0
|
||||||
|
602
locale/af-ZA.po
602
locale/af-ZA.po
File diff suppressed because it is too large
Load Diff
568
locale/app.pot
568
locale/app.pot
File diff suppressed because it is too large
Load Diff
586
locale/bg-BG.po
586
locale/bg-BG.po
File diff suppressed because it is too large
Load Diff
572
locale/cs-CZ.po
572
locale/cs-CZ.po
File diff suppressed because it is too large
Load Diff
602
locale/da-DK.po
602
locale/da-DK.po
File diff suppressed because it is too large
Load Diff
572
locale/de-DE.po
572
locale/de-DE.po
File diff suppressed because it is too large
Load Diff
570
locale/en-GB.po
570
locale/en-GB.po
File diff suppressed because it is too large
Load Diff
570
locale/es-ES.po
570
locale/es-ES.po
File diff suppressed because it is too large
Load Diff
570
locale/fr-FR.po
570
locale/fr-FR.po
File diff suppressed because it is too large
Load Diff
570
locale/hr-HR.po
570
locale/hr-HR.po
File diff suppressed because it is too large
Load Diff
598
locale/id-ID.po
598
locale/id-ID.po
File diff suppressed because it is too large
Load Diff
798
locale/it-IT.po
798
locale/it-IT.po
File diff suppressed because it is too large
Load Diff
660
locale/ja-JP.po
660
locale/ja-JP.po
File diff suppressed because it is too large
Load Diff
614
locale/ko-KR.po
614
locale/ko-KR.po
File diff suppressed because it is too large
Load Diff
614
locale/pl-PL.po
614
locale/pl-PL.po
File diff suppressed because it is too large
Load Diff
570
locale/pt-BR.po
570
locale/pt-BR.po
File diff suppressed because it is too large
Load Diff
576
locale/pt-PT.po
576
locale/pt-PT.po
File diff suppressed because it is too large
Load Diff
570
locale/ru-RU.po
570
locale/ru-RU.po
File diff suppressed because it is too large
Load Diff
2574
locale/sr-SP.po
Normal file
2574
locale/sr-SP.po
Normal file
File diff suppressed because it is too large
Load Diff
574
locale/sv-SE.po
574
locale/sv-SE.po
File diff suppressed because it is too large
Load Diff
2575
locale/tr-TR.po
Normal file
2575
locale/tr-TR.po
Normal file
File diff suppressed because it is too large
Load Diff
570
locale/uk-UA.po
570
locale/uk-UA.po
File diff suppressed because it is too large
Load Diff
570
locale/zh-CN.po
570
locale/zh-CN.po
File diff suppressed because it is too large
Load Diff
580
locale/zh-TW.po
580
locale/zh-TW.po
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -26,8 +26,8 @@
|
|||||||
"@types/js-yaml": "^4.0.5",
|
"@types/js-yaml": "^4.0.5",
|
||||||
"@types/node": "20.3.1",
|
"@types/node": "20.3.1",
|
||||||
"@types/webpack-env": "^1.18.0",
|
"@types/webpack-env": "^1.18.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
"@typescript-eslint/eslint-plugin": "^6.4.1",
|
||||||
"@typescript-eslint/parser": "^5.54.1",
|
"@typescript-eslint/parser": "^6.4.1",
|
||||||
"apply-loader": "2.0.0",
|
"apply-loader": "2.0.0",
|
||||||
"axios": "^1.4.0",
|
"axios": "^1.4.0",
|
||||||
"babel-loader": "^9.1.2",
|
"babel-loader": "^9.1.2",
|
||||||
@@ -39,23 +39,23 @@
|
|||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"css-loader": "^6.7.3",
|
"css-loader": "^6.7.3",
|
||||||
"deep-equal": "2.0.5",
|
"deep-equal": "2.0.5",
|
||||||
"electron": "^25.3.0",
|
"electron": "^29",
|
||||||
"electron-builder": "^24.0.0-alpha.1",
|
"electron-builder": "^24.6.4",
|
||||||
"electron-download": "^4.1.1",
|
"electron-download": "^4.1.1",
|
||||||
"electron-installer-snap": "^5.1.0",
|
"electron-installer-snap": "^5.1.0",
|
||||||
"electron-rebuild": "^3.2.9",
|
"electron-rebuild": "^3.2.9",
|
||||||
"eslint": "^8.38.0",
|
"eslint": "^8.48.0",
|
||||||
"eslint-import-resolver-typescript": "^3.5.2",
|
"eslint-import-resolver-typescript": "^3.6.0",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.28.1",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"gettext-extractor": "^3.5.4",
|
"gettext-extractor": "^3.8.0",
|
||||||
"graceful-fs": "^4.2.10",
|
"graceful-fs": "^4.2.10",
|
||||||
"html-loader": "4.2.0",
|
"html-loader": "4.2.0",
|
||||||
"json-loader": "^0.5.7",
|
"json-loader": "^0.5.7",
|
||||||
"lru-cache": "^6.0.0",
|
"lru-cache": "^6.0.0",
|
||||||
"macos-release": "^3.1.0",
|
"macos-release": "^3.3.0",
|
||||||
"ngx-toastr": "^16.0.2",
|
"ngx-toastr": "^16.0.2",
|
||||||
"node-abi": "^3.45.0",
|
"node-abi": "^3.65.0",
|
||||||
"npmlog": "6.0.2",
|
"npmlog": "6.0.2",
|
||||||
"npx": "^10.2.2",
|
"npx": "^10.2.2",
|
||||||
"patch-package": "^6.4.7",
|
"patch-package": "^6.4.7",
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
"source-code-pro": "^2.38.0",
|
"source-code-pro": "^2.38.0",
|
||||||
"source-map-loader": "^4.0.1",
|
"source-map-loader": "^4.0.1",
|
||||||
"source-sans-pro": "3.6.0",
|
"source-sans-pro": "3.6.0",
|
||||||
"ssh2": "Eugeny/ssh2#9de907d62907d6d45debdcc0ed8dda5b7b19dc7c",
|
"ssh2": "^1.14.0",
|
||||||
"style-loader": "^3.3.1",
|
"style-loader": "^3.3.1",
|
||||||
"svg-inline-loader": "^0.8.2",
|
"svg-inline-loader": "^0.8.2",
|
||||||
"thenby": "^1.3.4",
|
"thenby": "^1.3.4",
|
||||||
@@ -95,8 +95,7 @@
|
|||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"*/pug": "^3",
|
"*/pug": "^3",
|
||||||
"lzma-native": "^8.0.0",
|
"lzma-native": "^8.0.6",
|
||||||
"*/node-abi": "^3.33.0",
|
|
||||||
"**/graceful-fs": "^4.2.4",
|
"**/graceful-fs": "^4.2.4",
|
||||||
"nan": "2.17.0"
|
"nan": "2.17.0"
|
||||||
},
|
},
|
||||||
@@ -115,5 +114,8 @@
|
|||||||
"i18n:push": "crowdin push"
|
"i18n:push": "crowdin push"
|
||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"private": true
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^16.3.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,7 @@ builder({
|
|||||||
armv7l: process.env.ARCH === 'armv7l',
|
armv7l: process.env.ARCH === 'armv7l',
|
||||||
arm64: process.env.ARCH === 'arm64',
|
arm64: process.env.ARCH === 'arm64',
|
||||||
config: {
|
config: {
|
||||||
|
npmRebuild: false,
|
||||||
extraMetadata: {
|
extraMetadata: {
|
||||||
version: vars.version,
|
version: vars.version,
|
||||||
},
|
},
|
||||||
|
@@ -18,12 +18,13 @@ process.env.APPLE_APP_SPECIFIC_PASSWORD ??= process.env.APPSTORE_PASSWORD
|
|||||||
|
|
||||||
builder({
|
builder({
|
||||||
dir: true,
|
dir: true,
|
||||||
mac: ['pkg', 'zip'],
|
mac: ['dmg', 'zip'],
|
||||||
x64: process.env.ARCH === 'x86_64',
|
x64: process.env.ARCH === 'x86_64',
|
||||||
arm64: process.env.ARCH === 'arm64',
|
arm64: process.env.ARCH === 'arm64',
|
||||||
config: {
|
config: {
|
||||||
extraMetadata: {
|
extraMetadata: {
|
||||||
version: vars.version,
|
version: vars.version,
|
||||||
|
teamId: process.env.APPLE_TEAM_ID,
|
||||||
},
|
},
|
||||||
mac: {
|
mac: {
|
||||||
identity: !process.env.CI || process.env.CSC_LINK ? undefined : null,
|
identity: !process.env.CI || process.env.CSC_LINK ? undefined : null,
|
||||||
|
@@ -3,7 +3,7 @@ import * as fs from 'fs'
|
|||||||
import * as semver from 'semver'
|
import * as semver from 'semver'
|
||||||
import * as childProcess from 'child_process'
|
import * as childProcess from 'child_process'
|
||||||
|
|
||||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
|
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : (process.env.ARCH || process.arch)
|
||||||
|
|
||||||
import * as url from 'url'
|
import * as url from 'url'
|
||||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
|
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
|
||||||
|
@@ -10,13 +10,13 @@ export { Theme } from './theme'
|
|||||||
export { TabContextMenuItemProvider } from './tabContextMenuProvider'
|
export { TabContextMenuItemProvider } from './tabContextMenuProvider'
|
||||||
export { SelectorOption } from './selector'
|
export { SelectorOption } from './selector'
|
||||||
export { CLIHandler, CLIEvent } from './cli'
|
export { CLIHandler, CLIEvent } from './cli'
|
||||||
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions } from './platform'
|
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions, DirectoryUpload } from './platform'
|
||||||
export { MenuItemOptions } from './menu'
|
export { MenuItemOptions } from './menu'
|
||||||
export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess'
|
export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess'
|
||||||
export { HostWindowService } from './hostWindow'
|
export { HostWindowService } from './hostWindow'
|
||||||
export { HostAppService, Platform } from './hostApp'
|
export { HostAppService, Platform } from './hostApp'
|
||||||
export { FileProvider } from './fileProvider'
|
export { FileProvider } from './fileProvider'
|
||||||
export { ProfileProvider, Profile, PartialProfile, ProfileSettingsComponent } from './profileProvider'
|
export { ProfileProvider, ConnectableProfileProvider, QuickConnectProfileProvider, Profile, ConnectableProfile, PartialProfile, ProfileSettingsComponent, ProfileGroup, PartialProfileGroup } from './profileProvider'
|
||||||
export { PromptModalComponent } from '../components/promptModal.component'
|
export { PromptModalComponent } from '../components/promptModal.component'
|
||||||
export * from './commands'
|
export * from './commands'
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
export interface MenuItemOptions {
|
export interface MenuItemOptions {
|
||||||
type?: ('normal' | 'separator' | 'submenu' | 'checkbox' | 'radio')
|
type?: 'normal' | 'separator' | 'submenu' | 'checkbox' | 'radio'
|
||||||
label?: string
|
label?: string
|
||||||
sublabel?: string
|
sublabel?: string
|
||||||
enabled?: boolean
|
enabled?: boolean
|
||||||
|
@@ -86,6 +86,26 @@ export interface FileUploadOptions {
|
|||||||
multiple: boolean
|
multiple: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class DirectoryUpload {
|
||||||
|
private childrens: (FileUpload|DirectoryUpload)[] = []
|
||||||
|
|
||||||
|
constructor (private name = '') {
|
||||||
|
// Just set name for now.
|
||||||
|
}
|
||||||
|
|
||||||
|
getName (): string {
|
||||||
|
return this.name
|
||||||
|
}
|
||||||
|
|
||||||
|
getChildrens (): (FileUpload|DirectoryUpload)[] {
|
||||||
|
return this.childrens
|
||||||
|
}
|
||||||
|
|
||||||
|
pushChildren (item: FileUpload|DirectoryUpload): void {
|
||||||
|
this.childrens.push(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export type PlatformTheme = 'light'|'dark'
|
export type PlatformTheme = 'light'|'dark'
|
||||||
|
|
||||||
export abstract class PlatformService {
|
export abstract class PlatformService {
|
||||||
@@ -106,23 +126,54 @@ export abstract class PlatformService {
|
|||||||
|
|
||||||
abstract startDownload (name: string, mode: number, size: number): Promise<FileDownload|null>
|
abstract startDownload (name: string, mode: number, size: number): Promise<FileDownload|null>
|
||||||
abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]>
|
abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]>
|
||||||
|
abstract startUploadDirectory (paths?: string[]): Promise<DirectoryUpload>
|
||||||
|
|
||||||
|
async startUploadFromDragEvent (event: DragEvent, multiple = false): Promise<DirectoryUpload> {
|
||||||
|
const result = new DirectoryUpload()
|
||||||
|
|
||||||
startUploadFromDragEvent (event: DragEvent, multiple = false): FileUpload[] {
|
|
||||||
const result: FileUpload[] = []
|
|
||||||
if (!event.dataTransfer) {
|
if (!event.dataTransfer) {
|
||||||
return []
|
return Promise.resolve(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const traverseFileTree = (item: any, root: DirectoryUpload = result): Promise<void> => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
if (item.isFile) {
|
||||||
|
item.file((file: File) => {
|
||||||
|
const transfer = new HTMLFileUpload(file)
|
||||||
|
this.fileTransferStarted.next(transfer)
|
||||||
|
root.pushChildren(transfer)
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
} else if (item.isDirectory) {
|
||||||
|
const dirReader = item.createReader()
|
||||||
|
const childrenFolder = new DirectoryUpload(item.name)
|
||||||
|
dirReader.readEntries(async (entries: any[]) => {
|
||||||
|
for (const entry of entries) {
|
||||||
|
await traverseFileTree(entry, childrenFolder)
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
root.pushChildren(childrenFolder)
|
||||||
|
} else {
|
||||||
|
resolve()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const promises: Promise<void>[] = []
|
||||||
|
|
||||||
|
const items = event.dataTransfer.items
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
||||||
for (let i = 0; i < event.dataTransfer.files.length; i++) {
|
for (let i = 0; i < items.length; i++) {
|
||||||
const file = event.dataTransfer.files[i]
|
const item = items[i].webkitGetAsEntry()
|
||||||
const transfer = new HTMLFileUpload(file)
|
if (item) {
|
||||||
this.fileTransferStarted.next(transfer)
|
promises.push(traverseFileTree(item))
|
||||||
result.push(transfer)
|
if (!multiple) {
|
||||||
if (!multiple) {
|
break
|
||||||
break
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return Promise.all(promises).then(() => result)
|
||||||
}
|
}
|
||||||
|
|
||||||
getConfigPath (): string|null {
|
getConfigPath (): string|null {
|
||||||
|
@@ -21,6 +21,10 @@ export interface Profile {
|
|||||||
isTemplate: boolean
|
isTemplate: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ConnectableProfile extends Profile {
|
||||||
|
clearServiceMessagesOnConnect: boolean
|
||||||
|
}
|
||||||
|
|
||||||
export type PartialProfile<T extends Profile> = Omit<Omit<Omit<{
|
export type PartialProfile<T extends Profile> = Omit<Omit<Omit<{
|
||||||
[K in keyof T]?: T[K]
|
[K in keyof T]?: T[K]
|
||||||
}, 'options'>, 'type'>, 'name'> & {
|
}, 'options'>, 'type'>, 'name'> & {
|
||||||
@@ -31,6 +35,21 @@ export type PartialProfile<T extends Profile> = Omit<Omit<Omit<{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ProfileGroup {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
profiles: PartialProfile<Profile>[]
|
||||||
|
defaults: any
|
||||||
|
editable: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PartialProfileGroup<T extends ProfileGroup> = Omit<Omit<{
|
||||||
|
[K in keyof T]?: T[K]
|
||||||
|
}, 'id'>, 'name'> & {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface ProfileSettingsComponent<P extends Profile> {
|
export interface ProfileSettingsComponent<P extends Profile> {
|
||||||
profile: P
|
profile: P
|
||||||
save?: () => void
|
save?: () => void
|
||||||
@@ -39,7 +58,6 @@ export interface ProfileSettingsComponent<P extends Profile> {
|
|||||||
export abstract class ProfileProvider<P extends Profile> {
|
export abstract class ProfileProvider<P extends Profile> {
|
||||||
id: string
|
id: string
|
||||||
name: string
|
name: string
|
||||||
supportsQuickConnect = false
|
|
||||||
settingsComponent?: new (...args: any[]) => ProfileSettingsComponent<P>
|
settingsComponent?: new (...args: any[]) => ProfileSettingsComponent<P>
|
||||||
configDefaults = {}
|
configDefaults = {}
|
||||||
|
|
||||||
@@ -53,13 +71,15 @@ export abstract class ProfileProvider<P extends Profile> {
|
|||||||
|
|
||||||
abstract getDescription (profile: PartialProfile<P>): string
|
abstract getDescription (profile: PartialProfile<P>): string
|
||||||
|
|
||||||
quickConnect (query: string): PartialProfile<P>|null {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
intoQuickConnectString (profile: P): string|null {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteProfile (profile: P): void { }
|
deleteProfile (profile: P): void { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export abstract class ConnectableProfileProvider<P extends ConnectableProfile> extends ProfileProvider<P> {}
|
||||||
|
|
||||||
|
export abstract class QuickConnectProfileProvider<P extends ConnectableProfile> extends ConnectableProfileProvider<P> {
|
||||||
|
|
||||||
|
abstract quickConnect (query: string): PartialProfile<P>|null
|
||||||
|
|
||||||
|
abstract intoQuickConnectString (profile: P): string|null
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'
|
|||||||
import { HostAppService } from './api/hostApp'
|
import { HostAppService } from './api/hostApp'
|
||||||
import { CLIHandler, CLIEvent } from './api/cli'
|
import { CLIHandler, CLIEvent } from './api/cli'
|
||||||
import { HostWindowService } from './api/hostWindow'
|
import { HostWindowService } from './api/hostWindow'
|
||||||
|
import { QuickConnectProfileProvider } from './api/profileProvider'
|
||||||
import { ProfilesService } from './services/profiles.service'
|
import { ProfilesService } from './services/profiles.service'
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@@ -27,6 +28,10 @@ export class ProfileCLIHandler extends CLIHandler {
|
|||||||
this.handleOpenRecentProfile(event.argv.profileNumber)
|
this.handleOpenRecentProfile(event.argv.profileNumber)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
if (op === 'quickConnect') {
|
||||||
|
this.handleOpenQuickConnect(event.argv.providerId, event.argv.query)
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +53,21 @@ export class ProfileCLIHandler extends CLIHandler {
|
|||||||
this.profiles.openNewTabForProfile(profiles[profileNumber])
|
this.profiles.openNewTabForProfile(profiles[profileNumber])
|
||||||
this.hostWindow.bringToFront()
|
this.hostWindow.bringToFront()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async handleOpenQuickConnect (providerId: string, query: string) {
|
||||||
|
const provider = this.profiles.getProviders().find(x => x.id === providerId)
|
||||||
|
if(!provider || !(provider instanceof QuickConnectProfileProvider)) {
|
||||||
|
console.error(`Requested provider "${providerId}" not found`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const profile = provider.quickConnect(query)
|
||||||
|
if(!profile) {
|
||||||
|
console.error(`Could not parse quick connect query "${query}"`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.profiles.openNewTabForProfile(profile)
|
||||||
|
this.hostWindow.bringToFront()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@@ -18,7 +18,7 @@ export class CoreCommandProvider extends CommandProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async activate () {
|
async activate () {
|
||||||
const profile = await this.profilesService.showProfileSelector()
|
const profile = await this.profilesService.showProfileSelector().catch(() => null)
|
||||||
if (profile) {
|
if (profile) {
|
||||||
this.profilesService.launchProfile(profile)
|
this.profilesService.launchProfile(profile)
|
||||||
}
|
}
|
||||||
|
@@ -1,21 +1,21 @@
|
|||||||
title-bar(
|
title-bar(
|
||||||
*ngIf='ready && !hostWindow.isFullscreen && config.store.appearance.frame == "full" && config.store.appearance.dock == "off"',
|
*ngIf='ready && !hostWindow.isFullscreen && config.store.appearance.dock == "off" && isTitleBarNeeded()',
|
||||||
(dblclick)='hostWindow.toggleMaximize()',
|
(dblclick)='toggleMaximize()',
|
||||||
[hideControls]='hostApp.platform !== Platform.Linux && !hostWindow.isFullscreen',
|
[hideControls]='hostApp.platform !== Platform.Linux && !hostWindow.isFullscreen',
|
||||||
[class.inset]='hostApp.platform == Platform.macOS && !hostWindow.isFullscreen'
|
[class.inset]='hostApp.platform == Platform.macOS && !hostWindow.isFullscreen'
|
||||||
)
|
)
|
||||||
|
|
||||||
.content(
|
.content(
|
||||||
*ngIf='ready',
|
*ngIf='ready',
|
||||||
[class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left"',
|
[class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left" || config.store.appearance.tabsLocation == "right"',
|
||||||
[class.tabs-on-left]='hasVerticalTabs() && config.store.appearance.tabsLocation == "left"',
|
[class.tabs-on-left]='hasVerticalTabs() && config.store.appearance.tabsLocation == "left"',
|
||||||
[class.tabs-titlebar-enabled]='config.store.appearance.frame == "full"',
|
[class.tabs-titlebar-enabled]='isTitleBarNeeded()',
|
||||||
[class.tabs-on-right]='hasVerticalTabs() && config.store.appearance.tabsLocation == "right"',
|
[class.tabs-on-right]='hasVerticalTabs() && config.store.appearance.tabsLocation == "right"',
|
||||||
)
|
)
|
||||||
.tab-bar(
|
.tab-bar(
|
||||||
*ngIf='!hostWindow.isFullscreen || config.store.appearance.tabsInFullscreen',
|
*ngIf='!hostWindow.isFullscreen || config.store.appearance.tabsInFullscreen',
|
||||||
[class.tab-bar-no-controls-overlay]='hostApp.platform == Platform.macOS',
|
[class.tab-bar-no-controls-overlay]='hostApp.platform == Platform.macOS',
|
||||||
(dblclick)='hostWindow.toggleMaximize()'
|
(dblclick)='!isTitleBarNeeded() && toggleMaximize()'
|
||||||
)
|
)
|
||||||
.inset.background(*ngIf='hostApp.platform == Platform.macOS \
|
.inset.background(*ngIf='hostApp.platform == Platform.macOS \
|
||||||
&& !hostWindow.isFullscreen \
|
&& !hostWindow.isFullscreen \
|
||||||
@@ -35,8 +35,7 @@ title-bar(
|
|||||||
[@animateTab]='{value: "in", params: {size: targetTabSize}}',
|
[@animateTab]='{value: "in", params: {size: targetTabSize}}',
|
||||||
[@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
|
[@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
|
||||||
(click)='app.selectTab(tab)',
|
(click)='app.selectTab(tab)',
|
||||||
[class.fully-draggable]='hostApp.platform != Platform.macOS',
|
[class.fully-draggable]='hostApp.platform !== Platform.macOS'
|
||||||
[class.drag-region]='hostApp.platform == Platform.macOS && !(app.tabDragActive$|async)',
|
|
||||||
)
|
)
|
||||||
|
|
||||||
.btn-group.background
|
.btn-group.background
|
||||||
@@ -65,7 +64,11 @@ title-bar(
|
|||||||
(transfersChange)='onTransfersChange()'
|
(transfersChange)='onTransfersChange()'
|
||||||
)
|
)
|
||||||
|
|
||||||
.drag-space.background([class.persistent]='config.store.appearance.frame == "thin" && hostApp.platform != Platform.macOS')
|
.btn-space.background(
|
||||||
|
[class.persistent]='config.store.appearance.frame == "thin"',
|
||||||
|
[class.drag]='config.store.appearance.frame == "thin" \
|
||||||
|
&& ((config.store.appearance.tabsLocation !== "left" && config.store.appearance.tabsLocation !== "right") || hostApp.platform !== Platform.macOS)'
|
||||||
|
)
|
||||||
|
|
||||||
.btn-group.background
|
.btn-group.background
|
||||||
.d-flex(
|
.d-flex(
|
||||||
@@ -85,7 +88,9 @@ title-bar(
|
|||||||
|
|
||||||
window-controls.background(
|
window-controls.background(
|
||||||
*ngIf='config.store.appearance.frame == "thin" \
|
*ngIf='config.store.appearance.frame == "thin" \
|
||||||
&& (hostApp.platform == Platform.Linux)',
|
&& config.store.appearance.tabsLocation !== "left" \
|
||||||
|
&& config.store.appearance.tabsLocation !== "right" \
|
||||||
|
&& hostApp.platform == Platform.Linux',
|
||||||
)
|
)
|
||||||
|
|
||||||
div.window-controls-spacer(
|
div.window-controls-spacer(
|
||||||
|
@@ -62,7 +62,7 @@ $tab-border-radius: 4px;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.drag-space {
|
.btn-space {
|
||||||
flex: auto;
|
flex: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,15 +126,18 @@ $tab-border-radius: 4px;
|
|||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
&>.drag-space {
|
&>.btn-space {
|
||||||
min-width: 1px;
|
min-width: 1px;
|
||||||
flex: 1 0 1%;
|
flex: 1 0 1%;
|
||||||
-webkit-app-region: drag;
|
|
||||||
|
|
||||||
.tabs-on-top & {
|
.tabs-on-top & {
|
||||||
margin-top: 2px; // for window resizing
|
margin-top: 2px; // for window resizing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.drag {
|
||||||
|
-webkit-app-region: drag;
|
||||||
|
}
|
||||||
|
|
||||||
&.persistent {
|
&.persistent {
|
||||||
// min-width: 72px; // 2 x 36 px height, ie 2 squares
|
// min-width: 72px; // 2 x 36 px height, ie 2 squares
|
||||||
// Given WCO on Windows, the min-width of the window buttons is about 138px.
|
// Given WCO on Windows, the min-width of the window buttons is about 138px.
|
||||||
|
@@ -240,4 +240,19 @@ export class AppRootComponent {
|
|||||||
return (await this.commands.getCommands({ tab: this.app.activeTab ?? undefined }))
|
return (await this.commands.getCommands({ tab: this.app.activeTab ?? undefined }))
|
||||||
.filter(x => x.locations?.includes(aboveZero ? CommandLocation.RightToolbar : CommandLocation.LeftToolbar))
|
.filter(x => x.locations?.includes(aboveZero ? CommandLocation.RightToolbar : CommandLocation.LeftToolbar))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleMaximize (): void {
|
||||||
|
this.hostWindow.toggleMaximize()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected isTitleBarNeeded (): boolean {
|
||||||
|
return (
|
||||||
|
this.config.store.appearance.frame === 'full'
|
||||||
|
||
|
||||||
|
this.hostApp.platform !== Platform.macOS
|
||||||
|
&& this.config.store.appearance.frame === 'thin'
|
||||||
|
&& this.config.store.appearance.tabsLocation !== 'top'
|
||||||
|
&& this.config.store.appearance.tabsLocation !== 'bottom'
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { Observable, Subject, distinctUntilChanged, filter, debounceTime } from 'rxjs'
|
import { Observable, Subject, BehaviorSubject, distinctUntilChanged, filter, debounceTime } from 'rxjs'
|
||||||
import { EmbeddedViewRef, Injector, ViewContainerRef, ViewRef } from '@angular/core'
|
import { EmbeddedViewRef, Injector, ViewContainerRef, ViewRef } from '@angular/core'
|
||||||
import { RecoveryToken } from '../api/tabRecovery'
|
import { RecoveryToken } from '../api/tabRecovery'
|
||||||
import { BaseComponent } from './base.component'
|
import { BaseComponent } from './base.component'
|
||||||
@@ -75,14 +75,17 @@ export abstract class BaseTabComponent extends BaseComponent {
|
|||||||
private titleChange = new Subject<string>()
|
private titleChange = new Subject<string>()
|
||||||
private focused = new Subject<void>()
|
private focused = new Subject<void>()
|
||||||
private blurred = new Subject<void>()
|
private blurred = new Subject<void>()
|
||||||
private progress = new Subject<number|null>()
|
protected visibility = new BehaviorSubject<boolean>(false)
|
||||||
private activity = new Subject<boolean>()
|
protected progress = new BehaviorSubject<number|null>(null)
|
||||||
|
protected activity = new BehaviorSubject<boolean>(false)
|
||||||
private destroyed = new Subject<void>()
|
private destroyed = new Subject<void>()
|
||||||
|
|
||||||
private _destroyCalled = false
|
private _destroyCalled = false
|
||||||
|
|
||||||
get focused$ (): Observable<void> { return this.focused }
|
get focused$ (): Observable<void> { return this.focused }
|
||||||
get blurred$ (): Observable<void> { return this.blurred }
|
get blurred$ (): Observable<void> { return this.blurred }
|
||||||
|
/* @hidden */
|
||||||
|
get visibility$ (): Observable<boolean> { return this.visibility }
|
||||||
get titleChange$ (): Observable<string> { return this.titleChange.pipe(distinctUntilChanged()) }
|
get titleChange$ (): Observable<string> { return this.titleChange.pipe(distinctUntilChanged()) }
|
||||||
get progress$ (): Observable<number|null> { return this.progress.pipe(distinctUntilChanged()) }
|
get progress$ (): Observable<number|null> { return this.progress.pipe(distinctUntilChanged()) }
|
||||||
get activity$ (): Observable<boolean> { return this.activity }
|
get activity$ (): Observable<boolean> { return this.activity }
|
||||||
@@ -125,7 +128,7 @@ export abstract class BaseTabComponent extends BaseComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows the acticity marker on the tab header
|
* Shows the activity marker on the tab header
|
||||||
*/
|
*/
|
||||||
displayActivity (): void {
|
displayActivity (): void {
|
||||||
if (!this.hasActivity) {
|
if (!this.hasActivity) {
|
||||||
@@ -135,7 +138,7 @@ export abstract class BaseTabComponent extends BaseComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the acticity marker from the tab header
|
* Removes the activity marker from the tab header
|
||||||
*/
|
*/
|
||||||
clearActivity (): void {
|
clearActivity (): void {
|
||||||
if (this.hasActivity) {
|
if (this.hasActivity) {
|
||||||
@@ -177,6 +180,11 @@ export abstract class BaseTabComponent extends BaseComponent {
|
|||||||
this.blurred.next()
|
this.blurred.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* @hidden */
|
||||||
|
emitVisibility (visibility: boolean): void {
|
||||||
|
this.visibility.next(visibility)
|
||||||
|
}
|
||||||
|
|
||||||
insertIntoContainer (container: ViewContainerRef): EmbeddedViewRef<any> {
|
insertIntoContainer (container: ViewContainerRef): EmbeddedViewRef<any> {
|
||||||
this.viewContainerEmbeddedRef = container.insert(this.hostView) as EmbeddedViewRef<any>
|
this.viewContainerEmbeddedRef = container.insert(this.hostView) as EmbeddedViewRef<any>
|
||||||
this.viewContainer = container
|
this.viewContainer = container
|
||||||
@@ -187,7 +195,10 @@ export abstract class BaseTabComponent extends BaseComponent {
|
|||||||
if (!this.viewContainer || !this.viewContainerEmbeddedRef) {
|
if (!this.viewContainer || !this.viewContainerEmbeddedRef) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.viewContainer.detach(this.viewContainer.indexOf(this.viewContainerEmbeddedRef))
|
const viewIndex = this.viewContainer.indexOf(this.viewContainerEmbeddedRef)
|
||||||
|
if (viewIndex !== -1) {
|
||||||
|
this.viewContainer.detach(viewIndex)
|
||||||
|
}
|
||||||
this.viewContainerEmbeddedRef = undefined
|
this.viewContainerEmbeddedRef = undefined
|
||||||
this.viewContainer = undefined
|
this.viewContainer = undefined
|
||||||
}
|
}
|
||||||
@@ -218,7 +229,6 @@ export abstract class BaseTabComponent extends BaseComponent {
|
|||||||
this.destroyed.next()
|
this.destroyed.next()
|
||||||
}
|
}
|
||||||
this.destroyed.complete()
|
this.destroyed.complete()
|
||||||
this.hostView.destroy()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @hidden */
|
/** @hidden */
|
||||||
|
@@ -18,45 +18,58 @@ export class SelectorModalComponent<T> {
|
|||||||
@Input() selectedIndex = 0
|
@Input() selectedIndex = 0
|
||||||
hasGroups = false
|
hasGroups = false
|
||||||
@ViewChildren('item') itemChildren: QueryList<ElementRef>
|
@ViewChildren('item') itemChildren: QueryList<ElementRef>
|
||||||
|
private preventEdit: boolean
|
||||||
|
|
||||||
constructor (
|
constructor (public modalInstance: NgbActiveModal) {
|
||||||
public modalInstance: NgbActiveModal,
|
this.preventEdit = false
|
||||||
) { }
|
}
|
||||||
|
|
||||||
ngOnInit (): void {
|
ngOnInit (): void {
|
||||||
this.onFilterChange()
|
this.onFilterChange()
|
||||||
this.hasGroups = this.options.some(x => x.group)
|
this.hasGroups = this.options.some(x => x.group)
|
||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('keydown', ['$event']) onKeyUp (event: KeyboardEvent): void {
|
@HostListener('keydown', ['$event']) onKeyDown (event: KeyboardEvent): void {
|
||||||
if (event.key === 'PageUp' || event.key === 'ArrowUp' && event.metaKey) {
|
if (event.key === 'Escape') {
|
||||||
this.selectedIndex -= 10
|
|
||||||
event.preventDefault()
|
|
||||||
} else if (event.key === 'PageDown' || event.key === 'ArrowDown' && event.metaKey) {
|
|
||||||
this.selectedIndex += 10
|
|
||||||
event.preventDefault()
|
|
||||||
} else if (event.key === 'ArrowUp') {
|
|
||||||
this.selectedIndex--
|
|
||||||
event.preventDefault()
|
|
||||||
} else if (event.key === 'ArrowDown') {
|
|
||||||
this.selectedIndex++
|
|
||||||
event.preventDefault()
|
|
||||||
} else if (event.key === 'Enter') {
|
|
||||||
this.selectOption(this.filteredOptions[this.selectedIndex])
|
|
||||||
} else if (event.key === 'Escape') {
|
|
||||||
this.close()
|
this.close()
|
||||||
}
|
} else if (this.filteredOptions.length > 0) {
|
||||||
if (event.key === 'Backspace' && this.canEditSelected()) {
|
if (event.key === 'PageUp' || event.key === 'ArrowUp' && event.metaKey) {
|
||||||
event.preventDefault()
|
this.selectedIndex -= Math.min(10, Math.max(1, this.selectedIndex))
|
||||||
this.filter = this.filteredOptions[this.selectedIndex].freeInputEquivalent!
|
event.preventDefault()
|
||||||
this.onFilterChange()
|
} else if (event.key === 'PageDown' || event.key === 'ArrowDown' && event.metaKey) {
|
||||||
}
|
this.selectedIndex += Math.min(10, Math.max(1, this.filteredOptions.length - this.selectedIndex - 1))
|
||||||
|
event.preventDefault()
|
||||||
|
} else if (event.key === 'ArrowUp') {
|
||||||
|
this.selectedIndex--
|
||||||
|
event.preventDefault()
|
||||||
|
} else if (event.key === 'ArrowDown') {
|
||||||
|
this.selectedIndex++
|
||||||
|
event.preventDefault()
|
||||||
|
} else if (event.key === 'Enter') {
|
||||||
|
this.selectOption(this.filteredOptions[this.selectedIndex])
|
||||||
|
} else if (event.key === 'Backspace' && !this.preventEdit) {
|
||||||
|
if (this.canEditSelected()) {
|
||||||
|
event.preventDefault()
|
||||||
|
this.filter = this.filteredOptions[this.selectedIndex].freeInputEquivalent!
|
||||||
|
this.onFilterChange()
|
||||||
|
} else {
|
||||||
|
this.preventEdit = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.selectedIndex = (this.selectedIndex + this.filteredOptions.length) % this.filteredOptions.length
|
this.selectedIndex = (this.selectedIndex + this.filteredOptions.length) % this.filteredOptions.length
|
||||||
Array.from(this.itemChildren)[this.selectedIndex]?.nativeElement.scrollIntoView({
|
|
||||||
behavior: 'smooth',
|
Array.from(this.itemChildren)[this.selectedIndex]?.nativeElement.scrollIntoView({
|
||||||
block: 'nearest',
|
behavior: 'smooth',
|
||||||
})
|
block: 'nearest',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@HostListener('keyup', ['$event']) onKeyUp (event: KeyboardEvent): void {
|
||||||
|
if (event.key === 'Backspace' && this.preventEdit) {
|
||||||
|
this.preventEdit = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onFilterChange (): void {
|
onFilterChange (): void {
|
||||||
@@ -76,7 +89,7 @@ export class SelectorModalComponent<T> {
|
|||||||
{ sort: true },
|
{ sort: true },
|
||||||
).search(f)
|
).search(f)
|
||||||
|
|
||||||
this.options.filter(x => x.freeInputPattern).forEach(freeOption => {
|
this.options.filter(x => x.freeInputPattern).sort(firstBy<SelectorOption<T>, number>(x => x.weight ?? 0)).forEach(freeOption => {
|
||||||
if (!this.filteredOptions.includes(freeOption)) {
|
if (!this.filteredOptions.includes(freeOption)) {
|
||||||
this.filteredOptions.push(freeOption)
|
this.filteredOptions.push(freeOption)
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { Observable, Subject } from 'rxjs'
|
import { Observable, Subject, takeWhile } from 'rxjs'
|
||||||
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy, Injector } from '@angular/core'
|
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy, Injector } from '@angular/core'
|
||||||
import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component'
|
import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component'
|
||||||
import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
|
import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
|
||||||
@@ -275,6 +275,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
this.blurred$.subscribe(() => this.getAllTabs().forEach(x => x.emitBlurred()))
|
this.blurred$.subscribe(() => this.getAllTabs().forEach(x => x.emitBlurred()))
|
||||||
|
this.visibility$.subscribe(visibility => this.getAllTabs().forEach(x => x.emitVisibility(visibility)))
|
||||||
|
|
||||||
this.tabAdded$.subscribe(() => this.updateTitle())
|
this.tabAdded$.subscribe(() => this.updateTitle())
|
||||||
this.tabRemoved$.subscribe(() => this.updateTitle())
|
this.tabRemoved$.subscribe(() => this.updateTitle())
|
||||||
@@ -349,7 +350,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'close-pane':
|
case 'close-pane':
|
||||||
this.removeTab(this.focusedTab)
|
this.focusedTab.destroy()
|
||||||
break
|
break
|
||||||
case 'pane-increase-vertical':
|
case 'pane-increase-vertical':
|
||||||
this.resizePane('v')
|
this.resizePane('v')
|
||||||
@@ -380,6 +381,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 100)
|
}, 100)
|
||||||
|
|
||||||
|
// Propagate visibility to new children
|
||||||
|
this.emitVisibility(this.visibility.value)
|
||||||
}
|
}
|
||||||
this.initialized.next()
|
this.initialized.next()
|
||||||
this.initialized.complete()
|
this.initialized.complete()
|
||||||
@@ -470,11 +474,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
}
|
}
|
||||||
tab.removeFromContainer()
|
tab.removeFromContainer()
|
||||||
tab.parent = this
|
tab.parent = this
|
||||||
|
|
||||||
|
tab.emitVisibility(this.visibility.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
let target = relative ? this.getParentOf(relative) : null
|
let target = relative ? this.getParentOf(relative) : null
|
||||||
if (!target) {
|
if (!target) {
|
||||||
// Rewrap the root container just in case the orientation isn't compatibile
|
// Rewrap the root container just in case the orientation isn't compatible
|
||||||
target = new SplitContainer()
|
target = new SplitContainer()
|
||||||
target.orientation = ['l', 'r'].includes(side) ? 'h' : 'v'
|
target.orientation = ['l', 'r'].includes(side) ? 'h' : 'v'
|
||||||
target.children = [this.root]
|
target.children = [this.root]
|
||||||
@@ -766,10 +772,10 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
}
|
}
|
||||||
|
|
||||||
destroy (): void {
|
destroy (): void {
|
||||||
super.destroy()
|
|
||||||
for (const x of this.getAllTabs()) {
|
for (const x of this.getAllTabs()) {
|
||||||
x.destroy()
|
x.destroy()
|
||||||
}
|
}
|
||||||
|
super.destroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
layout (): void {
|
layout (): void {
|
||||||
@@ -815,7 +821,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
if (this.disableDynamicTitle) {
|
if (this.disableDynamicTitle) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.setTitle([...new Set(this.getAllTabs().map(x => x.title))].join(' | '))
|
const titles = [
|
||||||
|
this.getFocusedTab()?.title,
|
||||||
|
...this.getAllTabs()
|
||||||
|
.filter(x => x !== this.getFocusedTab())
|
||||||
|
.map(x => x.title),
|
||||||
|
]
|
||||||
|
this.setTitle([...new Set(titles)].join(' | '))
|
||||||
}
|
}
|
||||||
|
|
||||||
private attachTabView (tab: BaseTabComponent) {
|
private attachTabView (tab: BaseTabComponent) {
|
||||||
@@ -831,20 +843,42 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
tab.subscribeUntilDestroyed(tab.titleChange$, () => this.updateTitle())
|
tab.subscribeUntilDestroyed(
|
||||||
tab.subscribeUntilDestroyed(tab.activity$, a => a ? this.displayActivity() : this.clearActivity())
|
this.observeUntilChildDetached(tab, tab.focused$),
|
||||||
tab.subscribeUntilDestroyed(tab.progress$, p => this.setProgress(p))
|
() => this.updateTitle(),
|
||||||
|
)
|
||||||
|
tab.subscribeUntilDestroyed(
|
||||||
|
this.observeUntilChildDetached(tab, tab.titleChange$),
|
||||||
|
() => this.updateTitle(),
|
||||||
|
)
|
||||||
|
tab.subscribeUntilDestroyed(
|
||||||
|
this.observeUntilChildDetached(tab, tab.activity$),
|
||||||
|
a => a ? this.displayActivity() : this.clearActivity(),
|
||||||
|
)
|
||||||
|
tab.subscribeUntilDestroyed(
|
||||||
|
this.observeUntilChildDetached(tab, tab.progress$),
|
||||||
|
p => this.setProgress(p),
|
||||||
|
)
|
||||||
if (tab.title) {
|
if (tab.title) {
|
||||||
this.updateTitle()
|
this.updateTitle()
|
||||||
}
|
}
|
||||||
tab.subscribeUntilDestroyed(tab.recoveryStateChangedHint$, () => {
|
tab.subscribeUntilDestroyed(
|
||||||
this.recoveryStateChangedHint.next()
|
this.observeUntilChildDetached(tab, tab.recoveryStateChangedHint$),
|
||||||
})
|
() => {
|
||||||
tab.subscribeUntilDestroyed(tab.destroyed$, () => {
|
this.recoveryStateChangedHint.next()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
tab.destroyed$.subscribe(() => {
|
||||||
this.removeTab(tab)
|
this.removeTab(tab)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private observeUntilChildDetached<T> (tab: BaseTabComponent, event: Observable<T>): Observable<T> {
|
||||||
|
return event.pipe(takeWhile(() => {
|
||||||
|
return this.getAllTabs().includes(tab)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
private onAfterTabAdded (tab: BaseTabComponent) {
|
private onAfterTabAdded (tab: BaseTabComponent) {
|
||||||
setImmediate(() => {
|
setImmediate(() => {
|
||||||
this.layout()
|
this.layout()
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
.container.mt-5.mb-5
|
.container.mt-3.mb-3
|
||||||
.mb-4
|
.mb-3
|
||||||
.tabby-logo
|
.tabby-logo
|
||||||
h1.tabby-title Tabby
|
h1.tabby-title Tabby
|
||||||
sup α
|
sup α
|
||||||
|
|
||||||
.text-center.mb-5(translate) Thank you for downloading Tabby!
|
.text-center.mb-3(translate) Thank you for downloading Tabby!
|
||||||
|
|
||||||
.form-line
|
.form-line
|
||||||
.header
|
.header
|
||||||
@@ -16,13 +16,54 @@
|
|||||||
*ngFor='let lang of allLanguages'
|
*ngFor='let lang of allLanguages'
|
||||||
) {{lang.name}}
|
) {{lang.name}}
|
||||||
|
|
||||||
|
.form-line
|
||||||
|
.header
|
||||||
|
.title(translate) Switch color scheme
|
||||||
|
|
||||||
|
.btn-group(role='group')
|
||||||
|
input.btn-check(
|
||||||
|
type='radio',
|
||||||
|
name='colorSchemeMode',
|
||||||
|
[(ngModel)]='config.store.appearance.colorSchemeMode',
|
||||||
|
(ngModelChange)='config.save()',
|
||||||
|
id='colorSchemeModeAuto',
|
||||||
|
[value]='"auto"'
|
||||||
|
)
|
||||||
|
label.btn.btn-secondary(
|
||||||
|
for='colorSchemeModeAuto'
|
||||||
|
)
|
||||||
|
span(translate) From system
|
||||||
|
input.btn-check(
|
||||||
|
type='radio',
|
||||||
|
name='colorSchemeMode',
|
||||||
|
[(ngModel)]='config.store.appearance.colorSchemeMode',
|
||||||
|
(ngModelChange)='config.save()',
|
||||||
|
id='colorSchemeModeDark',
|
||||||
|
[value]='"dark"'
|
||||||
|
)
|
||||||
|
label.btn.btn-secondary(
|
||||||
|
for='colorSchemeModeDark'
|
||||||
|
)
|
||||||
|
span(translate) Always dark
|
||||||
|
input.btn-check(
|
||||||
|
type='radio',
|
||||||
|
name='colorSchemeMode',
|
||||||
|
[(ngModel)]='config.store.appearance.colorSchemeMode',
|
||||||
|
(ngModelChange)='config.save()',
|
||||||
|
id='colorSchemeModeLight',
|
||||||
|
[value]='"light"'
|
||||||
|
)
|
||||||
|
label.btn.btn-secondary(
|
||||||
|
for='colorSchemeModeLight'
|
||||||
|
)
|
||||||
|
span(translate) Always light
|
||||||
|
|
||||||
.form-line
|
.form-line
|
||||||
.header
|
.header
|
||||||
.title(translate) Enable analytics
|
.title(translate) Enable analytics
|
||||||
.description(translate) Help track the number of Tabby installs across the world!
|
.description(translate) Help track the number of Tabby installs across the world!
|
||||||
toggle([(ngModel)]='config.store.enableAnalytics')
|
toggle([(ngModel)]='config.store.enableAnalytics')
|
||||||
|
|
||||||
|
|
||||||
.form-line
|
.form-line
|
||||||
.header
|
.header
|
||||||
.title(translate) Enable global hotkey (Ctrl-Space)
|
.title(translate) Enable global hotkey (Ctrl-Space)
|
||||||
|
@@ -6,3 +6,8 @@
|
|||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tabby-logo {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
@@ -9,5 +9,6 @@ export class CoreConfigProvider extends ConfigProvider {
|
|||||||
[Platform.Linux]: require('./configDefaults.linux.yaml').default,
|
[Platform.Linux]: require('./configDefaults.linux.yaml').default,
|
||||||
[Platform.Web]: require('./configDefaults.web.yaml').default,
|
[Platform.Web]: require('./configDefaults.web.yaml').default,
|
||||||
}
|
}
|
||||||
|
|
||||||
defaults = require('./configDefaults.yaml').default
|
defaults = require('./configDefaults.yaml').default
|
||||||
}
|
}
|
||||||
|
@@ -96,5 +96,3 @@ hotkeys:
|
|||||||
- '⌘-Shift-E'
|
- '⌘-Shift-E'
|
||||||
command-selector:
|
command-selector:
|
||||||
- '⌘-Shift-P'
|
- '⌘-Shift-P'
|
||||||
appearance:
|
|
||||||
vibrancy: true
|
|
||||||
|
@@ -19,6 +19,7 @@ appearance:
|
|||||||
vibrancyType: 'blur'
|
vibrancyType: 'blur'
|
||||||
lastTabClosesWindow: false
|
lastTabClosesWindow: false
|
||||||
spaciness: 1
|
spaciness: 1
|
||||||
|
colorSchemeMode: 'dark'
|
||||||
terminal:
|
terminal:
|
||||||
showBuiltinProfiles: true
|
showBuiltinProfiles: true
|
||||||
showRecentProfiles: 3
|
showRecentProfiles: 3
|
||||||
@@ -31,6 +32,7 @@ hotkeys:
|
|||||||
profile-selectors:
|
profile-selectors:
|
||||||
__nonStructural: true
|
__nonStructural: true
|
||||||
profiles: []
|
profiles: []
|
||||||
|
groups: []
|
||||||
profileDefaults:
|
profileDefaults:
|
||||||
__nonStructural: true
|
__nonStructural: true
|
||||||
ssh:
|
ssh:
|
||||||
@@ -41,6 +43,7 @@ enableWelcomeTab: true
|
|||||||
electronFlags:
|
electronFlags:
|
||||||
- ['force_discrete_gpu', '0']
|
- ['force_discrete_gpu', '0']
|
||||||
enableAutomaticUpdates: true
|
enableAutomaticUpdates: true
|
||||||
|
hideTray: false
|
||||||
version: 1
|
version: 1
|
||||||
vault: null
|
vault: null
|
||||||
encrypted: false
|
encrypted: false
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core'
|
import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core'
|
||||||
import { FileUpload, PlatformService } from '../api/platform'
|
import { DirectoryUpload, PlatformService } from '../api/platform'
|
||||||
import './dropZone.directive.scss'
|
import './dropZone.directive.scss'
|
||||||
|
|
||||||
/** @hidden */
|
/** @hidden */
|
||||||
@@ -7,7 +7,7 @@ import './dropZone.directive.scss'
|
|||||||
selector: '[dropZone]',
|
selector: '[dropZone]',
|
||||||
})
|
})
|
||||||
export class DropZoneDirective implements AfterViewInit {
|
export class DropZoneDirective implements AfterViewInit {
|
||||||
@Output() transfer = new EventEmitter<FileUpload>()
|
@Output() transfer = new EventEmitter<DirectoryUpload>()
|
||||||
private dropHint?: HTMLElement
|
private dropHint?: HTMLElement
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
@@ -27,11 +27,9 @@ export class DropZoneDirective implements AfterViewInit {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
this.el.nativeElement.addEventListener('drop', (event: DragEvent) => {
|
this.el.nativeElement.addEventListener('drop', async (event: DragEvent) => {
|
||||||
this.removeHint()
|
this.removeHint()
|
||||||
for (const transfer of this.platform.startUploadFromDragEvent(event, true)) {
|
this.transfer.emit(await this.platform.startUploadFromDragEvent(event, true))
|
||||||
this.transfer.emit(transfer)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
this.el.nativeElement.addEventListener('dragleave', () => {
|
this.el.nativeElement.addEventListener('dragleave', () => {
|
||||||
this.removeHint()
|
this.removeHint()
|
||||||
|
@@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'
|
|||||||
import { TranslateService } from '@ngx-translate/core'
|
import { TranslateService } from '@ngx-translate/core'
|
||||||
import { ProfilesService } from './services/profiles.service'
|
import { ProfilesService } from './services/profiles.service'
|
||||||
import { HotkeyDescription, HotkeyProvider } from './api/hotkeyProvider'
|
import { HotkeyDescription, HotkeyProvider } from './api/hotkeyProvider'
|
||||||
import { PartialProfile, Profile } from './api'
|
|
||||||
|
|
||||||
/** @hidden */
|
/** @hidden */
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@@ -268,7 +267,7 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
|||||||
return [
|
return [
|
||||||
...this.hotkeys,
|
...this.hotkeys,
|
||||||
...profiles.map(profile => ({
|
...profiles.map(profile => ({
|
||||||
id: `profile.${AppHotkeyProvider.getProfileHotkeyName(profile)}`,
|
id: `profile.${ProfilesService.getProfileHotkeyName(profile)}`,
|
||||||
name: this.translate.instant('New tab: {profile}', { profile: profile.name }),
|
name: this.translate.instant('New tab: {profile}', { profile: profile.name }),
|
||||||
})),
|
})),
|
||||||
...this.profilesService.getProviders().map(provider => ({
|
...this.profilesService.getProviders().map(provider => ({
|
||||||
@@ -278,7 +277,4 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
static getProfileHotkeyName (profile: PartialProfile<Profile>): string {
|
|
||||||
return (profile.id ?? profile.name).replace(/\./g, '-')
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -37,7 +37,7 @@ import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive'
|
|||||||
import { DropZoneDirective } from './directives/dropZone.directive'
|
import { DropZoneDirective } from './directives/dropZone.directive'
|
||||||
import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive'
|
import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive'
|
||||||
|
|
||||||
import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ProfilesService, ProfileProvider, SelectorOption, Profile, SelectorService, CommandProvider } from './api'
|
import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ProfilesService, ProfileProvider, QuickConnectProfileProvider, SelectorOption, Profile, SelectorService, CommandProvider } from './api'
|
||||||
|
|
||||||
import { AppService } from './services/app.service'
|
import { AppService } from './services/app.service'
|
||||||
import { ConfigService } from './services/config.service'
|
import { ConfigService } from './services/config.service'
|
||||||
@@ -177,7 +177,7 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
|
|||||||
if (hotkey.startsWith('profile.')) {
|
if (hotkey.startsWith('profile.')) {
|
||||||
const id = hotkey.substring(hotkey.indexOf('.') + 1)
|
const id = hotkey.substring(hotkey.indexOf('.') + 1)
|
||||||
const profiles = await profilesService.getProfiles()
|
const profiles = await profilesService.getProfiles()
|
||||||
const profile = profiles.find(x => AppHotkeyProvider.getProfileHotkeyName(x) === id)
|
const profile = profiles.find(x => ProfilesService.getProfileHotkeyName(x) === id)
|
||||||
if (profile) {
|
if (profile) {
|
||||||
profilesService.openNewTabForProfile(profile)
|
profilesService.openNewTabForProfile(profile)
|
||||||
}
|
}
|
||||||
@@ -188,10 +188,10 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
|
|||||||
if (!provider) {
|
if (!provider) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.showSelector(provider)
|
this.showSelector(provider).catch(() => null)
|
||||||
}
|
}
|
||||||
if (hotkey === 'command-selector') {
|
if (hotkey === 'command-selector') {
|
||||||
commands.showSelector()
|
commands.showSelector().catch(() => null)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hotkey === 'profile-selector') {
|
if (hotkey === 'profile-selector') {
|
||||||
@@ -214,7 +214,7 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
|
|||||||
callback: () => this.profilesService.openNewTabForProfile(p),
|
callback: () => this.profilesService.openNewTabForProfile(p),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
if (provider.supportsQuickConnect) {
|
if (provider instanceof QuickConnectProfileProvider) {
|
||||||
options.push({
|
options.push({
|
||||||
name: this.translate.instant('Quick connect'),
|
name: this.translate.instant('Quick connect'),
|
||||||
freeInputPattern: this.translate.instant('Connect to "%s"...'),
|
freeInputPattern: this.translate.instant('Connect to "%s"...'),
|
||||||
|
@@ -230,11 +230,13 @@ export class AppService {
|
|||||||
if (this._activeTab) {
|
if (this._activeTab) {
|
||||||
this._activeTab.clearActivity()
|
this._activeTab.clearActivity()
|
||||||
this._activeTab.emitBlurred()
|
this._activeTab.emitBlurred()
|
||||||
|
this._activeTab.emitVisibility(false)
|
||||||
}
|
}
|
||||||
this._activeTab = tab
|
this._activeTab = tab
|
||||||
this.activeTabChange.next(tab)
|
this.activeTabChange.next(tab)
|
||||||
setImmediate(() => {
|
setImmediate(() => {
|
||||||
this._activeTab?.emitFocused()
|
this._activeTab?.emitFocused()
|
||||||
|
this._activeTab?.emitVisibility(true)
|
||||||
})
|
})
|
||||||
this.hostWindow.setTitle(this._activeTab?.title)
|
this.hostWindow.setTitle(this._activeTab?.title)
|
||||||
}
|
}
|
||||||
|
@@ -101,7 +101,7 @@ export class CommandService {
|
|||||||
context.tab = tab.getFocusedTab() ?? undefined
|
context.tab = tab.getFocusedTab() ?? undefined
|
||||||
}
|
}
|
||||||
const commands = await this.getCommands(context)
|
const commands = await this.getCommands(context)
|
||||||
await this.selector.show(
|
return this.selector.show(
|
||||||
this.translate.instant('Commands'),
|
this.translate.instant('Commands'),
|
||||||
commands.map(c => ({
|
commands.map(c => ({
|
||||||
name: c.label,
|
name: c.label,
|
||||||
|
@@ -10,6 +10,7 @@ import { PlatformService } from '../api/platform'
|
|||||||
import { HostAppService } from '../api/hostApp'
|
import { HostAppService } from '../api/hostApp'
|
||||||
import { Vault, VaultService } from './vault.service'
|
import { Vault, VaultService } from './vault.service'
|
||||||
import { serializeFunction } from '../utils'
|
import { serializeFunction } from '../utils'
|
||||||
|
import { PartialProfileGroup, ProfileGroup } from '../api/profileProvider'
|
||||||
const deepmerge = require('deepmerge')
|
const deepmerge = require('deepmerge')
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||||
@@ -364,6 +365,55 @@ export class ConfigService {
|
|||||||
}
|
}
|
||||||
config.version = 4
|
config.version = 4
|
||||||
}
|
}
|
||||||
|
if (config.version < 5) {
|
||||||
|
const groups: PartialProfileGroup<ProfileGroup>[] = []
|
||||||
|
for (const p of config.profiles ?? []) {
|
||||||
|
if (!(p.group ?? '').trim()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
let group = groups.find(x => x.name === p.group)
|
||||||
|
if (!group) {
|
||||||
|
group = {
|
||||||
|
id: `${uuidv4()}`,
|
||||||
|
name: `${p.group}`,
|
||||||
|
}
|
||||||
|
groups.push(group)
|
||||||
|
}
|
||||||
|
p.group = group.id
|
||||||
|
}
|
||||||
|
|
||||||
|
const profileGroupCollapsed = JSON.parse(window.localStorage.profileGroupCollapsed ?? '{}')
|
||||||
|
for (const g of groups) {
|
||||||
|
if (profileGroupCollapsed[g.name]) {
|
||||||
|
const collapsed = profileGroupCollapsed[g.name]
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||||
|
delete profileGroupCollapsed[g.name]
|
||||||
|
profileGroupCollapsed[g.id] = collapsed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.localStorage.profileGroupCollapsed = JSON.stringify(profileGroupCollapsed)
|
||||||
|
|
||||||
|
config.groups = groups
|
||||||
|
config.version = 5
|
||||||
|
}
|
||||||
|
if (config.version < 6) {
|
||||||
|
if (config.ssh?.clearServiceMessagesOnConnect === false) {
|
||||||
|
config.profileDefaults ??= {}
|
||||||
|
config.profileDefaults.ssh ??= {}
|
||||||
|
config.profileDefaults.ssh.clearServiceMessagesOnConnect = false
|
||||||
|
delete config.ssh?.clearServiceMessagesOnConnect
|
||||||
|
}
|
||||||
|
config.version = 6
|
||||||
|
}
|
||||||
|
if (config.version < 7) {
|
||||||
|
if (!config.configSync?.host || config.configSync?.host === 'https://api.tabby.sh') {
|
||||||
|
config.configSync ??= {}
|
||||||
|
delete config.configSync.host
|
||||||
|
delete config.configSync.token
|
||||||
|
}
|
||||||
|
config.version = 7
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async maybeDecryptConfig (store) {
|
private async maybeDecryptConfig (store) {
|
||||||
|
@@ -13,8 +13,9 @@ export class FileProvidersService {
|
|||||||
) { }
|
) { }
|
||||||
|
|
||||||
async selectAndStoreFile (description: string): Promise<string> {
|
async selectAndStoreFile (description: string): Promise<string> {
|
||||||
const p = await this.selectProvider()
|
return this.selectProvider().then(p => {
|
||||||
return p.selectAndStoreFile(description)
|
return p.selectAndStoreFile(description)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async retrieveFile (key: string): Promise<Buffer> {
|
async retrieveFile (key: string): Promise<Buffer> {
|
||||||
|
@@ -27,12 +27,8 @@ export class HomeBaseService {
|
|||||||
this.platform.openExternal('https://github.com/Eugeny/tabby')
|
this.platform.openExternal('https://github.com/Eugeny/tabby')
|
||||||
}
|
}
|
||||||
|
|
||||||
openDiscussions (): void {
|
openDiscord (): void {
|
||||||
this.platform.openExternal('https://github.com/Eugeny/tabby/discussions')
|
this.platform.openExternal('https://discord.gg/4c5EVTBhtp')
|
||||||
}
|
|
||||||
|
|
||||||
openTwitter (): void {
|
|
||||||
this.platform.openExternal('https://twitter.com/eugeeeeny')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
openTranslations (): void {
|
openTranslations (): void {
|
||||||
|
@@ -20,7 +20,9 @@ import localeKO from '@angular/common/locales/ko'
|
|||||||
import localePL from '@angular/common/locales/pl'
|
import localePL from '@angular/common/locales/pl'
|
||||||
import localePT from '@angular/common/locales/pt'
|
import localePT from '@angular/common/locales/pt'
|
||||||
import localeRU from '@angular/common/locales/ru'
|
import localeRU from '@angular/common/locales/ru'
|
||||||
|
import localeSRSP from '@angular/common/locales/sr-Cyrl'
|
||||||
import localeSV from '@angular/common/locales/sv'
|
import localeSV from '@angular/common/locales/sv'
|
||||||
|
import localeTR from '@angular/common/locales/tr'
|
||||||
import localeUK from '@angular/common/locales/uk'
|
import localeUK from '@angular/common/locales/uk'
|
||||||
import localeZH from '@angular/common/locales/zh'
|
import localeZH from '@angular/common/locales/zh'
|
||||||
import { Observable, Subject } from 'rxjs'
|
import { Observable, Subject } from 'rxjs'
|
||||||
@@ -45,7 +47,9 @@ registerLocaleData(localeKO)
|
|||||||
registerLocaleData(localePL)
|
registerLocaleData(localePL)
|
||||||
registerLocaleData(localePT)
|
registerLocaleData(localePT)
|
||||||
registerLocaleData(localeRU)
|
registerLocaleData(localeRU)
|
||||||
|
registerLocaleData(localeSRSP)
|
||||||
registerLocaleData(localeSV)
|
registerLocaleData(localeSV)
|
||||||
|
registerLocaleData(localeTR)
|
||||||
registerLocaleData(localeUK)
|
registerLocaleData(localeUK)
|
||||||
registerLocaleData(localeZH)
|
registerLocaleData(localeZH)
|
||||||
|
|
||||||
@@ -136,6 +140,10 @@ export class LocaleService {
|
|||||||
code: 'sv-SE',
|
code: 'sv-SE',
|
||||||
name: 'Svenska',
|
name: 'Svenska',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: 'tr-TR',
|
||||||
|
name: 'Türkçe',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
code: 'bg-BG',
|
code: 'bg-BG',
|
||||||
name: 'Български',
|
name: 'Български',
|
||||||
@@ -144,6 +152,10 @@ export class LocaleService {
|
|||||||
code: 'ru-RU',
|
code: 'ru-RU',
|
||||||
name: 'Русский',
|
name: 'Русский',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: 'sr-SP',
|
||||||
|
name: 'Српски',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
code: 'uk-UA',
|
code: 'uk-UA',
|
||||||
name: 'Українська',
|
name: 'Українська',
|
||||||
|
@@ -2,12 +2,15 @@ import { Injectable, Inject } from '@angular/core'
|
|||||||
import { TranslateService } from '@ngx-translate/core'
|
import { TranslateService } from '@ngx-translate/core'
|
||||||
import { NewTabParameters } from './tabs.service'
|
import { NewTabParameters } from './tabs.service'
|
||||||
import { BaseTabComponent } from '../components/baseTab.component'
|
import { BaseTabComponent } from '../components/baseTab.component'
|
||||||
import { PartialProfile, Profile, ProfileProvider } from '../api/profileProvider'
|
import { QuickConnectProfileProvider, PartialProfile, PartialProfileGroup, Profile, ProfileGroup, ProfileProvider } from '../api/profileProvider'
|
||||||
import { SelectorOption } from '../api/selector'
|
import { SelectorOption } from '../api/selector'
|
||||||
import { AppService } from './app.service'
|
import { AppService } from './app.service'
|
||||||
import { configMerge, ConfigProxy, ConfigService } from './config.service'
|
import { configMerge, ConfigProxy, ConfigService } from './config.service'
|
||||||
import { NotificationsService } from './notifications.service'
|
import { NotificationsService } from './notifications.service'
|
||||||
import { SelectorService } from './selector.service'
|
import { SelectorService } from './selector.service'
|
||||||
|
import deepClone from 'clone-deep'
|
||||||
|
import { v4 as uuidv4 } from 'uuid'
|
||||||
|
import slugify from 'slugify'
|
||||||
|
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class ProfilesService {
|
export class ProfilesService {
|
||||||
@@ -36,6 +39,127 @@ export class ProfilesService {
|
|||||||
@Inject(ProfileProvider) private profileProviders: ProfileProvider<Profile>[],
|
@Inject(ProfileProvider) private profileProviders: ProfileProvider<Profile>[],
|
||||||
) { }
|
) { }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methods used to interact with ProfileProvider
|
||||||
|
*/
|
||||||
|
|
||||||
|
getProviders (): ProfileProvider<Profile>[] {
|
||||||
|
return [...this.profileProviders]
|
||||||
|
}
|
||||||
|
|
||||||
|
providerForProfile <T extends Profile> (profile: PartialProfile<T>): ProfileProvider<T>|null {
|
||||||
|
const provider = this.profileProviders.find(x => x.id === profile.type) ?? null
|
||||||
|
return provider as unknown as ProfileProvider<T>|null
|
||||||
|
}
|
||||||
|
|
||||||
|
getDescription <P extends Profile> (profile: PartialProfile<P>): string|null {
|
||||||
|
profile = this.getConfigProxyForProfile(profile)
|
||||||
|
return this.providerForProfile(profile)?.getDescription(profile) ?? null
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methods used to interact with Profile
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return ConfigProxy for a given Profile
|
||||||
|
* arg: skipUserDefaults -> do not merge global provider defaults in ConfigProxy
|
||||||
|
* arg: skipGroupDefaults -> do not merge parent group provider defaults in ConfigProxy
|
||||||
|
*/
|
||||||
|
getConfigProxyForProfile <T extends Profile> (profile: PartialProfile<T>, options?: { skipGlobalDefaults?: boolean, skipGroupDefaults?: boolean }): T {
|
||||||
|
const defaults = this.getProfileDefaults(profile, options).reduce(configMerge, {})
|
||||||
|
return new ConfigProxy(profile, defaults) as unknown as T
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an Array of Profiles
|
||||||
|
* arg: includeBuiltin (default: true) -> include BuiltinProfiles
|
||||||
|
* arg: clone (default: false) -> return deepclone Array
|
||||||
|
*/
|
||||||
|
async getProfiles (options?: { includeBuiltin?: boolean, clone?: boolean }): Promise<PartialProfile<Profile>[]> {
|
||||||
|
let list = this.config.store.profiles ?? []
|
||||||
|
if (options?.includeBuiltin ?? true) {
|
||||||
|
const lists = await Promise.all(this.config.enabledServices(this.profileProviders).map(x => x.getBuiltinProfiles()))
|
||||||
|
list = [
|
||||||
|
...this.config.store.profiles ?? [],
|
||||||
|
...lists.reduce((a, b) => a.concat(b), []),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortKey = p => `${this.resolveProfileGroupName(p.group ?? '')} / ${p.name}`
|
||||||
|
list.sort((a, b) => sortKey(a).localeCompare(sortKey(b)))
|
||||||
|
list.sort((a, b) => (a.isBuiltin ? 1 : 0) - (b.isBuiltin ? 1 : 0))
|
||||||
|
return options?.clone ? deepClone(list) : list
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a new Profile in config
|
||||||
|
* arg: genId (default: true) -> generate uuid in before pushing Profile into config
|
||||||
|
*/
|
||||||
|
async newProfile (profile: PartialProfile<Profile>, options?: { genId?: boolean }): Promise<void> {
|
||||||
|
if (options?.genId ?? true) {
|
||||||
|
profile.id = `${profile.type}:custom:${slugify(profile.name)}:${uuidv4()}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const cProfile = this.config.store.profiles.find(p => p.id === profile.id)
|
||||||
|
if (cProfile) {
|
||||||
|
throw new Error(`Cannot insert new Profile, duplicated Id: ${profile.id}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.config.store.profiles.push(profile)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a Profile in config
|
||||||
|
*/
|
||||||
|
async writeProfile (profile: PartialProfile<Profile>): Promise<void> {
|
||||||
|
const cProfile = this.config.store.profiles.find(p => p.id === profile.id)
|
||||||
|
if (cProfile) {
|
||||||
|
// Fully replace the config
|
||||||
|
for (const k in cProfile) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||||
|
delete cProfile[k]
|
||||||
|
}
|
||||||
|
Object.assign(cProfile, profile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a Profile from config
|
||||||
|
*/
|
||||||
|
async deleteProfile (profile: PartialProfile<Profile>): Promise<void> {
|
||||||
|
this.providerForProfile(profile)?.deleteProfile(this.getConfigProxyForProfile(profile))
|
||||||
|
this.config.store.profiles = this.config.store.profiles.filter(p => p.id !== profile.id)
|
||||||
|
|
||||||
|
const profileHotkeyName = ProfilesService.getProfileHotkeyName(profile)
|
||||||
|
if (this.config.store.hotkeys.profile.hasOwnProperty(profileHotkeyName)) {
|
||||||
|
const profileHotkeys = deepClone(this.config.store.hotkeys.profile)
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||||
|
delete profileHotkeys[profileHotkeyName]
|
||||||
|
this.config.store.hotkeys.profile = profileHotkeys
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete all Profiles from config using option filter
|
||||||
|
* arg: filter (p: PartialProfile<Profile>) => boolean -> predicate used to decide which profiles have to be deleted
|
||||||
|
*/
|
||||||
|
async bulkDeleteProfiles (filter: (p: PartialProfile<Profile>) => boolean): Promise<void> {
|
||||||
|
for (const profile of this.config.store.profiles.filter(filter)) {
|
||||||
|
this.providerForProfile(profile)?.deleteProfile(this.getConfigProxyForProfile(profile))
|
||||||
|
|
||||||
|
const profileHotkeyName = ProfilesService.getProfileHotkeyName(profile)
|
||||||
|
if (this.config.store.hotkeys.profile.hasOwnProperty(profileHotkeyName)) {
|
||||||
|
const profileHotkeys = deepClone(this.config.store.hotkeys.profile)
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||||
|
delete profileHotkeys[profileHotkeyName]
|
||||||
|
this.config.store.hotkeys.profile = profileHotkeys
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.config.store.profiles = this.config.store.profiles.filter(x => !filter(x))
|
||||||
|
}
|
||||||
|
|
||||||
async openNewTabForProfile <P extends Profile> (profile: PartialProfile<P>): Promise<BaseTabComponent|null> {
|
async openNewTabForProfile <P extends Profile> (profile: PartialProfile<P>): Promise<BaseTabComponent|null> {
|
||||||
const params = await this.newTabParametersForProfile(profile)
|
const params = await this.newTabParametersForProfile(profile)
|
||||||
if (params) {
|
if (params) {
|
||||||
@@ -63,52 +187,40 @@ export class ProfilesService {
|
|||||||
return params
|
return params
|
||||||
}
|
}
|
||||||
|
|
||||||
getProviders (): ProfileProvider<Profile>[] {
|
async launchProfile (profile: PartialProfile<Profile>): Promise<void> {
|
||||||
return [...this.profileProviders]
|
await this.openNewTabForProfile(profile)
|
||||||
|
|
||||||
|
let recentProfiles: PartialProfile<Profile>[] = JSON.parse(window.localStorage['recentProfiles'] ?? '[]')
|
||||||
|
if (this.config.store.terminal.showRecentProfiles > 0) {
|
||||||
|
recentProfiles = recentProfiles.filter(x => x.group !== profile.group || x.name !== profile.name)
|
||||||
|
recentProfiles.unshift(profile)
|
||||||
|
recentProfiles = recentProfiles.slice(0, this.config.store.terminal.showRecentProfiles)
|
||||||
|
} else {
|
||||||
|
recentProfiles = []
|
||||||
|
}
|
||||||
|
window.localStorage['recentProfiles'] = JSON.stringify(recentProfiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getProfiles (): Promise<PartialProfile<Profile>[]> {
|
static getProfileHotkeyName (profile: PartialProfile<Profile>): string {
|
||||||
const lists = await Promise.all(this.config.enabledServices(this.profileProviders).map(x => x.getBuiltinProfiles()))
|
return (profile.id ?? profile.name).replace(/\./g, '-')
|
||||||
let list = lists.reduce((a, b) => a.concat(b), [])
|
|
||||||
list = [
|
|
||||||
...this.config.store.profiles ?? [],
|
|
||||||
...list,
|
|
||||||
]
|
|
||||||
const sortKey = p => `${p.group ?? ''} / ${p.name}`
|
|
||||||
list.sort((a, b) => sortKey(a).localeCompare(sortKey(b)))
|
|
||||||
list.sort((a, b) => (a.isBuiltin ? 1 : 0) - (b.isBuiltin ? 1 : 0))
|
|
||||||
return list
|
|
||||||
}
|
}
|
||||||
|
|
||||||
providerForProfile <T extends Profile> (profile: PartialProfile<T>): ProfileProvider<T>|null {
|
/*
|
||||||
const provider = this.profileProviders.find(x => x.id === profile.type) ?? null
|
* Methods used to interact with Profile Selector
|
||||||
return provider as unknown as ProfileProvider<T>|null
|
*/
|
||||||
}
|
|
||||||
|
|
||||||
getDescription <P extends Profile> (profile: PartialProfile<P>): string|null {
|
|
||||||
profile = this.getConfigProxyForProfile(profile)
|
|
||||||
return this.providerForProfile(profile)?.getDescription(profile) ?? null
|
|
||||||
}
|
|
||||||
|
|
||||||
selectorOptionForProfile <P extends Profile, T> (profile: PartialProfile<P>): SelectorOption<T> {
|
selectorOptionForProfile <P extends Profile, T> (profile: PartialProfile<P>): SelectorOption<T> {
|
||||||
const fullProfile = this.getConfigProxyForProfile(profile)
|
const fullProfile = this.getConfigProxyForProfile(profile)
|
||||||
const provider = this.providerForProfile(fullProfile)
|
const provider = this.providerForProfile(fullProfile)
|
||||||
const freeInputEquivalent = provider?.intoQuickConnectString(fullProfile) ?? undefined
|
const freeInputEquivalent = provider instanceof QuickConnectProfileProvider ? provider.intoQuickConnectString(fullProfile) ?? undefined : undefined
|
||||||
return {
|
return {
|
||||||
...profile,
|
...profile,
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
group: this.resolveProfileGroupName(profile.group ?? ''),
|
||||||
group: profile.group || '',
|
|
||||||
freeInputEquivalent,
|
freeInputEquivalent,
|
||||||
description: provider?.getDescription(fullProfile),
|
description: provider?.getDescription(fullProfile),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getRecentProfiles (): PartialProfile<Profile>[] {
|
|
||||||
let recentProfiles: PartialProfile<Profile>[] = JSON.parse(window.localStorage['recentProfiles'] ?? '[]')
|
|
||||||
recentProfiles = recentProfiles.slice(0, this.config.store.terminal.showRecentProfiles)
|
|
||||||
return recentProfiles
|
|
||||||
}
|
|
||||||
|
|
||||||
showProfileSelector (): Promise<PartialProfile<Profile>|null> {
|
showProfileSelector (): Promise<PartialProfile<Profile>|null> {
|
||||||
if (this.selector.active) {
|
if (this.selector.active) {
|
||||||
return Promise.resolve(null)
|
return Promise.resolve(null)
|
||||||
@@ -118,12 +230,12 @@ export class ProfilesService {
|
|||||||
try {
|
try {
|
||||||
const recentProfiles = this.getRecentProfiles()
|
const recentProfiles = this.getRecentProfiles()
|
||||||
|
|
||||||
let options: SelectorOption<void>[] = recentProfiles.map(p => ({
|
let options: SelectorOption<void>[] = recentProfiles.map((p, i) => ({
|
||||||
...this.selectorOptionForProfile(p),
|
...this.selectorOptionForProfile(p),
|
||||||
group: this.translate.instant('Recent'),
|
group: this.translate.instant('Recent'),
|
||||||
icon: 'fas fa-history',
|
icon: 'fas fa-history',
|
||||||
color: p.color,
|
color: p.color,
|
||||||
weight: -2,
|
weight: i - (recentProfiles.length + 1),
|
||||||
callback: async () => {
|
callback: async () => {
|
||||||
if (p.id) {
|
if (p.id) {
|
||||||
p = (await this.getProfiles()).find(x => x.id === p.id) ?? p
|
p = (await this.getProfiles()).find(x => x.id === p.id) ?? p
|
||||||
@@ -177,30 +289,38 @@ export class ProfilesService {
|
|||||||
})
|
})
|
||||||
} catch { }
|
} catch { }
|
||||||
|
|
||||||
this.getProviders().filter(x => x.supportsQuickConnect).forEach(provider => {
|
this.getProviders().forEach(provider => {
|
||||||
options.push({
|
if (provider instanceof QuickConnectProfileProvider) {
|
||||||
name: this.translate.instant('Quick connect'),
|
options.push({
|
||||||
freeInputPattern: this.translate.instant('Connect to "%s"...'),
|
name: this.translate.instant('Quick connect'),
|
||||||
description: `(${provider.name.toUpperCase()})`,
|
freeInputPattern: this.translate.instant('Connect to "%s"...'),
|
||||||
icon: 'fas fa-arrow-right',
|
description: `(${provider.name.toUpperCase()})`,
|
||||||
weight: provider.id !== this.config.store.defaultQuickConnectProvider ? 1 : 0,
|
icon: 'fas fa-arrow-right',
|
||||||
callback: query => {
|
weight: provider.id !== this.config.store.defaultQuickConnectProvider ? 1 : 0,
|
||||||
const profile = provider.quickConnect(query)
|
callback: query => {
|
||||||
resolve(profile)
|
const profile = provider.quickConnect(query)
|
||||||
},
|
resolve(profile)
|
||||||
})
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
await this.selector.show(this.translate.instant('Select profile or enter an address'), options)
|
await this.selector.show(this.translate.instant('Select profile or enter an address'), options).catch(() => reject())
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
reject(err)
|
reject(err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getRecentProfiles (): PartialProfile<Profile>[] {
|
||||||
|
let recentProfiles: PartialProfile<Profile>[] = JSON.parse(window.localStorage['recentProfiles'] ?? '[]')
|
||||||
|
recentProfiles = recentProfiles.slice(0, this.config.store.terminal.showRecentProfiles)
|
||||||
|
return recentProfiles
|
||||||
|
}
|
||||||
|
|
||||||
async quickConnect (query: string): Promise<PartialProfile<Profile>|null> {
|
async quickConnect (query: string): Promise<PartialProfile<Profile>|null> {
|
||||||
for (const provider of this.getProviders()) {
|
for (const provider of this.getProviders()) {
|
||||||
if (provider.supportsQuickConnect) {
|
if (provider instanceof QuickConnectProfileProvider) {
|
||||||
const profile = provider.quickConnect(query)
|
const profile = provider.quickConnect(query)
|
||||||
if (profile) {
|
if (profile) {
|
||||||
return profile
|
return profile
|
||||||
@@ -211,27 +331,178 @@ export class ProfilesService {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
getConfigProxyForProfile <T extends Profile> (profile: PartialProfile<T>, skipUserDefaults = false): T {
|
/*
|
||||||
|
* Methods used to interact with Profile/ProfileGroup/Global defaults
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return global defaults for a given profile provider
|
||||||
|
* Always return something, empty object if no defaults found
|
||||||
|
*/
|
||||||
|
getProviderDefaults (provider: ProfileProvider<Profile>): any {
|
||||||
|
const defaults = this.config.store.profileDefaults
|
||||||
|
return defaults[provider.id] ?? {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set global defaults for a given profile provider
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||||
|
setProviderDefaults (provider: ProfileProvider<Profile>, pdefaults: any): void {
|
||||||
|
this.config.store.profileDefaults[provider.id] = pdefaults
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return defaults for a given profile
|
||||||
|
* Always return something, empty object if no defaults found
|
||||||
|
* arg: skipUserDefaults -> do not merge global provider defaults in ConfigProxy
|
||||||
|
* arg: skipGroupDefaults -> do not merge parent group provider defaults in ConfigProxy
|
||||||
|
*/
|
||||||
|
getProfileDefaults (profile: PartialProfile<Profile>, options?: { skipGlobalDefaults?: boolean, skipGroupDefaults?: boolean }): any[] {
|
||||||
const provider = this.providerForProfile(profile)
|
const provider = this.providerForProfile(profile)
|
||||||
const defaults = [
|
|
||||||
|
return [
|
||||||
this.profileDefaults,
|
this.profileDefaults,
|
||||||
provider?.configDefaults ?? {},
|
provider?.configDefaults ?? {},
|
||||||
!provider || skipUserDefaults ? {} : this.config.store.profileDefaults[provider.id] ?? {},
|
provider && !options?.skipGlobalDefaults ? this.getProviderDefaults(provider) : {},
|
||||||
].reduce(configMerge, {})
|
provider && !options?.skipGlobalDefaults && !options?.skipGroupDefaults ? this.getProviderProfileGroupDefaults(profile.group ?? '', provider) : {},
|
||||||
return new ConfigProxy(profile, defaults) as unknown as T
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
async launchProfile (profile: PartialProfile<Profile>): Promise<void> {
|
/*
|
||||||
await this.openNewTabForProfile(profile)
|
* Methods used to interact with ProfileGroup
|
||||||
|
*/
|
||||||
|
|
||||||
let recentProfiles: PartialProfile<Profile>[] = JSON.parse(window.localStorage['recentProfiles'] ?? '[]')
|
/**
|
||||||
if (this.config.store.terminal.showRecentProfiles > 0) {
|
* Synchronously return an Array of the existing ProfileGroups
|
||||||
recentProfiles = recentProfiles.filter(x => x.group !== profile.group || x.name !== profile.name)
|
* Does not return builtin groups
|
||||||
recentProfiles.unshift(profile)
|
*/
|
||||||
recentProfiles = recentProfiles.slice(0, this.config.store.terminal.showRecentProfiles)
|
getSyncProfileGroups (): PartialProfileGroup<ProfileGroup>[] {
|
||||||
} else {
|
return deepClone(this.config.store.groups ?? [])
|
||||||
recentProfiles = []
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an Array of the existing ProfileGroups
|
||||||
|
* arg: includeProfiles (default: false) -> if false, does not fill up the profiles field of ProfileGroup
|
||||||
|
* arg: includeNonUserGroup (default: false) -> if false, does not add built-in and ungrouped groups
|
||||||
|
*/
|
||||||
|
async getProfileGroups (options?: { includeProfiles?: boolean, includeNonUserGroup?: boolean }): Promise<PartialProfileGroup<ProfileGroup>[]> {
|
||||||
|
let profiles: PartialProfile<Profile>[] = []
|
||||||
|
if (options?.includeProfiles) {
|
||||||
|
profiles = await this.getProfiles({ includeBuiltin: options.includeNonUserGroup, clone: true })
|
||||||
}
|
}
|
||||||
window.localStorage['recentProfiles'] = JSON.stringify(recentProfiles)
|
|
||||||
|
let groups: PartialProfileGroup<ProfileGroup>[] = this.getSyncProfileGroups()
|
||||||
|
groups = groups.map(x => {
|
||||||
|
x.editable = true
|
||||||
|
|
||||||
|
if (options?.includeProfiles) {
|
||||||
|
x.profiles = profiles.filter(p => p.group === x.id)
|
||||||
|
profiles = profiles.filter(p => p.group !== x.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return x
|
||||||
|
})
|
||||||
|
|
||||||
|
if (options?.includeNonUserGroup) {
|
||||||
|
const builtInGroups: PartialProfileGroup<ProfileGroup>[] = []
|
||||||
|
builtInGroups.push({
|
||||||
|
id: 'built-in',
|
||||||
|
name: this.translate.instant('Built-in'),
|
||||||
|
editable: false,
|
||||||
|
profiles: [],
|
||||||
|
})
|
||||||
|
|
||||||
|
const ungrouped: PartialProfileGroup<ProfileGroup> = {
|
||||||
|
id: 'ungrouped',
|
||||||
|
name: this.translate.instant('Ungrouped'),
|
||||||
|
editable: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.includeProfiles) {
|
||||||
|
for (const profile of profiles.filter(p => p.isBuiltin)) {
|
||||||
|
let group: PartialProfileGroup<ProfileGroup> | undefined = builtInGroups.find(g => g.id === slugify(profile.group ?? 'built-in'))
|
||||||
|
if (!group) {
|
||||||
|
group = {
|
||||||
|
id: `${slugify(profile.group!)}`,
|
||||||
|
name: `${profile.group!}`,
|
||||||
|
editable: false,
|
||||||
|
profiles: [],
|
||||||
|
}
|
||||||
|
builtInGroups.push(group)
|
||||||
|
}
|
||||||
|
|
||||||
|
group.profiles!.push(profile)
|
||||||
|
}
|
||||||
|
|
||||||
|
ungrouped.profiles = profiles.filter(p => !p.isBuiltin)
|
||||||
|
}
|
||||||
|
|
||||||
|
groups = groups.concat(builtInGroups)
|
||||||
|
groups.push(ungrouped)
|
||||||
|
}
|
||||||
|
|
||||||
|
return groups
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a new ProfileGroup in config
|
||||||
|
* arg: genId (default: true) -> generate uuid in before pushing Profile into config
|
||||||
|
*/
|
||||||
|
async newProfileGroup (group: PartialProfileGroup<ProfileGroup>, options?: { genId?: boolean }): Promise<void> {
|
||||||
|
if (options?.genId ?? true) {
|
||||||
|
group.id = `${uuidv4()}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const cProfileGroup = this.config.store.groups.find(p => p.id === group.id)
|
||||||
|
if (cProfileGroup) {
|
||||||
|
throw new Error(`Cannot insert new ProfileGroup, duplicated Id: ${group.id}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.config.store.groups.push(group)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a ProfileGroup in config
|
||||||
|
*/
|
||||||
|
async writeProfileGroup (group: PartialProfileGroup<ProfileGroup>): Promise<void> {
|
||||||
|
delete group.profiles
|
||||||
|
delete group.editable
|
||||||
|
|
||||||
|
const cGroup = this.config.store.groups.find(g => g.id === group.id)
|
||||||
|
if (cGroup) {
|
||||||
|
Object.assign(cGroup, group)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a ProfileGroup from config
|
||||||
|
*/
|
||||||
|
async deleteProfileGroup (group: PartialProfileGroup<ProfileGroup>, options?: { deleteProfiles?: boolean }): Promise<void> {
|
||||||
|
this.config.store.groups = this.config.store.groups.filter(g => g.id !== group.id)
|
||||||
|
if (options?.deleteProfiles) {
|
||||||
|
await this.bulkDeleteProfiles((p) => p.group === group.id)
|
||||||
|
} else {
|
||||||
|
for (const profile of this.config.store.profiles.filter(x => x.group === group.id)) {
|
||||||
|
delete profile.group
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve and return ProfileGroup Name from ProfileGroup ID
|
||||||
|
*/
|
||||||
|
resolveProfileGroupName (groupId: string): string {
|
||||||
|
return this.config.store.groups.find(g => g.id === groupId)?.name ?? groupId
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return defaults for a given group ID and provider
|
||||||
|
* Always return something, empty object if no defaults found
|
||||||
|
* arg: skipUserDefaults -> do not merge global provider defaults in ConfigProxy
|
||||||
|
*/
|
||||||
|
getProviderProfileGroupDefaults (groupId: string, provider: ProfileProvider<Profile>): any {
|
||||||
|
return this.getSyncProfileGroups().find(g => g.id === groupId)?.defaults?.[provider.id] ?? {}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,7 @@ export class TabsService {
|
|||||||
const componentRef = componentFactory.create(this.injector)
|
const componentRef = componentFactory.create(this.injector)
|
||||||
const tab = componentRef.instance
|
const tab = componentRef.instance
|
||||||
tab.hostView = componentRef.hostView
|
tab.hostView = componentRef.hostView
|
||||||
|
tab.destroyed$.subscribe(() => componentRef.destroy())
|
||||||
Object.assign(tab, params.inputs ?? {})
|
Object.assign(tab, params.inputs ?? {})
|
||||||
return tab
|
return tab
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ import { Subject, Observable } from 'rxjs'
|
|||||||
import * as Color from 'color'
|
import * as Color from 'color'
|
||||||
import { ConfigService } from '../services/config.service'
|
import { ConfigService } from '../services/config.service'
|
||||||
import { Theme } from '../api/theme'
|
import { Theme } from '../api/theme'
|
||||||
import { PlatformService } from '../api/platform'
|
import { PlatformService, PlatformTheme } from '../api/platform'
|
||||||
import { NewTheme } from '../theme'
|
import { NewTheme } from '../theme'
|
||||||
|
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
@@ -194,7 +194,14 @@ export class ThemesService {
|
|||||||
|
|
||||||
/// @hidden
|
/// @hidden
|
||||||
_getActiveColorScheme (): any {
|
_getActiveColorScheme (): any {
|
||||||
if (this.platform.getTheme() === 'light') {
|
let theme: PlatformTheme = 'dark'
|
||||||
|
if (this.config.store.appearance.colorSchemeMode === 'light') {
|
||||||
|
theme = 'light'
|
||||||
|
} else if (this.config.store.appearance.colorSchemeMode === 'auto') {
|
||||||
|
theme = this.platform.getTheme()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theme === 'light') {
|
||||||
return this.config.store.terminal.lightColorScheme
|
return this.config.store.terminal.lightColorScheme
|
||||||
} else {
|
} else {
|
||||||
return this.config.store.terminal.colorScheme
|
return this.config.store.terminal.colorScheme
|
||||||
|
@@ -285,7 +285,7 @@ export class VaultFileProvider extends FileProvider {
|
|||||||
icon: 'fas fa-file',
|
icon: 'fas fa-file',
|
||||||
result: f,
|
result: f,
|
||||||
})),
|
})),
|
||||||
])
|
]).catch(() => null)
|
||||||
if (result) {
|
if (result) {
|
||||||
return `${this.prefix}${result.key.id}`
|
return `${this.prefix}${result.key.id}`
|
||||||
}
|
}
|
||||||
|
@@ -149,7 +149,7 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
|
|||||||
click: async () => {
|
click: async () => {
|
||||||
const modal = this.ngbModal.open(PromptModalComponent)
|
const modal = this.ngbModal.open(PromptModalComponent)
|
||||||
modal.componentInstance.prompt = this.translate.instant('Profile name')
|
modal.componentInstance.prompt = this.translate.instant('Profile name')
|
||||||
const name = (await modal.result)?.value
|
const name = (await modal.result.catch(() => null))?.value
|
||||||
if (!name) {
|
if (!name) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -262,7 +262,7 @@ export class ProfilesContextMenu extends TabContextMenuItemProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async switchTabProfile (tab: BaseTabComponent) {
|
async switchTabProfile (tab: BaseTabComponent) {
|
||||||
const profile = await this.profilesService.showProfileSelector()
|
const profile = await this.profilesService.showProfileSelector().catch(() => null)
|
||||||
if (!profile) {
|
if (!profile) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -22,5 +22,6 @@ export class ElectronConfigProvider extends ConfigProvider {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
defaults = {}
|
defaults = {}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@ export class ElectronService {
|
|||||||
clipboard: Clipboard
|
clipboard: Clipboard
|
||||||
globalShortcut: GlobalShortcut
|
globalShortcut: GlobalShortcut
|
||||||
screen: Screen
|
screen: Screen
|
||||||
remote = remote
|
|
||||||
process: any
|
process: any
|
||||||
autoUpdater: AutoUpdater
|
autoUpdater: AutoUpdater
|
||||||
powerSaveBlocker: PowerSaveBlocker
|
powerSaveBlocker: PowerSaveBlocker
|
||||||
@@ -44,7 +43,6 @@ export class ElectronService {
|
|||||||
this.BrowserWindow = remote.BrowserWindow
|
this.BrowserWindow = remote.BrowserWindow
|
||||||
this.Menu = remote.Menu
|
this.Menu = remote.Menu
|
||||||
this.MenuItem = remote.MenuItem
|
this.MenuItem = remote.MenuItem
|
||||||
this.MenuItem = remote.MenuItem
|
|
||||||
this.nativeTheme = remote.nativeTheme
|
this.nativeTheme = remote.nativeTheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -5,12 +5,13 @@ import * as os from 'os'
|
|||||||
import promiseIpc, { RendererProcessType } from 'electron-promise-ipc'
|
import promiseIpc, { RendererProcessType } from 'electron-promise-ipc'
|
||||||
import { execFile } from 'mz/child_process'
|
import { execFile } from 'mz/child_process'
|
||||||
import { Injectable, NgZone } from '@angular/core'
|
import { Injectable, NgZone } from '@angular/core'
|
||||||
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, DirectoryUpload, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||||
import { ElectronService } from '../services/electron.service'
|
import { ElectronService } from '../services/electron.service'
|
||||||
import { ElectronHostWindow } from './hostWindow.service'
|
import { ElectronHostWindow } from './hostWindow.service'
|
||||||
import { ShellIntegrationService } from './shellIntegration.service'
|
import { ShellIntegrationService } from './shellIntegration.service'
|
||||||
import { ElectronHostAppService } from './hostApp.service'
|
import { ElectronHostAppService } from './hostApp.service'
|
||||||
import { PlatformTheme } from '../../../tabby-core/src/api/platform'
|
import { PlatformTheme } from '../../../tabby-core/src/api/platform'
|
||||||
|
import { configPath } from '../../../app/lib/config'
|
||||||
const fontManager = require('fontmanager-redux') // eslint-disable-line
|
const fontManager = require('fontmanager-redux') // eslint-disable-line
|
||||||
|
|
||||||
/* eslint-disable block-scoped-var */
|
/* eslint-disable block-scoped-var */
|
||||||
@@ -36,7 +37,7 @@ export class ElectronPlatformService extends PlatformService {
|
|||||||
private translate: TranslateService,
|
private translate: TranslateService,
|
||||||
) {
|
) {
|
||||||
super()
|
super()
|
||||||
this.configPath = path.join(electron.app.getPath('userData'), 'config.yaml')
|
this.configPath = configPath
|
||||||
|
|
||||||
electron.ipcRenderer.on('host:display-metrics-changed', () => {
|
electron.ipcRenderer.on('host:display-metrics-changed', () => {
|
||||||
this.zone.run(() => this.displayMetricsChanged.next())
|
this.zone.run(() => this.displayMetricsChanged.next())
|
||||||
@@ -47,6 +48,21 @@ export class ElectronPlatformService extends PlatformService {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getAllFiles (dir: string, root: DirectoryUpload): Promise<DirectoryUpload> {
|
||||||
|
const items = await fs.readdir(dir, { withFileTypes: true })
|
||||||
|
for (const item of items) {
|
||||||
|
if (item.isDirectory()) {
|
||||||
|
root.pushChildren(await this.getAllFiles(path.join(dir, item.name), new DirectoryUpload(item.name)))
|
||||||
|
} else {
|
||||||
|
const file = new ElectronFileUpload(path.join(dir, item.name), this.electron)
|
||||||
|
root.pushChildren(file)
|
||||||
|
await wrapPromise(this.zone, file.open())
|
||||||
|
this.fileTransferStarted.next(file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
readClipboard (): string {
|
readClipboard (): string {
|
||||||
return this.electron.clipboard.readText()
|
return this.electron.clipboard.readText()
|
||||||
}
|
}
|
||||||
@@ -215,6 +231,28 @@ export class ElectronPlatformService extends PlatformService {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async startUploadDirectory (paths?: string[]): Promise<DirectoryUpload> {
|
||||||
|
const properties: any[] = ['openFile', 'treatPackageAsDirectory', 'openDirectory']
|
||||||
|
|
||||||
|
if (!paths) {
|
||||||
|
const result = await this.electron.dialog.showOpenDialog(
|
||||||
|
this.hostWindow.getWindow(),
|
||||||
|
{
|
||||||
|
buttonLabel: this.translate.instant('Select'),
|
||||||
|
properties,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if (result.canceled) {
|
||||||
|
return new DirectoryUpload()
|
||||||
|
}
|
||||||
|
paths = result.filePaths
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = new DirectoryUpload()
|
||||||
|
root.pushChildren(await this.getAllFiles(paths[0].split(path.sep).join(path.posix.sep), new DirectoryUpload(path.basename(paths[0]))))
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
async startDownload (name: string, mode: number, size: number, filePath?: string): Promise<FileDownload|null> {
|
async startDownload (name: string, mode: number, size: number, filePath?: string): Promise<FileDownload|null> {
|
||||||
if (!filePath) {
|
if (!filePath) {
|
||||||
const result = await this.electron.dialog.showSaveDialog(
|
const result = await this.electron.dialog.showSaveDialog(
|
||||||
|
@@ -33,6 +33,7 @@ export class ShellIntegrationService {
|
|||||||
command: 'paste "%V"',
|
command: 'paste "%V"',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
private constructor (
|
private constructor (
|
||||||
private electron: ElectronService,
|
private electron: ElectronService,
|
||||||
private hostApp: HostAppService,
|
private hostApp: HostAppService,
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
import type { AppUpdater } from 'electron-updater'
|
|
||||||
import { Injectable } from '@angular/core'
|
import { Injectable } from '@angular/core'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
@@ -13,7 +12,6 @@ export class ElectronUpdaterService extends UpdaterService {
|
|||||||
private downloaded: Promise<boolean>
|
private downloaded: Promise<boolean>
|
||||||
private electronUpdaterAvailable = true
|
private electronUpdaterAvailable = true
|
||||||
private updateURL: string
|
private updateURL: string
|
||||||
private autoUpdater: AppUpdater
|
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
log: LogService,
|
log: LogService,
|
||||||
@@ -25,37 +23,33 @@ export class ElectronUpdaterService extends UpdaterService {
|
|||||||
super()
|
super()
|
||||||
this.logger = log.create('updater')
|
this.logger = log.create('updater')
|
||||||
|
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux' || process.env.PORTABLE_EXECUTABLE_FILE) {
|
||||||
this.electronUpdaterAvailable = false
|
this.electronUpdaterAvailable = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
|
this.electron.ipcRenderer.on('updater:update-available', () => {
|
||||||
this.autoUpdater.autoDownload = true
|
|
||||||
this.autoUpdater.autoInstallOnAppQuit = false
|
|
||||||
|
|
||||||
this.autoUpdater.on('update-available', () => {
|
|
||||||
this.logger.info('Update available')
|
this.logger.info('Update available')
|
||||||
})
|
})
|
||||||
|
|
||||||
this.autoUpdater.on('update-not-available', () => {
|
this.electron.ipcRenderer.on('updater:update-not-available', () => {
|
||||||
this.logger.info('No updates')
|
this.logger.info('No updates')
|
||||||
})
|
})
|
||||||
|
|
||||||
this.autoUpdater.on('error', err => {
|
this.electron.ipcRenderer.on('updater:error', err => {
|
||||||
this.logger.error(err)
|
this.logger.error(err)
|
||||||
this.electronUpdaterAvailable = false
|
this.electronUpdaterAvailable = false
|
||||||
})
|
})
|
||||||
|
|
||||||
this.downloaded = new Promise<boolean>(resolve => {
|
this.downloaded = new Promise<boolean>(resolve => {
|
||||||
this.autoUpdater.once('update-downloaded', () => resolve(true))
|
this.electron.ipcRenderer.once('updater:update-downloaded', () => resolve(true))
|
||||||
})
|
})
|
||||||
|
|
||||||
config.ready$.toPromise().then(() => {
|
config.ready$.toPromise().then(() => {
|
||||||
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) {
|
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) {
|
||||||
this.logger.debug('Checking for updates')
|
this.logger.debug('Checking for updates')
|
||||||
try {
|
try {
|
||||||
this.autoUpdater.checkForUpdates()
|
this.electron.ipcRenderer.send('updater:check-for-updates')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.electronUpdaterAvailable = false
|
this.electronUpdaterAvailable = false
|
||||||
this.logger.info('Electron updater unavailable, falling back', e)
|
this.logger.info('Electron updater unavailable, falling back', e)
|
||||||
@@ -82,26 +76,26 @@ export class ElectronUpdaterService extends UpdaterService {
|
|||||||
reject(err)
|
reject(err)
|
||||||
}
|
}
|
||||||
cancel = () => {
|
cancel = () => {
|
||||||
this.autoUpdater.off('error', onError)
|
this.electron.ipcRenderer.off('updater:error', onError)
|
||||||
this.autoUpdater.off('update-not-available', onNoUpdate)
|
this.electron.ipcRenderer.off('updater:update-not-available', onNoUpdate)
|
||||||
this.autoUpdater.off('update-available', onUpdate)
|
this.electron.ipcRenderer.off('updater:update-available', onUpdate)
|
||||||
}
|
}
|
||||||
this.autoUpdater.on('error', onError)
|
this.electron.ipcRenderer.on('updater:error', onError)
|
||||||
this.autoUpdater.on('update-not-available', onNoUpdate)
|
this.electron.ipcRenderer.on('updater:update-not-available', onNoUpdate)
|
||||||
this.autoUpdater.on('update-available', onUpdate)
|
this.electron.ipcRenderer.on('updater:update-available', onUpdate)
|
||||||
try {
|
try {
|
||||||
this.autoUpdater.checkForUpdates()
|
this.electron.ipcRenderer.send('updater:check-for-updates')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.electronUpdaterAvailable = false
|
this.electronUpdaterAvailable = false
|
||||||
this.logger.info('Electron updater unavailable, falling back', e)
|
this.logger.info('Electron updater unavailable, falling back', e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.autoUpdater.on('update-available', () => {
|
this.electron.ipcRenderer.on('updater:update-available', () => {
|
||||||
this.logger.info('Update available')
|
this.logger.info('Update available')
|
||||||
})
|
})
|
||||||
|
|
||||||
this.autoUpdater.once('update-not-available', () => {
|
this.electron.ipcRenderer.once('updater:update-not-available', () => {
|
||||||
this.logger.info('No updates')
|
this.logger.info('No updates')
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -138,7 +132,7 @@ export class ElectronUpdaterService extends UpdaterService {
|
|||||||
},
|
},
|
||||||
)).response === 0) {
|
)).response === 0) {
|
||||||
await this.downloaded
|
await this.downloaded
|
||||||
this.autoUpdater.quitAndInstall()
|
this.electron.ipcRenderer.send('updater:quit-and-install')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
"author": "Eugene Pankov",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"untildify": "^4.0.0",
|
"@xterm/addon-web-links": "^0.10.0",
|
||||||
"xterm-addon-web-links": "^0.7.0"
|
"untildify": "^4.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { Inject, Injectable } from '@angular/core'
|
import { Inject, Injectable } from '@angular/core'
|
||||||
import { ConfigService, PlatformService } from 'tabby-core'
|
import { ConfigService, PlatformService } from 'tabby-core'
|
||||||
import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend } from 'tabby-terminal'
|
import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend } from 'tabby-terminal'
|
||||||
import { WebLinksAddon } from 'xterm-addon-web-links'
|
import { WebLinksAddon } from '@xterm/addon-web-links'
|
||||||
import { LinkHandler } from './api'
|
import { LinkHandler } from './api'
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@@ -2,12 +2,12 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@xterm/addon-web-links@^0.10.0":
|
||||||
|
version "0.10.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@xterm/addon-web-links/-/addon-web-links-0.10.0.tgz#be3eccaf1cbd4063161458205cd4bbee2b0f34f9"
|
||||||
|
integrity sha512-QhrHCUr8w6ATGviyXwcAIM1qN3nD1hdxwMC8fsW7z/6aaQlb2nt7zmByJt4eOn7ZzrHOzczljqV5S2pkdQp2xw==
|
||||||
|
|
||||||
untildify@^4.0.0:
|
untildify@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
|
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
|
||||||
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
|
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
|
||||||
|
|
||||||
xterm-addon-web-links@^0.7.0:
|
|
||||||
version "0.7.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.7.0.tgz#dceac36170605f9db10a01d716bd83ee38f65c17"
|
|
||||||
integrity sha512-6PqoqzzPwaeSq22skzbvyboDvSnYk5teUYEoKBwMYvhbkwOQkemZccjWHT5FnNA8o1aInTc4PRYAl4jjPucCKA==
|
|
||||||
|
@@ -132,7 +132,9 @@ export class AutoOpenTabCLIHandler extends CLIHandler {
|
|||||||
async handle (event: CLIEvent): Promise<boolean> {
|
async handle (event: CLIEvent): Promise<boolean> {
|
||||||
if (!event.secondInstance && this.config.store.terminal.autoOpen && !this.config.store.enableWelcomeTab) {
|
if (!event.secondInstance && this.config.store.terminal.autoOpen && !this.config.store.enableWelcomeTab) {
|
||||||
this.app.ready$.subscribe(() => {
|
this.app.ready$.subscribe(() => {
|
||||||
this.terminal.openTab()
|
if (this.app.tabs.length === 0) {
|
||||||
|
this.terminal.openTab()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user