mirror of
				https://github.com/eugeny/tabby
				synced 2025-11-04 08:24:48 +00:00 
			
		
		
		
	Compare commits
	
		
			1031 Commits
		
	
	
		
			v1.0.155
			...
			all-contri
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4da54d09d9 | ||
| 
						 | 
					32eb005585 | ||
| 
						 | 
					1bc9aee0e5 | ||
| 
						 | 
					5e5631096e | ||
| 
						 | 
					ca99c02fb9 | ||
| 
						 | 
					2ae6cef6c5 | ||
| 
						 | 
					09fab78fb6 | ||
| 
						 | 
					a6e5f004a8 | ||
| 
						 | 
					5b845dae45 | ||
| 
						 | 
					dc037bc918 | ||
| 
						 | 
					13fe3ef1ec | ||
| 
						 | 
					c4544256e1 | ||
| 
						 | 
					25f5cf04ea | ||
| 
						 | 
					36a63e771f | ||
| 
						 | 
					fd809d7d85 | ||
| 
						 | 
					81fe06a9f6 | ||
| 
						 | 
					e3d6b5f3d7 | ||
| 
						 | 
					4e3caa7409 | ||
| 
						 | 
					7b6ce3aeba | ||
| 
						 | 
					58f2c3d081 | ||
| 
						 | 
					1c011b6fe3 | ||
| 
						 | 
					88c2a9996b | ||
| 
						 | 
					b68213e278 | ||
| 
						 | 
					6bb8deacb7 | ||
| 
						 | 
					5dc3eecb74 | ||
| 
						 | 
					531b658405 | ||
| 
						 | 
					a710819615 | ||
| 
						 | 
					ca441b6f83 | ||
| 
						 | 
					b6d0bd2d43 | ||
| 
						 | 
					3cce468bf3 | ||
| 
						 | 
					22d1119c33 | ||
| 
						 | 
					ddbfc700e5 | ||
| 
						 | 
					93081162fe | ||
| 
						 | 
					4fb158d2a1 | ||
| 
						 | 
					4a82294741 | ||
| 
						 | 
					9a08bf8782 | ||
| 
						 | 
					2e83b450a9 | ||
| 
						 | 
					b97d3e30fb | ||
| 
						 | 
					12486584f0 | ||
| 
						 | 
					90168323c8 | ||
| 
						 | 
					e1d86810e3 | ||
| 
						 | 
					7be713495e | ||
| 
						 | 
					27ed3b0444 | ||
| 
						 | 
					5d2db6d85c | ||
| 
						 | 
					ba7571248c | ||
| 
						 | 
					763bb2c7aa | ||
| 
						 | 
					3d841eb97c | ||
| 
						 | 
					7016688170 | ||
| 
						 | 
					358a7563f6 | ||
| 
						 | 
					9c6acf99d0 | ||
| 
						 | 
					eaf4ed9855 | ||
| 
						 | 
					4a33936e7d | ||
| 
						 | 
					903b7d70f9 | ||
| 
						 | 
					143f5edcb3 | ||
| 
						 | 
					0ee0f98462 | ||
| 
						 | 
					b330c428e6 | ||
| 
						 | 
					61810da810 | ||
| 
						 | 
					1e85acb99e | ||
| 
						 | 
					38c1fafeee | ||
| 
						 | 
					5e75d88f1d | ||
| 
						 | 
					4fe4ae8b9b | ||
| 
						 | 
					23040aa217 | ||
| 
						 | 
					14cf0a574e | ||
| 
						 | 
					50887af27f | ||
| 
						 | 
					3dca21394f | ||
| 
						 | 
					109f38b7cc | ||
| 
						 | 
					ecc5f6d1de | ||
| 
						 | 
					ead3a30cf0 | ||
| 
						 | 
					facc1f1dff | ||
| 
						 | 
					74dc6002d1 | ||
| 
						 | 
					cc67774108 | ||
| 
						 | 
					5c04c11132 | ||
| 
						 | 
					be72cd59cc | ||
| 
						 | 
					4cf9eda55f | ||
| 
						 | 
					db866fbacf | ||
| 
						 | 
					086c4e68e6 | ||
| 
						 | 
					e303621fc5 | ||
| 
						 | 
					579b60236b | ||
| 
						 | 
					31f549f5bb | ||
| 
						 | 
					f18c58360d | ||
| 
						 | 
					3287f410b7 | ||
| 
						 | 
					1a37ba224d | ||
| 
						 | 
					49934aea5d | ||
| 
						 | 
					da3143fab8 | ||
| 
						 | 
					95ae4b84a6 | ||
| 
						 | 
					f85294e603 | ||
| 
						 | 
					a2975f5234 | ||
| 
						 | 
					e049d38cef | ||
| 
						 | 
					84a58de57f | ||
| 
						 | 
					b519afc42c | ||
| 
						 | 
					49aade155b | ||
| 
						 | 
					240fc57435 | ||
| 
						 | 
					cf7b344fb1 | ||
| 
						 | 
					c6e5a951f8 | ||
| 
						 | 
					de861ad98e | ||
| 
						 | 
					068abec8d8 | ||
| 
						 | 
					5abe2e6376 | ||
| 
						 | 
					98d3b824c4 | ||
| 
						 | 
					f3cd986f2b | ||
| 
						 | 
					6d734ab7c6 | ||
| 
						 | 
					4aa824d725 | ||
| 
						 | 
					cfa29acb5a | ||
| 
						 | 
					cfa1fd38de | ||
| 
						 | 
					595b92366b | ||
| 
						 | 
					bb59f3a2ef | ||
| 
						 | 
					a9a0ea3a42 | ||
| 
						 | 
					79cb1f1d9c | ||
| 
						 | 
					3a16a118e7 | ||
| 
						 | 
					b16210f561 | ||
| 
						 | 
					6aafbfc288 | ||
| 
						 | 
					41aaac6a23 | ||
| 
						 | 
					911e72c398 | ||
| 
						 | 
					8e00761b0c | ||
| 
						 | 
					4dadba7f80 | ||
| 
						 | 
					94b3212afb | ||
| 
						 | 
					3a012878d0 | ||
| 
						 | 
					bc89774fbc | ||
| 
						 | 
					40c3a5427a | ||
| 
						 | 
					79b518e17e | ||
| 
						 | 
					89bbd6669b | ||
| 
						 | 
					d1532f64a0 | ||
| 
						 | 
					f7e51c298d | ||
| 
						 | 
					a9bcc0b206 | ||
| 
						 | 
					45eebf47f3 | ||
| 
						 | 
					a4600890c3 | ||
| 
						 | 
					54aa027764 | ||
| 
						 | 
					8904209bb5 | ||
| 
						 | 
					d710c5d3fa | ||
| 
						 | 
					e2a74a2f6e | ||
| 
						 | 
					e223effe98 | ||
| 
						 | 
					4b02d61f3f | ||
| 
						 | 
					9b8ae6d6be | ||
| 
						 | 
					c9e8e54fe3 | ||
| 
						 | 
					004a04640d | ||
| 
						 | 
					e71ac85ec3 | ||
| 
						 | 
					ed2d1a1606 | ||
| 
						 | 
					edc9656fd2 | ||
| 
						 | 
					65ef8cde5a | ||
| 
						 | 
					6e09931952 | ||
| 
						 | 
					4e8cb70fe0 | ||
| 
						 | 
					40cf2bde9b | ||
| 
						 | 
					21b70b3ee5 | ||
| 
						 | 
					2f4318e1f4 | ||
| 
						 | 
					c75c5aae14 | ||
| 
						 | 
					c39d79c1c6 | ||
| 
						 | 
					418df22da4 | ||
| 
						 | 
					2f66dc3bb0 | ||
| 
						 | 
					2a192af169 | ||
| 
						 | 
					a1f269f8ac | ||
| 
						 | 
					c1386349ea | ||
| 
						 | 
					80443b073c | ||
| 
						 | 
					591f0eb445 | ||
| 
						 | 
					b2333d5c7c | ||
| 
						 | 
					a5282eaf8c | ||
| 
						 | 
					5a5b73a636 | ||
| 
						 | 
					f406de1873 | ||
| 
						 | 
					7744b28561 | ||
| 
						 | 
					a32ec15d30 | ||
| 
						 | 
					88c8a4667a | ||
| 
						 | 
					a9d6a968d5 | ||
| 
						 | 
					018355ce44 | ||
| 
						 | 
					47a837b109 | ||
| 
						 | 
					116c144576 | ||
| 
						 | 
					aedad13f48 | ||
| 
						 | 
					b9abe4f2ca | ||
| 
						 | 
					d1e85dc870 | ||
| 
						 | 
					2f0ebf9a61 | ||
| 
						 | 
					ac36627392 | ||
| 
						 | 
					fab5feb29d | ||
| 
						 | 
					69ddd2fc9f | ||
| 
						 | 
					3e7f4dd6dc | ||
| 
						 | 
					296be13b40 | ||
| 
						 | 
					2d7398c623 | ||
| 
						 | 
					add55d014e | ||
| 
						 | 
					0c8c2d3e95 | ||
| 
						 | 
					9b07ab053a | ||
| 
						 | 
					f447658c62 | ||
| 
						 | 
					40e0bcce17 | ||
| 
						 | 
					48c06fc26e | ||
| 
						 | 
					360b75693b | ||
| 
						 | 
					579c0e9aa5 | ||
| 
						 | 
					5a66a64f87 | ||
| 
						 | 
					ead2dbc208 | ||
| 
						 | 
					37ba06b65c | ||
| 
						 | 
					b2c611f9a6 | ||
| 
						 | 
					eb6bf288cc | ||
| 
						 | 
					0f35b3bcfa | ||
| 
						 | 
					86effd748f | ||
| 
						 | 
					98f19e1ada | ||
| 
						 | 
					9ac7a67d74 | ||
| 
						 | 
					adac51c71d | ||
| 
						 | 
					aee6ae907d | ||
| 
						 | 
					75c911b5e4 | ||
| 
						 | 
					8ec419f8e5 | ||
| 
						 | 
					2229d54b33 | ||
| 
						 | 
					8c0d681345 | ||
| 
						 | 
					541c264384 | ||
| 
						 | 
					f18c1f6d3a | ||
| 
						 | 
					332c5c0b5e | ||
| 
						 | 
					4aca0fdf09 | ||
| 
						 | 
					26f93f7ac5 | ||
| 
						 | 
					237cb5b26c | ||
| 
						 | 
					780691413d | ||
| 
						 | 
					45b6e21dbc | ||
| 
						 | 
					3bfdb95bf0 | ||
| 
						 | 
					9fab7af85a | ||
| 
						 | 
					ae7bc8daa2 | ||
| 
						 | 
					1a83664b2c | ||
| 
						 | 
					0c27546ca4 | ||
| 
						 | 
					a09a50cd33 | ||
| 
						 | 
					9bc6831f40 | ||
| 
						 | 
					7e876afb3b | ||
| 
						 | 
					515ddbf64b | ||
| 
						 | 
					0560196546 | ||
| 
						 | 
					1f73cd11b2 | ||
| 
						 | 
					2958dc3353 | ||
| 
						 | 
					a76654a7b6 | ||
| 
						 | 
					7508c371df | ||
| 
						 | 
					a5d84a490f | ||
| 
						 | 
					1029884ef7 | ||
| 
						 | 
					8d11a91201 | ||
| 
						 | 
					f6c0dd6ad3 | ||
| 
						 | 
					2c00b9a4bc | ||
| 
						 | 
					fc4bbfcd5d | ||
| 
						 | 
					90becada86 | ||
| 
						 | 
					b6957b25d2 | ||
| 
						 | 
					7771f5708b | ||
| 
						 | 
					f2f0953b24 | ||
| 
						 | 
					39fbf467de | ||
| 
						 | 
					d6bcdbde78 | ||
| 
						 | 
					38f8a7cfef | ||
| 
						 | 
					b27f5c2145 | ||
| 
						 | 
					c3e4031aab | ||
| 
						 | 
					8c96788b00 | ||
| 
						 | 
					725edd53cb | ||
| 
						 | 
					1b31187201 | ||
| 
						 | 
					b5506cff61 | ||
| 
						 | 
					2aa95f5e25 | ||
| 
						 | 
					cd7440052c | ||
| 
						 | 
					d4fb56b30b | ||
| 
						 | 
					6a96637932 | ||
| 
						 | 
					2e29d13412 | ||
| 
						 | 
					f4c54657eb | ||
| 
						 | 
					17dc43d5eb | ||
| 
						 | 
					25aa2051e9 | ||
| 
						 | 
					8d6264019b | ||
| 
						 | 
					a069ec606b | ||
| 
						 | 
					c7639c03f9 | ||
| 
						 | 
					f073a691fc | ||
| 
						 | 
					b31b500727 | ||
| 
						 | 
					df77cc99d9 | ||
| 
						 | 
					32170ec640 | ||
| 
						 | 
					3336b64d9d | ||
| 
						 | 
					cc554de4da | ||
| 
						 | 
					35b115ae9f | ||
| 
						 | 
					a8e79820a4 | ||
| 
						 | 
					5c325a347c | ||
| 
						 | 
					b70a193dbd | ||
| 
						 | 
					e2d4ef58c4 | ||
| 
						 | 
					d35c03d083 | ||
| 
						 | 
					c533e6c8fd | ||
| 
						 | 
					690a632f96 | ||
| 
						 | 
					d8bec496ee | ||
| 
						 | 
					ea38943905 | ||
| 
						 | 
					90bd8b424f | ||
| 
						 | 
					a874a5e4d5 | ||
| 
						 | 
					502f72ec35 | ||
| 
						 | 
					1bb5128729 | ||
| 
						 | 
					56ef0c356b | ||
| 
						 | 
					4de572770e | ||
| 
						 | 
					824b5aab93 | ||
| 
						 | 
					1a834af663 | ||
| 
						 | 
					418907936e | ||
| 
						 | 
					f5f063a511 | ||
| 
						 | 
					5fee1ec1ed | ||
| 
						 | 
					5e75db92eb | ||
| 
						 | 
					b2325c29df | ||
| 
						 | 
					0ba8db43bf | ||
| 
						 | 
					3e931e452b | ||
| 
						 | 
					07f8c0cc08 | ||
| 
						 | 
					e48ec7ed67 | ||
| 
						 | 
					779d4f2fea | ||
| 
						 | 
					66da3bc907 | ||
| 
						 | 
					d438207dc5 | ||
| 
						 | 
					56e1523226 | ||
| 
						 | 
					09da979ab5 | ||
| 
						 | 
					af39b342bd | ||
| 
						 | 
					2df94fd62a | ||
| 
						 | 
					d2d698b288 | ||
| 
						 | 
					79c7d55c05 | ||
| 
						 | 
					b351cda35a | ||
| 
						 | 
					025c747e54 | ||
| 
						 | 
					27ced5b9bc | ||
| 
						 | 
					7d64da1667 | ||
| 
						 | 
					c25134d96c | ||
| 
						 | 
					cf464f5bb8 | ||
| 
						 | 
					a6845069bd | ||
| 
						 | 
					c09babd326 | ||
| 
						 | 
					89226d66a8 | ||
| 
						 | 
					77c0b3ea23 | ||
| 
						 | 
					8cef14da8f | ||
| 
						 | 
					eb30bb2d9d | ||
| 
						 | 
					c85d6e63c6 | ||
| 
						 | 
					7801c7569a | ||
| 
						 | 
					75ed66079a | ||
| 
						 | 
					e6aefc8cb8 | ||
| 
						 | 
					76892c4f5c | ||
| 
						 | 
					d1ac265d79 | ||
| 
						 | 
					030ddc721d | ||
| 
						 | 
					645531acc0 | ||
| 
						 | 
					555c8c18ee | ||
| 
						 | 
					5caa4d14f5 | ||
| 
						 | 
					2b12f89f31 | ||
| 
						 | 
					82f646cff5 | ||
| 
						 | 
					e63c87df72 | ||
| 
						 | 
					a5c94707d4 | ||
| 
						 | 
					25c20e834c | ||
| 
						 | 
					b08604a5df | ||
| 
						 | 
					d6860d75c2 | ||
| 
						 | 
					a02ce88925 | ||
| 
						 | 
					e18b84afed | ||
| 
						 | 
					57feb1f3cc | ||
| 
						 | 
					907ee4ccb5 | ||
| 
						 | 
					e6b210dad5 | ||
| 
						 | 
					177a988292 | ||
| 
						 | 
					fdca83ff27 | ||
| 
						 | 
					1598dab025 | ||
| 
						 | 
					8c06de5c9e | ||
| 
						 | 
					9e3d952d90 | ||
| 
						 | 
					50304d151a | ||
| 
						 | 
					589da576a0 | ||
| 
						 | 
					b934a34be5 | ||
| 
						 | 
					4fa6bb398b | ||
| 
						 | 
					a2929309d9 | ||
| 
						 | 
					a78fec0a6f | ||
| 
						 | 
					81e1757ae9 | ||
| 
						 | 
					3eb4bd53a9 | ||
| 
						 | 
					bf893551c8 | ||
| 
						 | 
					303c59cecc | ||
| 
						 | 
					6c5c670315 | ||
| 
						 | 
					2bea7f3881 | ||
| 
						 | 
					27a162c903 | ||
| 
						 | 
					c5ee39e4a1 | ||
| 
						 | 
					ea2251532b | ||
| 
						 | 
					077c3ced39 | ||
| 
						 | 
					65ee7b755a | ||
| 
						 | 
					a43ca24ba6 | ||
| 
						 | 
					a1199da883 | ||
| 
						 | 
					c845412fdf | ||
| 
						 | 
					0ba3de45a4 | ||
| 
						 | 
					9e0808fca3 | ||
| 
						 | 
					45b7391e89 | ||
| 
						 | 
					0eb1e8117c | ||
| 
						 | 
					be951cc9ce | ||
| 
						 | 
					c88b02fa91 | ||
| 
						 | 
					f9bf1e5644 | ||
| 
						 | 
					6c61f12584 | ||
| 
						 | 
					1efae39d9a | ||
| 
						 | 
					6d76874045 | ||
| 
						 | 
					dd864f5077 | ||
| 
						 | 
					0180fb0134 | ||
| 
						 | 
					90f97d6669 | ||
| 
						 | 
					f27f52dd72 | ||
| 
						 | 
					60a48ec2a5 | ||
| 
						 | 
					c64654991b | ||
| 
						 | 
					1fc531ecf4 | ||
| 
						 | 
					4c7e7f5fae | ||
| 
						 | 
					7b07a67947 | ||
| 
						 | 
					fe5193d9f1 | ||
| 
						 | 
					b6a3af80fa | ||
| 
						 | 
					46a9b655fc | ||
| 
						 | 
					762ee85773 | ||
| 
						 | 
					650e362c42 | ||
| 
						 | 
					136ec1035b | ||
| 
						 | 
					f27e1ec62d | ||
| 
						 | 
					c736a84835 | ||
| 
						 | 
					b3a07e5f99 | ||
| 
						 | 
					c408154137 | ||
| 
						 | 
					c0988e58b4 | ||
| 
						 | 
					d6e906c107 | ||
| 
						 | 
					d77a91b3e1 | ||
| 
						 | 
					80f82296a0 | ||
| 
						 | 
					6e9f497d22 | ||
| 
						 | 
					50f01b6794 | ||
| 
						 | 
					b068070825 | ||
| 
						 | 
					194342d6fa | ||
| 
						 | 
					d7eeac6af7 | ||
| 
						 | 
					98a08b92a2 | ||
| 
						 | 
					fef8638ade | ||
| 
						 | 
					34ff0c45cb | ||
| 
						 | 
					1896155ad9 | ||
| 
						 | 
					bbcbad0e77 | ||
| 
						 | 
					ce435056a2 | ||
| 
						 | 
					fe9b14ad9c | ||
| 
						 | 
					fc72e5005c | ||
| 
						 | 
					f5c428d73b | ||
| 
						 | 
					b396060965 | ||
| 
						 | 
					c752a18f3c | ||
| 
						 | 
					805ee0af09 | ||
| 
						 | 
					ad9ad4d418 | ||
| 
						 | 
					d5c4088cc1 | ||
| 
						 | 
					483a0472b9 | ||
| 
						 | 
					1bbf9d4294 | ||
| 
						 | 
					10c8502fbd | ||
| 
						 | 
					8f3f6f591d | ||
| 
						 | 
					656d275801 | ||
| 
						 | 
					9c53503c0f | ||
| 
						 | 
					9ea99f1ace | ||
| 
						 | 
					126d14dfb7 | ||
| 
						 | 
					68803b5f14 | ||
| 
						 | 
					e0273126de | ||
| 
						 | 
					0ced498b6e | ||
| 
						 | 
					510682438e | ||
| 
						 | 
					762874c400 | ||
| 
						 | 
					b7e2e0875e | ||
| 
						 | 
					9cfd02bff6 | ||
| 
						 | 
					9082fe5c06 | ||
| 
						 | 
					43786fda83 | ||
| 
						 | 
					1677285ea9 | ||
| 
						 | 
					aaa0a0f69a | ||
| 
						 | 
					cb8832fbad | ||
| 
						 | 
					e39321c8cb | ||
| 
						 | 
					3ef7697be8 | ||
| 
						 | 
					8927717654 | ||
| 
						 | 
					3a8168917a | ||
| 
						 | 
					9249c48ecc | ||
| 
						 | 
					6d1150d08a | ||
| 
						 | 
					b234300bd8 | ||
| 
						 | 
					be3bae3a6f | ||
| 
						 | 
					767f9f3215 | ||
| 
						 | 
					d6e69f5bf5 | ||
| 
						 | 
					5c644e5e23 | ||
| 
						 | 
					5b905af5d3 | ||
| 
						 | 
					28f4a052d7 | ||
| 
						 | 
					948251e326 | ||
| 
						 | 
					2203661f19 | ||
| 
						 | 
					8f4e28fba4 | ||
| 
						 | 
					a413bbaf07 | ||
| 
						 | 
					4e05adeb66 | ||
| 
						 | 
					59ac4a858e | ||
| 
						 | 
					55ae5b27b9 | ||
| 
						 | 
					b0aa20b387 | ||
| 
						 | 
					0f01aaf44d | ||
| 
						 | 
					54531e234e | ||
| 
						 | 
					3bda4a9871 | ||
| 
						 | 
					c7e3ab42d9 | ||
| 
						 | 
					5d2956568e | ||
| 
						 | 
					8b3f482682 | ||
| 
						 | 
					f38f9882f8 | ||
| 
						 | 
					54d71adb26 | ||
| 
						 | 
					13eebd8957 | ||
| 
						 | 
					6c4f8d2611 | ||
| 
						 | 
					897bc77d05 | ||
| 
						 | 
					8b5b53ab26 | ||
| 
						 | 
					448fe29f50 | ||
| 
						 | 
					70ae9f875f | ||
| 
						 | 
					75764cd725 | ||
| 
						 | 
					bb00f2f033 | ||
| 
						 | 
					5ae2d17cc8 | ||
| 
						 | 
					109a83db5b | ||
| 
						 | 
					9fe8d2a7df | ||
| 
						 | 
					d3bbd045dc | ||
| 
						 | 
					eb0fa29fad | ||
| 
						 | 
					6289229bf2 | ||
| 
						 | 
					b664b9eed9 | ||
| 
						 | 
					e80c3ce693 | ||
| 
						 | 
					2569f9e322 | ||
| 
						 | 
					b9b6c63d57 | ||
| 
						 | 
					95152456ce | ||
| 
						 | 
					918761bbdc | ||
| 
						 | 
					ceb1b59409 | ||
| 
						 | 
					63374f532c | ||
| 
						 | 
					c57fe48e73 | ||
| 
						 | 
					02a3a8200b | ||
| 
						 | 
					3e8e3f7ccd | ||
| 
						 | 
					1ec218775e | ||
| 
						 | 
					cc8c200da0 | ||
| 
						 | 
					0a20716efd | ||
| 
						 | 
					9893fb51a7 | ||
| 
						 | 
					3466d42cb1 | ||
| 
						 | 
					9e9066d3cd | ||
| 
						 | 
					bee62f3001 | ||
| 
						 | 
					b469dd603b | ||
| 
						 | 
					f6eaff355b | ||
| 
						 | 
					7ff2b31a9f | ||
| 
						 | 
					dbf67e77e0 | ||
| 
						 | 
					b45769d379 | ||
| 
						 | 
					1695c0b522 | ||
| 
						 | 
					15d7be05f1 | ||
| 
						 | 
					a759c40ec8 | ||
| 
						 | 
					a8e977d34c | ||
| 
						 | 
					527a951b1e | ||
| 
						 | 
					afe9c9a84c | ||
| 
						 | 
					372662c787 | ||
| 
						 | 
					ca9e6a118e | ||
| 
						 | 
					b412bce37d | ||
| 
						 | 
					6622cbc550 | ||
| 
						 | 
					d3361b6f34 | ||
| 
						 | 
					13f715ddfd | ||
| 
						 | 
					ccea3572a7 | ||
| 
						 | 
					c24c752b76 | ||
| 
						 | 
					8751b9831f | ||
| 
						 | 
					d4d93cf236 | ||
| 
						 | 
					9b305026f7 | ||
| 
						 | 
					91fcdbf9b5 | ||
| 
						 | 
					b17e23a69e | ||
| 
						 | 
					88bbdd0da1 | ||
| 
						 | 
					53cbb8a7e3 | ||
| 
						 | 
					9df8a1b904 | ||
| 
						 | 
					0a0e451e97 | ||
| 
						 | 
					5376ac0f07 | ||
| 
						 | 
					238482932e | ||
| 
						 | 
					d4332ea361 | ||
| 
						 | 
					eb49499f09 | ||
| 
						 | 
					445a3d02da | ||
| 
						 | 
					06e5571812 | ||
| 
						 | 
					510edaabb5 | ||
| 
						 | 
					5ef36896c5 | ||
| 
						 | 
					5d22c15a78 | ||
| 
						 | 
					a33e11502b | ||
| 
						 | 
					4c9456d98d | ||
| 
						 | 
					e1ee818932 | ||
| 
						 | 
					e83210f0e6 | ||
| 
						 | 
					1d176047c4 | ||
| 
						 | 
					bd3ac21fb3 | ||
| 
						 | 
					559dd3955c | ||
| 
						 | 
					0ed05cb783 | ||
| 
						 | 
					87e8eefd49 | ||
| 
						 | 
					609b527a7c | ||
| 
						 | 
					fee163835f | ||
| 
						 | 
					c8b25cf911 | ||
| 
						 | 
					eb9698fa66 | ||
| 
						 | 
					eb60c3c3c6 | ||
| 
						 | 
					f2a48fc0c0 | ||
| 
						 | 
					8d01a9ad8d | ||
| 
						 | 
					4d8ddba8ea | ||
| 
						 | 
					91a7dd8b1d | ||
| 
						 | 
					2f35ae203d | ||
| 
						 | 
					38423eb139 | ||
| 
						 | 
					bde6fd6231 | ||
| 
						 | 
					14200f848f | ||
| 
						 | 
					f6895d7696 | ||
| 
						 | 
					64410a9302 | ||
| 
						 | 
					45274f9691 | ||
| 
						 | 
					54ab2a1f03 | ||
| 
						 | 
					782128308c | ||
| 
						 | 
					f2b6cdf97c | ||
| 
						 | 
					c025c44258 | ||
| 
						 | 
					9483d20994 | ||
| 
						 | 
					ff25e7fe2e | ||
| 
						 | 
					d12a48f3fc | ||
| 
						 | 
					1796ce4f1c | ||
| 
						 | 
					d404067e77 | ||
| 
						 | 
					f7544d0a2e | ||
| 
						 | 
					cbdce5c30e | ||
| 
						 | 
					d7ab8a00dc | ||
| 
						 | 
					6e0ded9a5e | ||
| 
						 | 
					f660ece383 | ||
| 
						 | 
					b692347c4e | ||
| 
						 | 
					9520d31f12 | ||
| 
						 | 
					f2afac6ead | ||
| 
						 | 
					0dd460a6d7 | ||
| 
						 | 
					7c0aacf0ad | ||
| 
						 | 
					57bf79ec56 | ||
| 
						 | 
					8cfdd43ee1 | ||
| 
						 | 
					21f245ddaf | ||
| 
						 | 
					00a19769e1 | ||
| 
						 | 
					d2a22763de | ||
| 
						 | 
					da75e34b95 | ||
| 
						 | 
					08a564588c | ||
| 
						 | 
					a639d65ed6 | ||
| 
						 | 
					b42314b29e | ||
| 
						 | 
					17c93aa3fc | ||
| 
						 | 
					5b4a1a5581 | ||
| 
						 | 
					d82f78a026 | ||
| 
						 | 
					9414be9ce0 | ||
| 
						 | 
					f2ed1b3df3 | ||
| 
						 | 
					f41abea747 | ||
| 
						 | 
					21e5d68994 | ||
| 
						 | 
					a6a9c149dc | ||
| 
						 | 
					61c11abda2 | ||
| 
						 | 
					3a11b51729 | ||
| 
						 | 
					00ffa24e7d | ||
| 
						 | 
					b156752106 | ||
| 
						 | 
					6159d0ba9a | ||
| 
						 | 
					bf2ab87c44 | ||
| 
						 | 
					ff1e2871d4 | ||
| 
						 | 
					2d9f3d8216 | ||
| 
						 | 
					e7a9b2317d | ||
| 
						 | 
					0ab02d032a | ||
| 
						 | 
					ab8622c9fd | ||
| 
						 | 
					70a12e36e1 | ||
| 
						 | 
					9706108185 | ||
| 
						 | 
					5138873f43 | ||
| 
						 | 
					d8625d6b9f | ||
| 
						 | 
					ec4f200435 | ||
| 
						 | 
					91f3b78b80 | ||
| 
						 | 
					3b321858d2 | ||
| 
						 | 
					0814d44207 | ||
| 
						 | 
					04010b58bb | ||
| 
						 | 
					a68dc35a23 | ||
| 
						 | 
					40c4f57b37 | ||
| 
						 | 
					652084a140 | ||
| 
						 | 
					c29d5bc98a | ||
| 
						 | 
					42b5d0824a | ||
| 
						 | 
					7226b09214 | ||
| 
						 | 
					b97053daee | ||
| 
						 | 
					d5d6a486d2 | ||
| 
						 | 
					889ab0f147 | ||
| 
						 | 
					604e5e37a8 | ||
| 
						 | 
					e6a1f98cf1 | ||
| 
						 | 
					5f81a47db9 | ||
