Compare commits
211 Commits
all-contri
...
v1.0.178
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b3df681753 | ||
![]() |
524ccd06f3 | ||
![]() |
8c4c07c39b | ||
![]() |
296188c45e | ||
![]() |
509ae8d32e | ||
![]() |
f160353abe | ||
![]() |
02fb0db9de | ||
![]() |
0a0ec35b84 | ||
![]() |
fbcb165708 | ||
![]() |
643efb13a7 | ||
![]() |
5a2f14746f | ||
![]() |
fdf9004323 | ||
![]() |
12aa28e766 | ||
![]() |
1fb67e1730 | ||
![]() |
5f0520def9 | ||
![]() |
1aa45ddcdf | ||
![]() |
cfa6c104cd | ||
![]() |
3bb9acfb98 | ||
![]() |
50c585e14c | ||
![]() |
de8afc1e7a | ||
![]() |
eea02eed2a | ||
![]() |
40f57a9709 | ||
![]() |
f2809927c2 | ||
![]() |
f27afebd82 | ||
![]() |
78b4b28480 | ||
![]() |
76562a23ae | ||
![]() |
37a88ea3c4 | ||
![]() |
4d89b1853f | ||
![]() |
67a05dfb39 | ||
![]() |
3e207f7ed2 | ||
![]() |
d3bc36d9a1 | ||
![]() |
0a69f54851 | ||
![]() |
8b3448c72d | ||
![]() |
66b84418b4 | ||
![]() |
1834ba25e0 | ||
![]() |
740c77374e | ||
![]() |
50e9399ee1 | ||
![]() |
30d38e530e | ||
![]() |
6e5504c96c | ||
![]() |
85e0eabc76 | ||
![]() |
f83c1fddb4 | ||
![]() |
f35a9b594f | ||
![]() |
e8769b2e9e | ||
![]() |
24f81ba070 | ||
![]() |
a96a9ea5e5 | ||
![]() |
a98050b1cd | ||
![]() |
8ee1d0076b | ||
![]() |
f47931e763 | ||
![]() |
8539663056 | ||
![]() |
33fca7c176 | ||
![]() |
c80ad41521 | ||
![]() |
9ef4fc3195 | ||
![]() |
a37f2f0eee | ||
![]() |
ff0c2a72df | ||
![]() |
ef920c4bac | ||
![]() |
224f83a283 | ||
![]() |
f1d91162c3 | ||
![]() |
63fd01ae26 | ||
![]() |
d6bdccf66e | ||
![]() |
ead2414c48 | ||
![]() |
ef18541531 | ||
![]() |
7e0b9ecb56 | ||
![]() |
e537b61edd | ||
![]() |
175016bb1a | ||
![]() |
9f4c12ba96 | ||
![]() |
6dc14e0fd5 | ||
![]() |
b154d87865 | ||
![]() |
0aa7e53a78 | ||
![]() |
272918bff6 | ||
![]() |
7cddcee951 | ||
![]() |
fa2bbe39c4 | ||
![]() |
a5fb726206 | ||
![]() |
ec22c00ba5 | ||
![]() |
052d771748 | ||
![]() |
c1bd2a720d | ||
![]() |
5f4a7c4d39 | ||
![]() |
96cd676109 | ||
![]() |
19a73264be | ||
![]() |
8e7f69cb58 | ||
![]() |
563cc49c3c | ||
![]() |
3851353e80 | ||
![]() |
7032bff827 | ||
![]() |
271955e9d4 | ||
![]() |
a29539af69 | ||
![]() |
4c242fdca4 | ||
![]() |
80b44500c4 | ||
![]() |
5433cc6136 | ||
![]() |
9d88ed6371 | ||
![]() |
12362231cf | ||
![]() |
a31cacf4ee | ||
![]() |
3e2f93c226 | ||
![]() |
a434220ff0 | ||
![]() |
9be970614a | ||
![]() |
a629092985 | ||
![]() |
8808593b00 | ||
![]() |
a78fe7a9a8 | ||
![]() |
9faf3ccd1d | ||
![]() |
75a7707965 | ||
![]() |
5714fc85d3 | ||
![]() |
7668f4beea | ||
![]() |
7b41cb0936 | ||
![]() |
fee18c4f8b | ||
![]() |
716ce018fb | ||
![]() |
8107b96563 | ||
![]() |
d7146eb523 | ||
![]() |
62b94bff2f | ||
![]() |
f653fe9c85 | ||
![]() |
ae82e568dd | ||
![]() |
2ba4036275 | ||
![]() |
43d389a1ef | ||
![]() |
c7a72da0ab | ||
![]() |
66fad228fc | ||
![]() |
5e217cf654 | ||
![]() |
28b227bca4 | ||
![]() |
d2b0fae9ed | ||
![]() |
4299236c4d | ||
![]() |
2af4714d66 | ||
![]() |
389e05c832 | ||
![]() |
500a42c1f7 | ||
![]() |
fceb1da62f | ||
![]() |
8dba1bf5cd | ||
![]() |
7c5e136c31 | ||
![]() |
4c9fb9a3d4 | ||
![]() |
a6e5f004a8 | ||
![]() |
5b845dae45 | ||
![]() |
dc037bc918 | ||
![]() |
13fe3ef1ec | ||
![]() |
c4544256e1 | ||
![]() |
25f5cf04ea | ||
![]() |
36a63e771f | ||
![]() |
fd809d7d85 | ||
![]() |
81fe06a9f6 | ||
![]() |
e3d6b5f3d7 | ||
![]() |
4e3caa7409 | ||
![]() |
7b6ce3aeba | ||
![]() |
fdf66b7b22 | ||
![]() |
42867818da | ||
![]() |
58f2c3d081 | ||
![]() |
1c011b6fe3 | ||
![]() |
88c2a9996b | ||
![]() |
b68213e278 | ||
![]() |
6bb8deacb7 | ||
![]() |
5dc3eecb74 | ||
![]() |
531b658405 | ||
![]() |
a710819615 | ||
![]() |
ca441b6f83 | ||
![]() |
b6d0bd2d43 | ||
![]() |
3cce468bf3 | ||
![]() |
22d1119c33 | ||
![]() |
ddbfc700e5 | ||
![]() |
93081162fe | ||
![]() |
4fb158d2a1 | ||
![]() |
0bbb11131d | ||
![]() |
4a82294741 | ||
![]() |
9a08bf8782 | ||
![]() |
2e83b450a9 | ||
![]() |
c540f1a813 | ||
![]() |
450a0f3980 | ||
![]() |
b97d3e30fb | ||
![]() |
12486584f0 | ||
![]() |
90168323c8 | ||
![]() |
e1d86810e3 | ||
![]() |
7be713495e | ||
![]() |
27ed3b0444 | ||
![]() |
5d2db6d85c | ||
![]() |
ba7571248c | ||
![]() |
763bb2c7aa | ||
![]() |
3d841eb97c | ||
![]() |
7016688170 | ||
![]() |
358a7563f6 | ||
![]() |
9c6acf99d0 | ||
![]() |
eaf4ed9855 | ||
![]() |
4a33936e7d | ||
![]() |
903b7d70f9 | ||
![]() |
143f5edcb3 | ||
![]() |
0ee0f98462 | ||
![]() |
b330c428e6 | ||
![]() |
61810da810 | ||
![]() |
1e85acb99e | ||
![]() |
38c1fafeee | ||
![]() |
5e75d88f1d | ||
![]() |
4fe4ae8b9b | ||
![]() |
23040aa217 | ||
![]() |
14cf0a574e | ||
![]() |
50887af27f | ||
![]() |
3dca21394f | ||
![]() |
109f38b7cc | ||
![]() |
ecc5f6d1de | ||
![]() |
ead3a30cf0 | ||
![]() |
facc1f1dff | ||
![]() |
74dc6002d1 | ||
![]() |
cc67774108 | ||
![]() |
5c04c11132 | ||
![]() |
be72cd59cc | ||
![]() |
4cf9eda55f | ||
![]() |
db866fbacf | ||
![]() |
086c4e68e6 | ||
![]() |
e303621fc5 | ||
![]() |
579b60236b | ||
![]() |
31f549f5bb | ||
![]() |
f18c58360d | ||
![]() |
3287f410b7 | ||
![]() |
1a37ba224d | ||
![]() |
49934aea5d | ||
![]() |
da3143fab8 | ||
![]() |
95ae4b84a6 | ||
![]() |
f85294e603 | ||
![]() |
7807c5e1c8 | ||
![]() |
a2975f5234 | ||
![]() |
e049d38cef | ||
![]() |
5abe2e6376 |
@@ -4,7 +4,8 @@
|
||||
"README.zh-CN.md",
|
||||
"README.ru-RU.md",
|
||||
"README.ko-KR.md",
|
||||
"README.it-IT.md"
|
||||
"README.it-IT.md",
|
||||
"README.de-DE.md"
|
||||
],
|
||||
"imageSize": 100,
|
||||
"commit": false,
|
||||
@@ -688,9 +689,73 @@
|
||||
"name": "Timofey Gribanov",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/48593815?v=4",
|
||||
"profile": "https://timagribanov.github.io/",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ChristianBingman",
|
||||
"name": "Christian Bingman",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/42191425?v=4",
|
||||
"profile": "https://git.christianbingman.com",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Ox0400",
|
||||
"name": "zhipeng",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/5310853?v=4",
|
||||
"profile": "http://zhangzhipeng2023.cn/",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "woodmeal",
|
||||
"name": "woodmeal",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/104011197?v=4",
|
||||
"profile": "https://github.com/woodmeal",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "MagicLike",
|
||||
"name": "MagicLike",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/82117109?v=4",
|
||||
"profile": "https://magiclike.codeberg.page/",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "hisamafahri",
|
||||
"name": "Hisam Fahri",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/65691613?v=4",
|
||||
"profile": "https://github.com/hisamafahri",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "LiangchengJ",
|
||||
"name": "Liangcheng Juves",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/48881023?v=4",
|
||||
"profile": "https://liangchengj.com",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "attet",
|
||||
"name": "Atte Timonen",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1911416?v=4",
|
||||
"profile": "https://github.com/attet",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
32
.github/workflows/build.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.0.0
|
||||
uses: actions/setup-node@v3.2.0
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
@@ -46,21 +46,14 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.0.0
|
||||
uses: actions/setup-node@v3.2.0
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo npm i -g yarn@1.22.1
|
||||
cd app
|
||||
yarn --network-timeout 1000000
|
||||
cd ..
|
||||
rm app/node_modules/.yarn-integrity
|
||||
yarn --network-timeout 1000000
|
||||
|
||||
- name: Build native deps
|
||||
run: scripts/build-native.js
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
|
||||
@@ -91,6 +84,8 @@ jobs:
|
||||
APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}
|
||||
APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }}
|
||||
USE_HARD_LINKS: false
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
# DEBUG: electron-builder,electron-builder:*
|
||||
|
||||
- name: Build packages without signing
|
||||
@@ -139,7 +134,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install Node
|
||||
uses: actions/setup-node@v3.0.0
|
||||
uses: actions/setup-node@v3.2.0
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
@@ -148,14 +143,7 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install libarchive-tools zsh
|
||||
npm i -g yarn@1.19.1
|
||||
cd app
|
||||
yarn --network-timeout 1000000
|
||||
cd ..
|
||||
rm app/node_modules/.yarn-integrity
|
||||
yarn --network-timeout 1000000
|
||||
|
||||
- name: Build native deps
|
||||
run: scripts/build-native.js
|
||||
|
||||
- name: Webpack
|
||||
run: yarn run build
|
||||
@@ -168,6 +156,8 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
USE_HARD_LINKS: false
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
# DEBUG: electron-builder,electron-builder:*
|
||||
|
||||
- name: Build web resources
|
||||
@@ -241,7 +231,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- arch: x86_64
|
||||
- arch: x64
|
||||
- arch: arm64
|
||||
|
||||
steps:
|
||||
@@ -251,7 +241,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.0.0
|
||||
uses: actions/setup-node@v3.2.0
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
@@ -265,7 +255,6 @@ jobs:
|
||||
run: |
|
||||
npm i -g yarn@1.19.1
|
||||
yarn --network-timeout 1000000
|
||||
node scripts/build-native.js
|
||||
yarn run build
|
||||
node scripts/prepackage-plugins.js
|
||||
env:
|
||||
@@ -275,10 +264,13 @@ jobs:
|
||||
run: node scripts/build-windows.js
|
||||
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
|
||||
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
|
||||
DEBUG: electron-builder,electron-builder:*
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
|
||||
- name: Build packages without signing
|
||||
run: node scripts/build-windows.js
|
||||
|
6
.github/workflows/codeql-analysis.yml
vendored
@@ -42,7 +42,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -67,4 +67,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
uses: github/codeql-action/analyze@v2
|
||||
|
4
.github/workflows/docs.yml
vendored
@@ -12,9 +12,9 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.0.0
|
||||
uses: actions/setup-node@v3.2.0
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
|
@@ -11,7 +11,6 @@ First, install the dependencies:
|
||||
```
|
||||
# macOS:
|
||||
yarn
|
||||
./scripts/build-native.js
|
||||
```
|
||||
|
||||
**Note: For compiling for Linux armv7l, you need to downgrade electron to 17.0.0 in package.json present in root directory of tabby source**
|
||||
@@ -20,14 +19,12 @@ yarn
|
||||
# Linux (Debian/Ubuntu here as an example)
|
||||
sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 cmake
|
||||
yarn
|
||||
./scripts/build-native.js
|
||||
```
|
||||
|
||||
```
|
||||
# Windows:
|
||||
npm -g install windows-build-tools
|
||||
yarn
|
||||
node scripts\build-native.js
|
||||
```
|
||||
|
||||
Now, check if your build is working:
|
||||
|
270
README.de-DE.md
Normal file
@@ -0,0 +1,270 @@
|
||||
[](https://tabby.sh)
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="Alle GitHub Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Übersetzen" src="https://shields.io/badge/Übersetzen-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Abonnieren-Nachrichten-blue?logo=twitter&style=for-the-badge&color=blue"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://ko-fi.com/J3J8KWTF">
|
||||
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
|
||||
### Downloads:
|
||||
|
||||
* [Neueste Version](https://github.com/Eugeny/tabby/releases/latest)
|
||||
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-basiert](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-basiert](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||
* [Neueste nightly Version](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
|
||||
[**Tabby**](https://tabby.sh) (ehemals **Terminus**) ist ein äußerst konfigurierbarer Terminalemulator, SSH- und serieller Client für Windows, macOS und Linux
|
||||
|
||||
* Integrierter SSH- und Telnet-Client und Verbindungsmanager
|
||||
* Integriertes serielles Terminal
|
||||
* Theming und Farbschemata
|
||||
* Vollständig konfigurierbare Tastenkombinationen und Multi-Akkord-Tastenkombinationen
|
||||
* Geteilte Fenster
|
||||
* Merkt sich deine Tabs
|
||||
* Unterstützung für PowerShell (und PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder und CMD
|
||||
* Direkte Dateiübertragung von/zu SSH-Sitzungen über Zmodem
|
||||
* Vollständige Unicode-Unterstützung, einschließlich Zeichen mit doppelter Breite
|
||||
* Kein Abbruch bei schnell ablaufenden Ausgaben
|
||||
* Richtiges Shell-Erlebnis unter Windows, einschließlich Tabulator-Vervollständigung (über Clink)
|
||||
* Integrierter verschlüsselter Container für SSH-Secrets und Konfiguration
|
||||
* SSH-, SFTP- und Telnet-Client verfügbar als [Web-App](https://tabby.sh/app) (auch [selbstgehostet](https://github.com/Eugeny/tabby-web)).
|
||||
|
||||
# Inhaltsverzeichnis <!-- omit in toc -->
|
||||
|
||||
- [Was Tabby ist und was nicht](#what-tabby-is-and-isnt)
|
||||
- [Terminal-Funktionen](#terminal-features)
|
||||
- [SSH Client](#ssh-client)
|
||||
- [Serielles Terminal](#serial-terminal)
|
||||
- [Portabel](#portable)
|
||||
- [Plugins](#plugins)
|
||||
- [Themen](#themes)
|
||||
- [Beitragen](#contributing)
|
||||
|
||||
<a name="about"></a>
|
||||
|
||||
# Was Tabby ist und was nicht
|
||||
|
||||
**Tabby ist** eine Alternative zu Windows Standard-Terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app und iTerm
|
||||
|
||||
**Tabby ist weder** eine neue Shell noch ein MinGW- oder Cygwin-Ersatz. Sie ist auch nicht gerade sparsam - wenn die RAM-Nutzung von Bedeutung ist, solltest Du [Conemu](https://conemu.github.io) oder [Alacritty](https://github.com/jwilm/alacritty) in Betracht ziehen.
|
||||
|
||||
<a name="terminal"></a>
|
||||
|
||||
# Terminal-Funktionen
|
||||
|
||||

|
||||
|
||||
* Ein V220-Terminal + verschiedene Erweiterungen
|
||||
* Mehrere verschachtelte, geteilte Fenster
|
||||
* Tabs auf jeder Seite des Fensters
|
||||
* Optional andockbares Fenster mit einem globalen Spawn-Hotkey ("Quake-Konsole")
|
||||
* Fortschrittserkennung
|
||||
* Benachrichtigung bei Prozessabschluss
|
||||
* Einfügen in Klammern, mehrzeilige Einfügewarnungen
|
||||
* Schriftart-Ligaturen
|
||||
* Benutzerdefinierte Shell-Profile
|
||||
* Optionales RMB-Einfügen und Kopieren bei Auswahl (PuTTY-Stil)
|
||||
|
||||
<a name="ssh"></a>
|
||||
|
||||
# SSH Client
|
||||
|
||||

|
||||
|
||||
* SSH2-Client mit einem Verbindungsmanager
|
||||
* X11 und Portweiterleitung
|
||||
* Automatisches Jump-Host-Management
|
||||
* Agent-Weiterleitung (inkl. Pageant und Windows-eigenem OpenSSH-Agent)
|
||||
* Anmeldeskripte
|
||||
|
||||
<a name="serial"></a>
|
||||
|
||||
# Serielles Terminal
|
||||
|
||||
* Gespeicherte Verbindungen
|
||||
* Unterstützung von Readline-Eingaben
|
||||
* Optionale hexadezimale Byte-für-Byte-Eingabe und Hexdump-Ausgabe
|
||||
* Newline-Konvertierung
|
||||
* Automatische Wiederverbindung
|
||||
|
||||
<a name="portable"></a>
|
||||
|
||||
# Portabel
|
||||
|
||||
Tabby läuft als portable Anwendung unter Windows, wenn Sie einen `data`-Ordner am selben Ort erstellen, an dem sich auch `Tabby.exe` befindet.
|
||||
|
||||
<a name="plugins"></a>
|
||||
|
||||
# Plugins
|
||||
|
||||
Plugins und Themen können direkt aus der Ansicht "Einstellungen" in Tabby installiert werden.
|
||||
|
||||
* [docker](https://github.com/Eugeny/tabby-docker) - Verbindung zu Docker-Containern
|
||||
* [title-control](https://github.com/kbjr/terminus-title-control) - ermöglicht die Änderung des Titels der Terminal-Tabs durch Angabe eines Präfixes, Suffixes und/oder zu entfernender Strings
|
||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - schnelles Senden von Befehlen an eine oder alle Terminal-Tabs
|
||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - speichert Terminalausgaben in einer Datei
|
||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - synchronisiert die Konfiguration mit Gist oder Gitee
|
||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt
|
||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration
|
||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde
|
||||
|
||||
<a name="themes"></a>
|
||||
|
||||
# Themen
|
||||
|
||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - ein von Hyper inspiriertes Thema
|
||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - das entspannte Thema für Tabby
|
||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
|
||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
|
||||
* [altair](https://github.com/yxuko/terminus-altair)
|
||||
|
||||
# Sponsoren <!-- omit in toc -->
|
||||
|
||||
[](https://packagecloud.io)
|
||||
|
||||
[**packagecloud**](https://packagecloud.io) bietet kostenloses Debian/RPM-Repository-Hosting an
|
||||
|
||||
<a name="contributing"></a>
|
||||
|
||||
# Beitragen
|
||||
|
||||
Pull Requests und Plugins sind willkommen!
|
||||
|
||||
Siehe [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) und [API docs](https://docs.tabby.sh/) für Informationen über den Aufbau des Projekts und ein sehr kurzes Tutorial zur Plugin-Entwicklung.
|
||||
|
||||
---
|
||||
|
||||
<a name="contributors"></a>
|
||||
|
||||
Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt=""/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt=""/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
||||
<td align="center"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||
<td align="center"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||
<td align="center"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||
<td align="center"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||
<td align="center"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||
<td align="center"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt=""/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
Dieses Projekt folgt der [all-contributors](https://github.com/all-contributors/all-contributors) Spezifikation. Beiträge jeglicher Art sind willkommen!
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Questo README è disponibile anche in: <a href="./README.md">Inglese</a> <a href="./README.ru-RU.md">Русский</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a>
|
||||
Questo README è disponibile anche in: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.de-DE.md">:de: Deutsch</a>
|
||||
|
||||
----
|
||||
|
||||
@@ -244,7 +244,16 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
@@ -238,7 +238,16 @@ Pull requests and plugins are welcome!
|
||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
18
README.md
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
This README is also available in: <a href="./README.ru-RU.md">Русский</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a> <a href="./README.it-IT.md">Italiano</a>
|
||||
This README is also available in: <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -79,6 +79,7 @@ This README is also available in: <a href="./README.ru-RU.md">Русский</a>
|
||||
* Optional RMB paste and copy-on select (PuTTY style)
|
||||
|
||||
<a name="ssh"></a>
|
||||
|
||||
# SSH Client
|
||||
|
||||

|
||||
@@ -90,6 +91,7 @@ This README is also available in: <a href="./README.ru-RU.md">Русский</a>
|
||||
* Login scripts
|
||||
|
||||
<a name="serial"></a>
|
||||
|
||||
# Serial Terminal
|
||||
|
||||
* Saved connections
|
||||
@@ -99,11 +101,13 @@ This README is also available in: <a href="./README.ru-RU.md">Русский</a>
|
||||
* Automatic reconnection
|
||||
|
||||
<a name="portable"></a>
|
||||
|
||||
# Portable
|
||||
|
||||
Tabby will run as a portable app on Windows, if you create a `data` folder in the same location where `Tabby.exe` lives.
|
||||
|
||||
<a name="plugins"></a>
|
||||
|
||||
# Plugins
|
||||
|
||||
Plugins and themes can be installed directly from the Settings view inside Tabby.
|
||||
@@ -118,6 +122,7 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
|
||||
|
||||
<a name="themes"></a>
|
||||
|
||||
# Themes
|
||||
|
||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme
|
||||
@@ -243,7 +248,16 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Этот README также доступен на: <a href="./README.md">English</a> <a href="./README.ko-KR.md">한국어</a> <a href="./README.zh-CN.md">简体中文</a> <a href="./README.it-IT.md">Italiano</a>
|
||||
Этот README также доступен на: <a href="./README.md">:gb: English</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -244,7 +244,16 @@ Pull-запросы и плагины приветствуются!
|
||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<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>
|
||||
本 README 还适用于以下语言: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
# 目录 <!-- omit in toc -->
|
||||
|
||||
- [Tabby的正确用途](#tabby的正确用途)
|
||||
- [Tabby是什么](#tabby是什么)
|
||||
- [终端特性](#终端特性)
|
||||
- [SSH 客户端](#ssh-客户端)
|
||||
- [串行终端](#串行终端)
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
<a name="about"></a>
|
||||
|
||||
# Tabby的正确用途
|
||||
# Tabby是什么
|
||||
|
||||
* **Tabby 是** Windows 标准终端 (conhost)、PowerShell ISE、PuTTY、macOS Terminal.app 和 iTerm 的替代品
|
||||
|
||||
@@ -243,7 +243,16 @@
|
||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
@@ -6,7 +6,7 @@ import * as path from 'path'
|
||||
import * as fs from 'fs'
|
||||
import { Subject, throttleTime } from 'rxjs'
|
||||
|
||||
import { loadConfig } from './config'
|
||||
import { saveConfig } from './config'
|
||||
import { Window, WindowOptions } from './window'
|
||||
import { pluginManager } from './pluginManager'
|
||||
import { PTYManager } from './pty'
|
||||
@@ -23,10 +23,10 @@ export class Application {
|
||||
private windows: Window[] = []
|
||||
private globalHotkey$ = new Subject<void>()
|
||||
private quitRequested = false
|
||||
private configStore: any
|
||||
userPluginsPath: string
|
||||
|
||||
constructor () {
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
constructor (private configStore: any) {
|
||||
remote.initialize()
|
||||
this.useBuiltinGraphics()
|
||||
this.ptyManager.init(this)
|
||||
@@ -36,6 +36,10 @@ export class Application {
|
||||
this.configStore = config
|
||||
})
|
||||
|
||||
ipcMain.on('app:save-config', (_event, data) => {
|
||||
saveConfig(data)
|
||||
})
|
||||
|
||||
ipcMain.on('app:register-global-hotkey', (_event, specs) => {
|
||||
globalShortcut.unregisterAll()
|
||||
for (const spec of specs) {
|
||||
@@ -63,7 +67,6 @@ export class Application {
|
||||
}
|
||||
})
|
||||
|
||||
this.configStore = loadConfig()
|
||||
if (process.platform === 'linux') {
|
||||
app.commandLine.appendSwitch('no-sandbox')
|
||||
if (((this.configStore.appearance || {}).opacity || 1) !== 1) {
|
||||
@@ -111,7 +114,7 @@ export class Application {
|
||||
}
|
||||
|
||||
async newWindow (options?: WindowOptions): Promise<Window> {
|
||||
const window = new Window(this, options)
|
||||
const window = new Window(this, this.configStore, options)
|
||||
this.windows.push(window)
|
||||
if (this.windows.length === 1){
|
||||
window.makeMain()
|
||||
@@ -218,7 +221,10 @@ export class Application {
|
||||
}
|
||||
}
|
||||
|
||||
handleSecondInstance (argv: string[], cwd: string): void {
|
||||
async handleSecondInstance (argv: string[], cwd: string): Promise<void> {
|
||||
if (!this.windows.length) {
|
||||
await this.newWindow()
|
||||
}
|
||||
this.presentAllWindows()
|
||||
this.windows[this.windows.length - 1].passCliArguments(argv, cwd, true)
|
||||
}
|
||||
|
@@ -1,26 +1,47 @@
|
||||
import * as fs from 'fs'
|
||||
import * as fs from 'mz/fs'
|
||||
import * as path from 'path'
|
||||
import * as yaml from 'js-yaml'
|
||||
import { v4 as uuidv4 } from 'uuid'
|
||||
import * as gracefulFS from 'graceful-fs'
|
||||
import { app } from 'electron'
|
||||
import { promisify } from 'util'
|
||||
|
||||
export function migrateConfig (): void {
|
||||
export async function migrateConfig (): Promise<void> {
|
||||
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
||||
const legacyConfigPath = path.join(app.getPath('userData'), '../terminus', 'config.yaml')
|
||||
if (fs.existsSync(legacyConfigPath) && (
|
||||
!fs.existsSync(configPath) ||
|
||||
fs.statSync(configPath).mtime < fs.statSync(legacyConfigPath).mtime
|
||||
if (await fs.exists(legacyConfigPath) && (
|
||||
!await fs.exists(configPath) ||
|
||||
(await fs.stat(configPath)).mtime < (await fs.stat(legacyConfigPath)).mtime
|
||||
)) {
|
||||
fs.writeFileSync(configPath, fs.readFileSync(legacyConfigPath))
|
||||
await fs.writeFile(configPath, await fs.readFile(legacyConfigPath))
|
||||
}
|
||||
}
|
||||
|
||||
export function loadConfig (): any {
|
||||
migrateConfig()
|
||||
export async function loadConfig (): Promise<any> {
|
||||
await migrateConfig()
|
||||
|
||||
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
||||
if (fs.existsSync(configPath)) {
|
||||
return yaml.load(fs.readFileSync(configPath, 'utf8'))
|
||||
if (await fs.exists(configPath)) {
|
||||
return yaml.load(await fs.readFile(configPath, 'utf8'))
|
||||
} else {
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
const configPath = path.join(app.getPath('userData'), 'config.yaml')
|
||||
let _configSaveInProgress = Promise.resolve()
|
||||
|
||||
async function _saveConfigInternal (content: string): Promise<void> {
|
||||
const tempPath = configPath + '.new.' + uuidv4().toString()
|
||||
await fs.writeFile(tempPath, content, 'utf8')
|
||||
await fs.writeFile(configPath + '.backup', content, 'utf8')
|
||||
await promisify(gracefulFS.rename)(tempPath, configPath)
|
||||
}
|
||||
|
||||
export async function saveConfig (content: string): Promise<void> {
|
||||
try {
|
||||
await _configSaveInProgress
|
||||
} catch { }
|
||||
_configSaveInProgress = _saveConfigInternal(content)
|
||||
await _configSaveInProgress
|
||||
}
|
||||
|
@@ -3,53 +3,62 @@ import './portable'
|
||||
import 'source-map-support/register'
|
||||
import './sentry'
|
||||
import './lru'
|
||||
import { app, ipcMain, Menu } from 'electron'
|
||||
import { app, ipcMain, Menu, dialog } from 'electron'
|
||||
import { parseArgs } from './cli'
|
||||
import { Application } from './app'
|
||||
import electronDebug = require('electron-debug')
|
||||
import { loadConfig } from './config'
|
||||
|
||||
if (!process.env.TABBY_PLUGINS) {
|
||||
process.env.TABBY_PLUGINS = ''
|
||||
}
|
||||
|
||||
const application = new Application()
|
||||
const argv = parseArgs(process.argv, process.cwd())
|
||||
|
||||
ipcMain.on('app:new-window', () => {
|
||||
application.newWindow()
|
||||
const application = loadConfig().catch(err => {
|
||||
dialog.showErrorBox('Could not read config', err.message)
|
||||
app.exit(1)
|
||||
}).then(configStore => {
|
||||
const _application = new Application(configStore)
|
||||
|
||||
ipcMain.on('app:new-window', () => {
|
||||
_application.newWindow()
|
||||
})
|
||||
|
||||
process.on('uncaughtException' as any, err => {
|
||||
console.log(err)
|
||||
_application.broadcast('uncaughtException', err)
|
||||
})
|
||||
|
||||
if (argv.d) {
|
||||
electronDebug({
|
||||
isEnabled: true,
|
||||
showDevTools: true,
|
||||
devToolsMode: 'undocked',
|
||||
})
|
||||
}
|
||||
|
||||
return _application
|
||||
})
|
||||
|
||||
app.on('activate', () => {
|
||||
if (!application.hasWindows()) {
|
||||
application.newWindow()
|
||||
|
||||
app.on('activate', async () => {
|
||||
if (!(await application).hasWindows()) {
|
||||
(await application).newWindow()
|
||||
} else {
|
||||
application.focus()
|
||||
(await application).focus()
|
||||
}
|
||||
})
|
||||
|
||||
process.on('uncaughtException' as any, err => {
|
||||
console.log(err)
|
||||
application.broadcast('uncaughtException', err)
|
||||
app.on('second-instance', async (_event, newArgv, cwd) => {
|
||||
(await application).handleSecondInstance(newArgv, cwd)
|
||||
})
|
||||
|
||||
app.on('second-instance', (_event, argv, cwd) => {
|
||||
application.handleSecondInstance(argv, cwd)
|
||||
})
|
||||
|
||||
const argv = parseArgs(process.argv, process.cwd())
|
||||
|
||||
if (!app.requestSingleInstanceLock()) {
|
||||
app.quit()
|
||||
app.exit(0)
|
||||
}
|
||||
|
||||
if (argv.d) {
|
||||
electronDebug({
|
||||
isEnabled: true,
|
||||
showDevTools: true,
|
||||
devToolsMode: 'undocked',
|
||||
})
|
||||
}
|
||||
|
||||
app.on('ready', async () => {
|
||||
if (process.platform === 'darwin') {
|
||||
app.dock.setMenu(Menu.buildFromTemplate([
|
||||
@@ -61,9 +70,11 @@ app.on('ready', async () => {
|
||||
},
|
||||
]))
|
||||
}
|
||||
application.init()
|
||||
|
||||
const window = await application.newWindow({ hidden: argv.hidden })
|
||||
(await application).init()
|
||||
|
||||
const window = await (await application).newWindow({ hidden: argv.hidden })
|
||||
await window.ready
|
||||
window.passCliArguments(process.argv, process.cwd(), false)
|
||||
window.focus()
|
||||
})
|
||||
|
@@ -11,7 +11,6 @@ import { compare as compareVersions } from 'compare-versions'
|
||||
|
||||
import type { Application } from './app'
|
||||
import { parseArgs } from './cli'
|
||||
import { loadConfig } from './config'
|
||||
|
||||
let DwmEnableBlurBehindWindow: any = null
|
||||
if (process.platform === 'win32') {
|
||||
@@ -42,7 +41,6 @@ export class Window {
|
||||
private closing = false
|
||||
private lastVibrancy: { enabled: boolean, type?: string } | null = null
|
||||
private disableVibrancyWhileDragging = false
|
||||
private configStore: any
|
||||
private touchBarControl: any
|
||||
private isFluentVibrancy = false
|
||||
private dockHidden = false
|
||||
@@ -50,9 +48,8 @@ export class Window {
|
||||
get visible$ (): Observable<boolean> { return this.visible }
|
||||
get closed$ (): Observable<void> { return this.closed }
|
||||
|
||||
constructor (private application: Application, options?: WindowOptions) {
|
||||
this.configStore = loadConfig()
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
constructor (private application: Application, private configStore: any, options?: WindowOptions) {
|
||||
options = options ?? {}
|
||||
|
||||
this.windowConfig = new ElectronConfig({ name: 'window' })
|
||||
@@ -75,6 +72,7 @@ export class Window {
|
||||
frame: false,
|
||||
show: false,
|
||||
backgroundColor: '#00000000',
|
||||
acceptFirstMouse: true,
|
||||
}
|
||||
|
||||
if (this.windowBounds) {
|
||||
@@ -415,7 +413,7 @@ export class Window {
|
||||
this.window.webContents.on('new-window', event => event.preventDefault())
|
||||
|
||||
ipcMain.on('window-set-disable-vibrancy-while-dragging', (_event, value) => {
|
||||
this.disableVibrancyWhileDragging = value && this.configStore.hacks.disableVibrancyWhileDragging
|
||||
this.disableVibrancyWhileDragging = value && this.configStore.hacks?.disableVibrancyWhileDragging
|
||||
})
|
||||
|
||||
let moveEndedTimeout: any = null
|
||||
|
@@ -8,7 +8,7 @@
|
||||
"email": "e@ajenti.org"
|
||||
},
|
||||
"main": "dist/main.js",
|
||||
"version": "1.0.0-alpha.1",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"postinstall": "patch-package",
|
||||
"build": "webpack --progress --color --display-modules",
|
||||
@@ -21,7 +21,7 @@
|
||||
"electron-config": "2.0.0",
|
||||
"electron-debug": "^3.2.0",
|
||||
"electron-promise-ipc": "^2.2.4",
|
||||
"electron-updater": "^4.6.5",
|
||||
"electron-updater": "^5.0.1",
|
||||
"fontmanager-redux": "1.1.0",
|
||||
"glasstron": "0.1.1",
|
||||
"js-yaml": "4.1.0",
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tabby-gang/windows-blurbehind": "^3.0.0",
|
||||
"macos-native-processlist": "^2.0.0",
|
||||
"macos-native-processlist": "^2.1.0",
|
||||
"serialport": "10.4.0",
|
||||
"serialport-binding-webserialapi": "^1.0.3",
|
||||
"windows-native-registry": "^3.2.1",
|
||||
|
327
app/patches/@serialport+bindings-cpp+10.7.0.patch
Normal file
@@ -0,0 +1,327 @@
|
||||
diff --git a/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp b/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp
|
||||
index b11c07f..910023e 100644
|
||||
--- a/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp
|
||||
+++ b/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <initguid.h>
|
||||
#include <devpkey.h>
|
||||
#include <devguid.h>
|
||||
+#include <wchar.h>
|
||||
#pragma comment(lib, "setupapi.lib")
|
||||
|
||||
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
|
||||
@@ -25,6 +26,29 @@ typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);
|
||||
|
||||
std::list<int> g_closingHandles;
|
||||
|
||||
+void ErrorCodeToString(const wchar_t* prefix, int errorCode, wchar_t *errorStr) {
|
||||
+ switch (errorCode) {
|
||||
+ case ERROR_FILE_NOT_FOUND:
|
||||
+ _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: File not found", prefix);
|
||||
+ break;
|
||||
+ case ERROR_INVALID_HANDLE:
|
||||
+ _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Invalid handle", prefix);
|
||||
+ break;
|
||||
+ case ERROR_ACCESS_DENIED:
|
||||
+ _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Access denied", prefix);
|
||||
+ break;
|
||||
+ case ERROR_OPERATION_ABORTED:
|
||||
+ _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Operation aborted", prefix);
|
||||
+ break;
|
||||
+ case ERROR_INVALID_PARAMETER:
|
||||
+ _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: The parameter is incorrect %d", prefix, errorCode);
|
||||
+ break;
|
||||
+ default:
|
||||
+ _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Unknown error code %d", prefix, errorCode);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void ErrorCodeToString(const char* prefix, int errorCode, char *errorStr) {
|
||||
switch (errorCode) {
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
@@ -608,9 +632,9 @@ void CloseBaton::Execute() {
|
||||
}
|
||||
}
|
||||
|
||||
-char *copySubstring(char *someString, int n) {
|
||||
- char *new_ = reinterpret_cast<char*>(malloc(sizeof(char)*n + 1));
|
||||
- strncpy_s(new_, n + 1, someString, n);
|
||||
+wchar_t *copySubstring(wchar_t *someString, int n) {
|
||||
+ wchar_t *new_ = reinterpret_cast<wchar_t*>(malloc(sizeof(wchar_t)*n + 1));
|
||||
+ wcsncpy_s(new_, n + 1, someString, n);
|
||||
new_[n] = '\0';
|
||||
return new_;
|
||||
}
|
||||
@@ -625,7 +649,7 @@ Napi::Value List(const Napi::CallbackInfo& info) {
|
||||
|
||||
Napi::Function callback = info[0].As<Napi::Function>();
|
||||
ListBaton* baton = new ListBaton(callback);
|
||||
- snprintf(baton->errorString, sizeof(baton->errorString), "");
|
||||
+ _snwprintf(baton->errorString, sizeof(baton->errorString), L"");
|
||||
|
||||
baton->Queue();
|
||||
return env.Undefined();
|
||||
@@ -633,20 +657,20 @@ Napi::Value List(const Napi::CallbackInfo& info) {
|
||||
|
||||
// It's possible that the s/n is a construct and not the s/n of the parent USB
|
||||
// composite device. This performs some convoluted registry lookups to fetch the USB s/n.
|
||||
-void getSerialNumber(const char *vid,
|
||||
- const char *pid,
|
||||
+void getSerialNumber(const wchar_t *vid,
|
||||
+ const wchar_t *pid,
|
||||
const HDEVINFO hDevInfo,
|
||||
SP_DEVINFO_DATA deviceInfoData,
|
||||
const unsigned int maxSerialNumberLength,
|
||||
- char* serialNumber) {
|
||||
- _snprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, "");
|
||||
+ wchar_t* serialNumber) {
|
||||
+ _snwprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, L"");
|
||||
if (vid == NULL || pid == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
DWORD dwSize;
|
||||
WCHAR szWUuidBuffer[MAX_BUFFER_SIZE];
|
||||
- WCHAR containerUuid[MAX_BUFFER_SIZE];
|
||||
+ WCHAR wantedUuid[MAX_BUFFER_SIZE];
|
||||
|
||||
|
||||
// Fetch the "Container ID" for this device node. In USB context, this "Container
|
||||
@@ -683,7 +707,7 @@ void getSerialNumber(const char *vid,
|
||||
|
||||
// Given the UUID bytes, build up a (widechar) string from it. There's some mangling
|
||||
// going on.
|
||||
- StringFromGUID2((REFGUID)szWUuidBuffer, containerUuid, ARRAY_SIZE(containerUuid));
|
||||
+ StringFromGUID2((REFGUID)szWUuidBuffer, wantedUuid, ARRAY_SIZE(wantedUuid));
|
||||
} else {
|
||||
// Container UUID could not be fetched, return empty serial number.
|
||||
return;
|
||||
@@ -693,21 +717,15 @@ void getSerialNumber(const char *vid,
|
||||
// This means they're non-removable, and are not handled (yet).
|
||||
// Maybe they should inherit the s/n from somewhere else.
|
||||
|
||||
- // Sanitize input - for whatever reason, StringFromGUID2() returns a WCHAR* but
|
||||
- // the comparisons later need a plain old char*, in lowercase ASCII.
|
||||
- char wantedUuid[MAX_BUFFER_SIZE];
|
||||
- _snprintf_s(wantedUuid, MAX_BUFFER_SIZE, _TRUNCATE, "%ws", containerUuid);
|
||||
- strlwr(wantedUuid);
|
||||
-
|
||||
// Iterate through all the USB devices with the given VendorID/ProductID
|
||||
|
||||
HKEY vendorProductHKey;
|
||||
DWORD retCode;
|
||||
- char hkeyPath[MAX_BUFFER_SIZE];
|
||||
+ wchar_t hkeyPath[MAX_BUFFER_SIZE];
|
||||
|
||||
- _snprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s", vid, pid);
|
||||
+ _snwprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, L"SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s", vid, pid);
|
||||
|
||||
- retCode = RegOpenKeyEx(
|
||||
+ retCode = RegOpenKeyExW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
hkeyPath,
|
||||
0,
|
||||
@@ -739,9 +757,9 @@ void getSerialNumber(const char *vid,
|
||||
// Each of the subkeys here is the serial number of a USB device with the
|
||||
// given VendorId/ProductId. Now fetch the string for the S/N.
|
||||
DWORD serialNumberLength = maxSerialNumberLength;
|
||||
- retCode = RegEnumKeyEx(vendorProductHKey,
|
||||
+ retCode = RegEnumKeyExW(vendorProductHKey,
|
||||
i,
|
||||
- serialNumber,
|
||||
+ reinterpret_cast<LPWSTR>(serialNumber),
|
||||
&serialNumberLength,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -751,21 +769,21 @@ void getSerialNumber(const char *vid,
|
||||
if (retCode == ERROR_SUCCESS) {
|
||||
// Lookup info for VID_(vendorId)&PID_(productId)\(serialnumber)
|
||||
|
||||
- _snprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE,
|
||||
- "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s\\%s",
|
||||
+ _snwprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE,
|
||||
+ L"SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%ls&PID_%ls\\%ls",
|
||||
vid, pid, serialNumber);
|
||||
|
||||
HKEY deviceHKey;
|
||||
|
||||
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, hkeyPath, 0, KEY_READ, &deviceHKey) == ERROR_SUCCESS) {
|
||||
- char readUuid[MAX_BUFFER_SIZE];
|
||||
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, hkeyPath, 0, KEY_READ, &deviceHKey) == ERROR_SUCCESS) {
|
||||
+ wchar_t readUuid[MAX_BUFFER_SIZE];
|
||||
DWORD readSize = sizeof(readUuid);
|
||||
|
||||
// Query VID_(vendorId)&PID_(productId)\(serialnumber)\ContainerID
|
||||
- retCode = RegQueryValueEx(deviceHKey, "ContainerID", NULL, NULL, (LPBYTE)&readUuid, &readSize);
|
||||
+ retCode = RegQueryValueExW(deviceHKey, L"ContainerID", NULL, NULL, (LPBYTE)&readUuid, &readSize);
|
||||
if (retCode == ERROR_SUCCESS) {
|
||||
readUuid[readSize] = '\0';
|
||||
- if (strcmp(wantedUuid, readUuid) == 0) {
|
||||
+ if (wcscmp(wantedUuid, readUuid) == 0) {
|
||||
// The ContainerID UUIDs match, return now that serialNumber has
|
||||
// the right value.
|
||||
RegCloseKey(deviceHKey);
|
||||
@@ -783,7 +801,7 @@ void getSerialNumber(const char *vid,
|
||||
RegCloseKey(vendorProductHKey);
|
||||
}
|
||||
|
||||
- _snprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, "");
|
||||
+ _snwprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, L"");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -795,15 +813,15 @@ void ListBaton::Execute() {
|
||||
|
||||
int memberIndex = 0;
|
||||
DWORD dwSize, dwPropertyRegDataType;
|
||||
- char szBuffer[MAX_BUFFER_SIZE];
|
||||
- char *pnpId;
|
||||
- char *vendorId;
|
||||
- char *productId;
|
||||
- char *name;
|
||||
- char *manufacturer;
|
||||
- char *locationId;
|
||||
- char *friendlyName;
|
||||
- char serialNumber[MAX_REGISTRY_KEY_SIZE];
|
||||
+ wchar_t szBuffer[MAX_BUFFER_SIZE];
|
||||
+ wchar_t *pnpId;
|
||||
+ wchar_t *vendorId;
|
||||
+ wchar_t *productId;
|
||||
+ wchar_t *name;
|
||||
+ wchar_t *manufacturer;
|
||||
+ wchar_t *locationId;
|
||||
+ wchar_t *friendlyName;
|
||||
+ wchar_t serialNumber[MAX_REGISTRY_KEY_SIZE];
|
||||
bool isCom;
|
||||
while (true) {
|
||||
isCom = false;
|
||||
@@ -814,7 +832,6 @@ void ListBaton::Execute() {
|
||||
manufacturer = NULL;
|
||||
locationId = NULL;
|
||||
friendlyName = NULL;
|
||||
- isCom = false;
|
||||
|
||||
ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA));
|
||||
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
@@ -826,16 +843,16 @@ void ListBaton::Execute() {
|
||||
}
|
||||
|
||||
dwSize = sizeof(szBuffer);
|
||||
- SetupDiGetDeviceInstanceId(hDevInfo, &deviceInfoData, szBuffer, dwSize, &dwSize);
|
||||
+ SetupDiGetDeviceInstanceIdW(hDevInfo, &deviceInfoData, reinterpret_cast<PWSTR>(szBuffer), dwSize, &dwSize);
|
||||
szBuffer[dwSize] = '\0';
|
||||
- pnpId = strdup(szBuffer);
|
||||
+ pnpId = wcsdup(szBuffer);
|
||||
|
||||
- vendorId = strstr(szBuffer, "VID_");
|
||||
+ vendorId = wcsstr(szBuffer, L"VID_");
|
||||
if (vendorId) {
|
||||
vendorId += 4;
|
||||
vendorId = copySubstring(vendorId, 4);
|
||||
}
|
||||
- productId = strstr(szBuffer, "PID_");
|
||||
+ productId = wcsstr(szBuffer, L"PID_");
|
||||
if (productId) {
|
||||
productId += 4;
|
||||
productId = copySubstring(productId, 4);
|
||||
@@ -843,32 +860,29 @@ void ListBaton::Execute() {
|
||||
|
||||
getSerialNumber(vendorId, productId, hDevInfo, deviceInfoData, MAX_REGISTRY_KEY_SIZE, serialNumber);
|
||||
|
||||
- if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData,
|
||||
+ if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &deviceInfoData,
|
||||
SPDRP_LOCATION_INFORMATION, &dwPropertyRegDataType,
|
||||
- reinterpret_cast<BYTE*>(szBuffer),
|
||||
- sizeof(szBuffer), &dwSize)) {
|
||||
- locationId = strdup(szBuffer);
|
||||
+ reinterpret_cast<PBYTE>(szBuffer), sizeof(szBuffer), &dwSize)) {
|
||||
+ locationId = wcsdup(szBuffer);
|
||||
}
|
||||
- if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData,
|
||||
+ if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &deviceInfoData,
|
||||
SPDRP_FRIENDLYNAME, &dwPropertyRegDataType,
|
||||
- reinterpret_cast<BYTE*>(szBuffer),
|
||||
- sizeof(szBuffer), &dwSize)) {
|
||||
- friendlyName = strdup(szBuffer);
|
||||
+ reinterpret_cast<PBYTE>(szBuffer), sizeof(szBuffer), &dwSize)) {
|
||||
+ friendlyName = wcsdup(szBuffer);
|
||||
}
|
||||
- if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData,
|
||||
+ if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &deviceInfoData,
|
||||
SPDRP_MFG, &dwPropertyRegDataType,
|
||||
- reinterpret_cast<BYTE*>(szBuffer),
|
||||
- sizeof(szBuffer), &dwSize)) {
|
||||
- manufacturer = strdup(szBuffer);
|
||||
+ reinterpret_cast<PBYTE>(szBuffer), sizeof(szBuffer), &dwSize)) {
|
||||
+ manufacturer = wcsdup(szBuffer);
|
||||
}
|
||||
|
||||
HKEY hkey = SetupDiOpenDevRegKey(hDevInfo, &deviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
|
||||
if (hkey != INVALID_HANDLE_VALUE) {
|
||||
dwSize = sizeof(szBuffer);
|
||||
- if (RegQueryValueEx(hkey, "PortName", NULL, NULL, (LPBYTE)&szBuffer, &dwSize) == ERROR_SUCCESS) {
|
||||
+ if (RegQueryValueExW(hkey, L"PortName", NULL, NULL, (LPBYTE)&szBuffer, &dwSize) == ERROR_SUCCESS) {
|
||||
+ name = wcsdup(szBuffer);
|
||||
szBuffer[dwSize] = '\0';
|
||||
- name = strdup(szBuffer);
|
||||
- isCom = strstr(szBuffer, "COM") != NULL;
|
||||
+ isCom = wcsstr(szBuffer, L"COM") != NULL;
|
||||
}
|
||||
}
|
||||
if (isCom) {
|
||||
@@ -916,6 +930,16 @@ void setIfNotEmpty(Napi::Object item, std::string key, const char *value) {
|
||||
}
|
||||
}
|
||||
|
||||
+void setIfNotEmpty(Napi::Object item, std::string key, const wchar_t *value) {
|
||||
+ Napi::Env env = item.Env();
|
||||
+ Napi::String v8key = Napi::String::New(env, key);
|
||||
+ if (wcslen(value) > 0) {
|
||||
+ (item).Set(v8key, Napi::String::New(env, (const char16_t*) value));
|
||||
+ } else {
|
||||
+ (item).Set(v8key, env.Undefined());
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void FlushBaton::Execute() {
|
||||
DWORD purge_all = PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR;
|
||||
if (!PurgeComm(int2handle(fd), purge_all)) {
|
||||
diff --git a/node_modules/@serialport/bindings-cpp/src/serialport_win.h b/node_modules/@serialport/bindings-cpp/src/serialport_win.h
|
||||
index f3e3c32..739b5dd 100644
|
||||
--- a/node_modules/@serialport/bindings-cpp/src/serialport_win.h
|
||||
+++ b/node_modules/@serialport/bindings-cpp/src/serialport_win.h
|
||||
@@ -47,23 +47,24 @@ Napi::Value Read(const Napi::CallbackInfo& info);
|
||||
|
||||
Napi::Value List(const Napi::CallbackInfo& info);
|
||||
void setIfNotEmpty(Napi::Object item, std::string key, const char *value);
|
||||
+void setIfNotEmpty(Napi::Object item, std::string key, const wchar_t *value);
|
||||
|
||||
struct ListResultItem {
|
||||
- std::string path;
|
||||
- std::string manufacturer;
|
||||
- std::string serialNumber;
|
||||
- std::string pnpId;
|
||||
- std::string locationId;
|
||||
- std::string friendlyName;
|
||||
- std::string vendorId;
|
||||
- std::string productId;
|
||||
+ std::wstring path;
|
||||
+ std::wstring manufacturer;
|
||||
+ std::wstring serialNumber;
|
||||
+ std::wstring pnpId;
|
||||
+ std::wstring locationId;
|
||||
+ std::wstring friendlyName;
|
||||
+ std::wstring vendorId;
|
||||
+ std::wstring productId;
|
||||
};
|
||||
|
||||
struct ListBaton : public Napi::AsyncWorker {
|
||||
ListBaton(Napi::Function& callback) : Napi::AsyncWorker(callback, "node-serialport:ListBaton"),
|
||||
errorString() {}
|
||||
std::list<ListResultItem*> results;
|
||||
- char errorString[ERROR_STRING_SIZE];
|
||||
+ wchar_t errorString[ERROR_STRING_SIZE];
|
||||
void Execute() override;
|
||||
|
||||
void OnOK() override {
|
@@ -404,10 +404,10 @@ buffer@^5.5.0:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.1.13"
|
||||
|
||||
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==
|
||||
builder-util-runtime@9.0.0:
|
||||
version "9.0.0"
|
||||
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz#3a40ba7382712ccdb24471567f91d7c167e00830"
|
||||
integrity sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA==
|
||||
dependencies:
|
||||
debug "^4.3.2"
|
||||
sax "^1.2.4"
|
||||
@@ -916,13 +916,13 @@ electron-promise-ipc@^2.2.4:
|
||||
serialize-error "^5.0.0"
|
||||
uuid "^3.0.1"
|
||||
|
||||
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==
|
||||
electron-updater@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-5.0.1.tgz#327915f1b2e573daf1ce1d8102bcab93f4880c1a"
|
||||
integrity sha512-dNnXPCqYmergXy3jgg4UICuD50Orug9GQe/5xfHy+BE2Fy0icB0QE+y6iQWdCDf7yeONxwMBf4HgIkGG5pIaVg==
|
||||
dependencies:
|
||||
"@types/semver" "^7.3.6"
|
||||
builder-util-runtime "8.9.2"
|
||||
builder-util-runtime "9.0.0"
|
||||
fs-extra "^10.0.0"
|
||||
js-yaml "^4.1.0"
|
||||
lazy-val "^1.0.5"
|
||||
@@ -2052,12 +2052,12 @@ lru-cache@^6.0.0:
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
macos-native-processlist@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/macos-native-processlist/-/macos-native-processlist-2.0.0.tgz"
|
||||
integrity sha512-ciW1n2jL+9f7+9xijMMVmVzRbpVlKjzMFmgpNricm5QKfkUTMEa1suR0pc9pQRrLea4sJtbLo0u+izzHDvkpIA==
|
||||
macos-native-processlist@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/macos-native-processlist/-/macos-native-processlist-2.1.0.tgz#3ebfc0391083331bfa20acef01a45abd45b554dd"
|
||||
integrity sha512-qXsNLedPaF7/vo26gOS6HyNvI8Oko5PgvezBsWwXkCFXQdU9+JOFDQvvRZ4WoPgUUkiV7a4PK7xbbkf8X6d/cQ==
|
||||
dependencies:
|
||||
node-addon-api "3.0.0"
|
||||
node-addon-api "3.1.0"
|
||||
|
||||
make-dir@^1.0.0:
|
||||
version "1.3.0"
|
||||
@@ -2265,12 +2265,7 @@ node-abi@^3.3.0:
|
||||
dependencies:
|
||||
semver "^7.3.5"
|
||||
|
||||
node-addon-api@3.0.0:
|
||||
version "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@^3.0.2, node-addon-api@^3.1.0:
|
||||
node-addon-api@3.1.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==
|
||||
|
28
appveyor.yml
@@ -1,28 +0,0 @@
|
||||
os: Visual Studio 2017
|
||||
|
||||
platform:
|
||||
- x64
|
||||
|
||||
environment:
|
||||
nodejs_version: "14"
|
||||
|
||||
version: "{build}"
|
||||
|
||||
install:
|
||||
- ps: Install-Product node $env:nodejs_version $env:platform
|
||||
- yarn
|
||||
- node scripts/build-native.js
|
||||
|
||||
build_script:
|
||||
- yarn run build
|
||||
- node scripts/prepackage-plugins.js
|
||||
- node scripts/build-windows.js
|
||||
|
||||
artifacts:
|
||||
- path: 'dist\*.exe'
|
||||
|
||||
cache:
|
||||
- node_modules
|
||||
- "*\\node_modules"
|
||||
- "%USERPROFILE%\\.electron"
|
||||
- "%LOCALAPPDATA%\\Yarn"
|
@@ -35,6 +35,9 @@ extraResources:
|
||||
asarUnpack:
|
||||
- 'dist/*.map'
|
||||
publish:
|
||||
- provider: s3
|
||||
bucket: tabby-updates
|
||||
path: 'updates-${channel}-${env.ARCH}'
|
||||
- provider: github
|
||||
|
||||
win:
|
||||
|
329
locale/app.pot
@@ -6,12 +6,12 @@ msgstr ""
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:77
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:84
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:78
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:85
|
||||
msgid "{name} copy"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76
|
||||
msgid "A second font family used to display characters missing in the main font"
|
||||
msgstr ""
|
||||
|
||||
@@ -27,6 +27,10 @@ msgstr ""
|
||||
msgid "Accept just this once"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84
|
||||
msgid "Accessibility"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20
|
||||
msgid "Acrylic background"
|
||||
msgstr ""
|
||||
@@ -48,7 +52,7 @@ msgstr ""
|
||||
msgid "Add..."
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:71
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83
|
||||
msgid "Additional space between lines"
|
||||
msgstr ""
|
||||
|
||||
@@ -75,7 +79,7 @@ msgstr ""
|
||||
msgid "Agent type"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:151
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:163
|
||||
msgid "Allows opening .bat files in tabs, but breaks some shells"
|
||||
msgstr ""
|
||||
|
||||
@@ -116,7 +120,7 @@ msgstr ""
|
||||
msgid "Ask before closing the browser tab"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:122
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:134
|
||||
msgid "Audible"
|
||||
msgstr ""
|
||||
|
||||
@@ -132,7 +136,7 @@ msgstr ""
|
||||
msgid "Auto"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:135
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:147
|
||||
msgid "Auto-open a terminal on app start"
|
||||
msgstr ""
|
||||
|
||||
@@ -160,7 +164,7 @@ msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:118
|
||||
#: tabby-serial/src/profiles.ts:85
|
||||
#: tabby-serial/src/profiles.ts:86
|
||||
msgid "Baud rate"
|
||||
msgstr ""
|
||||
|
||||
@@ -168,7 +172,7 @@ msgstr ""
|
||||
msgid "Beginning of the line"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:57
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:69
|
||||
msgid "Blink cursor"
|
||||
msgstr ""
|
||||
|
||||
@@ -180,17 +184,21 @@ msgstr ""
|
||||
msgid "Blur"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28
|
||||
msgid "Bold font weight"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:138
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:82
|
||||
msgid "Bottom"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:95
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:107
|
||||
msgid "Bracketed paste (requires shell support)"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:48
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:165
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:166
|
||||
msgid "Built-in"
|
||||
msgstr ""
|
||||
|
||||
@@ -198,14 +206,15 @@ msgstr ""
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:55
|
||||
#: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14
|
||||
#: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:14
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:30
|
||||
#: tabby-electron/src/services/updater.service.ts:139
|
||||
#: tabby-electron/src/services/updater.service.ts:143
|
||||
#: tabby-local/src/components/terminalTab.component.ts:118
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:79
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:99
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:34
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:448
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:40
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:459
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
@@ -226,15 +235,15 @@ msgstr ""
|
||||
msgid "Ciphers"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:125
|
||||
#: tabby-core/src/services/profiles.service.ts:128
|
||||
msgid "Clear recent profiles"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:42
|
||||
#: tabby-terminal/src/hotkeys.ts:46
|
||||
msgid "Clear terminal"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:86
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:92
|
||||
msgid "Clipboard"
|
||||
msgstr ""
|
||||
|
||||
@@ -296,8 +305,8 @@ msgstr ""
|
||||
msgid "Config downloaded"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:102
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:107
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:109
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:114
|
||||
msgid "Config file"
|
||||
msgstr ""
|
||||
|
||||
@@ -319,7 +328,7 @@ msgid "Connect through a proxy server"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/index.ts:214
|
||||
#: tabby-core/src/services/profiles.service.ts:170
|
||||
#: tabby-core/src/services/profiles.service.ts:173
|
||||
msgid "Connect to \"%s\"..."
|
||||
msgstr ""
|
||||
|
||||
@@ -327,7 +336,7 @@ msgstr ""
|
||||
msgid "Connect to a different host first and use it as a proxy"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:17
|
||||
#: tabby-serial/src/components/serialTab.component.ts:72
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:145
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -346,14 +355,14 @@ msgstr ""
|
||||
msgid "Connection name will be used instead"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:51
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57
|
||||
msgid "Context menu"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:198
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:206
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:539
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:743
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:202
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:210
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:550
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:754
|
||||
#: tabby-terminal/src/tabContextMenu.ts:29
|
||||
msgid "Copied"
|
||||
msgstr ""
|
||||
@@ -363,12 +372,12 @@ msgstr ""
|
||||
msgid "Copy"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:62
|
||||
#: tabby-terminal/src/hotkeys.ts:66
|
||||
#: tabby-terminal/src/tabContextMenu.ts:53
|
||||
msgid "Copy current path"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:89
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:95
|
||||
msgid "Copy on select"
|
||||
msgstr ""
|
||||
|
||||
@@ -376,10 +385,23 @@ msgstr ""
|
||||
msgid "Copy to clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:101
|
||||
msgid "Copy with formatting"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/services/config.service.ts:365
|
||||
msgid "Could not decrypt config"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:5
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:29
|
||||
msgid "Create directory"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:93
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
@@ -396,7 +418,7 @@ msgstr ""
|
||||
msgid "Current process: {name}"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:41
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:53
|
||||
msgid "Cursor shape"
|
||||
msgstr ""
|
||||
|
||||
@@ -404,7 +426,7 @@ msgstr ""
|
||||
msgid "Custom"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:89
|
||||
msgid "Custom CSS"
|
||||
msgstr ""
|
||||
|
||||
@@ -416,6 +438,14 @@ msgstr ""
|
||||
msgid "Debugging"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:213
|
||||
msgid "Decrease horizontal split size"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:205
|
||||
msgid "Decrease vertical split size"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
msgstr ""
|
||||
@@ -424,7 +454,7 @@ msgstr ""
|
||||
msgid "Default profile settings"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:111
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:118
|
||||
msgid "Defaults"
|
||||
msgstr ""
|
||||
|
||||
@@ -434,28 +464,32 @@ msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:129
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:194
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:207
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:130
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:195
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:208
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:49
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:33
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:41
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:39
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:47
|
||||
#: tabby-terminal/src/components/colorSchemeSettingsTab.component.ts:89
|
||||
#: tabby-terminal/src/components/loginScriptsSettings.component.ts:32
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:127
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:192
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:128
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:193
|
||||
#: tabby-terminal/src/components/colorSchemeSettingsTab.component.ts:87
|
||||
msgid "Delete \"{name}\"?"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:29
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:35
|
||||
msgid "Delete {fullPath}?"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:38
|
||||
msgid "Delete entire line"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:42
|
||||
msgid "Delete next word"
|
||||
msgstr ""
|
||||
|
||||
@@ -463,7 +497,7 @@ msgstr ""
|
||||
msgid "Delete previous word"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:204
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:205
|
||||
msgid "Delete the group's profiles?"
|
||||
msgstr ""
|
||||
|
||||
@@ -495,11 +529,11 @@ msgstr ""
|
||||
msgid "Disable dynamic tab title"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197
|
||||
msgid "Disable fluent background while dragging"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190
|
||||
msgid "Disable GPU acceleration"
|
||||
msgstr ""
|
||||
|
||||
@@ -556,7 +590,7 @@ msgstr ""
|
||||
msgid "Docking"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:67
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:73
|
||||
msgid "Double-click selection will stop at these characters"
|
||||
msgstr ""
|
||||
|
||||
@@ -568,6 +602,10 @@ msgstr ""
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23
|
||||
msgid "Draw bold text in bright colors"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:120
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
@@ -593,6 +631,10 @@ msgstr ""
|
||||
msgid "Enable analytics"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87
|
||||
msgid "Enable animations"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74
|
||||
msgid "Enable automatic installation of updates when they become available."
|
||||
msgstr ""
|
||||
@@ -646,7 +688,7 @@ msgstr ""
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:63
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:75
|
||||
msgid "Fallback font"
|
||||
msgstr ""
|
||||
|
||||
@@ -658,11 +700,15 @@ msgstr ""
|
||||
msgid "File: {description}"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:17
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:157
|
||||
msgid "Fixed"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:198
|
||||
msgid "Fluent background sometimes causes drag lag"
|
||||
msgstr ""
|
||||
|
||||
@@ -670,7 +716,7 @@ msgstr ""
|
||||
msgid "Focus all panes"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:70
|
||||
#: tabby-terminal/src/hotkeys.ts:74
|
||||
msgid "Focus all panes at once (broadcast)"
|
||||
msgstr ""
|
||||
|
||||
@@ -702,6 +748,10 @@ msgstr ""
|
||||
msgid "Font"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:183
|
||||
msgid "For keyboard shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:51
|
||||
msgid "Force CR"
|
||||
msgstr ""
|
||||
@@ -730,11 +780,11 @@ msgstr ""
|
||||
msgid "Forwarded ports"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:35
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:47
|
||||
msgid "From color scheme"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:32
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
msgstr ""
|
||||
|
||||
@@ -768,7 +818,7 @@ msgstr ""
|
||||
msgid "Gives the window a blurred transparent background"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:22
|
||||
msgid "Go up"
|
||||
msgstr ""
|
||||
|
||||
@@ -780,7 +830,7 @@ msgstr ""
|
||||
msgid "Group"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:179
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:187
|
||||
msgid "Hacks"
|
||||
msgstr ""
|
||||
|
||||
@@ -788,6 +838,10 @@ msgstr ""
|
||||
msgid "Help track the number of Tabby installs across the world!"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50
|
||||
msgid "Help translate Tabby"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:32
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:44
|
||||
msgid "Hexadecimal"
|
||||
@@ -859,6 +913,14 @@ msgstr ""
|
||||
msgid "Immediately echoes your input locally"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:209
|
||||
msgid "Increase horizontal split size"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:201
|
||||
msgid "Increase vertical split size"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
msgstr ""
|
||||
@@ -875,11 +937,11 @@ msgstr ""
|
||||
msgid "Installed"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-electron/src/services/updater.service.ts:136
|
||||
#: tabby-electron/src/services/updater.service.ts:140
|
||||
msgid "Installing the update will close all tabs and restart Tabby."
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:58
|
||||
#: tabby-terminal/src/hotkeys.ts:62
|
||||
msgid "Intelligent Ctrl-C (copy/abort)"
|
||||
msgstr ""
|
||||
|
||||
@@ -887,7 +949,7 @@ msgstr ""
|
||||
msgid "Interactive"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:117
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124
|
||||
msgid "Invalid syntax"
|
||||
msgstr ""
|
||||
|
||||
@@ -904,8 +966,8 @@ msgstr ""
|
||||
msgid "Jump to previous word"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:130
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:195
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:131
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:196
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:50
|
||||
#: tabby-terminal/src/components/colorSchemeSettingsTab.component.ts:90
|
||||
#: tabby-terminal/src/components/loginScriptsSettings.component.ts:33
|
||||
@@ -929,7 +991,7 @@ msgstr ""
|
||||
msgid "Key exchange"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29
|
||||
msgid "Keyboard"
|
||||
msgstr ""
|
||||
|
||||
@@ -958,6 +1020,7 @@ msgstr ""
|
||||
msgid "Launch WinSCP for current SSH session"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:14
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7
|
||||
msgid "Learn how to allow Tabby to detect remote shell's working directory."
|
||||
msgstr ""
|
||||
@@ -968,7 +1031,7 @@ msgstr ""
|
||||
msgid "Left"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:33
|
||||
msgid "Lets the shell handle Meta key instead of OS"
|
||||
msgstr ""
|
||||
|
||||
@@ -980,11 +1043,11 @@ msgstr ""
|
||||
msgid "Line editor, input is sent after you press Enter"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:82
|
||||
msgid "Line padding"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:12
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19
|
||||
msgid "Loading"
|
||||
msgstr ""
|
||||
|
||||
@@ -1001,8 +1064,7 @@ msgstr ""
|
||||
msgid "Local echo"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-local/src/profiles.ts:11
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:237
|
||||
#: tabby-local/src/profiles.ts:12
|
||||
msgid "Local terminal"
|
||||
msgstr ""
|
||||
|
||||
@@ -1012,11 +1074,11 @@ msgstr ""
|
||||
msgid "Login scripts"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:44
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:50
|
||||
msgid "Long-click for context menu"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:154
|
||||
#: tabby-core/src/services/profiles.service.ts:157
|
||||
msgid "Manage profiles"
|
||||
msgstr ""
|
||||
|
||||
@@ -1032,7 +1094,7 @@ msgstr ""
|
||||
msgid "Modified on {date}"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46
|
||||
msgid "Mouse"
|
||||
msgstr ""
|
||||
|
||||
@@ -1044,7 +1106,7 @@ msgstr ""
|
||||
msgid "Move tab to the right"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:206
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:207
|
||||
msgid "Move to \"Ungrouped\""
|
||||
msgstr ""
|
||||
|
||||
@@ -1057,6 +1119,10 @@ msgstr ""
|
||||
msgid "Name for the new config"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3
|
||||
msgid "Name for the new directory"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52
|
||||
msgid "Native"
|
||||
msgstr ""
|
||||
@@ -1073,7 +1139,7 @@ msgstr ""
|
||||
msgid "New item"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:176
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:177
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:118
|
||||
msgid "New name"
|
||||
msgstr ""
|
||||
@@ -1090,7 +1156,7 @@ msgstr ""
|
||||
msgid "New tab"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:212
|
||||
#: tabby-core/src/hotkeys.ts:228
|
||||
msgid "New tab: {profile}"
|
||||
msgstr ""
|
||||
|
||||
@@ -1103,6 +1169,10 @@ msgstr ""
|
||||
msgid "New window"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-local/src/services/dockMenu.service.ts:62
|
||||
msgid "New Window"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:87
|
||||
msgid "New with profile"
|
||||
msgstr ""
|
||||
@@ -1115,7 +1185,7 @@ msgstr ""
|
||||
msgid "No color"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:77
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:83
|
||||
msgid "No modifier"
|
||||
msgstr ""
|
||||
|
||||
@@ -1128,6 +1198,10 @@ msgstr ""
|
||||
msgid "Normal"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22
|
||||
msgid "Normal font weight"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/components/searchPanel.component.ts:47
|
||||
#: tabby-terminal/src/components/searchPanel.component.ts:57
|
||||
msgid "Not found"
|
||||
@@ -1146,8 +1220,8 @@ msgid "Number of lines kept in the buffer"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:70
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:48
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:128
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:54
|
||||
msgid "Off"
|
||||
msgstr ""
|
||||
|
||||
@@ -1240,6 +1314,14 @@ msgstr ""
|
||||
msgid "Overwrite the local config and start syncing?"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182
|
||||
msgid "Pane resize step"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:179
|
||||
msgid "Panes"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38
|
||||
msgid "Parity"
|
||||
msgstr ""
|
||||
@@ -1257,8 +1339,8 @@ msgstr ""
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:54
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:447
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:458
|
||||
#: tabby-terminal/src/tabContextMenu.ts:34
|
||||
msgid "Paste"
|
||||
msgstr ""
|
||||
@@ -1267,11 +1349,11 @@ msgstr ""
|
||||
msgid "Paste from clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:454
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:465
|
||||
msgid "Paste multiple lines?"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:66
|
||||
msgid "Paste on middle-click"
|
||||
msgstr ""
|
||||
|
||||
@@ -1319,7 +1401,7 @@ msgstr ""
|
||||
msgid "Prevents accidental closing"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:96
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:108
|
||||
msgid "Prevents accidental execution of pasted commands"
|
||||
msgstr ""
|
||||
|
||||
@@ -1367,7 +1449,7 @@ msgid "Puts all of Tabby's configuration into the vault"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/index.ts:213
|
||||
#: tabby-core/src/services/profiles.service.ts:169
|
||||
#: tabby-core/src/services/profiles.service.ts:172
|
||||
msgid "Quick connect"
|
||||
msgstr ""
|
||||
|
||||
@@ -1384,8 +1466,8 @@ msgstr ""
|
||||
msgid "Ready Timeout (Milliseconds)"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:112
|
||||
#: tabby-core/src/services/profiles.service.ts:126
|
||||
#: tabby-core/src/services/profiles.service.ts:115
|
||||
#: tabby-core/src/services/profiles.service.ts:129
|
||||
#: tabby-local/src/services/dockMenu.service.ts:28
|
||||
msgid "Recent"
|
||||
msgstr ""
|
||||
@@ -1444,11 +1526,11 @@ msgstr ""
|
||||
msgid "Report a problem"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:73
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:79
|
||||
msgid "Require a key to click links"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:54
|
||||
#: tabby-terminal/src/hotkeys.ts:58
|
||||
msgid "Reset zoom"
|
||||
msgstr ""
|
||||
|
||||
@@ -1464,11 +1546,11 @@ msgstr ""
|
||||
msgid "Restart current Telnet session"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:127
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:134
|
||||
msgid "Restart the app to apply changes"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153
|
||||
msgid "Restore terminal tabs on app start"
|
||||
msgstr ""
|
||||
|
||||
@@ -1482,7 +1564,7 @@ msgstr ""
|
||||
msgid "Right"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:43
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:49
|
||||
msgid "Right click"
|
||||
msgstr ""
|
||||
|
||||
@@ -1500,7 +1582,7 @@ msgstr ""
|
||||
msgid "Save a password in the keychain"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:116
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:123
|
||||
msgid "Save and apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -1520,11 +1602,11 @@ msgstr ""
|
||||
msgid "Saved layout"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:33
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39
|
||||
msgid "Scroll on input"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:74
|
||||
#: tabby-terminal/src/hotkeys.ts:78
|
||||
msgid "Scroll terminal to bottom"
|
||||
msgstr ""
|
||||
|
||||
@@ -1532,11 +1614,11 @@ msgstr ""
|
||||
msgid "Scrollback"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:34
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40
|
||||
msgid "Scrolls the terminal to the bottom on user input"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:66
|
||||
#: tabby-terminal/src/hotkeys.ts:70
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
@@ -1561,7 +1643,7 @@ msgstr ""
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:63
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:64
|
||||
msgid "Select a base profile to use as a template"
|
||||
msgstr ""
|
||||
|
||||
@@ -1573,7 +1655,7 @@ msgstr ""
|
||||
msgid "Select profile"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:178
|
||||
#: tabby-core/src/services/profiles.service.ts:181
|
||||
msgid "Select profile or enter an address"
|
||||
msgstr ""
|
||||
|
||||
@@ -1585,17 +1667,17 @@ msgstr ""
|
||||
msgid "Sends data one byte at a time"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-serial/src/profiles.ts:13
|
||||
#: tabby-serial/src/profiles.ts:71
|
||||
#: tabby-serial/src/profiles.ts:14
|
||||
#: tabby-serial/src/profiles.ts:72
|
||||
msgid "Serial"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-serial/src/profiles.ts:50
|
||||
#: tabby-serial/src/profiles.ts:61
|
||||
#: tabby-serial/src/profiles.ts:51
|
||||
#: tabby-serial/src/profiles.ts:62
|
||||
msgid "Serial connection"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-serial/src/profiles.ts:70
|
||||
#: tabby-serial/src/profiles.ts:71
|
||||
msgid "Serial: {description}"
|
||||
msgstr ""
|
||||
|
||||
@@ -1612,7 +1694,7 @@ msgstr ""
|
||||
msgid "Set password"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:162
|
||||
msgid "Set Tabby as %COMSPEC%"
|
||||
msgstr ""
|
||||
|
||||
@@ -1633,7 +1715,7 @@ msgstr ""
|
||||
msgid "Shell"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:541
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:552
|
||||
msgid "Shell does not support current path detection"
|
||||
msgstr ""
|
||||
|
||||
@@ -1641,11 +1723,11 @@ msgstr ""
|
||||
msgid "Shell integration"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:216
|
||||
#: tabby-core/src/hotkeys.ts:232
|
||||
msgid "Show {type} profile selector"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:115
|
||||
msgid "Show a confirmation box when pasting multiple lines"
|
||||
msgstr ""
|
||||
|
||||
@@ -1653,15 +1735,15 @@ msgstr ""
|
||||
msgid "Show built-in profiles in selector"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:119
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:126
|
||||
msgid "Show config file"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:118
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:125
|
||||
msgid "Show defaults"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:128
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:140
|
||||
msgid "Show Mixer"
|
||||
msgstr ""
|
||||
|
||||
@@ -1720,7 +1802,7 @@ msgstr ""
|
||||
msgid "SOCKS proxy port"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:121
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
@@ -1764,7 +1846,7 @@ msgstr ""
|
||||
msgid "Standard"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:132
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:144
|
||||
msgid "Startup"
|
||||
msgstr ""
|
||||
|
||||
@@ -1871,16 +1953,16 @@ msgstr ""
|
||||
msgid "Telnet session"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:187
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:191
|
||||
#: tabby-terminal/src/settings.ts:43
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40
|
||||
msgid "Terminal background"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:112
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124
|
||||
msgid "Terminal bell"
|
||||
msgstr ""
|
||||
|
||||
@@ -1908,7 +1990,7 @@ msgstr ""
|
||||
msgid "Thin"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:183
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:191
|
||||
msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues"
|
||||
msgstr ""
|
||||
|
||||
@@ -1937,7 +2019,7 @@ msgstr ""
|
||||
msgid "Try again"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-ssh/src/session/ssh.ts:474
|
||||
#: tabby-ssh/src/session/ssh.ts:482
|
||||
msgid "Trying saved password"
|
||||
msgstr ""
|
||||
|
||||
@@ -1945,7 +2027,7 @@ msgstr ""
|
||||
msgid "Turn current tab's panes into separate tabs"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:17
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:18
|
||||
msgid "Ungrouped"
|
||||
msgstr ""
|
||||
|
||||
@@ -1953,7 +2035,7 @@ msgstr ""
|
||||
msgid "Uninstall"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:240
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:241
|
||||
msgid "Unknown"
|
||||
msgstr ""
|
||||
|
||||
@@ -1970,7 +2052,7 @@ msgid "Up"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14
|
||||
#: tabby-electron/src/services/updater.service.ts:138
|
||||
#: tabby-electron/src/services/updater.service.ts:142
|
||||
msgid "Update"
|
||||
msgstr ""
|
||||
|
||||
@@ -1979,7 +2061,7 @@ msgid "Upgrade to {version}"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:5
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:8
|
||||
msgid "Upload"
|
||||
msgstr ""
|
||||
|
||||
@@ -1987,7 +2069,7 @@ msgstr ""
|
||||
msgid "Upload as a new config"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:26
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:32
|
||||
msgid "Use {altKeyName} as the Meta key"
|
||||
msgstr ""
|
||||
|
||||
@@ -2008,7 +2090,7 @@ msgstr ""
|
||||
msgid "Using CONNECT method"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-ssh/src/session/ssh.ts:463
|
||||
#: tabby-ssh/src/session/ssh.ts:471
|
||||
msgid "Using preset password"
|
||||
msgstr ""
|
||||
|
||||
@@ -2053,11 +2135,11 @@ msgstr ""
|
||||
msgid "Vibrancy"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:119
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:131
|
||||
msgid "Visual"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:102
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:114
|
||||
msgid "Warn on multi-line paste"
|
||||
msgstr ""
|
||||
|
||||
@@ -2081,7 +2163,7 @@ msgstr ""
|
||||
msgid "What's new"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:80
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
msgstr ""
|
||||
|
||||
@@ -2110,7 +2192,7 @@ msgstr ""
|
||||
msgid "Window frame"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:147
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Windows"
|
||||
msgstr ""
|
||||
|
||||
@@ -2122,7 +2204,7 @@ msgstr ""
|
||||
msgid "WinSCP path"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:66
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:72
|
||||
msgid "Word separators"
|
||||
msgstr ""
|
||||
|
||||
@@ -2130,11 +2212,12 @@ msgstr ""
|
||||
msgid "Working directory"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:13
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6
|
||||
msgid "Working directory detection"
|
||||
msgstr ""
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:127
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139
|
||||
msgid "WSL terminal bell can only be muted via Volume Mixer"
|
||||
msgstr ""
|
||||
|
||||
@@ -2158,11 +2241,11 @@ msgstr ""
|
||||
msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed."
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:46
|
||||
#: tabby-terminal/src/hotkeys.ts:50
|
||||
msgid "Zoom in"
|
||||
msgstr ""
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:50
|
||||
#: tabby-terminal/src/hotkeys.ts:54
|
||||
msgid "Zoom out"
|
||||
msgstr ""
|
||||
|
||||
|
391
locale/bg-BG.po
391
locale/da-DK.po
400
locale/de-DE.po
415
locale/es-ES.po
392
locale/fr-FR.po
392
locale/hr-HR.po
392
locale/it-IT.po
402
locale/ja-JP.po
2272
locale/ko-KR.po
Normal file
391
locale/pl-PL.po
412
locale/pt-BR.po
445
locale/pt-PT.po
415
locale/ru-RU.po
2273
locale/uk-UA.po
Normal file
392
locale/zh-CN.po
391
locale/zh-TW.po
22
package.json
@@ -25,7 +25,7 @@
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.33.0",
|
||||
"apply-loader": "2.0.0",
|
||||
"axios": "^0.26.1",
|
||||
"axios": "^0.27.2",
|
||||
"browserify-sign": "^4.2.1",
|
||||
"clone-deep": "^4.0.1",
|
||||
"compare-versions": "^4",
|
||||
@@ -34,8 +34,8 @@
|
||||
"cross-env": "7.0.3",
|
||||
"css-loader": "^6.7.1",
|
||||
"deep-equal": "2.0.5",
|
||||
"electron": "18.0.1",
|
||||
"electron-builder": "^22.14.13",
|
||||
"electron": "18.2.4",
|
||||
"electron-builder": "^23.0.9",
|
||||
"electron-download": "^4.1.1",
|
||||
"electron-installer-snap": "^5.1.0",
|
||||
"electron-notarize": "^1.2.1",
|
||||
@@ -43,17 +43,16 @@
|
||||
"eslint": "^7.32.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"gettext-extractor": "^3.5.4",
|
||||
"graceful-fs": "^4.2.9",
|
||||
"graceful-fs": "^4.2.10",
|
||||
"html-loader": "3.1.0",
|
||||
"json-loader": "^0.5.7",
|
||||
"thenby": "^1.3.4",
|
||||
"lru-cache": "^6.0.0",
|
||||
"macos-release": "^3.0.1",
|
||||
"ngx-sortablejs": "^11.1.0",
|
||||
"ngx-toastr": "^14.0.0",
|
||||
"node-abi": "^3.8.0",
|
||||
"node-abi": "^3.15.0",
|
||||
"node-sass": "^7.0.1",
|
||||
"npmlog": "6.0.0",
|
||||
"npmlog": "6.0.2",
|
||||
"npx": "^10.2.2",
|
||||
"patch-package": "^6.4.7",
|
||||
"po-gettext-loader": "^1.0.0",
|
||||
@@ -72,16 +71,17 @@
|
||||
"source-code-pro": "^2.38.0",
|
||||
"source-map-loader": "^3.0.1",
|
||||
"source-sans-pro": "3.6.0",
|
||||
"ssh2": "^1.8.0",
|
||||
"ssh2": "^1.10.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"thenby": "^1.3.4",
|
||||
"ts-loader": "^9.2.8",
|
||||
"tslib": "^2.3.1",
|
||||
"typedoc": "^0.22.13",
|
||||
"typedoc": "^0.22.15",
|
||||
"typescript": "^4.3.5",
|
||||
"utils-decorators": "^1.10.4",
|
||||
"val-loader": "4.0.0",
|
||||
"webpack": "^5.70.0",
|
||||
"webpack": "^5.72.1",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"yaml-loader": "0.6.0",
|
||||
@@ -102,7 +102,7 @@
|
||||
"prod": "cross-env TABBY_DEV=1 electron app",
|
||||
"docs": "node scripts/build-docs.js",
|
||||
"lint": "eslint --ext ts */src */lib",
|
||||
"postinstall": "patch-package && node ./scripts/install-deps.js",
|
||||
"postinstall": "patch-package && node ./scripts/install-deps.js && node ./scripts/build-native.js",
|
||||
"i18n:pull": "crowdin pull --skip-untranslated-strings",
|
||||
"i18n:extract": "node scripts/i18n-extract.js",
|
||||
"i18n:push": "crowdin push"
|
||||
|
@@ -4,7 +4,7 @@ const vars = require('./vars')
|
||||
|
||||
const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/')
|
||||
|
||||
process.env.ARCH = process.env.ARCH || process.arch === 'arm' ? 'armv7l' : process.arch
|
||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
|
||||
|
||||
builder({
|
||||
dir: true,
|
||||
|
@@ -3,7 +3,11 @@ const rebuild = require('electron-rebuild').default
|
||||
const path = require('path')
|
||||
const vars = require('./vars')
|
||||
|
||||
process.env.ARCH = process.env.ARCH || process.arch === 'arm' ? 'armv7l' : process.arch
|
||||
if (process.platform === 'win32' || process.platform === 'linux') {
|
||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
|
||||
} else {
|
||||
process.env.ARCH ??= process.arch
|
||||
}
|
||||
|
||||
let lifecycles = []
|
||||
for (let dir of ['app', 'tabby-core', 'tabby-local', 'tabby-ssh', 'tabby-terminal']) {
|
||||
|
@@ -19,7 +19,6 @@ parts:
|
||||
- libfontconfig-dev
|
||||
override-build: |
|
||||
yarn
|
||||
./scripts/build-native.js
|
||||
yarn run build
|
||||
./scripts/build-linux.js
|
||||
mkdir -p $SNAPCRAFT_PART_INSTALL/opt/tabby || true
|
||||
|
@@ -56,5 +56,9 @@ export abstract class ProfileProvider<P extends Profile> {
|
||||
return null
|
||||
}
|
||||
|
||||
intoQuickConnectString (profile: P): string|null {
|
||||
return null
|
||||
}
|
||||
|
||||
deleteProfile (profile: P): void { }
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@ export interface SelectorOption<T> {
|
||||
result?: T
|
||||
icon?: string
|
||||
freeInputPattern?: string
|
||||
freeInputEquivalent?: string
|
||||
color?: string
|
||||
weight?: number
|
||||
callback?: (string?) => void
|
||||
|
@@ -26,7 +26,7 @@ title-bar(
|
||||
[tab]='tab',
|
||||
[active]='tab == app.activeTab',
|
||||
@animateTab,
|
||||
[@.disabled]='hasVerticalTabs()',
|
||||
[@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
|
||||
(click)='app.selectTab(tab)',
|
||||
[class.fully-draggable]='hostApp.platform != Platform.macOS',
|
||||
[class.drag-region]='hostApp.platform == Platform.macOS && !(app.tabDragActive$|async)',
|
||||
|
@@ -25,8 +25,8 @@ import { AppService, FileTransfer, HostWindowService, PlatformService, ToolbarBu
|
||||
animations: [
|
||||
trigger('animateTab', [
|
||||
state('in', style({
|
||||
'flex-basis': '200px',
|
||||
width: '200px',
|
||||
'flex-basis': 'auto',
|
||||
width: 'auto',
|
||||
})),
|
||||
transition(':enter', [
|
||||
style({
|
||||
@@ -34,14 +34,14 @@ import { AppService, FileTransfer, HostWindowService, PlatformService, ToolbarBu
|
||||
width: '1px',
|
||||
}),
|
||||
animate('250ms ease-in-out', style({
|
||||
'flex-basis': '200px',
|
||||
width: '200px',
|
||||
'flex-basis': 'auto',
|
||||
width: 'auto',
|
||||
})),
|
||||
]),
|
||||
transition(':leave', [
|
||||
style({
|
||||
'flex-basis': '200px',
|
||||
width: '200px',
|
||||
'flex-basis': 'auto',
|
||||
width: 'auto',
|
||||
}),
|
||||
animate('250ms ease-in-out', style({
|
||||
'flex-basis': '1px',
|
||||
|
@@ -22,5 +22,13 @@
|
||||
[color]='option.color'
|
||||
)
|
||||
.title.mr-2 {{getOptionText(option)}}
|
||||
.description.no-wrap.text-muted {{option.description}}
|
||||
.no-wrap.badge.badge-secondary.text-muted.ml-auto(*ngIf='selectedIndex == i') Enter
|
||||
.description.no-wrap.text-muted(
|
||||
*ngIf='option.description !== getOptionText(option)'
|
||||
) {{option.description}}
|
||||
.ml-auto
|
||||
.no-wrap.badge.badge-secondary.text-muted.ml-2(*ngIf='selectedIndex == i && canEditSelected()')
|
||||
span Backspace
|
||||
i.fas.fa-pencil.ml-1
|
||||
.no-wrap.badge.badge-secondary.text-muted.ml-2(*ngIf='selectedIndex == i')
|
||||
span Enter
|
||||
i.fas.fa-arrow-right.ml-1
|
||||
|
@@ -27,7 +27,7 @@ export class SelectorModalComponent<T> {
|
||||
this.hasGroups = this.options.some(x => x.group)
|
||||
}
|
||||
|
||||
@HostListener('keyup', ['$event']) onKeyUp (event: KeyboardEvent): void {
|
||||
@HostListener('keydown', ['$event']) onKeyUp (event: KeyboardEvent): void {
|
||||
if (event.key === 'ArrowUp') {
|
||||
this.selectedIndex--
|
||||
event.preventDefault()
|
||||
@@ -42,6 +42,10 @@ export class SelectorModalComponent<T> {
|
||||
if (event.key === 'Escape') {
|
||||
this.close()
|
||||
}
|
||||
if (event.key === 'Backspace' && this.canEditSelected()) {
|
||||
this.filter = this.filteredOptions[this.selectedIndex].freeInputEquivalent!
|
||||
this.onFilterChange()
|
||||
}
|
||||
|
||||
this.selectedIndex = (this.selectedIndex + this.filteredOptions.length) % this.filteredOptions.length
|
||||
Array.from(this.itemChildren)[this.selectedIndex]?.nativeElement.scrollIntoView({
|
||||
@@ -85,6 +89,10 @@ export class SelectorModalComponent<T> {
|
||||
this.modalInstance.close(option.result)
|
||||
}
|
||||
|
||||
canEditSelected (): boolean {
|
||||
return !this.filter && !!this.filteredOptions[this.selectedIndex].freeInputEquivalent && this.options.some(x => x.freeInputPattern)
|
||||
}
|
||||
|
||||
close (): void {
|
||||
this.modalInstance.dismiss()
|
||||
}
|
||||
|
@@ -5,9 +5,11 @@ import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
|
||||
import { TabsService, NewTabParameters } from '../services/tabs.service'
|
||||
import { HotkeysService } from '../services/hotkeys.service'
|
||||
import { TabRecoveryService } from '../services/tabRecovery.service'
|
||||
import { ConfigService } from '../api'
|
||||
|
||||
export type SplitOrientation = 'v' | 'h'
|
||||
export type SplitDirection = 'r' | 't' | 'b' | 'l'
|
||||
export type ResizeDirection = 'v' | 'h' | 'dv' | 'dh'
|
||||
|
||||
/**
|
||||
* Describes a horizontal or vertical split row or column
|
||||
@@ -209,6 +211,11 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
/** @hidden */
|
||||
_allFocusMode = false
|
||||
|
||||
/**
|
||||
* Disables display of dynamic window/tab title provided by the shell
|
||||
*/
|
||||
disableDynamicTitle = false
|
||||
|
||||
/** @hidden */
|
||||
private focusedTab: BaseTabComponent|null = null
|
||||
private maximizedTab: BaseTabComponent|null = null
|
||||
@@ -250,6 +257,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
private hotkeys: HotkeysService,
|
||||
private tabsService: TabsService,
|
||||
private tabRecovery: TabRecoveryService,
|
||||
private config: ConfigService,
|
||||
) {
|
||||
super()
|
||||
this.root = new SplitContainer()
|
||||
@@ -303,6 +311,33 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
case 'pane-nav-next':
|
||||
this.navigateLinear(1)
|
||||
break
|
||||
case 'pane-nav-1':
|
||||
this.navigateSpecific(0)
|
||||
break
|
||||
case 'pane-nav-2':
|
||||
this.navigateSpecific(1)
|
||||
break
|
||||
case 'pane-nav-3':
|
||||
this.navigateSpecific(2)
|
||||
break
|
||||
case 'pane-nav-4':
|
||||
this.navigateSpecific(3)
|
||||
break
|
||||
case 'pane-nav-5':
|
||||
this.navigateSpecific(4)
|
||||
break
|
||||
case 'pane-nav-6':
|
||||
this.navigateSpecific(5)
|
||||
break
|
||||
case 'pane-nav-7':
|
||||
this.navigateSpecific(6)
|
||||
break
|
||||
case 'pane-nav-8':
|
||||
this.navigateSpecific(7)
|
||||
break
|
||||
case 'pane-nav-9':
|
||||
this.navigateSpecific(8)
|
||||
break
|
||||
case 'pane-maximize':
|
||||
if (this.maximizedTab) {
|
||||
this.maximize(null)
|
||||
@@ -313,6 +348,18 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
case 'close-pane':
|
||||
this.removeTab(this.focusedTab)
|
||||
break
|
||||
case 'pane-increase-vertical':
|
||||
this.resizePane('v')
|
||||
break
|
||||
case 'pane-decrease-vertical':
|
||||
this.resizePane('dv')
|
||||
break
|
||||
case 'pane-increase-horizontal':
|
||||
this.resizePane('h')
|
||||
break
|
||||
case 'pane-decrease-horizontal':
|
||||
this.resizePane('dh')
|
||||
break
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -504,6 +551,75 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
this.updateTitle()
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the size of the focused pane in the given direction
|
||||
*/
|
||||
resizePane (direction: ResizeDirection): void {
|
||||
const resizeStep = this.config.store.terminal.paneResizeStep
|
||||
|
||||
// The direction of the resize pane, vertically or horizontally
|
||||
let directionvh: SplitOrientation = 'h'
|
||||
|
||||
const isDecreasing: boolean = direction === 'dv' || direction === 'dh'
|
||||
|
||||
if (direction === 'dh') {
|
||||
directionvh = 'h'
|
||||
}
|
||||
if (direction === 'dv') {
|
||||
directionvh = 'v'
|
||||
}
|
||||
if (direction === 'h') {
|
||||
directionvh = 'h'
|
||||
}
|
||||
if (direction === 'v') {
|
||||
directionvh = 'v'
|
||||
}
|
||||
if (!this.focusedTab) {
|
||||
console.debug('No currently focused tab')
|
||||
return
|
||||
}
|
||||
|
||||
let currentContainer: BaseTabComponent | SplitContainer = this.focusedTab
|
||||
let child: BaseTabComponent | SplitContainer | null = this.focusedTab
|
||||
let curSplitOrientation: SplitOrientation | null = null
|
||||
|
||||
// Find the first split that is in the orientations that the user chooses to change
|
||||
while (curSplitOrientation !== directionvh) {
|
||||
const parentContainer = this.getParentOf(currentContainer)
|
||||
if (!parentContainer) {
|
||||
return
|
||||
}
|
||||
child = currentContainer
|
||||
currentContainer = parentContainer
|
||||
if (currentContainer instanceof SplitContainer) {
|
||||
curSplitOrientation = currentContainer.orientation
|
||||
}
|
||||
}
|
||||
|
||||
if (!(currentContainer instanceof SplitContainer)) {
|
||||
return
|
||||
}
|
||||
|
||||
// Determine which index in the ratios refers to the child that will be modified
|
||||
const currentChildIndex = currentContainer.children.indexOf(child)
|
||||
|
||||
let updatedRatio = 0
|
||||
if (isDecreasing) {
|
||||
updatedRatio = currentContainer.ratios[currentChildIndex] - resizeStep
|
||||
if (updatedRatio < 0) {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
updatedRatio = currentContainer.ratios[currentChildIndex] + resizeStep
|
||||
if (updatedRatio > 1) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
currentContainer.ratios[currentChildIndex] = updatedRatio
|
||||
this.layout()
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves focus in the given direction
|
||||
*/
|
||||
@@ -555,6 +671,15 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
this.focus(target)
|
||||
}
|
||||
|
||||
navigateSpecific (target: number): void {
|
||||
const all = this.getAllTabs()
|
||||
if (target >= all.length) {
|
||||
return
|
||||
}
|
||||
|
||||
this.focus(all[target])
|
||||
}
|
||||
|
||||
async splitTab (tab: BaseTabComponent, dir: SplitDirection): Promise<BaseTabComponent|null> {
|
||||
const newTab = await this.tabsService.duplicate(tab)
|
||||
if (newTab) {
|
||||
@@ -664,6 +789,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
}
|
||||
|
||||
private updateTitle (): void {
|
||||
if (this.disableDynamicTitle) {
|
||||
return
|
||||
}
|
||||
this.setTitle([...new Set(this.getAllTabs().map(x => x.title))].join(' | '))
|
||||
}
|
||||
|
||||
@@ -671,6 +799,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
const ref = tab.insertIntoContainer(this.viewContainer)
|
||||
this.viewRefs.set(tab, ref)
|
||||
tab.addEventListenerUntilDestroyed(ref.rootNodes[0], 'click', () => this.focus(tab))
|
||||
if (this.config.store.terminal.focusFollowsMouse) {
|
||||
tab.addEventListenerUntilDestroyed(ref.rootNodes[0], 'mousemove', () => this.focus(tab))
|
||||
}
|
||||
|
||||
tab.subscribeUntilDestroyed(tab.titleChange$, () => this.updateTitle())
|
||||
tab.subscribeUntilDestroyed(tab.activity$, a => a ? this.displayActivity() : this.clearActivity())
|
||||
|
@@ -73,8 +73,21 @@ hotkeys:
|
||||
- 'Ctrl-Alt-['
|
||||
pane-nav-next:
|
||||
- 'Ctrl-Alt-]'
|
||||
pane-nav-1: []
|
||||
pane-nav-2: []
|
||||
pane-nav-3: []
|
||||
pane-nav-4: []
|
||||
pane-nav-5: []
|
||||
pane-nav-6: []
|
||||
pane-nav-7: []
|
||||
pane-nav-8: []
|
||||
pane-nav-9: []
|
||||
pane-maximize:
|
||||
- 'Ctrl-Alt-Enter'
|
||||
pane-increase-vertical: []
|
||||
pane-decrease-vertical: []
|
||||
pane-increase-horizontal: []
|
||||
pane-decrease-horizontal: []
|
||||
close-pane: []
|
||||
switch-profile:
|
||||
- 'Ctrl-Alt-T'
|
||||
|
@@ -71,10 +71,23 @@ hotkeys:
|
||||
- '⌘-⌥-['
|
||||
pane-nav-next:
|
||||
- '⌘-⌥-]'
|
||||
pane-nav-1: []
|
||||
pane-nav-2: []
|
||||
pane-nav-3: []
|
||||
pane-nav-4: []
|
||||
pane-nav-5: []
|
||||
pane-nav-6: []
|
||||
pane-nav-7: []
|
||||
pane-nav-8: []
|
||||
pane-nav-9: []
|
||||
pane-maximize:
|
||||
- '⌘-⌥-Enter'
|
||||
close-pane:
|
||||
- '⌘-Shift-W'
|
||||
pane-increase-vertical: []
|
||||
pane-decrease-vertical: []
|
||||
pane-increase-horizontal: []
|
||||
pane-decrease-horizontal: []
|
||||
profile-selector:
|
||||
- '⌘-E'
|
||||
switch-profile:
|
||||
|
@@ -24,7 +24,7 @@ hotkeys:
|
||||
duplicate-tab: []
|
||||
explode-tab:
|
||||
- 'Ctrl-Shift-.'
|
||||
combine-tab:
|
||||
combine-tabs:
|
||||
- 'Ctrl-Shift-,'
|
||||
tab-1:
|
||||
- 'Alt-1'
|
||||
@@ -74,9 +74,22 @@ hotkeys:
|
||||
- 'Ctrl-Alt-['
|
||||
pane-nav-next:
|
||||
- 'Ctrl-Alt-]'
|
||||
pane-nav-1: []
|
||||
pane-nav-2: []
|
||||
pane-nav-3: []
|
||||
pane-nav-4: []
|
||||
pane-nav-5: []
|
||||
pane-nav-6: []
|
||||
pane-nav-7: []
|
||||
pane-nav-8: []
|
||||
pane-nav-9: []
|
||||
pane-maximize:
|
||||
- 'Ctrl-Alt-Enter'
|
||||
close-pane: []
|
||||
pane-increase-vertical: []
|
||||
pane-decrease-vertical: []
|
||||
pane-increase-horizontal: []
|
||||
pane-decrease-horizontal: []
|
||||
switch-profile:
|
||||
- 'Ctrl-Alt-T'
|
||||
profile-selector:
|
||||
|
@@ -1,3 +1,5 @@
|
||||
accessibility:
|
||||
animations: true
|
||||
appearance:
|
||||
dock: off
|
||||
dockScreen: current
|
||||
@@ -17,6 +19,8 @@ appearance:
|
||||
terminal:
|
||||
showBuiltinProfiles: true
|
||||
showRecentProfiles: 3
|
||||
paneResizeStep: 0.1
|
||||
focusFollowsMouse: false
|
||||
hotkeys:
|
||||
profile:
|
||||
__nonStructural: true
|
||||
|
@@ -188,6 +188,42 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
||||
id: 'pane-nav-next',
|
||||
name: this.translate.instant('Focus next pane'),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-1',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 1 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-2',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 2 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-3',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 3 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-4',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 4 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-5',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 5 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-6',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 6 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-7',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 7 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-8',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 8 }),
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-9',
|
||||
name: this.translate.instant('Focus pane {number}', { number: 9 }),
|
||||
},
|
||||
{
|
||||
id: 'switch-profile',
|
||||
name: this.translate.instant('Switch profile in the active pane'),
|
||||
@@ -196,6 +232,22 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
||||
id: 'close-pane',
|
||||
name: this.translate.instant('Close focused pane'),
|
||||
},
|
||||
{
|
||||
id: 'pane-increase-vertical',
|
||||
name: this.translate.instant('Increase vertical split size'),
|
||||
},
|
||||
{
|
||||
id: 'pane-decrease-vertical',
|
||||
name: this.translate.instant('Decrease vertical split size'),
|
||||
},
|
||||
{
|
||||
id: 'pane-increase-horizontal',
|
||||
name: this.translate.instant('Increase horizontal split size'),
|
||||
},
|
||||
{
|
||||
id: 'pane-decrease-horizontal',
|
||||
name: this.translate.instant('Decrease horizontal split size'),
|
||||
},
|
||||
]
|
||||
|
||||
constructor (
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
|
||||
import slugify from 'slugify'
|
||||
import { v4 as uuidv4 } from 'uuid'
|
||||
import { Injectable } from '@angular/core'
|
||||
import { TranslateService } from '@ngx-translate/core'
|
||||
import { ConfigService, NewTabParameters, PartialProfile, Profile, ProfileProvider } from './api'
|
||||
import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component'
|
||||
|
||||
@@ -16,7 +16,7 @@ export interface SplitLayoutProfile extends Profile {
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class SplitLayoutProfilesService extends ProfileProvider<SplitLayoutProfile> {
|
||||
id = 'split-layout'
|
||||
name = this.translate.instant('Saved layout')
|
||||
name = _('Saved layout')
|
||||
configDefaults = {
|
||||
options: {
|
||||
recoveryToken: null,
|
||||
@@ -26,7 +26,6 @@ export class SplitLayoutProfilesService extends ProfileProvider<SplitLayoutProfi
|
||||
constructor (
|
||||
private splitTabRecoveryProvider: SplitTabRecoveryProvider,
|
||||
private config: ConfigService,
|
||||
private translate: TranslateService,
|
||||
) {
|
||||
super()
|
||||
}
|
||||
@@ -39,7 +38,7 @@ export class SplitLayoutProfilesService extends ProfileProvider<SplitLayoutProfi
|
||||
return this.splitTabRecoveryProvider.recover(profile.options.recoveryToken)
|
||||
}
|
||||
|
||||
getDescription (_: SplitLayoutProfile): string {
|
||||
getDescription (): string {
|
||||
return ''
|
||||
}
|
||||
|
||||
|
@@ -144,7 +144,7 @@ export class AppService {
|
||||
}
|
||||
|
||||
removeTab (tab: BaseTabComponent): void {
|
||||
const newIndex = Math.max(0, this.tabs.indexOf(tab) - 1)
|
||||
const newIndex = Math.min(this.tabs.length - 2, this.tabs.indexOf(tab))
|
||||
this.tabs = this.tabs.filter((x) => x !== tab)
|
||||
if (tab === this._activeTab) {
|
||||
this.selectTab(this.tabs[newIndex])
|
||||
|
@@ -35,6 +35,10 @@ export class HomeBaseService {
|
||||
this.platform.openExternal('https://twitter.com/eugeeeeny')
|
||||
}
|
||||
|
||||
openTranslations (): void {
|
||||
this.platform.openExternal('https://translate.tabby.sh/project/tabby')
|
||||
}
|
||||
|
||||
reportBug (): void {
|
||||
let body = `Version: ${this.appVersion}\n`
|
||||
body += `Platform: ${this.hostApp.platform} ${process.arch} ${this.platform.getOSRelease()}\n`
|
||||
|
@@ -11,9 +11,11 @@ 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 localeKO from '@angular/common/locales/ko'
|
||||
import localePL from '@angular/common/locales/pl'
|
||||
import localePT from '@angular/common/locales/pt'
|
||||
import localeRU from '@angular/common/locales/ru'
|
||||
import localeUK from '@angular/common/locales/uk'
|
||||
import localeZH from '@angular/common/locales/zh'
|
||||
import { Observable, Subject } from 'rxjs'
|
||||
import { distinctUntilChanged } from 'rxjs/operators'
|
||||
@@ -29,9 +31,11 @@ registerLocaleData(localeFR)
|
||||
registerLocaleData(localeHR)
|
||||
registerLocaleData(localeIT)
|
||||
registerLocaleData(localeJA)
|
||||
registerLocaleData(localeKO)
|
||||
registerLocaleData(localePL)
|
||||
registerLocaleData(localePT)
|
||||
registerLocaleData(localeRU)
|
||||
registerLocaleData(localeUK)
|
||||
registerLocaleData(localeZH)
|
||||
|
||||
function flattenMessageFormatTranslation (po: any) {
|
||||
@@ -114,10 +118,18 @@ export class LocaleService {
|
||||
code: 'ru-RU',
|
||||
name: 'Русский',
|
||||
},
|
||||
{
|
||||
code: 'uk-UA',
|
||||
name: 'Українська',
|
||||
},
|
||||
{
|
||||
code: 'ja-JP',
|
||||
name: '日本語',
|
||||
},
|
||||
{
|
||||
code: 'ko-KR',
|
||||
name: '한국어',
|
||||
},
|
||||
{
|
||||
code: 'zh-CN',
|
||||
name: '中文(简体)',
|
||||
|
@@ -90,9 +90,12 @@ export class ProfilesService {
|
||||
|
||||
selectorOptionForProfile <P extends Profile, T> (profile: PartialProfile<P>): SelectorOption<T> {
|
||||
const fullProfile = this.getConfigProxyForProfile(profile)
|
||||
const provider = this.providerForProfile(fullProfile)
|
||||
const freeInputEquivalent = provider?.intoQuickConnectString(fullProfile) ?? undefined
|
||||
return {
|
||||
...profile,
|
||||
description: this.providerForProfile(fullProfile)?.getDescription(fullProfile),
|
||||
freeInputEquivalent,
|
||||
description: provider?.getDescription(fullProfile),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +115,7 @@ export class ProfilesService {
|
||||
group: this.translate.instant('Recent'),
|
||||
icon: 'fas fa-history',
|
||||
color: p.color,
|
||||
weight: -1,
|
||||
weight: -2,
|
||||
callback: async () => {
|
||||
if (p.id) {
|
||||
p = (await this.getProfiles()).find(x => x.id === p.id) ?? p
|
||||
|
@@ -32,10 +32,6 @@ app-root {
|
||||
background: rgba(0,0,0,.65);
|
||||
}
|
||||
|
||||
&.no-tabs {
|
||||
background: rgba(0,0,0,.5);
|
||||
}
|
||||
|
||||
&> .content {
|
||||
.tab-bar {
|
||||
.btn-tab-bar {
|
||||
@@ -304,6 +300,10 @@ checkbox i.on {
|
||||
|
||||
search-panel {
|
||||
background: #131d27 !important;
|
||||
|
||||
input {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -398,7 +398,7 @@ ngx-colors-panel .opened {
|
||||
background: $body-bg !important;
|
||||
|
||||
button {
|
||||
color: $body-color;
|
||||
color: $body-color !important;
|
||||
}
|
||||
|
||||
.button svg {
|
||||
|
@@ -65,6 +65,10 @@ export class ElectronHostAppService extends HostAppService {
|
||||
this.electron.ipcRenderer.send('app:config-change', configStore)
|
||||
}
|
||||
|
||||
saveConfig (data: string): void {
|
||||
this.electron.ipcRenderer.send('app:save-config', data)
|
||||
}
|
||||
|
||||
emitReady (): void {
|
||||
this.electron.ipcRenderer.send('app:ready')
|
||||
}
|
||||
@@ -74,7 +78,11 @@ export class ElectronHostAppService extends HostAppService {
|
||||
if (isPortable) {
|
||||
this.electron.app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE })
|
||||
} else {
|
||||
this.electron.app.relaunch()
|
||||
let args: string[] = []
|
||||
if (this.platform === Platform.Linux) {
|
||||
args = ['--no-sandbox']
|
||||
}
|
||||
this.electron.app.relaunch({ args })
|
||||
}
|
||||
this.electron.app.exit()
|
||||
}
|
||||
|
@@ -1,17 +1,15 @@
|
||||
import * as path from 'path'
|
||||
import * as fs from 'fs/promises'
|
||||
import * as gracefulFS from 'graceful-fs'
|
||||
import * as fsSync from 'fs'
|
||||
import * as os from 'os'
|
||||
import { v4 as uuidv4 } from 'uuid'
|
||||
import { promisify } from 'util'
|
||||
import promiseIpc, { RendererProcessType } from 'electron-promise-ipc'
|
||||
import { execFile } from 'mz/child_process'
|
||||
import { Injectable, NgZone } from '@angular/core'
|
||||
import { PlatformService, ClipboardContent, HostAppService, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||
import { ElectronService } from '../services/electron.service'
|
||||
import { ElectronHostWindow } from './hostWindow.service'
|
||||
import { ShellIntegrationService } from './shellIntegration.service'
|
||||
import { ElectronHostAppService } from './hostApp.service'
|
||||
const fontManager = require('fontmanager-redux') // eslint-disable-line
|
||||
|
||||
/* eslint-disable block-scoped-var */
|
||||
@@ -27,10 +25,9 @@ try {
|
||||
export class ElectronPlatformService extends PlatformService {
|
||||
supportsWindowControls = true
|
||||
private configPath: string
|
||||
private _configSaveInProgress = Promise.resolve()
|
||||
|
||||
constructor (
|
||||
private hostApp: HostAppService,
|
||||
private hostApp: ElectronHostAppService,
|
||||
private hostWindow: ElectronHostWindow,
|
||||
private electron: ElectronService,
|
||||
private zone: NgZone,
|
||||
@@ -112,18 +109,7 @@ export class ElectronPlatformService extends PlatformService {
|
||||
}
|
||||
|
||||
async saveConfig (content: string): Promise<void> {
|
||||
try {
|
||||
await this._configSaveInProgress
|
||||
} catch { }
|
||||
this._configSaveInProgress = this._saveConfigInternal(content)
|
||||
await this._configSaveInProgress
|
||||
}
|
||||
|
||||
async _saveConfigInternal (content: string): Promise<void> {
|
||||
const tempPath = this.configPath + '.new.' + uuidv4().toString()
|
||||
await fs.writeFile(tempPath, content, 'utf8')
|
||||
await fs.writeFile(this.configPath + '.backup', content, 'utf8')
|
||||
await promisify(gracefulFS.rename)(tempPath, this.configPath)
|
||||
this.hostApp.saveConfig(content)
|
||||
}
|
||||
|
||||
getConfigPath (): string|null {
|
||||
|
@@ -54,11 +54,15 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
config.ready$.toPromise().then(() => {
|
||||
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) {
|
||||
this.logger.debug('Checking for updates')
|
||||
let arch = process.arch
|
||||
if (process.platform === 'darwin' && process.arch === 'x64') {
|
||||
arch = 'x86_64'
|
||||
}
|
||||
try {
|
||||
this.autoUpdater.setFeedURL({
|
||||
provider: 'github',
|
||||
repo: 'tabby',
|
||||
owner: 'eugeny',
|
||||
provider: 's3',
|
||||
bucket: 'tabby-updates',
|
||||
path: `updates-latest-${arch}`,
|
||||
})
|
||||
this.autoUpdater.checkForUpdates()
|
||||
} catch (e) {
|
||||
|
@@ -26,7 +26,7 @@ export class OpenSSHImporter extends SSHProfileImporter {
|
||||
if (line.trim().startsWith('#') || !line.trim()) {
|
||||
continue
|
||||
}
|
||||
if (line.startsWith('Host ')) {
|
||||
if (line.toLowerCase().startsWith('host ')) {
|
||||
if (currentProfile) {
|
||||
results.push(currentProfile)
|
||||
}
|
||||
|
@@ -494,9 +494,9 @@ winston-transport@^4.5.0:
|
||||
triple-beam "^1.3.0"
|
||||
|
||||
winston@^3.3.3:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/winston/-/winston-3.6.0.tgz#be32587a099a292b88c49fac6fa529d478d93fb6"
|
||||
integrity sha512-9j8T75p+bcN6D00sF/zjFVmPp+t8KMPB1MzbbzYjeN9VWxdsYnTB40TkbNUEXAmILEfChMvAMgidlX64OG3p6w==
|
||||
version "3.7.2"
|
||||
resolved "https://registry.yarnpkg.com/winston/-/winston-3.7.2.tgz#95b4eeddbec902b3db1424932ac634f887c400b1"
|
||||
integrity sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==
|
||||
dependencies:
|
||||
"@dabh/diagnostics" "^2.0.2"
|
||||
async "^3.2.3"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import * as path from 'path'
|
||||
import * as fs from 'mz/fs'
|
||||
import { Injectable } from '@angular/core'
|
||||
import { CLIHandler, CLIEvent, AppService, ConfigService, HostWindowService } from 'tabby-core'
|
||||
import { CLIHandler, CLIEvent, AppService, ConfigService, HostWindowService, ProfilesService, NotificationsService } from 'tabby-core'
|
||||
import { TerminalService } from './services/terminal.service'
|
||||
|
||||
@Injectable()
|
||||
@@ -63,7 +63,9 @@ export class OpenPathCLIHandler extends CLIHandler {
|
||||
|
||||
constructor (
|
||||
private terminal: TerminalService,
|
||||
private profiles: ProfilesService,
|
||||
private hostWindow: HostWindowService,
|
||||
private notifications: NotificationsService,
|
||||
) {
|
||||
super()
|
||||
}
|
||||
@@ -72,12 +74,44 @@ export class OpenPathCLIHandler extends CLIHandler {
|
||||
const op = event.argv._[0]
|
||||
const opAsPath = op ? path.resolve(event.cwd, op) : null
|
||||
|
||||
const profile = await this.terminal.getDefaultProfile()
|
||||
|
||||
if (opAsPath && (await fs.lstat(opAsPath)).isDirectory()) {
|
||||
this.terminal.openTab(undefined, opAsPath)
|
||||
this.terminal.openTab(profile, opAsPath)
|
||||
this.hostWindow.bringToFront()
|
||||
return true
|
||||
}
|
||||
|
||||
if (opAsPath && await fs.exists(opAsPath)) {
|
||||
if (opAsPath.endsWith('.sh') || opAsPath.endsWith('.command')) {
|
||||
profile.options!.pauseAfterExit = true
|
||||
profile.options?.args?.push(opAsPath)
|
||||
this.terminal.openTab(profile)
|
||||
this.hostWindow.bringToFront()
|
||||
return true
|
||||
} else if (opAsPath.endsWith('.bat')) {
|
||||
const psProfile = (await this.profiles.getProfiles()).find(x => x.id === 'cmd')
|
||||
if (psProfile) {
|
||||
psProfile.options!.pauseAfterExit = true
|
||||
psProfile.options?.args?.push(opAsPath)
|
||||
this.terminal.openTab(psProfile)
|
||||
this.hostWindow.bringToFront()
|
||||
return true
|
||||
}
|
||||
} else if (opAsPath.endsWith('.ps1')) {
|
||||
const cmdProfile = (await this.profiles.getProfiles()).find(x => x.id === 'powershell')
|
||||
if (cmdProfile) {
|
||||
cmdProfile.options!.pauseAfterExit = true
|
||||
cmdProfile.options?.args?.push(opAsPath)
|
||||
this.terminal.openTab(cmdProfile)
|
||||
this.hostWindow.bringToFront()
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
this.notifications.error('Cannot handle scripts of this type')
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
1
tabby-local/src/icons/alma.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 61.028 59.731" xmlns="http://www.w3.org/2000/svg"><style>.st1{fill:#86da2f}.st2{fill:#24c2ff}.st3{fill:#ffcb12}.st4{fill:#0069da}.st5{fill:#ff4649}</style><path class="st1" d="M56.114 33.731c2.6-.2 4.7 1.5 4.9 4.1.2 2.7-1.7 4.9-4.3 5.1-2.5.2-4.7-1.7-4.9-4.2-.2-2.7 1.6-4.7 4.3-5z"/><path class="st2" d="M24.514 55.031c0-2.6 2-4.6 4.4-4.6s4.7 2.2 4.7 4.7c0 2.4-2 4.5-4.3 4.6-2.9 0-4.8-1.8-4.8-4.7z"/><path class="st3" d="M31.614 25.831c-.4.2-.6-.1-.7-.4-3.7-6.9-2.6-15.6 3.9-20.8 1.7-1.4 4.9-1.7 6.3-.3.6.5.7 1.1.8 1.8.2 1.5.5 3 1.5 4.2 1.1 1.3 2.5 1.8 4.1 1.7 1.4 0 2.8-.2 3.7 1.4.5.9.3 4.4-.5 5.1-.4.3-.7.1-1 0-2.3-.9-4.7-.9-7.1-.5-.8.1-1.2-.1-1.2-1-.1-1.5-.4-2.9-1.2-4.2-1.5-2.7-4.3-2.8-6.1-.3-1.5 2-1.9 4.4-2.3 6.8-.4 2.1-.3 4.3-.2 6.5 0 0-.1 0 0 0z"/><path class="st1" d="M34.114 27.331c-.2-.3-.1-.6.2-.8 5.7-5.2 14.2-6.2 20.8-1.1 1.7 1.4 2.8 4.3 1.9 6-.4.7-.9 1-1.5 1.2-1.4.6-2.7 1.2-3.6 2.5s-1.1 2.8-.7 4.4c.3 1.3.8 2.7-.5 3.9-.7.7-4.1 1.3-5 .7-.4-.3-.3-.6-.2-1 .3-2.5-.3-4.8-1.2-7-.3-.8-.2-1.2.6-1.4 1.4-.4 2.7-1.1 3.7-2.1 2.2-2.1 1.7-4.8-1.2-6-2.3-1-4.7-.8-7-.6-2.2.1-4.3.7-6.3 1.3z"/><path class="st2" d="M32.814 29.931c.3-.3.5-.2.8 0 6.6 4 10 11.9 7 19.6-.8 2-3.4 4-5.3 3.5-.8-.2-1.2-.6-1.6-1.1-.9-1.2-1.9-2.3-3.4-2.8-1.6-.5-3-.2-4.4.6-1.2.7-2.4 1.6-3.9.7-.9-.5-2.4-3.6-2.1-4.6.2-.4.6-.4 1-.4 2.5-.4 4.5-1.6 6.4-3.2.6-.5 1.1-.5 1.6.2.8 1.2 1.8 2.2 3.1 2.9 2.6 1.5 5.1.2 5.4-2.8.3-2.5-.6-4.7-1.4-6.9-.9-2-2-3.9-3.2-5.7z"/><path class="st4" d="M29.614 30.531c-.4 2-1.3 3.9-2.5 5.6-3.6 5.4-8.8 7.6-15.2 7-2.3-.2-4.2-2.1-4.4-4-.1-.8.1-1.4.6-2 .7-.9 1.3-1.7 1.6-2.8.6-2.2-.2-4-1.8-5.6-2.2-2.2-1.9-4.2.7-5.8.3-.2.7-.4 1.1-.6.6-.3 1.1-.3 1.3.4.9 2.3 2.7 4 4.7 5.4.7.6.7 1 .1 1.7-1.2 1.3-1.9 2.9-2 4.7-.2 2.2 1.1 3.6 3.3 3.6 1.4 0 2.7-.5 3.9-1.1 3.1-1.6 5.5-3.9 7.8-6.3.3-.1.4-.3.8-.2z"/><path class="st5" d="M13.214 9.531c.2 0 .7.1 1.2.2 3.7.7 6-.6 7.2-4.1.8-2.3 2.5-3 4.7-1.8.1 0 .1.1.2.1 2.3 1.3 2.3 1.5.9 3.5-1.2 1.6-1.8 3.4-2.1 5.3-.2 1.1-.6 1.3-1.6.9-1.6-.6-3.3-.6-5 0-1.9.6-2.7 2.3-2.1 4.2.8 2.5 3 3.6 4.9 4.9s4.1 2 6.2 2.9c.3.1.8.1.7.6-.1.3-.5.3-.9.3-4.5.2-8.8-.5-12.3-3.5-3.3-2.7-5.7-6-5.3-10.6.3-1.5 1.4-2.6 3.3-2.9z"/><path class="st4" d="M5.014 37.631c-2.4.3-4.8-1.7-5-4.2-.2-2.4 1.8-4.8 4.1-5 2.6-.3 5 1.5 5.2 3.9.1 2.3-1.4 5.1-4.3 5.3z"/><path class="st3" d="M47.014 2.031c2.5-.2 4.9 1.8 5.1 4.3.2 2.4-1.8 4.7-4.2 4.9-2.6.2-4.9-1.7-5.1-4.2s1.6-4.8 4.2-5z"/><path class="st5" d="M20.914 3.931c.3 2.6-1.5 4.8-4.2 5.2-2.3.3-4.7-1.6-5-3.8-.3-2.9 1.3-5 4-5.3 2.5-.3 4.9 1.6 5.2 3.9z"/></svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
tabby-local/src/icons/docker.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="-5.724 -43.601 714.54 512.74" xmlns="http://www.w3.org/2000/svg"><g fill="#0091e2"><path d="M701.77 149.96c-1.938-1.539-20.029-15.199-58.181-15.199a185.562 185.562 0 00-30.061 2.584c-7.384-50.612-49.228-75.288-51.104-76.395l-10.245-5.908-6.738 9.723a137.318 137.318 0 00-18.214 42.582c-6.831 28.891-2.677 56.027 11.999 79.226-17.722 9.876-46.151 12.307-51.904 12.522H16.642c-12.294.017-22.27 9.952-22.337 22.245a338.726 338.726 0 0020.614 120.95c16.214 42.521 40.336 73.842 71.719 93.01 35.167 21.537 92.302 33.844 157.07 33.844a468.88 468.88 0 0087.226-7.907 364.663 364.663 0 00113.84-41.352 312.969 312.969 0 0077.688-63.596c37.29-42.213 59.505-89.226 76.026-131.01h6.584c40.828 0 65.935-16.338 79.78-30.029a87.08 87.08 0 0021.045-31.167l2.923-8.553z"/><path d="M60.271 185.31h63.073a5.507 5.507 0 005.507-5.507v-56.182a5.507 5.507 0 00-5.476-5.538H60.271a5.507 5.507 0 00-5.507 5.507V179.802a5.507 5.507 0 005.507 5.508M147.19 185.31h63.073a5.507 5.507 0 005.507-5.507v-56.182a5.507 5.507 0 00-5.477-5.538h-63.104a5.537 5.537 0 00-5.538 5.538v56.181a5.54 5.54 0 005.539 5.508M235.43 185.31h63.073a5.507 5.507 0 005.507-5.507v-56.182a5.507 5.507 0 00-5.477-5.538h-63.104a5.507 5.507 0 00-5.507 5.507V179.802a5.51 5.51 0 005.508 5.508M322.62 185.31h63.073a5.537 5.537 0 005.538-5.507v-56.182a5.537 5.537 0 00-5.538-5.538H322.62a5.507 5.507 0 00-5.507 5.507V179.802a5.508 5.508 0 005.507 5.508M147.19 104.48h63.073a5.539 5.539 0 005.507-5.538V42.761a5.507 5.507 0 00-5.507-5.507H147.19a5.538 5.538 0 00-5.538 5.507v56.181a5.568 5.568 0 005.538 5.538M235.43 104.48h63.073a5.539 5.539 0 005.507-5.538V42.761a5.507 5.507 0 00-5.507-5.507H235.43a5.507 5.507 0 00-5.507 5.507v56.181a5.539 5.539 0 005.507 5.538M322.62 104.48h63.073a5.568 5.568 0 005.538-5.538V42.761a5.537 5.537 0 00-5.538-5.507H322.62a5.507 5.507 0 00-5.507 5.507v56.181a5.539 5.539 0 005.507 5.538M322.62 23.626h63.073a5.538 5.538 0 005.538-5.507v-56.213a5.537 5.537 0 00-5.538-5.507H322.62a5.506 5.506 0 00-5.507 5.507v56.212a5.508 5.508 0 005.507 5.508M410.59 185.31h63.073a5.537 5.537 0 005.538-5.507v-56.182a5.537 5.537 0 00-5.538-5.538H410.59a5.508 5.508 0 00-5.507 5.507V179.802a5.508 5.508 0 005.507 5.508"/></g></svg>
|
After Width: | Height: | Size: 2.2 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="svg-inline--fa fa-git-alt fa-w-14 fa-3x" data-icon="git-alt" data-prefix="fab" focusable="false" role="img" viewBox="0 0 448 512"><path fill="#f05033" stroke="none" stroke-width="1" d="M439.55 236.05L244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 113.925 113.923"><defs><clipPath id="aaaaaaaa"><path d="M0 0h2183.73v912H0V0z"/></clipPath><clipPath id="bbbbbbbb"><path d="M230.892 51.977L181.15 2.238a7.336 7.336 0 00-10.375 0l-10.328 10.33 13.102 13.102c3.046-1.028 6.537-.339 8.964 2.089a8.72 8.72 0 012.07 9.02l12.627 12.627c3.055-1.053 6.58-.373 9.02 2.07a8.727 8.727 0 010 12.346 8.729 8.729 0 01-12.349 0 8.734 8.734 0 01-1.9-9.494L180.204 42.55v30.99a8.806 8.806 0 012.309 1.652c3.41 3.409 3.41 8.933 0 12.347-3.411 3.41-8.938 3.41-12.346 0-3.41-3.414-3.41-8.938 0-12.347a8.735 8.735 0 012.859-1.905V42.009a8.636 8.636 0 01-2.859-1.905 8.728 8.728 0 01-1.88-9.544L155.37 17.642l-34.106 34.105a7.339 7.339 0 000 10.378l49.742 49.74a7.338 7.338 0 0010.376 0l49.509-49.51a7.341 7.341 0 000-10.378" fill="#f03c2e"/></clipPath></defs><g transform="translate(-119.116 -.075)" clip-path="url(#bbbbbbbb)"><path d="M230.435-10.813l-49.742-49.739a7.336 7.336 0 00-10.374 0l-49.51 49.51a7.339 7.339 0 000 10.378l49.741 49.738a7.338 7.338 0 0010.376 0l49.51-49.508a7.341 7.341 0 000-10.379" fill="#ff8080"/><path d="M293.393 51.928L243.65 2.188a7.336 7.336 0 00-10.375 0c-16.502 16.505-33.006 33.007-49.51 49.51a7.339 7.339 0 000 10.378l49.742 49.739a7.338 7.338 0 0010.376 0l49.509-49.509a7.341 7.341 0 000-10.378" fill="#8dd35f"/><path d="M167.436 51.52L117.693 1.783a7.336 7.336 0 00-10.374 0l-49.51 49.509a7.339 7.339 0 000 10.378l49.741 49.74a7.338 7.338 0 0010.376-.001l49.51-49.508a7.341 7.341 0 000-10.38" fill="#80b3ff"/><path d="M230.13 114.117l-49.743-49.739a7.336 7.336 0 00-10.374 0l-49.51 49.51a7.339 7.339 0 000 10.378l49.741 49.738a7.338 7.338 0 0010.376 0l49.51-49.508a7.341 7.341 0 000-10.379" fill="#ffe680"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 718 B After Width: | Height: | Size: 1.7 KiB |
1
tabby-local/src/icons/kali.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg version="1" viewBox="0 0 459.36 233.64" xmlns="http://www.w3.org/2000/svg"><path d="M448.2.54c-1.708-.456-3.412-.54-5.177-.54H15.093C8.67.05 3.033 4.105.898 10.144c-.697 1.963-.9 3.95-.9 6.01v202.42c.238 8.434 6.837 15.012 15.194 15.033 17.519.023 53.594-.063 53.594-.063l-.064-15.665h-52.62c-.279-1.683-.208-199.78.064-200.69 1.612-.225 425.79-.144 426.72.074.257 1.528.182 199.65-.098 200.69H88.048v15.667s1.384 0 2.018.023h354.25a15.182 15.182 0 0014.147-10.038c.697-1.908.898-3.875.898-5.886v-202.8c-.134-6.7-4.693-12.585-11.143-14.365zM88.06 174.55v-40.512c0-.914.257-1.556 1.003-2.135 3.129-2.474 6.216-5.019 9.303-7.545.308-.228.608-.432.992-.712.333.43.613.783.872 1.17 5.248 7.572 10.5 15.136 15.746 22.696 6.436 9.313 12.883 18.583 19.306 27.852.356.538.684.946 1.475.946 6.762-.023 13.519-.023 20.273-.023.223 0 .453-.074.81-.155-14.956-21.781-29.85-43.412-44.79-65.174 3.005-3.49 5.913-6.847 8.817-10.288 2.912-3.37 5.814-6.75 8.721-10.142 2.903-3.384 5.785-6.774 8.696-10.161 2.904-3.395 5.813-6.783 8.685-10.168a1556.02 1556.02 0 008.827-10.347h-1.704c-6.12 0-12.237.037-18.358-.023-1.125 0-1.835.326-2.578 1.2a41266 41266 0 01-45.178 53.398c-.2.228-.46.432-.894.832V70.965c0-3.666.063-7.343 0-11.012H69.175v116.15c1.501.264 17.926.21 18.94-.063v-1.477zm100.96 1.682c.152-.44.326-.818.459-1.227 3.055-8.681 6.114-17.348 9.178-26.037a136.3 136.3 0 001.478-4.203c.182-.585.48-.892 1.098-.817.2.023.432 0 .635 0h43.136c3.9 10.803 7.772 21.529 11.63 32.255h20.192a186785 186785 0 01-43.549-116.77h-20.649c-.132.254-.23.44-.282.614-14.377 38.55-28.737 77.119-43.11 115.66-.062.063-.062.182-.062.256v.124c0 .05.063.074.074.132h19.734zm17.457-50.036c3.977-11.515 8.01-22.98 11.885-34.526 1.555-4.64 2.727-9.427 4.05-14.16.113-.358.183-.718.334-1.257.2.305.356.491.41.692 3.159 11.794 7.477 23.237 11.398 34.807 1.63 4.814 3.316 9.599 4.974 14.415.126.431.251.862.404 1.395H206.05c.152-.502.28-.934.426-1.365zm102.24-57.278c0-3.008.11-5.988-.087-8.967h-18.675c-.315 1.452-.238 115.33.063 116.29h68.021v-16.18h-32.812c-2.758 0-5.538.023-8.284 0-2.707-.023-5.403.1-8.21-.063V68.94zm81.201-8.251c0-.18 0-.33-.063-.518 0-.05-.062-.063-.062-.099 0-.023-.075-.063-.075-.063h-18.74v116.22h18.839c.063-.195.11-.3.11-.43V60.667z" clip-rule="evenodd" fill="#367bf0" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 205 KiB |
1
tabby-local/src/icons/open-euler.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 80.14 56.1" xmlns="http://www.w3.org/2000/svg"><defs><style>.cls-2{fill:#002fa7}</style></defs><g data-name="图层 2"><g data-name="图层 1"><path class="cls-2" d="M75.101 9.097c-4.08-1.06-9-.05-11.16 2.28s-.92 5.49 3.27 6.82c4.39 1.4 9.92.3 12.07-2.42s.08-5.53-4.18-6.68zM48.941 40.017a12.32 12.32 0 00-13.77 2.64c-3.54 3.79-3.15 9.12 1.26 11.87 4.68 2.93 11.67 1.64 15.18-2.82a7.39 7.39 0 00-2.67-11.69zM57.421 4.527a12.49 12.49 0 00-6.13.12 11.3 11.3 0 01-4.76-.14 3.68 3.68 0 01-2.66-1.92 1.58 1.58 0 00-.1-.43v-.06a3.38 3.38 0 00-2.45-1.72.61.61 0 00-.13 0 10.14 10.14 0 00-4.78-.17c-3.55.66-6.15 2.71-5.81 4.58a10.21 10.21 0 01-.06 1 4.34 4.34 0 01-1.79 2.46 8.39 8.39 0 01-3.2 1.69 14.83 14.83 0 01-2 .26 19.55 19.55 0 00-2.81.17 5.75 5.75 0 00-3.17 1.59 3.78 3.78 0 00-.88 3 5.5 5.5 0 01.06 1.29 5.55 5.55 0 01-2.37 3.67 12.93 12.93 0 01-5.41 2.49 13.54 13.54 0 00-5.87 2.6c-3.38 2.64-4.16 6.12-1.53 7.76 1.54 1 3.89 1.06 6.29.41a8 8 0 015.15.72 4.42 4.42 0 011.78 1.81 3.24 3.24 0 01.32 1 4.12 4.12 0 01.07.78 4.91 4.91 0 002.25 5.21c3.57 2.22 9.6 1.06 13.14-2.55 3.38-3.45 3-7.63-.64-9.39a10.13 10.13 0 00-6.91-.37 8.66 8.66 0 01-5.24-.66 3.54 3.54 0 01-2.14-3.24 6.83 6.83 0 01.42-1.64 9.92 9.92 0 012.16-3.13 9.55 9.55 0 014.44-2.36c.68-.18 1.79-.41 2-.43a10.64 10.64 0 014.93.41c1.41.57 2.45 1.5 2.54 2.66a4.47 4.47 0 002.8 4 11.61 11.61 0 0011.84-2.37c2.7-2.76 1.8-6-1.78-7.24a11.39 11.39 0 00-6.5-.08 10 10 0 01-5-.35c-1.46-.55-2.42-1.44-2.47-2.48a5.59 5.59 0 011.77-3.87 11.79 11.79 0 013.91-2 12.63 12.63 0 011.85-.43 11.79 11.79 0 014.69.19c1.4.42 2.68 1.19 2.72 2 .06 1.1 1.15 2.41 3.13 3 3.55 1.14 8.47.13 10.77-2.21s1.05-4.72-2.44-5.63z"/></g></g></svg>
|
After Width: | Height: | Size: 1.7 KiB |
1
tabby-local/src/icons/oracle-linux.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 31.4 19.8" xmlns="http://www.w3.org/2000/svg"><path d="M9.9 19.8C4.4 19.8 0 15.4 0 9.9S4.4 0 9.9 0h11.6c5.5 0 9.9 4.4 9.9 9.9s-4.4 9.9-9.9 9.9H9.9m11.3-3.5c3.6 0 6.4-2.9 6.4-6.4 0-3.6-2.9-6.4-6.4-6.4h-11c-3.6 0-6.4 2.9-6.4 6.4s2.9 6.4 6.4 6.4h11" fill="#c74634"/></svg>
|
After Width: | Height: | Size: 287 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="svg-inline--fa fa-terminal fa-w-20 fa-2x" data-icon="terminal" data-prefix="fas" focusable="false" role="img" viewBox="0 0 640 512"><path fill="#ef4eff" stroke="none" stroke-width="1" d="M257.981 272.971L63.638 467.314c-9.373 9.373-24.569 9.373-33.941 0L7.029 444.647c-9.357-9.357-9.375-24.522-.04-33.901L161.011 256 6.99 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L257.981 239.03c9.373 9.372 9.373 24.568 0 33.941zM640 456v-32c0-13.255-10.745-24-24-24H312c-13.255 0-24 10.745-24 24v32c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24z"/></svg>
|
||||
<svg viewBox="0 0 120 90.001" xmlns="http://www.w3.org/2000/svg"><linearGradient id="1652546273" x1="95.267" x2="26.7" y1="91.926" y2="30.68" gradientTransform="translate(-4.002 -19)" gradientUnits="userSpaceOnUse"><stop stop-color="#A9C8FF" offset="0"/><stop stop-color="#C7E6FF" offset="1"/></linearGradient><path d="M5.03 90c-1.632 0-3.045-.638-3.977-1.798-.952-1.185-1.28-2.814-.896-4.47L18.143 5.821C18.897 2.557 22.06 0 25.347 0h89.623c1.634 0 3.047.638 3.978 1.798.952 1.184 1.279 2.814.896 4.47l-17.986 77.911c-.753 3.264-3.917 5.822-7.203 5.822H5.03z" clip-rule="evenodd" fill="url(#1652546273)" fill-rule="evenodd" opacity=".8"/><g transform="translate(-4.002 -19)"><linearGradient id="1652546298" x1="26.585" x2="93.585" y1="30.778" y2="90.278" gradientUnits="userSpaceOnUse"><stop stop-color="#2D4664" offset="0"/><stop stop-color="#29405B" offset=".169"/><stop stop-color="#1E2F43" offset=".445"/><stop stop-color="#0C131B" offset=".79"/><stop offset="1"/></linearGradient><path d="M118.5 20H29.634c-2.769 0-5.53 2.259-6.168 5.045l-17.834 77.91C4.995 105.742 6.722 108 9.491 108h88.865c2.769 0 5.53-2.258 6.168-5.045l17.834-77.911c.638-2.785-1.09-5.044-3.858-5.044z" clip-rule="evenodd" fill="url(#1652546298)" fill-rule="evenodd"/></g><g clip-rule="evenodd" fill-rule="evenodd"><path d="M60.163 68.558h21.613c2.513 0 4.55 2.125 4.55 4.746s-2.037 4.747-4.55 4.747H60.163c-2.513 0-4.55-2.125-4.55-4.747 0-2.621 2.037-4.746 4.55-4.746zM74.182 47.455c-.372.749-1.144 1.575-2.509 2.534L31.56 78.798c-2.19 1.591-5.334 1.001-7.021-1.319s-1.28-5.49.91-7.082l36.173-26.194v-.538L38.894 19.487c-1.854-1.972-1.661-5.161.431-7.124 2.092-1.962 5.29-1.954 7.144.018L73.74 41.393c1.548 1.647 1.663 4.141.442 6.062z" fill="#2c5591"/><path d="M73.182 46.455c-.372.749-1.144 1.575-2.509 2.534L30.56 77.798c-2.19 1.591-5.334 1.001-7.021-1.319s-1.28-5.49.91-7.082l36.173-26.194v-.538L37.894 18.487c-1.854-1.972-1.661-5.161.431-7.124 2.092-1.962 5.29-1.954 7.144.018L72.74 40.393c1.548 1.647 1.663 4.141.442 6.062zM59.548 68h21.613c2.513 0 4.55 2.015 4.55 4.5s-2.037 4.5-4.55 4.5H59.548c-2.513 0-4.55-2.015-4.55-4.5s2.037-4.5 4.55-4.5z" fill="#fff"/></g></svg>
|
Before Width: | Height: | Size: 664 B After Width: | Height: | Size: 2.1 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="svg-inline--fa fa-terminal fa-w-20 fa-2x" data-icon="terminal" data-prefix="fas" focusable="false" role="img" viewBox="0 0 640 512"><path fill="#0ff" stroke="none" stroke-width="1" d="M257.981 272.971L63.638 467.314c-9.373 9.373-24.569 9.373-33.941 0L7.029 444.647c-9.357-9.357-9.375-24.522-.04-33.901L161.011 256 6.99 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L257.981 239.03c9.373 9.372 9.373 24.568 0 33.941zM640 456v-32c0-13.255-10.745-24-24-24H312c-13.255 0-24 10.745-24 24v32c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24z"/></svg>
|
||||
<svg viewBox="0 0 118.99 90.001" xmlns="http://www.w3.org/2000/svg"><linearGradient id="1652546342" x1="95.123" x2="26.855" y1="91.805" y2="30.825" gradientTransform="translate(-4.503 -19)" gradientUnits="userSpaceOnUse"><stop stop-color="#5391FE" offset="0"/><stop stop-color="#3E6DBF" offset="1"/></linearGradient><path d="M4.988 90c-1.62 0-3.021-.638-3.944-1.798-.944-1.185-1.268-2.814-.89-4.47L17.99 5.821C18.736 2.557 21.873 0 25.13 0h88.866c1.62 0 3.02.638 3.945 1.798.944 1.184 1.268 2.814.889 4.47l-17.834 77.911c-.747 3.264-3.884 5.822-7.143 5.822H4.988z" clip-rule="evenodd" fill="url(#1652546342)" fill-rule="evenodd"/><linearGradient id="1652546328" x1="26.178" x2="93.748" y1="30.015" y2="90.738" gradientTransform="translate(-4.503 -19)" gradientUnits="userSpaceOnUse"><stop stop-color="#5391FE" offset="0"/><stop stop-color="#3E6DBF" offset="1"/></linearGradient><g clip-rule="evenodd" fill-rule="evenodd"><path d="M25.131 1h88.866c2.769 0 4.496 2.259 3.858 5.045l-17.834 77.911c-.638 2.786-3.399 5.045-6.168 5.045H4.988c-2.769 0-4.496-2.258-3.858-5.045L18.964 6.045C19.601 3.259 22.363 1 25.131 1z" fill="url(#1652546328)"/><path d="M59.662 68.558h21.613c2.513 0 4.55 2.125 4.55 4.746s-2.037 4.747-4.55 4.747H59.662c-2.513 0-4.55-2.125-4.55-4.747 0-2.621 2.037-4.746 4.55-4.746zM73.681 47.455c-.372.749-1.144 1.575-2.509 2.534L31.059 78.798c-2.19 1.591-5.334 1.001-7.021-1.319s-1.28-5.49.91-7.082l36.173-26.194v-.538L38.393 19.487c-1.854-1.972-1.661-5.161.431-7.124 2.092-1.962 5.29-1.954 7.144.018l27.271 29.012c1.548 1.647 1.663 4.141.442 6.062z" fill="#2c5591"/><path d="M72.681 46.455c-.372.749-1.144 1.575-2.509 2.534L30.059 77.798c-2.19 1.591-5.334 1.001-7.021-1.319s-1.28-5.49.91-7.082l36.173-26.194v-.538L37.393 18.487c-1.854-1.972-1.661-5.161.431-7.124 2.092-1.962 5.29-1.954 7.144.018l27.271 29.012c1.548 1.647 1.663 4.141.442 6.062zM59.047 68H80.66c2.513 0 4.55 2.015 4.55 4.5S83.173 77 80.66 77H59.047c-2.513 0-4.55-2.015-4.55-4.5s2.037-4.5 4.55-4.5z" fill="#fff"/></g></svg>
|
Before Width: | Height: | Size: 660 B After Width: | Height: | Size: 2.0 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 96 95.51"><defs><style>.a{fill:#fff;}.a,.h{fill-rule:evenodd;}.b{mask:url(#a);}.c{fill:#52218a;}.d{fill:#6c33af;}.e{fill:#854cc7;}.f{fill:#b179f1;}.g{opacity:0.25;}.h{fill:url(#b);}</style><mask id="a" x="0" y="0" width="96" height="95.51" maskUnits="userSpaceOnUse"><g transform="translate(0 -0.25)"><path class="a" d="M68.89,95.6a6,6,0,0,0,3.93-.44L92.6,85.65A6,6,0,0,0,96,80.24V15.76a6,6,0,0,0-3.4-5.41L72.82.84A6,6,0,0,0,68.34.55,6,6,0,0,0,66,2L34.12,37.26,15.5,22l-1.63-1.4a4,4,0,0,0-3.61-.83,2.55,2.55,0,0,0-.53.18L2.46,23A4,4,0,0,0,0,26.37c0,.1,0,.2,0,.3V69.33c0,.1,0,.2,0,.3A4,4,0,0,0,2.46,73l7.27,3a2.55,2.55,0,0,0,.53.18,4,4,0,0,0,3.61-.83L15.5,74,34.12,58.74,66,94A6,6,0,0,0,68.89,95.6ZM72,27.68,47.21,48,72,68.32ZM12,34.27,24.41,48,12,61.73Z"></path></g></mask><linearGradient id="b" x1="48" y1="97.75" x2="48" y2="2.25" gradientTransform="matrix(1, 0, 0, -1, 0, 98)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff"></stop><stop offset="1" stop-color="#fff" stop-opacity="0"></stop></linearGradient></defs><title>BrandVisualStudioWin2019</title><g class="b"><path class="c" d="M13.87,75.4a4,4,0,0,1-4.14.65L2.46,73A4,4,0,0,1,0,69.33V26.67A4,4,0,0,1,2.46,23l7.27-3a4,4,0,0,1,4.14.65L15.5,22A2.21,2.21,0,0,0,12,23.8V72.2A2.21,2.21,0,0,0,15.5,74Z" transform="translate(0 -0.25)"></path><path class="d" d="M2.46,73A4,4,0,0,1,0,69.33V69a2.31,2.31,0,0,0,4,1.55L66,2A6,6,0,0,1,72.82.84L92.6,10.36A6,6,0,0,1,96,15.77V16a3.79,3.79,0,0,0-6.19-2.93L15.5,74l-1.63,1.4a4,4,0,0,1-4.14.65Z" transform="translate(0 -0.25)"></path><path class="e" d="M2.46,23A4,4,0,0,0,0,26.67V27a2.31,2.31,0,0,1,4-1.55L66,94a6,6,0,0,0,6.82,1.16L92.6,85.64A6,6,0,0,0,96,80.23V80a3.79,3.79,0,0,1-6.19,2.93L15.5,22l-1.63-1.4A4,4,0,0,0,9.73,20Z" transform="translate(0 -0.25)"></path><path class="f" d="M72.82,95.16A6,6,0,0,1,66,94a3.52,3.52,0,0,0,6-2.49v-87A3.52,3.52,0,0,0,66,2,6,6,0,0,1,72.82.84L92.6,10.35A6,6,0,0,1,96,15.76V80.24a6,6,0,0,1-3.4,5.41Z" transform="translate(0 -0.25)"></path><g class="g"><path class="h" d="M68.89,95.6a6,6,0,0,0,3.93-.44L92.6,85.65A6,6,0,0,0,96,80.24V15.76a6,6,0,0,0-3.4-5.41L72.82.84A6,6,0,0,0,68.34.55,6,6,0,0,0,66,2L34.12,37.26,15.5,22l-1.63-1.4a4,4,0,0,0-3.61-.83,2.55,2.55,0,0,0-.53.18L2.46,23A4,4,0,0,0,0,26.37c0,.1,0,.2,0,.3V69.33c0,.1,0,.2,0,.3A4,4,0,0,0,2.46,73l7.27,3a2.55,2.55,0,0,0,.53.18,4,4,0,0,0,3.61-.83L15.5,74,34.12,58.74,66,94A6,6,0,0,0,68.89,95.6ZM72,27.68,47.21,48,72,68.32ZM12,34.27,24.41,48,12,61.73Z" transform="translate(0 -0.25)"></path></g></g></svg>
|
Before Width: | Height: | Size: 2.6 KiB |
1
tabby-local/src/icons/vs2017.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="57.04" height="57.04" color-interpolation-filters="sRGB" viewBox="0 0 42.78 42.78" xmlns="http://www.w3.org/2000/svg" fill="none" fill-rule="evenodd" font-size="12" overflow="visible" stroke-linecap="square" stroke-miterlimit="3"><g transform="translate(-1.5 -1.5)"><g transform="translate(1.5 -1.5)"><path d="M32.08 3v36.74L0 34.97l32.08 10.81 10.7-4.45V7.45zM11.02 23.58l9.83 9.72 5.88-2.5V11.74l-5.88-2.5-9.83 9.72-5.91-4.46-2.44.82v11.9l2.44.82zm9.83-7.41v10.2l-6.76-5.1zM5.11 17.73l3.58 3.54-3.58 3.54z" fill="#5c2d91"/></g></g></svg>
|
After Width: | Height: | Size: 551 B |
1
tabby-local/src/icons/vs2019.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 96 95.503" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="1652546395" x1="48" x2="48" y1="97.75" y2="2.25" gradientTransform="matrix(1 0 0 -1 0 98)" gradientUnits="userSpaceOnUse"><stop stop-color="#fff" offset="0"/><stop stop-color="#fff" stop-opacity="0" offset="1"/></linearGradient><mask id="1652546356" x="0" y="0" width="96" height="95.51" maskUnits="userSpaceOnUse"><path transform="translate(0 -.25)" d="M68.89 95.6a6 6 0 003.93-.44l19.78-9.51a6 6 0 003.4-5.41V15.76a6 6 0 00-3.4-5.41L72.82.84a6 6 0 00-4.48-.29A6 6 0 0066 2L34.12 37.26 15.5 22l-1.63-1.4a4 4 0 00-3.61-.83 2.55 2.55 0 00-.53.18L2.46 23A4 4 0 000 26.37v43.26A4 4 0 002.46 73l7.27 3a2.55 2.55 0 00.53.18 4 4 0 003.61-.83L15.5 74l18.62-15.26L66 94a6 6 0 002.89 1.6zM72 27.68L47.21 48 72 68.32zm-60 6.59L24.41 48 12 61.73z" fill="#fff" fill-rule="evenodd"/></mask></defs><g transform="translate(0 .002)" mask="url(#1652546356)"><path d="M13.87 75.15a4 4 0 01-4.14.65l-7.27-3.05A4 4 0 010 69.08V26.42a4 4 0 012.46-3.67l7.27-3a4 4 0 014.14.65l1.63 1.35a2.21 2.21 0 00-3.5 1.8v48.4a2.21 2.21 0 003.5 1.8z" fill="#52218a"/><path d="M2.46 72.75A4 4 0 010 69.08v-.33a2.31 2.31 0 004 1.55L66 1.75A6 6 0 0172.82.59l19.78 9.52a6 6 0 013.4 5.41v.23a3.79 3.79 0 00-6.19-2.93L15.5 73.75l-1.63 1.4a4 4 0 01-4.14.65z" fill="#6c33af"/><path d="M2.46 22.75A4 4 0 000 26.42v.33a2.31 2.31 0 014-1.55l62 68.55a6 6 0 006.82 1.16l19.78-9.52a6 6 0 003.4-5.41v-.23a3.79 3.79 0 01-6.19 2.93L15.5 21.75l-1.63-1.4a4 4 0 00-4.14-.6z" fill="#854cc7"/><path d="M72.82 94.91A6 6 0 0166 93.75a3.52 3.52 0 006-2.49v-87a3.52 3.52 0 00-6-2.51A6 6 0 0172.82.59L92.6 10.1a6 6 0 013.4 5.41v64.48a6 6 0 01-3.4 5.41z" fill="#b179f1"/><path transform="translate(0 -.25)" d="M68.89 95.6a6 6 0 003.93-.44l19.78-9.51a6 6 0 003.4-5.41V15.76a6 6 0 00-3.4-5.41L72.82.84a6 6 0 00-4.48-.29A6 6 0 0066 2L34.12 37.26 15.5 22l-1.63-1.4a4 4 0 00-3.61-.83 2.55 2.55 0 00-.53.18L2.46 23A4 4 0 000 26.37v43.26A4 4 0 002.46 73l7.27 3a2.55 2.55 0 00.53.18 4 4 0 003.61-.83L15.5 74l18.62-15.26L66 94a6 6 0 002.89 1.6zM72 27.68L47.21 48 72 68.32zm-60 6.59L24.41 48 12 61.73z" fill="url(#1652546395)" fill-rule="evenodd" opacity=".25"/></g></svg>
|
After Width: | Height: | Size: 2.1 KiB |
1
tabby-local/src/icons/vs2022.svg
Normal file
After Width: | Height: | Size: 5.8 KiB |
@@ -1,6 +1,7 @@
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
|
||||
import deepClone from 'clone-deep'
|
||||
import { Injectable, Inject } from '@angular/core'
|
||||
import { ProfileProvider, NewTabParameters, ConfigService, SplitTabComponent, AppService, PartialProfile, TranslateService } from 'tabby-core'
|
||||
import { ProfileProvider, NewTabParameters, ConfigService, SplitTabComponent, AppService, PartialProfile } from 'tabby-core'
|
||||
import { TerminalTabComponent } from './components/terminalTab.component'
|
||||
import { LocalProfileSettingsComponent } from './components/localProfileSettings.component'
|
||||
import { ShellProvider, Shell, SessionOptions, LocalProfile } from './api'
|
||||
@@ -8,7 +9,7 @@ import { ShellProvider, Shell, SessionOptions, LocalProfile } from './api'
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class LocalProfilesService extends ProfileProvider<LocalProfile> {
|
||||
id = 'local'
|
||||
name = this.translate.instant('Local terminal')
|
||||
name = _('Local terminal')
|
||||
settingsComponent = LocalProfileSettingsComponent
|
||||
configDefaults = {
|
||||
options: {
|
||||
@@ -29,7 +30,6 @@ export class LocalProfilesService extends ProfileProvider<LocalProfile> {
|
||||
constructor (
|
||||
private app: AppService,
|
||||
private config: ConfigService,
|
||||
private translate: TranslateService,
|
||||
@Inject(ShellProvider) private shellProviders: ShellProvider[],
|
||||
) {
|
||||
super()
|
||||
|
@@ -51,12 +51,18 @@ export class DockMenuService {
|
||||
}
|
||||
if (this.hostApp.platform === Platform.macOS) {
|
||||
this.electron.app.dock.setMenu(this.electron.Menu.buildFromTemplate(
|
||||
[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({
|
||||
label: profile.name,
|
||||
click: () => this.zone.run(async () => {
|
||||
this.profilesService.openNewTabForProfile(profile)
|
||||
}),
|
||||
})),
|
||||
[
|
||||
...[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({
|
||||
label: profile.name,
|
||||
click: () => this.zone.run(async () => {
|
||||
this.profilesService.openNewTabForProfile(profile)
|
||||
}),
|
||||
})),
|
||||
{
|
||||
label: this.translate.instant('New Window'),
|
||||
click: () => this.zone.run(() => this.hostApp.newWindow()),
|
||||
},
|
||||
],
|
||||
))
|
||||
}
|
||||
}
|
||||
|
@@ -47,7 +47,8 @@ export class TerminalService {
|
||||
this.logger.info(`Starting profile ${fullProfile.name}`, fullProfile)
|
||||
const options = {
|
||||
...fullProfile.options,
|
||||
pauseAfterExit: pause,
|
||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
||||
pauseAfterExit: fullProfile.options.pauseAfterExit || pause,
|
||||
cwd: cwd ?? undefined,
|
||||
}
|
||||
|
||||
|
@@ -36,7 +36,7 @@ export class GitBashShellProvider extends ShellProvider {
|
||||
|
||||
return [{
|
||||
id: 'git-bash',
|
||||
name: 'Git-Bash',
|
||||
name: 'Git Bash',
|
||||
command: path.join(gitBashPath, 'bin', 'bash.exe'),
|
||||
args: ['--login', '-i'],
|
||||
icon: require('../icons/git-bash.svg'),
|
||||
|
@@ -5,6 +5,14 @@ import { HostAppService, Platform } from 'tabby-core'
|
||||
|
||||
import { ShellProvider, Shell } from '../api'
|
||||
|
||||
/* eslint-disable quote-props */
|
||||
const vsIconMap: Record<string, string> = {
|
||||
'2017': require('../icons/vs2017.svg'),
|
||||
'2019': require('../icons/vs2019.svg'),
|
||||
'2022': require('../icons/vs2022.svg'),
|
||||
}
|
||||
/* eslint-enable quote-props */
|
||||
|
||||
/** @hidden */
|
||||
@Injectable()
|
||||
export class VSDevToolsProvider extends ShellProvider {
|
||||
@@ -19,30 +27,32 @@ export class VSDevToolsProvider extends ShellProvider {
|
||||
return []
|
||||
}
|
||||
|
||||
const parentPath = path.join(process.env['programfiles(x86)'] ?? 'C:\\Program Files (x86', 'Microsoft Visual Studio')
|
||||
|
||||
try {
|
||||
await fs.stat(parentPath)
|
||||
} catch {
|
||||
return []
|
||||
}
|
||||
const x86ParentPath = path.join(process.env['programfiles(x86)'] ?? 'C:\\Program Files (x86)', 'Microsoft Visual Studio')
|
||||
const x64ParentPath = path.join(process.env['programfiles'] ?? 'C:\\Program Files', 'Microsoft Visual Studio')
|
||||
|
||||
const result: Shell[] = []
|
||||
for (const version of await fs.readdir(parentPath)) {
|
||||
const bat = path.join(parentPath, version, 'Community\\Common7\\Tools\\VsDevCmd.bat')
|
||||
for (const parentPath of [x86ParentPath, x64ParentPath]) {
|
||||
try {
|
||||
await fs.stat(bat)
|
||||
} catch {
|
||||
continue
|
||||
await fs.stat(parentPath)
|
||||
for (const version of await fs.readdir(parentPath)) {
|
||||
const bat = path.join(parentPath, version, 'Community\\Common7\\Tools\\VsDevCmd.bat')
|
||||
try {
|
||||
await fs.stat(bat)
|
||||
} catch {
|
||||
continue
|
||||
}
|
||||
result.push({
|
||||
id: `vs-cmd-${version}`,
|
||||
name: `Developer Prompt for VS ${version}`,
|
||||
command: 'cmd.exe',
|
||||
args: ['/k', bat],
|
||||
icon: vsIconMap[version],
|
||||
env: {},
|
||||
})
|
||||
}
|
||||
} catch (_) {
|
||||
// Ignore
|
||||
}
|
||||
result.push({
|
||||
id: `vs-cmd-${version}`,
|
||||
name: `Developer Prompt for VS ${version}`,
|
||||
command: 'cmd.exe',
|
||||
args: ['/k', bat],
|
||||
icon: require('../icons/vs.svg'),
|
||||
env: {},
|
||||
})
|
||||
}
|
||||
return result
|
||||
|
||||
|
@@ -18,13 +18,20 @@ try {
|
||||
const wslIconMap: Record<string, string> = {
|
||||
'Alpine': require('../icons/alpine.svg'),
|
||||
'Debian': require('../icons/debian.svg'),
|
||||
'kali-linux': require('../icons/linux.svg'),
|
||||
'kali-linux': require('../icons/kali.svg'),
|
||||
'SLES-12': require('../icons/suse.svg'),
|
||||
'openSUSE-Leap-15-1': require('../icons/suse.svg'),
|
||||
'Ubuntu-16.04': require('../icons/ubuntu.svg'),
|
||||
'Ubuntu-18.04': require('../icons/ubuntu.svg'),
|
||||
'Ubuntu-22.04': require('../icons/ubuntu.svg'),
|
||||
'Ubuntu': require('../icons/ubuntu.svg'),
|
||||
'AlmaLinux-8': require('../icons/alma.svg'),
|
||||
'OracleLinux_7_9': require('../icons/oracle-linux.svg'),
|
||||
'OracleLinux_8_5': require('../icons/oracle-linux.svg'),
|
||||
'openEuler': require('../icons/open-euler.svg'),
|
||||
'Linux': require('../icons/linux.svg'),
|
||||
'docker-desktop': require('../icons/docker.svg'),
|
||||
'docker-desktop-data': require('../icons/docker.svg'),
|
||||
}
|
||||
/* eslint-enable quote-props */
|
||||
|
||||
@@ -60,7 +67,8 @@ export class WSLShellProvider extends ShellProvider {
|
||||
TERM: 'xterm-color',
|
||||
COLORTERM: 'truecolor',
|
||||
},
|
||||
icon: wslIconMap[defaultDistKey.DistributionName.value],
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
icon: wslIconMap[defaultDistKey.DistributionName.value] ?? wslIconMap.Linux,
|
||||
}
|
||||
shells.push(shell)
|
||||
}
|
||||
@@ -101,7 +109,8 @@ export class WSLShellProvider extends ShellProvider {
|
||||
TERM: 'xterm-color',
|
||||
COLORTERM: 'truecolor',
|
||||
},
|
||||
icon: wslIconMap[name],
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
icon: wslIconMap[name] ?? wslIconMap.Linux,
|
||||
}
|
||||
shells.push(shell)
|
||||
}
|
||||
|
@@ -47,13 +47,9 @@ export class PluginManagerService {
|
||||
|
||||
_listAvailableInternal (namePrefix: string, keyword: string, query?: string): Observable<PluginInfo[]> {
|
||||
return from(
|
||||
axios.get(`https://www.npmjs.com/search?q=keywords%3A${keyword}+${encodeURIComponent(query ?? '')}&from=0&size=1000`, {
|
||||
headers: {
|
||||
'x-spiferack': '1',
|
||||
},
|
||||
})
|
||||
axios.get(`https://api.npms.io/v2/search?q=keywords%3A${keyword}+${encodeURIComponent(query ?? '')}&size=250`)
|
||||
).pipe(
|
||||
map(response => response.data.objects
|
||||
map(response => response.data.results
|
||||
.filter(item => !item.keywords?.includes('tabby-dummy-transition-plugin'))
|
||||
.map(item => ({
|
||||
name: item.package.name.substring(namePrefix.length),
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
|
||||
import slugify from 'slugify'
|
||||
import deepClone from 'clone-deep'
|
||||
import { Injectable } from '@angular/core'
|
||||
@@ -10,7 +11,7 @@ import { BAUD_RATES, SerialProfile } from './api'
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class SerialProfilesService extends ProfileProvider<SerialProfile> {
|
||||
id = 'serial'
|
||||
name = this.translate.instant('Serial')
|
||||
name = _('Serial')
|
||||
settingsComponent = SerialProfileSettingsComponent
|
||||
configDefaults = {
|
||||
options: {
|
||||
|
@@ -24,7 +24,7 @@ export class EditProfileModalComponent<P extends Profile> {
|
||||
@ViewChild('placeholder', { read: ViewContainerRef }) placeholder: ViewContainerRef
|
||||
|
||||
private _profile: Profile
|
||||
private settingsComponentInstance: ProfileSettingsComponent<P>
|
||||
private settingsComponentInstance?: ProfileSettingsComponent<P>
|
||||
|
||||
constructor (
|
||||
private injector: Injector,
|
||||
@@ -87,7 +87,7 @@ export class EditProfileModalComponent<P extends Profile> {
|
||||
|
||||
save () {
|
||||
this.profile.group ||= undefined
|
||||
this.settingsComponentInstance.save?.()
|
||||
this.settingsComponentInstance?.save?.()
|
||||
this.profile.__cleanup()
|
||||
this.modalInstance.close(this._profile)
|
||||
}
|
||||
|
@@ -3,7 +3,11 @@
|
||||
|
||||
.modal-body
|
||||
.input
|
||||
.stroke(*ngFor='let stroke of value', [@animateKey]='true') {{stroke}}
|
||||
.stroke(
|
||||
*ngFor='let stroke of value',
|
||||
[@animateKey]='true',
|
||||
[@.disabled]='!config.store.accessibility.animations'
|
||||
) {{stroke}}
|
||||
|
||||
.timeout
|
||||
div([style.width]='timeoutProgress + "%"')
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { Component, Input } from '@angular/core'
|
||||
import { trigger, transition, style, animate } from '@angular/animations'
|
||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { HotkeysService, BaseComponent, Keystroke } from 'tabby-core'
|
||||
import { HotkeysService, BaseComponent, Keystroke, ConfigService } from 'tabby-core'
|
||||
|
||||
const INPUT_TIMEOUT = 1000
|
||||
|
||||
@@ -45,6 +45,7 @@ export class HotkeyInputModalComponent extends BaseComponent {
|
||||
constructor (
|
||||
private modalInstance: NgbActiveModal,
|
||||
public hotkeys: HotkeysService,
|
||||
public config: ConfigService,
|
||||
) {
|
||||
super()
|
||||
this.hotkeys.clearCurrentKeystrokes()
|
||||
|
@@ -26,7 +26,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
||||
.input-group-prepend
|
||||
.input-group-text
|
||||
i.fas.fa-fw.fa-search
|
||||
input.form-control(type='search', placeholder='Filter', [(ngModel)]='filter')
|
||||
input.form-control(type='search', [placeholder]='"Filter"|translate', [(ngModel)]='filter')
|
||||
|
||||
button.btn.btn-primary.flex-shrink-0.ml-3((click)='newProfile()')
|
||||
i.fas.fa-fw.fa-plus
|
||||
@@ -117,6 +117,6 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
||||
a.list-group-item.list-group-item-action(
|
||||
(click)='editDefaults(provider)',
|
||||
*ngFor='let provider of profileProviders'
|
||||
) {{provider.name}}
|
||||
) {{provider.name|translate}}
|
||||
|
||||
div([ngbNavOutlet]='nav')
|
||||
|
@@ -14,6 +14,7 @@ interface ProfileGroup {
|
||||
collapsed: boolean
|
||||
}
|
||||
|
||||
_('Filter')
|
||||
_('Ungrouped')
|
||||
|
||||
/** @hidden */
|
||||
@@ -78,7 +79,11 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
||||
}
|
||||
profile.isBuiltin = false
|
||||
profile.isTemplate = false
|
||||
await this.showProfileEditModal(profile)
|
||||
const result = await this.showProfileEditModal(profile)
|
||||
if (!result) {
|
||||
return
|
||||
}
|
||||
Object.assign(profile, result)
|
||||
if (!profile.name) {
|
||||
const cfgProxy = this.profilesService.getConfigProxyForProfile(profile)
|
||||
profile.name = this.profilesService.providerForProfile(profile)?.getSuggestedName(cfgProxy) ?? this.translate.instant('{name} copy', base)
|
||||
@@ -89,11 +94,15 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
||||
}
|
||||
|
||||
async editProfile (profile: PartialProfile<Profile>): Promise<void> {
|
||||
await this.showProfileEditModal(profile)
|
||||
const result = await this.showProfileEditModal(profile)
|
||||
if (!result) {
|
||||
return
|
||||
}
|
||||
Object.assign(profile, result)
|
||||
await this.config.save()
|
||||
}
|
||||
|
||||
async showProfileEditModal (profile: PartialProfile<Profile>): Promise<void> {
|
||||
async showProfileEditModal (profile: PartialProfile<Profile>): Promise<PartialProfile<Profile>|null> {
|
||||
const modal = this.ngbModal.open(
|
||||
EditProfileModalComponent,
|
||||
{ size: 'lg' },
|
||||
@@ -107,7 +116,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
||||
|
||||
const result = await modal.result.catch(() => null)
|
||||
if (!result) {
|
||||
return
|
||||
return null
|
||||
}
|
||||
|
||||
// Fully replace the config
|
||||
@@ -115,9 +124,9 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
||||
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||
delete profile[k]
|
||||
}
|
||||
Object.assign(profile, result)
|
||||
|
||||
profile.type = provider.id
|
||||
result.type = provider.id
|
||||
return result
|
||||
}
|
||||
|
||||
async deleteProfile (profile: PartialProfile<Profile>): Promise<void> {
|
||||
@@ -234,10 +243,10 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
||||
|
||||
getTypeLabel (profile: PartialProfile<Profile>): string {
|
||||
const name = this.profilesService.providerForProfile(profile)?.name
|
||||
if (name === this.translate.instant('Local terminal')) {
|
||||
if (name === 'Local terminal') {
|
||||
return ''
|
||||
}
|
||||
return name ?? this.translate.instant('Unknown')
|
||||
return name ? this.translate.instant(name) : this.translate.instant('Unknown')
|
||||
}
|
||||
|
||||
getTypeColorClass (profile: PartialProfile<Profile>): string {
|
||||
|
@@ -69,6 +69,9 @@
|
||||
.form-line
|
||||
.header
|
||||
.title(translate) Language
|
||||
a.description((click)='homeBase.openTranslations()')
|
||||
span(translate) Help translate Tabby
|
||||
i.fas.fa-external-link-square-alt.ml-1
|
||||
select.form-control([(ngModel)]='config.store.language', (ngModelChange)='saveConfiguration(true)')
|
||||
option([ngValue]='null', translate) Automatic
|
||||
option(
|
||||
@@ -105,6 +108,12 @@
|
||||
i.fas.fa-bug
|
||||
span(translate) Open DevTools
|
||||
|
||||
h3(translate) Accessibility
|
||||
.form-line
|
||||
.header
|
||||
.title(translate) Enable animations
|
||||
toggle([(ngModel)]='config.store.accessibility.animations', (ngModelChange)='saveConfiguration()')
|
||||
|
||||
ng-container(*ngFor='let provider of settingsProviders')
|
||||
li(*ngIf='provider.prioritized', [ngbNavItem]='provider.id')
|
||||
a.d-flex.align-items-center(ngbNavLink)
|
||||
|
@@ -304,6 +304,30 @@ h3.mt-4(translate) Tabs
|
||||
(ngModelChange)='config.save();',
|
||||
)
|
||||
|
||||
h3.mt-4(translate) Panes
|
||||
|
||||
.form-line()
|
||||
.header
|
||||
.title(translate) Pane resize step
|
||||
.description(translate) For keyboard shortcuts
|
||||
input(
|
||||
type='range',
|
||||
[(ngModel)]='config.store.terminal.paneResizeStep',
|
||||
(ngModelChange)='saveConfiguration();',
|
||||
min='0.1',
|
||||
max='0.9',
|
||||
step='0.05'
|
||||
)
|
||||
|
||||
.form-line()
|
||||
.header
|
||||
.title(translate) Focus follows mouse
|
||||
.description(translate) Moving the mouse over an inactive pane will cause it to activate
|
||||
toggle(
|
||||
[(ngModel)]='config.store.terminal.focusFollowsMouse',
|
||||
(ngModelChange)='config.save(); config.requestRestart()'
|
||||
)
|
||||
|
||||
h3.mt-4(translate) Hacks
|
||||
|
||||
.form-line
|
||||
|
@@ -17,6 +17,16 @@
|
||||
button.btn.btn-link.btn-close((click)='close()') !{require('../../../tabby-core/src/icons/times.svg')}
|
||||
|
||||
.body(dropZone, (transfer)='uploadOne($event)')
|
||||
a.alert.alert-info.d-flex.align-items-center(
|
||||
*ngIf='shouldShowCWDTip && !cwdDetectionAvailable',
|
||||
(click)='platform.openExternal("https://tabby.sh/go/cwd-detection")'
|
||||
)
|
||||
.mr-auto
|
||||
strong(translate) Working directory detection
|
||||
div(translate) Learn how to allow Tabby to detect remote shell's working directory.
|
||||
button.close((click)='dismissCWDTip()')
|
||||
i.fas.fa-close
|
||||
|
||||
div(*ngIf='!sftp', translate) Connecting
|
||||
div(*ngIf='sftp')
|
||||
div(*ngIf='fileList === null', translate) Loading
|
||||
|
@@ -26,11 +26,12 @@ export class SFTPPanelComponent {
|
||||
@Input() path = '/'
|
||||
@Output() pathChange = new EventEmitter<string>()
|
||||
pathSegments: PathSegment[] = []
|
||||
@Input() cwdDetectionAvailable = false
|
||||
|
||||
constructor (
|
||||
private ngbModal: NgbModal,
|
||||
private platform: PlatformService,
|
||||
private notifications: NotificationsService,
|
||||
public platform: PlatformService,
|
||||
@Optional() @Inject(SFTPContextMenuItemProvider) protected contextMenuProviders: SFTPContextMenuItemProvider[],
|
||||
) {
|
||||
this.contextMenuProviders.sort((a, b) => a.weight - b.weight)
|
||||
@@ -173,6 +174,14 @@ export class SFTPPanelComponent {
|
||||
this.platform.popupContextMenu(await this.buildContextMenu(item), event)
|
||||
}
|
||||
|
||||
get shouldShowCWDTip (): boolean {
|
||||
return !window.localStorage.sshCWDTipDismissed
|
||||
}
|
||||
|
||||
dismissCWDTip (): void {
|
||||
window.localStorage.sshCWDTipDismissed = 'true'
|
||||
}
|
||||
|
||||
close (): void {
|
||||
this.closed.emit()
|
||||
}
|
||||
|
@@ -36,10 +36,12 @@ terminal-toolbar([tab]='this')
|
||||
|
||||
sftp-panel.bg-dark(
|
||||
@panelSlide,
|
||||
[@.disabled]='!config.store.accessibility.animations',
|
||||
[(path)]='sftpPath',
|
||||
*ngIf='sftpPanelVisible',
|
||||
(click)='$event.stopPropagation()',
|
||||
[session]='sshSession',
|
||||
[cwdDetectionAvailable]='session?.supportsWorkingDirectory()',
|
||||
(closed)='sftpPanelVisible = false'
|
||||
)
|
||||
|
||||
|
@@ -200,7 +200,7 @@ export class SSHTabComponent extends BaseTerminalTabComponent {
|
||||
return
|
||||
}
|
||||
|
||||
const session = new SSHShellSession(this.injector, this.sshSession)
|
||||
const session = new SSHShellSession(this.injector, this.sshSession, this.profile)
|
||||
this.setSession(session)
|
||||
this.attachSessionHandler(session.serviceMessage$, msg => {
|
||||
msg = msg.replace(/\n/g, '\r\n ')
|
||||
|
@@ -141,4 +141,15 @@ export class SSHProfilesService extends ProfileProvider<SSHProfile> {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
intoQuickConnectString (profile: SSHProfile): string|null {
|
||||
let s = profile.options.host
|
||||
if (profile.options.user !== 'root') {
|
||||
s = `${profile.options.user}@${s}`
|
||||
}
|
||||
if (profile.options.port !== 22) {
|
||||
s = `${s}:${profile.options.port}`
|
||||
}
|
||||
return s
|
||||
}
|
||||
}
|
||||
|
@@ -117,6 +117,7 @@ export class SocksProxyStream extends SSHProxyStream {
|
||||
proxyHost: this.profile.options.socksProxyHost ?? '127.0.0.1',
|
||||
proxyPort: this.profile.options.socksProxyPort ?? 5000,
|
||||
auths: [socksv5.auth.None()],
|
||||
strictLocalDNS: false,
|
||||
}, s => {
|
||||
resolve(s)
|
||||
this.header = s.read()
|
||||
|
@@ -11,7 +11,6 @@ import { SSHProfile } from '../api'
|
||||
|
||||
export class SSHShellSession extends BaseSession {
|
||||
shell?: ClientChannel
|
||||
private profile: SSHProfile
|
||||
get serviceMessage$ (): Observable<string> { return this.serviceMessage }
|
||||
private serviceMessage = new Subject<string>()
|
||||
private ssh: SSHSession|null
|
||||
@@ -19,10 +18,10 @@ export class SSHShellSession extends BaseSession {
|
||||
constructor (
|
||||
injector: Injector,
|
||||
ssh: SSHSession,
|
||||
private profile: SSHProfile,
|
||||
) {
|
||||
super(injector.get(LogService).create(`ssh-shell-${ssh.profile.options.host}-${ssh.profile.options.port}`))
|
||||
super(injector.get(LogService).create(`ssh-shell-${profile.options.host}-${profile.options.port}`))
|
||||
this.ssh = ssh
|
||||
this.profile = ssh.profile
|
||||
this.setLoginScriptsOptions(this.profile.options)
|
||||
this.ssh.serviceMessage$.subscribe(m => this.serviceMessage.next(m))
|
||||
}
|
||||
|