Compare commits

...

203 Commits

Author SHA1 Message Date
Eugene Pankov
c64654991b fixed serial opening ports 2022-02-11 11:02:29 +01:00
Eugene Pankov
1fc531ecf4 locale update 2022-02-10 22:54:37 +01:00
Eugene Pankov
4c7e7f5fae new translation extractor 2022-02-10 22:33:14 +01:00
Eugene Pankov
7b07a67947 sorted messages, cleaned up translateParams attributes 2022-02-10 19:10:38 +01:00
Eugene Pankov
fe5193d9f1 use languages' native names 2022-02-10 18:03:26 +01:00
Eugene Pankov
b6a3af80fa lint 2022-02-10 16:31:03 +01:00
Eugene Pankov
46a9b655fc locale updates, added Italian 2022-02-10 16:24:24 +01:00
Eugene Pankov
762ee85773 lint 2022-02-10 09:48:31 +01:00
Eugene Pankov
650e362c42 lint 2022-02-09 22:27:19 +01:00
Eugene Pankov
136ec1035b fixed #5702 - added hotkeys to jump to settings tabs 2022-02-09 21:56:44 +01:00
Eugene Pankov
f27e1ec62d fixed tab rearranging conditions 2022-02-09 20:30:40 +01:00
Eugene Pankov
c736a84835 avoid duplicate title in split tab's title 2022-02-09 20:21:20 +01:00
Eugene Pankov
b3a07e5f99 fixed #5712 - SSH import from a separate config file 2022-02-09 20:19:07 +01:00
Eugene Pankov
c408154137 Merge branch 'master' of github.com:Eugeny/tabby 2022-02-09 20:18:55 +01:00
Eugene Pankov
c0988e58b4 Revert "prevent dropping a tab on itself - fixes #5580"
This reverts commit ceb1b59409.
2022-02-09 19:20:45 +01:00
Eugeny
d6e906c107 Merge pull request #5654 from Eugeny/dependabot/npm_and_yarn/node-abi-3.8.0 2022-02-08 09:01:37 +01:00
Eugeny
d77a91b3e1 Merge pull request #5693 from Eugeny/dependabot/npm_and_yarn/fortawesome/fontawesome-free-6.0.0 2022-02-08 09:01:14 +01:00
dependabot[bot]
80f82296a0 Bump @fortawesome/fontawesome-free from 6.0.0-beta3 to 6.0.0
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 6.0.0-beta3 to 6.0.0.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/commits/6.0.0)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-free"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-08 04:03:22 +00:00
Eugene Pankov
6e9f497d22 lint 2022-02-07 17:54:44 +01:00
Eugene Pankov
50f01b6794 bumped serialport 2022-02-07 16:56:06 +01:00
dependabot[bot]
b068070825 Bump node-abi from 3.7.0 to 3.8.0
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Changelog](https://github.com/electron/node-abi/blob/main/.releaserc.json)
- [Commits](https://github.com/lgeiger/node-abi/compare/v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: node-abi
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 15:38:25 +00:00
Eugene Pankov
194342d6fa bumped plugins, added serialport mocks 2022-02-07 16:36:20 +01:00
Eugene Pankov
d7eeac6af7 patch rename 2022-02-07 16:36:09 +01:00
Eugene Pankov
98a08b92a2 Merge branch 'master' of github.com:Eugeny/tabby 2022-02-07 16:35:11 +01:00
Eugeny
fef8638ade Merge pull request #5679 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.14.13 2022-02-07 16:35:03 +01:00
Eugeny
34ff0c45cb Merge pull request #5653 from Eugeny/dependabot/npm_and_yarn/app/keytar-7.8.0 2022-02-07 16:34:35 +01:00
Eugeny
1896155ad9 Merge pull request #5676 from Eugeny/dependabot/npm_and_yarn/app/electron-updater-4.6.5 2022-02-07 16:32:46 +01:00
Eugeny
bbcbad0e77 Merge pull request #5684 from Eugeny/all-contributors/add-mwz 2022-02-07 16:32:05 +01:00
Eugeny
ce435056a2 Merge pull request #5670 from mwz/quit-app-cmd-q-mac 2022-02-07 16:31:35 +01:00
allcontributors[bot]
fe9b14ad9c docs: update .all-contributorsrc [skip ci] 2022-02-07 15:31:08 +00:00
allcontributors[bot]
fc72e5005c docs: update README.ko-KR.md [skip ci] 2022-02-07 15:31:07 +00:00
allcontributors[bot]
f5c428d73b docs: update README.ru-RU.md [skip ci] 2022-02-07 15:31:06 +00:00
allcontributors[bot]
b396060965 docs: update README.zh-CN.md [skip ci] 2022-02-07 15:31:05 +00:00
allcontributors[bot]
c752a18f3c docs: update README.md [skip ci] 2022-02-07 15:31:04 +00:00
Eugene Pankov
805ee0af09 v1.0.171-nightly.2 2022-02-07 15:59:48 +01:00
Eugene Pankov
ad9ad4d418 v1.0.171-nightly.2 2022-02-07 15:58:55 +01:00
Eugene Pankov
d5c4088cc1 v1.0.171-nightly.2 2022-02-07 15:57:59 +01:00
Eugene Pankov
483a0472b9 v1.0.171-nightly.2 2022-02-07 15:57:47 +01:00
Eugene Pankov
1bbf9d4294 bumped plugins 2022-02-07 15:33:34 +01:00
Eugene Pankov
10c8502fbd locale updates, added Danish 2022-02-07 15:30:05 +01:00
dependabot[bot]
8f3f6f591d Bump electron-builder from 22.14.5 to 22.14.13
Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 22.14.5 to 22.14.13.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/v22.14.13/packages/electron-builder)

---
updated-dependencies:
- dependency-name: electron-builder
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 04:06:53 +00:00
dependabot[bot]
656d275801 Bump electron-updater from 4.6.1 to 4.6.5 in /app
Bumps [electron-updater](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater) from 4.6.1 to 4.6.5.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/electron-updater@4.6.5/packages/electron-updater)

---
updated-dependencies:
- dependency-name: electron-updater
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 04:01:59 +00:00
Michael Wizner
9c53503c0f Fix app not quitting completely on Cmd+Q (Mac) 2022-02-05 23:07:53 +00:00
Eugene Pankov
9ea99f1ace locale update 2022-02-05 17:21:41 +01:00
Eugene Pankov
126d14dfb7 added Japanese translation 2022-02-05 17:20:23 +01:00
Eugene Pankov
68803b5f14 locale update 2022-02-05 17:20:10 +01:00
Eugene Pankov
e0273126de bumped xterm-addon-webgl 2022-02-03 18:33:09 +01:00
Eugene Pankov
0ced498b6e fixed screen not clearing properly - fixes #28, fixes #5401 2022-02-03 17:54:26 +01:00
Eugene Pankov
510682438e bumped xterm 2022-02-03 17:12:52 +01:00
dependabot[bot]
762874c400 Bump keytar from 7.7.0 to 7.8.0 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 7.7.0 to 7.8.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v7.7.0...v7.8.0)