| 
						 | 
					5d16bb99c7 | ||
| 
						 | 
					f24439d580 | ||
| 
						 | 
					6d3334543e | ||
| 
						 | 
					62019e3ac1 | ||
| 
						 | 
					adc9bce844 | ||
| 
						 | 
					26b70447da | ||
| 
						 | 
					832e408952 | ||
| 
						 | 
					b64c2ae14e | ||
| 
						 | 
					e63d296457 | ||
| 
						 | 
					909c99d1c0 | ||
| 
						 | 
					cbd8609c97 | ||
| 
						 | 
					b8c1b5e428 | ||
| 
						 | 
					cb1b0ac669 | ||
| 
						 | 
					bbe7d2186e | ||
| 
						 | 
					d0469685d9 | ||
| 
						 | 
					32ecd48375 | ||
| 
						 | 
					33a715c8c3 | ||
| 
						 | 
					eba3d2709e | ||
| 
						 | 
					b3af7184e7 | ||
| 
						 | 
					54411e59ad | ||
| 
						 | 
					f9da76f07e | ||
| 
						 | 
					af0ecd2400 | ||
| 
						 | 
					f3f730b32e | ||
| 
						 | 
					076b1c7129 | ||
| 
						 | 
					3298840454 | ||
| 
						 | 
					b0c300be43 | ||
| 
						 | 
					e86b3cde6f | ||
| 
						 | 
					ff55d3d1ef | ||
| 
						 | 
					e024390028 | ||
| 
						 | 
					c314e4638d | ||
| 
						 | 
					bcd2cc50ec | ||
| 
						 | 
					8e1f6f894f | ||
| 
						 | 
					eab8841cca | ||
| 
						 | 
					a78f3399fd | ||
| 
						 | 
					44cbc9298f | ||
| 
						 | 
					0c601592e3 | ||
| 
						 | 
					87ad435a13 | ||
| 
						 | 
					d644c299ae | ||
| 
						 | 
					6119c2b73d | ||
| 
						 | 
					ccf4f05437 | ||
| 
						 | 
					5110808069 | ||
| 
						 | 
					ba61a7f359 | ||
| 
						 | 
					f2aef8d6d5 | ||
| 
						 | 
					8587cd31dd | ||
| 
						 | 
					8a8e7cd99f | ||
| 
						 | 
					ddb01b3722 | ||
| 
						 | 
					66bb03a463 | ||
| 
						 | 
					5f88a02647 | ||
| 
						 | 
					538df37f5e | ||
| 
						 | 
					aba5e9dcfa | ||
| 
						 | 
					c7589acc87 | ||
| 
						 | 
					39786e023e | ||
| 
						 | 
					7900134f67 | ||
| 
						 | 
					9e3961b83d | ||
| 
						 | 
					d080adc19d | ||
| 
						 | 
					4f189f6839 | ||
| 
						 | 
					87ed979588 | ||
| 
						 | 
					e90db7f07f | ||
| 
						 | 
					5249a9076a | ||
| 
						 | 
					cfc9333c02 | ||
| 
						 | 
					5a7b5346ae | ||
| 
						 | 
					81aa747d83 | ||
| 
						 | 
					0e9723cb3b | ||
| 
						 | 
					899484a5d9 | ||
| 
						 | 
					4c2feb1b35 | ||
| 
						 | 
					d6d75b8c53 | ||
| 
						 | 
					6eff3902ca | ||
| 
						 | 
					8f71f29007 | ||
| 
						 | 
					b6fd909d67 | ||
| 
						 | 
					9500fa8770 | ||
| 
						 | 
					f92d9c85cb | ||
| 
						 | 
					04533a683b | ||
| 
						 | 
					08a38bbf61 | ||
| 
						 | 
					5f94e84542 | ||
| 
						 | 
					bdcd2720c4 | ||
| 
						 | 
					4784a076fa | ||
| 
						 | 
					07c522385f | ||
| 
						 | 
					d039d76cff | ||
| 
						 | 
					f91754ce7c | ||
| 
						 | 
					5911794b20 | ||
| 
						 | 
					f640bf9443 | ||
| 
						 | 
					9f50d8506c | ||
| 
						 | 
					361f6c2fe5 | ||
| 
						 | 
					8cac38e1ef | ||
| 
						 | 
					75757d027e | ||
| 
						 | 
					0c8b6e56da | ||
| 
						 | 
					5be4a12ee5 | ||
| 
						 | 
					433c7d33d9 | ||
| 
						 | 
					b755346ac0 | ||
| 
						 | 
					4c663e4a20 | ||
| 
						 | 
					a34e4c236d | ||
| 
						 | 
					b2b91f0cfd | ||
| 
						 | 
					bbb02f4e64 | ||
| 
						 | 
					3eaf46e09d | ||
| 
						 | 
					fc02d27056 | ||
| 
						 | 
					0fe7d81a5f | ||
| 
						 | 
					59dbe6ba83 | ||
| 
						 | 
					860a577ddb | ||
| 
						 | 
					2edb9cc5b8 | ||
| 
						 | 
					5bc13965e1 | ||
| 
						 | 
					2ca93fdb98 | ||
| 
						 | 
					aa62ca9a6e | ||
| 
						 | 
					1928cda394 | ||
| 
						 | 
					64f8e033c4 | ||
| 
						 | 
					23280c2143 | ||
| 
						 | 
					e4037d5aac | ||
| 
						 | 
					d2ec08e3f8 | ||
| 
						 | 
					b186f986ac | ||
| 
						 | 
					dbf91228fe | ||
| 
						 | 
					b58198b82b | ||
| 
						 | 
					eca92760f3 | ||
| 
						 | 
					d4815ca827 | ||
| 
						 | 
					4c19122acb | ||
| 
						 | 
					6bdbca4e19 | ||
| 
						 | 
					bb47a5d76f | ||
| 
						 | 
					f308fd481d | ||
| 
						 | 
					34adf767eb | ||
| 
						 | 
					2c6a26b01a | ||
| 
						 | 
					e596553dbf | ||
| 
						 | 
					990b1b8623 | ||
| 
						 | 
					9856249c88 | ||
| 
						 | 
					7818f0642f | ||
| 
						 | 
					bcea319eb8 | ||
| 
						 | 
					246ae9fe77 | ||
| 
						 | 
					b4a678640e | ||
| 
						 | 
					8692c17ea4 | ||
| 
						 | 
					59ee098fde | ||
| 
						 | 
					cd09043558 | ||
| 
						 | 
					6998a61f37 | ||
| 
						 | 
					be8f8eec70 | ||
| 
						 | 
					4986730f44 | ||
| 
						 | 
					85fb2c5725 | ||
| 
						 | 
					2baede4675 | ||
| 
						 | 
					176992a629 | ||
| 
						 | 
					905e7ffc43 | ||
| 
						 | 
					8ff130ebfd | ||
| 
						 | 
					064bcb31d8 | ||
| 
						 | 
					25e4e5e8b4 | ||
| 
						 | 
					e3018086fb | ||
| 
						 | 
					f3908da0a6 | ||
| 
						 | 
					2e57ffb169 | ||
| 
						 | 
					bda8199e5d | ||
| 
						 | 
					a6cbb64f59 | ||
| 
						 | 
					8b1efaeb53 | ||
| 
						 | 
					fa767adf52 | ||
| 
						 | 
					096a6128c9 | ||
| 
						 | 
					a5fa022792 | ||
| 
						 | 
					2922df08f4 | ||
| 
						 | 
					700aae3ab0 | ||
| 
						 | 
					cad6b4d1ee | ||
| 
						 | 
					2b57061949 | ||
| 
						 | 
					ca5b0a95d9 | ||
| 
						 | 
					0e3b486e22 | ||
| 
						 | 
					f3e5ad4a2a | ||
| 
						 | 
					ad2ab61927 | ||
| 
						 | 
					e2464cf3b1 | ||
| 
						 | 
					4c2959b4c4 | ||
| 
						 | 
					4718e9ff22 | ||
| 
						 | 
					8899e57f81 | ||
| 
						 | 
					14098177e4 | ||
| 
						 | 
					3c68e2bd29 | ||
| 
						 | 
					bebec4f638 | ||
| 
						 | 
					f16f00cc7e | ||
| 
						 | 
					b01b25b084 | ||
| 
						 | 
					39389f77d0 | ||
| 
						 | 
					a1dbcdbae3 | ||
| 
						 | 
					92f5b5a4ae | ||
| 
						 | 
					f379159a70 | ||
| 
						 | 
					ec850344fc | ||
| 
						 | 
					824f995209 | ||
| 
						 | 
					8a0a9700aa | ||
| 
						 | 
					7cd51d5611 | ||
| 
						 | 
					eda7b42edb | ||
| 
						 | 
					981ab25a91 | ||
| 
						 | 
					f0dded8eb5 | ||
| 
						 | 
					1f0e7e44cc | ||
| 
						 | 
					95c31d99c0 | ||
| 
						 | 
					e3db0dfbab | ||
| 
						 | 
					559ebf0852 | ||
| 
						 | 
					0e8abae46f | ||
| 
						 | 
					bfe034d77f | ||
| 
						 | 
					50a1656f61 | ||
| 
						 | 
					f70780f618 | ||
| 
						 | 
					712bd0cd04 | ||
| 
						 | 
					123d544cd1 | ||
| 
						 | 
					414966732c | ||
| 
						 | 
					58de0773f4 | ||
| 
						 | 
					22505195ec | ||
| 
						 | 
					ea2c9b3d9f | ||
| 
						 | 
					f39405640f | ||
| 
						 | 
					436b366743 | ||
| 
						 | 
					c3719f896d | ||
| 
						 | 
					654e5f4453 | ||
| 
						 | 
					fa54deb091 | ||
| 
						 | 
					346dbdf7bb | ||
| 
						 | 
					f246eb7736 | ||
| 
						 | 
					f7454c8064 | ||
| 
						 | 
					271f8d155c | ||
| 
						 | 
					6b93c2609e | ||
| 
						 | 
					2c342a7d44 | ||
| 
						 | 
					5b18f88b90 | ||
| 
						 | 
					d0ae5e42f4 | ||
| 
						 | 
					59d642434a | ||
| 
						 | 
					f2d6931f1a | ||
| 
						 | 
					2fb73b0951 | ||
| 
						 | 
					f3312852a9 | ||
| 
						 | 
					781a4a76c0 | ||
| 
						 | 
					475ff14f78 | ||
| 
						 | 
					b6698138b6 | ||
| 
						 | 
					6251d7737c | ||
| 
						 | 
					06e700c6a2 | ||
| 
						 | 
					ff65e2abb4 | ||
| 
						 | 
					a16c397843 | ||
| 
						 | 
					da2ba0ec49 | ||
| 
						 | 
					9d8e19622f | ||
| 
						 | 
					f820a2a631 | ||
| 
						 | 
					da089fc46a | ||
| 
						 | 
					937243a9d9 | ||
| 
						 | 
					a2de29e5ac | ||
| 
						 | 
					25cdf6d6bf | ||
| 
						 | 
					b5cf66c232 | ||
| 
						 | 
					7be3904123 | ||
| 
						 | 
					3109ea0220 | ||
| 
						 | 
					63297cb6a6 | ||
| 
						 | 
					ed480a2954 | ||
| 
						 | 
					3da6f6ffa6 | ||
| 
						 | 
					881d5d599d | ||
| 
						 | 
					b0b4614610 | ||
| 
						 | 
					f0e96b5f8b | ||
| 
						 | 
					6fed2cb9c0 | ||
| 
						 | 
					8e2ffa1654 | ||
| 
						 | 
					c25d4bd768 | ||
| 
						 | 
					9f8f2966d9 | ||
| 
						 | 
					5c976948dd | ||
| 
						 | 
					ff4b137088 | ||
| 
						 | 
					e3214e38d3 | ||
| 
						 | 
					4b1553abc7 | ||
| 
						 | 
					2fc457dd78 | ||
| 
						 | 
					3621ea934c | ||
| 
						 | 
					b275dac08a | ||
| 
						 | 
					47e1bfc810 | ||
| 
						 | 
					37e9ba48b1 | ||
| 
						 | 
					a54d537536 | ||
| 
						 | 
					0c2b221c06 | ||
| 
						 | 
					e3375741af | ||
| 
						 | 
					d82a88bcc6 | ||
| 
						 | 
					f7cab00e4d | ||
| 
						 | 
					7f733b8029 | ||
| 
						 | 
					d6291c8af4 | ||
| 
						 | 
					563852c024 | ||
| 
						 | 
					1941d9b748 | ||
| 
						 | 
					3473be99bf | ||
| 
						 | 
					10cb6a81c7 | ||
| 
						 | 
					cb65906290 | ||
| 
						 | 
					7a83d85884 | ||
| 
						 | 
					35f0d6908a | ||
| 
						 | 
					2c2d100c27 | ||
| 
						 | 
					ab623a7a91 | ||
| 
						 | 
					e2e606602b | ||
| 
						 | 
					cd3149b601 | ||
| 
						 | 
					50748db958 | ||
| 
						 | 
					8049dc7332 | ||
| 
						 | 
					f468796877 | ||
| 
						 | 
					c093780230 | ||
| 
						 | 
					c67e44cc9d | ||
| 
						 | 
					db45d0c87a | ||
| 
						 | 
					4107a01a01 | ||
| 
						 | 
					5e378844a1 | ||
| 
						 | 
					623496ff52 | ||
| 
						 | 
					5082814023 | ||
| 
						 | 
					9836b7aefb | ||
| 
						 | 
					cb9681ef41 | ||
| 
						 | 
					7527b8ac2d | ||
| 
						 | 
					da081ba706 | ||
| 
						 | 
					e6063da813 | ||
| 
						 | 
					e6b4cb94bd | ||
| 
						 | 
					56b843c007 | ||
| 
						 | 
					a26b30f0bc | ||
| 
						 | 
					4a1d8cdd0d | ||
| 
						 | 
					7a0920b87c | ||
| 
						 | 
					26199ebb76 | ||
| 
						 | 
					e3e01558b2 | ||
| 
						 | 
					1852486818 | ||
| 
						 | 
					d7ea394a15 | ||
| 
						 | 
					c4a1d8aa56 | ||
| 
						 | 
					be39591c54 | ||
| 
						 | 
					94320265b8 | ||
| 
						 | 
					b94a943694 | ||
| 
						 | 
					1674ec1ebf | ||
| 
						 | 
					3923e46f22 | ||
| 
						 | 
					ed71b499b9 | ||
| 
						 | 
					924fb90220 | ||
| 
						 | 
					00191763cf | ||
| 
						 | 
					555a21d648 | ||
| 
						 | 
					9d88db83ee | ||
| 
						 | 
					2bdecc899d | ||
| 
						 | 
					ab8992f0aa | ||
| 
						 | 
					31b203f81a | ||
| 
						 | 
					e474ad573a | ||
| 
						 | 
					4c6227fccf | ||
| 
						 | 
					02b7b12ea5 | ||
| 
						 | 
					d319a54fee | ||
| 
						 | 
					397a93bd6f | ||
| 
						 | 
					8d3f4137a1 | ||
| 
						 | 
					3a615a070b | ||
| 
						 | 
					95a04788e5 | ||
| 
						 | 
					60a1a1f21c | ||
| 
						 | 
					4ad5627823 | ||
| 
						 | 
					5a83621c64 | ||
| 
						 | 
					ed6d2fc005 | ||
| 
						 | 
					63f05a7388 | ||
| 
						 | 
					a687377d16 | ||
| 
						 | 
					9dc8f66153 | ||
| 
						 | 
					e155174bd7 | ||
| 
						 | 
					6c06e24b48 | ||
| 
						 | 
					a99fcbb71d | ||
| 
						 | 
					95b8b0b4dd | ||
| 
						 | 
					c47fe51422 | ||
| 
						 | 
					25b3aa5850 | ||
| 
						 | 
					a87d8871ad | ||
| 
						 | 
					d6fa3b02a9 | ||
| 
						 | 
					8a514fff17 | ||
| 
						 | 
					00b43e88dc | ||
| 
						 | 
					7048c2c10c | ||
| 
						 | 
					3f64789c55 | ||
| 
						 | 
					38e7f7f1b6 | ||
| 
						 | 
					b337bc5cfd | ||
| 
						 | 
					4ac5daed8c | ||
| 
						 | 
					82b724174c | ||
| 
						 | 
					e7ab2bcffd | ||
| 
						 | 
					3518c74508 | ||
| 
						 | 
					a9515d38d1 | ||
| 
						 | 
					e32bce29e0 | ||
| 
						 | 
					48ca696b0b | ||
| 
						 | 
					7bd9a887a6 | ||
| 
						 | 
					7bc66e9382 | ||
| 
						 | 
					ff3feb61bc | ||
| 
						 | 
					2cb98d65da | ||
| 
						 | 
					b7ac65fce0 | ||
| 
						 | 
					601fff454d | ||
| 
						 | 
					730084425e | ||
| 
						 | 
					646094f210 | ||
| 
						 | 
					d5c9e1e9f6 | ||
| 
						 | 
					8d0bcb94b1 | ||
| 
						 | 
					f681f0e50a | ||
| 
						 | 
					2185f59111 | ||
| 
						 | 
					c5ba0b1e42 | ||
| 
						 | 
					b522284834 | ||
| 
						 | 
					3e2adfb0b8 | ||
| 
						 | 
					1a6f6759b9 | ||
| 
						 | 
					43a67bcd9d | ||
| 
						 | 
					5f7621cd8c | ||
| 
						 | 
					5e30a0b250 | ||
| 
						 | 
					8f02072762 | ||
| 
						 | 
					79fdba44c6 | ||
| 
						 | 
					efe0bad650 | ||
| 
						 | 
					a244362935 | ||
| 
						 | 
					924f5f13b1 | ||
| 
						 | 
					8f8dbd2023 | ||
| 
						 | 
					952d31a7d5 | ||
| 
						 | 
					f6e90a3121 | ||
| 
						 | 
					2818af7402 | ||
| 
						 | 
					9a36bdb9d1 | ||
| 
						 | 
					033468b0b0 | ||
| 
						 | 
					e6d83c6c58 | ||
| 
						 | 
					49d58c69bc | ||
| 
						 | 
					67ff355ca3 | ||
| 
						 | 
					5b0a7b39b7 | ||
| 
						 | 
					4ff5dea346 | ||
| 
						 | 
					4f244a126c | ||
| 
						 | 
					1926dffb7b | ||
| 
						 | 
					8642725b9f | ||
| 
						 | 
					7252f80573 | ||
| 
						 | 
					2d331332a4 | ||
| 
						 | 
					f36e2551b5 | ||
| 
						 | 
					bcf09c59e3 | ||
| 
						 | 
					b84c41d668 | ||
| 
						 | 
					2fbbb18bd9 | ||
| 
						 | 
					d48c2ddb36 | ||
| 
						 | 
					2b55e72be2 | ||
| 
						 | 
					b21fcf8f2b | ||
| 
						 | 
					02a99e8118 | ||
| 
						 | 
					fa66c96d60 | ||
| 
						 | 
					888c8217ca | ||
| 
						 | 
					de3aab4996 | ||
| 
						 | 
					8d587d27e5 | ||
| 
						 | 
					fa7bb79122 | ||
| 
						 | 
					f3255a7f31 | ||
| 
						 | 
					69680cbb8d | ||
| 
						 | 
					69c693a0a3 | ||
| 
						 | 
					69cdd5fb4a | ||
| 
						 | 
					59101cfcb3 | ||
| 
						 | 
					7120e32c91 | ||
| 
						 | 
					0a0d94ec91 | ||
| 
						 | 
					43e3277c0d | ||
| 
						 | 
					da28596968 | ||
| 
						 | 
					c1c7654380 | ||
| 
						 | 
					20116d7af6 | ||
| 
						 | 
					8c32fe010c | ||
| 
						 | 
					0a3debb691 | ||
| 
						 | 
					a3e5d04aac | ||
| 
						 | 
					153c98c03a | ||
| 
						 | 
					90fa980b70 | ||
| 
						 | 
					42bfde0e7f | ||
| 
						 | 
					14122bcfa2 | ||
| 
						 | 
					84879af11a | ||
| 
						 | 
					1c371347e9 | ||
| 
						 | 
					0c08a4d10c | ||
| 
						 | 
					3a66aaf9d7 | ||
| 
						 | 
					1992d99556 | ||
| 
						 | 
					60046da4b3 | ||
| 
						 | 
					e33e954e41 | ||
| 
						 | 
					f5e5091b10 | ||
| 
						 | 
					38691b80f2 | ||
| 
						 | 
					8d5eef6fa7 | ||
| 
						 | 
					e0f935519a | ||
| 
						 | 
					1b9081ce80 | ||
| 
						 | 
					e1098d9502 | ||
| 
						 | 
					14a4acdd92 | 
@@ -1,6 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
  "files": [
 | 
			
		||||
    "README.md"
 | 
			
		||||
    "README.md",
 | 
			
		||||
    "README.zh-CN.md",
 | 
			
		||||
    "README.ru-RU.md",
 | 
			
		||||
    "README.ko-KR.md",
 | 
			
		||||
    "README.it-IT.md",
 | 
			
		||||
    "README.de-DE.md"
 | 
			
		||||
  ],
 | 
			
		||||
  "imageSize": 100,
 | 
			
		||||
  "commit": false,
 | 
			
		||||
@@ -442,6 +447,288 @@
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "BoYeonJang",
 | 
			
		||||
      "name": "장보연",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/59506394?v=4",
 | 
			
		||||
      "profile": "https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "doc"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "Me1onRind",
 | 
			
		||||
      "name": "zZ",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/19531270?v=4",
 | 
			
		||||
      "profile": "https://github.com/Me1onRind",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "tainoNZ",
 | 
			
		||||
      "name": "Aaron Davison",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/49261322?v=4",
 | 
			
		||||
      "profile": "https://github.com/tainoNZ",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "composer404",
 | 
			
		||||
      "name": "Przemyslaw Kozik",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/58251560?v=4",
 | 
			
		||||
      "profile": "https://github.com/composer404",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "design"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "highfredo",
 | 
			
		||||
      "name": "Alfredo Arellano de la Fuente",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/5951524?v=4",
 | 
			
		||||
      "profile": "https://github.com/highfredo",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "NessunKim",
 | 
			
		||||
      "name": "MH Kim",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/12974079?v=4",
 | 
			
		||||
      "profile": "https://github.com/NessunKim",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "jaimeadf",
 | 
			
		||||
      "name": "Marmota",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/40345645?v=4",
 | 
			
		||||
      "profile": "https://discord.gg/4c5EVTBhtp",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "design"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "TENX-S",
 | 
			
		||||
      "name": "Ares Andrew",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/40336192?v=4",
 | 
			
		||||
      "profile": "https://ares.zone",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "doc"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "gkor",
 | 
			
		||||
      "name": "George Korsnick",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/780052?v=4",
 | 
			
		||||
      "profile": "https://usual.io/",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "financial"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "uluhonolulu",
 | 
			
		||||
      "name": "Artem Smirnov",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/872764?v=4",
 | 
			
		||||
      "profile": "https://about.me/ulu",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "financial"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "nevotheless",
 | 
			
		||||
      "name": "Tim Kopplow",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/779797?v=4",
 | 
			
		||||
      "profile": "https://github.com/nevotheless",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "financial"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "mrthock",
 | 
			
		||||
      "name": "mrthock",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/88901709?v=4",
 | 
			
		||||
      "profile": "https://github.com/mrthock",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "financial"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "lrottach",
 | 
			
		||||
      "name": "Lukas Rottach",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/50323692?v=4",
 | 
			
		||||
      "profile": "https://github.com/lrottach",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "financial"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "boonkerz",
 | 
			
		||||
      "name": "boonkerz",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/277321?v=4",
 | 
			
		||||
      "profile": "https://github.com/boonkerz",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code",
 | 
			
		||||
        "translation"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "milotype",
 | 
			
		||||
      "name": "Milo Ivir",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/43657314?v=4",
 | 
			
		||||
      "profile": "https://github.com/milotype",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "translation"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "JasonCubic",
 | 
			
		||||
      "name": "JasonCubic",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/8921015?v=4",
 | 
			
		||||
      "profile": "https://github.com/JasonCubic",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "design"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "MaxWaldorf",
 | 
			
		||||
      "name": "MaxWaldorf",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/15877853?v=4",
 | 
			
		||||
      "profile": "https://github.com/MaxWaldorf",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "infra"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "mwz",
 | 
			
		||||
      "name": "Michael Wizner",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/1190768?v=4",
 | 
			
		||||
      "profile": "https://github.com/mwz",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "mgrulich",
 | 
			
		||||
      "name": "Martin",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/781036?v=4",
 | 
			
		||||
      "profile": "https://github.com/mgrulich",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "piersandro",
 | 
			
		||||
      "name": "Piersandro Guerrera",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/19996309?v=4",
 | 
			
		||||
      "profile": "https://github.com/piersandro",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "doc",
 | 
			
		||||
        "translation"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "X-0x01",
 | 
			
		||||
      "name": "X-0x01",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/19320096?v=4",
 | 
			
		||||
      "profile": "http://pingbase.cn",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "Allenator",
 | 
			
		||||
      "name": "Allenator",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/11794943?v=4",
 | 
			
		||||
      "profile": "https://github.com/Allenator",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "doc"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "microhobby",
 | 
			
		||||
      "name": "Matheus Castello",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/2633321?v=4",
 | 
			
		||||
      "profile": "http://microhobby.com.br/blog",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "Jai-JAP",
 | 
			
		||||
      "name": "Jai A P",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/78354625?v=4",
 | 
			
		||||
      "profile": "https://github.com/Jai-JAP",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "platform"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "ysc3839",
 | 
			
		||||
      "name": "Richard Yu",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/12028138?v=4",
 | 
			
		||||
      "profile": "https://blog.ysc3839.com",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "artu-ole",
 | 
			
		||||
      "name": "artu-ole",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/15938416?v=4",
 | 
			
		||||
      "profile": "https://github.com/artu-ole",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "TimaGribanov",
 | 
			
		||||
      "name": "Timofey Gribanov",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/48593815?v=4",
 | 
			
		||||
      "profile": "https://timagribanov.github.io/",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "doc",
 | 
			
		||||
        "translation"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "ChristianBingman",
 | 
			
		||||
      "name": "Christian Bingman",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/42191425?v=4",
 | 
			
		||||
      "profile": "https://git.christianbingman.com",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "Ox0400",
 | 
			
		||||
      "name": "zhipeng",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/5310853?v=4",
 | 
			
		||||
      "profile": "http://zhangzhipeng2023.cn/",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "woodmeal",
 | 
			
		||||
      "name": "woodmeal",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/104011197?v=4",
 | 
			
		||||
      "profile": "https://github.com/woodmeal",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "code"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "login": "MagicLike",
 | 
			
		||||
      "name": "MagicLike",
 | 
			
		||||
      "avatar_url": "https://avatars.githubusercontent.com/u/82117109?v=4",
 | 
			
		||||
      "profile": "https://magiclike.codeberg.page",
 | 
			
		||||
      "contributions": [
 | 
			
		||||
        "doc"
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "contributorsPerLine": 7,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
---
 | 
			
		||||
name: Feature request
 | 
			
		||||
about: Suggest an idea for this project
 | 
			
		||||
title: ''
 | 
			
		||||
labels: ''
 | 
			
		||||
assignees: ''
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<!--
 | 
			
		||||
# RULES:
 | 
			
		||||
 | 
			
		||||
* **ENGLISH ONLY** - this issue tracker is English-only. Please respect the people who take time to help you with your problems.
 | 
			
		||||
* Search existing issues first: https://github.com/Eugeny/tabby/issues
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
**Is your feature request related to a problem? Please describe.**
 | 
			
		||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
 | 
			
		||||
 | 
			
		||||
**Describe the solution you'd like**
 | 
			
		||||
A clear and concise description of what you want to happen.
 | 
			
		||||
 | 
			
		||||
**Describe alternatives you've considered**
 | 
			
		||||
A clear and concise description of any alternative solutions or features you've considered.
 | 
			
		||||
 | 
			
		||||
**Additional context**
 | 
			
		||||
Add any other context or screenshots about the feature request here.
 | 
			
		||||
							
								
								
									
										23
									
								
								.github/ISSUE_TEMPLATE/issue-report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.github/ISSUE_TEMPLATE/issue-report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
---
 | 
			
		||||
name: Issue report
 | 
			
		||||
about: Report a problem
 | 
			
		||||
title: ''
 | 
			
		||||
labels: 'T: Bug'
 | 
			
		||||
assignees: ''
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<!--
 | 
			
		||||
# READ CAREFULLY:
 | 
			
		||||
 | 
			
		||||
* **ENGLISH ONLY** - this issue tracker is English-only. Please respect the people who take time to help you with your problems.
 | 
			
		||||
* Search existing issues first: https://github.com/Eugeny/tabby/issues
 | 
			
		||||
* Test with the latest Tabby version: https://github.com/Eugeny/tabby/releases
 | 
			
		||||
* Disable third-party plugins.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
**Describe the problem**:
 | 
			
		||||
[A clear and concise description of what the bug is.]
 | 
			
		||||
 | 
			
		||||
**To Reproduce**:
 | 
			
		||||
[Steps to reproduce the behavior]
 | 
			
		||||
							
								
								
									
										104
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										104
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -2,18 +2,18 @@ name: Package-Build
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
jobs:
 | 
			
		||||
  Lint:
 | 
			
		||||
    runs-on: macos-11.0
 | 
			
		||||
    runs-on: macos-11
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2.3.4
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
      with:
 | 
			
		||||
        fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
    - name: Installing Node
 | 
			
		||||
      uses: actions/setup-node@v2.4.0
 | 
			
		||||
      uses: actions/setup-node@v3.0.0
 | 
			
		||||
      with:
 | 
			
		||||
        node-version: 14
 | 
			
		||||
        node-version: 16
 | 
			
		||||
 | 
			
		||||
    - name: Install deps
 | 
			
		||||
      run: |
 | 
			
		||||
@@ -31,7 +31,7 @@ jobs:
 | 
			
		||||
      run: yarn run lint
 | 
			
		||||
 | 
			
		||||
  macOS-Build:
 | 
			
		||||
    runs-on: macos-11.0
 | 
			
		||||
    runs-on: macos-11
 | 
			
		||||
    needs: Lint
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
@@ -41,30 +41,30 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2.3.4
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
      with:
 | 
			
		||||
        fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
    - name: Installing Node
 | 
			
		||||
      uses: actions/setup-node@v2.4.0
 | 
			
		||||
      uses: actions/setup-node@v3.0.0
 | 
			
		||||
      with:
 | 
			
		||||
        node-version: 14
 | 
			
		||||
        node-version: 16
 | 
			
		||||
 | 
			
		||||
    - name: Install deps
 | 
			
		||||
      run: |
 | 
			
		||||
        sudo npm i -g yarn@1.22.1
 | 
			
		||||
        cd app
 | 
			
		||||
        yarn
 | 
			
		||||
        yarn --network-timeout 1000000
 | 
			
		||||
        cd ..
 | 
			
		||||
        rm app/node_modules/.yarn-integrity
 | 
			
		||||
        yarn
 | 
			
		||||
        yarn --network-timeout 1000000
 | 
			
		||||
 | 
			
		||||
    - name: Build native deps
 | 
			
		||||
      run: scripts/build-native.js
 | 
			
		||||
      env:
 | 
			
		||||
        ARCH: ${{matrix.arch}}
 | 
			
		||||
 | 
			
		||||
    - name: Build native deps
 | 
			
		||||
    - name: Fix cross build
 | 
			
		||||
      run: |
 | 
			
		||||
        rm -rf app/node_modules/cpu-features
 | 
			
		||||
        rm -rf app/node_modules/ssh2/crypto/build
 | 
			
		||||
@@ -91,6 +91,8 @@ jobs:
 | 
			
		||||
        APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}
 | 
			
		||||
        APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }}
 | 
			
		||||
        USE_HARD_LINKS: false
 | 
			
		||||
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
 | 
			
		||||
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 | 
			
		||||
        # DEBUG: electron-builder,electron-builder:*
 | 
			
		||||
 | 
			
		||||
    - name: Build packages without signing
 | 
			
		||||
@@ -129,31 +131,30 @@ jobs:
 | 
			
		||||
        path: artifact-zip
 | 
			
		||||
 | 
			
		||||
  Linux-Build:
 | 
			
		||||
    runs-on: ubuntu-18.04
 | 
			
		||||
    runs-on: ubuntu-18.04 # build against an older glibc for compatibility
 | 
			
		||||
    needs: Lint
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2.3.4
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
      with:
 | 
			
		||||
        fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
    - name: Install Node
 | 
			
		||||
      uses: actions/setup-node@v2.4.0
 | 
			
		||||
      uses: actions/setup-node@v3.0.0
 | 
			
		||||
      with:
 | 
			
		||||
        node-version: 14
 | 
			
		||||
        node-version: 16
 | 
			
		||||
 | 
			
		||||
    - name: Install deps
 | 
			
		||||
      run: |
 | 
			
		||||
        sudo apt-get update
 | 
			
		||||
        sudo apt-get install bsdtar zsh
 | 
			
		||||
        sudo apt-get install libarchive-tools zsh
 | 
			
		||||
        npm i -g yarn@1.19.1
 | 
			
		||||
        cd app
 | 
			
		||||
        yarn
 | 
			
		||||
        yarn --network-timeout 1000000
 | 
			
		||||
        cd ..
 | 
			
		||||
        rm app/node_modules/.yarn-integrity
 | 
			
		||||
        yarn
 | 
			
		||||
        npm run patch
 | 
			
		||||
        yarn --network-timeout 1000000
 | 
			
		||||
 | 
			
		||||
    - name: Build native deps
 | 
			
		||||
      run: scripts/build-native.js
 | 
			
		||||
@@ -169,6 +170,8 @@ jobs:
 | 
			
		||||
      env:
 | 
			
		||||
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        USE_HARD_LINKS: false
 | 
			
		||||
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
 | 
			
		||||
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 | 
			
		||||
        # DEBUG: electron-builder,electron-builder:*
 | 
			
		||||
 | 
			
		||||
    - name: Build web resources
 | 
			
		||||
@@ -183,6 +186,15 @@ jobs:
 | 
			
		||||
        SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
 | 
			
		||||
        SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
 | 
			
		||||
 | 
			
		||||
    - name: Upload packages to packagecloud.io
 | 
			
		||||
      uses: Eugeny/packagecloud-action@main
 | 
			
		||||
      if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
 | 
			
		||||
      env:
 | 
			
		||||
        PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
 | 
			
		||||
      with:
 | 
			
		||||
        repo: 'eugeny/tabby'
 | 
			
		||||
        dir: 'dist'
 | 
			
		||||
 | 
			
		||||
    - name: Package artifacts
 | 
			
		||||
      run: |
 | 
			
		||||
        mkdir artifact-deb
 | 
			
		||||