---
updated-dependencies:
- dependency-name: keytar
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-03 04:02:03 +00:00
Eugene Pankov
b7e2e0875e electron 17 fixes 2022-02-01 22:47:07 +01:00
Eugene Pankov
9cfd02bff6 Update appRoot.component.ts 2022-02-01 22:11:39 +01:00
Eugeny
9082fe5c06 Merge pull request #5638 from Eugeny/dependabot/npm_and_yarn/electron-17.0.0 2022-02-01 12:12:04 +01:00
dependabot[bot]
43786fda83 Bump electron from 16.0.8 to 17.0.0
Bumps [electron](https://github.com/electron/electron) from 16.0.8 to 17.0.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v16.0.8...v17.0.0)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 10:33:18 +00:00
Eugene Pankov
1677285ea9 patch rename 2022-02-01 11:24:12 +01:00
Eugeny
aaa0a0f69a Merge pull request #5639 from Eugeny/dependabot/npm_and_yarn/ssh2-1.6.0 2022-02-01 11:23:35 +01:00
Eugeny
cb8832fbad Merge pull request #5637 from Eugeny/dependabot/npm_and_yarn/node-abi-3.7.0 2022-02-01 11:22:09 +01:00
Eugeny
e39321c8cb Merge pull request #5640 from Eugeny/dependabot/npm_and_yarn/webpack-5.68.0 2022-02-01 11:21:52 +01:00
Eugeny
3ef7697be8 Merge pull request #5642 from Eugeny/dependabot/npm_and_yarn/tabby-settings/marked-4.0.12 2022-02-01 11:21:37 +01:00
dependabot[bot]
8927717654 Bump marked from 4.0.10 to 4.0.12 in /tabby-settings
Bumps [marked](https://github.com/markedjs/marked) from 4.0.10 to 4.0.12.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.10...v4.0.12)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 04:16:28 +00:00
dependabot[bot]
3a8168917a Bump webpack from 5.67.0 to 5.68.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.67.0 to 5.68.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.67.0...v5.68.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 04:08:23 +00:00
dependabot[bot]
9249c48ecc Bump ssh2 from 1.5.0 to 1.6.0
Bumps [ssh2](https://github.com/mscdex/ssh2) from 1.5.0 to 1.6.0.
- [Release notes](https://github.com/mscdex/ssh2/releases)
- [Commits](https://github.com/mscdex/ssh2/compare/v1.5.0...v1.6.0)

---
updated-dependencies:
- dependency-name: ssh2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 04:05:50 +00:00
dependabot[bot]
6d1150d08a Bump node-abi from 3.5.0 to 3.7.0
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 3.5.0 to 3.7.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Changelog](https://github.com/electron/node-abi/blob/main/.releaserc.json)
- [Commits](https://github.com/lgeiger/node-abi/compare/v3.5.0...v3.7.0)

---
updated-dependencies:
- dependency-name: node-abi
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 04:04:21 +00:00
Eugene Pankov
b234300bd8 gpg4win support maybe? 2022-01-31 22:19:39 +01:00
Eugene Pankov
be3bae3a6f fixed #4457 2022-01-31 22:16:05 +01:00
Eugene Pankov
767f9f3215 support Solus Linux - fixes #4881 2022-01-31 22:03:12 +01:00
Eugene Pankov
d6e69f5bf5 fixed UI for oversized profile names - fixes #5506 2022-01-31 21:54:33 +01:00
Eugene Pankov
5c644e5e23 Merge branch 'master' of github.com:Eugeny/tabby 2022-01-31 21:50:19 +01:00
Eugene Pankov
5b905af5d3 auto-fix excessive font sizes - fixes #5542 2022-01-31 21:50:16 +01:00
Eugeny
28f4a052d7 Merge pull request #5626 from Eugeny/dependabot/npm_and_yarn/tabby-electron/winston-3.5.0 2022-01-31 17:20:28 +01:00
Eugeny
948251e326 Merge pull request #5607 from Eugeny/dependabot/npm_and_yarn/tabby-settings/marked-4.0.12 2022-01-31 17:17:53 +01:00
dependabot[bot]
2203661f19 Bump marked from 4.0.8 to 4.0.12 in /tabby-settings
Bumps [marked](https://github.com/markedjs/marked) from 4.0.8 to 4.0.12.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.8...v4.0.12)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-31 15:38:34 +00:00
Eugene Pankov
8f4e28fba4 bumped plugins 2022-01-31 16:37:43 +01:00
Eugeny
a413bbaf07 Merge pull request #4632 from Eugeny/dependabot/npm_and_yarn/types/fs-extra-9.0.13 2022-01-31 12:44:29 +01:00
Eugeny
4e05adeb66 Merge pull request #5595 from Eugeny/dependabot/npm_and_yarn/sentry/cli-1.72.1 2022-01-31 12:43:51 +01:00
Eugeny
59ac4a858e Merge pull request #5539 from Eugeny/dependabot/npm_and_yarn/axios-0.25.0 2022-01-31 12:32:23 +01:00
Eugeny
55ae5b27b9 Merge pull request #5500 from Eugeny/dependabot/npm_and_yarn/core-js-3.20.3 2022-01-31 12:32:11 +01:00
Eugeny
b0aa20b387 Merge pull request #5521 from Eugeny/dependabot/npm_and_yarn/typedoc-0.22.11 2022-01-31 12:31:32 +01:00
Eugene Pankov
0f01aaf44d Merge commit '8b3f4826' into tmp 2022-01-31 10:50:45 +01:00
Eugene Pankov
54531e234e Merge commit '9515245' into tmp 2022-01-31 10:25:56 +01:00
Eugene Pankov
3bda4a9871 . 2022-01-31 09:33:50 +01:00
Eugene Pankov
c7e3ab42d9 ssh: added DSA host key support - fixes #5120, fixes #3430 2022-01-31 09:22:55 +01:00
Eugene Pankov
5d2956568e .ssh: added DSA host key support - fixes #5120, fixes #3430 2022-01-31 09:00:23 +01:00
Eugene Pankov
8b3f482682 Merge branch 'master' of https://github.com/Eugeny/tabby 2022-01-30 22:08:48 +01:00
Eugene Pankov
f38f9882f8 Update ssh2+1.5.0.patch 2022-01-30 22:08:40 +01:00
Eugene Pankov
54d71adb26 debounce terminal resize events 2022-01-30 21:08:50 +01:00
Eugene Pankov
13eebd8957 locale updates 2022-01-30 21:04:49 +01:00
Eugene Pankov
6c4f8d2611 blacklisted clickable-ips 2022-01-30 21:01:49 +01:00
Eugene Pankov
897bc77d05 Update tabHeader.component.scss 2022-01-30 21:00:17 +01:00
Eugene Pankov
8b5b53ab26 added drag handles to toolbars 2022-01-30 20:58:43 +01:00
Eugene Pankov
448fe29f50 Update electron-builder.yml 2022-01-30 20:54:18 +01:00
Eugene Pankov
70ae9f875f Merge branch 'master' of github.com:Eugeny/tabby 2022-01-30 20:44:10 +01:00
Eugene Pankov
75764cd725 macOS vibrancy fixes 2022-01-30 20:43:59 +01:00
dependabot[bot]
bb00f2f033 Bump @sentry/cli from 1.71.0 to 1.72.1
Bumps [@sentry/cli](https://github.com/getsentry/sentry-cli) from 1.71.0 to 1.72.1.
- [Release notes](https://github.com/getsentry/sentry-cli/releases)
- [Changelog](https://github.com/getsentry/sentry-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-cli/compare/1.71.0...1.72.1)

---
updated-dependencies:
- dependency-name: "@sentry/cli"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-30 19:34:00 +00:00
Eugeny
5ae2d17cc8 Merge pull request #5603 from Eugeny/dependabot/npm_and_yarn/node-fetch-2.6.7 2022-01-30 20:28:57 +01:00
Eugeny
109a83db5b Merge pull request #5624 from Eugeny/dependabot/npm_and_yarn/electron-16.0.8 2022-01-30 20:27:47 +01:00
Eugene Pankov
9fe8d2a7df Create ssh2+1.5.0.patch 2022-01-30 20:22:39 +01:00
Eugene Pankov
d3bbd045dc Delete ssh2+1.5.0.patch 2022-01-30 20:22:32 +01:00
Eugene Pankov
eb0fa29fad fixed the color and title settings not getting inherited from profile defaults - fixes #5395 2022-01-30 20:03:57 +01:00
Eugene Pankov
6289229bf2 fixed the --hidden option - fixes #5396 2022-01-30 19:40:29 +01:00
Eugene Pankov
b664b9eed9 fixed repeated hotkeys canceling themselves - fixes #5406, fixes #4566 2022-01-30 17:51:21 +01:00
dependabot[bot]
e80c3ce693 Bump core-js from 3.18.2 to 3.20.3
Bumps [core-js](https://github.com/zloirock/core-js) from 3.18.2 to 3.20.3.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.18.2...v3.20.3)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-30 10:02:30 +00:00
dependabot[bot]
2569f9e322 Bump electron from 16.0.7 to 16.0.8
Bumps [electron](https://github.com/electron/electron) from 16.0.7 to 16.0.8.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v16.0.7...v16.0.8)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-30 10:02:24 +00:00
dependabot[bot]
b9b6c63d57 Bump axios from 0.21.2 to 0.25.0
Bumps [axios](https://github.com/axios/axios) from 0.21.2 to 0.25.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.2...v0.25.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-30 10:02:01 +00:00
Eugene Pankov
95152456ce ssh: added DSA host key support - fixes #5120, fixes #3430 2022-01-30 10:57:59 +01:00
Eugene Pankov
918761bbdc ssh: remember and verify host keys - fixes #2419 2022-01-30 00:24:58 +01:00
Eugene Pankov
ceb1b59409 prevent dropping a tab on itself - fixes #5580 2022-01-29 19:28:19 +01:00
Eugene Pankov
63374f532c cleaned up terminal toolbar implementation 2022-01-29 17:20:23 +01:00
Eugene Pankov
c57fe48e73 added the issue translator bot - fixes #5631 2022-01-29 15:53:42 +01:00
Eugene Pankov
02a3a8200b ssh: fixed socks proxy connection race condition - fixes #5093, fixes #5060, fixes #5632 2022-01-29 15:26:26 +01:00
Eugene Pankov
3e8e3f7ccd enable vibrancy on macOS by default 2022-01-29 15:09:58 +01:00
Eugene Pankov
1ec218775e linkifier: re-added port support 2022-01-29 00:02:10 +01:00
Eugene Pankov
cc8c200da0 updated linkifier regex - fixes #5611 2022-01-28 23:49:38 +01:00
Eugene Pankov
0a20716efd locale updates, added Spanish 2022-01-28 23:43:46 +01:00
Eugene Pankov
9893fb51a7 linkifier: fixed "no modifier", removed ctrl on macOS 2022-01-28 23:23:40 +01:00
Eugene Pankov
3466d42cb1 openssh: make option parsing case insensitive - #5559 2022-01-28 22:57:14 +01:00
Eugene Pankov
9e9066d3cd split openssh-importer into tabby-electron, support tilde in private key paths - fixes #5627 2022-01-28 22:49:52 +01:00
dependabot[bot]
bee62f3001 Bump winston from 3.3.3 to 3.5.0 in /tabby-electron
Bumps [winston](https://github.com/winstonjs/winston) from 3.3.3 to 3.5.0.
- [Release notes](https://github.com/winstonjs/winston/releases)
- [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md)
- [Commits](https://github.com/winstonjs/winston/compare/v3.3.3...v3.5.0)

---
updated-dependencies:
- dependency-name: winston
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-28 04:18:34 +00:00
Eugene Pankov
b469dd603b ssh: allow empty keyb-interactive responses - fixes #5619 2022-01-27 21:00:25 +01:00
Eugeny
f6eaff355b Merge pull request #5608 from justjavac/patch-1 2022-01-27 10:47:48 +01:00
迷渡
7ff2b31a9f docs: fix typo 2022-01-27 12:17:26 +08:00
Eugene Pankov
dbf67e77e0 Merge branch 'master' of github.com:Eugeny/tabby 2022-01-26 21:19:34 +01:00
Eugene Pankov
b45769d379 locale updates 2022-01-26 20:17:35 +01:00
Eugene Pankov
1695c0b522 fixed hotkey name localization 2022-01-26 20:17:16 +01:00
Eugeny
15d7be05f1 Merge pull request #5548 from Eugeny/dependabot/npm_and_yarn/tabby-ssh/types/ssh2-0.5.51 2022-01-26 20:11:13 +01:00
dependabot[bot]
a759c40ec8 Bump node-fetch from 2.6.1 to 2.6.7
Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7.
- [Release notes](https://github.com/node-fetch/node-fetch/releases)
- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7)

---
updated-dependencies:
- dependency-name: node-fetch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-26 19:11:07 +00:00
Eugeny
a8e977d34c Merge pull request #5565 from Eugeny/dependabot/npm_and_yarn/nanoid-3.2.0 2022-01-26 20:10:55 +01:00
Eugeny
527a951b1e Merge pull request #5576 from Eugeny/dependabot/npm_and_yarn/webpack-5.67.0 2022-01-26 20:10:46 +01:00
Eugeny
afe9c9a84c Merge pull request #5585 from Eugeny/dependabot/npm_and_yarn/webpack-cli-4.9.2 2022-01-26 20:10:17 +01:00
Eugene Pankov
372662c787 docs: added MaxWaldorf as contributor 2022-01-26 19:26:11 +01:00
Eugeny
ca9e6a118e Update .all-contributorsrc 2022-01-26 10:12:31 +01:00
Eugeny
b412bce37d Merge pull request #5591 from Qiming-Liu/patch-1 2022-01-26 10:11:46 +01:00
Alan
6622cbc550 docs: update README.zh-CN.md [skip ci]
add JasonCubic
2022-01-25 22:03:50 +10:30
dependabot[bot]
d3361b6f34 Bump webpack-cli from 4.9.1 to 4.9.2
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/webpack/webpack-cli/releases)
- [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.9.1...webpack-cli@4.9.2)

---
updated-dependencies:
- dependency-name: webpack-cli
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-25 04:04:36 +00:00
Eugene Pankov
13f715ddfd Merge branch 'master' of github.com:Eugeny/tabby 2022-01-24 15:08:28 +01:00
Eugene Pankov
ccea3572a7 locale updates 2022-01-24 15:08:21 +01:00
Eugeny
c24c752b76 Merge pull request #5578 from Eugeny/all-contributors/add-JasonCubic 2022-01-24 10:15:54 +01:00
allcontributors[bot]
8751b9831f docs: update .all-contributorsrc [skip ci] 2022-01-24 09:15:41 +00:00
Eugeny
d4d93cf236 Merge pull request #5574 from JasonCubic/master 2022-01-24 10:15:40 +01:00
allcontributors[bot]
9b305026f7 docs: update README.md [skip ci] 2022-01-24 09:15:40 +00:00
dependabot[bot]
91fcdbf9b5 Bump webpack from 5.66.0 to 5.67.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.66.0 to 5.67.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.66.0...v5.67.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-24 04:03:36 +00:00
Jason
b17e23a69e added sdras night owl themes 2022-01-23 17:10:59 -08:00
Eugene Pankov
88bbdd0da1 debounce tab progress updates 2022-01-22 14:16:59 +01:00
Eugene Pankov
53cbb8a7e3 avoid rechecking window status on every loop 2022-01-22 14:16:46 +01:00
Eugene Pankov
9df8a1b904 bumped opentype.js 2022-01-22 14:16:17 +01:00
dependabot[bot]
0a0e451e97 Bump nanoid from 3.1.23 to 3.2.0
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.23 to 3.2.0.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.23...3.2.0)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-22 02:21:37 +00:00
Eugene Pankov
5376ac0f07 updated XDG app category - fixes #5549 2022-01-20 09:13:05 +01:00
dependabot[bot]
238482932e Bump @types/ssh2 from 0.5.50 to 0.5.51 in /tabby-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.50 to 0.5.51.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)

---
updated-dependencies:
- dependency-name: "@types/ssh2"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-20 04:19:24 +00:00
Eugene Pankov
d4332ea361 Update de-DE.po 2022-01-18 23:38:44 +01:00
Eugene Pankov
eb49499f09 locale updates 2022-01-18 22:35:55 +01:00
Eugene Pankov
445a3d02da lint 2022-01-18 22:13:38 +01:00
Eugene Pankov
06e5571812 Merge branch 'master' of github.com:Eugeny/tabby 2022-01-18 22:13:15 +01:00
Eugene Pankov
510edaabb5 Update streamProcessing.ts 2022-01-18 22:12:24 +01:00
Eugene Pankov
5ef36896c5 show language selector in welcome tab 2022-01-18 22:12:19 +01:00
Eugene Pankov
5d22c15a78 locale update 2022-01-18 22:12:09 +01:00
Eugeny
a33e11502b Update feature_request.md 2022-01-18 15:10:18 +01:00
Eugeny
4c9456d98d Update issue-report.md 2022-01-18 15:09:50 +01:00
Eugene Pankov
e1ee818932 locale updates 2022-01-18 14:05:16 +01:00
Eugeny
e83210f0e6 Merge pull request #5529 from Qiming-Liu/patch-2 2022-01-18 12:26:42 +01:00
Alan
1d176047c4 Update README.zh-CN.md
A few small improves.
Correct `选项卡` to `标签页`
2022-01-18 21:49:46 +10:30
Eugeny
bd3ac21fb3 Merge pull request #5527 from Qiming-Liu/patch-1 2022-01-18 11:55:52 +01:00
Alan
559dd3955c README fix for Chinese translation
Follow the latest English README.md, update README.zh-CN.md.
2022-01-18 21:08:43 +10:30
Eugene Pankov
0ed05cb783 Merge branch 'master' of github.com:Eugeny/tabby 2022-01-18 10:46:28 +01:00
Eugene Pankov
87e8eefd49 lint 2022-01-18 10:46:25 +01:00
Eugeny
609b527a7c Merge pull request #5387 from Eugeny/dependabot/npm_and_yarn/graceful-fs-4.2.9 2022-01-18 10:37:22 +01:00
Eugene Pankov
fee163835f fixed install-deps.js 2022-01-18 10:31:07 +01:00
Eugene Pankov
c8b25cf911 locale updates 2022-01-18 10:26:49 +01:00
Eugene Pankov
eb9698fa66 locale updates 2022-01-18 10:25:32 +01:00
Eugene Pankov
eb60c3c3c6 locale fixes 2022-01-18 10:10:25 +01:00
Eugene Pankov
f2a48fc0c0 readme fix 2022-01-18 10:10:04 +01:00
Eugene Pankov
8d01a9ad8d Merge branches 'master' and 'master' of github.com:Eugeny/tabby 2022-01-18 10:07:44 +01:00
Eugeny
4d8ddba8ea Merge pull request #5526 from TimaGribanov/patch-1 2022-01-18 10:07:38 +01:00
Timofey Gribanov
91a7dd8b1d Create REAMDE.ru_RU.md
Russian README
2022-01-18 11:54:12 +03:00
dependabot[bot]
2f35ae203d Bump typedoc from 0.22.10 to 0.22.11
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.22.10 to 0.22.11.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.22.10...v0.22.11)

---
updated-dependencies:
- dependency-name: typedoc
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-18 04:09:10 +00:00
Eugene Pankov
38423eb139 ssh: enable multiplexing by default 2022-01-17 09:10:00 +01:00
Eugene Pankov
bde6fd6231 name fix 2022-01-16 20:56:10 +01:00
Eugeny
14200f848f Merge pull request #5494 from Eugeny/all-contributors/add-milotype 2022-01-16 19:44:47 +01:00
Eugene Pankov
f6895d7696 locale updates 2022-01-16 19:44:30 +01:00
Eugene Pankov
64410a9302 make script errors fatal 2022-01-16 19:41:01 +01:00
allcontributors[bot]
45274f9691 docs: update .all-contributorsrc [skip ci] 2022-01-16 18:38:23 +00:00
allcontributors[bot]
54ab2a1f03 docs: update README.md [skip ci] 2022-01-16 18:38:22 +00:00
Eugene Pankov
782128308c build fix 2022-01-16 19:36:55 +01:00
Eugeny
f2b6cdf97c Merge pull request #5492 from Eugeny/all-contributors/add-boonkerz 2022-01-16 17:30:46 +01:00
Eugeny
c025c44258 Merge pull request #5488 from boonkerz/patch-1 2022-01-16 17:28:49 +01:00
allcontributors[bot]
9483d20994 docs: update .all-contributorsrc [skip ci] 2022-01-16 16:28:48 +00:00
allcontributors[bot]
ff25e7fe2e docs: update README.md [skip ci] 2022-01-16 16:28:47 +00:00
Eugene Pankov
d12a48f3fc lint 2022-01-16 17:27:54 +01:00
boonkerz
1796ce4f1c Update tabContextMenu.ts
Translate the selected Color
2022-01-16 15:35:42 +01:00
Eugene Pankov
d404067e77 Merge branch 'master' of github.com:Eugeny/tabby 2022-01-15 19:39:11 +01:00
dependabot[bot]
f7544d0a2e Bump graceful-fs from 4.2.8 to 4.2.9
Bumps [graceful-fs](https://github.com/isaacs/node-graceful-fs) from 4.2.8 to 4.2.9.
- [Release notes](https://github.com/isaacs/node-graceful-fs/releases)
- [Commits](https://github.com/isaacs/node-graceful-fs/compare/v4.2.8...v4.2.9)

---
updated-dependencies:
- dependency-name: graceful-fs
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-15 17:51:39 +00:00
Eugeny
cbdce5c30e Merge pull request #5448 from Eugeny/dependabot/npm_and_yarn/electron-16.0.7
Bump electron from 16.0.6 to 16.0.7
2022-01-15 18:46:43 +01:00
Eugeny
d7ab8a00dc Merge pull request #5428 from Eugeny/dependabot/npm_and_yarn/app/serialport-10.0.2
Bump serialport from 10.0.1 to 10.0.2 in /app
2022-01-15 18:45:56 +01:00
Eugeny
6e0ded9a5e Merge pull request #5430 from Eugeny/dependabot/npm_and_yarn/shelljs-0.8.5
Bump shelljs from 0.8.4 to 0.8.5
2022-01-15 18:45:47 +01:00
Eugeny
f660ece383 Merge pull request #5462 from Eugeny/dependabot/npm_and_yarn/webpack-5.66.0
Bump webpack from 5.65.0 to 5.66.0
2022-01-15 18:45:08 +01:00
Eugeny
b692347c4e Merge pull request #5450 from Eugeny/dependabot/npm_and_yarn/electron-rebuild-3.2.7
Bump electron-rebuild from 3.2.5 to 3.2.7
2022-01-15 18:44:41 +01:00
Eugeny
9520d31f12 Merge pull request #5471 from Eugeny/dependabot/npm_and_yarn/follow-redirects-1.14.7
Bump follow-redirects from 1.14.5 to 1.14.7
2022-01-15 18:44:17 +01:00
dependabot[bot]
7c0aacf0ad Bump follow-redirects from 1.14.5 to 1.14.7
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.5 to 1.14.7.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.5...v1.14.7)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 23:53:29 +00:00
dependabot[bot]
9414be9ce0 Bump webpack from 5.65.0 to 5.66.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.65.0 to 5.66.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.65.0...v5.66.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 04:05:42 +00:00
dependabot[bot]
f2ed1b3df3 Bump electron-rebuild from 3.2.5 to 3.2.7
Bumps [electron-rebuild](https://github.com/electron/electron-rebuild) from 3.2.5 to 3.2.7.
- [Release notes](https://github.com/electron/electron-rebuild/releases)
- [Changelog](https://github.com/electron/electron-rebuild/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/electron-rebuild/compare/v3.2.5...v3.2.7)

---
updated-dependencies:
- dependency-name: electron-rebuild
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-12 04:05:46 +00:00
dependabot[bot]
f41abea747 Bump electron from 16.0.6 to 16.0.7
Bumps [electron](https://github.com/electron/electron) from 16.0.6 to 16.0.7.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v16.0.6...v16.0.7)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-12 04:03:03 +00:00
dependabot[bot]
00ffa24e7d Bump shelljs from 0.8.4 to 0.8.5
Bumps [shelljs](https://github.com/shelljs/shelljs) from 0.8.4 to 0.8.5.
- [Release notes](https://github.com/shelljs/shelljs/releases)
- [Changelog](https://github.com/shelljs/shelljs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/shelljs/shelljs/compare/v0.8.4...v0.8.5)

---
updated-dependencies:
- dependency-name: shelljs
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-10 04:04:15 +00:00
dependabot[bot]
b156752106 Bump serialport from 10.0.1 to 10.0.2 in /app
Bumps [serialport](https://github.com/serialport/node-serialport) from 10.0.1 to 10.0.2.
- [Release notes](https://github.com/serialport/node-serialport/releases)
- [Changelog](https://github.com/serialport/node-serialport/blob/master/CHANGELOG.md)
- [Commits](https://github.com/serialport/node-serialport/compare/@serialport/bindings@10.0.1...v10.0.2)

---
updated-dependencies:
- dependency-name: serialport
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-10 04:01:48 +00:00
dependabot[bot]
604e5e37a8 Bump @types/fs-extra from 9.0.12 to 9.0.13
Bumps [@types/fs-extra](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fs-extra) from 9.0.12 to 9.0.13.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fs-extra)

---
updated-dependencies:
- dependency-name: "@types/fs-extra"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-30 19:26:33 +00:00
140 changed files with 26173 additions and 4293 deletions

View File

@@ -1,6 +1,9 @@
{
"files": [
"README.md"
"README.md",
"README.zh-CN.md",
"README.ru-RU.md",
"README.ko-KR.md"
],
"imageSize": 100,
"commit": false,
@@ -559,6 +562,52 @@
"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"
]
}
],
"contributorsPerLine": 7,

View File

@@ -7,6 +7,13 @@ 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 [...]

View File

@@ -8,12 +8,12 @@ assignees: ''
---
<!--
Before submitting an issue, make sure that:
* You're running the latest Tabby version: https://github.com/Eugeny/tabby/releases
* You've searched the existing issues: https://github.com/Eugeny/tabby/issues
* Your problem is not caused by third-party plugins (disable _third-party_ plugins, restart and try to reproduce the problem).
# READ CAREFULLY:
*Reports are accepted in English ONLY.*
* **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**:

15
.github/workflows/issue-translator.yml vendored Normal file
View 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.

View File

@@ -204,6 +204,30 @@ Pull requests and plugins are welcome!
<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>
</tr>
</table>

View File

@@ -21,7 +21,7 @@
<br/>
<p align="center">
This README is also available in: <a href="./README.ko-KR.md">Korean</a> <a href="./README.zh-CN.md">简体中文</a>
This README is also available in: <a href="./README.ru-RU.md">Русский</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a>
</p>
----
@@ -108,7 +108,6 @@ Tabby will run as a portable app on Windows, if you create a `data` folder in th
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
@@ -227,6 +226,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<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>
</tr>
</table>
@@ -236,5 +242,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"/>

247
README.ru-RU.md Normal file
View File

@@ -0,0 +1,247 @@
[![](docs/readme.png)](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> &nbsp; <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> &nbsp; <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> &nbsp <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> &nbsp; <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
</p>
<p align="center">
<a href="https://ko-fi.com/J3J8KWTF">
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
</a>
</p>
----
### Загрузки:
* [Последняя версия](https://github.com/Eugeny/tabby/releases/latest)
* [Репозитории](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
* [Последний nightly-билд](https://nightly.link/Eugeny/tabby/workflows/build/master)
<br/>
<p align="center">
Этот README также доступен на: <a href="./README.md">Английском</a> <a href="./README.ko-KR.md">Корейском</a> <a href="./README.zh-CN.md">Китайском</a>
</p>
----
[**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux:
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
* Встроенный последовтаельный терминал;
* Темы и цветовые схемы;
* Полностью настраеваемые сочетания клавиш;
* Панели;
* Запоминание вкладок;
* Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD;
* Прямая передача файлов из и в SSH-сессии через Zmodem;
* Полная поддержка Unicode, включая символы двойной ширины;
* Не задыхается при быстром выводе;
* Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink);
* Втроенное защищённое хранилище для SSH-ключей и настроек;
* SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)).
# Содержание <!-- omit in toc -->
- [Правда и ложь про Tabby](#правда-и-ложь-про-tabby)
- [Функции терминала](#функции-терминала)
- [SSH-клиент](#ssh-клиент)
- [Терминал последовательного порта](#терминал-последовательного-порта)
- [Портативность](#портативность)
- [Плагины](#плагины)
- [Темы](#темы)
- [Внести свой вклад](#внести-свой-вклад)
<a name="about"></a>
# Правда и ложь про Tabby
* **Правда:** Tabby — это альтернатива стандартному терминалу Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app и iTerm.
* **Ложь:** Tabby — это не новая оболочка или замена MinGW или Cygwin. Также он нелёгок — если потребление ОЗУ крайне важно для вас, лучше взгляните на [Conemu](https://conemu.github.io) или [Alacritty](https://github.com/jwilm/alacritty).
<a name="terminal"></a>
# Функции терминала
![](docs/readme-terminal.png)
* Терминал V220 + различные дополнения;
* Деление окна на несколько панелей;
* Вкладки на любой стороне окна;
* Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»);
* Определение прогресса процесса;
* Уведомления о завершении процессов;
* Защита от выполнения команд при вставке, предупреждения о вставке нескольких строк;
* Лигатуры шрифтов;
* Пользовательские профили оболочки;
* Опциональная ПКМ-вставка и копирование при выделении (в стиле PuTTY).
<a name="ssh"></a>
# SSH-клиент
![](docs/readme-ssh.png)
* 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://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](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>
</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"/>

View File

@@ -2,7 +2,7 @@
<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> &nbsp; <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> &nbsp; <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> &nbsp; <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>
<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> &nbsp; <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> &nbsp; <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> &nbsp <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> &nbsp; <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">
@@ -19,6 +19,11 @@
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
<br/>
<p align="center">
本 README 还适用于以下语言: <a href="./README.ru-RU.md">Русский</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a>
</p>
----
[**Tabby**](https://tabby.sh) (前身是 **Terminus**) 是一个可高度配置的终端模拟器和 SSH 或串口客户端,支持 WindowsmacOS 和 Linux
@@ -27,15 +32,15 @@
* 集成串行终端
* 定制主题和配色方案
* 完全可配置的快捷键和多键快捷键
* 分窗格
* 记住你的标签
*体式窗格
* 自动保存标签
* 支持 PowerShell和 PS Core、WSL、Git-Bash、Cygwin、MSYS2、Cmder 和 CMD
* 在 SSH 会话中通过 Zmodem 进行直接文件传输
* 完整的 Unicode 支持,包括双角字符
* 不会因快速的输出而卡住
* Windows 上的正确 shell 体验,包括 tab 自动补全(通过 Clink
* Integrated encrypted container for SSH secrets and configuration
* SSH、SFTP 和 Telnet 客户端可用作 [Web 应用程序](https://tabby.sh/app)(也可[托管](https://github.com/Eugeny/tabby-web)
* Windows 上舒适的 shell 体验,包括 tab 自动补全(通过 Clink
* 为 SSH secrets 和设置集成了加密容器
* SSH、SFTP 和 Telnet 客户端可用作 [Web 应用](https://tabby.sh/app)(也可[托管](https://github.com/Eugeny/tabby-web)
# 目录 <!-- omit in toc -->
@@ -43,7 +48,7 @@
- [终端特性](#终端特性)
- [SSH 客户端](#ssh-客户端)
- [串行终端](#串行终端)
- [可移植的](#可移植的)
- [便携式应用](#便携式应用)
- [插件](#插件)
- [主题](#主题)
- [贡献](#贡献)
@@ -54,7 +59,7 @@
* **Tabby 是** Windows 标准终端 (conhost)、PowerShell ISE、PuTTY、macOS Terminal.app 和 iTerm 的替代品
* **Tabby 不是** Tabby 不是新的 shell也不是 MinGW 或 Cygwin 的替代品。它也不是轻量级的 - 如果,请考虑 [Conemu](https://conemu.github.io) 或 [Alacritty](https://github.com/jwilm/alacritty)
* **Tabby 不是**一个全新的 shell也不是 MinGW 或 Cygwin 的替代品。它也不是轻量级的 - 如果你对内存的占用很敏感,请考虑 [Conemu](https://conemu.github.io) 或 [Alacritty](https://github.com/jwilm/alacritty)
<a name="terminal"></a>
# 终端特性
@@ -63,11 +68,11 @@
* 一个 V220 终端 + 各种插件
* 多个嵌套的拆分窗格
* Tabs on any side of the window
* 可以将标签页设置在窗口的任意一侧
* 带有全局生成热键的可选可停靠窗口“Quake console”
* 进度检测
* 流程完成通知
* 括号粘贴,多行粘贴警告
* 括号粘贴,多行粘贴提示
* 连体字
* 自定义 shell 配置文件
* 可选的 RMB 粘贴和复制选择PuTTY 风格)
@@ -86,31 +91,31 @@
<a name="serial"></a>
# 串行终端
* 保存
* Readline 输入支持
* 保存
* 逐行读取的输入支持
* 可选的十六进制逐字节输入和十六进制转储输出
* 换行转换
* 自动重连
<a name="portable"></a>
# 可移植的
# 便携式应用
如果在 Tabby.exe 所在的同一位置创建数据文件夹Tabby 将在 Windows 上作为便携式的应用程序运行。
如果在 Tabby.exe 所在的目录创建一个名为`data`文件夹Tabby 将可以在 Windows 上作为便携式的应用程序运行。
<a name="plugins"></a>
# 插件
插件和主题可以直接 Tabby 中的设置视图安装。
插件和主题可以直接 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) - 快速向一个或所有终端选项卡发送命令
* [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) - 一个一直打扰你的示例插件
* [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 选项卡中选择的文本打开默认系统浏览器
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本打开系统默认浏览器
<a name="themes"></a>
# 主题
@@ -213,6 +218,21 @@
<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>
</tr>
</table>
@@ -221,6 +241,4 @@
<!-- 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"/>
本项目遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 规范。 欢迎任何形式的贡献!

View File

@@ -94,7 +94,7 @@ export class Application {
}
app.on('window-all-closed', () => {
if (this.quitRequested || process.platform !== 'darwin') {
if (this.quitRequested) {
app.quit()
}
})
@@ -130,7 +130,6 @@ export class Application {
this.setupMenu()
}
await window.ready
window.present()
return window
}

View File

@@ -27,7 +27,7 @@ abstract class GlasstronWindow extends BrowserWindow {
abstract setBlur (_: boolean)
}
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions(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`)
@@ -135,6 +135,8 @@ export class Window {
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({
@@ -303,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()

View File

@@ -15,18 +15,17 @@
"watch": "webpack --progress --color --watch"
},
"dependencies": {
"@angular/cdk": "^12.2.9",
"@electron/remote": "2.0.1",
"@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": "^4.6.1",
"electron-updater": "^4.6.5",
"fontmanager-redux": "1.1.0",
"glasstron": "0.0.7",
"js-yaml": "4.1.0",
"keytar": "^7.7.0",
"keytar": "^7.8.0",
"mz": "^2.7.0",
"native-process-working-directory": "^1.0.2",
"npm": "6",
@@ -38,7 +37,8 @@
"optionalDependencies": {
"@tabby-gang/windows-blurbehind": "^3.0.0",
"macos-native-processlist": "^2.0.0",
"serialport": "^10.0.1",
"serialport": "10.2.2",
"serialport-binding-webserialapi": "^1.0.3",
"windows-native-registry": "^3.1.0",
"windows-process-tree": "^0.3.2"
},

View File

@@ -1,7 +1,7 @@
body {
min-height: 100vh;
overflow: hidden;
background: #1D272D;
background: transparent !important;
-webkit-font-smoothing: antialiased;
}

View File

@@ -3,4 +3,5 @@ export const PLUGIN_BLACKLIST = [
'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
]

View File

@@ -21,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'),
@@ -64,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)

View File

@@ -1,3 +1,7 @@
app-root {
background: #1D272D;
}
.preload-logo {
-webkit-app-region: drag;
position: fixed;

View File

@@ -2,15 +2,6 @@
# yarn lockfile v1
"@angular/cdk@^12.2.9":
version "12.2.9"
resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-12.2.9.tgz#f39e4d7cdb3568ad8e1d412e3500772e2d4c605c"
integrity sha512-9Wgj69iGAZ4teQqW/zPbVg2RGna+m9i3v0zkWGx/+Uo95rikJCUZBQM4bfeOe+bSJrS77jV5EisBWG7ayNUSzQ==
dependencies:
tslib "^2.2.0"
optionalDependencies:
parse5 "^5.0.0"
"@electron/remote@2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.1.tgz#810cbc595a21f0f94641eb2d7e8264063a3f84de"
@@ -25,74 +16,101 @@
update-notifier "^2.2.0"
yargs "^8.0.2"
"@serialport/binding-abstract@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-10.0.1.tgz#fc5a69b05d364fa7db872b3fe64ae85aaa3030a5"
integrity sha512-FWD/uNrz8V3kaTILQTK05Z1LB/LZin8XZelmX/wd1NNlRFAj6V64MIESWhwUy3iPnL1QriFR1k7URHHx3RRgfg==
"@serialport/binding-abstract@^9.0.2":
version "9.2.3"
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-9.2.3.tgz#e7dd273357b6a698af7ad58db6f57f62443a0acb"
integrity sha512-cQs9tbIlG3P0IrOWyVirqlhWuJ7Ms2Zh9m2108z6Y5UW/iVj6wEOiW8EmK9QX9jmJXYllE7wgGgvVozP5oCj3w==
dependencies:
debug "^4.3.2"
"@serialport/binding-mock@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-10.0.1.tgz#b70747c897b861fe7d090f0350f0dc5a37f36b70"
integrity sha512-cU+UtCaQI1ZOWzIa4uT7Z0ymgAyQMSwEBF/BM87LtQ9QFjLwCgmuouy3vcsryWNEN3Lg0GwhQzl9ZuDw4bs/qw==
"@serialport/binding-mock@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-10.2.2.tgz#d322a8116a97806addda13c62f50e73d16125874"
integrity sha512-HAFzGhk9OuFMpuor7aT5G1ChPgn5qSsklTFOTUX72Rl6p0xwcSVsRtG/xaGp6bxpN7fI9D/S8THLBWbBgS6ldw==
dependencies:
"@serialport/binding-abstract" "10.0.1"
"@serialport/bindings-interface" "^1.2.1"
debug "^4.3.3"
"@serialport/bindings-cpp@10.6.2":
version "10.6.2"
resolved "https://registry.yarnpkg.com/@serialport/bindings-cpp/-/bindings-cpp-10.6.2.tgz#2ecb0a958d69d9d9e72cbf46481472937954adb5"
integrity sha512-vhId2K4Y4WOgy/UJE8NOHX6GZpozORCCMh6GM5UQeIzXihoYLxt4eomgl1eXasFipcRs06n71lAToqixb7NPpA==
dependencies:
"@serialport/bindings-interface" "1.2.1"
"@serialport/parser-readline" "^10.2.1"
debug "^4.3.2"
node-addon-api "^4.3.0"
node-gyp-build "^4.3.0"
"@serialport/bindings-interface@1.2.1", "@serialport/bindings-interface@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@serialport/bindings-interface/-/bindings-interface-1.2.1.tgz#1ee80b0951ef4e4fd8a5a186621feff046aa2faf"
integrity sha512-63Dyqz2gtryRDDckFusOYqLYhR3Hq/M4sEdbF9i/VsvDb6T+tNVgoAKUZ+FMrXXKnCSu+hYbk+MTc0XQANszxw==
"@serialport/parser-byte-length@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-10.2.2.tgz#10129fb83fb0bd5e4c673d866534ea714022708e"
integrity sha512-3xqaRbNiqDo8Gf1jPgrZr2nObKfAjhFihINZLJfPG7skWXfDKuF0zXuStzixre26N8GYWnkn4j/oEnI0RZjVDA==
"@serialport/parser-cctalk@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-10.2.2.tgz#7009b245cf7f6d9fa0e1a8039fcf2ed4292199da"
integrity sha512-WK+82D10y+vL2Rv1Hs2MRNKeY18uVC0+eH9QCfD9e2o+4+jPHfN2boJQFxVGtrlss8j5DmQ5Sc5Qe6Ep+f20/Q==
"@serialport/parser-delimiter@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-10.2.2.tgz#e305ad321ebc6dd2739cc919b66602c6c5bc4f8c"
integrity sha512-VsepMDIjbHbANMxH4IkXIJY0Tds8XsDo0mgtWK3DrV+IJGXp+2b0pHOuQlSLSfEUmdw7F5drI17fkxc9mxn+pg==
"@serialport/parser-inter-byte-timeout@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-10.2.2.tgz#22293882c9bd7ae9b18be9a30ca2fcd7a0617dc9"
integrity sha512-J9895aJ+3cHp2Q9qMH3UulfaifHDbDHjLPbO2H0vqjI8gZemL0DGql5ooFI6zsgJStXYT1MjqIhIb8dBIE0nxA==
"@serialport/parser-packet-length@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-packet-length/-/parser-packet-length-10.2.2.tgz#24790ba057090b8c7f5067a229b98d273fa6b71f"
integrity sha512-AEh/4pOoolUgCwg7ZW5M81isPjOhSf+Fq7OdyaR0GEHHrRgaY7ma2xkyp+sgjcYoeBzlxe3pPdi7LGtBJEFDnw==
"@serialport/parser-readline@10.2.2", "@serialport/parser-readline@^10.2.1":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-10.2.2.tgz#94bfbf4a76760141ce8c7efddbc76d00dfe6dd55"
integrity sha512-OcWoTsUJeLKWw+rdTuqXFZhii2liE6LeoFK2rtS6L00pB0cd2FGt2Rsx76oTCTyrub6AAUqaS9PRrAI+AUJJpg==
dependencies:
"@serialport/parser-delimiter" "10.2.2"
"@serialport/parser-ready@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-10.2.2.tgz#5d057f7d65fece8ea3c7f2cacf4026768a34e53d"
integrity sha512-Y5NA/kMb27afeFvSHhQ0Ov7PUt6vPSUqm7y+u6gajMpYOhKMjbLyQHuYMkgtGgk/PsryaOerd4OCVaYCEj0C+Q==
"@serialport/parser-regex@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-10.2.2.tgz#0275c207485f7cbd4787ef54e835eab6a7126b15"
integrity sha512-+fAchSfl65Ix1BbyNPBu0SreZg2Tc2JJkvXsKsWFpoaOEsuxbCthrNmyvjt3AZ228pay6kKvF2PkRd/z+BFSfw==
"@serialport/parser-slip-encoder@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-slip-encoder/-/parser-slip-encoder-10.2.2.tgz#ba3b4d3d6f172b0a22b82b86db5e1cd00e3ef22f"
integrity sha512-cDJvco/exmQ7xgISVNbNb73r8l0j7eQDTVXxa8whUt8tdkf/J5y8jZLZgboh/iXbEcrNtohwUhIfb633NotNxg==
"@serialport/parser-spacepacket@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/parser-spacepacket/-/parser-spacepacket-10.2.2.tgz#e0b9186d6239f97a615cb8990db153e1bb564bf7"
integrity sha512-TdfDYfIg41lXXuFsbdTZ2IHKhb3MgLJMMRhutoc/q6wX7LFhFD7FhdlkX3w85x15p1Et+iekGW5I/b48s47gXQ==
"@serialport/stream@10.2.2":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-10.2.2.tgz#80e3acd7a54c5da16659b3c34d419ca7302eff14"
integrity sha512-xKO5f73KbqZYadKYbtlDHE5RUwqSK8dF2brQRA6dikeyHWbVNhjwNtjWglwgzPl4SLB1A1uT97hMxrBrSCs6/w==
dependencies:
"@serialport/bindings-interface" "1.2.1"
debug "^4.3.2"
"@serialport/bindings@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-10.0.1.tgz#b8f1d81dae370b954329ec9fdbabb23df74e6a35"
integrity sha512-CcSE0OQQwpEup0LebG8bMFhVv+MB2wOm2yHWrdY6UiP3AEh7bB8F6sU1B/iq78BogyoIQ3ZDZBEi4I4F1hYVvA==
dependencies:
"@serialport/binding-abstract" "10.0.1"
"@serialport/parser-readline" "10.0.1"
bindings "^1.5.0"
debug "^4.3.2"
node-addon-api "4.2.0"
prebuild-install "^7.0.0"
"@serialport/parser-byte-length@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-10.0.1.tgz#c9038449e82e2f36093e7d3efe3ca16c6e357f3d"
integrity sha512-uOQa0KEGT7IIGSWCN53NE5ZYaWoeeGLDCSX+ssDadyQxy47hMHuP/JotdWqHg7lDwxUHe0tDl4SOEeEnDx1l6A==
"@serialport/parser-cctalk@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-10.0.1.tgz#df3c26886e920a45e17aba563b44324f5c1906b8"
integrity sha512-boVr8akjX/7iCtMHeFT16ek4m0/oV9YA6A2mstVCpKle2op42qByx3jY5RzQ52c13oQvq1E6tG0lWJrzdTK+Yw==
"@serialport/parser-delimiter@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-10.0.1.tgz#bb0a04e140bf428d5b49e7838b9f136c40b4a091"
integrity sha512-B0c6dm9UCpRU/LhkvRFL3OSbs69VqWU7mjW7tM109JDNS+vw8uJPumXz8Giub6D0xl90J7euH6tBTqERk7048Q==
"@serialport/parser-inter-byte-timeout@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-10.0.1.tgz#bbae1835a0ad0ea6e79dcb27f159231b7051a73a"
integrity sha512-awX0bekMZkjb+kjBHsnizAXNfc/grxIqEKdy9Etc6KhgSmratRnjGa7J0rPFP4bTzYWp5sOqlI0ALwBnWCXedA==
"@serialport/parser-readline@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-10.0.1.tgz#c4f7f047d4779c908cfb66d14c0ca0abd7e11f25"
integrity sha512-jdKPNka/Nn17k89T5UIyis39EaZHQCmq+83s0icBt2iPBlX8+BrJAUBe8myFpuT22qskTVNzFoTMPOp8pjK/yw==
dependencies:
"@serialport/parser-delimiter" "10.0.1"
"@serialport/parser-ready@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-10.0.1.tgz#497c4ae0bcc1866b488d8c4f9d6b4e98c4f08aa3"
integrity sha512-4hVDrKNJBd0wcCfa1qQAk+MM6mVWc9oIbUPEKJkWdBrrWOqYacx2UpvQWd+3YGJ04hFqEv1feOSaH3/1hUifEg==
"@serialport/parser-regex@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-10.0.1.tgz#bcb302dda0a9d07ce9b3e554e3d2a41abf3fb5c5"
integrity sha512-l8ECuUsan33x5pirQZodlmw0q70Jcxy+oHnXJaqchBTRCbtXlE7+PMFJnmNoIHGqDwt0XALbwpvKcnNBrgvT1g==
"@serialport/stream@10.0.1":
version "10.0.1"
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-10.0.1.tgz#f38c0e076e9e9ba3255e20e161576879f7d9ae18"
integrity sha512-WQ5baxC56Jxo9mXgHq3BPxCXKnfOo3PZxpm6CDaKsZbdsdPYChogRsJCzKjAn6QaKIIFv3/5UdAXKmMCxkeVDA==
"@serialport/stream@^9.0.2":
version "9.2.4"
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-9.2.4.tgz#9fce093d0b46ed4599953b4fae81718e050d2b33"
integrity sha512-bLye8Ub4vUFQGmkh8qEqehr7SE7EJs2yDs0h9jzuL5oKi+F34CFmWkEErO8GAOQ8YNn7p6b3GxUgs+0BrHHDZQ==
dependencies:
debug "^4.3.2"
@@ -331,13 +349,6 @@ bin-links@^1.1.2, bin-links@^1.1.8:
npm-normalize-package-bin "^1.0.0"
write-file-atomic "^2.3.0"
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
dependencies:
file-uri-to-path "1.0.0"
bl@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz"
@@ -393,10 +404,10 @@ buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
builder-util-runtime@8.9.1:
version "8.9.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a"
integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==
builder-util-runtime@8.9.2:
version "8.9.2"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28"
integrity sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==
dependencies:
debug "^4.3.2"
sax "^1.2.4"
@@ -746,6 +757,13 @@ debug@^4.0.1, debug@^4.3.2:
dependencies:
ms "2.1.2"
debug@^4.3.3:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
dependencies:
ms "2.1.2"
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz"
@@ -761,13 +779,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
decompress-response@^4.2.0:
version "4.2.1"
resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz"
integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
dependencies:
mimic-response "^2.0.0"
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@@ -809,10 +820,10 @@ detect-indent@~5.0.0:
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
detect-libc@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.0.tgz#c528bc09bc6d1aa30149228240917c225448f204"
integrity sha512-S55LzUl8HUav8l9E2PBTlC5PAJrHK7tkM+XXFGD+fbsbkTzhCpG6K05LxJcUOEWzMa4v6ptcMZ9s3fOdJDu0Zw==
detect-newline@^2.1.0:
version "2.1.0"
@@ -912,13 +923,13 @@ electron-promise-ipc@^2.2.4:
serialize-error "^5.0.0"
uuid "^3.0.1"
electron-updater@^4.6.1:
version "4.6.1"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.1.tgz#80ca805c4f51b2e682aac29d18fed75d6a533d32"
integrity sha512-YsU1mHqXLrXXmBMsxhxy24PrbaB8rnpZDPmFa2gOkTYk/Ch13+R0fjsRSpPYvqtskVVY0ux8fu+HnUkVkqc7og==
electron-updater@^4.6.5:
version "4.6.5"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.5.tgz#e9a75458bbfd6bb41a58a829839e150ad2eb2d3d"
integrity sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==
dependencies:
"@types/semver" "^7.3.6"
builder-util-runtime "8.9.1"
builder-util-runtime "8.9.2"
fs-extra "^10.0.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
@@ -1071,11 +1082,6 @@ figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
"filesize@>= 4.0.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11"
@@ -1763,13 +1769,13 @@ keyboardevents-areequal@^0.2.1:
resolved "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz"
integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==
keytar@^7.7.0:
version "7.7.0"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.7.0.tgz#3002b106c01631aa79b1aa9ee0493b94179bbbd2"
integrity sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==
keytar@^7.8.0:
version "7.8.0"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.8.0.tgz#28cf5ceeb1275350888870022869b8b4fe6a87f9"
integrity sha512-mR+BqtAOIW8j+T5FtLVyckCbvROWQD+4FzPeFMuk5njEZkXLpVPCGF26Y3mTyxMAAL1XCfswR7S6kIf+THSRFA==
dependencies:
node-addon-api "^3.0.0"
prebuild-install "^6.0.0"
node-addon-api "^4.3.0"
prebuild-install "^7.0.1"
klaw-sync@^6.0.0:
version "6.0.0"
@@ -2121,11 +2127,6 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
mimic-response@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz"
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
mimic-response@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
@@ -2257,7 +2258,7 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
node-abi@^2.20.0, node-abi@^2.7.0:
node-abi@^2.20.0:
version "2.30.1"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
@@ -2265,9 +2266,9 @@ node-abi@^2.20.0, node-abi@^2.7.0:
semver "^5.4.1"
node-abi@^3.3.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.5.0.tgz#26e8b7b251c3260a5ac5ba5aef3b4345a0229248"
integrity sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==
version "3.8.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.8.0.tgz#679957dc8e7aa47b0a02589dbfde4f77b29ccb32"
integrity sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==
dependencies:
semver "^7.3.5"
@@ -2276,16 +2277,16 @@ node-addon-api@3.0.0:
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz"
integrity sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==
node-addon-api@4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87"
integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==
node-addon-api@^3.0.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz"
integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==
node-addon-api@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
node-fetch-npm@^2.0.2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4"
@@ -2295,6 +2296,11 @@ node-fetch-npm@^2.0.2:
json-parse-better-errors "^1.0.0"
safe-buffer "^5.1.1"
node-gyp-build@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==
node-gyp@^5.0.2, node-gyp@^5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e"
@@ -2312,11 +2318,6 @@ node-gyp@^5.0.2, node-gyp@^5.1.0:
tar "^4.4.12"
which "^1.3.1"
noop-logger@^0.1.1:
version "0.1.1"
resolved "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz"
integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
nopt@^4.0.1, nopt@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
@@ -2785,11 +2786,6 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
parse5@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
patch-package@^6.4.7:
version "6.4.7"
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
@@ -2868,33 +2864,12 @@ pkg-up@^2.0.0:
dependencies:
find-up "^2.1.0"
prebuild-install@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.0.1.tgz#5902172f7a40eb67305b96c2a695db32636ee26d"
integrity sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==
prebuild-install@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870"
integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==
dependencies:
detect-libc "^1.0.3"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1"
node-abi "^2.7.0"
noop-logger "^0.1.1"
npmlog "^4.0.1"
pump "^3.0.0"
rc "^1.2.7"
simple-get "^3.0.3"
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
which-pm-runs "^1.0.0"
prebuild-install@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574"
integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==
dependencies:
detect-libc "^1.0.3"
detect-libc "^2.0.0"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
@@ -3281,21 +3256,32 @@ serialize-error@^5.0.0:
dependencies:
type-fest "^0.8.0"
serialport@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-10.0.1.tgz#2df0ddcedf507180229973fc46e175f123e7c46f"
integrity sha512-RNEUs8mtf6m8593b2qRfkDakxbhPR4VQT0iNKEpJu/JfuWVrSYMqAAWnJOQXOWdJV6ib7rcxCHgHFyarGqJVWw==
serialport-binding-webserialapi@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/serialport-binding-webserialapi/-/serialport-binding-webserialapi-1.0.3.tgz#cf4348c075da2de8f6cf9936c0b95645f3ae657b"
integrity sha512-TS7dsvetVoTeiWlzpsT/akjtljiYPO56FoJWSFyJSoO/E8icYJ2neQ7CW5NW/sHZDnMqAxULyAny47UFhWz9oQ==
dependencies:
"@serialport/binding-mock" "10.0.1"
"@serialport/bindings" "10.0.1"
"@serialport/parser-byte-length" "10.0.1"
"@serialport/parser-cctalk" "10.0.1"
"@serialport/parser-delimiter" "10.0.1"
"@serialport/parser-inter-byte-timeout" "10.0.1"
"@serialport/parser-readline" "10.0.1"
"@serialport/parser-ready" "10.0.1"
"@serialport/parser-regex" "10.0.1"
"@serialport/stream" "10.0.1"
"@serialport/binding-abstract" "^9.0.2"
"@serialport/stream" "^9.0.2"
serialport@10.2.2:
version "10.2.2"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-10.2.2.tgz#ab12a423046df6b64cb3144fdb2d00fb3062ab75"
integrity sha512-yYp8UM915g8C3+lYZ7GU1Em1BnMeaH9c2bN2/A8ptQH5ttD7E+k9PuDEVOuyxONuyiBOp+vHfIPnje1evnslEw==
dependencies:
"@serialport/binding-mock" "10.2.2"
"@serialport/bindings-cpp" "10.6.2"
"@serialport/parser-byte-length" "10.2.2"
"@serialport/parser-cctalk" "10.2.2"
"@serialport/parser-delimiter" "10.2.2"
"@serialport/parser-inter-byte-timeout" "10.2.2"
"@serialport/parser-packet-length" "10.2.2"
"@serialport/parser-readline" "10.2.2"
"@serialport/parser-ready" "10.2.2"
"@serialport/parser-regex" "10.2.2"
"@serialport/parser-slip-encoder" "10.2.2"
"@serialport/parser-spacepacket" "10.2.2"
"@serialport/stream" "10.2.2"
debug "^4.3.2"
set-blocking@^2.0.0, set-blocking@~2.0.0:
@@ -3332,19 +3318,10 @@ simple-concat@^1.0.0:
resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz"
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.0"
resolved "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz"
integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
dependencies:
decompress-response "^4.2.0"
once "^1.3.1"
simple-concat "^1.0.0"
simple-get@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675"
integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==
version "4.0.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
dependencies:
decompress-response "^6.0.0"
once "^1.3.1"
@@ -3716,7 +3693,7 @@ tough-cookie@~2.5.0:
psl "^1.1.28"
punycode "^2.1.1"
tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0:
tslib@^2.0.0, tslib@^2.1.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
@@ -3887,11 +3864,6 @@ which-module@^2.0.0:
resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
which-pm-runs@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz"
integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
which@^1.2.9, which@^1.3.0, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"

View File

@@ -40,7 +40,7 @@ publish:
win:
icon: "./build/windows/icon.ico"
artifactName: tabby-${version}-portable.${ext}
rfc3161TimeStampServer: http://timestamp.comodoca.com/rfc3161
rfc3161TimeStampServer: http://timestamp.sectigo.com
nsis:
oneClick: false
artifactName: tabby-${version}-setup.${ext}
@@ -66,7 +66,7 @@ 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}
executableArgs:

File diff suppressed because it is too large Load Diff

2111
locale/da-DK.po Normal file

File diff suppressed because it is too large Load Diff

2111
locale/de-DE.po Normal file

File diff suppressed because it is too large Load Diff

5
locale/en-US.po Normal file
View File

@@ -0,0 +1,5 @@
msgid "id.port-forwarding.dynamic"
msgstr "Dynamic"
msgid "id.tab-width.dynamic"
msgstr "Dynamic"

2111
locale/es-ES.po Normal file

File diff suppressed because it is too large Load Diff

2111
locale/fr-FR.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2111
locale/it-IT.po Normal file

File diff suppressed because it is too large Load Diff

2111
locale/ja-JP.po Normal file

File diff suppressed because it is too large Load Diff

2111
locale/pl-PL.po Normal file

File diff suppressed because it is too large Load Diff

2111
locale/ru-RU.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2111
locale/zh-TW.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,23 @@
{
"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",
"@biesbjerg/ngx-translate-extract": "^7.0.4",
"@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
"@fortawesome/fontawesome-free": "^6.0.0-beta3",
"@fortawesome/fontawesome-free": "^6.0.0",
"@ng-bootstrap/ng-bootstrap": "^10.0.0",
"@sentry/cli": "^1.71.0",
"@sentry/cli": "^1.72.1",
"@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/fs-extra": "^9.0.13",
"@types/js-yaml": "^4.0.5",
"@types/node": "16.0.1",
"@types/sortablejs": "^1.10.7",
@@ -25,29 +25,31 @@
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.33.0",
"apply-loader": "2.0.0",
"axios": "^0.21.2",
"axios": "^0.25.0",
"browserify-sign": "^4.2.1",
"clone-deep": "^4.0.1",
"compare-versions": "^4",
"core-js": "^3.18.2",
"core-js": "^3.20.3",
"cross-env": "7.0.3",
"css-loader": "^6.5.1",
"deep-equal": "2.0.5",
"electron": "16.0.6",
"electron-builder": "^22.14.5",
"electron": "17.0.0",
"electron-builder": "^22.14.13",
"electron-download": "^4.1.1",
"electron-installer-snap": "^5.1.0",
"electron-notarize": "^1.1.1",
"electron-rebuild": "^3.2.5",
"electron-rebuild": "^3.2.7",
"eslint": "^7.32.0",
"file-loader": "^6.2.0",
"graceful-fs": "^4.2.8",
"gettext-extractor": "^3.5.3",
"graceful-fs": "^4.2.9",
"html-loader": "2.1.2",
"json-loader": "^0.5.7",
"lru-cache": "^6.0.0",
"macos-release": "^3.0.1",
"ngx-sortablejs": "^11.1.0",
"ngx-toastr": "^14.0.0",
"node-abi": "^3.2.0",
"node-abi": "^3.8.0",
"node-sass": "^7.0.1",
"npmlog": "6.0.0",
"npx": "^10.2.2",
@@ -62,24 +64,24 @@
"raw-loader": "4.0.2",
"sass-loader": "^12.4.0",
"shell-quote": "^1.7.3",
"shelljs": "0.8.4",
"shelljs": "0.8.5",
"slugify": "^1.6.5",
"sortablejs": "^1.14.0",
"source-code-pro": "^2.38.0",
"source-map-loader": "^3.0.1",
"source-sans-pro": "3.6.0",
"ssh2": "^1.5.0",
"ssh2": "^1.6.0",
"style-loader": "^3.2.1",
"svg-inline-loader": "^0.8.2",
"ts-loader": "^9.2.3",
"tslib": "^2.3.1",
"typedoc": "^0.22.10",
"typedoc": "^0.22.11",
"typescript": "^4.3.5",
"utils-decorators": "^1.10.4",
"val-loader": "4.0.0",
"webpack": "^5.65.0",
"webpack": "^5.68.0",
"webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.1",
"webpack-cli": "^4.9.2",
"yaml-loader": "0.6.0",
"zone.js": "^0.11.4"
},

View File

@@ -0,0 +1,13 @@
diff --git a/node_modules/gettext-extractor/dist/html/selector.js b/node_modules/gettext-extractor/dist/html/selector.js
index e290d12..cdb1d0b 100644
--- a/node_modules/gettext-extractor/dist/html/selector.js
+++ b/node_modules/gettext-extractor/dist/html/selector.js
@@ -120,7 +120,7 @@ class ElementSelector {
if (elementAttributeValue === null) {
return false;
}
- if (attribute.value) {
+ if (attribute.value !== undefined) {
switch (attribute.operator) {
case '^=':
if (elementAttributeValue.slice(0, attribute.value.length) !== attribute.value) {

39
patches/ssh2+1.6.0.patch Normal file
View 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': {

View File

@@ -5,5 +5,5 @@ 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`)
sh.exec(`yarn typedoc --out docs/api/${dest} --tsconfig ${src}/tsconfig.typings.json ${src}/src/index.ts`, { fatal: true })
})

View File

@@ -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 })
})

View File

@@ -3,6 +3,9 @@ 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'
@@ -11,18 +14,40 @@ const tempHtml = 'locale/tmp-html'
;(async () => {
sh.mkdir('-p', tempHtml)
for (const plugin of vars.builtinPlugins) {
log.info('extract-pug', plugin)
sh.exec(`yarn pug --doctype html -s --pretty -O '{require: function(){}}' -o ${tempHtml}/${plugin} ${plugin}`)
log.info('extract-ts', plugin)
sh.exec(`node node_modules/.bin/ngx-translate-extract -i ${plugin}/src -m -s -f pot -o ${tempOutput}`)
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')
sh.exec(`node node_modules/.bin/ngx-translate-extract -i ${tempHtml} -f pot -s -o ${tempOutput}`)
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)
})()

View File

@@ -1,30 +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`, { fatal: true })
sh.cd('..')
sh.cd('web')
sh.exec(`${npx} yarn install --force`)
sh.exec(`${npx} patch-package`)
sh.exec(`yarn install --force`, { 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`, { fatal: true })
sh.cd('..')
})

View File

@@ -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'), '{}')

View File

@@ -7,7 +7,7 @@ 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 --no-git-tag-version version ' + vars.version, { fatal: true })
execSync('npm publish', { stdio: 'inherit' })
sh.cd('..')
})

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-community-color-schemes",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Community color schemes for Tabby",
"keywords": [
"tabby-builtin-plugin"

View 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:

View 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:

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-core",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Tabby core",
"keywords": [
"tabby-builtin-plugin"

View File

@@ -37,7 +37,7 @@ export class ButtonProvider extends ToolbarButtonProvider {
icon: this.hostApp.platform === Platform.Web
? require('./icons/plus.svg')
: require('./icons/profiles.svg'),
title: this.translate.instant('Profiles and connections'),
title: this.translate.instant('Profiles & connections'),
click: () => this.activate(),
},
...this.profilesService.getRecentProfiles().map(profile => ({

View File

@@ -214,6 +214,10 @@ export class AppRootComponent {
}
}
@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 => {

View File

@@ -1,4 +1,4 @@
import { Observable, Subject, distinctUntilChanged } 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'
@@ -47,7 +47,9 @@ 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
hasFocus = false
@@ -61,7 +63,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>()
@@ -87,6 +88,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 {
@@ -103,14 +110,6 @@ 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
}
}
/**

View File

@@ -624,8 +624,18 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
super.clearActivity()
}
get color (): string|null {
return this.getFocusedTab()?.color ?? null
}
set color (color: string|null) {
for (const t of this.getAllTabs()) {
t.color = color
}
}
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) {

View File

@@ -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()
}

View File

@@ -15,9 +15,12 @@ footer.d-flex.align-items-center
.btn-group.mr-auto
button.btn.btn-dark((click)='homeBase.openGitHub()')
i.fab.fa-github
span(translate) GitHub
span GitHub
button.btn.btn-dark((click)='homeBase.reportBug()')
i.fas.fa-bug
span(translate) Report a problem
.form-control-static.selectable.no-drag {{ 'Version: {version}'|translate:{ version: this.homeBase.appVersion } }}
.form-control-static.selectable.no-drag(
translate='Version: {version}',
[translateParams]='{ version: this.homeBase.appVersion }'
)

View File

@@ -37,6 +37,7 @@ $tabs-height: 38px;
text-align: center;
transition: 0.25s all;
align-self: center;
margin-top: 1px;
}
.name {

View File

@@ -1,6 +1,7 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, Input, Optional, Inject, HostBinding, HostListener, NgZone } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { auditTime } from 'rxjs'
import { TabContextMenuItemProvider } from '../api/tabContextMenuProvider'
import { BaseTabComponent } from './baseTab.component'
import { RenameTabModalComponent } from './renameTabModal.component'
@@ -47,7 +48,9 @@ export class TabHeaderComponent extends BaseComponent {
}
ngOnInit () {
this.subscribeUntilDestroyed(this.tab.progress$, progress => {
this.subscribeUntilDestroyed(this.tab.progress$.pipe(
auditTime(300),
), progress => {
this.zone.run(() => {
this.progress = progress
})

View File

@@ -4,8 +4,10 @@
.ml-auto(ngbDropdown, placement='bottom-right')
button.btn.btn-link(ngbDropdownToggle, (click)='$event.stopPropagation()')
span(
*ngIf='rememberFor'
) {{ 'Remember for {time}'|translate:{time: getRememberForDisplay(rememberFor)} }}
*ngIf='rememberFor',
translate='Remember for {time}',
[translateParams]='{time: getRememberForDisplay(rememberFor)}'
)
span(*ngIf='!rememberFor', translate) Do not remember
div(ngbDropdownMenu)
button.dropdown-item(

View File

@@ -6,6 +6,16 @@
.text-center.mb-5(translate) Thank you for downloading Tabby!
.form-line
.header
.title(translate) Language
select.form-control([(ngModel)]='config.store.language', (ngModelChange)='config.save()')
option([ngValue]='null', translate) Automatic
option(
[value]='lang.code',
*ngFor='let lang of allLanguages'
) {{lang.name}}
.form-line
.header
.title(translate) Enable analytics

View File

@@ -3,7 +3,7 @@ import { Component } from '@angular/core'
import { TranslateService } from '@ngx-translate/core'
import { BaseTabComponent } from './baseTab.component'
import { ConfigService } from '../services/config.service'
import { HostWindowService } from '../api/hostWindow'
import { LocaleService } from '../services/locale.service'
/** @hidden */
@Component({
@@ -13,10 +13,11 @@ import { HostWindowService } from '../api/hostWindow'
})
export class WelcomeTabComponent extends BaseTabComponent {
enableGlobalHotkey = true
allLanguages = LocaleService.allLanguages
constructor (
private hostWindow: HostWindowService,
public config: ConfigService,
public locale: LocaleService,
translate: TranslateService,
) {
super()
@@ -30,6 +31,6 @@ export class WelcomeTabComponent extends BaseTabComponent {
this.config.store.hotkeys['toggle-window'] = []
}
await this.config.save()
this.hostWindow.reload()
this.destroy()
}
}

View File

@@ -75,3 +75,5 @@ hotkeys:
- '⌘-E'
switch-profile:
- '⌘-Shift-E'
appearance:
vibrancy: true

View File

@@ -58,83 +58,83 @@ export class AppHotkeyProvider extends HotkeyProvider {
},
{
id: 'tab-1',
name: this.translate.instant('Tab 1'),
name: this.translate.instant('Tab {number}', { number: 1 }),
},
{
id: 'tab-2',
name: this.translate.instant('Tab 2'),
name: this.translate.instant('Tab {number}', { number: 2 }),
},
{
id: 'tab-3',
name: this.translate.instant('Tab 3'),
name: this.translate.instant('Tab {number}', { number: 3 }),
},
{
id: 'tab-4',
name: this.translate.instant('Tab 4'),
name: this.translate.instant('Tab {number}', { number: 4 }),
},
{
id: 'tab-5',
name: this.translate.instant('Tab 5'),
name: this.translate.instant('Tab {number}', { number: 5 }),
},
{
id: 'tab-6',
name: this.translate.instant('Tab 6'),
name: this.translate.instant('Tab {number}', { number: 6 }),
},
{
id: 'tab-7',
name: this.translate.instant('Tab 7'),
name: this.translate.instant('Tab {number}', { number: 7 }),
},
{
id: 'tab-8',
name: this.translate.instant('Tab 8'),
name: this.translate.instant('Tab {number}', { number: 8 }),
},
{
id: 'tab-9',
name: this.translate.instant('Tab 9'),
name: this.translate.instant('Tab {number}', { number: 9 }),
},
{
id: 'tab-10',
name: this.translate.instant('Tab 10'),
name: this.translate.instant('Tab {number}', { number: 10 }),
},
{
id: 'tab-11',
name: this.translate.instant('Tab 11'),
name: this.translate.instant('Tab {number}', { number: 11 }),
},
{
id: 'tab-12',
name: this.translate.instant('Tab 12'),
name: this.translate.instant('Tab {number}', { number: 12 }),
},
{
id: 'tab-13',
name: this.translate.instant('Tab 13'),
name: this.translate.instant('Tab {number}', { number: 13 }),
},
{
id: 'tab-14',
name: this.translate.instant('Tab 14'),
name: this.translate.instant('Tab {number}', { number: 14 }),
},
{
id: 'tab-15',
name: this.translate.instant('Tab 15'),
name: this.translate.instant('Tab {number}', { number: 15 }),
},
{
id: 'tab-16',
name: this.translate.instant('Tab 16'),
name: this.translate.instant('Tab {number}', { number: 16 }),
},
{
id: 'tab-17',
name: this.translate.instant('Tab 17'),
name: this.translate.instant('Tab {number}', { number: 17 }),
},
{
id: 'tab-18',
name: this.translate.instant('Tab 18'),
name: this.translate.instant('Tab {number}', { number: 18 }),
},
{
id: 'tab-19',
name: this.translate.instant('Tab 19'),
name: this.translate.instant('Tab {number}', { number: 19 }),
},
{
id: 'tab-20',
name: this.translate.instant('Tab 20'),
name: this.translate.instant('Tab {number}', { number: 20 }),
},
{
id: 'split-right',
@@ -201,11 +201,11 @@ export class AppHotkeyProvider extends HotkeyProvider {
...this.hotkeys,
...profiles.map(profile => ({
id: `profile.${AppHotkeyProvider.getProfileHotkeyName(profile)}`,
name: `New tab: ${profile.name}`,
name: this.translate.instant('New tab: {profile}', { profile: profile.name }),
})),
...this.profilesService.getProviders().map(provider => ({
id: `profile-selectors.${provider.id}`,
name: `Show ${provider.name} profile selector`,
name: this.translate.instant('Show {type} profile selector', { type: provider.name }),
})),
]
}

View File

@@ -82,7 +82,7 @@ const PROVIDERS = [
},
{
provide: MESSAGE_FORMAT_CONFIG,
useValue: LocaleService.allLocales,
useValue: LocaleService.allLanguages.map(x => x.code),
},
{
provide: TranslateService,
@@ -149,6 +149,7 @@ const PROVIDERS = [
SortablejsModule,
DragDropModule,
TranslateModule,
CdkAutoDropGroup,
],
})
export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class

View File

@@ -130,9 +130,7 @@ export class HotkeysService {
const keyName = getKeyName(eventData)
if (eventName === 'keydown') {
this.addPressedKey(keyName, eventData)
if (!nativeEvent.repeat) {
this.recognitionPhase = true
}
this.recognitionPhase = true
this.updateModifiers(eventData)
}
if (eventName === 'keyup') {
@@ -158,8 +156,10 @@ export class HotkeysService {
const matched = this.matchActiveHotkey()
this.zone.run(() => {
if (matched && this.recognitionPhase) {
this.emitHotkeyOn(matched)
if (matched) {
if (this.recognitionPhase) {
this.emitHotkeyOn(matched)
}
} else if (this.pressedHotkey) {
this.emitHotkeyOff(this.pressedHotkey)
}
@@ -288,10 +288,9 @@ export class HotkeysService {
private emitHotkeyOn (hotkey: string) {
if (this.pressedHotkey) {
if (this.pressedHotkey === hotkey) {
return
if (this.pressedHotkey !== hotkey) {
this.emitHotkeyOff(this.pressedHotkey)
}
this.emitHotkeyOff(this.pressedHotkey)
}
if (document.querySelectorAll('input:focus').length === 0) {
console.debug('Matched hotkey', hotkey)

View File

@@ -2,8 +2,16 @@ import { Injectable } from '@angular/core'
import { registerLocaleData } from '@angular/common'
import { TranslateService } from '@ngx-translate/core'
import localeEN from '@angular/common/locales/en-GB'
import localeEN from '@angular/common/locales/en'
import localeDA from '@angular/common/locales/da'
import localeDE from '@angular/common/locales/de'
import localeES from '@angular/common/locales/es'
import localeFR from '@angular/common/locales/fr'
import localeHR from '@angular/common/locales/hr'
import localeIT from '@angular/common/locales/it'
import localeJA from '@angular/common/locales/ja'
import localePL from '@angular/common/locales/pl'
import localeRU from '@angular/common/locales/ru'
import localeZH from '@angular/common/locales/zh'
import { Observable, Subject } from 'rxjs'
import { distinctUntilChanged } from 'rxjs/operators'
@@ -11,15 +19,41 @@ import { ConfigService } from './config.service'
import { LogService, Logger } from './log.service'
registerLocaleData(localeEN)
registerLocaleData(localeDA)
registerLocaleData(localeDE)
registerLocaleData(localeES)
registerLocaleData(localeFR)
registerLocaleData(localeHR)
registerLocaleData(localeIT)
registerLocaleData(localeJA)
registerLocaleData(localePL)
registerLocaleData(localeRU)
registerLocaleData(localeZH)
function flattenMessageFormatTranslation (po: any) {
const translation = {}
po = po.translations['']
for (const k of Object.keys(po)) {
translation[k] = po[k].msgstr[0] || k
}
return translation
}
@Injectable({ providedIn: 'root' })
export class TranslateServiceWrapper extends TranslateService {
private _defaultTranslation: Record<string, string>|null
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
getParsedResult (translations: any, key: any, interpolateParams?: any): any {
this.translations[this.defaultLang][key] ??= this.compiler.compile(key, this.defaultLang)
return super.getParsedResult(translations, key, interpolateParams)
if (!this._defaultTranslation) {
const po = require(`../../../locale/en-US.po`)
this._defaultTranslation = flattenMessageFormatTranslation(po)
}
this.translations[this.defaultLang][key] ??= this.compiler.compile(
this._defaultTranslation[key] || key,
this.defaultLang
)
return super.getParsedResult(translations, key, interpolateParams ?? {})
}
}
@@ -27,8 +61,56 @@ export class TranslateServiceWrapper extends TranslateService {
export class LocaleService {
private logger: Logger
static readonly allLocales = ['en-US', 'hr-HR', 'zh-CN']
readonly allLanguages: { code: string, name: string }[]
static allLanguages = [
{
code: 'da-DK',
name: 'Dansk',
},
{
code: 'de-DE',
name: 'Deutsch',
},
{
code: 'en-US',
name: 'English',
},
{
code: 'es-ES',
name: 'Español',
},
{
code: 'fr-FR',
name: 'Français',
},
{
code: 'hr-HR',
name: 'Hrvatski',
},
{
code: 'it-IT',
name: 'Italiano',
},
{
code: 'pl-PL',
name: 'Polski',
},
{
code: 'ru-RU',
name: 'Русский',
},
{
code: 'ja-JP',
name: '日本語',
},
{
code: 'zh-CN',
name: '中文(简体)',
},
{
code: 'zh-TW',
name: '中文 (繁體)',
},
]
get localeChanged$ (): Observable<string> {
return this.localeChanged.pipe(distinctUntilChanged())
@@ -49,30 +131,13 @@ export class LocaleService {
config.ready$.subscribe(() => {
this.refresh()
})
this.allLanguages = [
{
code: 'en-US',
name: translate.instant('English'),
},
{
code: 'hr-HR',
name: translate.instant('Croatian'),
},
{
code: 'zh-CN',
name: translate.instant('Chinese (simplified)'),
},
]
this.translate.setTranslation('en-US', {})
}
refresh (): void {
let lang = this.config.store.language
if (!lang) {
for (const systemLanguage of navigator.languages) {
if (!lang && this.allLanguages.some(x => x.code === systemLanguage)) {
if (!lang && LocaleService.allLanguages.some(x => x.code === systemLanguage)) {
lang = systemLanguage
}
}
@@ -82,15 +147,11 @@ export class LocaleService {
}
async setLocale (lang: string): Promise<void> {
if (!this.translate.langs.includes(lang) && lang !== 'en-US') {
if (!this.translate.langs.includes(lang)) {
this.translate.addLangs([lang])
const po = require(`../../../locale/${lang}.po`).translations['']
const translation = {}
for (const k of Object.keys(po)) {
translation[k] = po[k].msgstr[0] || k
}
const po = require(`../../../locale/${lang}.po`)
const translation = flattenMessageFormatTranslation(po)
this.translate.setTranslation(lang, translation)
}

View File

@@ -37,9 +37,7 @@ export class ProfilesService {
async openNewTabForProfile <P extends Profile> (profile: PartialProfile<P>): Promise<BaseTabComponent|null> {
const params = await this.newTabParametersForProfile(profile)
if (params) {
const tab = this.app.openNewTab(params)
;(this.app.getParentTab(tab) ?? tab).color = profile.color ?? null
return tab
return this.app.openNewTab(params)
}
return null
}
@@ -50,9 +48,12 @@ export class ProfilesService {
if (params) {
params.inputs ??= {}
params.inputs['title'] = profile.name
if (profile.disableDynamicTitle) {
if (fullProfile.disableDynamicTitle) {
params.inputs['disableDynamicTitle'] = true
}
if (fullProfile.color) {
params.inputs['color'] = fullProfile.color
}
}
return params
}

View File

@@ -109,6 +109,7 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<MenuItemOptions[]> {
let items: MenuItemOptions[] = []
if (tabHeader) {
const currentColor = TAB_COLORS.find(x => x.value === tab.color)?.name
items = [
...items,
{
@@ -121,9 +122,9 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
},
{
label: this.translate.instant('Color'),
sublabel: TAB_COLORS.find(x => x.value === tab.color)?.name,
sublabel: currentColor ? this.translate.instant(currentColor) : undefined,
submenu: TAB_COLORS.map(color => ({
label: this.translate.instant(color.name),
label: this.translate.instant(color.name) ?? color.name,
type: 'radio',
checked: tab.color === color.value,
click: () => {

View File

@@ -117,15 +117,13 @@ window-controls {
$border-color: $base1;
body {
app-root {
background: $body-bg;
&.vibrant {
background: rgba(255, 255, 255,.4) !important;
}
}
app-root {
&> .content {
.tab-bar {
.btn-tab-bar {
@@ -382,11 +380,11 @@ start-page footer {
background: $white !important;
}
.terminal-toolbar {
terminal-toolbar {
background: #ffffff4a !important;
border-bottom: 1px solid #00000026 !important;
}
.bg-dark{
background-color: $base2 !important;
}
}

View File

@@ -25,15 +25,13 @@ window-controls {
$border-color: #111;
body {
app-root {
background: $body-bg;
&.vibrant {
background: rgba(0,0,0,.65);
}
}
app-root {
&.no-tabs {
background: rgba(0,0,0,.5);
}
@@ -138,7 +136,7 @@ app-root {
tab-body {
background: $content-bg;
.terminal-toolbar .btn, .toolbar-pin-button {
terminal-toolbar .btn, .toolbar-pin-button {
font-weight: bold;
}
}

View File

@@ -31,11 +31,7 @@ export class StandardCompactTheme extends Theme {
/** @hidden */
@Injectable()
export class PaperTheme extends Theme {
name = this.translate.instant('Paper')
name = 'Paper'
css = require('./theme.paper.scss')
terminalBackground = '#f7f1e0'
constructor (private translate: TranslateService) {
super()
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-electron",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Electron-specific bindings",
"keywords": [
"tabby-builtin-plugin"

View File

@@ -1,7 +1,8 @@
import { NgModule } from '@angular/core'
import { PlatformService, LogService, UpdaterService, DockingService, HostAppService, ThemesService, Platform, AppService, ConfigService, WIN_BUILD_FLUENT_BG_SUPPORTED, isWindowsBuild, HostWindowService, HotkeyProvider, ConfigProvider, FileProvider } from 'tabby-core'
import { TerminalColorSchemeProvider } from 'tabby-terminal'
import { SFTPContextMenuItemProvider } from 'tabby-ssh'
import { SFTPContextMenuItemProvider, SSHProfileImporter } from 'tabby-ssh'
import { auditTime } from 'rxjs'
import { HyperColorSchemes } from './colorSchemes'
import { ElectronPlatformService } from './services/platform.service'
@@ -16,6 +17,7 @@ import { ElectronService } from './services/electron.service'
import { ElectronHotkeyProvider } from './hotkeys'
import { ElectronConfigProvider } from './config'
import { EditSFTPContextMenu } from './sftpContextMenu'
import { OpenSSHImporter, StaticFileImporter } from './sshImporters'
@NgModule({
providers: [
@@ -30,6 +32,8 @@ import { EditSFTPContextMenu } from './sftpContextMenu'
{ provide: ConfigProvider, useClass: ElectronConfigProvider, multi: true },
{ provide: FileProvider, useClass: ElectronFileProvider, multi: true },
{ provide: SFTPContextMenuItemProvider, useClass: EditSFTPContextMenu, multi: true },
{ provide: SSHProfileImporter, useExisting: OpenSSHImporter, multi: true },
{ provide: SSHProfileImporter, useExisting: StaticFileImporter, multi: true },
],
})
export default class ElectronModule {
@@ -68,7 +72,7 @@ export default class ElectronModule {
let lastProgress: number|null = null
app.tabOpened$.subscribe(tab => {
tab.progress$.subscribe(progress => {
tab.progress$.pipe(auditTime(250)).subscribe(progress => {
if (lastProgress === progress) {
return
}
@@ -113,7 +117,6 @@ export default class ElectronModule {
if (this.hostApp.platform === Platform.Windows && !isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) {
vibrancyType = null
}
document.body.classList.toggle('vibrant', this.config.store.appearance.vibrancy)
this.electron.ipcRenderer.send('window-set-vibrancy', this.config.store.appearance.vibrancy, vibrancyType)
this.hostWindow.setOpacity(this.config.store.appearance.opacity)

View File

@@ -15,6 +15,7 @@ export class ElectronHostWindow extends HostWindowService {
get isFullscreen (): boolean { return this._isFullscreen }
private _isFullscreen = false
private _isMaximized = false
constructor (
zone: NgZone,
@@ -47,6 +48,16 @@ export class ElectronHostWindow extends HostWindowService {
electron.ipcRenderer.on('host:became-main-window', () => zone.run(() => {
this.bootstrapData.isMainWindow = true
}))
electron.ipcRenderer.on('host:window-maximized', () => zone.run(() => {
this._isMaximized = true
}))
electron.ipcRenderer.on('host:window-unmaximized', () => zone.run(() => {
this._isMaximized = false
}))
this._isMaximized = this.getWindow().isMaximized()
}
getWindow (): BrowserWindow {
@@ -74,7 +85,7 @@ export class ElectronHostWindow extends HostWindowService {
}
isMaximized (): boolean {
return this.getWindow().isMaximized()
return this._isMaximized
}
toggleMaximize (): void {

View File

@@ -0,0 +1,165 @@
import * as fs from 'fs/promises'
import * as fsSync from 'fs'
import * as path from 'path'
import slugify from 'slugify'
import * as yaml from 'js-yaml'
import { Injectable } from '@angular/core'
import { PartialProfile } from 'tabby-core'
import { SSHProfileImporter, PortForwardType, SSHProfile, SSHProfileOptions } from 'tabby-ssh'
import { ElectronService } from './services/electron.service'
@Injectable({ providedIn: 'root' })
export class OpenSSHImporter extends SSHProfileImporter {
async getProfiles (): Promise<PartialProfile<SSHProfile>[]> {
const deriveID = name => 'openssh-config:' + slugify(name)
const results: PartialProfile<SSHProfile>[] = []
const configPath = path.join(process.env.HOME ?? '~', '.ssh', 'config')
try {
const lines = (await fs.readFile(configPath, 'utf8')).split('\n')
const globalOptions: Partial<SSHProfileOptions> = {}
let currentProfile: PartialProfile<SSHProfile>|null = null
for (let line of lines) {
if (line.trim().startsWith('#') || !line.trim()) {
continue
}
if (line.startsWith('Host ')) {
if (currentProfile) {
results.push(currentProfile)
}
const name = line.substr(5).trim()
currentProfile = {
id: deriveID(name),
name: `${name} (.ssh/config)`,
type: 'ssh',
group: 'Imported from .ssh/config',
options: {
...globalOptions,
host: name,
},
}
} else {
const target: Partial<SSHProfileOptions> = currentProfile?.options ?? globalOptions
line = line.trim()
const idx = /\s/.exec(line)?.index ?? -1
if (idx === -1) {
continue
}
const key = line.substr(0, idx).trim()
const value = line.substr(idx + 1).trim()
if (key === 'IdentityFile') {
target.privateKeys = value.split(',').map(s => s.trim()).map(s => {
if (s.startsWith('~')) {
s = path.join(process.env.HOME ?? '~', s.slice(2))
}
return s
})
} else if (key === 'RemoteForward') {
const bind = value.split(/\s/)[0].trim()
const tgt = value.split(/\s/)[1].trim()
target.forwardedPorts ??= []
target.forwardedPorts.push({
type: PortForwardType.Remote,
description: value,
host: bind.split(':')[0] ?? '127.0.0.1',
port: parseInt(bind.split(':')[1] ?? bind),
targetAddress: tgt.split(':')[0],
targetPort: parseInt(tgt.split(':')[1]),
})
} else if (key === 'LocalForward') {
const bind = value.split(/\s/)[0].trim()
const tgt = value.split(/\s/)[1].trim()
target.forwardedPorts ??= []
target.forwardedPorts.push({
type: PortForwardType.Local,
description: value,
host: bind.split(':')[0] ?? '127.0.0.1',
port: parseInt(bind.split(':')[1] ?? bind),
targetAddress: tgt.split(':')[0],
targetPort: parseInt(tgt.split(':')[1]),
})
} else if (key === 'DynamicForward') {
const bind = value.trim()
target.forwardedPorts ??= []
target.forwardedPorts.push({
type: PortForwardType.Dynamic,
description: value,
host: bind.split(':')[0] ?? '127.0.0.1',
port: parseInt(bind.split(':')[1] ?? bind),
targetAddress: '',
targetPort: 22,
})
} else {
const mappedKey = {
hostname: 'host',
host: 'host',
port: 'port',
user: 'user',
forwardx11: 'x11',
serveraliveinterval: 'keepaliveInterval',
serveralivecountmax: 'keepaliveCountMax',
proxycommand: 'proxyCommand',
proxyjump: 'jumpHost',
}[key.toLowerCase()]
if (mappedKey) {
target[mappedKey] = value
}
}
}
}
if (currentProfile) {
results.push(currentProfile)
}
for (const p of results) {
if (p.options?.proxyCommand) {
p.options.proxyCommand = p.options.proxyCommand
.replace('%h', p.options.host ?? '')
.replace('%p', (p.options.port ?? 22).toString())
}
if (p.options?.jumpHost) {
p.options.jumpHost = deriveID(p.options.jumpHost)
}
}
return results
} catch (e) {
if (e.code === 'ENOENT') {
return []
}
throw e
}
}
}
@Injectable({ providedIn: 'root' })
export class StaticFileImporter extends SSHProfileImporter {
private configPath: string
constructor (
electron: ElectronService,
) {
super()
this.configPath = path.join(electron.app.getPath('userData'), 'ssh-profiles.yaml')
}
async getProfiles (): Promise<PartialProfile<SSHProfile>[]> {
const deriveID = name => 'file-config:' + slugify(name)
if (!fsSync.existsSync(this.configPath)) {
return []
}
const content = await fs.readFile(this.configPath, 'utf8')
if (!content) {
return []
}
return (yaml.load(content) as PartialProfile<SSHProfile>[]).map(item => ({
...item,
id: deriveID(item.name),
type: 'ssh',
}))
}
}

View File

@@ -11,10 +11,10 @@
enabled "2.0.x"
kuler "^2.0.0"
async@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
async@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
balanced-match@^1.0.0:
version "1.0.2"
@@ -70,7 +70,7 @@ color@3.0.x:
color-convert "^1.9.1"
color-string "^1.5.2"
colors@^1.2.1:
colors@1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
@@ -88,11 +88,6 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -146,11 +141,6 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
fast-safe-stringify@^2.0.4:
version "2.0.7"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
fecha@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce"
@@ -217,7 +207,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@^2.0.3, inherits@~2.0.3:
inherits@2, inherits@^2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -289,25 +279,20 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies:
has-symbols "^1.0.2"
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
kuler@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
logform@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2"
integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==
logform@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/logform/-/logform-2.3.2.tgz#68babe6a74ab09a1fd15a9b1e6cbc7713d41cb5b"
integrity sha512-V6JiPThZzTsbVRspNO6TmHkR99oqYTs8fivMBYQkjZj6rxW92KxtDCPE6IkAk1DNBnYKNkjm4jYBm6JDUcyhOA==
dependencies:
colors "^1.2.1"
fast-safe-stringify "^2.0.4"
colors "1.4.0"
fecha "^4.2.0"
ms "^2.1.1"
safe-stable-stringify "^1.1.0"
triple-beam "^1.3.0"
minimatch@^3.0.4:
@@ -371,24 +356,6 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
readable-stream@^2.3.7:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@@ -405,16 +372,21 @@ rimraf@^3.0.0:
dependencies:
glob "^7.1.3"
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-stable-stringify@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a"
integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==
safe-stable-stringify@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73"
integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==
serialize-error@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac"
@@ -457,13 +429,6 @@ string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
text-hex@1.0.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
@@ -503,7 +468,7 @@ unbox-primitive@^1.0.0:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -524,28 +489,30 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
winston-transport@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59"
integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==
winston-transport@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.2.tgz#554efe3fce229d046df006e0e3c411d240652e51"
integrity sha512-9jmhltAr5ygt5usgUTQbEiw/7RYXpyUbEAFRCSicIacpUzPkrnQsQZSPGEI12aLK9Jth4zNcYJx3Cvznwrl8pw==
dependencies:
readable-stream "^2.3.7"
logform "^2.3.2"
readable-stream "^3.4.0"
triple-beam "^1.2.0"
winston@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170"
integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==
version "3.5.0"
resolved "https://registry.yarnpkg.com/winston/-/winston-3.5.0.tgz#b1ef4dbc6d1a7c1b462650070f171abc7ce9eac0"
integrity sha512-OQMbmLsIdVHvm2hSurrYZs+iZNIImXneYJ6pX7LseSMEq20HdTETXiNnNX3FDwN4LB/xDRZLF6JYOY+AI112Kw==
dependencies:
"@dabh/diagnostics" "^2.0.2"
async "^3.1.0"
async "^3.2.3"
is-stream "^2.0.0"
logform "^2.2.0"
logform "^2.3.2"
one-time "^1.0.0"
readable-stream "^3.4.0"
safe-stable-stringify "^2.3.1"
stack-trace "0.0.x"
triple-beam "^1.3.0"
winston-transport "^4.4.0"
winston-transport "^4.4.2"
wrappy@1:
version "1.0.2"

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-linkifier",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Makes URLs, IPs and file paths clickable in Tabby",
"keywords": [
"tabby-builtin-plugin"

View File

@@ -11,7 +11,8 @@ import { LinkHandler } from './api'
@Injectable()
export class URLHandler extends LinkHandler {
// From https://urlregex.com/
regex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{1,5})|([0-9]{1,4})))?(?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/
// with "-" added to last group (https://github.com/Eugeny/tabby/issues/5611)
regex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{1,5})|([0-9]{1,4})))?(?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w-]*))?)/
priority = 5

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-local",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Tabby's local shell plugin",
"keywords": [
"tabby-builtin-plugin"

View File

@@ -1,3 +1,4 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
import { Component, Input, Injector } from '@angular/core'
import { BaseTabProcess, WIN_BUILD_CONPTY_SUPPORTED, isWindowsBuild, GetRecoveryTokenOptions } from 'tabby-core'
import { BaseTerminalTabComponent } from 'tabby-terminal'
@@ -109,12 +110,12 @@ export class TerminalTabComponent extends BaseTerminalTabComponent {
{
type: 'warning',
message: this.translate.instant(
'"{command}" is still running. Close?',
_('"{command}" is still running. Close?'),
children[0],
),
buttons: [
this.translate.instant('Kill'),
this.translate.instant('Cancel'),
this.translate.instant(_('Kill')),
this.translate.instant(_('Cancel')),
],
defaultId: 0,
cancelId: 1,

View File

@@ -18,7 +18,14 @@ export class POSIXShellsProvider extends ShellProvider {
if (this.hostApp.platform === Platform.Windows) {
return []
}
return (await fs.readFile('/etc/shells', { encoding: 'utf-8' }))
let shellListPath = '/etc/shells'
try {
await fs.stat(shellListPath)
} catch {
// Solus Linux
shellListPath = '/usr/share/defaults/etc/shells'
}
return (await fs.readFile(shellListPath, { encoding: 'utf-8' }))
.split('\n')
.map(x => x.trim())
.filter(x => x && !x.startsWith('#'))

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-plugin-manager",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Tabby's plugin manager",
"keywords": [
"tabby-builtin-plugin"

View File

@@ -5,7 +5,10 @@
span(translate) Plugins folder
.alert.alert-danger(*ngIf='errorMessage')
strong {{ 'Error in {plugin}:'|translate:{plugin: erroredPlugin} }}
strong(
translate='Error in {plugin}:',
[translateParams]='{plugin: erroredPlugin}'
)
pre {{errorMessage}}
ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav')
@@ -75,7 +78,10 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav')
)
i.fas.fa-fw.fa-arrow-up(*ngIf='busy.get(plugin.name) != BusyState.Installing')
i.fas.fa-fw.fa-circle-notch.fa-spin(*ngIf='busy.get(plugin.name) == BusyState.Installing')
span {{ 'Upgrade to {version}'|translate:{version: knownUpgrades[plugin.name].version} }}
span(
translate='Upgrade to {version}',
[translateParams]='{version: knownUpgrades[plugin.name].version}'
)
ng-template(ngbPanelContent)
.row

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-serial",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Serial connections for Tabby",
"keywords": [
"tabby-builtin-plugin"
@@ -18,8 +18,7 @@
"license": "MIT",
"devDependencies": {
"@types/node": "14.14.14",
"ansi-colors": "^4.1.1",
"serialport-binding-webserialapi": "^1.0.3"
"ansi-colors": "^4.1.1"
},
"peerDependencies": {
"@angular/animations": "^9.1.9",

View File

@@ -1,5 +1,5 @@
import stripAnsi from 'strip-ansi'
import SerialPort from 'serialport'
import { SerialPortStream } from '@serialport/stream'
import { LogService, NotificationsService, Profile } from 'tabby-core'
import { Subject, Observable } from 'rxjs'
import { Injector, NgZone } from '@angular/core'
@@ -41,7 +41,7 @@ class SlowFeedMiddleware extends SessionMiddleware {
}
export class SerialSession extends BaseSession {
serial: SerialPort
serial: SerialPortStream|null
get serviceMessage$ (): Observable<string> { return this.serviceMessage }
private serviceMessage = new Subject<string>()
@@ -72,11 +72,13 @@ export class SerialSession extends BaseSession {
this.profile.options.port = (await this.serialService.listPorts())[0].name
}
this.serial = new SerialPort(this.profile.options.port, {
const serial = this.serial = new SerialPortStream({
binding: this.serialService.detectBinding(),
path: this.profile.options.port,
autoOpen: false,
baudRate: parseInt(this.profile.options.baudrate as any),
dataBits: this.profile.options.databits ?? 8,
stopBits: this.profile.options.stopbits ?? 1,
dataBits: this.profile.options.databits ?? 8 as any,
stopBits: this.profile.options.stopbits ?? 1 as any,
parity: this.profile.options.parity ?? 'none',
rtscts: this.profile.options.rtscts ?? false,
xon: this.profile.options.xon ?? false,
@@ -85,27 +87,27 @@ export class SerialSession extends BaseSession {
})
let connected = false
await new Promise(async (resolve, reject) => {
this.serial.on('open', () => {
serial.on('open', () => {
connected = true
this.zone.run(resolve)
})
this.serial.on('error', error => {
serial.on('error', error => {
this.zone.run(() => {
if (connected) {
this.notifications.error(error.toString())
this.notifications.error(error.message)
} else {
reject(error)
}
this.destroy()
})
})
this.serial.on('close', () => {
serial.on('close', () => {
this.emitServiceMessage('Port closed')
this.destroy()
})
try {
this.serial.open()
serial.open()
} catch (e) {
this.notifications.error(e.message)
reject(e)
@@ -115,11 +117,11 @@ export class SerialSession extends BaseSession {
this.open = true
setTimeout(() => this.streamProcessor.start())
this.serial.on('readable', () => {
this.emitOutput(this.serial.read())
serial.on('readable', () => {
this.emitOutput(serial.read())
})
this.serial.on('end', () => {
serial.on('end', () => {
this.logger.info('Shell session ended')
if (this.open) {
this.destroy()
@@ -144,7 +146,7 @@ export class SerialSession extends BaseSession {
}
kill (_?: string): void {
this.serial.close()
this.serial?.close()
}
emitServiceMessage (msg: string): void {

View File

@@ -1,7 +1,4 @@
.terminal-toolbar(
(mouseenter)='showToolbar()',
(mouseleave)='hideToolbar()'
)
terminal-toolbar([tab]='this')
i.fas.fa-xs.fa-circle.text-success.mr-2(*ngIf='session && session.open')
i.fas.fa-xs.fa-circle.text-danger.mr-2(*ngIf='!session || !session.open')
strong {{profile.options.port}} ({{profile.options.baudrate}})

View File

@@ -1,4 +1,5 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
import colors from 'ansi-colors'
import { Component, Injector } from '@angular/core'
import { first } from 'rxjs'
@@ -68,12 +69,12 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
const session = new SerialSession(this.injector, this.profile)
this.setSession(session)
this.startSpinner(this.translate.instant('Connecting'))
this.startSpinner(this.translate.instant(_('Connecting')))
try {
await this.session!.start()
this.stopSpinner()
session.emitServiceMessage(this.translate.instant('Port opened'))
session.emitServiceMessage(this.translate.instant(_('Port opened')))
} catch (e) {
this.stopSpinner()
this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n')
@@ -88,7 +89,7 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
this.session?.resize(this.size.columns, this.size.rows)
})
this.attachSessionHandler(this.session!.destroyed$, () => {
this.write(this.translate.instant('Press any key to reconnect') + '\r\n')
this.write(this.translate.instant(_('Press any key to reconnect')) + '\r\n')
this.input$.pipe(first()).subscribe(() => {
if (!this.session?.open) {
this.reconnect()
@@ -114,7 +115,7 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
async changeBaudRate () {
const rate = await this.selector.show(
this.translate.instant('Baud rate'),
this.translate.instant(_('Baud rate')),
BAUD_RATES.map(x => ({
name: x.toString(), result: x,
})),

View File

@@ -1,6 +1,4 @@
import slugify from 'slugify'
import SerialPort from 'serialport'
import WSABinding from 'serialport-binding-webserialapi'
import deepClone from 'clone-deep'
import { Injectable } from '@angular/core'
import { ProfileProvider, NewTabParameters, SelectorService, HostAppService, Platform, TranslateService } from 'tabby-core'
@@ -41,9 +39,6 @@ export class SerialProfilesService extends ProfileProvider<SerialProfile> {
private translate: TranslateService,
) {
super()
if (hostApp.platform === Platform.Web) {
SerialPort.Binding = WSABinding
}
}
async getBuiltinProfiles (): Promise<SerialProfile[]> {

View File

@@ -1,6 +1,8 @@
import { Injectable } from '@angular/core'
import SerialPort from 'serialport'
import { PartialProfile, ProfilesService } from 'tabby-core'
import WSABinding from 'serialport-binding-webserialapi'
import AbstractBinding from '@serialport/binding-abstract'
import { autoDetect } from '@serialport/bindings-cpp'
import { HostAppService, PartialProfile, Platform, ProfilesService } from 'tabby-core'
import { SerialPortInfo, SerialProfile } from '../api'
import { SerialTabComponent } from '../components/serialTab.component'
@@ -8,13 +10,23 @@ import { SerialTabComponent } from '../components/serialTab.component'
export class SerialService {
private constructor (
private profilesService: ProfilesService,
private hostApp: HostAppService,
) { }
detectBinding (): typeof AbstractBinding {
return this.hostApp.platform === Platform.Web ? WSABinding : autoDetect()
}
async listPorts (): Promise<SerialPortInfo[]> {
return (await SerialPort.list()).map(x => ({
name: x.path,
description: x.manufacturer || x.serialNumber ? `${x.manufacturer || ''} ${x.serialNumber || ''}` : undefined,
}))
try {
return (await this.detectBinding().list()).map(x => ({
name: x.path,
description: `${x.manufacturer ?? ''} ${x.serialNumber ?? ''}`.trim() || undefined,
}))
} catch (err) {
console.error('Failed to list serial ports', err)
return []
}
}
quickConnect (query: string): Promise<SerialTabComponent|null> {

View File

@@ -2,20 +2,6 @@
# yarn lockfile v1
"@serialport/binding-abstract@^9.0.2":
version "9.0.7"
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-9.0.7.tgz#d2c7ecea0f100bdf20187bfc0d34ba90f5504e1e"
integrity sha512-g1ncCMIG9rMsxo/28ObYmXZcHThlvtZygsCANmyMUuFS7SwXY4+PhcEnt2+ZcMkEDNRiOklT+ngtIVx5GGpt/A==
dependencies:
debug "^4.3.1"
"@serialport/stream@^9.0.2":
version "9.0.7"
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-9.0.7.tgz#0bf023eb0233a714fcc5a86de09e381e466d9882"
integrity sha512-c/h7HPAeFiryD9iTGlaSvPqHFHSZ0NMQHxC4rcmKS2Vu3qJuEtkBdTLABwsMp7iWEiSnI4KC3s7bHapaXP06FQ==
dependencies:
debug "^4.3.1"
"@types/node@14.14.14":
version "14.14.14"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae"
@@ -25,23 +11,3 @@ ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
debug@^4.3.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
serialport-binding-webserialapi@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/serialport-binding-webserialapi/-/serialport-binding-webserialapi-1.0.3.tgz#cf4348c075da2de8f6cf9936c0b95645f3ae657b"
integrity sha512-TS7dsvetVoTeiWlzpsT/akjtljiYPO56FoJWSFyJSoO/E8icYJ2neQ7CW5NW/sHZDnMqAxULyAny47UFhWz9oQ==
dependencies:
"@serialport/binding-abstract" "^9.0.2"
"@serialport/stream" "^9.0.2"

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-settings",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "Tabby terminal settings page",
"keywords": [
"tabby-builtin-plugin"
@@ -17,6 +17,7 @@
"author": "Eugene Pankov",
"license": "MIT",
"devDependencies": {
"@types/marked": "^4.0.2",
"marked": "^4.0.8",
"ngx-infinite-scroll": "^10.0.1"
},

View File

@@ -59,7 +59,10 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
i.fas.fa-fw.fa-file
.ml-2.d-flex.flex-column.align-items-start
div {{cfg.name}}
small.text-muted {{ 'Modified on {date}'|translate:{date: cfg.modified_at|date:"medium"} }}
small.text-muted(
translate='Modified on {date}',
[translateParams]='{date: cfg.modified_at|date:"medium"}'
)
.mr-auto
button.btn.btn-link.ml-1(
(click)='uploadAndSync(cfg)',

View File

@@ -2,7 +2,10 @@
h3.m-0 {{profile.name}}
.modal-header(*ngIf='defaultsMode')
h3.m-0 {{ 'Defaults for {type}'|translate:{type: profileProvider.name} }}
h3.m-0(
translate='Defaults for {type}',
[translateParams]='{type: profileProvider.name}'
)
.modal-body
.row

View File

@@ -10,7 +10,7 @@ h3.mb-3(translate) Hotkeys
ng-container(*ngFor='let hotkey of hotkeyDescriptions')
.row.align-items-center(*ngIf='!hotkeyFilter || hotkeyFilterFn(hotkey, hotkeyFilter)')
.col-8.py-2
span {{hotkey.name}}
span {{hotkey.name|translate}}
span.ml-2.text-muted ({{hotkey.id}})
.col-4.pr-5
multi-hotkey-input(

View File

@@ -68,8 +68,8 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
*ngIf='iconIsSVG(profile.icon)'
)
div {{profile.name}}
.text-muted.ml-2 {{getDescription(profile)}}
.no-wrap {{profile.name}}
.text-muted.no-wrap.ml-2 {{getDescription(profile)}}
.mr-auto

View File

@@ -1,3 +1,4 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
import { v4 as uuidv4 } from 'uuid'
import slugify from 'slugify'
import deepClone from 'clone-deep'
@@ -13,6 +14,8 @@ interface ProfileGroup {
collapsed: boolean
}
_('Ungrouped')
/** @hidden */
@Component({
template: require('./profilesSettingsTab.component.pug'),
@@ -197,7 +200,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
if ((await this.platform.showMessageBox(
{
type: 'warning',
message: this.translate.instant(`Delete the group's profiles?`),
message: this.translate.instant('Delete the group\'s profiles?'),
buttons: [
this.translate.instant('Move to "Ungrouped"'),
this.translate.instant('Delete'),

View File

@@ -1,4 +1,5 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
import axios from 'axios'
import { marked } from 'marked'
import { Component } from '@angular/core'
@@ -23,7 +24,7 @@ export class ReleaseNotesComponent extends BaseTabComponent {
constructor (translate: TranslateService) {
super()
this.setTitle(translate.instant('Release notes'))
this.setTitle(translate.instant(_('Release notes')))
this.loadReleases(1)
}

View File

@@ -69,12 +69,12 @@
.form-line
.header
.title(translate) Language
select.form-control([(ngModel)]='config.store.language', (ngModelChange)='saveConfiguration()')
select.form-control([(ngModel)]='config.store.language', (ngModelChange)='saveConfiguration(true)')
option([ngValue]='null', translate) Automatic
option(
[value]='lang.code',
*ngFor='let lang of locale.allLanguages'
) {{lang.name|translate}}
*ngFor='let lang of allLanguages'
) {{lang.name}}
.form-line(*ngIf='platform.isShellIntegrationSupported()')
.header
@@ -109,7 +109,7 @@
li(*ngIf='provider.prioritized', [ngbNavItem]='provider.id')
a(ngbNavLink)
i(class='fas fa-fw mr-2 fa-{{provider.icon}}')
span(translate) {{provider.title}}
span {{provider.title|translate}}
ng-template(ngbNavContent)
settings-tab-body([provider]='provider')
@@ -119,7 +119,7 @@
li(*ngIf='!provider.prioritized', [ngbNavItem]='provider.id')
a(ngbNavLink)
i(class='fas fa-fw mr-2 fa-{{provider.icon || "puzzle-piece"}}')
span(translate) {{provider.title}}
span {{provider.title|translate}}
ng-template(ngbNavContent)
settings-tab-body([provider]='provider')

View File

@@ -1,4 +1,5 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
import * as yaml from 'js-yaml'
import { debounce } from 'utils-decorators/dist/esm/debounce/debounce'
import { Component, Inject, Input, HostBinding, NgZone } from '@angular/core'
@@ -36,6 +37,7 @@ export class SettingsTabComponent extends BaseTabComponent {
checkingForUpdate = false
updateAvailable = false
showConfigDefaults = false
allLanguages = LocaleService.allLanguages
@HostBinding('class.pad-window-controls') padWindowControls = false
constructor (
@@ -52,7 +54,7 @@ export class SettingsTabComponent extends BaseTabComponent {
translate: TranslateService,
) {
super()
this.setTitle(translate.instant('Settings'))
this.setTitle(translate.instant(_('Settings')))
this.settingsProviders = config.enabledServices(this.settingsProviders)
this.settingsProviders = this.settingsProviders.filter(x => !!x.getComponentType())
this.settingsProviders.sort((a, b) => a.weight - b.weight + a.title.localeCompare(b.title))
@@ -112,7 +114,7 @@ export class SettingsTabComponent extends BaseTabComponent {
try {
yaml.load(this.configFile)
return true
} catch (_) {
} catch {
return false
}
}

View File

@@ -268,7 +268,7 @@ h3.mt-4(translate) Tabs
ngbButton,
[value]='true'
)
span(translate) Dynamic
span(translate, translateComment='[Dynamic] tab width') id.tab-width.dynamic
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',

View File

@@ -14,6 +14,11 @@ export class SettingsConfigProvider extends ConfigProvider {
vault: true,
},
},
hotkeys: {
'settings-tab': {
__nonStructural: true,
},
},
}
platformDefaults = {
[Platform.macOS]: {

View File

@@ -1,5 +1,6 @@
import { Injectable } from '@angular/core'
import { Inject, Injectable } from '@angular/core'
import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core'
import { SettingsTabProvider } from './api'
/** @hidden */
@Injectable()
@@ -11,9 +12,18 @@ export class SettingsHotkeyProvider extends HotkeyProvider {
},
]
constructor (private translate: TranslateService) { super() }
constructor (
private translate: TranslateService,
@Inject(SettingsTabProvider) private settingsProviders: SettingsTabProvider[],
) { super() }
async provide (): Promise<HotkeyDescription[]> {
return this.hotkeys
return [
...this.hotkeys,
...this.settingsProviders.map(provider => ({
id: `settings-tab.${provider.id}`,
name: this.translate.instant('Open settings tab: {tab}', { tab: provider.title }),
})),
]
}
}

View File

@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms'
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
import { InfiniteScrollModule } from 'ngx-infinite-scroll'
import TabbyCorePlugin, { ToolbarButtonProvider, HotkeyProvider, ConfigProvider } from 'tabby-core'
import TabbyCorePlugin, { ToolbarButtonProvider, HotkeyProvider, ConfigProvider, HotkeysService, AppService } from 'tabby-core'
import { EditProfileModalComponent } from './components/editProfileModal.component'
import { HotkeyInputModalComponent } from './components/hotkeyInputModal.component'
@@ -74,7 +74,21 @@ import { HotkeySettingsTabProvider, WindowSettingsTabProvider, VaultSettingsTabP
],
})
export default class SettingsModule {
constructor (public configSync: ConfigSyncService) { }
constructor (
public configSync: ConfigSyncService,
app: AppService,
hotkeys: HotkeysService,
) {
hotkeys.hotkey$.subscribe(async hotkey => {
if (hotkey.startsWith('settings-tab.')) {
const id = hotkey.substring(hotkey.indexOf('.') + 1)
app.openNewTabRaw({
type: SettingsTabComponent,
inputs: { activeTab: id },
})
}
})
}
}
export * from './api'

View File

@@ -7,10 +7,15 @@
resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.1.1.tgz#d8b9f20037b3a37dbf8dcdc4b3b72f9285bfce35"
integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==
"@types/marked@^4.0.2":
version "4.0.2"
resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.2.tgz#cb2dbf10da2f41cf20bd91fb5f89b67540c282f7"
integrity sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==
marked@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.8.tgz#ef127626ac65786460f9420d57cc8d5ffdcacbed"
integrity sha512-dkpJMIlJpc833hbjjg8jraw1t51e/eKDoG8TFOgc5O0Z77zaYKigYekTDop5AplRoKFGIaoazhYEhGkMtU3IeA==
version "4.0.12"
resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.12.tgz#2262a4e6fd1afd2f13557726238b69a48b982f7d"
integrity sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==
ngx-infinite-scroll@^10.0.1:
version "10.0.1"

View File

@@ -1,6 +1,6 @@
{
"name": "tabby-ssh",
"version": "1.0.170-nightly.0",
"version": "1.0.171-nightly.3",
"description": "SSH connections for Tabby",
"keywords": [
"tabby-builtin-plugin"

View File

@@ -0,0 +1,6 @@
import { PartialProfile } from 'tabby-core'
import { SSHProfile } from './interfaces'
export abstract class SSHProfileImporter {
abstract getProfiles (): Promise<PartialProfile<SSHProfile>[]>
}

Some files were not shown because too many files have changed in this diff Show More