@@ -191,8 +203,6 @@ jobs:
 | 
			
		||||
        mv dist/*.rpm artifact-rpm/ || true
 | 
			
		||||
        mkdir artifact-pacman
 | 
			
		||||
        mv dist/*.pacman artifact-pacman/ || true
 | 
			
		||||
        mkdir artifact-snap
 | 
			
		||||
        mv dist/*.snap artifact-snap/ || true
 | 
			
		||||
        mkdir artifact-tar.gz
 | 
			
		||||
        mv dist/*.tar.gz artifact-tar.gz/ || true
 | 
			
		||||
        mkdir artifact-web
 | 
			
		||||
@@ -201,31 +211,25 @@ jobs:
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload DEB
 | 
			
		||||
      with:
 | 
			
		||||
        name: Linux DEB
 | 
			
		||||
        name: Linux DEB (x86_64)
 | 
			
		||||
        path: artifact-deb
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload RPM
 | 
			
		||||
      with:
 | 
			
		||||
        name: Linux RPM
 | 
			
		||||
        name: Linux RPM (x86_64)
 | 
			
		||||
        path: artifact-rpm
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload Pacman Package
 | 
			
		||||
      with:
 | 
			
		||||
        name: Linux Pacman
 | 
			
		||||
        name: Linux Pacman (x86_64)
 | 
			
		||||
        path: artifact-pacman
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload Snap
 | 
			
		||||
      with:
 | 
			
		||||
        name: Linux Snap
 | 
			
		||||
        path: artifact-snap
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload Linux tarball
 | 
			
		||||
      with:
 | 
			
		||||
        name: Linux tarball
 | 
			
		||||
        name: Linux tarball (x86_64)
 | 
			
		||||
        path: artifact-tar.gz
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
@@ -234,42 +238,60 @@ jobs:
 | 
			
		||||
        name: Web tarball
 | 
			
		||||
        path: artifact-web
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Windows-Build:
 | 
			
		||||
    runs-on: windows-2016
 | 
			
		||||
    runs-on: windows-2022
 | 
			
		||||
    needs: Lint
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - arch: x64
 | 
			
		||||
          - arch: arm64
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2.3.4
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
      with:
 | 
			
		||||
        fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
    - name: Installing Node
 | 
			
		||||
      uses: actions/setup-node@v2.4.0
 | 
			
		||||
      uses: actions/setup-node@v3.0.0
 | 
			
		||||
      with:
 | 
			
		||||
        node-version: 14
 | 
			
		||||
        node-version: 16
 | 
			
		||||
 | 
			
		||||
    - name: Update node-gyp
 | 
			
		||||
      run: |
 | 
			
		||||
        npm install --global node-gyp@8.4.1
 | 
			
		||||
        npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      shell: powershell
 | 
			
		||||
      run: |
 | 
			
		||||
        npm i -g yarn@1.19.1
 | 
			
		||||
        yarn
 | 
			
		||||
        yarn --network-timeout 1000000
 | 
			
		||||
        node scripts/build-native.js
 | 
			
		||||
        yarn run build
 | 
			
		||||
        node scripts/prepackage-plugins.js
 | 
			
		||||
      env:
 | 
			
		||||
        ARCH: ${{matrix.arch}}
 | 
			
		||||
 | 
			
		||||
    - name: Build and sign packages
 | 
			
		||||
      run: node scripts/build-windows.js
 | 
			
		||||
      if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
 | 
			
		||||
      env:
 | 
			
		||||
        ARCH: ${{matrix.arch}}
 | 
			
		||||
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
 | 
			
		||||
        WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
 | 
			
		||||
        # DEBUG: electron-builder,electron-builder:*
 | 
			
		||||
        DEBUG: electron-builder,electron-builder:*
 | 
			
		||||
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
 | 
			
		||||
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 | 
			
		||||
 | 
			
		||||
    - name: Build packages without signing
 | 
			
		||||
      run: node scripts/build-windows.js
 | 
			
		||||
      if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
 | 
			
		||||
      env:
 | 
			
		||||
        ARCH: ${{matrix.arch}}
 | 
			
		||||
 | 
			
		||||
    - name: Upload symbols
 | 
			
		||||
      run: |
 | 
			
		||||
@@ -283,18 +305,18 @@ jobs:
 | 
			
		||||
    - name: Package artifacts
 | 
			
		||||
      run: |
 | 
			
		||||
        mkdir artifact-setup
 | 
			
		||||
        mv dist/*-setup.exe artifact-setup/
 | 
			
		||||
        mv dist/*-setup-*.exe artifact-setup/
 | 
			
		||||
        mkdir artifact-portable
 | 
			
		||||
        mv dist/*-portable.zip artifact-portable/
 | 
			
		||||
        mv dist/*-portable-*.zip artifact-portable/
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload installer
 | 
			
		||||
      with:
 | 
			
		||||
        name: Windows installer
 | 
			
		||||
        name: Windows installer (${{matrix.arch}})
 | 
			
		||||
        path: artifact-setup
 | 
			
		||||
 | 
			
		||||
    - uses: actions/upload-artifact@master
 | 
			
		||||
      name: Upload portable build
 | 
			
		||||
      with:
 | 
			
		||||
        name: Windows portable build
 | 
			
		||||
        name: Windows portable build (${{matrix.arch}})
 | 
			
		||||
        path: artifact-portable
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										70
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
# For most projects, this workflow file will not need changing; you simply need
 | 
			
		||||
# to commit it to your repository.
 | 
			
		||||
#
 | 
			
		||||
# You may wish to alter this file to override the set of languages analyzed,
 | 
			
		||||
# or to provide custom queries or build logic.
 | 
			
		||||
#
 | 
			
		||||
# ******** NOTE ********
 | 
			
		||||
# We have attempted to detect the languages in your repository. Please check
 | 
			
		||||
# the `language` matrix defined below to confirm you have the correct set of
 | 
			
		||||
# supported CodeQL languages.
 | 
			
		||||
#
 | 
			
		||||
name: "CodeQL"
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [ master ]
 | 
			
		||||
  pull_request:
 | 
			
		||||
    # The branches below must be a subset of the branches above
 | 
			
		||||
    branches: [ master ]
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: '26 7 * * 4'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  analyze:
 | 
			
		||||
    name: Analyze
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    permissions:
 | 
			
		||||
      actions: read
 | 
			
		||||
      contents: read
 | 
			
		||||
      security-events: write
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        language: [ 'javascript' ]
 | 
			
		||||
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
 | 
			
		||||
        # Learn more about CodeQL language support at https://git.io/codeql-language-support
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout repository
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
    # Initializes the CodeQL tools for scanning.
 | 
			
		||||
    - name: Initialize CodeQL
 | 
			
		||||
      uses: github/codeql-action/init@v1
 | 
			
		||||
      with:
 | 
			
		||||
        languages: ${{ matrix.language }}
 | 
			
		||||
        # If you wish to specify custom queries, you can do so here or in a config file.
 | 
			
		||||
        # By default, queries listed here will override any specified in a config file.
 | 
			
		||||
        # Prefix the list here with "+" to use these queries and those in the config file.
 | 
			
		||||
        # queries: ./path/to/local/query, your-org/your-repo/queries@main
 | 
			
		||||
 | 
			
		||||
    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
 | 
			
		||||
    # If this step fails, then you should remove it and run the build manually (see below)
 | 
			
		||||
    - name: Autobuild
 | 
			
		||||
      uses: github/codeql-action/autobuild@v1
 | 
			
		||||
 | 
			
		||||
    # ℹ️ Command-line programs to run using the OS shell.
 | 
			
		||||
    # 📚 https://git.io/JvXDl
 | 
			
		||||
 | 
			
		||||
    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
 | 
			
		||||
    #    and modify them (or add more) to build your code if your project
 | 
			
		||||
    #    uses a compiled language
 | 
			
		||||
 | 
			
		||||
    #- run: |
 | 
			
		||||
    #   make bootstrap
 | 
			
		||||
    #   make release
 | 
			
		||||
 | 
			
		||||
    - name: Perform CodeQL Analysis
 | 
			
		||||
      uses: github/codeql-action/analyze@v1
 | 
			
		||||
							
								
								
									
										16
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							@@ -2,24 +2,22 @@ name: Docs
 | 
			
		||||
on: push
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-18.04
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: ${{ github.actor != 'dependabot[bot]' }}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v2.3.4
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
      with:
 | 
			
		||||
        fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
    - name: Installing Node
 | 
			
		||||
      uses: actions/setup-node@v2.4.0
 | 
			
		||||
      uses: actions/setup-node@v3.0.0
 | 
			
		||||
      with:
 | 
			
		||||
        node-version: 14
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: |
 | 
			
		||||
        eval $(ssh-agent -s)
 | 
			
		||||
        ssh-add <(echo "$DOCS_PRIVATE_KEY")
 | 
			
		||||
        yarn cache clean
 | 
			
		||||
        cd app
 | 
			
		||||
        yarn
 | 
			
		||||
@@ -28,7 +26,13 @@ jobs:
 | 
			
		||||
        yarn
 | 
			
		||||
        yarn run build:typings
 | 
			
		||||
        yarn run docs
 | 
			
		||||
        rsync -e "ssh -o StrictHostKeyChecking=no" -arv docs/api/ root@ajenti.org:/srv/terminus-docs/
 | 
			
		||||
 | 
			
		||||
      env:
 | 
			
		||||
        DOCS_PRIVATE_KEY: ${{ secrets.DOCS_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
    - uses: FirebaseExtended/action-hosting-deploy@v0
 | 
			
		||||
      with:
 | 
			
		||||
        repoToken: '${{ secrets.GITHUB_TOKEN }}'
 | 
			
		||||
        firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_TABBY_DOCS }}'
 | 
			
		||||
        channelId: live
 | 
			
		||||
        projectId: tabby-docs
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								.github/workflows/issue-translator.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/issue-translator.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
name: 'issue-translator'
 | 
			
		||||
on:
 | 
			
		||||
  issue_comment:
 | 
			
		||||
    types: [created]
 | 
			
		||||
  issues:
 | 
			
		||||
    types: [opened]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: tomsun28/issues-translate-action@v2.6
 | 
			
		||||
        with:
 | 
			
		||||
          IS_MODIFY_TITLE: true
 | 
			
		||||
          CUSTOM_BOT_NOTE: The translator bot has detected that this issue body's language is not English, and has translated it automatically.
 | 
			
		||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -34,3 +34,5 @@ sentry-symbols.js
 | 
			
		||||
 | 
			
		||||
tabby-ssh/util/pagent.exe
 | 
			
		||||
*.psd
 | 
			
		||||
 | 
			
		||||
crowdin.yml
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,8 @@ yarn
 | 
			
		||||
./scripts/build-native.js
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Note: For compiling for Linux armv7l, you need to downgrade electron to 17.0.0 in package.json present in root directory of tabby source**
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# Linux (Debian/Ubuntu here as an example)
 | 
			
		||||
sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 cmake
 | 
			
		||||
@@ -145,4 +147,6 @@ export default class MyModule { }
 | 
			
		||||
 | 
			
		||||
See `tabby-core/src/api.ts`, `tabby-settings/src/api.ts`, `tabby-local/src/api.ts` and `tabby-terminal/src/api.ts` for the available extension points.
 | 
			
		||||
 | 
			
		||||
Also check out [the example plugin](https://github.com/Eugeny/tabby-clippy).
 | 
			
		||||
 | 
			
		||||
Publish your plugin on NPM with a `tabby-plugin` keyword to make it appear in the Plugin Manager.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										267
									
								
								README.de-DE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								README.de-DE.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,267 @@
 | 
			
		||||
[](https://tabby.sh)
 | 
			
		||||
 | 
			
		||||
<p  align="center">
 | 
			
		||||
<a  href="https://github.com/Eugeny/tabby/releases/latest"><img  alt="Alle GitHub Releases"  src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a>     <a  href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img  src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a>     <a  href="https://matrix.to/#/#tabby-general:matrix.org"><img  alt="Matrix"  src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a  href="https://translate.tabby.sh/"><img  alt="Übersetzen"  src="https://shields.io/badge/Übersetzen-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/Abonnieren-Nachrichten-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>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
### Downloads:
 | 
			
		||||
 | 
			
		||||
* [Neueste Version](https://github.com/Eugeny/tabby/releases/latest)
 | 
			
		||||
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-basiert](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-basiert](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
 | 
			
		||||
* [Neueste nightly Version](https://nightly.link/Eugeny/tabby/workflows/build/master)
 | 
			
		||||
 | 
			
		||||
<br/>
 | 
			
		||||
<p  align="center">
 | 
			
		||||
Diese README ist auch verfügbar in: <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>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[**Tabby**](https://tabby.sh) (ehemals **Terminus**) ist ein äußerst konfigurierbarer Terminalemulator, SSH- und serieller Client für Windows, macOS und Linux
 | 
			
		||||
 | 
			
		||||
* Integrierter SSH- und Telnet-Client und Verbindungsmanager
 | 
			
		||||
* Integriertes serielles Terminal
 | 
			
		||||
* Theming und Farbschemata
 | 
			
		||||
* Vollständig konfigurierbare Tastenkombinationen und Multi-Akkord-Tastenkombinationen
 | 
			
		||||
* Geteilte Fenster
 | 
			
		||||
* Merkt sich deine Tabs
 | 
			
		||||
* Unterstützung für PowerShell (und PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder und CMD
 | 
			
		||||
* Direkte Dateiübertragung von/zu SSH-Sitzungen über Zmodem
 | 
			
		||||
* Vollständige Unicode-Unterstützung, einschließlich Zeichen mit doppelter Breite
 | 
			
		||||
* Kein Abbruch bei schnell ablaufenden Ausgaben
 | 
			
		||||
* Richtiges Shell-Erlebnis unter Windows, einschließlich Tabulator-Vervollständigung (über Clink)
 | 
			
		||||
* Integrierter verschlüsselter Container für SSH-Secrets und Konfiguration
 | 
			
		||||
* SSH-, SFTP- und Telnet-Client verfügbar als [Web-App](https://tabby.sh/app) (auch [selbstgehostet](https://github.com/Eugeny/tabby-web)).
 | 
			
		||||
 | 
			
		||||
# Inhaltsverzeichnis <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
- [Was Tabby ist und was nicht](#what-tabby-is-and-isnt)
 | 
			
		||||
- [Terminal-Funktionen](#terminal-features)
 | 
			
		||||
- [SSH Client](#ssh-client)
 | 
			
		||||
- [Serielles Terminal](#serial-terminal)
 | 
			
		||||
- [Portabel](#portable)
 | 
			
		||||
- [Plugins](#plugins)
 | 
			
		||||
- [Themen](#themes)
 | 
			
		||||
- [Beitragen](#contributing) 
 | 
			
		||||
 | 
			
		||||
<a  name="about"></a>  
 | 
			
		||||
 | 
			
		||||
# Was Tabby ist und was nicht
 | 
			
		||||
 | 
			
		||||
**Tabby ist** eine Alternative zu Windows Standard-Terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app und iTerm 
 | 
			
		||||
 | 
			
		||||
**Tabby ist weder** eine neue Shell noch ein MinGW- oder Cygwin-Ersatz. Sie ist auch nicht gerade sparsam - wenn die RAM-Nutzung von Bedeutung ist, solltest Du [Conemu](https://conemu.github.io) oder [Alacritty](https://github.com/jwilm/alacritty) in Betracht ziehen.
 | 
			
		||||
 | 
			
		||||
<a  name="terminal"></a> 
 | 
			
		||||
 | 
			
		||||
# Terminal-Funktionen
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
* Ein V220-Terminal + verschiedene Erweiterungen
 | 
			
		||||
* Mehrere verschachtelte, geteilte Fenster
 | 
			
		||||
* Tabs auf jeder Seite des Fensters
 | 
			
		||||
* Optional andockbares Fenster mit einem globalen Spawn-Hotkey ("Quake-Konsole")
 | 
			
		||||
* Fortschrittserkennung
 | 
			
		||||
* Benachrichtigung bei Prozessabschluss
 | 
			
		||||
* Einfügen in Klammern, mehrzeilige Einfügewarnungen
 | 
			
		||||
* Schriftart-Ligaturen
 | 
			
		||||
* Benutzerdefinierte Shell-Profile
 | 
			
		||||
* Optionales RMB-Einfügen und Kopieren bei Auswahl (PuTTY-Stil) 
 | 
			
		||||
 | 
			
		||||
<a  name="ssh"></a>
 | 
			
		||||
 | 
			
		||||
# SSH Client
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
* SSH2-Client mit einem Verbindungsmanager
 | 
			
		||||
* X11 und Portweiterleitung
 | 
			
		||||
* Automatisches Jump-Host-Management
 | 
			
		||||
* Agent-Weiterleitung (inkl. Pageant und Windows-eigenem OpenSSH-Agent)
 | 
			
		||||
* Anmeldeskripte 
 | 
			
		||||
 | 
			
		||||
<a  name="serial"></a>
 | 
			
		||||
 | 
			
		||||
# Serielles Terminal
 | 
			
		||||
 | 
			
		||||
* Gespeicherte Verbindungen
 | 
			
		||||
* Unterstützung von Readline-Eingaben
 | 
			
		||||
* Optionale hexadezimale Byte-für-Byte-Eingabe und Hexdump-Ausgabe
 | 
			
		||||
* Newline-Konvertierung
 | 
			
		||||
* Automatische Wiederverbindung  
 | 
			
		||||
 | 
			
		||||
<a  name="portable"></a>
 | 
			
		||||
 | 
			
		||||
# Portabel
 | 
			
		||||
 | 
			
		||||
Tabby läuft als portable Anwendung unter Windows, wenn Sie einen `data`-Ordner am selben Ort erstellen, an dem sich auch `Tabby.exe` befindet. 
 | 
			
		||||
 | 
			
		||||
<a  name="plugins"></a>
 | 
			
		||||
 | 
			
		||||
# Plugins
 | 
			
		||||
 | 
			
		||||
Plugins und Themen können direkt aus der Ansicht "Einstellungen" in Tabby installiert werden.
 | 
			
		||||
 | 
			
		||||
* [docker](https://github.com/Eugeny/tabby-docker) - Verbindung zu Docker-Containern
 | 
			
		||||
* [title-control](https://github.com/kbjr/terminus-title-control) - ermöglicht die Änderung des Titels der Terminal-Tabs durch Angabe eines Präfixes, Suffixes und/oder zu entfernender Strings
 | 
			
		||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - schnelles Senden von Befehlen an eine oder alle Terminal-Tabs
 | 
			
		||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - speichert Terminalausgaben in einer Datei
 | 
			
		||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - synchronisiert die Konfiguration mit Gist oder Gitee
 | 
			
		||||
* [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
 | 
			
		||||
* [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 
 | 
			
		||||
 | 
			
		||||
<a  name="themes"></a>
 | 
			
		||||
 | 
			
		||||
# Themen
 | 
			
		||||
 | 
			
		||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - ein von Hyper inspiriertes Thema
 | 
			
		||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - das entspannte Thema für Tabby
 | 
			
		||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
 | 
			
		||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
 | 
			
		||||
* [altair](https://github.com/yxuko/terminus-altair) 
 | 
			
		||||
 | 
			
		||||
# Sponsoren <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
[](https://packagecloud.io) 
 | 
			
		||||
 | 
			
		||||
[**packagecloud**](https://packagecloud.io) bietet kostenloses Debian/RPM-Repository-Hosting an 
 | 
			
		||||
 | 
			
		||||
<a  name="contributing"></a>
 | 
			
		||||
 | 
			
		||||
# Beitragen
 | 
			
		||||
 | 
			
		||||
Pull Requests und Plugins sind willkommen!
 | 
			
		||||
 | 
			
		||||
Siehe [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) und [API docs](https://docs.tabby.sh/) für Informationen über den Aufbau des Projekts und ein sehr kurzes Tutorial zur Plugin-Entwicklung.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<a  name="contributors"></a>
 | 
			
		||||
 | 
			
		||||
Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
 | 
			
		||||
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
 | 
			
		||||
<!-- prettier-ignore-start -->
 | 
			
		||||
<!-- markdownlint-disable -->
 | 
			
		||||
<table>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
 | 
			
		||||
    <td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt=""/><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"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt=""/><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"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><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"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><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"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><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"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><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"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><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"><a href="https://magiclike.codeberg.page"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<!-- markdownlint-restore -->
 | 
			
		||||
<!-- prettier-ignore-end -->
 | 
			
		||||
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
 | 
			
		||||
 | 
			
		||||
Dieses Projekt folgt der [all-contributors](https://github.com/all-contributors/all-contributors) Spezifikation. Beiträge jeglicher Art sind willkommen!
 | 
			
		||||
							
								
								
									
										262
									
								
								README.it-IT.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								README.it-IT.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,262 @@
 | 
			
		||||
[](https://tabby.sh)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
  <a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a>   <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a>   <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a>   <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
  <a href="https://ko-fi.com/J3J8KWTF">
 | 
			
		||||
    <img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
 | 
			
		||||
  </a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
### Downloads:
 | 
			
		||||
 | 
			
		||||
* [Ultima versione](https://github.com/Eugeny/tabby/releases/latest)
 | 
			
		||||
* [Repository](https://packagecloud.io/eugeny/tabby): [Pacchetto Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [Pachetto RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
 | 
			
		||||
* [Ultima edizione nightly](https://nightly.link/Eugeny/tabby/workflows/build/master)
 | 
			
		||||
 | 
			
		||||
<br/>
 | 
			
		||||
<p align="center">
 | 
			
		||||
Questo README è disponibile anche in: <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.de-DE.md">:de: Deutsch</a>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[**Tabby**](https://tabby.sh) (precedentemente **Terminus**) è un emulatore di terminale, SSH e client seriale altamente configurabile per Windows, macOS e Linux
 | 
			
		||||
 | 
			
		||||
* Client SSH e Telnet integrato con gestore delle connessioni
 | 
			
		||||
* Terminale seriale integrato
 | 
			
		||||
* Temi e combinazioni di colori
 | 
			
		||||
* Scorciatoie completamente configurabili e scorciatoie multi-tasto
 | 
			
		||||
* Divisibile in pannelli
 | 
			
		||||
* Ricorda le schede aperte
 | 
			
		||||
* Supporto PowerShell (e PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder e CMD
 | 
			
		||||
* Trasferimento file diretto da/a sessioni SSH tramite Zmodem
 | 
			
		||||
* Pieno supporto Unicode inclusi caratteri a doppia larghezza
 | 
			
		||||
* Non si blocca su output a flusso rapido
 | 
			
		||||
* Proper shell experience on Windows including tab completion (via Clink)
 | 
			
		||||
* Integrated encrypted container for SSH secrets and configuration
 | 
			
		||||
* Esperienza shell studiaat per Windows incluso il completamento delle schede (tramite Clink)
 | 
			
		||||
* Contenitore crittografato integrato per chiavi SSH e file di configurazione
 | 
			
		||||
* Client SSH, SFTP e Telnet disponibile come [web app](https://tabby.sh/app) (anche [self-hosted](https://github.com/Eugeny/tabby-web)).
 | 
			
		||||
 | 
			
		||||
# Contenuti <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
- [Cosa è e cosa non è Tabby](#cosa-è-e-cosa-non-è-tabby)
 | 
			
		||||
- [Caratteristiche del Terminale](#caratteristiche-del-terminale)
 | 
			
		||||
- [Client SSH](#client-ssh)
 | 
			
		||||
- [Terminale Seriale](#terminale-seriale)
 | 
			
		||||
- [Portabilità](#portabilità)
 | 
			
		||||
- [Plugin](#plugin)
 | 
			
		||||
- [Temi](#temi)
 | 
			
		||||
- [Partecipazione](#partecipazione)
 | 
			
		||||
 | 
			
		||||
<a name="about"></a>
 | 
			
		||||
 | 
			
		||||
# Cosa è e cosa non è Tabby
 | 
			
		||||
 | 
			
		||||
* **Tabby è** un'alternativa al terminale standard di Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app e iTerm
 | 
			
		||||
 | 
			
		||||
* **Tabby non è** una nuova shell o un'alternativa a MinGW o Cygwin. Non è nemmeno leggero: se l'utilizzo della RAM è importante, considera [Conemu](https://conemu.github.io) o [Alacritty](https://github.com/jwilm/alacritty)
 | 
			
		||||
 | 
			
		||||
<a name="terminal"></a>
 | 
			
		||||
 | 
			
		||||
# Caratteristiche del Terminale
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
* Un terminale V220 + vari estensioni
 | 
			
		||||
* Suddivisione in pannelli
 | 
			
		||||
* Schede su qualsiasi lato della finestra
 | 
			
		||||
* Finestra agganciabile opzionale con un tasto di scelta rapida ("Quake console")
 | 
			
		||||
* Rilevamento del progresso
 | 
			
		||||
* Notifica al completamento del processo
 | 
			
		||||
* Incolla tra parentesi e avvisi di incollaggio multilinea
 | 
			
		||||
* Legature dei caratteri
 | 
			
		||||
* Profili shell personalizzati
 | 
			
		||||
* Incolla RMB e copia su selezione opzionale (in stile PuTTY)
 | 
			
		||||
 | 
			
		||||
<a name="ssh"></a>
 | 
			
		||||
# Client SSH
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
* Client SSH2 con un gestore di connessioni
 | 
			
		||||
* X11 e port forwarding
 | 
			
		||||
* Gestione automatica dell'host di salto
 | 
			
		||||
* Inoltro dell'agente (incluso Pageant e l'agente OpenSSH nativo di Windows)
 | 
			
		||||
* Script di accesso
 | 
			
		||||
 | 
			
		||||
<a name="serial"></a>
 | 
			
		||||
# Terminale Seriale
 | 
			
		||||
 | 
			
		||||
* Connessioni salvate
 | 
			
		||||
* Supporto per l'input Readline
 | 
			
		||||
* Input esadecimale byte per byte opzionale e output hexdump
 | 
			
		||||
* Conversione nuova riga
 | 
			
		||||
* Riconnessione automatica
 | 
			
		||||
 | 
			
		||||
<a name="portable"></a>
 | 
			
		||||
# Portabilità
 | 
			
		||||
 | 
			
		||||
Tabby può essere eseguito come app portatile su Windows, se crei una cartella `data` nella stessa posizione in cui si trova `Tabby.exe`.
 | 
			
		||||
 | 
			
		||||
<a name="plugins"></a>
 | 
			
		||||
# Plugin
 | 
			
		||||
 | 
			
		||||
Plugins and themes can be installed directly from the Settings view inside Tabby.
 | 
			
		||||
 | 
			
		||||
* [docker](https://github.com/Eugeny/tabby-docker) - connect to Docker containers
 | 
			
		||||
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
 | 
			
		||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
 | 
			
		||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file
 | 
			
		||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
 | 
			
		||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
 | 
			
		||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - allows creating custom workspace profiles based on the given config
 | 
			
		||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
 | 
			
		||||
 | 
			
		||||
<a name="themes"></a>
 | 
			
		||||
# Temi
 | 
			
		||||
 | 
			
		||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme
 | 
			
		||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Tabby
 | 
			
		||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
 | 
			
		||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
 | 
			
		||||
* [altair](https://github.com/yxuko/terminus-altair)
 | 
			
		||||
 | 
			
		||||
# Sponsor <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
[](https://packagecloud.io)
 | 
			
		||||
 | 
			
		||||
[**packagecloud**](https://packagecloud.io) ha fornito gratuitamente un hosting per i repository Debian/RPM
 | 
			
		||||
 | 
			
		||||
<a name="contributing"></a>
 | 
			
		||||
# Partecipazione
 | 
			
		||||
 | 
			
		||||
Richieste pull e plugin sono i benvenuti!
 | 
			
		||||
 | 
			
		||||
Vedi [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) e la [documentazione API](https://docs.tabby.sh/) per informazioni su come è strutturato il progetto e un brevissimo tutorial sullo sviluppo dei plugin.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
<a name="contributors"></a>
 | 
			
		||||
 | 
			
		||||
Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
 | 
			
		||||
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
 | 
			
		||||
<!-- prettier-ignore-start -->
 | 
			
		||||
<!-- markdownlint-disable -->
 | 
			
		||||
<table>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
 | 
			
		||||
    <td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt=""/><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"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt=""/><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"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><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"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><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"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><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"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><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"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><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"><a href="https://magiclike.codeberg.page"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<!-- markdownlint-restore -->
 | 
			
		||||
<!-- prettier-ignore-end -->
 | 
			
		||||
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
 | 
			
		||||
 | 
			
		||||
Questo progetto segue le specifiche [all-contributors](https://github.com/all-contributors/all-contributors). Contributi di qualsiasi genere sono ben accetti!
 | 
			
		||||
							
								
								
									
										258
									
								
								README.ko-KR.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								README.ko-KR.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,258 @@
 | 
			
		||||
[](https://tabby.sh)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
  <a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a>   <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a>   <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
  <a href="https://ko-fi.com/J3J8KWTF">
 | 
			
		||||
    <img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
 | 
			
		||||
  </a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
### 다운로드:
 | 
			
		||||
 | 
			
		||||
* [Latest release](https://github.com/Eugeny/tabby/releases/latest)
 | 
			
		||||
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
 | 
			
		||||
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
**Tabby** (구 **Terminus**)는 Windows, macOS 및 Linux용으로 뛰어난 구성의 터미널 에뮬레이터, SSH 및 시리얼 클라이언트입니다.
 | 
			
		||||
 | 
			
		||||
* 통합 SSH 클라이언트 및 연결 관리자
 | 
			
		||||
* 통합 시리얼 터미널
 | 
			
		||||
* 테마 및 색 구성표
 | 
			
		||||
* 전체 구성이 가능한 단축키 및 다중 코드 단축키
 | 
			
		||||
* 창 분할
 | 
			
		||||
* 이전 탭 사용을 기억
 | 
			
		||||
* PowerShell (및 PS Core), WSL, Git-Bash, Cygwin, Cmder 및 CMD 지원
 | 
			
		||||
* Zmodem을 통한 SSH 세션 간의 직접 파일 전송
 | 
			
		||||
* 2바이트 문자를 포함한 전체 유니코드 지원
 | 
			
		||||
* 빠르게 출력되는 것에 대해 휩쓸리지 않음
 | 
			
		||||
* 탭 완성을 포함한 Windows에서의 적절한 셸 환경 (Clink을 통해)
 | 
			
		||||
* SSH 시크릿 및 구성을 위한 통합 암호화 컨테이너
 | 
			
		||||
 | 
			
		||||
# 목차 <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
- [Tabby는 무엇인가](#tabby는-무엇인가)
 | 
			
		||||
- [터미널 기능](#터미널-기능)
 | 
			
		||||
- [SSH 클라이언트](#ssh-클라이언트)
 | 
			
		||||
- [시리얼 터미널](#시리얼-터미널)
 | 
			
		||||
- [포터블](#포터블)
 | 
			
		||||
- [플러그인](#플러그인)
 | 
			
		||||
- [테마](#테마)
 | 
			
		||||
- [기여](#기여)
 | 
			
		||||
 | 
			
		||||
<a name="about"></a>
 | 
			
		||||
 | 
			
		||||
# Tabby는 무엇인가
 | 
			
		||||
 | 
			
		||||
* **Tabby는** Windows의 표준 터미널 (conhost), PowerShell ISE, PuTTY 또는 iTerm의 대안 프로그램입니다.
 | 
			
		||||
 | 
			
		||||
* **Tabby는** 새로운 셸이나 MinGW 또는 Cygwin을 대체하지 **않습니다**. 가볍지도 않습니다. - RAM 사용량이 중요한 경우, [Conemu](https://conemu.github.io) 또는 [Alacritty](https://github.com/jwilm/alacritty)를 고려하십시오.
 | 
			
		||||
 | 
			
		||||
<a name="terminal"></a>
 | 
			
		||||
 | 
			
		||||
# 터미널 기능
 | 
			
		||||
 | 
			
		||||

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

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

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

 | 
			
		||||
@@ -73,6 +79,7 @@
 | 
			
		||||
* Optional RMB paste and copy-on select (PuTTY style)
 | 
			
		||||
 | 
			
		||||
<a name="ssh"></a>
 | 
			
		||||
 | 
			
		||||
# SSH Client
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
@@ -84,6 +91,7 @@
 | 
			
		||||
* Login scripts
 | 
			
		||||
 | 
			
		||||
<a name="serial"></a>
 | 
			
		||||
 | 
			
		||||
# Serial Terminal
 | 
			
		||||
 | 
			
		||||
* Saved connections
 | 
			
		||||
@@ -93,37 +101,48 @@
 | 
			
		||||
* Automatic reconnection
 | 
			
		||||
 | 
			
		||||
<a name="portable"></a>
 | 
			
		||||
 | 
			
		||||
# Portable
 | 
			
		||||
 | 
			
		||||
Tabby will run as a portable app on Windows, if you create a `data` folder in the same location where `Tabby.exe` lives.
 | 
			
		||||
 | 
			
		||||
<a name="plugins"></a>
 | 
			
		||||
 | 
			
		||||
# Plugins
 | 
			
		||||
 | 
			
		||||
Plugins and themes can be installed directly from the Settings view inside Tabby.
 | 
			
		||||
 | 
			
		||||
  * [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - makes paths and URLs in the terminal clickable
 | 
			
		||||
  * [docker](https://github.com/Eugeny/tabby-docker) - connect to Docker containers
 | 
			
		||||
  * [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
 | 
			
		||||
  * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
 | 
			
		||||
  * [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file
 | 
			
		||||
  * [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
 | 
			
		||||
* [docker](https://github.com/Eugeny/tabby-docker) - connect to Docker containers
 | 
			
		||||
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
 | 
			
		||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
 | 
			
		||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file
 | 
			
		||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
 | 
			
		||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
 | 
			
		||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - allows creating custom workspace profiles based on the given config
 | 
			
		||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
 | 
			
		||||
 | 
			
		||||
<a name="themes"></a>
 | 
			
		||||
 | 
			
		||||
# Themes
 | 
			
		||||
 | 
			
		||||
  * [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme
 | 
			
		||||
  * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Tabby
 | 
			
		||||
  * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
 | 
			
		||||
  * [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
 | 
			
		||||
  * [altair](https://github.com/yxuko/terminus-altair)
 | 
			
		||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme
 | 
			
		||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Tabby
 | 
			
		||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
 | 
			
		||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
 | 
			
		||||
* [altair](https://github.com/yxuko/terminus-altair)
 | 
			
		||||
 | 
			
		||||
# Sponsors <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
[](https://packagecloud.io)
 | 
			
		||||
 | 
			
		||||
[**packagecloud**](https://packagecloud.io) has provided free Debian/RPM repository hosting
 | 
			
		||||
 | 
			
		||||
<a name="contributing"></a>
 | 
			
		||||
# Contributing
 | 
			
		||||
 | 
			
		||||
Pull requests and plugins are welcome!
 | 
			
		||||
 | 
			
		||||
See [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) and [API docs](http://ajenti.org/terminus-docs/) for information of how the project is laid out, and a very brief plugin development tutorial.
 | 
			
		||||
See [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) and [API docs](https://docs.tabby.sh/) for information of how the project is laid out, and a very brief plugin development tutorial.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
<a name="contributors"></a>
 | 
			
		||||
@@ -195,6 +214,47 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 | 
			
		||||
    <td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt=""/><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"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt=""/><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"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><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"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><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"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><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"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><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"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><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"><a href="https://magiclike.codeberg.page"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
@@ -204,5 +264,3 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
 | 
			
		||||
 | 
			
		||||
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
 | 
			
		||||
 | 
			
		||||
<img src="https://ga-beacon.appspot.com/UA-3278102-18/github/readme" width="1"/>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										264
									
								
								README.ru-RU.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								README.ru-RU.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,264 @@
 | 
			
		||||
[](https://tabby.sh)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
  <a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a>   <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a>   <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a>   <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
  <a href="https://ko-fi.com/J3J8KWTF">
 | 
			
		||||
    <img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
 | 
			
		||||
  </a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
### Загрузки:
 | 
			
		||||
 | 
			
		||||
* [Последняя версия](https://github.com/Eugeny/tabby/releases/latest)
 | 
			
		||||
* [Репозитории](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
 | 
			
		||||
* [Последний nightly-билд](https://nightly.link/Eugeny/tabby/workflows/build/master)
 | 
			
		||||
 | 
			
		||||
<br/>
 | 
			
		||||
<p align="center">
 | 
			
		||||
Этот README также доступен на: <a  href="./README.md">:gb: English</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>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux:
 | 
			
		||||
 | 
			
		||||
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
 | 
			
		||||
* Встроенный последовтаельный терминал;
 | 
			
		||||
* Темы и цветовые схемы;
 | 
			
		||||
* Полностью настраеваемые сочетания клавиш;
 | 
			
		||||
* Панели;
 | 
			
		||||
* Запоминание вкладок;
 | 
			
		||||
* Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD;
 | 
			
		||||
* Прямая передача файлов из и в SSH-сессии через Zmodem;
 | 
			
		||||
* Полная поддержка Unicode, включая символы двойной ширины;
 | 
			
		||||
* Не задыхается при быстром выводе;
 | 
			
		||||
* Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink);
 | 
			
		||||
* Втроенное защищённое хранилище для SSH-ключей и настроек;
 | 
			
		||||
* SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)).
 | 
			
		||||
 | 
			
		||||
# Содержание <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
- [Правда и ложь про Tabby](#правда-и-ложь-про-tabby)
 | 
			
		||||
- [Функции терминала](#функции-терминала)
 | 
			
		||||
- [SSH-клиент](#ssh-клиент)
 | 
			
		||||
- [Терминал последовательного порта](#терминал-последовательного-порта)
 | 
			
		||||
- [Портативность](#портативность)
 | 
			
		||||
- [Плагины](#плагины)
 | 
			
		||||
- [Темы](#темы)
 | 
			
		||||
- [Внести свой вклад](#внести-свой-вклад)
 | 
			
		||||
 | 
			
		||||
<a name="about"></a>
 | 
			
		||||
 | 
			
		||||
# Правда и ложь про Tabby
 | 
			
		||||
 | 
			
		||||
* **Правда:** Tabby — это альтернатива стандартному терминалу Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app и iTerm.
 | 
			
		||||
 | 
			
		||||
* **Ложь:** Tabby — это не новая оболочка или замена MinGW или Cygwin. Также он нелёгок — если потребление ОЗУ крайне важно для вас, лучше взгляните на [Conemu](https://conemu.github.io) или [Alacritty](https://github.com/jwilm/alacritty).
 | 
			
		||||
 | 
			
		||||
<a name="terminal"></a>
 | 
			
		||||
 | 
			
		||||
# Функции терминала
 | 
			
		||||
 | 
			
		||||

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

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

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

 | 
			
		||||
 | 
			
		||||
* 带有连接管理器的 SSH2 客户端
 | 
			
		||||
* X11和端口转发
 | 
			
		||||
* 自动跳转主机管理
 | 
			
		||||
* 代理转发(包括 Pageant 和 Windows 原生 OpenSSH 代理)
 | 
			
		||||
* 登录脚本
 | 
			
		||||
 | 
			
		||||
<a name="serial"></a>
 | 
			
		||||
# 串行终端
 | 
			
		||||
 | 
			
		||||
* 保存连接
 | 
			
		||||
* 逐行读取的输入支持
 | 
			
		||||
* 可选的十六进制逐字节输入和十六进制转储输出
 | 
			
		||||
* 换行转换
 | 
			
		||||
* 自动重连
 | 
			
		||||
 | 
			
		||||
<a name="portable"></a>
 | 
			
		||||
# 便携式应用
 | 
			
		||||
 | 
			
		||||
如果在 Tabby.exe 所在的目录创建一个名为`data`文件夹,Tabby 将可以在 Windows 上作为便携式的应用程序运行。
 | 
			
		||||
 | 
			
		||||
<a name="plugins"></a>
 | 
			
		||||
# 插件
 | 
			
		||||
 | 
			
		||||
插件和主题可以直接在 Tabby 设置中安装。
 | 
			
		||||
 | 
			
		||||
* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 使终端中的路径和 URL 可点击
 | 
			
		||||
* [docker](https://github.com/Eugeny/tabby-docker) - 连接 Docker 容器
 | 
			
		||||
* [title-control](https://github.com/kbjr/terminus-title-control) - 允许通过提供要删除的前缀、后缀和/或字符串来修改标签页的标题
 | 
			
		||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 快速向一个或所有标签页发送命令
 | 
			
		||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - 将终端输出记录到文件中
 | 
			
		||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - 将配置同步到 Gist 或 Gitee
 | 
			
		||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - 一个可以一直烦你的示例插件
 | 
			
		||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件
 | 
			
		||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器
 | 
			
		||||
 | 
			
		||||
<a name="themes"></a>
 | 
			
		||||
# 主题
 | 
			
		||||
 | 
			
		||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - 受 Hyper 启发的主题
 | 
			
		||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - 为 Tabby 打造的 Relaxed 主题
 | 
			
		||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
 | 
			
		||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
 | 
			
		||||
* [altair](https://github.com/yxuko/terminus-altair)
 | 
			
		||||
 | 
			
		||||
# Sponsors <!-- omit in toc -->
 | 
			
		||||
 | 
			
		||||
[](https://packagecloud.io)
 | 
			
		||||
 | 
			
		||||
[**packagecloud**](https://packagecloud.io) 提供了免费的 Debian/RPM 存储库托管
 | 
			
		||||
 | 
			
		||||
<a name="contributing"></a>
 | 
			
		||||
# 贡献
 | 
			
		||||
 | 
			
		||||
欢迎提交 PR 和插件!
 | 
			
		||||
 | 
			
		||||
请参阅 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 和 [API 文档](https://docs.tabby.sh/) 以获取有关项目布局的信息以及非常简短的插件开发教程。
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
<a name="contributors"></a>
 | 
			
		||||
 | 
			
		||||
感谢这些人,他们棒极了!([emoji key](https://allcontributors.org/docs/en/emoji-key)):
 | 
			
		||||
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
 | 
			
		||||
<!-- prettier-ignore-start -->
 | 
			
		||||
<!-- markdownlint-disable -->
 | 
			
		||||
<table>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
 | 
			
		||||
    <td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
 | 
			
		||||
    <td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
 | 
			
		||||
    <td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
 | 
			
		||||
    <td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
 | 
			
		||||
    <td align="center"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt=""/><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"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt=""/><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"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><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"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><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"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><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"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><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"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><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"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><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"><a href="https://magiclike.codeberg.page"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<!-- markdownlint-restore -->
 | 
			
		||||
<!-- prettier-ignore-end -->
 | 
			
		||||
 | 
			
		||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
 | 
			
		||||
 | 
			
		||||
本项目遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 规范。 欢迎任何形式的贡献!
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions } from 'electron'
 | 
			
		||||
import * as promiseIpc from 'electron-promise-ipc'
 | 
			
		||||
import promiseIpc from 'electron-promise-ipc'
 | 
			
		||||
import * as remote from '@electron/remote/main'
 | 
			
		||||
import { exec } from 'mz/child_process'
 | 
			
		||||
import * as path from 'path'
 | 
			
		||||
import * as fs from 'fs'
 | 
			
		||||
import { Subject, throttleTime } from 'rxjs'
 | 
			
		||||
@@ -21,6 +22,8 @@ export class Application {
 | 
			
		||||
    private ptyManager = new PTYManager()
 | 
			
		||||
    private windows: Window[] = []
 | 
			
		||||
    private globalHotkey$ = new Subject<void>()
 | 
			
		||||
    private quitRequested = false
 | 
			
		||||
    private configStore: any
 | 
			
		||||
    userPluginsPath: string
 | 
			
		||||
 | 
			
		||||
    constructor () {
 | 
			
		||||
@@ -30,6 +33,7 @@ export class Application {
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('app:config-change', (_event, config) => {
 | 
			
		||||
            this.broadcast('host:config-change', config)
 | 
			
		||||
            this.configStore = config
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('app:register-global-hotkey', (_event, specs) => {
 | 
			
		||||
@@ -51,14 +55,26 @@ export class Application {
 | 
			
		||||
            return pluginManager.uninstall(this.userPluginsPath, name)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        const configData = loadConfig()
 | 
			
		||||
        ;(promiseIpc as any).on('get-default-mac-shell', async () => {
 | 
			
		||||
            try {
 | 
			
		||||
                return (await exec(`/usr/bin/dscl . -read /Users/${process.env.LOGNAME} UserShell`))[0].toString().split(' ')[1].trim()
 | 
			
		||||
            } catch {
 | 
			
		||||
                return '/bin/bash'
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        this.configStore = loadConfig()
 | 
			
		||||
        if (process.platform === 'linux') {
 | 
			
		||||
            app.commandLine.appendSwitch('no-sandbox')
 | 
			
		||||
            if (((configData.appearance || {}).opacity || 1) !== 1) {
 | 
			
		||||
            if (((this.configStore.appearance || {}).opacity || 1) !== 1) {
 | 
			
		||||
                app.commandLine.appendSwitch('enable-transparent-visuals')
 | 
			
		||||
                app.disableHardwareAcceleration()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (this.configStore.hacks?.disableGPU) {
 | 
			
		||||
            app.commandLine.appendSwitch('disable-gpu')
 | 
			
		||||
            app.disableHardwareAcceleration()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.userPluginsPath = path.join(
 | 
			
		||||
            app.getPath('userData'),
 | 
			
		||||
@@ -72,11 +88,20 @@ export class Application {
 | 
			
		||||
        app.commandLine.appendSwitch('disable-http-cache')
 | 
			
		||||
        app.commandLine.appendSwitch('max-active-webgl-contexts', '9000')
 | 
			
		||||
        app.commandLine.appendSwitch('lang', 'EN')
 | 
			
		||||
        app.allowRendererProcessReuse = false
 | 
			
		||||
 | 
			
		||||
        for (const flag of configData.flags || [['force_discrete_gpu', '0']]) {
 | 
			
		||||
        for (const flag of this.configStore.flags || [['force_discrete_gpu', '0']]) {
 | 
			
		||||
            app.commandLine.appendSwitch(flag[0], flag[1])
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        app.on('before-quit', () => {
 | 
			
		||||
            this.quitRequested = true
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        app.on('window-all-closed', () => {
 | 
			
		||||
            if (this.quitRequested || process.platform !== 'darwin') {
 | 
			
		||||
                app.quit()
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    init (): void {
 | 
			
		||||
@@ -88,6 +113,9 @@ export class Application {
 | 
			
		||||
    async newWindow (options?: WindowOptions): Promise<Window> {
 | 
			
		||||
        const window = new Window(this, options)
 | 
			
		||||
        this.windows.push(window)
 | 
			
		||||
        if (this.windows.length === 1){
 | 
			
		||||
            window.makeMain()
 | 
			
		||||
        }
 | 
			
		||||
        window.visible$.subscribe(visible => {
 | 
			
		||||
            if (visible) {
 | 
			
		||||
                this.disableTray()
 | 
			
		||||
@@ -97,6 +125,10 @@ export class Application {
 | 
			
		||||
        })
 | 
			
		||||
        window.closed$.subscribe(() => {
 | 
			
		||||
            this.windows = this.windows.filter(x => x !== window)
 | 
			
		||||
            if (!this.windows.some(x => x.isMainWindow)) {
 | 
			
		||||
                this.windows[0]?.makeMain()
 | 
			
		||||
                this.windows[0]?.present()
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        if (process.platform === 'darwin') {
 | 
			
		||||
            this.setupMenu()
 | 
			
		||||
@@ -106,7 +138,14 @@ export class Application {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onGlobalHotkey (): void {
 | 
			
		||||
        if (this.windows.some(x => x.isFocused() && x.isVisible())) {
 | 
			
		||||
        let isPresent = this.windows.some(x => x.isFocused() && x.isVisible())
 | 
			
		||||
        const isDockedOnTop = this.windows.some(x => x.isDockedOnTop())
 | 
			
		||||
        if (isDockedOnTop) {
 | 
			
		||||
            // if docked and on top, hide even if not focused right now
 | 
			
		||||
            isPresent = this.windows.some(x => x.isVisible())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (isPresent) {
 | 
			
		||||
            for (const window of this.windows) {
 | 
			
		||||
                window.hide()
 | 
			
		||||
            }
 | 
			
		||||
@@ -175,11 +214,14 @@ export class Application {
 | 
			
		||||
 | 
			
		||||
    focus (): void {
 | 
			
		||||
        for (const window of this.windows) {
 | 
			
		||||
            window.show()
 | 
			
		||||
            window.present()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handleSecondInstance (argv: string[], cwd: string): void {
 | 
			
		||||
    async handleSecondInstance (argv: string[], cwd: string): Promise<void> {
 | 
			
		||||
        if (!this.windows.length) {
 | 
			
		||||
            await this.newWindow()
 | 
			
		||||
        }
 | 
			
		||||
        this.presentAllWindows()
 | 
			
		||||
        this.windows[this.windows.length - 1].passCliArguments(argv, cwd, true)
 | 
			
		||||
    }
 | 
			
		||||
@@ -221,7 +263,8 @@ export class Application {
 | 
			
		||||
                    {
 | 
			
		||||
                        label: 'Quit',
 | 
			
		||||
                        accelerator: 'Cmd+Q',
 | 
			
		||||
                        click () {
 | 
			
		||||
                        click: () => {
 | 
			
		||||
                            this.quitRequested = true
 | 
			
		||||
                            app.quit()
 | 
			
		||||
                        },
 | 
			
		||||
                    },
 | 
			
		||||
@@ -244,7 +287,6 @@ export class Application {
 | 
			
		||||
            {
 | 
			
		||||
                label: 'View',
 | 
			
		||||
                submenu: [
 | 
			
		||||
                    { role: 'reload' },
 | 
			
		||||
                    { role: 'toggleDevTools' },
 | 
			
		||||
                    { type: 'separator' },
 | 
			
		||||
                    { role: 'togglefullscreen' },
 | 
			
		||||
@@ -272,6 +314,10 @@ export class Application {
 | 
			
		||||
            },
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        if (process.env.TABBY_DEV) {
 | 
			
		||||
            template[2].submenu['unshift']({ role: 'reload' })
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Menu.setApplicationMenu(Menu.buildFromTemplate(template))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,10 @@ export function parseArgs (argv: string[], cwd: string): any {
 | 
			
		||||
                type: 'string',
 | 
			
		||||
            })
 | 
			
		||||
        })
 | 
			
		||||
        .version('version', '', app.getVersion())
 | 
			
		||||
        .command('recent [index]', 'open a tab with a recent profile', {
 | 
			
		||||
            profileNumber: { type: 'number' },
 | 
			
		||||
        })
 | 
			
		||||
        .version(app.getVersion())
 | 
			
		||||
        .option('debug', {
 | 
			
		||||
            alias: 'd',
 | 
			
		||||
            describe: 'Show DevTools on start',
 | 
			
		||||
@@ -35,11 +38,6 @@ export function parseArgs (argv: string[], cwd: string): any {
 | 
			
		||||
            describe: 'Start minimized',
 | 
			
		||||
            type: 'boolean',
 | 
			
		||||
        })
 | 
			
		||||
        .option('version', {
 | 
			
		||||
            alias: 'v',
 | 
			
		||||
            describe: 'Show version and exit',
 | 
			
		||||
            type: 'boolean',
 | 
			
		||||
        })
 | 
			
		||||
        .help('help')
 | 
			
		||||
        .parse()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,12 +26,6 @@ app.on('activate', () => {
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
app.on('window-all-closed', () => {
 | 
			
		||||
    if (process.platform !== 'darwin') {
 | 
			
		||||
        app.quit()
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
process.on('uncaughtException' as any, err => {
 | 
			
		||||
    console.log(err)
 | 
			
		||||
    application.broadcast('uncaughtException', err)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import * as LRU from 'lru-cache'
 | 
			
		||||
import LRU from 'lru-cache'
 | 
			
		||||
import * as fs from 'fs'
 | 
			
		||||
const lru = new LRU({ max: 256, maxAge: 250 })
 | 
			
		||||
const origLstat = fs.realpathSync.bind(fs)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,28 @@
 | 
			
		||||
import * as nodePTY from '@tabby-gang/node-pty'
 | 
			
		||||
import { StringDecoder } from './stringDecoder'
 | 
			
		||||
import { v4 as uuidv4 } from 'uuid'
 | 
			
		||||
import { ipcMain } from 'electron'
 | 
			
		||||
import { Application } from './app'
 | 
			
		||||
import { UTF8Splitter } from './utfSplitter'
 | 
			
		||||
import { Subject, debounceTime } from 'rxjs'
 | 
			
		||||
import { StringDecoder } from './stringDecoder'
 | 
			
		||||
 | 
			
		||||
class PTYDataQueue {
 | 
			
		||||
    private buffers: Buffer[] = []
 | 
			
		||||
    private delta = 0
 | 
			
		||||
    private maxChunk = 1024
 | 
			
		||||
    private maxDelta = 1024 * 50
 | 
			
		||||
    private maxChunk = 1024 * 100
 | 
			
		||||
    private maxDelta = this.maxChunk * 5
 | 
			
		||||
    private flowPaused = false
 | 
			
		||||
    private decoder = new StringDecoder()
 | 
			
		||||
    private decoder = new UTF8Splitter()
 | 
			
		||||
    private output$ = new Subject<Buffer>()
 | 
			
		||||
 | 
			
		||||
    constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) { }
 | 
			
		||||
    constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) {
 | 
			
		||||
        this.output$.pipe(debounceTime(500)).subscribe(() => {
 | 
			
		||||
            const remainder = this.decoder.flush()
 | 
			
		||||
            if (remainder.length) {
 | 
			
		||||
                this.onData(remainder)
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    push (data: Buffer) {
 | 
			
		||||
        this.buffers.push(data)
 | 
			
		||||
@@ -61,7 +71,9 @@ class PTYDataQueue {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private emitData (data: Buffer) {
 | 
			
		||||
        this.onData(this.decoder.write(data))
 | 
			
		||||
        const validChunk = this.decoder.write(data)
 | 
			
		||||
        this.onData(validChunk)
 | 
			
		||||
        this.output$.next(validChunk)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private pause () {
 | 
			
		||||
@@ -79,6 +91,8 @@ class PTYDataQueue {
 | 
			
		||||
export class PTY {
 | 
			
		||||
    private pty: nodePTY.IPty
 | 
			
		||||
    private outputQueue: PTYDataQueue
 | 
			
		||||
    private decoder = new StringDecoder()
 | 
			
		||||
    exited = false
 | 
			
		||||
 | 
			
		||||
    constructor (private id: string, private app: Application, ...args: any[]) {
 | 
			
		||||
        this.pty = (nodePTY as any).spawn(...args)
 | 
			
		||||
@@ -87,10 +101,13 @@ export class PTY {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.outputQueue = new PTYDataQueue(this.pty, data => {
 | 
			
		||||
            setImmediate(() => this.emit('data', data))
 | 
			
		||||
            setImmediate(() => this.emit('data', this.decoder.write(data)))
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        this.pty.on('data', data => this.outputQueue.push(Buffer.from(data)))
 | 
			
		||||
        this.pty.onData(data => this.outputQueue.push(Buffer.from(data)))
 | 
			
		||||
        this.pty.onExit(() => {
 | 
			
		||||
            this.exited = true
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getPID (): number {
 | 
			
		||||
@@ -133,7 +150,7 @@ export class PTYManager {
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('pty:exists', (event, id) => {
 | 
			
		||||
            event.returnValue = !!this.ptys[id]
 | 
			
		||||
            event.returnValue = this.ptys[id] && !this.ptys[id].exited
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('pty:get-pid', (event, id) => {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								app/lib/utfSplitter.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/lib/utfSplitter.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
const partials = [
 | 
			
		||||
    [0b110, 5, 0],
 | 
			
		||||
    [0b1110, 4, 1],
 | 
			
		||||
    [0b11110, 3, 2],
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export class UTF8Splitter {
 | 
			
		||||
    private internal = Buffer.alloc(0)
 | 
			
		||||
 | 
			
		||||
    write (data: Buffer): Buffer {
 | 
			
		||||
        this.internal = Buffer.concat([this.internal, data])
 | 
			
		||||
 | 
			
		||||
        let keep = 0
 | 
			
		||||
        for (const [pattern, shift, maxOffset] of partials) {
 | 
			
		||||
            for (let offset = 0; offset < maxOffset + 1; offset++) {
 | 
			
		||||
                if (this.internal[this.internal.length - offset - 1] >> shift === pattern) {
 | 
			
		||||
                    keep = Math.max(keep, offset + 1)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const result = this.internal.slice(0, this.internal.length - keep)
 | 
			
		||||
        this.internal = this.internal.slice(this.internal.length - keep)
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flush (): Buffer {
 | 
			
		||||
        const result = this.internal
 | 
			
		||||
        this.internal = Buffer.alloc(0)
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,10 +3,11 @@ import * as glasstron from 'glasstron'
 | 
			
		||||
import { Subject, Observable, debounceTime } from 'rxjs'
 | 
			
		||||
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage } from 'electron'
 | 
			
		||||
import ElectronConfig = require('electron-config')
 | 
			
		||||
import { enable as enableRemote } from '@electron/remote/main'
 | 
			
		||||
import * as os from 'os'
 | 
			
		||||
import * as path from 'path'
 | 
			
		||||
import macOSRelease from 'macos-release'
 | 
			
		||||
import * as compareVersions from 'compare-versions'
 | 
			
		||||
import { compare as compareVersions } from 'compare-versions'
 | 
			
		||||
 | 
			
		||||
import type { Application } from './app'
 | 
			
		||||
import { parseArgs } from './cli'
 | 
			
		||||
@@ -14,7 +15,7 @@ import { loadConfig } from './config'
 | 
			
		||||
 | 
			
		||||
let DwmEnableBlurBehindWindow: any = null
 | 
			
		||||
if (process.platform === 'win32') {
 | 
			
		||||
    DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow
 | 
			
		||||
    DwmEnableBlurBehindWindow = require('@tabby-gang/windows-blurbehind').DwmEnableBlurBehindWindow
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface WindowOptions {
 | 
			
		||||
@@ -26,12 +27,13 @@ abstract class GlasstronWindow extends BrowserWindow {
 | 
			
		||||
    abstract setBlur (_: boolean)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions.compare(macOSRelease().version, '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null
 | 
			
		||||
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions(macOSRelease().version, '10.14', '>=') ? 'under-window' : 'dark' : null
 | 
			
		||||
 | 
			
		||||
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
 | 
			
		||||
 | 
			
		||||
export class Window {
 | 
			
		||||
    ready: Promise<void>
 | 
			
		||||
    isMainWindow = false
 | 
			
		||||
    private visible = new Subject<boolean>()
 | 
			
		||||
    private closed = new Subject<void>()
 | 
			
		||||
    private window?: GlasstronWindow
 | 
			
		||||
@@ -42,6 +44,8 @@ export class Window {
 | 
			
		||||
    private disableVibrancyWhileDragging = false
 | 
			
		||||
    private configStore: any
 | 
			
		||||
    private touchBarControl: any
 | 
			
		||||
    private isFluentVibrancy = false
 | 
			
		||||
    private dockHidden = false
 | 
			
		||||
 | 
			
		||||
    get visible$ (): Observable<boolean> { return this.visible }
 | 
			
		||||
    get closed$ (): Observable<void> { return this.closed }
 | 
			
		||||
@@ -65,7 +69,6 @@ export class Window {
 | 
			
		||||
                nodeIntegration: true,
 | 
			
		||||
                preload: path.join(__dirname, 'sentry.js'),
 | 
			
		||||
                backgroundThrottling: false,
 | 
			
		||||
                enableRemoteModule: true,
 | 
			
		||||
                contextIsolation: false,
 | 
			
		||||
            },
 | 
			
		||||
            maximizable: true,
 | 
			
		||||
@@ -116,6 +119,7 @@ export class Window {
 | 
			
		||||
                }
 | 
			
		||||
                this.window.focus()
 | 
			
		||||
                this.window.moveTop()
 | 
			
		||||
                application.focus()
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
@@ -125,10 +129,14 @@ export class Window {
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        enableRemote(this.window.webContents)
 | 
			
		||||
 | 
			
		||||
        this.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' })
 | 
			
		||||
 | 
			
		||||
        this.window.webContents.setVisualZoomLevelLimits(1, 1)
 | 
			
		||||
        this.window.webContents.setZoomFactor(1)
 | 
			
		||||
        this.window.webContents.session.setPermissionCheckHandler(() => true)
 | 
			
		||||
        this.window.webContents.session.setDevicePermissionHandler(() => true)
 | 
			
		||||
 | 
			
		||||
        if (process.platform === 'darwin') {
 | 
			
		||||
            this.touchBarControl = new TouchBar.TouchBarSegmentedControl({
 | 
			
		||||
@@ -155,6 +163,11 @@ export class Window {
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    makeMain (): void {
 | 
			
		||||
        this.isMainWindow = true
 | 
			
		||||
        this.window.webContents.send('host:became-main-window')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setVibrancy (enabled: boolean, type?: string, userRequested?: boolean): void {
 | 
			
		||||
        if (userRequested ?? true) {
 | 
			
		||||
            this.lastVibrancy = { enabled, type }
 | 
			
		||||
@@ -164,11 +177,12 @@ export class Window {
 | 
			
		||||
                this.window.blurType = enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null
 | 
			
		||||
                try {
 | 
			
		||||
                    this.window.setBlur(enabled)
 | 
			
		||||
                    this.isFluentVibrancy = enabled && type === 'fluent'
 | 
			
		||||
                } catch (error) {
 | 
			
		||||
                    console.error('Failed to set window blur', error)
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                DwmEnableBlurBehindWindow(this.window, enabled)
 | 
			
		||||
                DwmEnableBlurBehindWindow(this.window.getNativeWindowHandle(), enabled)
 | 
			
		||||
            }
 | 
			
		||||
        } else if (process.platform === 'linux') {
 | 
			
		||||
            this.window.setBackgroundColor(enabled ? '#00000000' : '#131d27')
 | 
			
		||||
@@ -178,11 +192,6 @@ export class Window {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    show (): void {
 | 
			
		||||
        this.window.show()
 | 
			
		||||
        this.window.moveTop()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    focus (): void {
 | 
			
		||||
        this.window.focus()
 | 
			
		||||
    }
 | 
			
		||||
@@ -194,6 +203,7 @@ export class Window {
 | 
			
		||||
        this.window.webContents.send(event, ...args)
 | 
			
		||||
        if (event === 'host:config-change') {
 | 
			
		||||
            this.configStore = args[0]
 | 
			
		||||
            this.enableDockedWindowStyles(this.isDockedOnTop())
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -209,45 +219,69 @@ export class Window {
 | 
			
		||||
        return this.window.isVisible()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hide (): void {
 | 
			
		||||
    isDockedOnTop (): boolean {
 | 
			
		||||
        return this.isMainWindow && this.configStore.appearance?.dock && this.configStore.appearance?.dock !== 'off' && (this.configStore.appearance?.dockAlwaysOnTop ?? true)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async hide (): Promise<void> {
 | 
			
		||||
        if (process.platform === 'darwin') {
 | 
			
		||||
            // Lose focus
 | 
			
		||||
            Menu.sendActionToFirstResponder('hide:')
 | 
			
		||||
        }
 | 
			
		||||
        this.window.blur()
 | 
			
		||||
        if (process.platform !== 'darwin') {
 | 
			
		||||
            this.window.hide()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    present (): void {
 | 
			
		||||
        if (!this.window.isVisible()) {
 | 
			
		||||
            // unfocused, invisible
 | 
			
		||||
            this.window.show()
 | 
			
		||||
            this.window.focus()
 | 
			
		||||
        } else {
 | 
			
		||||
            if (!this.configStore.appearance?.dock || this.configStore.appearance?.dock === 'off') {
 | 
			
		||||
                // not docked, visible
 | 
			
		||||
                setTimeout(() => {
 | 
			
		||||
                    this.window.show()
 | 
			
		||||
                    this.window.focus()
 | 
			
		||||
                })
 | 
			
		||||
            } else {
 | 
			
		||||
                if (this.configStore.appearance?.dockAlwaysOnTop) {
 | 
			
		||||
                    // docked, visible, on top
 | 
			
		||||
                    this.window.hide()
 | 
			
		||||
                } else {
 | 
			
		||||
                    // docked, visible, not on top
 | 
			
		||||
                    this.window.focus()
 | 
			
		||||
                }
 | 
			
		||||
            if (this.isDockedOnTop()) {
 | 
			
		||||
                await this.enableDockedWindowStyles(false)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.window.blur()
 | 
			
		||||
        this.window.hide()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async show (): Promise<void> {
 | 
			
		||||
        await this.enableDockedWindowStyles(this.isDockedOnTop())
 | 
			
		||||
        this.window.show()
 | 
			
		||||
        this.window.focus()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async present (): Promise<void> {
 | 
			
		||||
        await this.show()
 | 
			
		||||
        this.window.moveTop()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    passCliArguments (argv: string[], cwd: string, secondInstance: boolean): void {
 | 
			
		||||
        this.send('cli', parseArgs(argv, cwd), cwd, secondInstance)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private async enableDockedWindowStyles (enabled: boolean) {
 | 
			
		||||
        if (process.platform === 'darwin') {
 | 
			
		||||
            if (enabled) {
 | 
			
		||||
                if (!this.dockHidden) {
 | 
			
		||||
                    app.dock.hide()
 | 
			
		||||
                    this.dockHidden = true
 | 
			
		||||
                }
 | 
			
		||||
                this.window.setAlwaysOnTop(true, 'screen-saver', 1)
 | 
			
		||||
                if (!this.window.isVisibleOnAllWorkspaces()) {
 | 
			
		||||
                    this.window.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true })
 | 
			
		||||
                }
 | 
			
		||||
                if (this.window.fullScreenable) {
 | 
			
		||||
                    this.window.setFullScreenable(false)
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                if (this.dockHidden) {
 | 
			
		||||
                    await app.dock.show()
 | 
			
		||||
                    this.dockHidden = false
 | 
			
		||||
                }
 | 
			
		||||
                if (this.window.isAlwaysOnTop()) {
 | 
			
		||||
                    this.window.setAlwaysOnTop(false)
 | 
			
		||||
                }
 | 
			
		||||
                if (this.window.isVisibleOnAllWorkspaces()) {
 | 
			
		||||
                    this.window.setVisibleOnAllWorkspaces(false)
 | 
			
		||||
                }
 | 
			
		||||
                if (!this.window.fullScreenable) {
 | 
			
		||||
                    this.window.setFullScreenable(true)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private setupWindowManagement () {
 | 
			
		||||
        this.window.on('show', () => {
 | 
			
		||||
            this.visible.next(true)
 | 
			
		||||
@@ -271,6 +305,9 @@ export class Window {
 | 
			
		||||
        this.window.on('enter-full-screen', () => this.send('host:window-enter-full-screen'))
 | 
			
		||||
        this.window.on('leave-full-screen', () => this.send('host:window-leave-full-screen'))
 | 
			
		||||
 | 
			
		||||
        this.window.on('maximize', () => this.send('host:window-maximized'))
 | 
			
		||||
        this.window.on('unmaximize', () => this.send('host:window-unmaximized'))
 | 
			
		||||
 | 
			
		||||
        this.window.on('close', event => {
 | 
			
		||||
            if (!this.closing) {
 | 
			
		||||
                event.preventDefault()
 | 
			
		||||
@@ -309,7 +346,7 @@ export class Window {
 | 
			
		||||
                config: this.configStore,
 | 
			
		||||
                executable: app.getPath('exe'),
 | 
			
		||||
                windowID: this.window.id,
 | 
			
		||||
                isFirstWindow: this.window.id === 1,
 | 
			
		||||
                isMainWindow: this.isMainWindow,
 | 
			
		||||
                userPluginsPath: this.application.userPluginsPath,
 | 
			
		||||
            })
 | 
			
		||||
        })
 | 
			
		||||
@@ -356,8 +393,7 @@ export class Window {
 | 
			
		||||
            if (this.window.isMinimized()) {
 | 
			
		||||
                this.window.restore()
 | 
			
		||||
            }
 | 
			
		||||
            this.window.show()
 | 
			
		||||
            this.window.moveTop()
 | 
			
		||||
            this.present()
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('window-close', event => {
 | 
			
		||||
@@ -379,12 +415,12 @@ export class Window {
 | 
			
		||||
        this.window.webContents.on('new-window', event => event.preventDefault())
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('window-set-disable-vibrancy-while-dragging', (_event, value) => {
 | 
			
		||||
            this.disableVibrancyWhileDragging = value
 | 
			
		||||
            this.disableVibrancyWhileDragging = value && this.configStore.hacks?.disableVibrancyWhileDragging
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        let moveEndedTimeout: any = null
 | 
			
		||||
        const onBoundsChange = () => {
 | 
			
		||||
            if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging) {
 | 
			
		||||
            if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging || !this.isFluentVibrancy) {
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            this.setVibrancy(false, undefined, false)
 | 
			
		||||
@@ -397,6 +433,18 @@ export class Window {
 | 
			
		||||
        }
 | 
			
		||||
        this.window.on('move', onBoundsChange)
 | 
			
		||||
        this.window.on('resize', onBoundsChange)
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('window-set-traffic-light-position', (_event, x, y) => {
 | 
			
		||||
            this.window.setTrafficLightPosition({ x, y })
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('window-set-opacity', (_event, opacity) => {
 | 
			
		||||
            this.window.setOpacity(opacity)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ipcMain.on('window-set-progress-bar', (_event, value) => {
 | 
			
		||||
            this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private destroy () {
 | 
			
		||||
 
 | 
			
		||||
@@ -8,43 +8,45 @@
 | 
			
		||||
    "email": "e@ajenti.org"
 | 
			
		||||
  },
 | 
			
		||||
  "main": "dist/main.js",
 | 
			
		||||
  "version": "1.0.0-alpha.1",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "postinstall": "patch-package",
 | 
			
		||||
    "build": "webpack --progress --color --display-modules",
 | 
			
		||||
    "watch": "webpack --progress --color --watch"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@angular/cdk": "^12.2.0",
 | 
			
		||||
    "@electron/remote": "1.2.0",
 | 
			
		||||
    "@electron/remote": "2.0.8",
 | 
			
		||||
    "@tabby-gang/node-pty": "^0.11.0-beta.200",
 | 
			
		||||
    "any-promise": "^1.3.0",
 | 
			
		||||
    "electron-config": "2.0.0",
 | 
			
		||||
    "electron-debug": "^3.2.0",
 | 
			
		||||
    "electron-promise-ipc": "^2.2.4",
 | 
			
		||||
    "electron-updater": "^5.0.1",
 | 
			
		||||
    "fontmanager-redux": "1.1.0",
 | 
			
		||||
    "glasstron": "0.0.7",
 | 
			
		||||
    "glasstron": "0.1.1",
 | 
			
		||||
    "js-yaml": "4.1.0",
 | 
			
		||||
    "keytar": "^7.7.0",
 | 
			
		||||
    "keytar": "^7.9.0",
 | 
			
		||||
    "mz": "^2.7.0",
 | 
			
		||||
    "native-process-working-directory": "^1.0.2",
 | 
			
		||||
    "@tabby-gang/node-pty": "^0.11.0-beta.200",
 | 
			
		||||
    "npm": "6",
 | 
			
		||||
    "rxjs": "^7.2.0",
 | 
			
		||||
    "source-map-support": "^0.5.19",
 | 
			
		||||
    "rxjs": "^7.5.5",
 | 
			
		||||
    "source-map-support": "^0.5.20",
 | 
			
		||||
    "v8-compile-cache": "^2.3.0",
 | 
			
		||||
    "yargs": "^17.1.0"
 | 
			
		||||
    "yargs": "^17.3.1"
 | 
			
		||||
  },
 | 
			
		||||
  "optionalDependencies": {
 | 
			
		||||
    "macos-native-processlist": "^2.0.0",
 | 
			
		||||
    "serialport": "^9.2.0",
 | 
			
		||||
    "windows-blurbehind": "^1.0.1",
 | 
			
		||||
    "windows-native-registry": "^3.1.0",
 | 
			
		||||
    "windows-process-tree": "^0.3.0"
 | 
			
		||||
    "@tabby-gang/windows-blurbehind": "^3.0.0",
 | 
			
		||||
    "macos-native-processlist": "^2.1.0",
 | 
			
		||||
    "serialport": "10.4.0",
 | 
			
		||||
    "serialport-binding-webserialapi": "^1.0.3",
 | 
			
		||||
    "windows-native-registry": "^3.2.1",
 | 
			
		||||
    "windows-process-tree": "^0.3.3"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/mz": "2.7.4",
 | 
			
		||||
    "@types/node": "16.0.1",
 | 
			
		||||
    "ngx-filesize": "^2.0.16",
 | 
			
		||||
    "node-abi": "^2.30.0"
 | 
			
		||||
    "patch-package": "^6.4.7"
 | 
			
		||||
  },
 | 
			
		||||
  "peerDependencies": {
 | 
			
		||||
    "tabby-community-color-schemes": "*",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
body {
 | 
			
		||||
    min-height: 100vh;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
    background: #1D272D;
 | 
			
		||||
    background: transparent !important;
 | 
			
		||||
    -webkit-font-smoothing: antialiased;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.modal-dialog, .modal-backdrop, .no-drag {
 | 
			
		||||
@@ -16,13 +17,17 @@ body {
 | 
			
		||||
    display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.btn {
 | 
			
		||||
    display: inline-flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    flex-wrap: nowrap;
 | 
			
		||||
a, button {
 | 
			
		||||
    &.btn {
 | 
			
		||||
        display: inline-flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        flex-wrap: nowrap;
 | 
			
		||||
 | 
			
		||||
    & > svg {
 | 
			
		||||
        pointer-events: none;
 | 
			
		||||
        & > svg {
 | 
			
		||||
            pointer-events: none;
 | 
			
		||||
            width: 16px;
 | 
			
		||||
            height: 16px;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -163,6 +168,10 @@ ngb-typeahead-window {
 | 
			
		||||
    margin: -7px 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.content-box {
 | 
			
		||||
    max-width: 600px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Windows high contrast mode
 | 
			
		||||
@media screen and (forced-colors: active) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								app/src/pluginBlacklist.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/pluginBlacklist.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
export const PLUGIN_BLACKLIST = [
 | 
			
		||||
    'terminus-shell-selector', // superseded by profiles
 | 
			
		||||
    'terminus-scrollbar', // now useless
 | 
			
		||||
    'terminus-clickable-links', // now bundled with Tabby
 | 
			
		||||
    'tabby-clickable-links', // now bundled with Tabby
 | 
			
		||||
    'terminus-clickable-ips', // broken, functionality now bundled with Tabby
 | 
			
		||||
]
 | 
			
		||||
@@ -2,6 +2,7 @@ import * as fs from 'mz/fs'
 | 
			
		||||
import * as path from 'path'
 | 
			
		||||
import * as remote from '@electron/remote'
 | 
			
		||||
import { PluginInfo } from '../../tabby-core/src/api/mainProcess'
 | 
			
		||||
import { PLUGIN_BLACKLIST } from './pluginBlacklist'
 | 
			
		||||
 | 
			
		||||
const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires
 | 
			
		||||
 | 
			
		||||
@@ -20,6 +21,8 @@ const builtinPluginsPath = process.env.TABBY_DEV ? path.dirname(remote.app.getAp
 | 
			
		||||
 | 
			
		||||
const cachedBuiltinModules = {
 | 
			
		||||
    '@angular/animations': require('@angular/animations'),
 | 
			
		||||
    '@angular/cdk/drag-drop': require('@angular/cdk/drag-drop'),
 | 
			
		||||
    '@angular/cdk/clipboard': require('@angular/cdk/clipboard'),
 | 
			
		||||
    '@angular/common': require('@angular/common'),
 | 
			
		||||
    '@angular/compiler': require('@angular/compiler'),
 | 
			
		||||
    '@angular/core': require('@angular/core'),
 | 
			
		||||
@@ -63,18 +66,23 @@ export type ProgressCallback = (current: number, total: number) => void
 | 
			
		||||
export function initModuleLookup (userPluginsPath: string): void {
 | 
			
		||||
    global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x)))
 | 
			
		||||
 | 
			
		||||
    nodeModule.globalPaths.unshift(path.join(userPluginsPath, 'node_modules'))
 | 
			
		||||
    const paths = []
 | 
			
		||||
    paths.unshift(path.join(userPluginsPath, 'node_modules'))
 | 
			
		||||
    paths.unshift(path.join(remote.app.getAppPath(), 'node_modules'))
 | 
			
		||||
 | 
			
		||||
    if (process.env.TABBY_DEV) {
 | 
			
		||||
        nodeModule.globalPaths.unshift(path.dirname(remote.app.getAppPath()))
 | 
			
		||||
        paths.unshift(path.dirname(remote.app.getAppPath()))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nodeModule.globalPaths.unshift(builtinPluginsPath)
 | 
			
		||||
    // nodeModule.globalPaths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules'))
 | 
			
		||||
    paths.unshift(builtinPluginsPath)
 | 
			
		||||
    // paths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules'))
 | 
			
		||||
    if (process.env.TABBY_PLUGINS) {
 | 
			
		||||
        process.env.TABBY_PLUGINS.split(':').map(x => nodeModule.globalPaths.push(normalizePath(x)))
 | 
			
		||||
        process.env.TABBY_PLUGINS.split(':').map(x => paths.push(normalizePath(x)))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process.env.NODE_PATH += path.delimiter + paths.join(path.delimiter)
 | 
			
		||||
    nodeModule._initPaths()
 | 
			
		||||
 | 
			
		||||
    builtinModules.forEach(m => {
 | 
			
		||||
        if (!cachedBuiltinModules[m]) {
 | 
			
		||||
            cachedBuiltinModules[m] = nodeRequire(m)
 | 
			
		||||
@@ -109,7 +117,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
        for (const packageName of pluginNames) {
 | 
			
		||||
            if (packageName.startsWith(PREFIX) || packageName.startsWith(LEGACY_PREFIX)) {
 | 
			
		||||
            if ((packageName.startsWith(PREFIX) || packageName.startsWith(LEGACY_PREFIX)) && !PLUGIN_BLACKLIST.includes(packageName)) {
 | 
			
		||||
                candidateLocations.push({ pluginDir, packageName })
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,7 @@
 | 
			
		||||
app-root {
 | 
			
		||||
  background: #1D272D;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.preload-logo {
 | 
			
		||||
  -webkit-app-region: drag;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
@@ -7,7 +11,8 @@
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  animation: 0.5s ease-out fadeIn;
 | 
			
		||||
  background: radial-gradient(#3a66820a 0%,  #000e17 30%, black 100%);
 | 
			
		||||
  background-image: radial-gradient(#3a66820a 0%,  #000e17 30%, black 100%);
 | 
			
		||||
  background-color: black;
 | 
			
		||||
 | 
			
		||||
  &>div {
 | 
			
		||||
    width: 200px;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
        "declaration": false,
 | 
			
		||||
        "noImplicitAny": false,
 | 
			
		||||
        "removeComments": false,
 | 
			
		||||
        "esModuleInterop": true,
 | 
			
		||||
        "emitDecoratorMetadata": true,
 | 
			
		||||
        "experimentalDecorators": true,
 | 
			
		||||
        "sourceMap": true,
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,13 @@
 | 
			
		||||
        "baseUrl": "./lib",
 | 
			
		||||
        "module": "commonjs",
 | 
			
		||||
        "target": "es2017",
 | 
			
		||||
        "moduleResolution": "node",
 | 
			
		||||
        "declaration": false,
 | 
			
		||||
        "noImplicitAny": false,
 | 
			
		||||
        "removeComments": false,
 | 
			
		||||
        "emitDecoratorMetadata": true,
 | 
			
		||||
        "experimentalDecorators": true,
 | 
			
		||||
        "esModuleInterop": true,
 | 
			
		||||
        "sourceMap": true,
 | 
			
		||||
        "noUnusedParameters": true,
 | 
			
		||||
        "noImplicitReturns": true,
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ module.exports = {
 | 
			
		||||
        'source-map-support': 'commonjs source-map-support',
 | 
			
		||||
        'windows-swca': 'commonjs windows-swca',
 | 
			
		||||
        'windows-native-registry': 'commonjs windows-native-registry',
 | 
			
		||||
        'windows-blurbehind': 'commonjs windows-blurbehind',
 | 
			
		||||
        '@tabby-gang/windows-blurbehind': 'commonjs @tabby-gang/windows-blurbehind',
 | 
			
		||||
        'yargs/yargs': 'commonjs yargs/yargs',
 | 
			
		||||
    },
 | 
			
		||||
    plugins: [
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										751
									
								
								app/yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										751
									
								
								app/yarn.lock
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -35,20 +35,23 @@ extraResources:
 | 
			
		||||
asarUnpack:
 | 
			
		||||
- 'dist/*.map'
 | 
			
		||||
publish:
 | 
			
		||||
- provider: s3
 | 
			
		||||
  bucket: tabby-updates
 | 
			
		||||
  path: 'updates-${channel}-${env.ARCH}'
 | 
			
		||||
- provider: github
 | 
			
		||||
 | 
			
		||||
win:
 | 
			
		||||
  icon: "./build/windows/icon.ico"
 | 
			
		||||
  artifactName: tabby-${version}-portable.${ext}
 | 
			
		||||
  rfc3161TimeStampServer: http://sha256timestamp.ws.symantec.com/sha256/timestamp
 | 
			
		||||
  artifactName: tabby-${version}-portable-${env.ARCH}.${ext}
 | 
			
		||||
  rfc3161TimeStampServer: http://timestamp.sectigo.com
 | 
			
		||||
nsis:
 | 
			
		||||
  oneClick: false
 | 
			
		||||
  artifactName: tabby-${version}-setup.${ext}
 | 
			
		||||
  artifactName: tabby-${version}-setup-${env.ARCH}.${ext}
 | 
			
		||||
  installerIcon: "./build/windows/icon.ico"
 | 
			
		||||
  allowToChangeInstallationDirectory: true
 | 
			
		||||
 | 
			
		||||
  shortcutName: Tabby Terminal
 | 
			
		||||
mac:
 | 
			
		||||
  category: public.app-category.video
 | 
			
		||||
  category: public.app-category.utilities
 | 
			
		||||
  icon: "./build/mac/icon.icns"
 | 
			
		||||
  artifactName: tabby-${version}-macos-${env.ARCH}.${ext}
 | 
			
		||||
  hardenedRuntime: true
 | 
			
		||||
@@ -66,9 +69,9 @@ mac:
 | 
			
		||||
    NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
 | 
			
		||||
 | 
			
		||||
linux:
 | 
			
		||||
  category: Utility
 | 
			
		||||
  category: "Utility;TerminalEmulator;System"
 | 
			
		||||
  icon: "./build/icons"
 | 
			
		||||
  artifactName: tabby-${version}-linux.${ext}
 | 
			
		||||
  artifactName: tabby-${version}-linux-${env.ARCH}.${ext}
 | 
			
		||||
  executableArgs:
 | 
			
		||||
  - "--no-sandbox"
 | 
			
		||||
  desktop:
 | 
			
		||||
@@ -85,7 +88,6 @@ deb:
 | 
			
		||||
  - gnome-keyring
 | 
			
		||||
  - libnotify4
 | 
			
		||||
  - libsecret-1-0
 | 
			
		||||
  - libappindicator1
 | 
			
		||||
  - libxtst6
 | 
			
		||||
  - libnss3
 | 
			
		||||
  afterInstall: build/linux/after-install.tpl
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								extras/UAC.exe
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								extras/UAC.exe
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										10
									
								
								firebase.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								firebase.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
{
 | 
			
		||||
  "hosting": {
 | 
			
		||||
    "public": "docs/api",
 | 
			
		||||
    "ignore": [
 | 
			
		||||
      "firebase.json",
 | 
			
		||||
      "**/.*",
 | 
			
		||||
      "**/node_modules/**"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								locale/STOP.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								locale/STOP.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
Do not submit pull requests for translations.
 | 
			
		||||
 | 
			
		||||
Translations are managed at https://crowdin.com/project/tabby
 | 
			
		||||
							
								
								
									
										2219
									
								
								locale/app.pot
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2219
									
								
								locale/app.pot
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/bg-BG.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/bg-BG.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/da-DK.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/da-DK.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/de-DE.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/de-DE.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5
									
								
								locale/en-US.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								locale/en-US.po
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
msgid "id.port-forwarding.dynamic"
 | 
			
		||||
msgstr "Dynamic"
 | 
			
		||||
 | 
			
		||||
msgid "id.tab-width.dynamic"
 | 
			
		||||
msgstr "Dynamic"
 | 
			
		||||
							
								
								
									
										2230
									
								
								locale/es-ES.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/es-ES.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/fr-FR.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/fr-FR.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/hr-HR.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/hr-HR.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/it-IT.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/it-IT.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/ja-JP.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/ja-JP.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/ko-KR.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/ko-KR.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/pl-PL.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/pl-PL.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/pt-BR.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/pt-BR.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/pt-PT.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/pt-PT.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/ru-RU.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/ru-RU.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/zh-CN.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/zh-CN.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2230
									
								
								locale/zh-TW.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2230
									
								
								locale/zh-TW.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										101
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								package.json
									
									
									
									
									
								
							@@ -1,85 +1,96 @@
 | 
			
		||||
{
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@angular/animations": "^12.0.0",
 | 
			
		||||
    "@angular/cdk": "^12.2.9",
 | 
			
		||||
    "@angular/common": "^12.0.0",
 | 
			
		||||
    "@angular/compiler": "^12.0.0",
 | 
			
		||||
    "@angular/core": "^12.0.0",
 | 
			
		||||
    "@angular/forms": "^12.0.0",
 | 
			
		||||
    "@angular/platform-browser": "^12.0.0",
 | 
			
		||||
    "@angular/platform-browser-dynamic": "^12.0.0",
 | 
			
		||||
    "@fortawesome/fontawesome-free": "^5.15.4",
 | 
			
		||||
    "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
 | 
			
		||||
    "@fortawesome/fontawesome-free": "^6.1.1",
 | 
			
		||||
    "@ng-bootstrap/ng-bootstrap": "^10.0.0",
 | 
			
		||||
    "@sentry/cli": "^1.67.2",
 | 
			
		||||
    "@sentry/electron": "^2.5.1",
 | 
			
		||||
    "@sentry/cli": "^1.74.3",
 | 
			
		||||
    "@sentry/electron": "^2.5.4",
 | 
			
		||||
    "@tabby-gang/to-string-loader": "^1.1.7-beta.2",
 | 
			
		||||
    "@types/deep-equal": "1.0.1",
 | 
			
		||||
    "@types/electron-config": "^3.2.2",
 | 
			
		||||
    "@types/electron-debug": "^2.1.0",
 | 
			
		||||
    "@types/fs-extra": "^9.0.12",
 | 
			
		||||
    "@types/js-yaml": "^4.0.2",
 | 
			
		||||
    "@types/fs-extra": "^9.0.13",
 | 
			
		||||
    "@types/js-yaml": "^4.0.5",
 | 
			
		||||
    "@types/node": "16.0.1",
 | 
			
		||||
    "@types/sortablejs": "^1.10.7",
 | 
			
		||||
    "@types/webpack-env": "^1.16.2",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^4.29.0",
 | 
			
		||||
    "@typescript-eslint/parser": "^4.28.5",
 | 
			
		||||
    "@types/webpack-env": "^1.16.3",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^4.33.0",
 | 
			
		||||
    "@typescript-eslint/parser": "^4.33.0",
 | 
			
		||||
    "apply-loader": "2.0.0",
 | 
			
		||||
    "axios": "^0.21.1",
 | 
			
		||||
    "axios": "^0.26.1",
 | 
			
		||||
    "browserify-sign": "^4.2.1",
 | 
			
		||||
    "clone-deep": "^4.0.1",
 | 
			
		||||
    "compare-versions": "^3.6.0",
 | 
			
		||||
    "core-js": "^3.15.2",
 | 
			
		||||
    "compare-versions": "^4",
 | 
			
		||||
    "core-js": "^3.21.1",
 | 
			
		||||
    "core-js-pure": "^3.21.1",
 | 
			
		||||
    "cross-env": "7.0.3",
 | 
			
		||||
    "css-loader": "^6.2.0",
 | 
			
		||||
    "electron": "13.1.9",
 | 
			
		||||
    "electron-builder": "22.10.5",
 | 
			
		||||
    "css-loader": "^6.7.1",
 | 
			
		||||
    "deep-equal": "2.0.5",
 | 
			
		||||
    "electron": "18.0.4",
 | 
			
		||||
    "electron-builder": "^23.0.3",
 | 
			
		||||
    "electron-download": "^4.1.1",
 | 
			
		||||
    "electron-installer-snap": "^5.1.0",
 | 
			
		||||
    "electron-notarize": "^1.0.1",
 | 
			
		||||
    "electron-rebuild": "^3.1.1",
 | 
			
		||||
    "electron-notarize": "^1.2.1",
 | 
			
		||||
    "electron-rebuild": "^3.2.7",
 | 
			
		||||
    "eslint": "^7.32.0",
 | 
			
		||||
    "eslint-plugin-import": "^2.23.4",
 | 
			
		||||
    "file-loader": "^6.2.0",
 | 
			
		||||
    "graceful-fs": "^4.2.8",
 | 
			
		||||
    "html-loader": "2.1.2",
 | 
			
		||||
    "json-loader": "0.5.7",
 | 
			
		||||
    "gettext-extractor": "^3.5.4",
 | 
			
		||||
    "graceful-fs": "^4.2.9",
 | 
			
		||||
    "html-loader": "3.1.0",
 | 
			
		||||
    "json-loader": "^0.5.7",
 | 
			
		||||
    "lru-cache": "^6.0.0",
 | 
			
		||||
    "macos-release": "^3.0.0",
 | 
			
		||||
    "macos-release": "^3.0.1",
 | 
			
		||||
    "ngx-sortablejs": "^11.1.0",
 | 
			
		||||
    "ngx-toastr": "^14.0.0",
 | 
			
		||||
    "node-abi": "^2.30.0",
 | 
			
		||||
    "node-sass": "^6.0.1",
 | 
			
		||||
    "npmlog": "5.0.0",
 | 
			
		||||
    "node-abi": "^3.8.0",
 | 
			
		||||
    "node-sass": "^7.0.1",
 | 
			
		||||
    "npmlog": "6.0.0",
 | 
			
		||||
    "npx": "^10.2.2",
 | 
			
		||||
    "patch-package": "^6.4.7",
 | 
			
		||||
    "pug": "^3.0.2",
 | 
			
		||||
    "po-gettext-loader": "^1.0.0",
 | 
			
		||||
    "pug": "3",
 | 
			
		||||
    "pug-cli": "^1.0.0-alpha6",
 | 
			
		||||
    "pug-html-loader": "1.1.5",
 | 
			
		||||
    "pug-lint": "^2.6.0",
 | 
			
		||||
    "pug-loader": "^2.4.0",
 | 
			
		||||
    "pug-static-loader": "2.0.0",
 | 
			
		||||
    "raw-loader": "4.0.2",
 | 
			
		||||
    "sass-loader": "^12.1.0",
 | 
			
		||||
    "shell-quote": "^1.7.2",
 | 
			
		||||
    "shelljs": "0.8.4",
 | 
			
		||||
    "slugify": "^1.6.0",
 | 
			
		||||
    "sortablejs": "^1.14.0",
 | 
			
		||||
    "sass-loader": "^12.6.0",
 | 
			
		||||
    "shell-quote": "^1.7.3",
 | 
			
		||||
    "shelljs": "0.8.5",
 | 
			
		||||
    "slugify": "^1.6.5",
 | 
			
		||||
    "sortablejs": "^1.15.0",
 | 
			
		||||
    "source-code-pro": "^2.38.0",
 | 
			
		||||
    "source-map-loader": "^3.0.0",
 | 
			
		||||
    "source-map-loader": "^3.0.1",
 | 
			
		||||
    "source-sans-pro": "3.6.0",
 | 
			
		||||
    "ssh2": "^1.2.0",
 | 
			
		||||
    "style-loader": "^3.2.1",
 | 
			
		||||
    "ssh2": "^1.9.0",
 | 
			
		||||
    "style-loader": "^3.3.1",
 | 
			
		||||
    "svg-inline-loader": "^0.8.2",
 | 
			
		||||
    "ts-loader": "^9.2.3",
 | 
			
		||||
    "tslib": "^2.3.0",
 | 
			
		||||
    "typedoc": "^0.21.5",
 | 
			
		||||
    "thenby": "^1.3.4",
 | 
			
		||||
    "ts-loader": "^9.2.8",
 | 
			
		||||
    "tslib": "^2.3.1",
 | 
			
		||||
    "typedoc": "^0.22.13",
 | 
			
		||||
    "typescript": "^4.3.5",
 | 
			
		||||
    "utils-decorators": "^1.10.4",
 | 
			
		||||
    "val-loader": "4.0.0",
 | 
			
		||||
    "webpack": "^5.50.0",
 | 
			
		||||
    "webpack-bundle-analyzer": "^4.4.2",
 | 
			
		||||
    "webpack-cli": "^4.7.0",
 | 
			
		||||
    "webpack": "^5.72.0",
 | 
			
		||||
    "webpack-bundle-analyzer": "^4.5.0",
 | 
			
		||||
    "webpack-cli": "^4.9.2",
 | 
			
		||||
    "yaml-loader": "0.6.0",
 | 
			
		||||
    "zone.js": "^0.11.4"
 | 
			
		||||
    "zone.js": "^0.11.5"
 | 
			
		||||
  },
 | 
			
		||||
  "resolutions": {
 | 
			
		||||
    "*/pug": "^3",
 | 
			
		||||
    "lzma-native": "^8.0.0",
 | 
			
		||||
    "*/node-abi": "^2.30.0",
 | 
			
		||||
    "*/node-abi": "^3.5.0",
 | 
			
		||||
    "**/graceful-fs": "^4.2.4"
 | 
			
		||||
  },
 | 
			
		||||
  "scripts": {
 | 
			
		||||
@@ -89,10 +100,12 @@
 | 
			
		||||
    "start": "cross-env TABBY_DEV=1 electron app --debug --inspect",
 | 
			
		||||
    "start:prod": "electron app --debug",
 | 
			
		||||
    "prod": "cross-env TABBY_DEV=1 electron app",
 | 
			
		||||
    "docs": "typedoc --emit --out docs/api --tsconfig tabby-core/src/tsconfig.typings.json tabby-core/src/index.ts && typedoc --emit --out docs/api/terminal --tsconfig tabby-terminal/tsconfig.typings.json tabby-terminal/src/index.ts && typedoc --emit --out docs/api/local --tsconfig tabby-local/tsconfig.typings.json tabby-local/src/index.ts && typedoc --emit --out docs/api/settings --tsconfig tabby-settings/tsconfig.typings.json tabby-settings/src/index.ts",
 | 
			
		||||
    "docs": "node scripts/build-docs.js",
 | 
			
		||||
    "lint": "eslint --ext ts */src */lib",
 | 
			
		||||
    "postinstall": "node ./scripts/install-deps.js",
 | 
			
		||||
    "patch": "patch-package; cd web; patch-package"
 | 
			
		||||
    "postinstall": "patch-package && node ./scripts/install-deps.js",
 | 
			
		||||
    "i18n:pull": "crowdin pull --skip-untranslated-strings",
 | 
			
		||||
    "i18n:extract": "node scripts/i18n-extract.js",
 | 
			
		||||
    "i18n:push": "crowdin push"
 | 
			
		||||
  },
 | 
			
		||||
  "private": true
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
 | 
			
		||||
index 25a159e..bfe0590 100644
 | 
			
		||||
--- a/node_modules/app-builder-lib/out/appInfo.js
 | 
			
		||||
+++ b/node_modules/app-builder-lib/out/appInfo.js
 | 
			
		||||
@@ -165,7 +165,7 @@ class AppInfo {
 | 
			
		||||
   get linuxPackageName() {
 | 
			
		||||
     const name = this.name; // https://github.com/electron-userland/electron-builder/issues/2963
 | 
			
		||||
 
 | 
			
		||||
-    return name.startsWith("@") ? this.sanitizedProductName : name;
 | 
			
		||||
+    return 'tabby-terminal';
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
   get sanitizedName() {
 | 
			
		||||
							
								
								
									
										15
									
								
								patches/app-builder-lib+22.14.13.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								patches/app-builder-lib+22.14.13.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
 | 
			
		||||
index 363f32c..a0434a9 100644
 | 
			
		||||
--- a/node_modules/app-builder-lib/out/appInfo.js
 | 
			
		||||
+++ b/node_modules/app-builder-lib/out/appInfo.js
 | 
			
		||||
@@ -100,9 +100,7 @@ class AppInfo {
 | 
			
		||||
         return this.info.metadata.name;
 | 
			
		||||
     }
 | 
			
		||||
     get linuxPackageName() {
 | 
			
		||||
-        const name = this.name;
 | 
			
		||||
-        // https://github.com/electron-userland/electron-builder/issues/2963
 | 
			
		||||
-        return name.startsWith("@") ? this.sanitizedProductName : name;
 | 
			
		||||
+        return 'tabby-terminal'
 | 
			
		||||
     }
 | 
			
		||||
     get sanitizedName() {
 | 
			
		||||
         return filename_1.sanitizeFileName(this.name);
 | 
			
		||||
							
								
								
									
										39
									
								
								patches/ssh2+1.8.0.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								patches/ssh2+1.8.0.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
diff --git a/node_modules/ssh2/lib/protocol/keyParser.js b/node_modules/ssh2/lib/protocol/keyParser.js
 | 
			
		||||
index 9860e3f..ee82e51 100644
 | 
			
		||||
--- a/node_modules/ssh2/lib/protocol/keyParser.js
 | 
			
		||||
+++ b/node_modules/ssh2/lib/protocol/keyParser.js
 | 
			
		||||
@@ -15,6 +15,7 @@ const {
 | 
			
		||||
   sign: sign_,
 | 
			
		||||
   verify: verify_,
 | 
			
		||||
 } = require('crypto');
 | 
			
		||||
+const { createVerify: createVerifyDSS } = require('browserify-sign')
 | 
			
		||||
 const supportedOpenSSLCiphers = getCiphers();
 | 
			
		||||
 
 | 
			
		||||
 const { Ber } = require('asn1');
 | 
			
		||||
@@ -404,6 +405,17 @@ const BaseKey = {
 | 
			
		||||
           return new Error('No public key available');
 | 
			
		||||
         if (!algo || typeof algo !== 'string')
 | 
			
		||||
           algo = this[SYM_HASH_ALGO];
 | 
			
		||||
+
 | 
			
		||||
+        if (algo === 'dss1') {
 | 
			
		||||
+          const verifier = createVerifyDSS('DSA-SHA1');
 | 
			
		||||
+          verifier.update(data);
 | 
			
		||||
+          try {
 | 
			
		||||
+            return verifier.verify(pem, signature);
 | 
			
		||||
+          } catch (ex) {
 | 
			
		||||
+            return ex;
 | 
			
		||||
+          }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
         try {
 | 
			
		||||
           return verify_(algo, data, pem, signature);
 | 
			
		||||
         } catch (ex) {
 | 
			
		||||
@@ -1343,7 +1355,7 @@ function parseDER(data, baseType, comment, fullType) {
 | 
			
		||||
         return new Error('Malformed OpenSSH public key');
 | 
			
		||||
       pubPEM = genOpenSSLDSAPub(p, q, g, y);
 | 
			
		||||
       pubSSH = genOpenSSHDSAPub(p, q, g, y);
 | 
			
		||||
-      algo = 'sha1';
 | 
			
		||||
+      algo = 'dss1';
 | 
			
		||||
       break;
 | 
			
		||||
     }
 | 
			
		||||
     case 'ssh-ed25519': {
 | 
			
		||||
							
								
								
									
										9
									
								
								scripts/build-docs.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										9
									
								
								scripts/build-docs.js
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
const sh = require('shelljs')
 | 
			
		||||
const vars = require('./vars')
 | 
			
		||||
const log = require('npmlog')
 | 
			
		||||
 | 
			
		||||
vars.packagesWithDocs.forEach(([dest, src]) => {
 | 
			
		||||
    log.info('docs', src)
 | 
			
		||||
    sh.exec(`yarn typedoc --out docs/api/${dest} --tsconfig ${src}/tsconfig.typings.json ${src}/src/index.ts`, { fatal: true })
 | 
			
		||||
})
 | 
			
		||||
@@ -4,9 +4,13 @@ const vars = require('./vars')
 | 
			
		||||
 | 
			
		||||
const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/')
 | 
			
		||||
 | 
			
		||||
process.env.ARCH = (process.env.ARCH || process.arch) === 'arm' ? 'armv7l' : process.arch
 | 
			
		||||
 | 
			
		||||
builder({
 | 
			
		||||
    dir: true,
 | 
			
		||||
    linux: ['deb', 'tar.gz', 'rpm', 'pacman'],
 | 
			
		||||
    armv7l: process.env.ARCH === 'armv7l',
 | 
			
		||||
    arm64: process.env.ARCH === 'arm64',
 | 
			
		||||
    config: {
 | 
			
		||||
        extraMetadata: {
 | 
			
		||||
            version: vars.version,
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,18 @@ const rebuild = require('electron-rebuild').default
 | 
			
		||||
const path = require('path')
 | 
			
		||||
const vars = require('./vars')
 | 
			
		||||
 | 
			
		||||
if (process.platform === 'win32' || process.platform === 'linux') {
 | 
			
		||||
    process.env.ARCH = (process.env.ARCH || process.arch) === 'arm' ? 'armv7l' : process.arch
 | 
			
		||||
} else {
 | 
			
		||||
    process.env.ARCH ??= process.arch
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let lifecycles = []
 | 
			
		||||
for (let dir of ['app', 'tabby-core', 'tabby-local', 'tabby-ssh', 'tabby-terminal']) {
 | 
			
		||||
    const build = rebuild({
 | 
			
		||||
        buildPath: path.resolve(__dirname, '../' + dir),
 | 
			
		||||
        electronVersion: vars.electronVersion,
 | 
			
		||||
        arch: process.env.ARCH ?? process.arch,
 | 
			
		||||
        arch: process.env.ARCH,
 | 
			
		||||
        force: true,
 | 
			
		||||
    })
 | 
			
		||||
    build.catch(e => {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,5 +5,5 @@ const log = require('npmlog')
 | 
			
		||||
 | 
			
		||||
vars.builtinPlugins.forEach(plugin => {
 | 
			
		||||
    log.info('typings', plugin)
 | 
			
		||||
    sh.exec(`npx tsc --project ${plugin}/tsconfig.typings.json`)
 | 
			
		||||
    sh.exec(`yarn tsc --project ${plugin}/tsconfig.typings.json`, { fatal: true })
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,12 @@ const vars = require('./vars')
 | 
			
		||||
const isTag = (process.env.GITHUB_REF || process.env.BUILD_SOURCEBRANCH || '').startsWith('refs/tags/')
 | 
			
		||||
const isCI = !!process.env.GITHUB_REF
 | 
			
		||||
 | 
			
		||||
process.env.ARCH = process.env.ARCH || process.arch
 | 
			
		||||
 | 
			
		||||
builder({
 | 
			
		||||
    dir: true,
 | 
			
		||||
    win: ['nsis', 'zip'],
 | 
			
		||||
    arm64: process.env.ARCH === 'arm64',
 | 
			
		||||
    config: {
 | 
			
		||||
        extraMetadata: {
 | 
			
		||||
            version: vars.version,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								scripts/i18n-extract.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								scripts/i18n-extract.js
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
const sh = require('shelljs')
 | 
			
		||||
const fs = require('fs/promises')
 | 
			
		||||
const vars = require('./vars')
 | 
			
		||||
const log = require('npmlog')
 | 
			
		||||
const { GettextExtractor, JsExtractors, HtmlExtractors } = require('gettext-extractor')
 | 
			
		||||
 | 
			
		||||
let extractor = new GettextExtractor()
 | 
			
		||||
 | 
			
		||||
const tempOutput = 'locale/app.new.pot'
 | 
			
		||||
const pot = 'locale/app.pot'
 | 
			
		||||
const tempHtml = 'locale/tmp-html'
 | 
			
		||||
 | 
			
		||||
;(async () => {
 | 
			
		||||
    sh.mkdir('-p', tempHtml)
 | 
			
		||||
    for (const plugin of vars.builtinPlugins) {
 | 
			
		||||
        log.info('compile-pug', plugin)
 | 
			
		||||
 | 
			
		||||
        sh.exec(`yarn pug --doctype html -s --pretty -O '{require: function(){}}' -o ${tempHtml}/${plugin} ${plugin}`, { fatal: true })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    log.info('extract-ts')
 | 
			
		||||
    extractor.createJsParser([
 | 
			
		||||
        JsExtractors.callExpression('this.translate.instant', {
 | 
			
		||||
            arguments: { text: 0 },
 | 
			
		||||
        }),
 | 
			
		||||
        JsExtractors.callExpression('translate.instant', {
 | 
			
		||||
            arguments: { text: 0 },
 | 
			
		||||
        }),
 | 
			
		||||
        JsExtractors.callExpression('_', {
 | 
			
		||||
            arguments: { text: 0 },
 | 
			
		||||
        }),
 | 
			
		||||
    ]).parseFilesGlob('./tabby-*/src/**/*.ts')
 | 
			
		||||
 | 
			
		||||
    log.info('extract-pug')
 | 
			
		||||
    const options = {
 | 
			
		||||
        attributes: {
 | 
			
		||||
            context: 'translatecontext',
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
    extractor.createHtmlParser([
 | 
			
		||||
        HtmlExtractors.elementContent('translate, [translate=""]', options),
 | 
			
		||||
        HtmlExtractors.elementAttribute('[translate*=" "]', 'translate', options),
 | 
			
		||||
    ]).parseFilesGlob(`${tempHtml}/**/*.html`)
 | 
			
		||||
 | 
			
		||||
    extractor.savePotFile(tempOutput)
 | 
			
		||||
    extractor.printStats()
 | 
			
		||||
 | 
			
		||||
    sh.rm('-r', tempHtml)
 | 
			
		||||
    sh.exec(`msgcat -s ${tempOutput} > ${pot}`, { fatal: true })
 | 
			
		||||
 | 
			
		||||
    await fs.rename(tempOutput, pot)
 | 
			
		||||
})()
 | 
			
		||||
@@ -1,29 +1,26 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
const sh = require('shelljs')
 | 
			
		||||
const path = require('path')
 | 
			
		||||
const vars = require('./vars')
 | 
			
		||||
const log = require('npmlog')
 | 
			
		||||
 | 
			
		||||
const localBinPath = path.resolve(__dirname, '../node_modules/.bin')
 | 
			
		||||
const npx = `${localBinPath}/npx`
 | 
			
		||||
 | 
			
		||||
log.info('patch')
 | 
			
		||||
sh.exec(`${npx} patch-package`)
 | 
			
		||||
sh.exec(`yarn patch-package`, { fatal: true })
 | 
			
		||||
 | 
			
		||||
log.info('deps', 'app')
 | 
			
		||||
 | 
			
		||||
sh.cd('app')
 | 
			
		||||
sh.exec(`${npx} yarn install --force`)
 | 
			
		||||
sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true })
 | 
			
		||||
sh.cd('..')
 | 
			
		||||
 | 
			
		||||
sh.cd('web')
 | 
			
		||||
sh.exec(`${npx} yarn install --force`)
 | 
			
		||||
sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true })
 | 
			
		||||
sh.exec(`yarn patch-package`, { fatal: true })
 | 
			
		||||
sh.cd('..')
 | 
			
		||||
 | 
			
		||||
vars.allPackages.forEach(plugin => {
 | 
			
		||||
    log.info('deps', plugin)
 | 
			
		||||
    sh.cd(plugin)
 | 
			
		||||
    sh.exec(`${npx} yarn install --force`)
 | 
			
		||||
    sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true })
 | 
			
		||||
    sh.cd('..')
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,25 +11,25 @@ sh.mkdir('-p', target)
 | 
			
		||||
fs.writeFileSync(path.join(target, 'package.json'), '{}')
 | 
			
		||||
sh.cd(target)
 | 
			
		||||
vars.builtinPlugins.forEach(plugin => {
 | 
			
		||||
  if (plugin === 'tabby-web') {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  log.info('install', plugin)
 | 
			
		||||
  sh.cp('-r', path.join('..', plugin), '.')
 | 
			
		||||
  sh.rm('-rf', path.join(plugin, 'node_modules'))
 | 
			
		||||
  sh.cd(plugin)
 | 
			
		||||
  sh.exec(`yarn install --force --production`)
 | 
			
		||||
    if (plugin === 'tabby-web') {
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    log.info('install', plugin)
 | 
			
		||||
    sh.cp('-r', path.join('..', plugin), '.')
 | 
			
		||||
    sh.rm('-rf', path.join(plugin, 'node_modules'))
 | 
			
		||||
    sh.cd(plugin)
 | 
			
		||||
    sh.exec(`yarn install --force --production`, { fatal: true })
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  log.info('rebuild', 'native')
 | 
			
		||||
  if (fs.existsSync('node_modules')) {
 | 
			
		||||
    rebuild({
 | 
			
		||||
      buildPath: path.resolve('.'),
 | 
			
		||||
      electronVersion: vars.electronVersion,
 | 
			
		||||
      arch: process.env.ARCH ?? process.arch,
 | 
			
		||||
      force: true,
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
  sh.cd('..')
 | 
			
		||||
    log.info('rebuild', 'native')
 | 
			
		||||
    if (fs.existsSync('node_modules')) {
 | 
			
		||||
        rebuild({
 | 
			
		||||
            buildPath: path.resolve('.'),
 | 
			
		||||
            electronVersion: vars.electronVersion,
 | 
			
		||||
            arch: process.env.ARCH ?? process.arch,
 | 
			
		||||
            force: true,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
    sh.cd('..')
 | 
			
		||||
})
 | 
			
		||||
fs.unlinkSync(path.join(target, 'package.json'), '{}')
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,12 @@
 | 
			
		||||
const sh = require('shelljs')
 | 
			
		||||
const vars = require('./vars')
 | 
			
		||||
const log = require('npmlog')
 | 
			
		||||
const { execSync } = require('child_process')
 | 
			
		||||
 | 
			
		||||
vars.allPackages.forEach(plugin => {
 | 
			
		||||
    log.info('bump', plugin)
 | 
			
		||||
    sh.cd(plugin)
 | 
			
		||||
    sh.exec('npm --no-git-tag-version version ' + vars.version)
 | 
			
		||||
    sh.exec('npm publish')
 | 
			
		||||
    sh.exec('npm --no-git-tag-version version ' + vars.version, { fatal: true })
 | 
			
		||||
    execSync('npm publish', { stdio: 'inherit' })
 | 
			
		||||
    sh.cd('..')
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,14 @@ exports.builtinPlugins = [
 | 
			
		||||
    'tabby-electron',
 | 
			
		||||
    'tabby-local',
 | 
			
		||||
    'tabby-plugin-manager',
 | 
			
		||||
    'tabby-linkifier',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
exports.packagesWithDocs = [
 | 
			
		||||
    ['.', 'tabby-core'],
 | 
			
		||||
    ['terminal', 'tabby-terminal'],
 | 
			
		||||
    ['local', 'tabby-local'],
 | 
			
		||||
    ['settings', 'tabby-settings'],
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
exports.allPackages = [
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "tabby-community-color-schemes",
 | 
			
		||||
  "version": "1.0.150",
 | 
			
		||||
  "version": "1.0.171-nightly.3",
 | 
			
		||||
  "description": "Community color schemes for Tabby",
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "tabby-builtin-plugin"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								tabby-community-color-schemes/schemes/Light Owl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tabby-community-color-schemes/schemes/Light Owl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
!
 | 
			
		||||
! Light Owl
 | 
			
		||||
! https://github.com/sdras/night-owl-vscode-theme
 | 
			
		||||
!
 | 
			
		||||
*.foreground:  #403f53
 | 
			
		||||
*.background:  #fbfbfb
 | 
			
		||||
*.cursorColor: #90a7b2
 | 
			
		||||
!
 | 
			
		||||
! Black
 | 
			
		||||
*.color0:      #403f53
 | 
			
		||||
*.color8:      #403f53
 | 
			
		||||
!
 | 
			
		||||
! Red
 | 
			
		||||
*.color1:      #de3d3b
 | 
			
		||||
*.color9:      #de3d3b
 | 
			
		||||
!
 | 
			
		||||
! Green
 | 
			
		||||
*.color2:      #08916a
 | 
			
		||||
*.color10:     #08916a
 | 
			
		||||
!
 | 
			
		||||
! Yellow
 | 
			
		||||
*.color3:      #e0af02
 | 
			
		||||
*.color11:     #daaa01
 | 
			
		||||
!
 | 
			
		||||
! Blue
 | 
			
		||||
*.color4:      #288ed7
 | 
			
		||||
*.color12:     #288ed7
 | 
			
		||||
!
 | 
			
		||||
! Magenta
 | 
			
		||||
*.color5:      #d6438a
 | 
			
		||||
*.color13:     #d6438a
 | 
			
		||||
!
 | 
			
		||||
! Cyan
 | 
			
		||||
*.color6:      #2aa298
 | 
			
		||||
*.color14:     #2aa298
 | 
			
		||||
!
 | 
			
		||||
! White
 | 
			
		||||
*.color7:      #f0f0f0
 | 
			
		||||
*.color15:     #979797
 | 
			
		||||
!
 | 
			
		||||
! Bold, Italic, Underline
 | 
			
		||||
!*.colorBD:
 | 
			
		||||
!*.colorIT:
 | 
			
		||||
!*.colorUL:
 | 
			
		||||
							
								
								
									
										44
									
								
								tabby-community-color-schemes/schemes/Night Owl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tabby-community-color-schemes/schemes/Night Owl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
!
 | 
			
		||||
! Night Owl
 | 
			
		||||
! https://github.com/sdras/night-owl-vscode-theme
 | 
			
		||||
!
 | 
			
		||||
*.foreground:  #d6deeb
 | 
			
		||||
*.background:  #011627
 | 
			
		||||
*.cursorColor: #80a4c2
 | 
			
		||||
!
 | 
			
		||||
! Black
 | 
			
		||||
*.color0:      #011627
 | 
			
		||||
*.color8:      #969696
 | 
			
		||||
!
 | 
			
		||||
! Red
 | 
			
		||||
*.color1:      #ef5350
 | 
			
		||||
*.color9:      #ef5350
 | 
			
		||||
!
 | 
			
		||||
! Green
 | 
			
		||||
*.color2:      #22da6e
 | 
			
		||||
*.color10:     #22da6e
 | 
			
		||||
!
 | 
			
		||||
! Yellow
 | 
			
		||||
*.color3:      #addb67
 | 
			
		||||
*.color11:     #ffeb95
 | 
			
		||||
!
 | 
			
		||||
! Blue
 | 
			
		||||
*.color4:      #82aaff
 | 
			
		||||
*.color12:     #82aaff
 | 
			
		||||
!
 | 
			
		||||
! Magenta
 | 
			
		||||
*.color5:      #c792ea
 | 
			
		||||
*.color13:     #c792ea
 | 
			
		||||
!
 | 
			
		||||
! Cyan
 | 
			
		||||
*.color6:      #21c7a8
 | 
			
		||||
*.color14:     #7fdbca
 | 
			
		||||
!
 | 
			
		||||
! White
 | 
			
		||||
*.color7:      #ffffff
 | 
			
		||||
*.color15:     #ffffff
 | 
			
		||||
!
 | 
			
		||||
! Bold, Italic, Underline
 | 
			
		||||
!*.colorBD:
 | 
			
		||||
!*.colorIT:
 | 
			
		||||
!*.colorUL:
 | 
			
		||||
							
								
								
									
										44
									
								
								tabby-community-color-schemes/schemes/Rose Pine
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tabby-community-color-schemes/schemes/Rose Pine
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
!
 | 
			
		||||
! Rosé Pine
 | 
			
		||||
! https://rosepinetheme.com/
 | 
			
		||||
!
 | 
			
		||||
*.foreground:  #e0def4
 | 
			
		||||
*.background:  #191724
 | 
			
		||||
*.cursorColor: #555169
 | 
			
		||||
!
 | 
			
		||||
! Black
 | 
			
		||||
*.color0:      #26233a
 | 
			
		||||
*.color8:      #6e6a86
 | 
			
		||||
!
 | 
			
		||||
! Red
 | 
			
		||||
*.color1:      #eb6f92
 | 
			
		||||
*.color9:      #eb6f92
 | 
			
		||||
!
 | 
			
		||||
! Green
 | 
			
		||||
*.color2:      #31748f
 | 
			
		||||
*.color10:     #31748f
 | 
			
		||||
!
 | 
			
		||||
! Yellow
 | 
			
		||||
*.color3:      #f6c177
 | 
			
		||||
*.color11:     #f6c177
 | 
			
		||||
!
 | 
			
		||||
! Blue
 | 
			
		||||
*.color4:      #9ccfd8
 | 
			
		||||
*.color12:     #9ccfd8
 | 
			
		||||
 | 
			
		||||
! Magenta
 | 
			
		||||
*.color5:      #c4a7e7
 | 
			
		||||
*.color13:     #c4a7e7
 | 
			
		||||
!
 | 
			
		||||
! Cyan
 | 
			
		||||
*.color6:      #ebbcba
 | 
			
		||||
*.color14:     #ebbcba
 | 
			
		||||
!
 | 
			
		||||
! White
 | 
			
		||||
*.color7:      #e0def4
 | 
			
		||||
*.color15:     #e0def4
 | 
			
		||||
!
 | 
			
		||||
! Bold, Italic, Underline
 | 
			
		||||
!*.colorBD:
 | 
			
		||||
!*.colorIT:
 | 
			
		||||
!*.colorUL:
 | 
			
		||||
							
								
								
									
										44
									
								
								tabby-community-color-schemes/schemes/Rose Pine Dawn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tabby-community-color-schemes/schemes/Rose Pine Dawn
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
!
 | 
			
		||||
! Rosé Pine Dawn
 | 
			
		||||
! https://rosepinetheme.com/
 | 
			
		||||
!
 | 
			
		||||
*.foreground:  #575279
 | 
			
		||||
*.background:  #faf4ed
 | 
			
		||||
*.cursorColor: #9893a5
 | 
			
		||||
!
 | 
			
		||||
! Black
 | 
			
		||||
*.color0:      #f2e9de
 | 
			
		||||
*.color8:      #6e6a86
 | 
			
		||||
!
 | 
			
		||||
! Red
 | 
			
		||||
*.color1:      #b4637a
 | 
			
		||||
*.color9:      #b4637a
 | 
			
		||||
!
 | 
			
		||||
! Green
 | 
			
		||||
*.color2:      #286983
 | 
			
		||||
*.color10:     #286983
 | 
			
		||||
!
 | 
			
		||||
! Yellow
 | 
			
		||||
*.color3:      #ea9d34
 | 
			
		||||
*.color11:     #ea9d34
 | 
			
		||||
!
 | 
			
		||||
! Blue
 | 
			
		||||
*.color4:      #56949f
 | 
			
		||||
*.color12:     #56949f
 | 
			
		||||
!
 | 
			
		||||
! Magenta
 | 
			
		||||
*.color5:      #907aa9
 | 
			
		||||
*.color13:     #907aa9
 | 
			
		||||
!
 | 
			
		||||
! Cyan
 | 
			
		||||
*.color6:      #d7827e
 | 
			
		||||
*.color14:     #d7827e
 | 
			
		||||
!
 | 
			
		||||
! White
 | 
			
		||||
*.color7:      #575279
 | 
			
		||||
*.color15:     #575279
 | 
			
		||||
!
 | 
			
		||||
! Bold, Italic, Underline
 | 
			
		||||
!*.colorBD:
 | 
			
		||||
!*.colorIT:
 | 
			
		||||
!*.colorUL:
 | 
			
		||||
							
								
								
									
										44
									
								
								tabby-community-color-schemes/schemes/Rose Pine Moon
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tabby-community-color-schemes/schemes/Rose Pine Moon
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
!
 | 
			
		||||
! Rosé Pine Moon
 | 
			
		||||
! https://rosepinetheme.com/
 | 
			
		||||
!
 | 
			
		||||
*.foreground:  #e0def4
 | 
			
		||||
*.background:  #232136
 | 
			
		||||
*.cursorColor: #59546d
 | 
			
		||||
!
 | 
			
		||||
! Black
 | 
			
		||||
*.color0:      #393552
 | 
			
		||||
*.color8:      #817c9c
 | 
			
		||||
!
 | 
			
		||||
! Red
 | 
			
		||||
*.color1:      #eb6f92
 | 
			
		||||
*.color9:      #eb6f92
 | 
			
		||||
!
 | 
			
		||||
! Green
 | 
			
		||||
*.color2:      #3e8fb0
 | 
			
		||||
*.color10:     #3e8fb0
 | 
			
		||||
!
 | 
			
		||||
! Yellow
 | 
			
		||||
*.color3:      #f6c177
 | 
			
		||||
*.color11:     #f6c177
 | 
			
		||||
!
 | 
			
		||||
! Blue
 | 
			
		||||
*.color4:      #9ccfd8
 | 
			
		||||
*.color12:     #9ccfd8
 | 
			
		||||
!
 | 
			
		||||
! Magenta
 | 
			
		||||
*.color5:      #c4a7e7
 | 
			
		||||
*.color13:     #c4a7e7
 | 
			
		||||
!
 | 
			
		||||
! Cyan
 | 
			
		||||
*.color6:      #ea9a97
 | 
			
		||||
*.color14:     #ea9a97
 | 
			
		||||
!
 | 
			
		||||
! White
 | 
			
		||||
*.color7:      #e0def4
 | 
			
		||||
*.color15:     #e0def4
 | 
			
		||||
!
 | 
			
		||||
! Bold, Italic, Underline
 | 
			
		||||
!*.colorBD:
 | 
			
		||||
!*.colorIT:
 | 
			
		||||
!*.colorUL:
 | 
			
		||||
@@ -1,7 +1,13 @@
 | 
			
		||||
Tabby Core Plugin
 | 
			
		||||
--------------------
 | 
			
		||||
# Tabby Core Plugin
 | 
			
		||||
 | 
			
		||||
See also: [Settings plugin API](./settings/), [Terminal plugin API](./terminal/), [Local terminal API](./local/)
 | 
			
		||||
See also:
 | 
			
		||||
 | 
			
		||||
* [Settings plugin API](./settings/)
 | 
			
		||||
* [Terminal plugin API](./terminal/)
 | 
			
		||||
* [Local terminal API](./local/)
 | 
			
		||||
* [Linkifier plugin API](./linkifier/)
 | 
			
		||||
 | 
			
		||||
This module provides:
 | 
			
		||||
 | 
			
		||||
* tabbed interface services
 | 
			
		||||
* toolbar UI
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "tabby-core",
 | 
			
		||||
  "version": "1.0.150",
 | 
			
		||||
  "version": "1.0.171-nightly.3",
 | 
			
		||||
  "description": "Tabby core",
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "tabby-builtin-plugin"
 | 
			
		||||
@@ -17,15 +17,15 @@
 | 
			
		||||
  "author": "Eugene Pankov",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/js-yaml": "^4.0.0",
 | 
			
		||||
    "@ngx-translate/core": "^14.0.0",
 | 
			
		||||
    "bootstrap": "^4.1.3",
 | 
			
		||||
    "deep-equal": "^2.0.5",
 | 
			
		||||
    "deepmerge": "^4.1.1",
 | 
			
		||||
    "electron-updater": "^4.0.6",
 | 
			
		||||
    "js-yaml": "^4.0.0",
 | 
			
		||||
    "messageformat": "^2.3.0",
 | 
			
		||||
    "mixpanel": "^0.13.0",
 | 
			
		||||
    "ngx-filesize": "^2.0.16",
 | 
			
		||||
    "ngx-perfect-scrollbar": "^10.1.0",
 | 
			
		||||
    "ngx-translate-messageformat-compiler": "^4.11.0",
 | 
			
		||||
    "readable-stream": "3.6.0",
 | 
			
		||||
    "uuid": "^8.0.0"
 | 
			
		||||
  },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
export { BaseComponent, SubscriptionContainer } from '../components/base.component'
 | 
			
		||||
export { BaseTabComponent, BaseTabProcess } from '../components/baseTab.component'
 | 
			
		||||
export { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from '../components/baseTab.component'
 | 
			
		||||
export { TabHeaderComponent } from '../components/tabHeader.component'
 | 
			
		||||
export { SplitTabComponent, SplitContainer } from '../components/splitTab.component'
 | 
			
		||||
export { SplitTabComponent, SplitContainer, SplitDirection, SplitOrientation } from '../components/splitTab.component'
 | 
			
		||||
export { TabRecoveryProvider, RecoveryToken } from './tabRecovery'
 | 
			
		||||
export { ToolbarButtonProvider, ToolbarButton } from './toolbarButtonProvider'
 | 
			
		||||
export { ConfigProvider } from './configProvider'
 | 
			
		||||
@@ -25,13 +25,15 @@ export { DockingService, Screen } from '../services/docking.service'
 | 
			
		||||
export { Logger, ConsoleLogger, LogService } from '../services/log.service'
 | 
			
		||||
export { HomeBaseService } from '../services/homeBase.service'
 | 
			
		||||
export { HotkeysService } from '../services/hotkeys.service'
 | 
			
		||||
export { KeyEventData, KeyName, Keystroke } from '../services/hotkeys.util'
 | 
			
		||||
export { KeyEventData, KeyName, Keystroke, altKeyName, metaKeyName } from '../services/hotkeys.util'
 | 
			
		||||
export { NotificationsService } from '../services/notifications.service'
 | 
			
		||||
export { ThemesService } from '../services/themes.service'
 | 
			
		||||
export { ProfilesService } from '../services/profiles.service'
 | 
			
		||||
export { SelectorService } from '../services/selector.service'
 | 
			
		||||
export { TabRecoveryService } from '../services/tabRecovery.service'
 | 
			
		||||
export { TabsService, NewTabParameters, TabComponentType } from '../services/tabs.service'
 | 
			
		||||
export { UpdaterService } from '../services/updater.service'
 | 
			
		||||
export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE } from '../services/vault.service'
 | 
			
		||||
export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service'
 | 
			
		||||
export { FileProvidersService } from '../services/fileProviders.service'
 | 
			
		||||
export { LocaleService, TranslateServiceWrapper as TranslateService } from '../services/locale.service'
 | 
			
		||||
export * from '../utils'
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ export interface PluginInfo {
 | 
			
		||||
export interface BootstrapData {
 | 
			
		||||
    config: Record<string, any>
 | 
			
		||||
    executable: string
 | 
			
		||||
    isFirstWindow: boolean
 | 
			
		||||
    isMainWindow: boolean
 | 
			
		||||
    windowID: number
 | 
			
		||||
    installedPlugins: PluginInfo[]
 | 
			
		||||
    userPluginsPath: string
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,9 @@ export abstract class FileTransfer {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected increaseProgress (bytes: number): void {
 | 
			
		||||
        if (!bytes) {
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        this.completedBytes += bytes
 | 
			
		||||
        this.lastChunkSpeed = bytes * 1000 / (Date.now() - this.lastChunkStartTime)
 | 
			
		||||
        this.lastChunkStartTime = Date.now()
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ export abstract class ProfileProvider<P extends Profile> {
 | 
			
		||||
 | 
			
		||||
    abstract getBuiltinProfiles (): Promise<PartialProfile<P>[]>
 | 
			
		||||
 | 
			
		||||
    abstract getNewTabParameters (profile: PartialProfile<P>): Promise<NewTabParameters<BaseTabComponent>>
 | 
			
		||||
    abstract getNewTabParameters (profile: P): Promise<NewTabParameters<BaseTabComponent>>
 | 
			
		||||
 | 
			
		||||
    getSuggestedName (profile: PartialProfile<P>): string|null {
 | 
			
		||||
        return null
 | 
			
		||||
@@ -56,5 +56,9 @@ export abstract class ProfileProvider<P extends Profile> {
 | 
			
		||||
        return null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intoQuickConnectString (profile: P): string|null {
 | 
			
		||||
        return null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    deleteProfile (profile: P): void { }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,12 @@
 | 
			
		||||
export interface SelectorOption<T> {
 | 
			
		||||
    name: string
 | 
			
		||||
    description?: string
 | 
			
		||||
    group?: string
 | 
			
		||||
    result?: T
 | 
			
		||||
    icon?: string
 | 
			
		||||
    freeInputPattern?: string
 | 
			
		||||
    freeInputEquivalent?: string
 | 
			
		||||
    color?: string
 | 
			
		||||
    weight?: number
 | 
			
		||||
    callback?: (string?) => void
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
import deepClone from 'clone-deep'
 | 
			
		||||
import { BaseTabComponent } from '../components/baseTab.component'
 | 
			
		||||
import { NewTabParameters } from '../services/tabs.service'
 | 
			
		||||
 | 
			
		||||
export interface RecoveryToken {
 | 
			
		||||
    [_: string]: any
 | 
			
		||||
    type: string
 | 
			
		||||
    tabIcon?: string|null
 | 
			
		||||
    tabColor?: string|null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -38,14 +38,4 @@ export abstract class TabRecoveryProvider <T extends BaseTabComponent> {
 | 
			
		||||
     *          or `null` if this token is from a different tab type or is not supported
 | 
			
		||||
     */
 | 
			
		||||
    abstract recover (recoveryToken: RecoveryToken): Promise<NewTabParameters<T>>
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param recoveryToken a recovery token found in the saved tabs list
 | 
			
		||||
     * @returns [[RecoveryToken]] a new recovery token to create the duplicate tab from
 | 
			
		||||
     *
 | 
			
		||||
     * The default implementation just returns a deep copy of the original token
 | 
			
		||||
     */
 | 
			
		||||
    duplicate (recoveryToken: RecoveryToken): RecoveryToken {
 | 
			
		||||
        return deepClone(recoveryToken)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,10 @@ export interface ToolbarButton {
 | 
			
		||||
 | 
			
		||||
    /** @hidden */
 | 
			
		||||
    submenuItems?: ToolbarButton[]
 | 
			
		||||
 | 
			
		||||
    showInToolbar?: boolean
 | 
			
		||||
 | 
			
		||||
    showInStartPage?: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,9 @@
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
 | 
			
		||||
import { Injectable } from '@angular/core'
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core'
 | 
			
		||||
 | 
			
		||||
import { ToolbarButton, ToolbarButtonProvider } from './api/toolbarButtonProvider'
 | 
			
		||||
import { HostAppService, Platform } from './api/hostApp'
 | 
			
		||||
import { PartialProfile, Profile } from './api/profileProvider'
 | 
			
		||||
import { ConfigService } from './services/config.service'
 | 
			
		||||
import { HotkeysService } from './services/hotkeys.service'
 | 
			
		||||
import { ProfilesService } from './services/profiles.service'
 | 
			
		||||
 | 
			
		||||
@@ -14,7 +13,7 @@ export class ButtonProvider extends ToolbarButtonProvider {
 | 
			
		||||
    constructor (
 | 
			
		||||
        private hostApp: HostAppService,
 | 
			
		||||
        private profilesService: ProfilesService,
 | 
			
		||||
        private config: ConfigService,
 | 
			
		||||
        private translate: TranslateService,
 | 
			
		||||
        hotkeys: HotkeysService,
 | 
			
		||||
    ) {
 | 
			
		||||
        super()
 | 
			
		||||
@@ -28,32 +27,29 @@ export class ButtonProvider extends ToolbarButtonProvider {
 | 
			
		||||
    async activate () {
 | 
			
		||||
        const profile = await this.profilesService.showProfileSelector()
 | 
			
		||||
        if (profile) {
 | 
			
		||||
            this.launchProfile(profile)
 | 
			
		||||
            this.profilesService.launchProfile(profile)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async launchProfile (profile: PartialProfile<Profile>) {
 | 
			
		||||
        await this.profilesService.openNewTabForProfile(profile)
 | 
			
		||||
 | 
			
		||||
        let recentProfiles = this.config.store.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 = []
 | 
			
		||||
        }
 | 
			
		||||
        this.config.store.recentProfiles = recentProfiles
 | 
			
		||||
        this.config.save()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    provide (): ToolbarButton[] {
 | 
			
		||||
        return [{
 | 
			
		||||
            icon: this.hostApp.platform === Platform.Web
 | 
			
		||||
                ? require('./icons/plus.svg')
 | 
			
		||||
                : require('./icons/profiles.svg'),
 | 
			
		||||
            title: 'New tab with profile',
 | 
			
		||||
            click: () => this.activate(),
 | 
			
		||||
        }]
 | 
			
		||||
        return [
 | 
			
		||||
            {
 | 
			
		||||
                icon: this.hostApp.platform === Platform.Web
 | 
			
		||||
                    ? require('./icons/plus.svg')
 | 
			
		||||
                    : require('./icons/profiles.svg'),
 | 
			
		||||
                title: this.translate.instant('Profiles & connections'),
 | 
			
		||||
                click: () => this.activate(),
 | 
			
		||||
            },
 | 
			
		||||
            ...this.profilesService.getRecentProfiles().map(profile => ({
 | 
			
		||||
                icon: require('./icons/history.svg'),
 | 
			
		||||
                title: profile.name,
 | 
			
		||||
                showInToolbar: false,
 | 
			
		||||
                showinStartPage: true,
 | 
			
		||||
                click: async () => {
 | 
			
		||||
                    const p = (await this.profilesService.getProfiles()).find(x => x.id === profile.id) ?? profile
 | 
			
		||||
                    this.profilesService.launchProfile(p)
 | 
			
		||||
                },
 | 
			
		||||
            })),
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,10 @@ export class ProfileCLIHandler extends CLIHandler {
 | 
			
		||||
            this.handleOpenProfile(event.argv.profileName)
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
        if (op === 'recent') {
 | 
			
		||||
            this.handleOpenRecentProfile(event.argv.profileNumber)
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
        return false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -35,6 +39,15 @@ export class ProfileCLIHandler extends CLIHandler {
 | 
			
		||||
        this.profiles.openNewTabForProfile(profile)
 | 
			
		||||
        this.hostWindow.bringToFront()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private async handleOpenRecentProfile (profileNumber: number) {
 | 
			
		||||
        const profiles = this.profiles.getRecentProfiles()
 | 
			
		||||
        if (profileNumber >= profiles.length) {
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        this.profiles.openNewTabForProfile(profiles[profileNumber])
 | 
			
		||||
        this.hostWindow.bringToFront()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Injectable()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
title-bar(
 | 
			
		||||
  *ngIf='ready && !hostWindow.isFullscreen && config.store.appearance.frame == "full" && config.store.appearance.dock == "off"',
 | 
			
		||||
  (dblclick)='hostWindow.toggleMaximize()',
 | 
			
		||||
  [class.inset]='hostApp.platform == Platform.macOS && !hostWindow.isFullscreen'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -8,7 +9,7 @@ title-bar(
 | 
			
		||||
    [class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left"',
 | 
			
		||||
    [class.tabs-on-side]='hasVerticalTabs()',
 | 
			
		||||
)
 | 
			
		||||
    .tab-bar
 | 
			
		||||
    .tab-bar((dblclick)='hostWindow.toggleMaximize()')
 | 
			
		||||
        .inset.background(*ngIf='hostApp.platform == Platform.macOS \
 | 
			
		||||
        && !hostWindow.isFullscreen \
 | 
			
		||||
        && config.store.appearance.frame == "thin" \
 | 
			
		||||
@@ -25,7 +26,7 @@ title-bar(
 | 
			
		||||
                [tab]='tab',
 | 
			
		||||
                [active]='tab == app.activeTab',
 | 
			
		||||
                @animateTab,
 | 
			
		||||
                [@.disabled]='hasVerticalTabs()',
 | 
			
		||||
                [@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
 | 
			
		||||
                (click)='app.selectTab(tab)',
 | 
			
		||||
                [class.fully-draggable]='hostApp.platform != Platform.macOS',
 | 
			
		||||
                [class.drag-region]='hostApp.platform == Platform.macOS && !(app.tabDragActive$|async)',
 | 
			
		||||
@@ -56,15 +57,20 @@ title-bar(
 | 
			
		||||
                        div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}}
 | 
			
		||||
 | 
			
		||||
            .d-flex(
 | 
			
		||||
                *ngIf='activeTransfers.length > 0',
 | 
			
		||||
                ngbDropdown,
 | 
			
		||||
                [(open)]='activeTransfersDropdownOpen'
 | 
			
		||||
                container='body',
 | 
			
		||||
                #activeTransfersDropdown='ngbDropdown'
 | 
			
		||||
            )
 | 
			
		||||
                button.btn.btn-secondary.btn-tab-bar(
 | 
			
		||||
                    *ngIf='activeTransfers.length > 0',
 | 
			
		||||
                    title='File transfers',
 | 
			
		||||
                    ngbDropdownToggle
 | 
			
		||||
                ) !{require('../icons/download-solid.svg')}
 | 
			
		||||
                transfers-menu(ngbDropdownMenu, [(transfers)]='activeTransfers')
 | 
			
		||||
                ) !{require('../icons/transfers.svg')}
 | 
			
		||||
                transfers-menu(
 | 
			
		||||
                    ngbDropdownMenu,
 | 
			
		||||
                    [(transfers)]='activeTransfers',
 | 
			
		||||
                    (transfersChange)='onTransfersChange()'
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
        .drag-space.background([class.persistent]='config.store.appearance.frame == "thin" && hostApp.platform != Platform.macOS')
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
    user-select: none;
 | 
			
		||||
    -webkit-user-drag: none;
 | 
			
		||||
    -webkit-font-smoothing: antialiased;
 | 
			
		||||
    will-change: transform;
 | 
			
		||||
    cursor: default;
 | 
			
		||||
    animation: 0.5s ease-out fadeIn;
 | 
			
		||||
@@ -89,7 +88,7 @@ $side-tab-width: 200px;
 | 
			
		||||
        padding: 0 12px;
 | 
			
		||||
        flex: 0 0 auto;
 | 
			
		||||
        border-bottom: 2px solid transparent;
 | 
			
		||||
        transition: 0.25s all;
 | 
			
		||||
        transition: 0.125s all ease-out;
 | 
			
		||||
        font-size: 12px;
 | 
			
		||||
 | 
			
		||||
        text-transform: uppercase;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
 | 
			
		||||
import { Component, Inject, Input, HostListener, HostBinding, ViewChildren } from '@angular/core'
 | 
			
		||||
import { Component, Inject, Input, HostListener, HostBinding, ViewChildren, ViewChild } from '@angular/core'
 | 
			
		||||
import { trigger, style, animate, transition, state } from '@angular/animations'
 | 
			
		||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
 | 
			
		||||
import { NgbDropdown, NgbModal } from '@ng-bootstrap/ng-bootstrap'
 | 
			
		||||
import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'
 | 
			
		||||
 | 
			
		||||
import { HostAppService, Platform } from '../api/hostApp'
 | 
			
		||||
@@ -14,6 +14,7 @@ import { UpdaterService } from '../services/updater.service'
 | 
			
		||||
import { BaseTabComponent } from './baseTab.component'
 | 
			
		||||
import { SafeModeModalComponent } from './safeModeModal.component'
 | 
			
		||||
import { TabBodyComponent } from './tabBody.component'
 | 
			
		||||
import { SplitTabComponent } from './splitTab.component'
 | 
			
		||||
import { AppService, FileTransfer, HostWindowService, PlatformService, ToolbarButton, ToolbarButtonProvider } from '../api'
 | 
			
		||||
 | 
			
		||||
/** @hidden */
 | 
			
		||||
@@ -24,8 +25,8 @@ import { AppService, FileTransfer, HostWindowService, PlatformService, ToolbarBu
 | 
			
		||||
    animations: [
 | 
			
		||||
        trigger('animateTab', [
 | 
			
		||||
            state('in', style({
 | 
			
		||||
                'flex-basis': '200px',
 | 
			
		||||
                width: '200px',
 | 
			
		||||
                'flex-basis': 'auto',
 | 
			
		||||
                width: 'auto',
 | 
			
		||||
            })),
 | 
			
		||||
            transition(':enter', [
 | 
			
		||||
                style({
 | 
			
		||||
@@ -33,14 +34,14 @@ import { AppService, FileTransfer, HostWindowService, PlatformService, ToolbarBu
 | 
			
		||||
                    width: '1px',
 | 
			
		||||
                }),
 | 
			
		||||
                animate('250ms ease-in-out', style({
 | 
			
		||||
                    'flex-basis': '200px',
 | 
			
		||||
                    width: '200px',
 | 
			
		||||
                    'flex-basis': 'auto',
 | 
			
		||||
                    width: 'auto',
 | 
			
		||||
                })),
 | 
			
		||||
            ]),
 | 
			
		||||
            transition(':leave', [
 | 
			
		||||
                style({
 | 
			
		||||
                    'flex-basis': '200px',
 | 
			
		||||
                    width: '200px',
 | 
			
		||||
                    'flex-basis': 'auto',
 | 
			
		||||
                    width: 'auto',
 | 
			
		||||
                }),
 | 
			
		||||
                animate('250ms ease-in-out', style({
 | 
			
		||||
                    'flex-basis': '1px',
 | 
			
		||||
@@ -60,10 +61,10 @@ export class AppRootComponent {
 | 
			
		||||
    @HostBinding('class.platform-linux') platformClassLinux = process.platform === 'linux'
 | 
			
		||||
    @HostBinding('class.no-tabs') noTabs = true
 | 
			
		||||
    @ViewChildren(TabBodyComponent) tabBodies: TabBodyComponent[]
 | 
			
		||||
    @ViewChild('activeTransfersDropdown') activeTransfersDropdown: NgbDropdown
 | 
			
		||||
    unsortedTabs: BaseTabComponent[] = []
 | 
			
		||||
    updatesAvailable = false
 | 
			
		||||
    activeTransfers: FileTransfer[] = []
 | 
			
		||||
    activeTransfersDropdownOpen = false
 | 
			
		||||
    private logger: Logger
 | 
			
		||||
 | 
			
		||||
    constructor (
 | 
			
		||||
@@ -108,9 +109,18 @@ export class AppRootComponent {
 | 
			
		||||
                if (hotkey === 'move-tab-right') {
 | 
			
		||||
                    this.app.moveSelectedTabRight()
 | 
			
		||||
                }
 | 
			
		||||
                if (hotkey === 'reopen-tab') {
 | 
			
		||||
                    this.app.reopenLastTab()
 | 
			
		||||
                if (hotkey === 'duplicate-tab') {
 | 
			
		||||
                    this.app.duplicateTab(this.app.activeTab)
 | 
			
		||||
                }
 | 
			
		||||
                if (hotkey === 'explode-tab' && this.app.activeTab instanceof SplitTabComponent) {
 | 
			
		||||
                    this.app.explodeTab(this.app.activeTab)
 | 
			
		||||
                }
 | 
			
		||||
                if (hotkey === 'combine-tabs' && this.app.activeTab instanceof SplitTabComponent) {
 | 
			
		||||
                    this.app.combineTabsInto(this.app.activeTab)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (hotkey === 'reopen-tab') {
 | 
			
		||||
                this.app.reopenLastTab()
 | 
			
		||||
            }
 | 
			
		||||
            if (hotkey === 'toggle-fullscreen') {
 | 
			
		||||
                hostWindow.toggleFullscreen()
 | 
			
		||||
@@ -144,7 +154,7 @@ export class AppRootComponent {
 | 
			
		||||
 | 
			
		||||
        platform.fileTransferStarted$.subscribe(transfer => {
 | 
			
		||||
            this.activeTransfers.push(transfer)
 | 
			
		||||
            this.activeTransfersDropdownOpen = true
 | 
			
		||||
            this.activeTransfersDropdown.open()
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        config.ready$.toPromise().then(() => {
 | 
			
		||||
@@ -193,16 +203,34 @@ export class AppRootComponent {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTabsReordered (event: CdkDragDrop<BaseTabComponent[]>) {
 | 
			
		||||
        const tab: BaseTabComponent = event.item.data
 | 
			
		||||
        if (!this.app.tabs.includes(tab)) {
 | 
			
		||||
            if (tab.parent instanceof SplitTabComponent) {
 | 
			
		||||
                tab.parent.removeTab(tab)
 | 
			
		||||
                this.app.wrapAndAddTab(tab)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        moveItemInArray(this.app.tabs, event.previousIndex, event.currentIndex)
 | 
			
		||||
        this.app.emitTabsChanged()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTransfersChange () {
 | 
			
		||||
        if (this.activeTransfers.length === 0) {
 | 
			
		||||
            this.activeTransfersDropdown.close()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @HostBinding('class.vibrant') get isVibrant () {
 | 
			
		||||
        return this.config.store?.appearance.vibrancy
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private getToolbarButtons (aboveZero: boolean): ToolbarButton[] {
 | 
			
		||||
        let buttons: ToolbarButton[] = []
 | 
			
		||||
        this.config.enabledServices(this.toolbarButtonProviders).forEach(provider => {
 | 
			
		||||
            buttons = buttons.concat(provider.provide())
 | 
			
		||||
        })
 | 
			
		||||
        return buttons
 | 
			
		||||
            .filter(x => x.showInToolbar ?? true)
 | 
			
		||||
            .filter(button => (button.weight ?? 0) > 0 === aboveZero)
 | 
			
		||||
            .sort((a: ToolbarButton, b: ToolbarButton) => (a.weight ?? 0) - (b.weight ?? 0))
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import { Observable, Subject } from 'rxjs'
 | 
			
		||||
import { Observable, Subject, distinctUntilChanged, filter, debounceTime } from 'rxjs'
 | 
			
		||||
import { EmbeddedViewRef, ViewContainerRef, ViewRef } from '@angular/core'
 | 
			
		||||
import { RecoveryToken } from '../api/tabRecovery'
 | 
			
		||||
import { BaseComponent } from './base.component'
 | 
			
		||||
@@ -11,6 +11,10 @@ export interface BaseTabProcess {
 | 
			
		||||
    name: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface GetRecoveryTokenOptions {
 | 
			
		||||
    includeState: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Abstract base class for custom tab components
 | 
			
		||||
 */
 | 
			
		||||
@@ -43,7 +47,16 @@ export abstract class BaseTabComponent extends BaseComponent {
 | 
			
		||||
    /**
 | 
			
		||||
     * CSS color override for the tab's header
 | 
			
		||||
     */
 | 
			
		||||
    color: string|null = null
 | 
			
		||||
    get color (): string|null { return this._color }
 | 
			
		||||
    set color (value: string|null) { this._color = value }
 | 
			
		||||
    private _color: string|null = null
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * icon override for the tab's header
 | 
			
		||||
     */
 | 
			
		||||
    get icon (): string|null { return this._icon }
 | 
			
		||||
    set icon (value: string|null) { this._icon = value }
 | 
			
		||||
    private _icon: string|null = null
 | 
			
		||||
 | 
			
		||||
    hasFocus = false
 | 
			
		||||
 | 
			
		||||
@@ -57,7 +70,6 @@ export abstract class BaseTabComponent extends BaseComponent {
 | 
			
		||||
    /* @hidden */
 | 
			
		||||
    viewContainerEmbeddedRef?: EmbeddedViewRef<any>
 | 
			
		||||
 | 
			
		||||
    private progressClearTimeout: number
 | 
			
		||||
    private titleChange = new Subject<string>()
 | 
			
		||||
    private focused = new Subject<void>()
 | 
			
		||||
    private blurred = new Subject<void>()
 | 
			
		||||
@@ -69,8 +81,8 @@ export abstract class BaseTabComponent extends BaseComponent {
 | 
			
		||||
 | 
			
		||||
    get focused$ (): Observable<void> { return this.focused }
 | 
			
		||||
    get blurred$ (): Observable<void> { return this.blurred }
 | 
			
		||||
    get titleChange$ (): Observable<string> { return this.titleChange }
 | 
			
		||||
    get progress$ (): Observable<number|null> { return this.progress }
 | 
			
		||||
    get titleChange$ (): Observable<string> { return this.titleChange.pipe(distinctUntilChanged()) }
 | 
			
		||||
    get progress$ (): Observable<number|null> { return this.progress.pipe(distinctUntilChanged()) }
 | 
			
		||||
    get activity$ (): Observable<boolean> { return this.activity }
 | 
			
		||||
    get destroyed$ (): Observable<void> { return this.destroyed }
 | 
			
		||||
    get recoveryStateChangedHint$ (): Observable<void> { return this.recoveryStateChangedHint }
 | 
			
		||||
@@ -83,6 +95,12 @@ export abstract class BaseTabComponent extends BaseComponent {
 | 
			
		||||
        this.blurred$.subscribe(() => {
 | 
			
		||||
            this.hasFocus = false
 | 
			
		||||
        })
 | 
			
		||||
        this.subscribeUntilDestroyed(this.progress.pipe(
 | 
			
		||||
            filter(x => x !== null),
 | 
			
		||||
            debounceTime(5000),
 | 
			
		||||
        ), () => {
 | 
			
		||||
            this.setProgress(null)
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setTitle (title: string): void {
 | 
			
		||||
@@ -99,30 +117,26 @@ export abstract class BaseTabComponent extends BaseComponent {
 | 
			
		||||
     */
 | 
			
		||||
    setProgress (progress: number|null): void {
 | 
			
		||||
        this.progress.next(progress)
 | 
			
		||||
        if (progress) {
 | 
			
		||||
            if (this.progressClearTimeout) {
 | 
			
		||||
                clearTimeout(this.progressClearTimeout)
 | 
			
		||||
            }
 | 
			
		||||
            this.progressClearTimeout = setTimeout(() => {
 | 
			
		||||
                this.setProgress(null)
 | 
			
		||||
            }, 5000) as any
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Shows the acticity marker on the tab header
 | 
			
		||||
     */
 | 
			
		||||
    displayActivity (): void {
 | 
			
		||||
        this.hasActivity = true
 | 
			
		||||
        this.activity.next(true)
 | 
			
		||||
        if (!this.hasActivity) {
 | 
			
		||||
            this.hasActivity = true
 | 
			
		||||
            this.activity.next(true)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the acticity marker from the tab header
 | 
			
		||||
     */
 | 
			
		||||
    clearActivity (): void {
 | 
			
		||||
        this.hasActivity = false
 | 
			
		||||
        this.activity.next(false)
 | 
			
		||||
        if (this.hasActivity) {
 | 
			
		||||
            this.hasActivity = false
 | 
			
		||||
            this.activity.next(false)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -132,7 +146,7 @@ export abstract class BaseTabComponent extends BaseComponent {
 | 
			
		||||
     * @return JSON serializable tab state representation
 | 
			
		||||
     *         for your [[TabRecoveryProvider]] to parse
 | 
			
		||||
     */
 | 
			
		||||
    async getRecoveryToken (): Promise<RecoveryToken|null> {
 | 
			
		||||
    async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise<RecoveryToken|null> { // eslint-disable-line @typescript-eslint/no-unused-vars
 | 
			
		||||
        return null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								tabby-core/src/components/profileIcon.component.pug
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								tabby-core/src/components/profileIcon.component.pug
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
i.icon(
 | 
			
		||||
    class='fa-fw {{icon}}',
 | 
			
		||||
    [style.color]='color',
 | 
			
		||||
    *ngIf='!isHTML'
 | 
			
		||||
)
 | 
			
		||||
.icon(
 | 
			
		||||
    [fastHtmlBind]='icon',
 | 
			
		||||
    *ngIf='isHTML'
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										15
									
								
								tabby-core/src/components/profileIcon.component.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								tabby-core/src/components/profileIcon.component.scss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
:host {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    max-width: 1.25rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::ng-deep img {
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    max-height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::ng-deep svg {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								tabby-core/src/components/profileIcon.component.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								tabby-core/src/components/profileIcon.component.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
 | 
			
		||||
import { Component, Input } from '@angular/core'
 | 
			
		||||
import { BaseComponent } from './base.component'
 | 
			
		||||
 | 
			
		||||
/** @hidden */
 | 
			
		||||
@Component({
 | 
			
		||||
    selector: 'profile-icon',
 | 
			
		||||
    template: require('./profileIcon.component.pug'),
 | 
			
		||||
    styles: [require('./profileIcon.component.scss')],
 | 
			
		||||
})
 | 
			
		||||
export class ProfileIconComponent extends BaseComponent {
 | 
			
		||||
    @Input() icon?: string
 | 
			
		||||
    @Input() color?: string
 | 
			
		||||
 | 
			
		||||
    get isHTML (): boolean {
 | 
			
		||||
        return this.icon?.startsWith('<') ?? false
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2,5 +2,5 @@
 | 
			
		||||
    input.form-control(type='text', #input, [(ngModel)]='value', (keyup.enter)='save()', autofocus)
 | 
			
		||||
 | 
			
		||||
.modal-footer
 | 
			
		||||
    button.btn.btn-primary((click)='save()') Save
 | 
			
		||||
    button.btn.btn-secondary((click)='close()') Cancel
 | 
			
		||||
    button.btn.btn-primary((click)='save()', translate) Save
 | 
			
		||||
    button.btn.btn-secondary((click)='close()', translate) Cancel
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
.modal-body
 | 
			
		||||
    .alert.alert-danger Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:
 | 
			
		||||
    .alert.alert-danger(translate) Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:
 | 
			
		||||
 | 
			
		||||
    pre {{error}}
 | 
			
		||||
 | 
			
		||||
.modal-footer
 | 
			
		||||
    button.btn.btn-primary((click)='close()') Close
 | 
			
		||||
    button.btn.btn-primary((click)='close()', translate) Close
 | 
			
		||||
 
 | 
			
		||||
@@ -8,21 +8,25 @@
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    .list-group.list-group-light(*ngIf='filteredOptions.length')
 | 
			
		||||
        a.list-group-item.list-group-item-action.d-flex.align-items-center(
 | 
			
		||||
            #item,
 | 
			
		||||
            (click)='selectOption(option)',
 | 
			
		||||
            [class.active]='selectedIndex == i',
 | 
			
		||||
            *ngFor='let option of filteredOptions; let i = index'
 | 
			
		||||
        )
 | 
			
		||||
            i.icon(
 | 
			
		||||
                class='fa-fw {{option.icon}}',
 | 
			
		||||
                style='color: {{option.color}}',
 | 
			
		||||
                *ngIf='!iconIsSVG(option.icon)'
 | 
			
		||||
        ng-container(*ngFor='let option of filteredOptions; let i = index')
 | 
			
		||||
            label.group-header(
 | 
			
		||||
                *ngIf='hasGroups && option.group !== filteredOptions[i - 1]?.group'
 | 
			
		||||
            ) {{option.group}}
 | 
			
		||||
            a.list-group-item.list-group-item-action.d-flex.align-items-center(
 | 
			
		||||
                #item,
 | 
			
		||||
                (click)='selectOption(option)',
 | 
			
		||||
                [class.active]='selectedIndex == i'
 | 
			
		||||
            )
 | 
			
		||||
            .icon(
 | 
			
		||||
                [fastHtmlBind]='option.icon',
 | 
			
		||||
                style='color: {{option.color}}',
 | 
			
		||||
                *ngIf='iconIsSVG(option.icon)'
 | 
			
		||||
            )
 | 
			
		||||
            .title.mr-2 {{getOptionText(option)}}
 | 
			
		||||
            .description.no-wrap.text-muted {{option.description}}
 | 
			
		||||
                profile-icon(
 | 
			
		||||
                    [icon]='option.icon',
 | 
			
		||||
                    [color]='option.color'
 | 
			
		||||
                )
 | 
			
		||||
                .title.mr-2 {{getOptionText(option)}}
 | 
			
		||||
                .description.no-wrap.text-muted {{option.description}}
 | 
			
		||||
                .ml-auto
 | 
			
		||||
                .no-wrap.badge.badge-secondary.text-muted.ml-2(*ngIf='selectedIndex == i && canEditSelected()')
 | 
			
		||||
                    span Backspace
 | 
			
		||||
                    i.fas.fa-pencil.ml-1
 | 
			
		||||
                .no-wrap.badge.badge-secondary.text-muted.ml-2(*ngIf='selectedIndex == i')
 | 
			
		||||
                    span Enter
 | 
			
		||||
                    i.fas.fa-arrow-right.ml-1
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,17 @@
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
    border-top-left-radius: 0;
 | 
			
		||||
    border-top-right-radius: 0;
 | 
			
		||||
    padding: 10px 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.group-header {
 | 
			
		||||
    padding: 0 1rem;
 | 
			
		||||
    margin: 15px 0 10px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
 | 
			
		||||
    &:first-child {
 | 
			
		||||
        margin-top: 5px;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.icon {
 | 
			
		||||
@@ -25,4 +36,5 @@
 | 
			
		||||
 | 
			
		||||
input {
 | 
			
		||||
    border-radius: 0;
 | 
			
		||||
    border: none;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { firstBy } from 'thenby'
 | 
			
		||||
import { Component, Input, HostListener, ViewChildren, QueryList, ElementRef } from '@angular/core' // eslint-disable-line @typescript-eslint/no-unused-vars
 | 
			
		||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
 | 
			
		||||
import { SelectorOption } from '../api/selector'
 | 
			
		||||
@@ -14,6 +15,7 @@ export class SelectorModalComponent<T> {
 | 
			
		||||
    @Input() filter = ''
 | 
			
		||||
    @Input() name: string
 | 
			
		||||
    @Input() selectedIndex = 0
 | 
			
		||||
    hasGroups = false
 | 
			
		||||
    @ViewChildren('item') itemChildren: QueryList<ElementRef>
 | 
			
		||||
 | 
			
		||||
    constructor (
 | 
			
		||||
@@ -22,14 +24,17 @@ export class SelectorModalComponent<T> {
 | 
			
		||||
 | 
			
		||||
    ngOnInit (): void {
 | 
			
		||||
        this.onFilterChange()
 | 
			
		||||
        this.hasGroups = this.options.some(x => x.group)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @HostListener('keyup', ['$event']) onKeyUp (event: KeyboardEvent): void {
 | 
			
		||||
    @HostListener('keydown', ['$event']) onKeyUp (event: KeyboardEvent): void {
 | 
			
		||||
        if (event.key === 'ArrowUp') {
 | 
			
		||||
            this.selectedIndex--
 | 
			
		||||
            event.preventDefault()
 | 
			
		||||
        }
 | 
			
		||||
        if (event.key === 'ArrowDown') {
 | 
			
		||||
            this.selectedIndex++
 | 
			
		||||
            event.preventDefault()
 | 
			
		||||
        }
 | 
			
		||||
        if (event.key === 'Enter') {
 | 
			
		||||
            this.selectOption(this.filteredOptions[this.selectedIndex])
 | 
			
		||||
@@ -37,6 +42,10 @@ export class SelectorModalComponent<T> {
 | 
			
		||||
        if (event.key === 'Escape') {
 | 
			
		||||
            this.close()
 | 
			
		||||
        }
 | 
			
		||||
        if (event.key === 'Backspace' && this.canEditSelected()) {
 | 
			
		||||
            this.filter = this.filteredOptions[this.selectedIndex].freeInputEquivalent!
 | 
			
		||||
            this.onFilterChange()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.selectedIndex = (this.selectedIndex + this.filteredOptions.length) % this.filteredOptions.length
 | 
			
		||||
        Array.from(this.itemChildren)[this.selectedIndex]?.nativeElement.scrollIntoView({
 | 
			
		||||
@@ -48,16 +57,26 @@ export class SelectorModalComponent<T> {
 | 
			
		||||
    onFilterChange (): void {
 | 
			
		||||
        const f = this.filter.trim().toLowerCase()
 | 
			
		||||
        if (!f) {
 | 
			
		||||
            this.filteredOptions = this.options.filter(x => !x.freeInputPattern)
 | 
			
		||||
            this.filteredOptions = this.options.slice().sort(
 | 
			
		||||
                firstBy<SelectorOption<T>, number>(x => x.weight ?? 0)
 | 
			
		||||
                    .thenBy<SelectorOption<T>, string>(x => x.group ?? '')
 | 
			
		||||
                    .thenBy<SelectorOption<T>, string>(x => x.name)
 | 
			
		||||
            )
 | 
			
		||||
                .filter(x => !x.freeInputPattern)
 | 
			
		||||
        } else {
 | 
			
		||||
            const terms = f.split(' ')
 | 
			
		||||
            // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
 | 
			
		||||
            this.filteredOptions = this.options.filter(x => x.freeInputPattern ?? terms.every(term => (x.name + (x.description ?? '')).toLowerCase().includes(term)))
 | 
			
		||||
            this.filteredOptions = this.options.filter(x => x.freeInputPattern ?? this.filterMatches(x, terms))
 | 
			
		||||
        }
 | 
			
		||||
        this.selectedIndex = Math.max(0, this.selectedIndex)
 | 
			
		||||
        this.selectedIndex = Math.min(this.filteredOptions.length - 1, this.selectedIndex)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    filterMatches (option: SelectorOption<T>, terms: string[]): boolean {
 | 
			
		||||
        const content = (option.group ?? '') + option.name + (option.description ?? '')
 | 
			
		||||
        return terms.every(term => content.toLowerCase().includes(term))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getOptionText (option: SelectorOption<T>): string {
 | 
			
		||||
        if (option.freeInputPattern) {
 | 
			
		||||
            return option.freeInputPattern.replace('%s', this.filter)
 | 
			
		||||
@@ -70,11 +89,11 @@ export class SelectorModalComponent<T> {
 | 
			
		||||
        this.modalInstance.close(option.result)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    canEditSelected (): boolean {
 | 
			
		||||
        return !this.filter && !!this.filteredOptions[this.selectedIndex].freeInputEquivalent && this.options.some(x => x.freeInputPattern)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close (): void {
 | 
			
		||||
        this.modalInstance.dismiss()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    iconIsSVG (icon?: string): boolean {
 | 
			
		||||
        return icon?.startsWith('<') ?? false
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,15 @@
 | 
			
		||||
import { Observable, Subject } from 'rxjs'
 | 
			
		||||
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy } from '@angular/core'
 | 
			
		||||
import { BaseTabComponent, BaseTabProcess } from './baseTab.component'
 | 
			
		||||
import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component'
 | 
			
		||||
import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
 | 
			
		||||
import { TabsService, NewTabParameters } from '../services/tabs.service'
 | 
			
		||||
import { HotkeysService } from '../services/hotkeys.service'
 | 
			
		||||
import { TabRecoveryService } from '../services/tabRecovery.service'
 | 
			
		||||
import { ConfigService } from '../api'
 | 
			
		||||
 | 
			
		||||
export type SplitOrientation = 'v' | 'h'
 | 
			
		||||
export type SplitDirection = 'r' | 't' | 'b' | 'l'
 | 
			
		||||
export type ResizeDirection = 'v' | 'h' | 'dv' | 'dh'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Describes a horizontal or vertical split row or column
 | 
			
		||||
@@ -82,6 +84,18 @@ export class SplitContainer {
 | 
			
		||||
        this.ratios = this.ratios.map(x => x / s)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Makes all tabs have the same size
 | 
			
		||||
     */
 | 
			
		||||
    equalize (): void {
 | 
			
		||||
        for (const child of this.children) {
 | 
			
		||||
            if (child instanceof SplitContainer) {
 | 
			
		||||
                child.equalize()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.ratios.fill(1 / this.ratios.length)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the left/top side offset for the given element index (between 0 and 1)
 | 
			
		||||
     */
 | 
			
		||||
@@ -93,13 +107,13 @@ export class SplitContainer {
 | 
			
		||||
        return s
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async serialize (tabsRecovery: TabRecoveryService): Promise<RecoveryToken> {
 | 
			
		||||
    async serialize (tabsRecovery: TabRecoveryService, options?: GetRecoveryTokenOptions): Promise<RecoveryToken> {
 | 
			
		||||
        const children: any[] = []
 | 
			
		||||
        for (const child of this.children) {
 | 
			
		||||
            if (child instanceof SplitContainer) {
 | 
			
		||||
                children.push(await child.serialize(tabsRecovery))
 | 
			
		||||
                children.push(await child.serialize(tabsRecovery, options))
 | 
			
		||||
            } else {
 | 
			
		||||
                children.push(await tabsRecovery.getFullRecoveryToken(child))
 | 
			
		||||
                children.push(await tabsRecovery.getFullRecoveryToken(child, options))
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return {
 | 
			
		||||
@@ -238,6 +252,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
        private hotkeys: HotkeysService,
 | 
			
		||||
        private tabsService: TabsService,
 | 
			
		||||
        private tabRecovery: TabRecoveryService,
 | 
			
		||||
        private config: ConfigService,
 | 
			
		||||
    ) {
 | 
			
		||||
        super()
 | 
			
		||||
        this.root = new SplitContainer()
 | 
			
		||||
@@ -253,6 +268,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
        })
 | 
			
		||||
        this.blurred$.subscribe(() => this.getAllTabs().forEach(x => x.emitBlurred()))
 | 
			
		||||
 | 
			
		||||
        this.tabAdded$.subscribe(() => this.updateTitle())
 | 
			
		||||
        this.tabRemoved$.subscribe(() => this.updateTitle())
 | 
			
		||||
 | 
			
		||||
        this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => {
 | 
			
		||||
            if (!this.hasFocus || !this.focusedTab) {
 | 
			
		||||
                return
 | 
			
		||||
@@ -298,6 +316,18 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
                case 'close-pane':
 | 
			
		||||
                    this.removeTab(this.focusedTab)
 | 
			
		||||
                    break
 | 
			
		||||
                case 'pane-increase-vertical':
 | 
			
		||||
                    this.resizePane('v')
 | 
			
		||||
                    break
 | 
			
		||||
                case 'pane-decrease-vertical':
 | 
			
		||||
                    this.resizePane('dv')
 | 
			
		||||
                    break
 | 
			
		||||
                case 'pane-increase-horizontal':
 | 
			
		||||
                    this.resizePane('h')
 | 
			
		||||
                    break
 | 
			
		||||
                case 'pane-decrease-horizontal':
 | 
			
		||||
                    this.resizePane('dh')
 | 
			
		||||
                    break
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
@@ -305,7 +335,8 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
    /** @hidden */
 | 
			
		||||
    async ngAfterViewInit (): Promise<void> {
 | 
			
		||||
        if (this._recoveredState) {
 | 
			
		||||
            await this.recoverContainer(this.root, this._recoveredState, this._recoveredState.duplicate)
 | 
			
		||||
            await this.recoverContainer(this.root, this._recoveredState)
 | 
			
		||||
            this.updateTitle()
 | 
			
		||||
            this.layout()
 | 
			
		||||
            setTimeout(() => {
 | 
			
		||||
                if (this.hasFocus) {
 | 
			
		||||
@@ -445,6 +476,8 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
            this.attachTabView(tab)
 | 
			
		||||
            this.onAfterTabAdded(tab)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.root.normalize()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    removeTab (tab: BaseTabComponent): void {
 | 
			
		||||
@@ -483,6 +516,76 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
        newTab.parent = this
 | 
			
		||||
        this.recoveryStateChangedHint.next()
 | 
			
		||||
        this.onAfterTabAdded(newTab)
 | 
			
		||||
        this.updateTitle()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
      * Changes the size of the focused pane in the given direction
 | 
			
		||||
      */
 | 
			
		||||
    resizePane (direction: ResizeDirection): void {
 | 
			
		||||
        const resizeStep = this.config.store.terminal.paneResizeStep
 | 
			
		||||
 | 
			
		||||
        // The direction of the resize pane, vertically or horizontally
 | 
			
		||||
        let directionvh: SplitOrientation = 'h'
 | 
			
		||||
 | 
			
		||||
        const isDecreasing: boolean = direction === 'dv' || direction === 'dh'
 | 
			
		||||
 | 
			
		||||
        if (direction === 'dh') {
 | 
			
		||||
            directionvh = 'h'
 | 
			
		||||
        }
 | 
			
		||||
        if (direction === 'dv') {
 | 
			
		||||
            directionvh = 'v'
 | 
			
		||||
        }
 | 
			
		||||
        if (direction === 'h') {
 | 
			
		||||
            directionvh = 'h'
 | 
			
		||||
        }
 | 
			
		||||
        if (direction === 'v') {
 | 
			
		||||
            directionvh = 'v'
 | 
			
		||||
        }
 | 
			
		||||
        if (!this.focusedTab) {
 | 
			
		||||
            console.debug('No currently focused tab')
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let currentContainer: BaseTabComponent | SplitContainer = this.focusedTab
 | 
			
		||||
        let child: BaseTabComponent | SplitContainer | null = this.focusedTab
 | 
			
		||||
        let curSplitOrientation: SplitOrientation | null = null
 | 
			
		||||
 | 
			
		||||
        // Find the first split that is in the orientations that the user chooses to change
 | 
			
		||||
        while (curSplitOrientation !== directionvh) {
 | 
			
		||||
            const parentContainer = this.getParentOf(currentContainer)
 | 
			
		||||
            if (!parentContainer) {
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            child = currentContainer
 | 
			
		||||
            currentContainer = parentContainer
 | 
			
		||||
            if (currentContainer instanceof SplitContainer) {
 | 
			
		||||
                curSplitOrientation = currentContainer.orientation
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!(currentContainer instanceof SplitContainer)) {
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Determine which index in the ratios refers to the child that will be modified
 | 
			
		||||
        const currentChildIndex = currentContainer.children.indexOf(child)
 | 
			
		||||
 | 
			
		||||
        let updatedRatio = 0
 | 
			
		||||
        if (isDecreasing) {
 | 
			
		||||
            updatedRatio = currentContainer.ratios[currentChildIndex] - resizeStep
 | 
			
		||||
            if (updatedRatio < 0) {
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            updatedRatio = currentContainer.ratios[currentChildIndex] + resizeStep
 | 
			
		||||
            if (updatedRatio > 1) {
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        currentContainer.ratios[currentChildIndex] = updatedRatio
 | 
			
		||||
        this.layout()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -569,8 +672,8 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** @hidden */
 | 
			
		||||
    async getRecoveryToken (): Promise<any> {
 | 
			
		||||
        return this.root.serialize(this.tabRecovery)
 | 
			
		||||
    async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise<any> {
 | 
			
		||||
        return this.root.serialize(this.tabRecovery, options)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** @hidden */
 | 
			
		||||
@@ -612,8 +715,40 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
        this.layoutInternal(this.root, 0, 0, 100, 100)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clearActivity (): void {
 | 
			
		||||
        for (const tab of this.getAllTabs()) {
 | 
			
		||||
            tab.clearActivity()
 | 
			
		||||
        }
 | 
			
		||||
        super.clearActivity()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get icon (): string|null {
 | 
			
		||||
        return this.getFocusedTab()?.icon ?? null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set icon (icon: string|null) {
 | 
			
		||||
        for (const t of this.getAllTabs()) {
 | 
			
		||||
            t.icon = icon
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get color (): string|null {
 | 
			
		||||
        return this.getFocusedTab()?.color ?? null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set color (color: string|null) {
 | 
			
		||||
        for (const t of this.getAllTabs()) {
 | 
			
		||||
            t.color = color
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    equalize (): void {
 | 
			
		||||
        this.root.normalize()
 | 
			
		||||
        this.root.equalize()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private updateTitle (): void {
 | 
			
		||||
        this.setTitle(this.getAllTabs().map(x => x.title).join(' | '))
 | 
			
		||||
        this.setTitle([...new Set(this.getAllTabs().map(x => x.title))].join(' | '))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private attachTabView (tab: BaseTabComponent) {
 | 
			
		||||
@@ -783,7 +918,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private async recoverContainer (root: SplitContainer, state: any, duplicate = false) {
 | 
			
		||||
    private async recoverContainer (root: SplitContainer, state: any) {
 | 
			
		||||
        const children: (SplitContainer | BaseTabComponent)[] = []
 | 
			
		||||
        root.orientation = state.orientation
 | 
			
		||||
        root.ratios = state.ratios
 | 
			
		||||
@@ -794,10 +929,10 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
 | 
			
		||||
            }
 | 
			
		||||
            if (childState.type === 'app:split-tab') {
 | 
			
		||||
                const child = new SplitContainer()
 | 
			
		||||
                await this.recoverContainer(child, childState, duplicate)
 | 
			
		||||
                await this.recoverContainer(child, childState)
 | 
			
		||||
                children.push(child)
 | 
			
		||||
            } else {
 | 
			
		||||
                const recovered = await this.tabRecovery.recoverTab(childState, duplicate)
 | 
			
		||||
                const recovered = await this.tabRecovery.recoverTab(childState)
 | 
			
		||||
                if (recovered) {
 | 
			
		||||
                    const tab = this.tabsService.create(recovered)
 | 
			
		||||
                    children.push(tab)
 | 
			
		||||
@@ -828,11 +963,4 @@ export class SplitTabRecoveryProvider extends TabRecoveryProvider<SplitTabCompon
 | 
			
		||||
            inputs: { _recoveredState: recoveryToken },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    duplicate (recoveryToken: RecoveryToken): RecoveryToken {
 | 
			
		||||
        return {
 | 
			
		||||
            ...recoveryToken,
 | 
			
		||||
            duplicate: true,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ import { Component, Input, HostBinding, ElementRef, Output, EventEmitter } from
 | 
			
		||||
import { AppService } from '../services/app.service'
 | 
			
		||||
import { BaseTabComponent } from './baseTab.component'
 | 
			
		||||
import { SelfPositioningComponent } from './selfPositioning.component'
 | 
			
		||||
import { SplitDropZoneInfo } from './splitTab.component'
 | 
			
		||||
import { SplitDropZoneInfo, SplitTabComponent } from './splitTab.component'
 | 
			
		||||
 | 
			
		||||
/** @hidden */
 | 
			
		||||
@Component({
 | 
			
		||||
@@ -22,7 +22,7 @@ import { SplitDropZoneInfo } from './splitTab.component'
 | 
			
		||||
})
 | 
			
		||||
export class SplitTabDropZoneComponent extends SelfPositioningComponent {
 | 
			
		||||
    @Input() dropZone: SplitDropZoneInfo
 | 
			
		||||
    @Input() parent: BaseTabComponent
 | 
			
		||||
    @Input() parent: SplitTabComponent
 | 
			
		||||
    @Output() tabDropped = new EventEmitter<BaseTabComponent>()
 | 
			
		||||
    @HostBinding('class.active') isActive = false
 | 
			
		||||
    @HostBinding('class.highlighted') isHighlighted = false
 | 
			
		||||
@@ -34,11 +34,21 @@ export class SplitTabDropZoneComponent extends SelfPositioningComponent {
 | 
			
		||||
    ) {
 | 
			
		||||
        super(element)
 | 
			
		||||
        this.subscribeUntilDestroyed(app.tabDragActive$, tab => {
 | 
			
		||||
            this.isActive = !!tab && tab !== this.parent && (this.dropZone.type === 'relative' || tab !== this.dropZone.container.children[this.dropZone.position])
 | 
			
		||||
            this.isActive = !!tab && this.canActivateFor(tab)
 | 
			
		||||
            this.layout()
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    canActivateFor (tab: BaseTabComponent): boolean {
 | 
			
		||||
        const allTabs = this.parent.getAllTabs()
 | 
			
		||||
        return !(
 | 
			
		||||
            tab === this.parent ||
 | 
			
		||||
            allTabs.length === 1 && allTabs.includes(tab) ||
 | 
			
		||||
            this.dropZone.type === 'relative' && tab === this.dropZone.relativeTo ||
 | 
			
		||||
            this.dropZone.type === 'absolute' && tab === this.dropZone.container.children[this.dropZone.position]
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ngOnChanges () {
 | 
			
		||||
        this.layout()
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,8 @@
 | 
			
		||||
div {
 | 
			
		||||
    background: rgba(0, 0, 0, .7);
 | 
			
		||||
    padding: 20px 30px;
 | 
			
		||||
    font-size: 18px;
 | 
			
		||||
    margin: 20px;
 | 
			
		||||
    font-size: 16px;
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ div
 | 
			
		||||
    h1.tabby-title Tabby
 | 
			
		||||
        sup α
 | 
			
		||||
 | 
			
		||||
    .list-group.list-group-light
 | 
			
		||||
    .list-group.mb-4
 | 
			
		||||
        a.list-group-item.list-group-item-action.d-flex(
 | 
			
		||||
            *ngFor='let button of getButtons(); trackBy: buttonsTrackBy',
 | 
			
		||||
            (click)='button.click()',
 | 
			
		||||
@@ -18,6 +18,9 @@ footer.d-flex.align-items-center
 | 
			
		||||
            span GitHub
 | 
			
		||||
        button.btn.btn-dark((click)='homeBase.reportBug()')
 | 
			
		||||
            i.fas.fa-bug
 | 
			
		||||
            span Report a problem
 | 
			
		||||
            span(translate) Report a problem
 | 
			
		||||
 | 
			
		||||
    .form-control-static.selectable.no-drag Version: {{homeBase.appVersion}}
 | 
			
		||||
    .form-control-static.selectable.no-drag(
 | 
			
		||||
        translate='Version: {version}',
 | 
			
		||||
        [translateParams]='{ version: this.homeBase.appVersion }'
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ export class StartPageComponent {
 | 
			
		||||
        return this.config.enabledServices(this.toolbarButtonProviders)
 | 
			
		||||
            .map(provider => provider.provide())
 | 
			
		||||
            .reduce((a, b) => a.concat(b))
 | 
			
		||||
            .filter(x => x.showInStartPage ?? true)
 | 
			
		||||
            .filter(x => !!x.click)
 | 
			
		||||
            .sort((a: ToolbarButton, b: ToolbarButton) => (a.weight ?? 0) - (b.weight ?? 0))
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user