Compare commits

..

9 Commits

Author SHA1 Message Date
allcontributors[bot]
008cae9710 update README.pt-BR.md [skip ci] 2024-07-10 08:52:38 +00:00
allcontributors[bot]
d38a900553 update README.id-ID.md [skip ci] 2024-07-10 08:51:34 +00:00
allcontributors[bot]
964cd482b2 update .all-contributorsrc [skip ci] 2024-07-10 08:51:30 +00:00
allcontributors[bot]
c127a00016 update README.de-DE.md [skip ci] 2024-07-10 08:50:54 +00:00
allcontributors[bot]
e857da28ac update README.it-IT.md [skip ci] 2024-07-10 08:50:53 +00:00
allcontributors[bot]
06b625cb6f update README.ko-KR.md [skip ci] 2024-07-10 08:50:52 +00:00
allcontributors[bot]
8e8cf6a500 update README.ru-RU.md [skip ci] 2024-07-10 08:50:51 +00:00
allcontributors[bot]
4930d0fac6 update README.zh-CN.md [skip ci] 2024-07-10 08:50:50 +00:00
allcontributors[bot]
ba31e14fa4 update README.md [skip ci] 2024-07-10 08:50:49 +00:00
145 changed files with 4030 additions and 3690 deletions

View File

@@ -1310,51 +1310,6 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "fireblue",
"name": "fireblue",
"avatar_url": "https://avatars.githubusercontent.com/u/1034929?v=4",
"profile": "https://github.com/fireblue",
"contributions": [
"code"
]
},
{
"login": "marko1616",
"name": "marko1616",
"avatar_url": "https://avatars.githubusercontent.com/u/45327989?v=4",
"profile": "https://github.com/marko1616",
"contributions": [
"code"
]
},
{
"login": "SelfHosted-Club",
"name": "SelfHosted",
"avatar_url": "https://avatars.githubusercontent.com/u/128927132?v=4",
"profile": "https://www.selfhosted.sg/",
"contributions": [
"financial"
]
},
{
"login": "xhiroga",
"name": "Hiroaki Ogasawara",
"avatar_url": "https://avatars.githubusercontent.com/u/13391129?v=4",
"profile": "http://hiroga.hatenablog.com/",
"contributions": [
"code"
]
},
{
"login": "geodic",
"name": "geodic",
"avatar_url": "https://avatars.githubusercontent.com/u/64704703?v=4",
"profile": "https://github.com/geodic",
"contributions": [
"code"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -2,23 +2,22 @@ name: Package-Build
on: [push, pull_request] on: [push, pull_request]
jobs: jobs:
Lint: Lint:
runs-on: ubuntu-24.04 runs-on: ubuntu-20.04
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v3.7.0
with: with:
node-version: 22 node-version: 16
- name: Install deps - name: Install deps
run: | run: |
sudo apt-get update && sudo apt-get install -y libfontconfig1-dev npm i -g yarn@1.19.1
npm i -g yarn
cd app cd app
yarn yarn
cd .. cd ..
@@ -32,40 +31,41 @@ jobs:
run: yarn run lint run: yarn run lint
macOS-Build: macOS-Build:
runs-on: macos-15 runs-on: macos-12
needs: Lint needs: Lint
strategy: strategy:
matrix: matrix:
include: include:
- arch: x86_64 - arch: x86_64
rust_triple: x86_64-apple-darwin
- arch: arm64 - arch: arm64
rust_triple: aarch64-apple-darwin
fail-fast: false fail-fast: false
env:
ARCH: ${{matrix.arch}}
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v3.7.0
with: with:
node-version: 22 node-version: 16
- run: rustup target add ${{matrix.rust_triple}}
- name: Install deps - name: Install deps
run: | run: |
sudo -H pip3 install setuptools
npm config set python python3
sudo npm i -g yarn@1.22.1
yarn --network-timeout 1000000 yarn --network-timeout 1000000
env: env:
ARCH: ${{matrix.arch}} ARCH: ${{matrix.arch}}
- name: Fix cross build
run: |
rm -rf app/node_modules/cpu-features
rm -rf app/node_modules/ssh2/crypto/build
if: matrix.arch == 'arm64'
- name: Webpack - name: Webpack
run: yarn run build run: yarn run build
@@ -81,7 +81,7 @@ jobs:
- name: Build and sign packages - name: Build and sign packages
run: scripts/build-macos.mjs run: scripts/build-macos.mjs
if: github.event_name == 'push' && (github.ref_protected || startsWith(github.ref, 'refs/tags')) if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
env: env:
ARCH: ${{matrix.arch}} ARCH: ${{matrix.arch}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -96,7 +96,7 @@ jobs:
- name: Build packages without signing - name: Build packages without signing
run: scripts/build-macos.mjs run: scripts/build-macos.mjs
if: "! (github.event_name == 'push' && (github.ref_protected || startsWith(github.ref, 'refs/tags')))" if: "! (github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
env: env:
ARCH: ${{matrix.arch}} ARCH: ${{matrix.arch}}
# DEBUG: electron-builder,electron-builder:* # DEBUG: electron-builder,electron-builder:*
@@ -130,95 +130,83 @@ jobs:
path: artifact-zip path: artifact-zip
Linux-Build: Linux-Build:
runs-on: ${{matrix.os}} runs-on: ubuntu-20.04
needs: Lint needs: Lint
strategy: strategy:
matrix: matrix:
include: include:
- build-arch: x64 - build-arch: x64
arch: amd64 arch: amd64
rust_triple: x86_64-unknown-linux-gnu
os: ubuntu-24.04
- build-arch: arm64 - build-arch: arm64
arch: arm64 arch: arm64
rust_triple: aarch64-unknown-linux-gnu
triplet: aarch64-linux-gnu- triplet: aarch64-linux-gnu-
os: ubuntu-24.04-arm
- build-arch: arm - build-arch: arm
arch: armhf arch: armhf
rust_triple: arm-unknown-linux-gnueabihf
triplet: arm-linux-gnueabihf- triplet: arm-linux-gnueabihf-
os: ubuntu-24.04
fail-fast: false
env: env:
CC: ${{matrix.triplet}}gcc CC: ${{matrix.triplet}}gcc
CXX: ${{matrix.triplet}}g++ CXX: ${{matrix.triplet}}g++
ARCH: ${{matrix.build-arch}} ARCH: ${{matrix.build-arch}}
npm_config_arch: ${{matrix.build-arch}} npm_config_arch: ${{matrix.build-arch}}
npm_config_target_arch: ${{matrix.build-arch}} npm_config_target_arch: ${{matrix.build-arch}}
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Install Node - name: Install Node
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v3.7.0
with: with:
node-version: 22 node-version: 18
- name: Install FPM - name: Install deps (amd64)
run: |
sudo gem install fpm
- run: rustup target add ${{matrix.rust_triple}}
- name: Install dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install libfontconfig1-dev libarchive-tools zsh crossbuild-essential-${{matrix.arch}} sudo apt-get install libarchive-tools zsh python3-distutils
- name: Setup tar to run as root - name: Install npm_modules (amd64)
run: sudo chmod u+s "$(command -v tar)"
if: matrix.build-arch == 'arm'
- name: Download cached sysroot
uses: actions/cache@v3
id: dl-cached-sysroot
if: matrix.build-arch == 'arm'
with:
key: sysroot-${{matrix.build-arch}}
path: /${{matrix.build-arch}}-sysroot
- name: Setup crossbuild sysroot
run: | run: |
sudo apt-get update -y && sudo apt-get install debootstrap qemu-user-static binfmt-support -y npm i -g yarn
sudo qemu-debootstrap --include=libfontconfig1-dev,libsecret-1-dev,libnss3,libatk1.0-0,libatk-bridge2.0-0,libgdk-pixbuf2.0-0,libgtk-3-0,libgbm1 --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb --arch ${{matrix.arch}} bionic /${{matrix.build-arch}}-sysroot/ http://ports.ubuntu.com/ubuntu-ports/ yarn --network-timeout 1000000
sudo find /${{matrix.build-arch}}-sysroot -type l -lname '/*' -exec sh -c 'file="$0"; dir=$(dirname "$file"); target=$(readlink "$0"); prefix=$(dirname "$dir" | sed 's@[^/]*@\.\.@g'); newtarget="$prefix$target"; ln -snf $newtarget $file' {} \; ; if: matrix.build-arch == 'x64'
if: matrix.build-arch == 'arm' && steps.dl-cached-sysroot.outputs.cache-hit != 'true'
- name: Setup env to use ${{matrix.build-arch}} sysroot - name: Setup Crossbuild (${{matrix.arch}})
run: | run: |
echo "CFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV sudo apt-get update -y && sudo apt-get install schroot sbuild debootstrap -y
echo "CXXFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV sudo debootstrap --include=git,curl,gnupg,ca-certificates,crossbuild-essential-${{matrix.arch}},python-dev,python3-dev,libarchive-tools,cmake --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb bionic /build-chroot/
echo "LDFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV echo 'deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse' | sudo tee /build-chroot/etc/apt/sources.list >/dev/null
echo 'deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse' | sudo tee -a /build-chroot/etc/apt/sources.list >/dev/null
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /build-chroot/etc/apt/trusted.gpg.d/nodesource.gpg >/dev/null
echo 'deb http://deb.nodesource.com/node_16.x bionic main' | sudo tee /build-chroot/etc/apt/sources.list.d/nodesource.list >/dev/null
echo "[build-chroot]
description=Ubuntu 18.04 Build chroot
type=directory
directory=/build-chroot
root-groups=root,sudo
profile=buildd
personality=linux
union-type=overlay" | sudo tee /etc/schroot/chroot.d/build-chroot.pref >/dev/null
echo "/home /home none rw,bind 0 0" | sudo tee -a /etc/schroot/buildd/fstab >/dev/null
[[ ${npm_config_arch} == 'arm' ]] && echo "npm_config_arch=armv7l" >> $GITHUB_ENV if: matrix.build-arch != 'x64'
if [[ ${{matrix.arch}} == 'armhf' ]]; then - name: Install node_modules & CrossBuild native modules for ${{matrix.arch}}
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/" >> $GITHUB_ENV
elif [[ ${{matrix.arch}} == 'arm64' ]]; then
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/" >> $GITHUB_ENV
fi
if: matrix.build-arch == 'arm'
- name: Install npm_modules (native)
run: | run: |
npm i -g yarn node-gyp sudo schroot -c build-chroot -u root -- bash -c "apt-get update -y
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target-arch=${{matrix.build-arch}} dpkg --add-architecture ${{matrix.arch}}
apt-get install -y nodejs libfontconfig-dev:${{matrix.arch}} libsecret-1-dev:${{matrix.arch}} libnss3:${{matrix.arch}} libatk1.0-0:${{matrix.arch}} libatk-bridge2.0-0:${{matrix.arch}} libgdk-pixbuf2.0-0:${{matrix.arch}} libgtk-3-0:${{matrix.arch}} libgbm1:${{matrix.arch}}
export CC=${{matrix.triplet}}gcc CXX=${{matrix.triplet}}g++ LD=${{matrix.triplet}}ld
if [[ ${{matrix.arch}} == 'arm64' ]]; then
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig/
elif [[ ${{matrix.arch}} == 'armhf' ]]; then
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/arm-linux-gnueabihf/pkgconfig/
fi
export ARCH=${{matrix.build-arch}} npm_config_arch=${{matrix.build-arch}} npm_config_target_arch=${{matrix.build-arch}}
npm i -g yarn
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}"
if: matrix.build-arch != 'x64'
- name: Webpack (${{matrix.arch}}) - name: Webpack (${{matrix.arch}})
run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}} run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
@@ -232,13 +220,59 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }} KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
USE_HARD_LINKS: false USE_HARD_LINKS: false
USE_SYSTEM_FPM: true
# DEBUG: electron-builder,electron-builder:* # DEBUG: electron-builder,electron-builder:*
- name: Build web resources (amd64 only) - name: Build web resources
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist' run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
if: matrix.build-arch == 'x64' if: matrix.build-arch == 'x64'
# - name: Install deps and Build (arm64)
# uses: docker://multiarch/ubuntu-core:arm64-bionic
# with:
# args: >
# bash -c
# "apt update && apt install curl lsb-release gnupg -y &&
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
# git config --global --add safe.directory /github/workspace &&
# gem install public_suffix -v 4.0.7 &&
# gem install fpm --no-document &&
# npm i -g yarn &&
# cd /github/workspace &&
# yarn --network-timeout 1000000 &&
# yarn run build &&
# scripts/prepackage-plugins.mjs &&
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
# USE_HARD_LINKS: false
# if: matrix.build-arch == 'arm64' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
# - name: Install deps and Build (armv7l)
# uses: docker://multiarch/ubuntu-core:armhf-bionic
# with:
# args: >
# bash -c
# "apt update && apt install curl lsb-release gnupg -y &&
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
# git config --global --add safe.directory /github/workspace &&
# gem install public_suffix -v 4.0.7 &&
# gem install fpm --no-document &&
# npm i -g yarn &&
# cd /github/workspace &&
# sed -i '/ \"electron\":/c\ \"electron\": \"17.0.0\",' package.json &&
# yarn --network-timeout 1000000 &&
# yarn run build &&
# scripts/prepackage-plugins.mjs &&
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
# USE_HARD_LINKS: false
# if: matrix.build-arch == 'arm' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
- name: Upload symbols (amd64 only) - name: Upload symbols (amd64 only)
run: | run: |
sudo npm install -g @sentry/cli --unsafe-perm sudo npm install -g @sentry/cli --unsafe-perm
@@ -250,15 +284,13 @@ jobs:
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
- name: Upload packages to packagecloud.io - name: Upload packages to packagecloud.io
uses: TykTechnologies/packagecloud-action@main uses: Eugeny/packagecloud-action@main
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
env: env:
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
with: with:
repo: 'eugeny/tabby' repo: 'eugeny/tabby'
dir: 'dist' dir: 'dist'
rpmvers: 'el/9 el/8 ol/6 ol/7'
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble ubuntu/oracular debian/jessie debian/stretch debian/buster debian/bullseye debian/bookworm debian/trixie debian/testing debian/unstable'
- uses: actions/upload-artifact@master - uses: actions/upload-artifact@master
name: Upload AppImage (${{matrix.arch}}) name: Upload AppImage (${{matrix.arch}})
@@ -297,97 +329,57 @@ jobs:
path: tabby-web.tar.gz path: tabby-web.tar.gz
if: matrix.build-arch == 'x64' if: matrix.build-arch == 'x64'
Windows-Build: Windows-Build:
runs-on: windows-latest runs-on: windows-2022
needs: Lint needs: Lint
strategy: strategy:
matrix: matrix:
include: include:
- arch: x64 - arch: x64
rust_triple: x86_64-pc-windows-msvc
- arch: arm64 - arch: arm64
rust_triple: aarch64-pc-windows-msvc
fail-fast: false fail-fast: false
env:
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
ARCH: ${{matrix.arch}}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Code signing with Software Trust Manager
uses: digicert/ssm-code-signing@v1.0.0
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags'))
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v3.7.0
with: with:
node-version: 22 node-version: 16
- run: npm i -g npx
- run: rustup target add ${{matrix.rust_triple}}
- name: Update node-gyp - name: Update node-gyp
run: | run: |
npm install --global node-gyp@10.2.0 npm install --global node-gyp@8.4.1
npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"} npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
- name: Build - name: Build
shell: powershell shell: powershell
run: | run: |
npm i -g yar node-gyp npm i -g yarn@1.19.1
yarn --network-timeout 1000000 yarn --network-timeout 1000000
yarn run build yarn run build
node scripts/prepackage-plugins.mjs node scripts/prepackage-plugins.mjs
env: env:
ARCH: ${{matrix.arch}} ARCH: ${{matrix.arch}}
- name: Decode certificate
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags'))
env:
SM_CLIENT_CERT_FILE_B64: ${{ secrets.SM_CLIENT_CERT_FILE_B64 }}
run: |
SM_CLIENT_CERT_FILE=$RUNNER_TEMP/certificate.p12
echo "$SM_CLIENT_CERT_FILE_B64" | base64 --decode > $SM_CLIENT_CERT_FILE
echo "SM_CLIENT_CERT_FILE=$SM_CLIENT_CERT_FILE" >> "$GITHUB_ENV"
shell: bash
- name: Build and sign packages - name: Build and sign packages
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')) run: node scripts/build-windows.mjs
shell: powershell if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
run: |
Get-FileHash $env:SM_CLIENT_CERT_FILE -Algorithm MD5
smksp_registrar.exe list
smctl.exe healthcheck
smctl.exe keypair ls
smctl windows certsync --keypair-alias $env:SM_KEYPAIR_ALIAS
smctl.exe certificate ls
C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user
smksp_cert_sync.exe
# not used but necessary for electron-builder to run
$env:WIN_CSC_LINK=$env:SM_CLIENT_CERT_FILE
$env:WIN_CSC_KEY_PASSWORD=$env:SM_CLIENT_CERT_PASSWORD
node scripts/build-windows.mjs
env: env:
ARCH: ${{matrix.arch}} ARCH: ${{matrix.arch}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }} KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }} WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
SM_PUBLISHER_NAME: ${{ secrets.SM_PUBLISHER_NAME }} WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
SM_API_KEY: ${{ secrets.SM_API_KEY }} DEBUG: electron-builder,electron-builder:*
SM_HOST: ${{ vars.SM_HOST }}
SM_CODE_SIGNING_CERT_SHA1_HASH: ${{ vars.SM_CODE_SIGNING_CERT_SHA1_HASH }}
SM_KEYPAIR_ALIAS: ${{ vars.SM_KEYPAIR_ALIAS }}
# DEBUG: electron-builder,electron-builder:*
- name: Build packages without signing - name: Build packages without signing
run: node scripts/build-windows.mjs run: node scripts/build-windows.mjs
if: "! (github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')))" if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
env: env:
ARCH: ${{matrix.arch}} ARCH: ${{matrix.arch}}

View File

@@ -38,7 +38,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL

View File

@@ -7,18 +7,17 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v4.4.0 uses: actions/setup-node@v3.7.0
with: with:
node-version: 22 node-version: 20
- name: Build - name: Build
run: | run: |
sudo apt update && sudo apt install libfontconfig1-dev
yarn cache clean yarn cache clean
cd app cd app
yarn yarn

1
.gitignore vendored
View File

@@ -33,6 +33,7 @@ docs/api
sentry.properties sentry.properties
sentry-symbols.js sentry-symbols.js
tabby-ssh/util/pagent.exe
*.psd *.psd
crowdin.yml crowdin.yml

View File

@@ -1 +0,0 @@
https://null.page/funding.json

View File

@@ -66,7 +66,7 @@ Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> ·
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Ein VT220-Terminal + verschiedene Erweiterungen * Ein V220-Terminal + verschiedene Erweiterungen
* Mehrere verschachtelte, geteilte Fenster * Mehrere verschachtelte, geteilte Fenster
* Tabs auf jeder Seite des Fensters * Tabs auf jeder Seite des Fensters
* Optional andockbares Fenster mit einem globalen Spawn-Hotkey ("Quake-Konsole") * Optional andockbares Fenster mit einem globalen Spawn-Hotkey ("Quake-Konsole")
@@ -119,9 +119,7 @@ Plugins und Themen können direkt aus der Ansicht "Einstellungen" in Tabby insta
* [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt * [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - Öffnet ein SFTP-Tab für SSH-Verbindungen ähnlich wie SecureCRT * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-App-Web-Authentifizierungspopups (Hauptsächlich für die in-Browser-Authentifizierung von Warpgate entwickelt)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Leistungsstarke Model Context Protocol Server-Integration für Tabby, die sich nahtlos mit KI-Assistenten über MCP-Clients wie Cursor und Windsurf verbindet und Ihren Terminal-Workflow mit intelligenten KI-Funktionen verbessert.
<a name="themes"></a> <a name="themes"></a>
@@ -342,13 +340,6 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -67,7 +67,7 @@ Este fichero README está disponible en: <a href="./README.md">:gb: English</a>
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Un terminal VT220 + varias extensiones * Un terminal V220 + varias extensiones
* Múltiples paneles divididos anidados * Múltiples paneles divididos anidados
* Pestañas en cualquier lado de la ventana * Pestañas en cualquier lado de la ventana
* Ventana acoplable opcional con una tecla de acceso directo global ("consola de Quake") * Ventana acoplable opcional con una tecla de acceso directo global ("consola de Quake")
@@ -120,9 +120,7 @@ Los plugins y los temas se pueden instalar directamente desde la vista de Config
* [clippy](https://github.com/Eugeny/tabby-clippy) - un ejemplo de plugin que te molesta todo el tiempo * [clippy](https://github.com/Eugeny/tabby-clippy) - un ejemplo de plugin que te molesta todo el tiempo
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite crear perfiles de espacio de trabajo personalizados basados en la configuración dada * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite crear perfiles de espacio de trabajo personalizados basados en la configuración dada
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre el navegador del sistema por defecto con un texto seleccionado en la pestaña de Tabby's * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre el navegador del sistema por defecto con un texto seleccionado en la pestaña de Tabby's
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - abre una pestaña sftp para la conexión ssh como SecureCRT * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Ventanas emergentes de autenticación web dentro de la app (Construidas principalmente para la autenticación en el navegador de warpgate)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potente integración del servidor de Protocolo de Contexto de Modelo para Tabby que se conecta sin problemas con asistentes de IA a través de clientes MCP como Cursor y Windsurf, mejorando tu flujo de trabajo en terminal con capacidades inteligentes de IA.
<a name="themes"></a> <a name="themes"></a>
# Temas # Temas
@@ -343,14 +341,6 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -67,7 +67,7 @@ This README is also available in: <a href="./README.md">:gb: English</a> · <a
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Terminal VT220 + berbagai macam ekstensi * Terminal V220 + berbagai macam ekstensi
* Beberapa pembagian panel * Beberapa pembagian panel
* Tab di sisi mana pun dari jendela * Tab di sisi mana pun dari jendela
* Jendela dockable opsional dengan hotkey spawn global ("Quake console") * Jendela dockable opsional dengan hotkey spawn global ("Quake console")
@@ -120,9 +120,8 @@ Tema dan Plugin bisa langsung di install dari Pengaturan di dalam Tabby.
* [clippy](https://github.com/Eugeny/tabby-clippy) - suatu contoh plugin yang akan mengganggu anda setiap saat * [clippy](https://github.com/Eugeny/tabby-clippy) - suatu contoh plugin yang akan mengganggu anda setiap saat
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - memperbolehkan membuat kustom profil workspace dari konfigurasi yang diberikan * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - memperbolehkan membuat kustom profil workspace dari konfigurasi yang diberikan
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - membuka browser default dengan text yang dipilih dari Tab Tabby * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - membuka browser default dengan text yang dipilih dari Tab Tabby
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - membuka tab sftp untuk koneksi ssh seperti SecureCRT * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Pop-up otentikasi web di dalam aplikasi (Dibangun terutama untuk otentikasi in-browser warpgate)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Integrasi server Model Context Protocol yang kuat untuk Tabby yang terhubung secara mulus dengan asisten AI melalui klien MCP seperti Cursor dan Windsurf, meningkatkan alur kerja terminal Anda dengan kemampuan AI yang cerdas.
<a name="themes"></a> <a name="themes"></a>
# Tema # Tema
@@ -340,13 +339,6 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -68,7 +68,7 @@ Questo README è disponibile anche in: <a href="./README.md">:gb: English</a>
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Un terminale VT220 + vari estensioni * Un terminale V220 + vari estensioni
* Suddivisione in pannelli * Suddivisione in pannelli
* Schede su qualsiasi lato della finestra * Schede su qualsiasi lato della finestra
* Finestra agganciabile opzionale con un tasto di scelta rapida ("Quake console") * Finestra agganciabile opzionale con un tasto di scelta rapida ("Quake console")
@@ -107,19 +107,18 @@ Tabby può essere eseguito come app portatile su Windows, se crei una cartella `
<a name="plugins"></a> <a name="plugins"></a>
# Plugin # Plugin
I plugin e i temi possono essere installati direttamente dalla vista Impostazioni all'interno di Tabby. Plugins and themes can be installed directly from the Settings view inside Tabby.
* [docker](https://github.com/Eugeny/tabby-docker) - connect to Docker containers
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
* [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file
* [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - allows creating custom workspace profiles based on the given config
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [docker](https://github.com/Eugeny/tabby-docker) - connessione ai container Docker
* [title-control](https://github.com/kbjr/terminus-title-control) - consente di modificare il titolo delle schede del terminale fornendo un prefisso, un suffisso e/o stringhe da rimuovere
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - invia rapidamente comandi a una o tutte le schede del terminale
* [save-output](https://github.com/Eugeny/tabby-save-output) - registra l'output del terminale in un file
* [sync-config](https://github.com/starxg/terminus-sync-config) - sincronizza la configurazione con Gist o Gitee
* [clippy](https://github.com/Eugeny/tabby-clippy) - un esempio di plugin che ti infastidisce tutto il tempo
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - consente di creare profili di spazio di lavoro personalizzati basati sulla configurazione fornita
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - apre il browser di sistema predefinito con un testo selezionato dalla scheda di Tabby
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - apre una scheda SFTP per la connessione SSH come SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Popup di autenticazione web in-app (costruito principalmente per l'autenticazione in-browser di Warpgate)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potente integrazione del server Model Context Protocol per Tabby che si connette perfettamente con assistenti AI attraverso client MCP come Cursor e Windsurf, migliorando il tuo flusso di lavoro del terminale con capacità AI intelligenti.
<a name="themes"></a> <a name="themes"></a>
# Temi # Temi
@@ -336,13 +335,6 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -74,7 +74,7 @@
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* VT220ターミナル各種拡張機能 * V220ターミナル各種拡張機能
* 複数ネストされたペイン分割に対応 * 複数ネストされたペイン分割に対応
* ウィンドウ内に自由に配置可能なタブ * ウィンドウ内に自由に配置可能なタブ
* グローバルホットキーで呼び出せるドックウィンドウ機能("Quakeコンソール" * グローバルホットキーで呼び出せるドックウィンドウ機能("Quakeコンソール"
@@ -127,9 +127,8 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
* [clippy](https://github.com/Eugeny/tabby-clippy) - プラグインの作例として、いつも厄介なあいつが出てくるプラグイン * [clippy](https://github.com/Eugeny/tabby-clippy) - プラグインの作例として、いつも厄介なあいつが出てくるプラグイン
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 指定された設定からカスタマイズされたワークスペースを作成することができます * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 指定された設定からカスタマイズされたワークスペースを作成することができます
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby内の端末で選択したテキストを既定ブラウザで開くことができます。 * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby内の端末で選択したテキストを既定ブラウザで開くことができます。
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - SecureCRTのようにSSH接続のSFTPタブを開く * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - アプリ内ウェブ認証ポップアップ主にwarpgateのブラウザ認証用に構築
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - TabbyのためのパワフルなModel Context Protocolサーバー統合機能で、CursorやWindsurfなどのMCPクライアントを通じてAIアシスタントとシームレスに接続し、インテリジェントなAI機能によってターミナルワークフローを強化します。
<a name="themes"></a> <a name="themes"></a>
# テーマ # テーマ
@@ -350,14 +349,6 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -66,7 +66,7 @@ This README is also available in: <a href="./README.md">:gb: English</a> · <a
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* A VT220 터미널 + 다양한 확장 * A V220 터미널 + 다양한 확장
* 여러 개의 분할 창 중첩 * 여러 개의 분할 창 중첩
* 모든 측면에 탭이 위치함 * 모든 측면에 탭이 위치함
* 전역 스폰 단축키가 있는 도킹 가능한 윈도우 ("Quake console") * 전역 스폰 단축키가 있는 도킹 가능한 윈도우 ("Quake console")
@@ -116,9 +116,8 @@ This README is also available in: <a href="./README.md">:gb: English</a> · <a
* [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인 * [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다 * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다 * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - SecureCRT와 유사하게 SSH 연결에 대한 SFTP 탭을 엽니다. * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - 앱 내 웹 인증 팝업 (주로 warpgate 브라우저 인증을 위해 구축)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Cursor 및 Windsurf와 같은 MCP 클라이언트를 통해 AI 어시스턴트와 원활하게 연결되는 Tabby용 강력한 모델 컨텍스트 프로토콜 서버 통합으로, 지능형 AI 기능으로 터미널 워크플로우를 향상시킵니다.
<a name="themes"></a> <a name="themes"></a>
# 테마 # 테마
@@ -335,13 +334,6 @@ Pull requests and plugins are welcome!
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -2,7 +2,7 @@
<p align="center"> <p align="center">
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> &nbsp; <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> &nbsp; <a href="https://discord.gg/Vn7BjmzhtF"><img alt="Discord" src="https://img.shields.io/discord/1280890060195233934?style=for-the-badge&color=blue&logo=discord&logoColor=white&label=Discord"></a> &nbsp <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> &nbsp; <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> &nbsp; <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a> &nbsp <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> &nbsp; <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
</p> </p>
<p align="center"> <p align="center">
@@ -16,6 +16,9 @@
> 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it. > 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it.
> 👋 [Tabby-web](https://github.com/Eugeny/tabby-web) is looking for sponsors. As I can't afford to host it myself any longer, I'm looking for a sponsor to cover the hosting costs. If you're interested, please [get in touch](https://twitter.com/eugeeeeny)!
---- ----
### Downloads: ### Downloads:
@@ -72,7 +75,7 @@ This README is also available in: <a href="./README.es-ES.md">:es: Spanish</a>
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* A VT220 terminal + various extensions * A V220 terminal + various extensions
* Multiple nested split panes * Multiple nested split panes
* Tabs on any side of the window * Tabs on any side of the window
* Optional dockable window with a global spawn hotkey ("Quake console") * Optional dockable window with a global spawn hotkey ("Quake console")
@@ -129,7 +132,6 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
* [background](https://github.com/moemoechu/tabby-background) - change Tabby background image and more... * [background](https://github.com/moemoechu/tabby-background) - change Tabby background image and more...
* [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin * [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-app web authentication popups (Built primarily for warpgate in-browser auth) * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-app web authentication popups (Built primarily for warpgate in-browser auth)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Powerful Model Context Protocol server integration for Tabby that seamlessly connects with AI assistants through MCP clients like Cursor and Windsurf, enhancing your terminal workflow with intelligent AI capabilities.
<a name="themes"></a> <a name="themes"></a>
@@ -145,7 +147,7 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
# Sponsors <!-- omit in toc --> # Sponsors <!-- omit in toc -->
<a href="https://packagecloud.io"><img src="https://assets-production.packagecloud.io/assets/logo_v1-d5895e7b89b2dee19030e85515fd0f91d8f3b37c82d218a6531fc89c2b1b613c.png" width="200"></a> [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io)
[**packagecloud**](https://packagecloud.io) has provided free Debian/RPM repository hosting [**packagecloud**](https://packagecloud.io) has provided free Debian/RPM repository hosting
@@ -153,11 +155,6 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
[**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting [**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting
<a href="https://iqhive.com/"><img src="https://iqhive.com/img/icons/logo.svg" width="200"></a>
[**IQ Hive**](https://iqhive.com) is providing financial support for the project development
<a name="contributing"></a> <a name="contributing"></a>
# Contributing # Contributing
@@ -359,13 +356,6 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -75,7 +75,7 @@ Ten plik README jest również dostępny w językach: <a href="./README.md">:gb
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Konsola VT220 + wiele rozszerzeń * Konsola V220 + wiele rozszerzeń
* Wiele nakładających się podzielonych okien * Wiele nakładających się podzielonych okien
* Okna na każdej stronie ekranu * Okna na każdej stronie ekranu
* Opcjonalne dokowanie okna za pomocą skrótu ("Quake console") * Opcjonalne dokowanie okna za pomocą skrótu ("Quake console")
@@ -132,7 +132,6 @@ Wtyczki (jak i motywy) mogą być instalowane bezpośrednio z widoku ustawień w
* [background](https://github.com/moemoechu/tabby-background) - zmień tło Tabby oraz wiele więcej * [background](https://github.com/moemoechu/tabby-background) - zmień tło Tabby oraz wiele więcej
* [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin * [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - okienka autoryzacji wewnątrz konsoli (Zbudowany głównie pod autoryzację projektu Warpgate w przeglądarce) * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - okienka autoryzacji wewnątrz konsoli (Zbudowany głównie pod autoryzację projektu Warpgate w przeglądarce)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potężna integracja serwera Model Context Protocol dla Tabby, która bezproblemowo łączy się z asystentami AI poprzez klientów MCP, takich jak Cursor i Windsurf, usprawniając przepływ pracy w terminalu dzięki inteligentnym możliwościom AI.
<a name="themes"></a> <a name="themes"></a>

View File

@@ -67,7 +67,7 @@ Esse README também está disponível em: <a href="./README.md">:gb: English</a
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Um terminal VT220 + várias extensões * Um terminal V220 + várias extensões
* Múltiplos painéis divididos aninhados * Múltiplos painéis divididos aninhados
* Guias em qualquer lado da janela * Guias em qualquer lado da janela
* Opção de minimizar para a barra de tarefas com uma tecla de atalho global ("Quake console") * Opção de minimizar para a barra de tarefas com uma tecla de atalho global ("Quake console")
@@ -120,9 +120,8 @@ Plugins e temas podem ser instalados durante a execução na pagina de configura
* [clippy](https://github.com/Eugeny/tabby-clippy) - um plugin de exemplo que te incomoda o tempo todo * [clippy](https://github.com/Eugeny/tabby-clippy) - um plugin de exemplo que te incomoda o tempo todo
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite criar perfis de espaço de trabalho personalizados com base na configuração fornecida * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite criar perfis de espaço de trabalho personalizados com base na configuração fornecida
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre o navegador padrão do sistema com um texto selecionado na guia do Tabby * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre o navegador padrão do sistema com um texto selecionado na guia do Tabby
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - abre uma guia SFTP para conexão SSH como o SecureCRT * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - pop-ups de autenticação web dentro do aplicativo (Construído principalmente para autenticação in-browser do warpgate)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Integração poderosa do servidor Model Context Protocol para Tabby que se conecta perfeitamente com assistentes de IA através de clientes MCP como Cursor e Windsurf, aprimorando seu fluxo de trabalho no terminal com recursos inteligentes de IA.
<a name="themes"></a> <a name="themes"></a>
# Temas # Temas
@@ -344,13 +343,6 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -31,7 +31,7 @@
* Встроенный SSH- и Telnet-клиент и менеджер подключений; * Встроенный SSH- и Telnet-клиент и менеджер подключений;
* Встроенный последовательный терминал; * Встроенный последовательный терминал;
* Темы и цветовые схемы; * Темы и цветовые схемы;
* Полностью настраиваемые сочетания клавиш; * Полностью настраеваемые сочетания клавиш;
* Панели; * Панели;
* Запоминание вкладок; * Запоминание вкладок;
* Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD; * Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD;
@@ -67,7 +67,7 @@
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* Терминал VT220 + различные дополнения; * Терминал V220 + различные дополнения;
* Деление окна на несколько панелей; * Деление окна на несколько панелей;
* Вкладки на любой стороне окна; * Вкладки на любой стороне окна;
* Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»); * Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»);
@@ -118,8 +118,7 @@
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские профили рабочего окружения на основе конфига; * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские профили рабочего окружения на основе конфига;
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby. * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby.
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - открывает sftp вкладку для ssh соединения, похож на SecureCRT * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - открывает sftp вкладку для ssh соединения, похож на SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Встроенные всплывающие окна веб-аутентификации (Основано в основном для аутентификации в браузере warpgate)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Мощная интеграция сервера протокола Model Context Protocol для Tabby, которая беспрепятственно соединяется с ИИ-ассистентами через MCP-клиенты, такие как Cursor и Windsurf, улучшая рабочий процесс в терминале с помощью интеллектуальных возможностей искусственного интеллекта.
<a name="themes"></a> <a name="themes"></a>
# Темы # Темы
@@ -336,13 +335,6 @@ Pull-запросы и плагины приветствуются!
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -66,7 +66,7 @@
![](docs/readme-terminal.png) ![](docs/readme-terminal.png)
* 一个 VT220 终端 + 各种插件 * 一个 V220 终端 + 各种插件
* 多个嵌套的拆分窗格 * 多个嵌套的拆分窗格
* 可以将标签页设置在窗口的任意一侧 * 可以将标签页设置在窗口的任意一侧
* 带有全局生成热键的可选可停靠窗口“Quake console” * 带有全局生成热键的可选可停靠窗口“Quake console”
@@ -117,8 +117,7 @@
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件 * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器 * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - 为ssh连接打开类似SecureCRT的sftp标签页 * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - 为ssh连接打开类似SecureCRT的sftp标签页
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - 应用内网页认证弹出窗口主要为warpgate浏览器认证而建
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - 为 Tabby 提供强大的模型上下文协议服务器集成,可通过 Cursor 和 Windsurf 等 MCP 客户端无缝连接 AI 助手,利用智能 AI 功能增强您的终端工作流程。
<a name="themes"></a> <a name="themes"></a>
# 主题 # 主题
@@ -335,13 +334,6 @@
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -31,8 +31,6 @@ try {
app.exit(1) app.exit(1)
} }
process.mainModule = module
const application = new Application(configStore) const application = new Application(configStore)
ipcMain.on('app:new-window', () => { ipcMain.on('app:new-window', () => {

View File

@@ -1,7 +1,7 @@
import * as glasstron from 'glasstron' import * as glasstron from 'glasstron'
import { autoUpdater } from 'electron-updater'
import { Subject, Observable, debounceTime } from 'rxjs' import { Subject, Observable, debounceTime } from 'rxjs'
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents, nativeTheme } from 'electron' import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents } from 'electron'
import ElectronConfig = require('electron-config') import ElectronConfig = require('electron-config')
import { enable as enableRemote } from '@electron/remote/main' import { enable as enableRemote } from '@electron/remote/main'
import * as os from 'os' import * as os from 'os'
@@ -26,7 +26,7 @@ abstract class GlasstronWindow extends BrowserWindow {
abstract setBlur (_: boolean) abstract setBlur (_: boolean)
} }
const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'under-window' : 'dark' : null
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`) const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
@@ -100,10 +100,6 @@ export class Window {
} }
} }
if (process.platform === 'darwin') {
bwOptions.visualEffectState = 'active'
}
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
this.window = new BrowserWindow(bwOptions) as GlasstronWindow this.window = new BrowserWindow(bwOptions) as GlasstronWindow
} else { } else {
@@ -112,15 +108,13 @@ export class Window {
this.webContents = this.window.webContents this.webContents = this.window.webContents
this.window.webContents.once('did-finish-load', () => { this.window.once('ready-to-show', () => {
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
this.window.setVibrancy(macOSVibrancyType) this.window.setVibrancy(macOSVibrancyType)
} else if (process.platform === 'win32' && this.configStore.appearance?.vibrancy) { } else if (process.platform === 'win32' && this.configStore.appearance?.vibrancy) {
this.setVibrancy(true) this.setVibrancy(true)
} }
this.setDarkMode(this.configStore.appearance?.colorSchemeMode ?? 'dark')
if (!options.hidden) { if (!options.hidden) {
if (maximized) { if (maximized) {
this.window.maximize() this.window.maximize()
@@ -145,7 +139,7 @@ export class Window {
enableRemote(this.window.webContents) enableRemote(this.window.webContents)
this.window.loadFile(path.join(app.getAppPath(), 'dist', 'index.html')) this.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' })
this.window.webContents.setVisualZoomLevelLimits(1, 1) this.window.webContents.setVisualZoomLevelLimits(1, 1)
this.window.webContents.setZoomFactor(1) this.window.webContents.setZoomFactor(1)
@@ -165,7 +159,6 @@ export class Window {
} }
this.setupWindowManagement() this.setupWindowManagement()
this.setupUpdater()
this.ready = new Promise(resolve => { this.ready = new Promise(resolve => {
const listener = event => { const listener = event => {
@@ -207,18 +200,6 @@ export class Window {
} }
} }
setDarkMode (mode: string): void {
if (process.platform === 'darwin') {
if ('light' === mode ) {
nativeTheme.themeSource = 'light'
} else if ('auto' === mode) {
nativeTheme.themeSource = 'system'
} else {
nativeTheme.themeSource = 'dark'
}
}
}
focus (): void { focus (): void {
this.window.focus() this.window.focus()
} }
@@ -365,8 +346,11 @@ export class Window {
this.send('host:window-focused') this.send('host:window-focused')
}) })
this.on('ready', () => { ipcMain.on('ready', event => {
this.window?.webContents.send('start', { if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.webContents.send('start', {
config: this.configStore, config: this.configStore,
executable: app.getPath('exe'), executable: app.getPath('exe'),
windowID: this.window.id, windowID: this.window.id,
@@ -375,30 +359,42 @@ export class Window {
}) })
}) })
this.on('window-minimize', () => { ipcMain.on('window-minimize', event => {
this.window?.minimize() if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.minimize()
}) })
this.on('window-set-bounds', (_, bounds) => { ipcMain.on('window-set-bounds', (event, bounds) => {
this.window?.setBounds(bounds) if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.setBounds(bounds)
}) })
this.on('window-set-always-on-top', (_, flag) => { ipcMain.on('window-set-always-on-top', (event, flag) => {
this.window?.setAlwaysOnTop(flag) if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.setAlwaysOnTop(flag)
}) })
this.on('window-set-vibrancy', (_, enabled, type) => { ipcMain.on('window-set-vibrancy', (event, enabled, type) => {
if (!this.window || event.sender !== this.window.webContents) {
return
}
this.setVibrancy(enabled, type) this.setVibrancy(enabled, type)
}) })
this.on('window-set-dark-mode', (_, mode) => { ipcMain.on('window-set-window-controls-color', (event, theme) => {
this.setDarkMode(mode) if (!this.window || event.sender !== this.window.webContents) {
}) return
}
this.on('window-set-window-controls-color', (_, theme) => {
if (process.platform === 'win32') { if (process.platform === 'win32') {
const symbolColor: string = theme.foreground const symbolColor: string = theme.foreground
this.window?.setTitleBarOverlay( this.window.setTitleBarOverlay(
{ {
symbolColor: symbolColor, symbolColor: symbolColor,
height: 32, height: 32,
@@ -407,23 +403,32 @@ export class Window {
} }
}) })
this.on('window-set-title', (_, title) => { ipcMain.on('window-set-title', (event, title) => {
this.window?.setTitle(title) if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.setTitle(title)
}) })
this.on('window-bring-to-front', () => { ipcMain.on('window-bring-to-front', event => {
if (this.window?.isMinimized()) { if (!this.window || event.sender !== this.window.webContents) {
return
}
if (this.window.isMinimized()) {
this.window.restore() this.window.restore()
} }
this.present() this.present()
}) })
this.on('window-close', () => { ipcMain.on('window-close', event => {
if (!this.window || event.sender !== this.window.webContents) {
return
}
this.closing = true this.closing = true
this.window.close() this.window.close()
}) })
this.on('window-set-touch-bar', (_, segments, selectedIndex) => { ipcMain.on('window-set-touch-bar', (_event, segments, selectedIndex) => {
this.touchBarControl.segments = segments.map(s => ({ this.touchBarControl.segments = segments.map(s => ({
label: s.label, label: s.label,
icon: s.hasActivity ? activityIcon : undefined, icon: s.hasActivity ? activityIcon : undefined,
@@ -463,46 +468,8 @@ export class Window {
this.window.setOpacity(opacity) this.window.setOpacity(opacity)
}) })
this.on('window-set-progress-bar', (_, value) => { ipcMain.on('window-set-progress-bar', (_event, value) => {
this.window?.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' }) this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
})
}
on (event: string, listener: (...args: any[]) => void): void {
ipcMain.on(event, (e, ...args) => {
if (!this.window || e.sender !== this.window.webContents) {
return
}
listener(e, ...args)
})
}
private setupUpdater () {
autoUpdater.autoDownload = true
autoUpdater.autoInstallOnAppQuit = true
autoUpdater.on('update-available', () => {
this.send('updater:update-available')
})
autoUpdater.on('update-not-available', () => {
this.send('updater:update-not-available')
})
autoUpdater.on('error', err => {
this.send('updater:error', err)
})
autoUpdater.on('update-downloaded', () => {
this.send('updater:update-downloaded')
})
this.on('updater:check-for-updates', () => {
autoUpdater.checkForUpdates()
})
this.on('updater:quit-and-install', () => {
autoUpdater.quitAndInstall()
}) })
} }

View File

@@ -15,8 +15,8 @@
"watch": "webpack --progress --color --watch" "watch": "webpack --progress --color --watch"
}, },
"dependencies": { "dependencies": {
"@electron/remote": "^2", "@electron/remote": "2.0.10",
"node-pty": "^1.0.0", "node-pty": "^1.0",
"any-promise": "^1.3.0", "any-promise": "^1.3.0",
"electron-config": "2.0.0", "electron-config": "2.0.0",
"electron-debug": "^3.2.0", "electron-debug": "^3.2.0",
@@ -24,25 +24,25 @@
"electron-updater": "^5.2.1", "electron-updater": "^5.2.1",
"fontmanager-redux": "1.1.0", "fontmanager-redux": "1.1.0",
"glasstron": "0.1.1", "glasstron": "0.1.1",
"node-powershell": "5.0.1",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"keytar": "^7.9.0", "keytar": "^7.9.0",
"mz": "^2.7.0", "mz": "^2.7.0",
"native-process-working-directory": "^1.0.2", "native-process-working-directory": "^1.0.2",
"npm": "6", "npm": "6",
"rxjs": "^7.5.7", "rxjs": "^7.5.7",
"russh": "0.1.24",
"source-map-support": "^0.5.20", "source-map-support": "^0.5.20",
"v8-compile-cache": "^2.3.0", "v8-compile-cache": "^2.3.0",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tabby-gang/windows-blurbehind": "^3.1.0", "@tabby-gang/windows-blurbehind": "^3.0.0",
"macos-native-processlist": "^2.1.0", "macos-native-processlist": "^2.1.0",
"patch-package": "^6.5.0", "patch-package": "^6.5.0",
"serialport": "11.0.1", "serialport": "11.0.1",
"serialport-binding-webserialapi": "^1.0.3", "serialport-binding-webserialapi": "^1.0.3",
"windows-native-registry": "^3.2.1", "windows-native-registry": "^3.2.1",
"@tabby-gang/windows-process-tree": "^0.6.1" "windows-process-tree": "^0.4.0"
}, },
"devDependencies": { "devDependencies": {
"@ngx-translate/core": "^14.0.0", "@ngx-translate/core": "^14.0.0",
@@ -64,9 +64,8 @@
"tabby-terminal": "*" "tabby-terminal": "*"
}, },
"resolutions": { "resolutions": {
"node-abi": "4.9.0", "*/node-abi": "^2.20.0",
"node-gyp": "^10.0.0", "node-gyp": "^10.0.0",
"nan": "2.22.2", "nan": "github:jkleinsc/nan#remove_accessor_signature"
"node-addon-api": "^8.3.0"
} }
} }

View File

@@ -1,53 +0,0 @@
diff --git a/node_modules/node-pty/binding.gyp b/node_modules/node-pty/binding.gyp
index 79a93e7..efb0a3f 100644
--- a/node_modules/node-pty/binding.gyp
+++ b/node_modules/node-pty/binding.gyp
@@ -18,6 +18,9 @@
]
}
},
+ 'defines': [
+ 'NOMINMAX'
+ ]
}],
],
},
diff --git a/node_modules/node-pty/src/win/winpty.cc b/node_modules/node-pty/src/win/winpty.cc
index b054dee..a094b1c 100644
--- a/node_modules/node-pty/src/win/winpty.cc
+++ b/node_modules/node-pty/src/win/winpty.cc
@@ -164,7 +164,7 @@ static NAN_METHOD(PtyStartProcess) {
Nan::ThrowError(why.str().c_str());
goto cleanup;
}
-
+ {
int cols = info[4]->Int32Value(Nan::GetCurrentContext()).FromJust();
int rows = info[5]->Int32Value(Nan::GetCurrentContext()).FromJust();
bool debug = Nan::To<bool>(info[6]).FromJust();
@@ -179,6 +179,7 @@ static NAN_METHOD(PtyStartProcess) {
throw_winpty_error("Error creating WinPTY config", error_ptr);
goto cleanup;
}
+ {
winpty_error_free(error_ptr);
// Set pty size on config
@@ -215,7 +216,7 @@ static NAN_METHOD(PtyStartProcess) {
winpty_error_free(error_ptr);
// Set return values
- v8::Local<v8::Object> marshal = Nan::New<v8::Object>();
+ {v8::Local<v8::Object> marshal = Nan::New<v8::Object>();
Nan::Set(marshal, Nan::New<v8::String>("innerPid").ToLocalChecked(), Nan::New<v8::Number>((int)GetProcessId(handle)));
Nan::Set(marshal, Nan::New<v8::String>("innerPidHandle").ToLocalChecked(), Nan::New<v8::Number>((int)handle));
Nan::Set(marshal, Nan::New<v8::String>("pid").ToLocalChecked(), Nan::New<v8::Number>((int)winpty_agent_process(pc)));
@@ -232,7 +233,7 @@ static NAN_METHOD(PtyStartProcess) {
Nan::Set(marshal, Nan::New<v8::String>("conout").ToLocalChecked(), Nan::New<v8::String>(conoutPipeNameStr).ToLocalChecked());
}
info.GetReturnValue().Set(marshal);
-
+ }}}
goto cleanup;
cleanup:

View File

@@ -42,7 +42,6 @@ const config = {
'electron-config': 'commonjs electron-config', 'electron-config': 'commonjs electron-config',
'electron-debug': 'commonjs electron-debug', 'electron-debug': 'commonjs electron-debug',
'electron-promise-ipc': 'commonjs electron-promise-ipc', 'electron-promise-ipc': 'commonjs electron-promise-ipc',
'electron-updater': 'commonjs electron-updater',
fs: 'commonjs fs', fs: 'commonjs fs',
glasstron: 'commonjs glasstron', glasstron: 'commonjs glasstron',
mz: 'commonjs mz', mz: 'commonjs mz',

View File

@@ -2,10 +2,10 @@
# yarn lockfile v1 # yarn lockfile v1
"@electron/remote@^2": "@electron/remote@2.0.10":
version "2.1.2" version "2.0.10"
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.1.2.tgz#52a97c8faa5b769155b649ef262f2f8c851776e6" resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.10.tgz#133e2f607b1861ac249bd78b5abd1e961feed713"
integrity sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA== integrity sha512-3SFKKaQXcyWgwmibud+UqJl/XlHOgLcI3fwtB9pNelPSJAcTxocOJrF6FaxBIQaj1+R05Di6xuAswZpXAW7xhA==
"@iarna/cli@^1.2.0": "@iarna/cli@^1.2.0":
version "1.2.0" version "1.2.0"
@@ -28,11 +28,6 @@
wrap-ansi "^8.1.0" wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
"@napi-rs/cli@^2.18.3":
version "2.18.4"
resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-2.18.4.tgz#12bebfb7995902fa7ab43cc0b155a7f5a2caa873"
integrity sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==
"@ngx-translate/core@^14.0.0": "@ngx-translate/core@^14.0.0":
version "14.0.0" version "14.0.0"
resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-14.0.0.tgz#af421d0e1a28376843f0fed375cd2fae7630a5ff" resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-14.0.0.tgz#af421d0e1a28376843f0fed375cd2fae7630a5ff"
@@ -178,20 +173,13 @@
dependencies: dependencies:
debug "^4.3.2" debug "^4.3.2"
"@tabby-gang/windows-blurbehind@^3.1.0": "@tabby-gang/windows-blurbehind@^3.0.0":
version "3.1.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/@tabby-gang/windows-blurbehind/-/windows-blurbehind-3.1.0.tgz#bd1462f2a970d195e277d48cceb8b2c0a20f09bd" resolved "https://registry.yarnpkg.com/@tabby-gang/windows-blurbehind/-/windows-blurbehind-3.0.0.tgz#48d409c2eb14a12c867b70de5ee4d6769ef45e8f"
integrity sha512-wTvyNrBDNxD4yq1bXv7lvXRQujJYRQ2Ke3LJyE9yzY9e/L9/fHVIuprIgAMiLsnW+BKPERq0k27iC38WnxUBZQ== integrity sha512-ah6eJcoQZWOZfu9sd2pWlOJmfl1v+2EZQMeIp7MWvg+/16WS16UFNdnOtlV6AUiABHfZo2QKfCNUEuorCM+Q2A==
dependencies: dependencies:
"@types/node" "^10.12.18" "@types/node" "^10.12.18"
"@tabby-gang/windows-process-tree@^0.6.1":
version "0.6.1"
resolved "https://registry.yarnpkg.com/@tabby-gang/windows-process-tree/-/windows-process-tree-0.6.1.tgz#2a5a5cbbee16f611fc61d53cbadf930c8d3d20a8"
integrity sha512-I7AwncTXTmo1+WPfV+O+jYRJzjCMJznIjC/ycl4dP/n2HAocuXCIjTZfoMmL+rgjN2nRFpTyn6P+EhuIPMACbQ==
dependencies:
node-addon-api "7.1.0"
"@types/mz@2.7.4": "@types/mz@2.7.4":
version "2.7.4" version "2.7.4"
resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.4.tgz#f9d1535cb5171199b28ae6abd6ec29e856551401" resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.4.tgz#f9d1535cb5171199b28ae6abd6ec29e856551401"
@@ -1502,26 +1490,25 @@ glasstron@0.1.1:
x11 "^2.3.0" x11 "^2.3.0"
glob@^10.2.2, glob@^10.3.10: glob@^10.2.2, glob@^10.3.10:
version "10.4.5" version "10.3.10"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
dependencies: dependencies:
foreground-child "^3.1.0" foreground-child "^3.1.0"
jackspeak "^3.1.2" jackspeak "^2.3.5"
minimatch "^9.0.4" minimatch "^9.0.1"
minipass "^7.1.2" minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
package-json-from-dist "^1.0.0" path-scurry "^1.10.1"
path-scurry "^1.11.1"
glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3" version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies: dependencies:
fs.realpath "^1.0.0" fs.realpath "^1.0.0"
inflight "^1.0.4" inflight "^1.0.4"
inherits "2" inherits "2"
minimatch "^3.1.1" minimatch "^3.0.4"
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.0" path-is-absolute "^1.0.0"
@@ -1944,10 +1931,10 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
jackspeak@^3.1.2: jackspeak@^2.3.5:
version "3.4.3" version "2.3.6"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
dependencies: dependencies:
"@isaacs/cliui" "^8.0.2" "@isaacs/cliui" "^8.0.2"
optionalDependencies: optionalDependencies:
@@ -2299,18 +2286,13 @@ lowercase-keys@^1.0.0:
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
lru-cache@^10.0.1: lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0":
version "10.0.2" version "10.0.2"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.2.tgz#34504678cc3266b09b8dfd6fab4e1515258271b7" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.2.tgz#34504678cc3266b09b8dfd6fab4e1515258271b7"
integrity sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg== integrity sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==
dependencies: dependencies:
semver "^7.3.5" semver "^7.3.5"
lru-cache@^10.2.0:
version "10.4.3"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
lru-cache@^4.0.1: lru-cache@^4.0.1:
version "4.1.5" version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@@ -2430,17 +2412,10 @@ minimatch@^3.0.4:
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimatch@^3.1.1: minimatch@^9.0.1:
version "3.1.2" version "9.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
dependencies:
brace-expansion "^1.1.7"
minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
dependencies: dependencies:
brace-expansion "^2.0.1" brace-expansion "^2.0.1"
@@ -2513,11 +2488,6 @@ minipass@^5.0.0:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c"
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^1.3.3: minizlib@^1.3.3:
version "1.3.3" version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
@@ -2607,10 +2577,9 @@ mz@^2.7.0:
object-assign "^4.0.1" object-assign "^4.0.1"
thenify-all "^1.0.0" thenify-all "^1.0.0"
nan@2.22.2, nan@^2.17.0: nan@^2.17.0, "nan@github:jkleinsc/nan#remove_accessor_signature":
version "2.22.2" version "2.16.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb" resolved "https://codeload.github.com/jkleinsc/nan/tar.gz/6a2f95a6a2209d8aa7542fb18099fd808a802059"
integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==
napi-build-utils@^1.0.1: napi-build-utils@^1.0.1:
version "1.0.2" version "1.0.2"
@@ -2641,17 +2610,34 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
node-abi@4.9.0, node-abi@^3.3.0: node-abi@^2.20.0:
version "4.9.0" version "2.30.1"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-4.9.0.tgz#ca6dabf7991e54bf3ba6d8d32641e1b84f305263" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
integrity sha512-0isb3h+AXUblx5Iv0mnYy2WsErH+dk2e9iXJXdKAtS076Q5hP+scQhp6P4tvDeVlOBlG3ROKvkpQHtbORllq2A== integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
dependencies: dependencies:
semver "^7.6.3" semver "^5.4.1"
node-addon-api@3.1.0, node-addon-api@6.1.0, node-addon-api@7.1.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0, node-addon-api@^4.0.0, node-addon-api@^4.3.0, node-addon-api@^8.3.0: node-abi@^3.3.0:
version "8.3.0" version "3.8.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.0.tgz#ec3763f18befc1cdf66d11e157ce44d5eddc0603" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.8.0.tgz#679957dc8e7aa47b0a02589dbfde4f77b29ccb32"
integrity sha512-8VOpLHFrOQlAH+qA0ZzuGRlALRA6/LVh8QJldbrC4DY0hXoMP0l4Acq8TzFC018HztWiRqyCEj2aTWY2UvnJUg== integrity sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==
dependencies:
semver "^7.3.5"
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==
node-addon-api@6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76"
integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
node-addon-api@^4.0.0, node-addon-api@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
node-fetch-npm@^2.0.2: node-fetch-npm@^2.0.2:
version "2.0.4" version "2.0.4"
@@ -2683,7 +2669,7 @@ node-gyp@^10.0.0, node-gyp@^5.0.2, node-gyp@^5.1.0:
tar "^6.1.2" tar "^6.1.2"
which "^4.0.0" which "^4.0.0"
node-pty@^1.0.0: node-pty@^1.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.0.0.tgz#7daafc0aca1c4ca3de15c61330373af4af5861fd" resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.0.0.tgz#7daafc0aca1c4ca3de15c61330373af4af5861fd"
integrity sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA== integrity sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==
@@ -3110,11 +3096,6 @@ p-try@^2.0.0:
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json-from-dist@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
package-json@^4.0.0: package-json@^4.0.0:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
@@ -3227,12 +3208,12 @@ path-parse@^1.0.6:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.11.1: path-scurry@^1.10.1:
version "1.11.1" version "1.10.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698"
integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==
dependencies: dependencies:
lru-cache "^10.2.0" lru-cache "^9.1.1 || ^10.0.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-type@^2.0.0: path-type@^2.0.0:
@@ -3621,13 +3602,6 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies: dependencies:
aproba "^1.1.1" aproba "^1.1.1"
russh@0.1.24:
version "0.1.24"
resolved "https://registry.yarnpkg.com/russh/-/russh-0.1.24.tgz#dce27a3bc63eb78024db60e6767bc80cbf523b9a"
integrity sha512-lLMtXHJKL5uwRxwoFNDx71T7+qCXiL80qyGCRgQjYMV10gaW2AlI6mqcz3FVH8dXvdgK2ZE8DuSwlhCBK7schA==
dependencies:
"@napi-rs/cli" "^2.18.3"
rxjs@^7.5.2, rxjs@^7.5.7: rxjs@^7.5.2, rxjs@^7.5.7:
version "7.5.7" version "7.5.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
@@ -3674,11 +3648,6 @@ semver@^7.3.5:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.6.3:
version "7.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
serialize-error@^5.0.0: serialize-error@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac"
@@ -3940,7 +3909,6 @@ strict-uri-encode@^2.0.0:
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
name string-width-cjs
version "4.2.3" version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -4018,7 +3986,6 @@ stringify-package@^1.0.0, stringify-package@^1.0.1:
integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
name strip-ansi-cjs
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -4450,6 +4417,13 @@ windows-native-registry@^3.2.1:
dependencies: dependencies:
node-addon-api "^3.1.0" node-addon-api "^3.1.0"
windows-process-tree@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.4.0.tgz#31ac49c5da557e628ce7e37a5800972173d3349a"
integrity sha512-9LunDnc1WwuhyLeTAXMFX8wbActGJtDCBaiapQXFYk/nO4W4X9YxOKV5g/lQL3XX69QYxveDbjVVrdnTt1qqCQ==
dependencies:
nan "^2.17.0"
worker-farm@^1.6.0, worker-farm@^1.7.0: worker-farm@^1.6.0, worker-farm@^1.7.0:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@@ -4458,7 +4432,6 @@ worker-farm@^1.6.0, worker-farm@^1.7.0:
errno "~0.1.7" errno "~0.1.7"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
name wrap-ansi-cjs
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==

View File

@@ -2,12 +2,14 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.security.automation.apple-events</key>
<true/>
<key>com.apple.security.cs.allow-jit</key> <key>com.apple.security.cs.allow-jit</key>
<true/> <true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key> <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/> <true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.device.microphone</key> <key>com.apple.security.device.microphone</key>
<true/> <true/>
<key>com.apple.security.device.camera</key> <key>com.apple.security.device.camera</key>

View File

@@ -32,13 +32,11 @@ extraResources:
- extras - extras
asarUnpack: asarUnpack:
- 'dist/*.map' - 'dist/*.map'
- node_modules/keytar/build/Release/*.node
- node_modules/**/*.node
win: win:
icon: "./build/windows/icon.ico" icon: "./build/windows/icon.ico"
artifactName: tabby-${version}-portable-${env.ARCH}.${ext} artifactName: tabby-${version}-portable-${env.ARCH}.${ext}
signtoolOptions: rfc3161TimeStampServer: http://timestamp.sectigo.com
rfc3161TimeStampServer: http://timestamp.sectigo.com
nsis: nsis:
oneClick: false oneClick: false
artifactName: tabby-${version}-setup-${env.ARCH}.${ext} artifactName: tabby-${version}-setup-${env.ARCH}.${ext}
@@ -53,7 +51,6 @@ mac:
entitlements: "./build/mac/entitlements.plist" entitlements: "./build/mac/entitlements.plist"
entitlementsInherit: "./build/mac/entitlements.plist" entitlementsInherit: "./build/mac/entitlements.plist"
extendInfo: extendInfo:
ElectronTeamID: ${teamId}
NSRequiresAquaSystemAppearance: false NSRequiresAquaSystemAppearance: false
NSCameraUsageDescription: "A subprocess requests access to the device's camera." NSCameraUsageDescription: "A subprocess requests access to the device's camera."
NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone." NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone."
@@ -63,7 +60,6 @@ mac:
NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder." NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder."
NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.' NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.'
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.' NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
NSAppleEventsUsageDescription: 'A subprocess requests permission to send AppleScript events to another application.'
linux: linux:
category: "Utility;TerminalEmulator;System" category: "Utility;TerminalEmulator;System"
@@ -72,8 +68,7 @@ linux:
executableArgs: executableArgs:
- "--no-sandbox" - "--no-sandbox"
desktop: desktop:
entry: StartupWMClass: tabby
StartupWMClass: tabby
snap: snap:
plugs: plugs:
- default - default
@@ -102,7 +97,3 @@ rpm:
- '_build_id_links none' - '_build_id_links none'
- '--replaces' - '--replaces'
- 'terminus-terminal' - 'terminus-terminal'
electronFuses:
runAsNode: false
enableNodeOptionsEnvironmentVariable: false
enableNodeCliInspectArguments: false

File diff suppressed because it is too large Load Diff

View File

@@ -1,64 +1,63 @@
@echo off :: Copyright (c) 2012 Martin Ridgers
rem -- Copyright (c) 2012 Martin Ridgers :: License: http://opensource.org/licenses/MIT
rem -- Portions Copyright (c) 2020-2024 Christopher Antos
rem -- License: http://opensource.org/licenses/MIT
@echo off
setlocal enableextensions setlocal enableextensions
set clink_profile_arg= set clink_profile_arg=
set clink_quiet_arg= set clink_quiet_arg=
rem -- Mimic cmd.exe's behaviour when starting from the start menu. :: Mimic cmd.exe's behaviour when starting from the start menu.
if /i "%~1"=="startmenu" ( if /i "%1"=="startmenu" (
cd /d "%userprofile%" cd /d "%userprofile%"
shift shift
) )
rem -- Check for the --profile option. :: Check for the --profile option.
if /i "%~1"=="--profile" ( if /i "%1"=="--profile" (
set clink_profile_arg=--profile "%~2" set clink_profile_arg=--profile "%~2"
shift shift
shift shift
) )
rem -- Check for the --quiet option. :: Check for the --quiet option.
if /i "%~1"=="--quiet" ( if /i "%1"=="--quiet" (
set clink_quiet_arg= --quiet set clink_quiet_arg= --quiet
shift shift
) )
rem -- If the .bat is run without any arguments, then start a cmd.exe instance. :: If the .bat is run without any arguments, then start a cmd.exe instance.
if _%1==_ ( if "%1"=="" (
call :launch call :launch
goto :end goto :end
) )
rem -- Test for autorun. :: Test for autorun.
if defined CLINK_NOAUTORUN if /i "%~1"=="inject" if /i "%~2"=="--autorun" goto :end if defined CLINK_NOAUTORUN if /i "%1"=="inject" if /i "%2"=="--autorun" goto :end
rem -- Forward to appropriate loader, and endlocal before inject tags the prompt. :: Endlocal before inject tags the prompt.
endlocal
:: Pass through to appropriate loader.
if /i "%processor_architecture%"=="x86" ( if /i "%processor_architecture%"=="x86" (
endlocal
"%~dp0\clink_x86.exe" %* "%~dp0\clink_x86.exe" %*
) else if /i "%processor_architecture%"=="arm64" ( ) else if /i "%processor_architecture%"=="arm64" (
endlocal
"%~dp0\clink_arm64.exe" %* "%~dp0\clink_arm64.exe" %*
) else if /i "%processor_architecture%"=="amd64" ( ) else if /i "%processor_architecture%"=="amd64" (
if defined processor_architew6432 ( if defined processor_architew6432 (
endlocal
"%~dp0\clink_x86.exe" %* "%~dp0\clink_x86.exe" %*
) else ( ) else (
endlocal
"%~dp0\clink_x64.exe" %* "%~dp0\clink_x64.exe" %*
) )
) )
goto :end :end
goto :eof
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:launch :launch
setlocal enableextensions setlocal
set WT_PROFILE_ID= set WT_PROFILE_ID=
set WT_SESSION= set WT_SESSION=
start "Clink" cmd.exe /s /k ""%~dpnx0" inject %clink_profile_arg%%clink_quiet_arg%" start "Clink" cmd.exe /s /k ""%~dpnx0" inject %clink_profile_arg%%clink_quiet_arg%"
endlocal endlocal
exit /b 0
:end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -4,10 +4,10 @@
# Override the built-in Readline defaults with ones that provide a more # Override the built-in Readline defaults with ones that provide a more
# enhanced Clink experience. # enhanced Clink experience.
set colored-completion-prefix on colored-completion-prefix on
set colored-stats on colored-stats on
set mark-symlinked-directories on mark-symlinked-directories on
set completion-auto-query-items on completion-auto-query-items on
set history-point-at-end-of-anchored-search on history-point-at-end-of-anchored-search on
set search-ignore-case on search-ignore-case on

View File

@@ -1,32 +1,34 @@
# When this file is named "default_settings" and is in the binaries # When this file is named "default_settings" and is in the binaries
# directory or profile directory, it provides enhanced default settings. # directory or profile directory, it provides enhanced default settings.
# Override built-in default settings with ones that provide a more # Override built-in default settings with ones that provide a more
# enhanced Clink experience. # enhanced Clink experience.
clink.default_bindings = windows autosuggest.enable = True
clink.autoupdate = off clink.default_bindings = windows
cmd.ctrld_exits = False cmd.ctrld_exits = False
color.arginfo = sgr 38;5;172 color.arginfo = sgr 38;5;172
color.argmatcher = sgr 1;38;5;40 color.argmatcher = sgr 1;38;5;40
color.cmd = bold color.cmd = sgr 1;38;5;231
color.cmdredir = sgr 38;5;172 color.cmdredir = sgr 38;5;172
color.cmdsep = sgr 38;5;135 color.cmdsep = sgr 38;5;214
color.comment_row = sgr 38;5;87;48;5;18 color.comment_row = sgr 38;5;87;48;5;18
color.description = sgr 38;5;39 color.description = sgr 38;5;39
color.doskey = sgr 1;38;5;75 color.doskey = sgr 1;38;5;75
color.executable = sgr 1;38;5;33 color.executable = sgr 1;38;5;33
color.filtered = bold color.filtered = sgr 38;5;231
color.flag = sgr 38;5;117 color.flag = sgr 38;5;117
color.hidden = sgr 38;5;160 color.hidden = sgr 38;5;160
color.histexpand = sgr 97;48;5;55 color.histexpand = sgr 97;48;5;55
color.horizscroll = sgr 38;5;16;48;5;30 color.horizscroll = sgr 38;5;16;48;5;30
color.input = sgr 38;5;214 color.input = sgr 38;5;222
color.readonly = sgr 38;5;28 color.readonly = sgr 38;5;28
color.selected_completion = sgr 7 color.selected_completion = sgr 38;5;16;48;5;254
color.selection = sgr 38;5;16;48;5;179 color.selection = sgr 38;5;16;48;5;179
color.unrecognized = sgr 38;5;203 color.suggestion = sgr 38;5;239
history.max_lines = 25000 color.unrecognized = sgr 38;5;203
history.time_stamp = show history.max_lines = 25000
match.expand_envvars = True history.time_stamp = show
match.substring = True match.expand_envvars = True
match.substring = True

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Afrikaans\n" "Language-Team: Afrikaans\n"
"Language: af_ZA\n" "Language: af_ZA\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Bulgarian\n" "Language-Team: Bulgarian\n"
"Language: bg_BG\n" "Language: bg_BG\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Czech\n" "Language-Team: Czech\n"
"Language: cs_CZ\n" "Language: cs_CZ\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -1935,7 +1935,7 @@ msgstr "Sériové připojení"
#: tabby-serial/src/profiles.ts:73 #: tabby-serial/src/profiles.ts:73
msgid "Serial: {description}" msgid "Serial: {description}"
msgstr "Sériový: {description}" msgstr "Seriální: {description}"
#: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Danish\n" "Language-Team: Danish\n"
"Language: da_DK\n" "Language: da_DK\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -100,12 +100,12 @@ msgstr "Tillader hurtigt at åbne en terminal i den valgte mappe"
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
msgid "Always dark" msgid "Always dark"
msgstr "Altid mørk" msgstr ""
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
msgid "Always light" msgid "Always light"
msgstr "Altid lys" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
#: tabby-terminal/src/settings.ts:14 #: tabby-terminal/src/settings.ts:14
@@ -211,7 +211,7 @@ msgstr "Sløring"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28
msgid "Bold font weight" msgid "Bold font weight"
msgstr "Fed skriftvægt" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80
@@ -272,7 +272,7 @@ msgstr "Ciphers"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5
msgid "Clear" msgid "Clear"
msgstr "Ryd" msgstr ""
#: tabby-core/src/services/profiles.service.ts:248 #: tabby-core/src/services/profiles.service.ts:248
msgid "Clear recent profiles" msgid "Clear recent profiles"
@@ -324,7 +324,7 @@ msgstr "Luk faner til højre"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182
msgid "Close the window after closing the last tab" msgid "Close the window after closing the last tab"
msgstr "Luk vinduet efter lukningen af den sidste fane" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33
#: tabby-core/src/tabContextMenu.ts:132 #: tabby-core/src/tabContextMenu.ts:132
@@ -337,16 +337,16 @@ msgstr "Farvetema"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
msgid "Color schemes" msgid "Color schemes"
msgstr "Farveskemaer" msgstr ""
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
msgid "Colors" msgid "Colors"
msgstr "Farver" msgstr ""
#: tabby-core/src/hotkeys.ts:72 #: tabby-core/src/hotkeys.ts:72
msgid "Combine all tabs into the current tab" msgid "Combine all tabs into the current tab"
msgstr "Kombinér alle faner til den aktuelle fane" msgstr ""
#: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4
msgid "Command line" msgid "Command line"
@@ -358,15 +358,15 @@ msgstr "Kommandoens stdin/stdout bruges i stedet for en netværksforbindelse"
#: tabby-core/src/services/commands.service.ts:105 #: tabby-core/src/services/commands.service.ts:105
msgid "Commands" msgid "Commands"
msgstr "Kommandoer" msgstr ""
#: tabby-core/src/theme.ts:16 #: tabby-core/src/theme.ts:16
msgid "Compact (legacy)" msgid "Compact (legacy)"
msgstr "Kompakt (ældre)" msgstr ""
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126
msgid "Config deleted" msgid "Config deleted"
msgstr "Konfig slettet" msgstr ""
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108
msgid "Config downloaded" msgid "Config downloaded"
@@ -428,7 +428,7 @@ msgstr "Kontekstmenu"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14
msgid "Controls the amount of space between elements" msgid "Controls the amount of space between elements"
msgstr "Styrer mængden af mellemrum mellem elementer" msgstr ""
#: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:240
#: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248
@@ -449,7 +449,7 @@ msgstr "Kopiér nuværende sti"
#: tabby-electron/src/sftpContextMenu.ts:29 #: tabby-electron/src/sftpContextMenu.ts:29
msgid "Copy full path" msgid "Copy full path"
msgstr "Kopiér hele stien" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97
msgid "Copy on select" msgid "Copy on select"
@@ -461,7 +461,7 @@ msgstr "Kopiér til udklipsholder"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103
msgid "Copy with formatting" msgid "Copy with formatting"
msgstr "Kopiér med formatering" msgstr ""
#: tabby-core/src/services/config.service.ts:425 #: tabby-core/src/services/config.service.ts:425
msgid "Could not decrypt config" msgid "Could not decrypt config"
@@ -469,12 +469,12 @@ msgstr "Kunne ikke dekryptere konfiguration"
#: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9
msgid "Create" msgid "Create"
msgstr "Opret" msgstr ""
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7
#: tabby-ssh/src/sftpContextMenu.ts:29 #: tabby-ssh/src/sftpContextMenu.ts:29
msgid "Create directory" msgid "Create directory"
msgstr "Opret mappe" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90
msgid "Current" msgid "Current"
@@ -498,7 +498,7 @@ msgstr "Markørens form"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46
msgid "Custom" msgid "Custom"
msgstr "Tilpasset" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90
msgid "Custom CSS" msgid "Custom CSS"
@@ -506,7 +506,7 @@ msgstr "Brugerdefineret CSS"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
msgid "Dark mode" msgid "Dark mode"
msgstr "Mørk tilstand" msgstr ""
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
msgid "Data bits" msgid "Data bits"
@@ -518,15 +518,15 @@ msgstr "Fejlfinding"
#: tabby-core/src/hotkeys.ts:256 #: tabby-core/src/hotkeys.ts:256
msgid "Decrease horizontal split size" msgid "Decrease horizontal split size"
msgstr "Reducér den vandrette splitstørrelse" msgstr ""
#: tabby-core/src/hotkeys.ts:248 #: tabby-core/src/hotkeys.ts:248
msgid "Decrease vertical split size" msgid "Decrease vertical split size"
msgstr "Reducér den lodrette splitstørrelse" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
msgid "Default \"Connect to\" type" msgid "Default \"Connect to\" type"
msgstr "Standard \"Forbind til\"-type" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
@@ -582,7 +582,7 @@ msgstr "Slet {fullPath}?"
#: tabby-terminal/src/hotkeys.ts:42 #: tabby-terminal/src/hotkeys.ts:42
msgid "Delete entire line" msgid "Delete entire line"
msgstr "Slet hele linjen" msgstr ""
#: tabby-terminal/src/hotkeys.ts:46 #: tabby-terminal/src/hotkeys.ts:46
msgid "Delete next word" msgid "Delete next word"
@@ -594,7 +594,7 @@ msgstr "Slet forrige ord"
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114
msgid "Delete the config on the remote side?" msgid "Delete the config on the remote side?"
msgstr "Slet konfigurationen på fjernsiden?" msgstr ""
#: tabby-settings/src/components/profilesSettingsTab.component.ts:226 #: tabby-settings/src/components/profilesSettingsTab.component.ts:226
msgid "Delete the group's profiles?" msgid "Delete the group's profiles?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de_DE\n" "Language: de_DE\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: English, United Kingdom\n" "Language-Team: English, United Kingdom\n"
"Language: en_GB\n" "Language: en_GB\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -2036,6 +2036,10 @@ msgstr ""
msgid "Show Serial connections" msgid "Show Serial connections"
msgstr "" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:73
msgid "Hide Tabby in tray or menu bar."
msgstr ""
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152
msgid "Show tabs in fullscreen mode" msgid "Show tabs in fullscreen mode"
msgstr "" msgstr ""
@@ -2044,6 +2048,10 @@ msgstr ""
msgid "Show toolbar" msgid "Show toolbar"
msgstr "" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:73
msgid "Hide tray"
msgstr ""
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45
msgid "Show vault contents" msgid "Show vault contents"
msgstr "" msgstr ""

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
"Language: es_ES\n" "Language: es_ES\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr_FR\n" "Language: fr_FR\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Croatian\n" "Language-Team: Croatian\n"
"Language: hr_HR\n" "Language: hr_HR\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"Language: id_ID\n" "Language: id_ID\n"
"PO-Revision-Date: 2025-01-22 22:02\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -23,7 +23,7 @@ msgstr "{name} salin"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77
msgid "A second font family used to display characters missing in the main font" msgid "A second font family used to display characters missing in the main font"
msgstr "Keluarga huruf kedua digunakan untuk menampilkan karakter yang hilang di huruf utama" msgstr "Keluarga font kedua digunakan untuk menampilkan karakter yang hilang di font utama"
#: tabby-core/src/components/transfersMenu.component.ts:49 #: tabby-core/src/components/transfersMenu.component.ts:49
msgid "Abort all" msgid "Abort all"
@@ -100,12 +100,12 @@ msgstr "Izinkan buka dengan cepat terminal di direktori terpilih"
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
msgid "Always dark" msgid "Always dark"
msgstr "Selalu gelap" msgstr ""
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
msgid "Always light" msgid "Always light"
msgstr "Selalu terang" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
#: tabby-terminal/src/settings.ts:14 #: tabby-terminal/src/settings.ts:14
@@ -255,7 +255,7 @@ msgstr "Ubah baud rate"
#: tabby-core/src/tabContextMenu.ts:133 #: tabby-core/src/tabContextMenu.ts:133
msgid "Change tab color" msgid "Change tab color"
msgstr "Rubah warna label" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12
msgid "Change the master passphrase" msgid "Change the master passphrase"
@@ -337,7 +337,7 @@ msgstr "Skema warna"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
msgid "Color schemes" msgid "Color schemes"
msgstr "Warna Skema" msgstr ""
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
@@ -362,7 +362,7 @@ msgstr "Perintah-perintah"
#: tabby-core/src/theme.ts:16 #: tabby-core/src/theme.ts:16
msgid "Compact (legacy)" msgid "Compact (legacy)"
msgstr "Padat (tua)" msgstr ""
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126
msgid "Config deleted" msgid "Config deleted"
@@ -449,7 +449,7 @@ msgstr "Salin jalur saat ini"
#: tabby-electron/src/sftpContextMenu.ts:29 #: tabby-electron/src/sftpContextMenu.ts:29
msgid "Copy full path" msgid "Copy full path"
msgstr "Salin alamat lengkap" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97
msgid "Copy on select" msgid "Copy on select"
@@ -1732,7 +1732,7 @@ msgstr "Ganti Nama"
#: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/hotkeys.ts:24
#: tabby-core/src/tabContextMenu.ts:121 #: tabby-core/src/tabContextMenu.ts:121
msgid "Rename tab" msgid "Rename tab"
msgstr "Ganti nama label" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3
msgid "Rendering" msgid "Rendering"
@@ -1762,15 +1762,15 @@ msgstr "Ukuran Semula"
#: tabby-serial/src/hotkeys.ts:14 #: tabby-serial/src/hotkeys.ts:14
msgid "Restart current serial session" msgid "Restart current serial session"
msgstr "Mulai ulang sesi serial saat ini" msgstr ""
#: tabby-ssh/src/hotkeys.ts:10 #: tabby-ssh/src/hotkeys.ts:10
msgid "Restart current SSH session" msgid "Restart current SSH session"
msgstr "Mulai ulang sesi SSH saat ini" msgstr ""
#: tabby-telnet/src/hotkeys.ts:10 #: tabby-telnet/src/hotkeys.ts:10
msgid "Restart current Telnet session" msgid "Restart current Telnet session"
msgstr "Mulai ulang sesi Telnet saat ini" msgstr ""
#: tabby-core/src/hotkeys.ts:64 #: tabby-core/src/hotkeys.ts:64
msgid "Restart tab" msgid "Restart tab"
@@ -1782,7 +1782,7 @@ msgstr "Mulai ulang aplikasi untuk menerapkan perubahan"
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316 #: tabby-settings/src/components/profilesSettingsTab.component.ts:316
msgid "Restore settings to defaults ?" msgid "Restore settings to defaults ?"
msgstr "Kembali ke settingan sebelumnya ?" msgstr ""
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36 #: tabby-settings/src/components/editProfileGroupModal.component.ts:36
msgid "Restore settings to inherited defaults ?" msgid "Restore settings to inherited defaults ?"
@@ -2401,7 +2401,7 @@ msgstr ""
#: tabby-ssh/src/session/ssh.ts:465 #: tabby-ssh/src/session/ssh.ts:465
msgid "Using preset password" msgid "Using preset password"
msgstr "Gunakan kata sandi yang telah disetel sebelumnya" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9
msgid "Vault" msgid "Vault"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
"Language: it_IT\n" "Language: it_IT\n"
"PO-Revision-Date: 2025-01-22 22:02\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -23,7 +23,7 @@ msgstr "{name} copia"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77
msgid "A second font family used to display characters missing in the main font" msgid "A second font family used to display characters missing in the main font"
msgstr "Un set di caratteri secondario usato per mostrare quelli mancanti del font principale" msgstr "Una famiglia di font secondaria usata per visualizzare quelle mancanti nella font principale"
#: tabby-core/src/components/transfersMenu.component.ts:49 #: tabby-core/src/components/transfersMenu.component.ts:49
msgid "Abort all" msgid "Abort all"
@@ -31,7 +31,7 @@ msgstr "Annulla tutto"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24
msgid "Accept and remember key" msgid "Accept and remember key"
msgstr "Accetta e ricorda chiave" msgstr "Accetta e ricorda la chiave"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25
msgid "Accept just this once" msgid "Accept just this once"
@@ -43,7 +43,7 @@ msgstr "Accessibilità"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27
msgid "Acrylic background" msgid "Acrylic background"
msgstr "Sfondo acrilico" msgstr "Sfondo traslucido"
#: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24
#: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11
@@ -192,7 +192,7 @@ msgstr "Modalità tasto backspace"
#: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/components/serialTab.component.ts:93
#: tabby-serial/src/profiles.ts:88 #: tabby-serial/src/profiles.ts:88
msgid "Baud rate" msgid "Baud rate"
msgstr "Velocità trasmissione" msgstr "Velocità di trasmissione"
#: tabby-terminal/src/hotkeys.ts:22 #: tabby-terminal/src/hotkeys.ts:22
msgid "Beginning of the line" msgid "Beginning of the line"
@@ -225,7 +225,8 @@ msgstr "Incolla tra parentesi (richiede una shell che lo supporti)"
#: tabby-terminal/src/services/multifocus.service.ts:19 #: tabby-terminal/src/services/multifocus.service.ts:19
msgid "Broadcast mode. Click anywhere to cancel." msgid "Broadcast mode. Click anywhere to cancel."
msgstr "Modalità broadcast. Fai clic ovunque per disabilitare." msgstr "Modalità broadcast. \n"
"Fai clic ovunque per annullare."
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50
#: tabby-core/src/services/profiles.service.ts:411 #: tabby-core/src/services/profiles.service.ts:411
@@ -479,7 +480,7 @@ msgstr "Crea cartella"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90
msgid "Current" msgid "Current"
msgstr "Attuale" msgstr "Corrente"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3
msgid "Current color scheme" msgid "Current color scheme"
@@ -487,7 +488,7 @@ msgstr "Tema in uso"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17
msgid "Current host key fingerprint" msgid "Current host key fingerprint"
msgstr "Firma chiave host attuale" msgstr "Firma della chiave host attuale"
#: tabby-core/src/tabContextMenu.ts:184 #: tabby-core/src/tabContextMenu.ts:184
msgid "Current process: {name}" msgid "Current process: {name}"
@@ -495,7 +496,7 @@ msgstr "Processo attuale: {name}"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51
msgid "Cursor shape" msgid "Cursor shape"
msgstr "Forma cursore" msgstr "Forma del cursore"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46
msgid "Custom" msgid "Custom"
@@ -507,7 +508,7 @@ msgstr "CSS personalizzato"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
msgid "Dark mode" msgid "Dark mode"
msgstr "Tema scuro" msgstr "Modalità scura"
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
msgid "Data bits" msgid "Data bits"
@@ -531,7 +532,7 @@ msgstr "\"Connetti a\" predefinito"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
msgstr "Tipo di connessione predefinita usato dalla funzione di connessione rapida (es. SSH, Telnet)" msgstr "Tipo di connessione predefinito usato dalla funzione di connessione rapida (es. SSH, Telnet)"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
msgid "Default profile for new tabs" msgid "Default profile for new tabs"
@@ -707,7 +708,7 @@ msgstr "La selezione con doppio clic si fermerà a questi caratteri"
#: tabby-core/src/tabContextMenu.ts:79 #: tabby-core/src/tabContextMenu.ts:79
msgid "Down" msgid "Down"
msgstr "In basso" msgstr "Giù"
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43
msgid "Download" msgid "Download"
@@ -791,7 +792,7 @@ msgstr "Cancella configurazione"
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12
msgid "Erase the Vault" msgid "Erase the Vault"
msgstr "Cancella cassaforte" msgstr "Cancella la cassaforte"
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6
msgid "Error in {plugin}:" msgid "Error in {plugin}:"
@@ -895,7 +896,7 @@ msgstr "Evidenzia il riquadro a destra"
#: tabby-core/src/theme.ts:34 #: tabby-core/src/theme.ts:34
msgid "Follow the color scheme" msgid "Follow the color scheme"
msgstr "Segui il tema di sistema" msgstr "Segui lo schema dei colori"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5
msgid "Font" msgid "Font"
@@ -1189,7 +1190,7 @@ msgstr "Lingua"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11
msgid "Last known host key fingerprint" msgid "Last known host key fingerprint"
msgstr "Ultima firma nota chiave host" msgstr "Ultima firma nota della chiave host"
#: tabby-ssh/src/tabContextMenu.ts:32 #: tabby-ssh/src/tabContextMenu.ts:32
msgid "Launch WinSCP" msgid "Launch WinSCP"
@@ -1208,7 +1209,7 @@ msgstr "Scopri come consentire a Tabby di rilevare la cartella di lavoro della s
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76
#: tabby-core/src/tabContextMenu.ts:80 #: tabby-core/src/tabContextMenu.ts:80
msgid "Left" msgid "Left"
msgstr "A sinistra" msgstr "Sinistra"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40
msgid "Lets the shell handle Meta key instead of OS" msgid "Lets the shell handle Meta key instead of OS"
@@ -1439,7 +1440,7 @@ msgstr "Nelle discussioni di GitHub"
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
msgid "Only close the tab when session is explicitly terminated" msgid "Only close the tab when session is explicitly terminated"
msgstr "Chiudi la scheda solo quando la sessione è esplicitamente terminata" msgstr "Chiude la scheda solo quando la sessione è esplicitamente terminata"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
msgid "Opacity" msgid "Opacity"
@@ -1476,11 +1477,11 @@ msgstr "Arancione"
#: tabby-electron/src/shells/macDefault.ts:25 #: tabby-electron/src/shells/macDefault.ts:25
msgid "OS default" msgid "OS default"
msgstr "Predefinito S.O." msgstr "Predefinito del OS"
#: tabby-electron/src/shells/winDefault.ts:43 #: tabby-electron/src/shells/winDefault.ts:43
msgid "OS default ({name})" msgid "OS default ({name})"
msgstr "Predefinito S.O. ({name})" msgstr "Predefinito del OS ({name})"
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46
msgid "Output is shown as a hexdump" msgid "Output is shown as a hexdump"
@@ -1678,7 +1679,7 @@ msgstr "Connessione raw socket"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166
msgid "Ready Timeout (Milliseconds)" msgid "Ready Timeout (Milliseconds)"
msgstr "Tempo stato pronto (millisecondi)" msgstr "Tempo di preparazione (in millisecondi)"
#: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:235
#: tabby-core/src/services/profiles.service.ts:249 #: tabby-core/src/services/profiles.service.ts:249
@@ -1694,7 +1695,7 @@ msgstr "Recente"
#: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:115
#: tabby-terminal/src/tabContextMenu.ts:119 #: tabby-terminal/src/tabContextMenu.ts:119
msgid "Reconnect" msgid "Reconnect"
msgstr "Riconnetti" msgstr "Riconetti"
#: tabby-terminal/src/hotkeys.ts:102 #: tabby-terminal/src/hotkeys.ts:102
msgid "Reconnect current tab (Serial/Telnet/SSH)" msgid "Reconnect current tab (Serial/Telnet/SSH)"
@@ -1723,7 +1724,7 @@ msgstr "Remoto"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124
msgid "Remove whitespace and newlines around the copied text" msgid "Remove whitespace and newlines around the copied text"
msgstr "Rimuovi spazi bianchi e a ritorni a capo dal testo copiato" msgstr "Rimuovi spazi bianchi e a riorni a capo dal testo copiato"
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26
#: tabby-core/src/tabContextMenu.ts:120 #: tabby-core/src/tabContextMenu.ts:120
@@ -1801,7 +1802,7 @@ msgstr "Riusa la sessione per più schede"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78
#: tabby-core/src/tabContextMenu.ts:78 #: tabby-core/src/tabContextMenu.ts:78
msgid "Right" msgid "Right"
msgstr "A destra" msgstr "Destra"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56
msgid "Right click" msgid "Right click"
@@ -2011,7 +2012,7 @@ msgstr "Visualizza predefiniti"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146
msgid "Show Mixer" msgid "Show Mixer"
msgstr "Visualizza mixer" msgstr "Visualizza Mixer"
#: tabby-core/src/hotkeys.ts:56 #: tabby-core/src/hotkeys.ts:56
msgid "Show pane labels (for rearranging)" msgid "Show pane labels (for rearranging)"
@@ -2177,7 +2178,7 @@ msgstr "Cambia l'implementazione del frontend del terminale (sperimentale)"
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4
msgid "Sync" msgid "Sync"
msgstr "Sincronizzazione" msgstr "Sincronizazione"
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53
msgid "Sync automatically" msgid "Sync automatically"
@@ -2360,7 +2361,7 @@ msgstr "Sgancia"
#: tabby-core/src/tabContextMenu.ts:81 #: tabby-core/src/tabContextMenu.ts:81
msgid "Up" msgid "Up"
msgstr "In alto" msgstr "Su"
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14
#: tabby-electron/src/services/updater.service.ts:133 #: tabby-electron/src/services/updater.service.ts:133
@@ -2382,7 +2383,7 @@ msgstr "Carica come nuova configurazione"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39
msgid "Use {altKeyName} as the Meta key" msgid "Use {altKeyName} as the Meta key"
msgstr "Come chiave meta usa {altKeyName} " msgstr "Usa {altKeyName} come chiave Meta"
#: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5
msgid "Use ConPTY" msgid "Use ConPTY"
@@ -2428,7 +2429,7 @@ msgstr "La cassaforte non è configurata"
#: tabby-core/src/services/fileProviders.service.ts:40 #: tabby-core/src/services/fileProviders.service.ts:40
msgid "Vault master passphrase needs to be set to allow storing secrets" msgid "Vault master passphrase needs to be set to allow storing secrets"
msgstr "Per consentire la memorizzazione di dati cifrati deve essere impostata la frase segreta principale della cassaforte" msgstr "Per consentire la memorizzazione di dati cifrati deve essere impostata la frase segreta principale della cassaforte."
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11
msgid "Verify host keys when connecting" msgid "Verify host keys when connecting"
@@ -2464,7 +2465,7 @@ msgstr "Attenzione: la chiave dell'host remoto è improvvisamente cambiata!"
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67
msgid "We're only tracking your Tabby and OS versions." msgid "We're only tracking your Tabby and OS versions."
msgstr "Monitoreremo soltanto le versioni di Tabby e del Sistema Operativo." msgstr "Monitoreremo soltanto le versioni di Tabby e del sistema operativo."
#: tabby-core/src/components/welcomeTab.component.ts:25 #: tabby-core/src/components/welcomeTab.component.ts:25
msgid "Welcome" msgid "Welcome"
@@ -2509,7 +2510,7 @@ msgstr "Dimensione finestra fuori dal bordo"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52
msgid "Window frame" msgid "Window frame"
msgstr "Cornice della finestra" msgstr "Cornice finestra"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165
msgid "Windows" msgid "Windows"
@@ -2525,7 +2526,7 @@ msgstr "Percorso WinSCP"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74
msgid "Word separators" msgid "Word separators"
msgstr "Separatori di parole" msgstr "Separatori parole"
#: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10
msgid "Working directory" msgid "Working directory"
@@ -2554,7 +2555,7 @@ msgstr "Giallo"
#: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4
msgid "You can change it later, but it's unrecoverable if forgotten." msgid "You can change it later, but it's unrecoverable if forgotten."
msgstr "Si può modificare più tardi, ma è irrecuperabile se dimenticata." msgstr "Si può cambiare più tardi, ma è irrecuperabile se dimenticata."
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7
msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed."
@@ -2562,11 +2563,11 @@ msgstr "In questo momento potresti essere sotto un attacco man-in-the-middle, o
#: tabby-terminal/src/hotkeys.ts:54 #: tabby-terminal/src/hotkeys.ts:54
msgid "Zoom in" msgid "Zoom in"
msgstr "Zoom avanti" msgstr "Zoom +"
#: tabby-terminal/src/hotkeys.ts:58 #: tabby-terminal/src/hotkeys.ts:58
msgid "Zoom out" msgid "Zoom out"
msgstr "Zoom indietro" msgstr "Zoom -"
#: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43
#: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5

View File

@@ -10,11 +10,11 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Japanese\n" "Language-Team: Japanese\n"
"Language: ja_JP\n" "Language: ja_JP\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
msgstr "\"{command}\"が実行中です。閉じてもよろしいですか?" msgstr "\"{command}\"が実行中です。閉じすか?"
#: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:78
#: tabby-settings/src/components/profilesSettingsTab.component.ts:88 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88
@@ -23,7 +23,7 @@ msgstr "{name} コピー"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77
msgid "A second font family used to display characters missing in the main font" msgid "A second font family used to display characters missing in the main font"
msgstr "メインフォントに不足している文字を表示する際に使用されます" msgstr "既定フォントに不足している文字を表示する際に使用されます"
#: tabby-core/src/components/transfersMenu.component.ts:49 #: tabby-core/src/components/transfersMenu.component.ts:49
msgid "Abort all" msgid "Abort all"
@@ -64,7 +64,7 @@ msgstr "追加..."
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84
msgid "Additional space between lines" msgid "Additional space between lines"
msgstr "行と行の間隔を広げます" msgstr "行間にスペースを空けます"
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61
@@ -79,15 +79,15 @@ msgstr "SSHエージェント"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134
msgid "Agent forwarding" msgid "Agent forwarding"
msgstr "SSHエージェント転送" msgstr "SSHエージェント転送"
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35
msgid "Agent pipe path" msgid "Agent pipe path"
msgstr "SSHエージェントのパイプ" msgstr "SSHエージェントのパイプのパス"
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24
msgid "Agent type" msgid "Agent type"
msgstr "SSHエージェントの指定" msgstr "SSHエージェントの種類"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169
msgid "Allows opening .bat files in tabs, but breaks some shells" msgid "Allows opening .bat files in tabs, but breaks some shells"
@@ -185,7 +185,7 @@ msgstr "透過の種類"
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
msgid "Backspace key mode" msgid "Backspace key mode"
msgstr "Backspaceキー" msgstr "BackSpaceキー"
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
#: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/components/serialTab.component.ts:93
@@ -354,7 +354,7 @@ msgstr "コマンドライン"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13
msgid "Command's stdin/stdout is used instead of a network connection" msgid "Command's stdin/stdout is used instead of a network connection"
msgstr "ネットワーク接続の代わりにコマンドの stdin/stdout 使用ます" msgstr "ネットワーク接続の代わりにコマンドの stdin/stdout 使用されます"
#: tabby-core/src/services/commands.service.ts:105 #: tabby-core/src/services/commands.service.ts:105
msgid "Commands" msgid "Commands"
@@ -486,7 +486,7 @@ msgstr "使用中の配色"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17
msgid "Current host key fingerprint" msgid "Current host key fingerprint"
msgstr "現在のホストのフィンガープリント" msgstr "使用中のホストキーのフィンガープリント"
#: tabby-core/src/tabContextMenu.ts:184 #: tabby-core/src/tabContextMenu.ts:184
msgid "Current process: {name}" msgid "Current process: {name}"
@@ -526,7 +526,7 @@ msgstr "垂直方向の分割サイズを縮小"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
msgid "Default \"Connect to\" type" msgid "Default \"Connect to\" type"
msgstr "既定の接続方式" msgstr "既定の接続"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
@@ -618,7 +618,7 @@ msgstr "デバイス"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10
msgid "Direct" msgid "Direct"
msgstr "直接接続" msgstr "直接"
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57
msgid "Disable" msgid "Disable"
@@ -630,7 +630,7 @@ msgstr "動的なタブ名を無効にする"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218
msgid "Disable fluent background while dragging" msgid "Disable fluent background while dragging"
msgstr "ドラッグ中はFluent背景を無効する" msgstr "ドラッグ中はFluentを無効する"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204
msgid "Disable GPU acceleration" msgid "Disable GPU acceleration"
@@ -757,7 +757,7 @@ msgstr "アップデートが利用可能になったら自動的にインスト
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211
msgid "Enable fluent background option" msgid "Enable fluent background option"
msgstr "Fluent背景オプションを有効にする" msgstr "Fluent背景設定を有効にする"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16
msgid "Enable font ligatures" msgid "Enable font ligatures"
@@ -806,7 +806,7 @@ msgstr "例:"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212
msgid "Experimental Windows 10 background style known to cause issues" msgid "Experimental Windows 10 background style known to cause issues"
msgstr "不具合が報告されているWindows10風の実験的な背景" msgstr "Windows10では問題が発生する場合があります。"
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28
msgid "Export" msgid "Export"
@@ -834,7 +834,7 @@ msgstr "固定"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219
msgid "Fluent background sometimes causes drag lag" msgid "Fluent background sometimes causes drag lag"
msgstr "Fluent背景はドラッグ中にラグを発生させることがあります" msgstr "Fluentはドラッグ中にラグを発生させる場合があります"
#: tabby-terminal/src/tabContextMenu.ts:82 #: tabby-terminal/src/tabContextMenu.ts:82
msgid "Focus all panes" msgid "Focus all panes"
@@ -1039,11 +1039,11 @@ msgstr "ホスト"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206
msgid "Host key" msgid "Host key"
msgstr "ホスト" msgstr "ホストキー"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3
msgid "Host key verification" msgid "Host key verification"
msgstr "ホストの検証" msgstr "ホストキーの検証"
#: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2
#: tabby-settings/src/settings.ts:15 #: tabby-settings/src/settings.ts:15
@@ -1052,7 +1052,7 @@ msgstr "ホットキー"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83
msgid "How Tabby presents itself through environment vars" msgid "How Tabby presents itself through environment vars"
msgstr "環境変数を利用してTabbyを他の端末として認識させます" msgstr "環境変数を利用してTabbyを他の端末のように扱わせます"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24
msgid "HTTP proxy" msgid "HTTP proxy"
@@ -1131,7 +1131,7 @@ msgstr "無効な構文"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43
msgid "Jump host" msgid "Jump host"
msgstr "踏み台サーバー" msgstr "ジャンプサーバー"
#: tabby-terminal/src/hotkeys.ts:34 #: tabby-terminal/src/hotkeys.ts:34
msgid "Jump to next word" msgid "Jump to next word"
@@ -1188,7 +1188,7 @@ msgstr "言語"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11
msgid "Last known host key fingerprint" msgid "Last known host key fingerprint"
msgstr "最後に使われたホストのフィンガープリント" msgstr "最後に使用したホストキーのフィンガープリント"
#: tabby-ssh/src/tabContextMenu.ts:32 #: tabby-ssh/src/tabContextMenu.ts:32
msgid "Launch WinSCP" msgid "Launch WinSCP"
@@ -1201,7 +1201,7 @@ msgstr "現在のSSHセッションでWinSCPを起動"
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16
#: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7
msgid "Learn how to allow Tabby to detect remote shell's working directory." msgid "Learn how to allow Tabby to detect remote shell's working directory."
msgstr "リモートの作業ディレクトリを自動検出する方法をご紹介します。" msgstr "Tabbyにリモートの作業ディレクトリを検出させる方法をご紹介します。"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76
@@ -1227,7 +1227,7 @@ msgstr "Enterキーを押すと入力が送信されます"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83
msgid "Line padding" msgid "Line padding"
msgstr "行間" msgstr "行間の大きさ"
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21
msgid "Loading" msgid "Loading"
@@ -1299,7 +1299,7 @@ msgstr "\"未分類\" に移動"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197
msgid "Moving the mouse over an inactive pane will cause it to activate" msgid "Moving the mouse over an inactive pane will cause it to activate"
msgstr "マウスの移動に合わせてアクティブなペインを切り替えます。" msgstr "マウスの移動アクティブなペインを切り替えることができます。"
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12
@@ -1325,7 +1325,7 @@ msgstr "新規"
#: tabby-local/src/tabContextMenu.ts:53 #: tabby-local/src/tabContextMenu.ts:53
msgid "New admin tab" msgid "New admin tab"
msgstr "新しい管理者権限タブ" msgstr "新しい管理者タブ"
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58
msgid "New config on {platform}" msgid "New config on {platform}"
@@ -1366,7 +1366,7 @@ msgstr "新しいタブ: {profile}"
#: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/buttonProvider.ts:20
#: tabby-local/src/tabContextMenu.ts:27 #: tabby-local/src/tabContextMenu.ts:27
msgid "New terminal" msgid "New terminal"
msgstr "新しい端末" msgstr "新しいターミナル"
#: tabby-electron/src/hotkeys.ts:10 #: tabby-electron/src/hotkeys.ts:10
msgid "New window" msgid "New window"
@@ -1511,11 +1511,11 @@ msgstr "リモートを上書きして同期"
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76
msgid "Overwrite the config on the remote side and start syncing?" msgid "Overwrite the config on the remote side and start syncing?"
msgstr "リモート上の設定を上書きして同期を開始しますか?" msgstr "リモート上の設定を上書きして同期を開始しますか?"
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96
msgid "Overwrite the local config and start syncing?" msgid "Overwrite the local config and start syncing?"
msgstr "現在のローカル上の設定を上書きして、同期を開始しますか?" msgstr "これまでのローカル上の設定を上書きして、同期を開始しますか?"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189
msgid "Pane resize step" msgid "Pane resize step"
@@ -1535,7 +1535,7 @@ msgstr "パリティ"
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64
msgid "Partial config sync is not possible when the config is encrypted via Vault." msgid "Partial config sync is not possible when the config is encrypted via Vault."
msgstr "Vaultによって設定ファイルを暗号化した場合、設定の一部だけを同期から外すことはできません。" msgstr "設定ファイルがVaultによって暗号化されている場合、部分的な設定の同期はできません。"
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
msgid "Pass-through" msgid "Pass-through"
@@ -1562,11 +1562,11 @@ msgstr "クリップボードから貼り付け"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63
msgid "Paste if no selection, else copy" msgid "Paste if no selection, else copy"
msgstr "通常は貼り付け、テキスト選択時のみコピー" msgstr "通常は貼り付け、テキスト選択時のみコピー"
#: tabby-terminal/src/api/baseTerminalTab.component.ts:528 #: tabby-terminal/src/api/baseTerminalTab.component.ts:528
msgid "Paste multiple lines?" msgid "Paste multiple lines?"
msgstr "複数行貼り付けを実行してもよろしいですか?" msgstr "複数行貼り付けを実行してもよろしいですか?"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68
msgid "Paste on middle-click" msgid "Paste on middle-click"
@@ -1956,11 +1956,11 @@ msgstr "Tabbyを %COMSPEC% に設定"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69
msgid "Set to 0 to disable recent profiles" msgid "Set to 0 to disable recent profiles"
msgstr "セレクターに最近使用したプロファイルを表示したくない場合は0に設定してください" msgstr "最近使用したプロファイルをセレクターに表示しない場合は0に設定してください"
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36
msgid "Sets the SSH agent's named pipe path." msgid "Sets the SSH agent's named pipe path."
msgstr "SSHエージェントの名前付きパイプのパスを指定します。" msgstr "SSHエージェントの名前付きパイプのパスを設定"
#: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/buttonProvider.ts:28
#: tabby-settings/src/components/settingsTab.component.ts:57 #: tabby-settings/src/components/settingsTab.component.ts:57
@@ -1990,11 +1990,11 @@ msgstr "{type} プロファイルセレクターを表示"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117
msgid "Show a confirmation box when pasting multiple lines" msgid "Show a confirmation box when pasting multiple lines"
msgstr "複数行貼り付けをする際に確認画面を表示します" msgstr "複数行貼り付ける際に確認ボックスを表示します"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75
msgid "Show built-in profiles in selector" msgid "Show built-in profiles in selector"
msgstr "標準プロファイルをセレクターに表示" msgstr "セレクターに標準プロファイルを表示する"
#: tabby-core/src/hotkeys.ts:12 #: tabby-core/src/hotkeys.ts:12
msgid "Show command selector" msgid "Show command selector"
@@ -2089,7 +2089,7 @@ msgstr "ソースコード"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13
msgid "Spaciness" msgid "Spaciness"
msgstr "UI間隔" msgstr "UI間隔"
#: tabby-core/src/tabContextMenu.ts:75 #: tabby-core/src/tabContextMenu.ts:75
msgid "Split" msgid "Split"
@@ -2268,7 +2268,7 @@ msgstr "端末の識別情報"
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7
msgid "Thank you for downloading Tabby!" msgid "Thank you for downloading Tabby!"
msgstr "Tabbyをダウンロードしてくださり、ありがとうございます!" msgstr "Tabbyをダウンロードしていただきありがとうございます!"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5
msgid "Theme" msgid "Theme"
@@ -2280,7 +2280,7 @@ msgstr "ファイル転送を使用中"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102
msgid "There is a saved password for this connection" msgid "There is a saved password for this connection"
msgstr "この接続に使用するパスワード保存ています。" msgstr "この接続に利用可能なパスワード保存されています。"
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102
msgid "These apply to all profiles of a given type" msgid "These apply to all profiles of a given type"
@@ -2397,7 +2397,7 @@ msgstr "ユーザー名"
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25
msgid "Using CONNECT method" msgid "Using CONNECT method"
msgstr "CONNECTメソッド使用します" msgstr "CONNECTメソッド使用"
#: tabby-ssh/src/session/ssh.ts:465 #: tabby-ssh/src/session/ssh.ts:465
msgid "Using preset password" msgid "Using preset password"
@@ -2426,11 +2426,11 @@ msgstr "Vaultが設定されていません"
#: tabby-core/src/services/fileProviders.service.ts:40 #: tabby-core/src/services/fileProviders.service.ts:40
msgid "Vault master passphrase needs to be set to allow storing secrets" msgid "Vault master passphrase needs to be set to allow storing secrets"
msgstr "機密性の高い情報を保存するには、Vaultマスターパスフレーズを設定する必要があります" msgstr "機密性の高い情報を保存するには、Vaultマスターパスフレーズを設定する必要があります"
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11
msgid "Verify host keys when connecting" msgid "Verify host keys when connecting"
msgstr "接続時にホスト鍵を検証" msgstr "接続時にホストキーを確認"
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75
msgid "Version" msgid "Version"
@@ -2478,7 +2478,7 @@ msgstr "セッション終了時"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
msgid "When enabled, links are only clickable while holding this key" msgid "When enabled, links are only clickable while holding this key"
msgstr "有効にすると、特定のキーを押しながらクリックした時のみリンクを開きます" msgstr "有効にすると、特定のキーを押しながらクリックした時のみリンクが開けるようになります"
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18
msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgid "When WinSCP is detected, you can launch an SCP session from the context menu."
@@ -2556,7 +2556,7 @@ msgstr "後から変更できますが、忘れた場合復元することはで
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7
msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed."
msgstr "現在中間者攻撃を受けているか、もしくはホストが変更された可能性があります。" msgstr "現在中間者攻撃を受けているか、もしくはホストキーが変更された可能性があります。"
#: tabby-terminal/src/hotkeys.ts:54 #: tabby-terminal/src/hotkeys.ts:54
msgid "Zoom in" msgid "Zoom in"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"Language: ko_KR\n" "Language: ko_KR\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Polish\n" "Language-Team: Polish\n"
"Language: pl_PL\n" "Language: pl_PL\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Portuguese, Brazilian\n" "Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Portuguese\n" "Language-Team: Portuguese\n"
"Language: pt_PT\n" "Language: pt_PT\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -39,7 +39,7 @@ msgstr "Aceitar apenas desta vez"
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84
msgid "Accessibility" msgid "Accessibility"
msgstr "acessibilidade" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27
msgid "Acrylic background" msgid "Acrylic background"
@@ -100,12 +100,12 @@ msgstr "Permite abrir um terminal rapidamente na pasta selecionada"
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
msgid "Always dark" msgid "Always dark"
msgstr "sempre escuro" msgstr ""
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
msgid "Always light" msgid "Always light"
msgstr "Sempre luminoso" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
#: tabby-terminal/src/settings.ts:14 #: tabby-terminal/src/settings.ts:14
@@ -498,7 +498,7 @@ msgstr "Formato do cursor"
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46
msgid "Custom" msgid "Custom"
msgstr "Personalizado" msgstr ""
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90
msgid "Custom CSS" msgid "Custom CSS"
@@ -538,7 +538,7 @@ msgstr "Perfil padrão para novas abas"
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
msgid "Default profile group settings" msgid "Default profile group settings"
msgstr "Parâmetros do grupo de perfis por defeito" msgstr ""
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
msgid "Default profile settings" msgid "Default profile settings"
@@ -736,7 +736,7 @@ msgstr "Editar"
#: tabby-electron/src/sftpContextMenu.ts:35 #: tabby-electron/src/sftpContextMenu.ts:35
msgid "Edit locally" msgid "Edit locally"
msgstr "Editar localmente" msgstr ""
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58
msgid "Enable" msgid "Enable"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"Language: ru_RU\n" "Language: ru_RU\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -660,7 +660,7 @@ msgstr "Отключиться от {host}?"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30
msgid "Display images via Sixel escape sequences" msgid "Display images via Sixel escape sequences"
msgstr "Отображать изображения при помощи управляющей последовательности Sixel" msgstr "Отображать изображения при помощи сиксельной управляющей последовательности"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85
msgid "Display on" msgid "Display on"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Serbian (Cyrillic)\n" "Language-Team: Serbian (Cyrillic)\n"
"Language: sr_SP\n" "Language: sr_SP\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -342,7 +342,7 @@ msgstr ""
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
msgid "Colors" msgid "Colors"
msgstr "Боје" msgstr ""
#: tabby-core/src/hotkeys.ts:72 #: tabby-core/src/hotkeys.ts:72
msgid "Combine all tabs into the current tab" msgid "Combine all tabs into the current tab"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Swedish\n" "Language-Team: Swedish\n"
"Language: sv_SE\n" "Language: sv_SE\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -35,7 +35,7 @@ msgstr "Acceptera och kom ihåg nyckel"
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25
msgid "Accept just this once" msgid "Accept just this once"
msgstr "Acceptera bara den här gången" msgstr "Acceptera bara denna gång"
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84
msgid "Accessibility" msgid "Accessibility"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Turkish\n" "Language-Team: Turkish\n"
"Language: tr_TR\n" "Language: tr_TR\n"
"PO-Revision-Date: 2025-01-22 22:02\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -966,7 +966,7 @@ msgstr "Hazır bir GitHub sorunu oluşturun"
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25
msgid "Get" msgid "Get"
msgstr "Yükle" msgstr "Getir"
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18
msgid "Get it from the Tabby Web settings window" msgid "Get it from the Tabby Web settings window"

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Ukrainian\n" "Language-Team: Ukrainian\n"
"Language: uk_UA\n" "Language: uk_UA\n"
"PO-Revision-Date: 2024-12-24 22:58\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -100,12 +100,12 @@ msgstr "Дозволяє швидко відкрити термінал у ви
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
msgid "Always dark" msgid "Always dark"
msgstr "Завжди темна" msgstr "Завжди темно"
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
msgid "Always light" msgid "Always light"
msgstr "Завжди світла" msgstr "Завжди світити"
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
#: tabby-terminal/src/settings.ts:14 #: tabby-terminal/src/settings.ts:14

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Chinese Simplified\n" "Language-Team: Chinese Simplified\n"
"Language: zh_CN\n" "Language: zh_CN\n"
"PO-Revision-Date: 2025-01-22 22:02\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -43,7 +43,7 @@ msgstr "辅助功能"
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27
msgid "Acrylic background" msgid "Acrylic background"
msgstr "毛玻璃背景" msgstr "亚克力背景"
#: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24
#: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11

View File

@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: tabby\n" "Project-Id-Version: tabby\n"
"Language-Team: Chinese Traditional\n" "Language-Team: Chinese Traditional\n"
"Language: zh_TW\n" "Language: zh_TW\n"
"PO-Revision-Date: 2025-01-22 22:02\n" "PO-Revision-Date: 2024-03-11 20:11\n"
#: tabby-local/src/components/terminalTab.component.ts:113 #: tabby-local/src/components/terminalTab.component.ts:113
msgid "\"{command}\" is still running. Close?" msgid "\"{command}\" is still running. Close?"
@@ -1390,7 +1390,7 @@ msgstr "無色彩"
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85
msgid "No modifier" msgid "No modifier"
msgstr "無修飾鍵" msgstr "不可修改"
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41
msgid "None" msgid "None"

View File

@@ -12,7 +12,6 @@
"@angular/platform-browser-dynamic": "^15.2.6", "@angular/platform-browser-dynamic": "^15.2.6",
"@biesbjerg/ngx-translate-extract-marker": "^1.0.0", "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
"@electron/notarize": "^1.2.3", "@electron/notarize": "^1.2.3",
"@electron/rebuild": "^4",
"@fortawesome/fontawesome-free": "^6.4.0", "@fortawesome/fontawesome-free": "^6.4.0",
"@ng-bootstrap/ng-bootstrap": "^14.1.0", "@ng-bootstrap/ng-bootstrap": "^14.1.0",
"@ngtools/webpack": "^15.2.5", "@ngtools/webpack": "^15.2.5",
@@ -40,10 +39,11 @@
"cross-env": "7.0.3", "cross-env": "7.0.3",
"css-loader": "^6.7.3", "css-loader": "^6.7.3",
"deep-equal": "2.0.5", "deep-equal": "2.0.5",
"electron": "^36.3", "electron": "^27.0.4",
"electron-builder": "^26.0", "electron-builder": "^24.6.4",
"electron-download": "^4.1.1", "electron-download": "^4.1.1",
"electron-installer-snap": "^5.1.0", "electron-installer-snap": "^5.1.0",
"electron-rebuild": "^3.2.9",
"eslint": "^8.48.0", "eslint": "^8.48.0",
"eslint-import-resolver-typescript": "^3.6.0", "eslint-import-resolver-typescript": "^3.6.0",
"eslint-plugin-import": "^2.28.1", "eslint-plugin-import": "^2.28.1",
@@ -53,9 +53,9 @@
"html-loader": "4.2.0", "html-loader": "4.2.0",
"json-loader": "^0.5.7", "json-loader": "^0.5.7",
"lru-cache": "^6.0.0", "lru-cache": "^6.0.0",
"macos-release": "^3.3.0", "macos-release": "^3.1.0",
"ngx-toastr": "^16.0.2", "ngx-toastr": "^16.0.2",
"node-abi": "^4", "node-abi": "^3.51.0",
"npmlog": "6.0.2", "npmlog": "6.0.2",
"npx": "^10.2.2", "npx": "^10.2.2",
"patch-package": "^6.4.7", "patch-package": "^6.4.7",
@@ -76,6 +76,7 @@
"source-code-pro": "^2.38.0", "source-code-pro": "^2.38.0",
"source-map-loader": "^4.0.1", "source-map-loader": "^4.0.1",
"source-sans-pro": "3.6.0", "source-sans-pro": "3.6.0",
"ssh2": "^1.14.0",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"svg-inline-loader": "^0.8.2", "svg-inline-loader": "^0.8.2",
"thenby": "^1.3.4", "thenby": "^1.3.4",
@@ -96,9 +97,7 @@
"*/pug": "^3", "*/pug": "^3",
"lzma-native": "^8.0.6", "lzma-native": "^8.0.6",
"**/graceful-fs": "^4.2.4", "**/graceful-fs": "^4.2.4",
"nan": "2.22.2", "nan": "2.17.0"
"node-abi": "4.9.0",
"node-gyp": "^10.0.0"
}, },
"scripts": { "scripts": {
"build": "npm run build:typings && node scripts/build-modules.mjs", "build": "npm run build:typings && node scripts/build-modules.mjs",

View File

@@ -1,8 +1,8 @@
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
index d159c17..eb48466 100644 index 49f6dca..0ea11f2 100644
--- a/node_modules/app-builder-lib/out/appInfo.js --- a/node_modules/app-builder-lib/out/appInfo.js
+++ b/node_modules/app-builder-lib/out/appInfo.js +++ b/node_modules/app-builder-lib/out/appInfo.js
@@ -116,9 +116,7 @@ class AppInfo { @@ -112,9 +112,7 @@ class AppInfo {
return this.info.metadata.name; return this.info.metadata.name;
} }
get linuxPackageName() { get linuxPackageName() {

39
patches/ssh2+1.11.0.patch Normal file
View File

@@ -0,0 +1,39 @@
diff --git a/node_modules/ssh2/lib/protocol/keyParser.js b/node_modules/ssh2/lib/protocol/keyParser.js
index 9860e3f..ee82e51 100644
--- a/node_modules/ssh2/lib/protocol/keyParser.js
+++ b/node_modules/ssh2/lib/protocol/keyParser.js
@@ -15,6 +15,7 @@ const {
sign: sign_,
verify: verify_,
} = require('crypto');
+const { createVerify: createVerifyDSS } = require('browserify-sign')
const supportedOpenSSLCiphers = getCiphers();
const { Ber } = require('asn1');
@@ -404,6 +405,17 @@ const BaseKey = {
return new Error('No public key available');
if (!algo || typeof algo !== 'string')
algo = this[SYM_HASH_ALGO];
+
+ if (algo === 'dss1') {
+ const verifier = createVerifyDSS('DSA-SHA1');
+ verifier.update(data);
+ try {
+ return verifier.verify(pem, signature);
+ } catch (ex) {
+ return ex;
+ }
+ }
+
try {
return verify_(algo, data, pem, signature);
} catch (ex) {
@@ -1343,7 +1355,7 @@ function parseDER(data, baseType, comment, fullType) {
return new Error('Malformed OpenSSH public key');
pubPEM = genOpenSSLDSAPub(p, q, g, y);
pubSSH = genOpenSSHDSAPub(p, q, g, y);
- algo = 'sha1';
+ algo = 'dss1';
break;
}
case 'ssh-ed25519': {

View File

@@ -25,7 +25,7 @@ builder({
}, },
] : undefined, ] : undefined,
}, },
publish: (process.env.KEYGEN_TOKEN && isTag) ? 'always' : 'never', publish: process.env.KEYGEN_TOKEN ? isTag ? 'always' : 'onTagOrDraft' : 'never',
}).catch(e => { }).catch(e => {
console.error(e) console.error(e)
process.exit(1) process.exit(1)

View File

@@ -24,11 +24,13 @@ builder({
config: { config: {
extraMetadata: { extraMetadata: {
version: vars.version, version: vars.version,
teamId: process.env.APPLE_TEAM_ID,
}, },
mac: { mac: {
identity: !process.env.CI || process.env.CSC_LINK ? undefined : null, identity: !process.env.CI || process.env.CSC_LINK ? undefined : null,
notarize: !!process.env.APPLE_TEAM_ID, notarize: process.env.APPLE_TEAM_ID ? {
appBundleId: 'org.tabby',
teamId: process.env.APPLE_TEAM_ID,
} : false,
}, },
npmRebuild: process.env.ARCH !== 'arm64', npmRebuild: process.env.ARCH !== 'arm64',
publish: process.env.KEYGEN_TOKEN ? [ publish: process.env.KEYGEN_TOKEN ? [
@@ -39,7 +41,7 @@ builder({
}, },
] : undefined, ] : undefined,
}, },
publish: (process.env.KEYGEN_TOKEN && isTag) ? 'always' : 'never', publish: process.env.KEYGEN_TOKEN ? isTag ? 'always' : 'onTagOrDraft' : 'never',
}).catch(e => { }).catch(e => {
console.error(e) console.error(e)
process.exit(1) process.exit(1)

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
import { rebuild } from '@electron/rebuild' import { rebuild } from 'electron-rebuild'
import * as path from 'path' import * as path from 'path'
import * as vars from './vars.mjs' import * as vars from './vars.mjs'

View File

@@ -2,15 +2,11 @@
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
import { build as builder } from 'electron-builder' import { build as builder } from 'electron-builder'
import * as vars from './vars.mjs' import * as vars from './vars.mjs'
import { execSync } from 'child_process'
const isTag = (process.env.GITHUB_REF || process.env.BUILD_SOURCEBRANCH || '').startsWith('refs/tags/') const isTag = (process.env.GITHUB_REF || process.env.BUILD_SOURCEBRANCH || '').startsWith('refs/tags/')
const keypair = process.env.SM_KEYPAIR_ALIAS
process.env.ARCH = process.env.ARCH || process.arch process.env.ARCH = process.env.ARCH || process.arch
console.log('Signing enabled:', !!keypair)
builder({ builder({
dir: true, dir: true,
win: ['nsis', 'zip'], win: ['nsis', 'zip'],
@@ -26,35 +22,8 @@ builder({
channel: `latest-${process.env.ARCH}`, channel: `latest-${process.env.ARCH}`,
}, },
] : undefined, ] : undefined,
forceCodeSigning: !!keypair,
win: {
signtoolOptions: {
certificateSha1: process.env.SM_CODE_SIGNING_CERT_SHA1_HASH,
publisherName: process.env.SM_PUBLISHER_NAME,
signingHashAlgorithms: ['sha256'],
sign: keypair ? async function (configuration) {
console.log('Signing', configuration)
if (configuration.path) {
try {
const out = execSync(
`smctl sign --keypair-alias=${keypair} --input "${String(configuration.path)}"`
)
if (out.toString().includes('FAILED')) {
throw new Error(out.toString())
}
console.log(out.toString())
} catch (e) {
console.error(`Failed to sign ${configuration.path}`)
console.error(e)
process.exit(1)
}
}
} : undefined,
},
},
}, },
publish: process.env.KEYGEN_TOKEN ? isTag ? 'always' : 'onTagOrDraft' : 'never',
publish: (process.env.KEYGEN_TOKEN && isTag) ? 'always' : 'never',
}).catch(e => { }).catch(e => {
console.error(e) console.error(e)
process.exit(1) process.exit(1)

View File

@@ -10,8 +10,6 @@ log.info('deps', 'app')
sh.cd('app') sh.cd('app')
sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true }) sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true })
// Some native packages might fail to build before patch-package gets a chance to run via postinstall
sh.exec(`yarn postinstall`, { fatal: false })
sh.cd('..') sh.cd('..')
sh.cd('web') sh.cd('web')

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
import { rebuild } from '@electron/rebuild' import { rebuild } from 'electron-rebuild'
import sh from 'shelljs' import sh from 'shelljs'
import path from 'node:path' import path from 'node:path'
import fs from 'node:fs' import fs from 'node:fs'

View File

@@ -3,7 +3,7 @@ import * as fs from 'fs'
import * as semver from 'semver' import * as semver from 'semver'
import * as childProcess from 'child_process' import * as childProcess from 'child_process'
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : (process.env.ARCH || process.arch) process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
import * as url from 'url' import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const __dirname = url.fileURLToPath(new URL('.', import.meta.url))

View File

@@ -1,44 +0,0 @@
!
! Generated with :
! XRDB2Xreources.py
!
*.foreground: #c0caf5
*.background: #1a1b26
*.cursorColor: #c0caf5
!
! Black
*.color0: #15161e
*.color8: #414868
!
! Red
*.color1: #f7768e
*.color9: #f7768e
!
! Green
*.color2: #9ece6a
*.color10: #9ece6a
!
! Yellow
*.color3: #e0af68
*.color11: #e0af68
!
! Blue
*.color4: #7aa2f7
*.color12: #7aa2f7
!
! Magenta
*.color5: #bb9af7
*.color13: #bb9af7
!
! Cyan
*.color6: #7dcfff
*.color14: #7dcfff
!
! White
*.color7: #a9b1d6
*.color15: #c0caf5
!
! Bold, Italic, Underline
*.colorBD: #eeeeee
!*.colorIT:
!*.colorUL:

View File

@@ -1,44 +0,0 @@
!
! Generated with :
! XRDB2Xreources.py
!
*.foreground: #3760bf
*.background: #e1e2e7
*.cursorColor: #3760bf
!
! Black
*.color0: #e9e9ed
*.color8: #a1a6c5
!
! Red
*.color1: #f52a65
*.color9: #f52a65
!
! Green
*.color2: #587539
*.color10: #587539
!
! Yellow
*.color3: #8c6c3e
*.color11: #8c6c3e
!
! Blue
*.color4: #2e7de9
*.color12: #2e7de9
!
! Magenta
*.color5: #9854f1
*.color13: #9854f1
!
! Cyan
*.color6: #007197
*.color14: #007197
!
! White
*.color7: #6172b0
*.color15: #3760bf
!
! Bold, Italic, Underline
*.colorBD: #eeeeee
!*.colorIT:
!*.colorUL:

View File

@@ -1,44 +0,0 @@
!
! Generated with :
! XRDB2Xreources.py
!
*.foreground: #c0caf5
*.background: #24283b
*.cursorColor: #c0caf5
!
! Black
*.color0: #1d202f
*.color8: #414868
!
! Red
*.color1: #f7768e
*.color9: #f7768e
!
! Green
*.color2: #9ece6a
*.color10: #9ece6a
!
! Yellow
*.color3: #e0af68
*.color11: #e0af68
!
! Blue
*.color4: #7aa2f7
*.color12: #7aa2f7
!
! Magenta
*.color5: #bb9af7
*.color13: #bb9af7
!
! Cyan
*.color6: #7dcfff
*.color14: #7dcfff
!
! White
*.color7: #a9b1d6
*.color15: #c0caf5
!
! Bold, Italic, Underline
*.colorBD: #eeeeee
!*.colorIT:
!*.colorUL:

View File

@@ -10,7 +10,7 @@ export { Theme } from './theme'
export { TabContextMenuItemProvider } from './tabContextMenuProvider' export { TabContextMenuItemProvider } from './tabContextMenuProvider'
export { SelectorOption } from './selector' export { SelectorOption } from './selector'
export { CLIHandler, CLIEvent } from './cli' export { CLIHandler, CLIEvent } from './cli'
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions, DirectoryUpload } from './platform' export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions } from './platform'
export { MenuItemOptions } from './menu' export { MenuItemOptions } from './menu'
export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess' export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess'
export { HostWindowService } from './hostWindow' export { HostWindowService } from './hostWindow'
@@ -36,7 +36,7 @@ export { TabsService, NewTabParameters, TabComponentType } from '../services/tab
export { UpdaterService } from '../services/updater.service' export { UpdaterService } from '../services/updater.service'
export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service' export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service'
export { FileProvidersService } from '../services/fileProviders.service' export { FileProvidersService } from '../services/fileProviders.service'
export { LocaleService, TabbyFormatedDatePipe } from '../services/locale.service' export { LocaleService } from '../services/locale.service'
export { TranslateService } from '@ngx-translate/core' export { TranslateService } from '@ngx-translate/core'
export * from '../utils' export * from '../utils'
export { UTF8Splitter } from '../utfSplitter' export { UTF8Splitter } from '../utfSplitter'

View File

@@ -63,24 +63,22 @@ export abstract class FileTransfer {
} }
export abstract class FileDownload extends FileTransfer { export abstract class FileDownload extends FileTransfer {
abstract write (buffer: Uint8Array): Promise<void> abstract write (buffer: Buffer): Promise<void>
} }
export abstract class FileUpload extends FileTransfer { export abstract class FileUpload extends FileTransfer {
abstract read (): Promise<Uint8Array> abstract read (): Promise<Buffer>
async readAll (): Promise<Uint8Array> { async readAll (): Promise<Buffer> {
const result = new Uint8Array(this.getSize()) const buffers: Buffer[] = []
let pos = 0
while (true) { while (true) {
const buf = await this.read() const buf = await this.read()
if (!buf.length) { if (!buf.length) {
break break
} }
result.set(buf, pos) buffers.push(Buffer.from(buf))
pos += buf.length
} }
return result return Buffer.concat(buffers)
} }
} }
@@ -88,26 +86,6 @@ export interface FileUploadOptions {
multiple: boolean multiple: boolean
} }
export class DirectoryUpload {
private childrens: (FileUpload|DirectoryUpload)[] = []
constructor (private name = '') {
// Just set name for now.
}
getName (): string {
return this.name
}
getChildrens (): (FileUpload|DirectoryUpload)[] {
return this.childrens
}
pushChildren (item: FileUpload|DirectoryUpload): void {
this.childrens.push(item)
}
}
export type PlatformTheme = 'light'|'dark' export type PlatformTheme = 'light'|'dark'
export abstract class PlatformService { export abstract class PlatformService {
@@ -128,54 +106,23 @@ export abstract class PlatformService {
abstract startDownload (name: string, mode: number, size: number): Promise<FileDownload|null> abstract startDownload (name: string, mode: number, size: number): Promise<FileDownload|null>
abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]> abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]>
abstract startUploadDirectory (paths?: string[]): Promise<DirectoryUpload>
async startUploadFromDragEvent (event: DragEvent, multiple = false): Promise<DirectoryUpload> {
const result = new DirectoryUpload()
startUploadFromDragEvent (event: DragEvent, multiple = false): FileUpload[] {
const result: FileUpload[] = []
if (!event.dataTransfer) { if (!event.dataTransfer) {
return Promise.resolve(result) return []
} }
const traverseFileTree = (item: any, root: DirectoryUpload = result): Promise<void> => {
return new Promise((resolve) => {
if (item.isFile) {
item.file((file: File) => {
const transfer = new HTMLFileUpload(file)
this.fileTransferStarted.next(transfer)
root.pushChildren(transfer)
resolve()
})
} else if (item.isDirectory) {
const dirReader = item.createReader()
const childrenFolder = new DirectoryUpload(item.name)
dirReader.readEntries(async (entries: any[]) => {
for (const entry of entries) {
await traverseFileTree(entry, childrenFolder)
}
resolve()
})
root.pushChildren(childrenFolder)
} else {
resolve()
}
})
}
const promises: Promise<void>[] = []
const items = event.dataTransfer.items
// eslint-disable-next-line @typescript-eslint/prefer-for-of // eslint-disable-next-line @typescript-eslint/prefer-for-of
for (let i = 0; i < items.length; i++) { for (let i = 0; i < event.dataTransfer.files.length; i++) {
const item = items[i].webkitGetAsEntry() const file = event.dataTransfer.files[i]
if (item) { const transfer = new HTMLFileUpload(file)
promises.push(traverseFileTree(item)) this.fileTransferStarted.next(transfer)
if (!multiple) { result.push(transfer)
break if (!multiple) {
} break
} }
} }
return Promise.all(promises).then(() => result) return result
} }
getConfigPath (): string|null { getConfigPath (): string|null {
@@ -263,12 +210,12 @@ export class HTMLFileUpload extends FileUpload {
return this.file.size return this.file.size
} }
async read (): Promise<Uint8Array> { async read (): Promise<Buffer> {
const result: any = await this.reader.read() const result: any = await this.reader.read()
if (result.done || !result.value) { if (result.done || !result.value) {
return new Uint8Array(0) return Buffer.from('')
} }
const chunk = new Uint8Array(result.value) const chunk = Buffer.from(result.value)
this.increaseProgress(chunk.length) this.increaseProgress(chunk.length)
return chunk return chunk
} }

View File

@@ -1,7 +1,11 @@
.icon(
[fastHtmlBind]='pngPath',
*ngIf='!isHTML && isPNG'
)
i.icon( i.icon(
class='fa-fw {{icon}}', class='fa-fw {{icon}}',
[style.color]='color', [style.color]='color',
*ngIf='!isHTML' *ngIf='!isHTML && !isPNG'
) )
.icon( .icon(
[fastHtmlBind]='icon', [fastHtmlBind]='icon',

View File

@@ -12,7 +12,15 @@ export class ProfileIconComponent extends BaseComponent {
@Input() icon?: string @Input() icon?: string
@Input() color?: string @Input() color?: string
get pngPath (): string {
return `<img src="${this.icon?.trim()}" width="16" height="16" />`
}
get isHTML (): boolean { get isHTML (): boolean {
return this.icon?.startsWith('<') ?? false return this.icon?.startsWith('<') ?? false
} }
get isPNG (): boolean {
return this.icon?.endsWith('.png') ?? false
}
} }

View File

@@ -1,4 +1,4 @@
import { Observable, Subject, takeWhile } from 'rxjs' import { Observable, Subject } from 'rxjs'
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy, Injector } from '@angular/core' import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy, Injector } from '@angular/core'
import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component' import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component'
import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery' import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
@@ -381,9 +381,6 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
} }
} }
}, 100) }, 100)
// Propagate visibility to new children
this.emitVisibility(this.visibility.value)
} }
this.initialized.next() this.initialized.next()
this.initialized.complete() this.initialized.complete()
@@ -821,13 +818,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
if (this.disableDynamicTitle) { if (this.disableDynamicTitle) {
return return
} }
const titles = [ this.setTitle([...new Set(this.getAllTabs().map(x => x.title))].join(' | '))
this.getFocusedTab()?.title,
...this.getAllTabs()
.filter(x => x !== this.getFocusedTab())
.map(x => x.title),
]
this.setTitle([...new Set(titles)].join(' | '))
} }
private attachTabView (tab: BaseTabComponent) { private attachTabView (tab: BaseTabComponent) {
@@ -843,42 +834,20 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
}) })
} }
tab.subscribeUntilDestroyed( tab.subscribeUntilDestroyed(tab.titleChange$, () => this.updateTitle())
this.observeUntilChildDetached(tab, tab.focused$), tab.subscribeUntilDestroyed(tab.activity$, a => a ? this.displayActivity() : this.clearActivity())
() => this.updateTitle(), tab.subscribeUntilDestroyed(tab.progress$, p => this.setProgress(p))
)
tab.subscribeUntilDestroyed(
this.observeUntilChildDetached(tab, tab.titleChange$),
() => this.updateTitle(),
)
tab.subscribeUntilDestroyed(
this.observeUntilChildDetached(tab, tab.activity$),
a => a ? this.displayActivity() : this.clearActivity(),
)
tab.subscribeUntilDestroyed(
this.observeUntilChildDetached(tab, tab.progress$),
p => this.setProgress(p),
)
if (tab.title) { if (tab.title) {
this.updateTitle() this.updateTitle()
} }
tab.subscribeUntilDestroyed( tab.subscribeUntilDestroyed(tab.recoveryStateChangedHint$, () => {
this.observeUntilChildDetached(tab, tab.recoveryStateChangedHint$), this.recoveryStateChangedHint.next()
() => { })
this.recoveryStateChangedHint.next()
},
)
tab.destroyed$.subscribe(() => { tab.destroyed$.subscribe(() => {
this.removeTab(tab) this.removeTab(tab)
}) })
} }
private observeUntilChildDetached<T> (tab: BaseTabComponent, event: Observable<T>): Observable<T> {
return event.pipe(takeWhile(() => {
return this.getAllTabs().includes(tab)
}))
}
private onAfterTabAdded (tab: BaseTabComponent) { private onAfterTabAdded (tab: BaseTabComponent) {
setImmediate(() => { setImmediate(() => {
this.layout() this.layout()

View File

@@ -31,8 +31,6 @@ hotkeys:
__nonStructural: true __nonStructural: true
profile-selectors: profile-selectors:
__nonStructural: true __nonStructural: true
group-selectors:
__nonStructural: true
profiles: [] profiles: []
groups: [] groups: []
profileDefaults: profileDefaults:

View File

@@ -1,5 +1,5 @@
import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core' import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core'
import { DirectoryUpload, PlatformService } from '../api/platform' import { FileUpload, PlatformService } from '../api/platform'
import './dropZone.directive.scss' import './dropZone.directive.scss'
/** @hidden */ /** @hidden */
@@ -7,7 +7,7 @@ import './dropZone.directive.scss'
selector: '[dropZone]', selector: '[dropZone]',
}) })
export class DropZoneDirective implements AfterViewInit { export class DropZoneDirective implements AfterViewInit {
@Output() transfer = new EventEmitter<DirectoryUpload>() @Output() transfer = new EventEmitter<FileUpload>()
private dropHint?: HTMLElement private dropHint?: HTMLElement
constructor ( constructor (
@@ -27,9 +27,11 @@ export class DropZoneDirective implements AfterViewInit {
}) })
} }
}) })
this.el.nativeElement.addEventListener('drop', async (event: DragEvent) => { this.el.nativeElement.addEventListener('drop', (event: DragEvent) => {
this.removeHint() this.removeHint()
this.transfer.emit(await this.platform.startUploadFromDragEvent(event, true)) for (const transfer of this.platform.startUploadFromDragEvent(event, true)) {
this.transfer.emit(transfer)
}
}) })
this.el.nativeElement.addEventListener('dragleave', () => { this.el.nativeElement.addEventListener('dragleave', () => {
this.removeHint() this.removeHint()

View File

@@ -264,7 +264,6 @@ export class AppHotkeyProvider extends HotkeyProvider {
async provide (): Promise<HotkeyDescription[]> { async provide (): Promise<HotkeyDescription[]> {
const profiles = await this.profilesService.getProfiles() const profiles = await this.profilesService.getProfiles()
const groups = await this.profilesService.getProfileGroups()
return [ return [
...this.hotkeys, ...this.hotkeys,
...profiles.map(profile => ({ ...profiles.map(profile => ({
@@ -275,10 +274,6 @@ export class AppHotkeyProvider extends HotkeyProvider {
id: `profile-selectors.${provider.id}`, id: `profile-selectors.${provider.id}`,
name: this.translate.instant('Show {type} profile selector', { type: provider.name }), name: this.translate.instant('Show {type} profile selector', { type: provider.name }),
})), })),
...groups.map(group => ({
id: `group-selectors.${group.id}`,
name: this.translate.instant('Show profile selector for group {name}', { name: group.name }),
})),
] ]
} }

View File

@@ -37,16 +37,16 @@ import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive'
import { DropZoneDirective } from './directives/dropZone.directive' import { DropZoneDirective } from './directives/dropZone.directive'
import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive' import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive'
import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ProfilesService, ProfileProvider, QuickConnectProfileProvider, SelectorOption, Profile, SelectorService, CommandProvider, PartialProfileGroup, ProfileGroup } from './api' import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ProfilesService, ProfileProvider, QuickConnectProfileProvider, SelectorOption, Profile, SelectorService, CommandProvider } from './api'
import { AppService } from './services/app.service' import { AppService } from './services/app.service'
import { ConfigService } from './services/config.service' import { ConfigService } from './services/config.service'
import { VaultFileProvider } from './services/vault.service' import { VaultFileProvider } from './services/vault.service'
import { HotkeysService } from './services/hotkeys.service' import { HotkeysService } from './services/hotkeys.service'
import { CustomMissingTranslationHandler, LocaleService, TabbyFormatedDatePipe } from './services/locale.service' import { CustomMissingTranslationHandler, LocaleService } from './services/locale.service'
import { CommandService } from './services/commands.service' import { CommandService } from './services/commands.service'
import { NewTheme } from './theme' import { StandardTheme, StandardCompactTheme, PaperTheme, NewTheme } from './theme'
import { CoreConfigProvider } from './config' import { CoreConfigProvider } from './config'
import { AppHotkeyProvider } from './hotkeys' import { AppHotkeyProvider } from './hotkeys'
import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu, ProfilesContextMenu } from './tabContextMenu' import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu, ProfilesContextMenu } from './tabContextMenu'
@@ -60,6 +60,9 @@ export function TranslateMessageFormatCompilerFactory (): TranslateMessageFormat
const PROVIDERS = [ const PROVIDERS = [
{ provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true }, { provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true },
{ provide: Theme, useClass: StandardTheme, multi: true },
{ provide: Theme, useClass: StandardCompactTheme, multi: true },
{ provide: Theme, useClass: PaperTheme, multi: true },
{ provide: Theme, useClass: NewTheme, multi: true }, { provide: Theme, useClass: NewTheme, multi: true },
{ provide: ConfigProvider, useClass: CoreConfigProvider, multi: true }, { provide: ConfigProvider, useClass: CoreConfigProvider, multi: true },
{ provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true },
@@ -130,7 +133,6 @@ const PROVIDERS = [
DropZoneDirective, DropZoneDirective,
CdkAutoDropGroup, CdkAutoDropGroup,
ProfileIconComponent, ProfileIconComponent,
TabbyFormatedDatePipe,
], ],
exports: [ exports: [
AppRootComponent, AppRootComponent,
@@ -145,7 +147,6 @@ const PROVIDERS = [
TranslateModule, TranslateModule,
CdkAutoDropGroup, CdkAutoDropGroup,
ProfileIconComponent, ProfileIconComponent,
TabbyFormatedDatePipe,
], ],
}) })
export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class
@@ -180,24 +181,20 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
if (profile) { if (profile) {
profilesService.openNewTabForProfile(profile) profilesService.openNewTabForProfile(profile)
} }
} else if (hotkey.startsWith('profile-selectors.')) { }
if (hotkey.startsWith('profile-selectors.')) {
const id = hotkey.substring(hotkey.indexOf('.') + 1) const id = hotkey.substring(hotkey.indexOf('.') + 1)
const provider = profilesService.getProviders().find(x => x.id === id) const provider = profilesService.getProviders().find(x => x.id === id)
if (!provider) { if (!provider) {
return return
} }
this.showSelector(provider).catch(() => null) this.showSelector(provider).catch(() => null)
} else if (hotkey.startsWith('group-selectors.')) { }
const id = hotkey.substring(hotkey.indexOf('.') + 1) if (hotkey === 'command-selector') {
const groups = await this.profilesService.getProfileGroups({ includeProfiles: true })
const group = groups.find(x => x.id === id)
if (!group) {
return
}
this.showGroupSelector(group).catch(() => null)
} else if (hotkey === 'command-selector') {
commands.showSelector().catch(() => null) commands.showSelector().catch(() => null)
} else if (hotkey === 'profile-selector') { }
if (hotkey === 'profile-selector') {
commands.run('core:profile-selector', {}) commands.run('core:profile-selector', {})
} }
}) })
@@ -235,21 +232,6 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
await this.selector.show(this.translate.instant('Select profile'), options) await this.selector.show(this.translate.instant('Select profile'), options)
} }
async showGroupSelector (group: PartialProfileGroup<ProfileGroup>): Promise<void> {
if (this.selector.active) {
return
}
const profiles = group.profiles ?? []
const options: SelectorOption<void>[] = profiles.map(p => ({
...this.profilesService.selectorOptionForProfile(p),
callback: () => this.profilesService.openNewTabForProfile(p),
}))
await this.selector.show(this.translate.instant('Select profile'), options)
}
static forRoot (): ModuleWithProviders<AppModule> { static forRoot (): ModuleWithProviders<AppModule> {
return { return {
ngModule: AppModule, ngModule: AppModule,

View File

@@ -27,8 +27,12 @@ export class HomeBaseService {
this.platform.openExternal('https://github.com/Eugeny/tabby') this.platform.openExternal('https://github.com/Eugeny/tabby')
} }
openDiscord (): void { openDiscussions (): void {
this.platform.openExternal('https://discord.gg/Vn7BjmzhtF') this.platform.openExternal('https://github.com/Eugeny/tabby/discussions')
}
openTwitter (): void {
this.platform.openExternal('https://twitter.com/eugeeeeny')
} }
openTranslations (): void { openTranslations (): void {

View File

@@ -1,5 +1,5 @@
import { Injectable, Pipe, PipeTransform } from '@angular/core' import { Injectable } from '@angular/core'
import { formatDate, registerLocaleData } from '@angular/common' import { registerLocaleData } from '@angular/common'
import { TranslateService, MissingTranslationHandler } from '@ngx-translate/core' import { TranslateService, MissingTranslationHandler } from '@ngx-translate/core'
import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler' import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler'
@@ -257,15 +257,3 @@ export class LocaleService {
return this.locale return this.locale
} }
} }
@Pipe({
name: 'tabbyDate',
})
export class TabbyFormatedDatePipe implements PipeTransform {
constructor (private locale: LocaleService) {}
transform (date: string): string {
return formatDate(date, 'medium', this.locale.getLocale())
}
}

View File

@@ -487,12 +487,6 @@ export class ProfilesService {
delete profile.group delete profile.group
} }
} }
if (this.config.store.hotkeys['group-selectors'].hasOwnProperty(group.id)) {
const groupSelectorsHotkeys = { ...this.config.store.hotkeys['group-selectors'] }
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
delete groupSelectorsHotkeys[group.id]
this.config.store.hotkeys['group-selectors'] = groupSelectorsHotkeys
}
} }
/** /**

View File

@@ -23,7 +23,6 @@ export class ThemesService {
) { ) {
this.rootElementStyleBackup = document.documentElement.style.cssText this.rootElementStyleBackup = document.documentElement.style.cssText
this.applyTheme(standardTheme) this.applyTheme(standardTheme)
this.applyThemeVariables()
config.ready$.toPromise().then(() => { config.ready$.toPromise().then(() => {
this.applyCurrentTheme() this.applyCurrentTheme()
this.applyThemeVariables() this.applyThemeVariables()
@@ -38,11 +37,6 @@ export class ThemesService {
}) })
} }
private getConfigStoreOrDefaults (): any {
/// Theme service is active before the vault is unlocked and config is available
return this.config.store ?? this.config.getDefaults()
}
private applyThemeVariables () { private applyThemeVariables () {
if (!this.findCurrentTheme().followsColorScheme) { if (!this.findCurrentTheme().followsColorScheme) {
document.documentElement.style.cssText = this.rootElementStyleBackup document.documentElement.style.cssText = this.rootElementStyleBackup
@@ -66,7 +60,7 @@ export class ThemesService {
} }
let background = Color(theme.background) let background = Color(theme.background)
if (this.getConfigStoreOrDefaults().appearance.vibrancy) { if (this.config.store?.appearance.vibrancy) {
background = background.fade(0.6) background = background.fade(0.6)
} }
// const background = theme.background // const background = theme.background
@@ -154,13 +148,13 @@ export class ThemesService {
vars['--bs-form-switch-bg'] = `url("data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27${switchBackground}%27/%3e%3c/svg%3e")` vars['--bs-form-switch-bg'] = `url("data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27${switchBackground}%27/%3e%3c/svg%3e")`
} }
vars['--spaciness'] = this.getConfigStoreOrDefaults().appearance.spaciness vars['--spaciness'] = this.config.store.appearance.spaciness
for (const [bg, fg] of contrastPairs) { for (const [bg, fg] of contrastPairs) {
const colorBg = Color(vars[bg]).hsl() const colorBg = Color(vars[bg]).hsl()
const colorFg = Color(vars[fg]).hsl() const colorFg = Color(vars[fg]).hsl()
const bgContrast = colorBg.contrast(colorFg) const bgContrast = colorBg.contrast(colorFg)
if (bgContrast < this.getConfigStoreOrDefaults().terminal.minimumContrastRatio) { if (bgContrast < this.config.store.terminal.minimumContrastRatio) {
vars[fg] = this.ensureContrast(colorFg, colorBg).string() vars[fg] = this.ensureContrast(colorFg, colorBg).string()
} }
} }
@@ -169,7 +163,7 @@ export class ThemesService {
document.documentElement.style.setProperty(key, value) document.documentElement.style.setProperty(key, value)
} }
document.body.classList.toggle('no-animations', !this.getConfigStoreOrDefaults().accessibility.animations) document.body.classList.toggle('no-animations', !this.config.store.accessibility.animations)
} }
private ensureContrast (color: Color, against: Color): Color { private ensureContrast (color: Color, against: Color): Color {
@@ -184,7 +178,7 @@ export class ThemesService {
while ( while (
(step < 1 && color.color[2] > 1 || (step < 1 && color.color[2] > 1 ||
step > 1 && color.color[2] < 99) && step > 1 && color.color[2] < 99) &&
color.contrast(against) < this.getConfigStoreOrDefaults().terminal.minimumContrastRatio) { color.contrast(against) < this.config.store.terminal.minimumContrastRatio) {
color.color[2] *= step color.color[2] *= step
} }
return color return color
@@ -195,22 +189,22 @@ export class ThemesService {
} }
findCurrentTheme (): Theme { findCurrentTheme (): Theme {
return this.findTheme(this.getConfigStoreOrDefaults().appearance.theme) ?? this.standardTheme return this.findTheme(this.config.store.appearance.theme) ?? this.standardTheme
} }
/// @hidden /// @hidden
_getActiveColorScheme (): any { _getActiveColorScheme (): any {
let theme: PlatformTheme = 'dark' let theme: PlatformTheme = 'dark'
if (this.getConfigStoreOrDefaults().appearance.colorSchemeMode === 'light') { if (this.config.store.appearance.colorSchemeMode === 'light') {
theme = 'light' theme = 'light'
} else if (this.getConfigStoreOrDefaults().appearance.colorSchemeMode === 'auto') { } else if (this.config.store.appearance.colorSchemeMode === 'auto') {
theme = this.platform.getTheme() theme = this.platform.getTheme()
} }
if (theme === 'light') { if (theme === 'light') {
return this.getConfigStoreOrDefaults().terminal.lightColorScheme return this.config.store.terminal.lightColorScheme
} else { } else {
return this.getConfigStoreOrDefaults().terminal.colorScheme return this.config.store.terminal.colorScheme
} }
} }
@@ -221,7 +215,7 @@ export class ThemesService {
document.querySelector('head')!.appendChild(this.styleElement) document.querySelector('head')!.appendChild(this.styleElement)
} }
this.styleElement.textContent = theme.css this.styleElement.textContent = theme.css
document.querySelector('style#custom-css')!.innerHTML = this.getConfigStoreOrDefaults().appearance.css document.querySelector('style#custom-css')!.innerHTML = this.config.store?.appearance?.css
this.themeChanged.next(theme) this.themeChanged.next(theme)
} }

View File

@@ -195,13 +195,7 @@ export class VaultService {
if (!vault) { if (!vault) {
return null return null
} }
let vaultSecret = vault.secrets.find(s => s.type === type && this.keyMatches(key, s)) return vault.secrets.find(s => s.type === type && this.keyMatches(key, s)) ?? null
if (!vaultSecret) {
// search for secret without host in vault (like a default user/password used in multiple servers)
key['host'] = null
vaultSecret = vault.secrets.find(s => s.type === type && this.keyMatches(key, s))
}
return vaultSecret ?? null
} }
async addSecret (secret: VaultSecret): Promise<void> { async addSecret (secret: VaultSecret): Promise<void> {
@@ -312,7 +306,7 @@ export class VaultFileProvider extends FileProvider {
id, id,
description: `${description} (${transfer.getName()})`, description: `${description} (${transfer.getName()})`,
}, },
value: Buffer.from(await transfer.readAll()).toString('base64'), value: (await transfer.readAll()).toString('base64'),
}) })
return `${this.prefix}${id}` return `${this.prefix}${id}`
} }

View File

@@ -0,0 +1,36 @@
@import './theme.scss';
app-root {
.tabs-on-side .tab-bar {
height: 100% !important;
}
.tab-bar {
height: 27px !important;
.btn-tab-bar {
line-height: 29px !important;
height: 27px !important;
align-items: center;
svg {
height: 14px;
}
}
.inset {
width: 70 !important;
}
}
terminaltab .content {
margin: 5px !important;
}
ssh-tab .content {
margin: 5px !important;
}
serial-tab .content {
margin: 5px !important;
}
}

View File

@@ -0,0 +1,407 @@
$black: #002b36;
$base02: #073642;
$base01: #586e75;
$base00: #657b83;
$base0: #839496;
$base1: #93a1a1;
$base2: #eee8d5;
$white: #fdf6e3;
$yellow: #b58900;
$orange: #cb4b16;
$red: #dc322f;
$pink: #d33682;
$purple: #6c71c4;
$blue: #268bd2;
$teal: #2aa198;
$green: #859900;
$tab-border-radius: 5px;
$button-hover-bg: rgba(0, 0, 0, .125);
$button-active-bg: rgba(0, 0, 0, .25);
$primary: #fd7e14;
$secondary: #495057;
$content-bg: rgba($white, 0.65);
$content-bg-solid: $white;
$body-bg: $base2;
$body-bg2: $base1;
$body-color: $black;
$font-family-sans-serif: "Source Sans Pro";
$font-size-base: 14rem / 16;
$btn-border-radius: 0;
$nav-tabs-border-width: 0;
$nav-tabs-border-radius: 0;
$nav-tabs-link-hover-border-color: $body-bg;
$nav-tabs-active-link-hover-color: $white;
$nav-tabs-active-link-hover-bg: $blue;
$nav-tabs-active-link-hover-border-color: darken($blue, 30%);
$nav-pills-border-radius: 0;
$input-bg: $base2;
$input-disabled-bg: $base1;
$input-color: $body-color;
$input-color-placeholder: $base1;
$input-border-color: $base1;
//$input-box-shadow: inset 0 1px 1px rgba($black,.075);
$input-border-radius: 0;
$custom-select-border-radius: 0;
$input-bg-focus: $input-bg;
//$input-border-focus: lighten($brand-primary, 25%);
//$input-box-shadow-focus: $input-box-shadow, rgba($input-border-focus, .6);
$input-color-focus: $input-color;
$input-group-addon-bg: $body-bg;
$input-group-addon-border-color: $input-border-color;
$modal-content-bg: $content-bg-solid;
$modal-content-border-color: $body-bg;
$modal-header-border-color: transparent;
$modal-footer-border-color: transparent;
$popover-bg: $body-bg;
$dropdown-bg: $body-bg;
$dropdown-link-color: $body-color;
$dropdown-link-hover-color: #333;
$dropdown-link-hover-bg: $body-bg2;
//$dropdown-link-active-color: $component-active-color;
//$dropdown-link-active-bg: $component-active-bg;
$dropdown-link-disabled-color: #333;
$dropdown-header-color: #333;
$list-group-color: $body-color;
$list-group-bg: rgba($black,.05);
$list-group-border-color: rgba($black,.1);
$list-group-hover-bg: rgba($black,.1);
$list-group-link-active-bg: rgba($black,.2);
$list-group-action-color: $body-color;
$list-group-action-bg: rgba($black,.05);
$list-group-action-active-bg: $list-group-link-active-bg;
$list-group-border-radius: 0;
$pre-bg: $dropdown-bg;
$pre-color: $dropdown-link-color;
$headings-font-weight: lighter;
$headings-color: $base0;
@import '~bootstrap/scss/bootstrap.scss';
window-controls {
svg {
transition: 0.25s fill;
fill: $base01;
}
button:hover {
background: rgba($black, 0.125);
svg {
fill: $black;
}
}
.btn-close:hover {
background: #8a2828;
}
}
$border-color: $base1;
app-root {
background: $body-bg;
&.vibrant {
background: rgba(255, 255, 255,.4) !important;
}
&> .content {
.tab-bar {
.btn-tab-bar {
background: transparent;
line-height: 42px;
align-items: center;
svg, path {
fill: $black;
fill-opacity: 0.75;
}
&:hover { background: rgba(0, 0, 0, .125) !important; }
&:active { background: rgba(0, 0, 0, .25) !important; }
}
&>.tabs {
tab-header {
border-left: 1px solid transparent;
border-right: 1px solid transparent;
color: $base01;
transition: 0.125s ease-out width;
.index {
color: rgba($black, 0.4);
}
button {
color: $body-color;
border: none;
transition: 0.25s all;
&:hover { background: $button-hover-bg !important; }
&:active { background: $button-active-bg !important; }
}
.progressbar {
background: $blue;
}
.activity-indicator {
background:rgba(0, 0, 0, 0.2);
}
&.active {
color: $black;
background: $content-bg;
border-left: 1px solid $border-color;
border-right: 1px solid $border-color;
}
}
}
}
&.tabs-on-top .tab-bar {
&>.background {
border-bottom: 1px solid $border-color;
}
tab-header {
border-bottom: 1px solid $border-color;
&.active {
border-bottom-color: transparent;
}
}
}
&:not(.tabs-on-top) .tab-bar {
&>.background {
border-top: 1px solid $border-color;
}
tab-header {
border-top: 1px solid $border-color;
&.active {
margin-top: -1px;
}
}
}
}
&.platform-win32, &.platform-linux {
border: 1px solid #111;
&>.content .tab-bar .tabs tab-header:first-child {
border-left: none;
}
}
}
tab-body {
background: $content-bg;
}
settings-tab > .content {
& > .nav {
background: rgba(0, 0, 0, 0.25);
border-right: 1px solid $body-bg;
& > .nav-item > .nav-link {
border: none;
padding: 10px 50px 10px 20px;
font-size: 14px;
&:not(.active) {
color: $body-color;
}
}
}
}
multi-hotkey-input {
.item {
background: $body-bg2;
border: 1px solid $blue;
border-radius: 3px;
margin-right: 5px;
.body {
padding: 3px 0 2px;
.stroke {
padding: 0 6px;
border-right: 1px solid $content-bg;
}
}
.remove {
padding: 3px 8px 2px;
}
}
.item:has(.duplicate) {
background-color: map-get($theme-colors, 'danger');
border: 1px solid map-get($theme-colors, 'danger');
}
.add {
color: #777;
padding: 4px 10px 0;
}
.add, .item .body, .item .remove {
&:hover { background: darken($body-bg2, 5%); }
&:active { background: darken($body-bg2, 15%); }
}
.add:has(.duplicate), .item:has(.duplicate) .body, .item:has(.duplicate) .remove {
&:hover { background: darken(map-get($theme-colors, 'danger'), 5%); }
&:active { background: darken(map-get($theme-colors, 'danger'), 15%); }
}
}
hotkey-input-modal {
.input {
background: $input-bg;
padding: 10px;
font-size: 24px;
line-height: 27px;
height: 55px;
.stroke {
background: $body-bg2;
border: 1px solid $blue;
border-radius: 3px;
margin-right: 10px;
padding: 3px 10px;
}
}
.timeout {
background: $input-bg;
div {
background: $blue;
}
}
}
.mb-3 label {
margin-bottom: 2px;
}
.nav-tabs {
.nav-link {
transition: 0.25s all;
border-bottom-color: $nav-tabs-border-color;
}
}
.btn-check:checked + label {
background: $blue;
}
.btn {
i + * {
margin-left: 5px;
}
&.btn-lg i + * {
margin-left: 10px;
}
}
.input-group-addon + .form-control {
border-left: none;
}
.input-group > select.form-control {
flex-direction: row;
}
.list-group-item {
transition: 0.25s background;
&:not(:first-child) {
border-top: none;
}
i + * {
margin-left: 10px;
}
}
select.form-control {
-webkit-appearance: none;
background-image: url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'><path fill='#444' d='M7.406 7.828l4.594 4.594 4.594-4.594 1.406 1.406-6 6-6-6z'></path></svg>");
background-position: 100% 50%;
background-repeat: no-repeat;
padding-right: 30px;
}
checkbox i.on {
color: $blue;
}
toggle {
.body {
border-color: $base0 !important;
.toggle {
background: $base0 !important;
}
}
&.active .body .toggle {
background: map-get($theme-colors, primary) !important;
}
}
.list-group-item svg {
fill: $black;
}
.tabby-title {
color: $base01;
}
.tabby-logo {
filter: saturate(0);
}
start-page footer {
background: $white !important;
}
terminal-toolbar {
background: #ffffff4a !important;
border-bottom: 1px solid #00000026 !important;
}
.bg-dark{
background-color: $base2 !important;
}
split-tab-spanner {
background: rgba(0, 0, 0, .2);
&:hover, &.active {
background: rgba(255, 255, 255, .125);
}
}

428
tabby-core/src/theme.scss Normal file
View File

@@ -0,0 +1,428 @@
@import "./theme.vars";
// ---------
$button-hover-bg: rgba(0, 0, 0, .25);
$button-active-bg: rgba(0, 0, 0, .5);
@import '~bootstrap/scss/bootstrap.scss';
@import "./theme.vendor.scss";
window-controls {
svg {
transition: 0.25s fill;
fill: #aaa;
}
button:hover svg {
fill: white;
}
.btn-close:hover {
background: #8a2828;
}
}
$border-color: #111;
app-root {
background: $body-bg;
&.vibrant {
background: rgba(0,0,0,.65);
}
&> .content {
.tab-bar {
.btn-tab-bar {
background: transparent;
&:hover { background: rgba(0, 0, 0, .25) !important; }
&:active, &[aria-expanded-true] { background: rgba(0, 0, 0, .5) !important; }
&:focus {
box-shadow: none;
}
&::after {
display: none;
}
}
&>.tabs {
tab-header {
border-left: 1px solid transparent;
border-right: 1px solid transparent;
transition: 0.125s ease-out width;
.index {
color: rgba(255, 255, 255, 0.4);
}
.icon {
opacity: .75;
}
button {
color: $body-color;
border: none;
transition: 0.25s all;
right: 5px;
&:hover { background: $button-active-bg !important; }
&:active { background: $button-active-bg !important; }
}
.progressbar {
background: $green;
}
.activity-indicator {
background:rgba(255, 255, 255, 0.2);
}
&.active {
color: white;
background: $content-bg;
border-left: 1px solid $border-color;
border-right: 1px solid $border-color;
}
}
}
}
&.tabs-on-top .tab-bar {
&>.background {
border-bottom: 1px solid $border-color;
}
tab-header {
border-bottom: 1px solid $border-color;
&.active {
border-bottom-color: transparent;
}
}
}
&:not(.tabs-on-top) .tab-bar {
&>.background {
border-top: 1px solid $border-color;
}
tab-header {
border-top: 1px solid $border-color;
&.active {
margin-top: -1px;
}
}
}
}
&.platform-win32, &.platform-linux {
border: 1px solid #111;
&>.content {
margin: -1px; // expand the content into the border
.tab-bar .tabs tab-header:first-child {
border-left: none;
}
}
}
}
tab-body {
background: $content-bg;
terminal-toolbar .btn, .toolbar-pin-button {
font-weight: bold;
}
}
multi-hotkey-input {
.item {
background: $body-bg2;
border: 1px solid $blue;
border-radius: 3px;
margin-right: 5px;
.body {
padding: 3px 0 2px;
.stroke {
padding: 0 6px;
border-right: 1px solid $content-bg;
}
}
.remove {
padding: 3px 8px 2px;
}
}
.item:has(.duplicate) {
background-color: map-get($theme-colors, 'danger');
border: 1px solid map-get($theme-colors, 'danger');
}
.add {
color: #777;
padding: 4px 10px 0;
}
.add, .item .body, .item .remove {
&:hover { background: darken($body-bg2, 5%); }
&:active { background: darken($body-bg2, 15%); }
}
.add:has(.duplicate), .item:has(.duplicate) .body, .item:has(.duplicate) .remove {
&:hover { background: darken(map-get($theme-colors, 'danger'), 5%); }
&:active { background: darken(map-get($theme-colors, 'danger'), 15%); }
}
}
hotkey-input-modal {
.input {
background: $input-bg;
padding: 10px;
font-size: 24px;
line-height: 27px;
height: 55px;
.stroke {
background: $body-bg2;
border: 1px solid $blue;
border-radius: 3px;
margin-right: 10px;
padding: 3px 10px;
}
}
.timeout {
background: $input-bg;
div {
background: $blue;
}
}
}
.mb-3 label {
margin-bottom: 2px;
}
.btn-check:checked + label {
background: $blue;
}
.btn {
i + * {
margin-left: 5px;
}
&.btn-lg i + * {
margin-left: 10px;
}
}
.input-group-addon + .form-control {
border-left: none;
}
.input-group > select.form-control {
flex-direction: row;
}
.list-group-item {
// transition: 0.0625s background ease;
i + * {
margin-left: 10px;
}
}
.list-group.list-group-flush .list-group-item {
background: transparent;
border: none;
&:not(:last-child) {
border-bottom: none;
}
&.list-group-item-action {
&:hover, &.active {
background: $list-group-hover-bg;
}
}
}
.list-group-light {
.list-group-item {
border: none !important;
outline: none !important;
background: transparent;
border-radius: $border-radius;
margin: 0 !important;
&.list-group-item-action {
&:hover, &.active {
background: $component-active-bg;
color: $component-active-color;
}
}
}
}
checkbox i.on {
color: $blue;
}
.modal .modal-footer {
background: rgba(0, 0, 0, .25);
.btn {
font-weight: bold;
padding: 0.375rem 1.5rem;
}
}
.list-group-item svg {
fill: white;
fill-opacity: 0.75;
}
*::-webkit-scrollbar {
background: rgba(0, 0, 0, .125);
width: 10px;
margin: 5px;
}
*::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, .25);
}
*::-webkit-scrollbar-corner,
*::-webkit-resizer {
opacity: 0;
}
search-panel {
background: #131d27 !important;
input {
border-radius: 0 !important;
}
}
.btn {
cursor: pointer;
justify-content: flex-start;
overflow: hidden;
&.disabled,
&:disabled {
cursor: not-allowed;
}
}
.btn-warning:not(:disabled):not(.disabled) {
&.active, &:active {
color: $gray-900;
}
}
.btn-secondary:not(:disabled):not(.disabled) {
&.active, &:active {
background: #191e23;
align-items: center;
}
}
.btn-link {
text-decoration: none;
&:hover, &[aria-expanded=true], &:active, &.active {
color: $link-hover-color;
border-radius: $btn-border-radius;
}
&[aria-expanded=true], &:active, &.active {
background: rgba(255, 255, 255, 0.1);
}
}
.btn-group .btn.active {
border-color: transparent !important;
}
.nav-tabs {
margin-bottom: 10px;
&.nav-justified .nav-link {
margin-right: 5px;
}
.nav-link {
border: none;
border-bottom: $nav-tabs-border-width solid transparent;
text-transform: uppercase;
font-weight: bold;
padding: 5px 0;
margin-right: 20px;
uib-tab-heading > i {
font-size: 18px;
}
// @include hover-focus {
// color: $nav-tabs-link-active-color;
// }
&.disabled {
color: $nav-link-disabled-color;
border-color: transparent;
}
}
.nav-item:last-child .nav-link {
margin-right: 0;
}
.nav-link.active,
.nav-item.show .nav-link {
color: $nav-tabs-link-active-color;
border-color: $nav-tabs-link-active-border-color;
}
}
hr {
border-color: $list-group-border-color;
}
.dropdown-menu {
box-shadow: $dropdown-box-shadow;
}
ngx-colors-panel .opened {
background: $body-bg !important;
button {
color: $body-color !important;
}
.button svg {
fill: white;
}
}
split-tab-spanner {
background: rgba(0, 0, 0, .2);
&:hover, &.active {
background: rgba(255, 255, 255, .125);
}
}

View File

@@ -2,6 +2,32 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { Theme } from './api' import { Theme } from './api'
/** @hidden */
@Injectable()
export class StandardTheme extends Theme {
name = _('Standard (legacy)')
css = require('./theme.scss')
terminalBackground = '#222a33'
}
/** @hidden */
@Injectable()
export class StandardCompactTheme extends Theme {
name = _('Compact (legacy)')
css = require('./theme.compact.scss')
terminalBackground = '#222a33'
macOSWindowButtonsInsetX = 8
macOSWindowButtonsInsetY = 6
}
/** @hidden */
@Injectable()
export class PaperTheme extends Theme {
name = _('Paper (legacy)')
css = require('./theme.paper.scss')
terminalBackground = '#f7f1e0'
}
/** @hidden */ /** @hidden */
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class NewTheme extends Theme { export class NewTheme extends Theme {

View File

@@ -24,7 +24,6 @@
"devDependencies": { "devDependencies": {
"electron-promise-ipc": "^2.2.4", "electron-promise-ipc": "^2.2.4",
"ps-node": "^0.1.6", "ps-node": "^0.1.6",
"ssh-config": "^5.0.0",
"tmp-promise": "^3.0.2", "tmp-promise": "^3.0.2",
"which": "^3.0.0", "which": "^3.0.0",
"winston": "^3.3.3" "winston": "^3.3.3"

View File

@@ -1,6 +1,6 @@
import { NgModule } from '@angular/core' import { NgModule } from '@angular/core'
import { PlatformService, LogService, UpdaterService, DockingService, HostAppService, ThemesService, Platform, AppService, ConfigService, WIN_BUILD_FLUENT_BG_SUPPORTED, isWindowsBuild, HostWindowService, HotkeyProvider, ConfigProvider, FileProvider } from 'tabby-core' import { PlatformService, LogService, UpdaterService, DockingService, HostAppService, ThemesService, Platform, AppService, ConfigService, WIN_BUILD_FLUENT_BG_SUPPORTED, isWindowsBuild, HostWindowService, HotkeyProvider, ConfigProvider, FileProvider } from 'tabby-core'
import { TerminalColorSchemeProvider, TerminalDecorator } from 'tabby-terminal' import { TerminalColorSchemeProvider } from 'tabby-terminal'
import { SFTPContextMenuItemProvider, SSHProfileImporter, AutoPrivateKeyLocator } from 'tabby-ssh' import { SFTPContextMenuItemProvider, SSHProfileImporter, AutoPrivateKeyLocator } from 'tabby-ssh'
import { PTYInterface, ShellProvider, UACService } from 'tabby-local' import { PTYInterface, ShellProvider, UACService } from 'tabby-local'
import { auditTime } from 'rxjs' import { auditTime } from 'rxjs'
@@ -23,7 +23,6 @@ import { ElectronConfigProvider } from './config'
import { EditSFTPContextMenu } from './sftpContextMenu' import { EditSFTPContextMenu } from './sftpContextMenu'
import { OpenSSHImporter, PrivateKeyLocator, StaticFileImporter } from './sshImporters' import { OpenSSHImporter, PrivateKeyLocator, StaticFileImporter } from './sshImporters'
import { ElectronPTYInterface } from './pty' import { ElectronPTYInterface } from './pty'
import { PathDropDecorator } from './pathDrop'
import { CmderShellProvider } from './shells/cmder' import { CmderShellProvider } from './shells/cmder'
import { Cygwin32ShellProvider } from './shells/cygwin32' import { Cygwin32ShellProvider } from './shells/cygwin32'
@@ -74,8 +73,6 @@ import { VSDevToolsProvider } from './shells/vs'
{ provide: PTYInterface, useClass: ElectronPTYInterface }, { provide: PTYInterface, useClass: ElectronPTYInterface },
{ provide: TerminalDecorator, useClass: PathDropDecorator, multi: true },
// For WindowsDefaultShellProvider // For WindowsDefaultShellProvider
PowerShellCoreShellProvider, PowerShellCoreShellProvider,
WSLShellProvider, WSLShellProvider,
@@ -133,10 +130,7 @@ export default class ElectronModule {
}) })
}) })
config.changed$.subscribe(() => { config.changed$.subscribe(() => this.updateVibrancy())
this.updateVibrancy()
this.updateDarkMode()
})
config.changed$.subscribe(() => this.updateWindowControlsColor()) config.changed$.subscribe(() => this.updateWindowControlsColor())
@@ -179,11 +173,6 @@ export default class ElectronModule {
this.hostWindow.setOpacity(this.config.store.appearance.opacity) this.hostWindow.setOpacity(this.config.store.appearance.opacity)
} }
private updateDarkMode () {
const colorSchemeMode = this.config.store.appearance.colorSchemeMode
this.electron.ipcRenderer.send('window-set-dark-mode', colorSchemeMode)
}
private updateWindowControlsColor () { private updateWindowControlsColor () {
// if windows and not using native frame, WCO does not exist, return. // if windows and not using native frame, WCO does not exist, return.
if (this.hostApp.platform === Platform.Windows && this.config.store.appearance.frame === 'native') { if (this.hostApp.platform === Platform.Windows && this.config.store.appearance.frame === 'native') {

View File

@@ -10,7 +10,7 @@ try {
} catch { } } catch { }
try { try {
var windowsProcessTree = require('@tabby-gang/windows-process-tree') // eslint-disable-line @typescript-eslint/no-var-requires, no-var var windowsProcessTree = require('windows-process-tree') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
} catch { } } catch { }
export class ElectronPTYInterface extends PTYInterface { export class ElectronPTYInterface extends PTYInterface {

View File

@@ -50,7 +50,7 @@ export class DockMenuService {
]) ])
} }
if (this.hostApp.platform === Platform.macOS) { if (this.hostApp.platform === Platform.macOS) {
this.electron.app.dock?.setMenu(this.electron.Menu.buildFromTemplate( this.electron.app.dock.setMenu(this.electron.Menu.buildFromTemplate(
[ [
...[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({ ...[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({
label: profile.name, label: profile.name,

View File

@@ -16,6 +16,7 @@ export class ElectronService {
clipboard: Clipboard clipboard: Clipboard
globalShortcut: GlobalShortcut globalShortcut: GlobalShortcut
screen: Screen screen: Screen
remote = remote
process: any process: any
autoUpdater: AutoUpdater autoUpdater: AutoUpdater
powerSaveBlocker: PowerSaveBlocker powerSaveBlocker: PowerSaveBlocker
@@ -43,6 +44,7 @@ export class ElectronService {
this.BrowserWindow = remote.BrowserWindow this.BrowserWindow = remote.BrowserWindow
this.Menu = remote.Menu this.Menu = remote.Menu
this.MenuItem = remote.MenuItem this.MenuItem = remote.MenuItem
this.MenuItem = remote.MenuItem
this.nativeTheme = remote.nativeTheme this.nativeTheme = remote.nativeTheme
} }
} }

View File

@@ -5,7 +5,7 @@ import * as os from 'os'
import promiseIpc, { RendererProcessType } from 'electron-promise-ipc' import promiseIpc, { RendererProcessType } from 'electron-promise-ipc'
import { execFile } from 'mz/child_process' import { execFile } from 'mz/child_process'
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, DirectoryUpload, 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 { ElectronService } from '../services/electron.service'
import { ElectronHostWindow } from './hostWindow.service' import { ElectronHostWindow } from './hostWindow.service'
import { ShellIntegrationService } from './shellIntegration.service' import { ShellIntegrationService } from './shellIntegration.service'
@@ -18,7 +18,7 @@ const fontManager = require('fontmanager-redux') // eslint-disable-line
try { try {
// eslint-disable-next-line no-var // eslint-disable-next-line no-var
var windowsProcessTreeNative = require('@tabby-gang/windows-process-tree/build/Release/windows_process_tree.node') var windowsProcessTreeNative = require('windows-process-tree/build/Release/windows_process_tree.node')
// eslint-disable-next-line no-var // eslint-disable-next-line no-var
var wnr = require('windows-native-registry') var wnr = require('windows-native-registry')
} catch { } } catch { }
@@ -48,21 +48,6 @@ export class ElectronPlatformService extends PlatformService {
}) })
} }
async getAllFiles (dir: string, root: DirectoryUpload): Promise<DirectoryUpload> {
const items = await fs.readdir(dir, { withFileTypes: true })
for (const item of items) {
if (item.isDirectory()) {
root.pushChildren(await this.getAllFiles(path.join(dir, item.name), new DirectoryUpload(item.name)))
} else {
const file = new ElectronFileUpload(path.join(dir, item.name), this.electron)
root.pushChildren(file)
await wrapPromise(this.zone, file.open())
this.fileTransferStarted.next(file)
}
}
return root
}
readClipboard (): string { readClipboard (): string {
return this.electron.clipboard.readText() return this.electron.clipboard.readText()
} }
@@ -231,28 +216,6 @@ export class ElectronPlatformService extends PlatformService {
})) }))
} }
async startUploadDirectory (paths?: string[]): Promise<DirectoryUpload> {
const properties: any[] = ['openFile', 'treatPackageAsDirectory', 'openDirectory']
if (!paths) {
const result = await this.electron.dialog.showOpenDialog(
this.hostWindow.getWindow(),
{
buttonLabel: this.translate.instant('Select'),
properties,
},
)
if (result.canceled) {
return new DirectoryUpload()
}
paths = result.filePaths
}
const root = new DirectoryUpload()
root.pushChildren(await this.getAllFiles(paths[0].split(path.sep).join(path.posix.sep), new DirectoryUpload(path.basename(paths[0]))))
return root
}
async startDownload (name: string, mode: number, size: number, filePath?: string): Promise<FileDownload|null> { async startDownload (name: string, mode: number, size: number, filePath?: string): Promise<FileDownload|null> {
if (!filePath) { if (!filePath) {
const result = await this.electron.dialog.showSaveDialog( const result = await this.electron.dialog.showSaveDialog(
@@ -300,12 +263,12 @@ class ElectronFileUpload extends FileUpload {
private size: number private size: number
private mode: number private mode: number
private file: fs.FileHandle private file: fs.FileHandle
private buffer: Uint8Array private buffer: Buffer
private powerSaveBlocker = 0 private powerSaveBlocker = 0
constructor (private filePath: string, private electron: ElectronService) { constructor (private filePath: string, private electron: ElectronService) {
super() super()
this.buffer = new Uint8Array(256 * 1024) this.buffer = Buffer.alloc(256 * 1024)
this.powerSaveBlocker = electron.powerSaveBlocker.start('prevent-app-suspension') this.powerSaveBlocker = electron.powerSaveBlocker.start('prevent-app-suspension')
} }
@@ -328,7 +291,7 @@ class ElectronFileUpload extends FileUpload {
return this.size return this.size
} }
async read (): Promise<Uint8Array> { async read (): Promise<Buffer> {
const result = await this.file.read(this.buffer, 0, this.buffer.length, null) const result = await this.file.read(this.buffer, 0, this.buffer.length, null)
this.increaseProgress(result.bytesRead) this.increaseProgress(result.bytesRead)
return this.buffer.slice(0, result.bytesRead) return this.buffer.slice(0, result.bytesRead)
@@ -370,7 +333,7 @@ class ElectronFileDownload extends FileDownload {
return this.size return this.size
} }
async write (buffer: Uint8Array): Promise<void> { async write (buffer: Buffer): Promise<void> {
let pos = 0 let pos = 0
while (pos < buffer.length) { while (pos < buffer.length) {
const result = await this.file.write(buffer, pos, buffer.length - pos, null) const result = await this.file.write(buffer, pos, buffer.length - pos, null)

View File

@@ -1,3 +1,4 @@
import type { AppUpdater } from 'electron-updater'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import axios from 'axios' import axios from 'axios'
@@ -12,6 +13,7 @@ export class ElectronUpdaterService extends UpdaterService {
private downloaded: Promise<boolean> private downloaded: Promise<boolean>
private electronUpdaterAvailable = true private electronUpdaterAvailable = true
private updateURL: string private updateURL: string
private autoUpdater: AppUpdater
constructor ( constructor (
log: LogService, log: LogService,
@@ -28,28 +30,32 @@ export class ElectronUpdaterService extends UpdaterService {
return return
} }
this.electron.ipcRenderer.on('updater:update-available', () => { this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
this.autoUpdater.autoDownload = true
this.autoUpdater.autoInstallOnAppQuit = false
this.autoUpdater.on('update-available', () => {
this.logger.info('Update available') this.logger.info('Update available')
}) })
this.electron.ipcRenderer.on('updater:update-not-available', () => { this.autoUpdater.on('update-not-available', () => {
this.logger.info('No updates') this.logger.info('No updates')
}) })
this.electron.ipcRenderer.on('updater:error', err => { this.autoUpdater.on('error', err => {
this.logger.error(err) this.logger.error(err)
this.electronUpdaterAvailable = false this.electronUpdaterAvailable = false
}) })
this.downloaded = new Promise<boolean>(resolve => { this.downloaded = new Promise<boolean>(resolve => {
this.electron.ipcRenderer.once('updater:update-downloaded', () => resolve(true)) this.autoUpdater.once('update-downloaded', () => resolve(true))
}) })
config.ready$.toPromise().then(() => { config.ready$.toPromise().then(() => {
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) { if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) {
this.logger.debug('Checking for updates') this.logger.debug('Checking for updates')
try { try {
this.electron.ipcRenderer.send('updater:check-for-updates') this.autoUpdater.checkForUpdates()
} catch (e) { } catch (e) {
this.electronUpdaterAvailable = false this.electronUpdaterAvailable = false
this.logger.info('Electron updater unavailable, falling back', e) this.logger.info('Electron updater unavailable, falling back', e)
@@ -76,26 +82,26 @@ export class ElectronUpdaterService extends UpdaterService {
reject(err) reject(err)
} }
cancel = () => { cancel = () => {
this.electron.ipcRenderer.off('updater:error', onError) this.autoUpdater.off('error', onError)
this.electron.ipcRenderer.off('updater:update-not-available', onNoUpdate) this.autoUpdater.off('update-not-available', onNoUpdate)
this.electron.ipcRenderer.off('updater:update-available', onUpdate) this.autoUpdater.off('update-available', onUpdate)
} }
this.electron.ipcRenderer.on('updater:error', onError) this.autoUpdater.on('error', onError)
this.electron.ipcRenderer.on('updater:update-not-available', onNoUpdate) this.autoUpdater.on('update-not-available', onNoUpdate)
this.electron.ipcRenderer.on('updater:update-available', onUpdate) this.autoUpdater.on('update-available', onUpdate)
try { try {
this.electron.ipcRenderer.send('updater:check-for-updates') this.autoUpdater.checkForUpdates()
} catch (e) { } catch (e) {
this.electronUpdaterAvailable = false this.electronUpdaterAvailable = false
this.logger.info('Electron updater unavailable, falling back', e) this.logger.info('Electron updater unavailable, falling back', e)
} }
}) })
this.electron.ipcRenderer.on('updater:update-available', () => { this.autoUpdater.on('update-available', () => {
this.logger.info('Update available') this.logger.info('Update available')
}) })
this.electron.ipcRenderer.once('updater:update-not-available', () => { this.autoUpdater.once('update-not-available', () => {
this.logger.info('No updates') this.logger.info('No updates')
}) })
@@ -132,7 +138,7 @@ export class ElectronUpdaterService extends UpdaterService {
}, },
)).response === 0) { )).response === 0) {
await this.downloaded await this.downloaded
this.electron.ipcRenderer.send('updater:quit-and-install') this.autoUpdater.quitAndInstall()
} }
} }
} }

View File

@@ -49,24 +49,19 @@ export class EditSFTPContextMenu extends SFTPContextMenuItemProvider {
this.platform.openPath(tempPath) this.platform.openPath(tempPath)
const events = new Subject<string>() const events = new Subject<string>()
fs.chmodSync(tempPath, 0o700) const watcher = fs.watch(tempPath, event => events.next(event))
events.pipe(debounceTime(1000), debounce(async event => {
// skip the first burst of events if (event === 'rename') {
setTimeout(() => { watcher.close()
const watcher = fs.watch(tempPath, event => events.next(event)) }
events.pipe(debounceTime(1000), debounce(async event => { const upload = await this.platform.startUpload({ multiple: false }, [tempPath])
if (event === 'rename') { if (!upload.length) {
watcher.close() return
} }
const upload = await this.platform.startUpload({ multiple: false }, [tempPath]) await sftp.upload(item.fullPath, upload[0])
if (!upload.length) { await sftp.chmod(item.fullPath, item.mode)
return })).subscribe()
} watcher.on('close', () => events.complete())
await sftp.upload(item.fullPath, upload[0]) sftp.closed$.subscribe(() => watcher.close())
await sftp.chmod(item.fullPath, item.mode)
})).subscribe()
watcher.on('close', () => events.complete())
sftp.closed$.subscribe(() => watcher.close())
}, 1000)
} }
} }

View File

@@ -6,6 +6,8 @@ import { HostAppService, Platform, isWindowsBuild, WIN_BUILD_WSL_EXE_DISTRO_FLAG
import { ShellProvider, Shell } from 'tabby-local' import { ShellProvider, Shell } from 'tabby-local'
import { PowerShell } from 'node-powershell'
/* eslint-disable block-scoped-var */ /* eslint-disable block-scoped-var */
try { try {
@@ -38,10 +40,42 @@ const wslIconMap: Record<string, string> = {
/** @hidden */ /** @hidden */
@Injectable() @Injectable()
export class WSLShellProvider extends ShellProvider { export class WSLShellProvider extends ShellProvider {
private _pwsh: PowerShell
constructor ( constructor (
private hostApp: HostAppService, private hostApp: HostAppService,
) { ) {
super() super()
// make sure that this will not use the powershell profile
// that may take a long time to load
this._pwsh = new PowerShell({
executableOptions: {
'-NoProfile': true,
},
})
}
private async _resolveIcon (defaultDistKey: any): Promise<string> {
let _icon = wslIconMap.Linux
// check if the register has PackageFamilyName
if (defaultDistKey.PackageFamilyName) {
// get the icon from the package family name
const packageFamilyName = (defaultDistKey.PackageFamilyName.value as string).split('_')[0]
if (packageFamilyName) {
const _ret = await this._pwsh.invoke(`Get-AppxPackage ${packageFamilyName} | ConvertTo-Json`)
if (!_ret.hadErrors && _ret.stdout?.toString() !== undefined && _ret.stdout.toString() !== '') {
const appx = JSON.parse(_ret.stdout.toString())
const installationLocation = appx.InstallLocation
_icon = `${installationLocation}\\Assets\\Square44x44Logo.targetsize-16.png`
}
}
}
return _icon
} }
async provide (): Promise<Shell[]> { async provide (): Promise<Shell[]> {
@@ -59,6 +93,7 @@ export class WSLShellProvider extends ShellProvider {
if (lxss?.DefaultDistribution) { if (lxss?.DefaultDistribution) {
const defaultDistKey = wnr.getRegistryKey(wnr.HK.CU, lxssPath + '\\' + String(lxss.DefaultDistribution.value)) const defaultDistKey = wnr.getRegistryKey(wnr.HK.CU, lxssPath + '\\' + String(lxss.DefaultDistribution.value))
if (defaultDistKey?.DistributionName) { if (defaultDistKey?.DistributionName) {
const _icon = await this._resolveIcon(defaultDistKey)
const shell: Shell = { const shell: Shell = {
id: 'wsl', id: 'wsl',
name: 'WSL / Default distro', name: 'WSL / Default distro',
@@ -68,7 +103,7 @@ export class WSLShellProvider extends ShellProvider {
COLORTERM: 'truecolor', COLORTERM: 'truecolor',
}, },
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
icon: wslIconMap[defaultDistKey.DistributionName.value] ?? wslIconMap.Linux, icon: wslIconMap[defaultDistKey.DistributionName.value] ?? _icon,
} }
shells.push(shell) shells.push(shell)
} }
@@ -90,11 +125,14 @@ export class WSLShellProvider extends ShellProvider {
return [] return []
} }
} }
for (const child of wnr.listRegistrySubkeys(wnr.HK.CU, lxssPath) as string[]) { for (const child of wnr.listRegistrySubkeys(wnr.HK.CU, lxssPath) as string[]) {
const childKey = wnr.getRegistryKey(wnr.HK.CU, lxssPath + '\\' + child) const childKey = wnr.getRegistryKey(wnr.HK.CU, lxssPath + '\\' + child)
if (!childKey.DistributionName || !childKey.BasePath) { if (!childKey.DistributionName || !childKey.BasePath) {
continue continue
} }
const _icon = await this._resolveIcon(childKey)
const wslVersion = (childKey.Flags?.value || 0) & 8 ? 2 : 1 const wslVersion = (childKey.Flags?.value || 0) & 8 ? 2 : 1
const name = childKey.DistributionName.value const name = childKey.DistributionName.value
const fsBase = wslVersion === 2 ? `\\\\wsl$\\${name}` : childKey.BasePath.value as string + '\\rootfs' const fsBase = wslVersion === 2 ? `\\\\wsl$\\${name}` : childKey.BasePath.value as string + '\\rootfs'
@@ -110,7 +148,7 @@ export class WSLShellProvider extends ShellProvider {
COLORTERM: 'truecolor', COLORTERM: 'truecolor',
}, },
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
icon: wslIconMap[name] ?? wslIconMap.Linux, icon: wslIconMap[name] ?? _icon,
} }
shells.push(shell) shells.push(shell)
} }

View File

@@ -1,346 +1,130 @@
import at from 'core-js-pure/actual/array/at'
import * as fs from 'fs/promises' import * as fs from 'fs/promises'
import * as fsSync from 'fs' import * as fsSync from 'fs'
import * as path from 'path' import * as path from 'path'
import * as glob from 'glob'
import slugify from 'slugify' import slugify from 'slugify'
import * as yaml from 'js-yaml' import * as yaml from 'js-yaml'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { PartialProfile } from 'tabby-core' import { PartialProfile } from 'tabby-core'
import { import { SSHProfileImporter, PortForwardType, SSHProfile, SSHProfileOptions, AutoPrivateKeyLocator } from 'tabby-ssh'
SSHProfileImporter,
PortForwardType,
SSHProfile,
AutoPrivateKeyLocator,
ForwardedPortConfig,
} from 'tabby-ssh'
import { ElectronService } from './services/electron.service' import { ElectronService } from './services/electron.service'
import SSHConfig, { Directive, LineType } from 'ssh-config'
// Enum to delineate the properties in SSHProfile options
enum SSHProfilePropertyNames {
Host = 'host',
Port = 'port',
User = 'user',
X11 = 'x11',
PrivateKeys = 'privateKeys',
KeepaliveInterval = 'keepaliveInterval',
KeepaliveCountMax = 'keepaliveCountMax',
ReadyTimeout = 'readyTimeout',
JumpHost = 'jumpHost',
AgentForward = 'agentForward',
ProxyCommand = 'proxyCommand',
ForwardedPorts = 'forwardedPorts',
}
// Data structure to map the (lowercase) ssh-config attributes (as keys) to a tuple
// containing the name of the corresponding SSHProfile attribute
const decodeFields: Record<string, SSHProfilePropertyNames> = {
hostname: SSHProfilePropertyNames.Host,
user: SSHProfilePropertyNames.User,
port: SSHProfilePropertyNames.Port,
forwardx11: SSHProfilePropertyNames.X11,
serveraliveinterval: SSHProfilePropertyNames.KeepaliveInterval,
serveralivecountmax: SSHProfilePropertyNames.KeepaliveCountMax,
connecttimeout: SSHProfilePropertyNames.ReadyTimeout,
proxyjump: SSHProfilePropertyNames.JumpHost,
forwardagent: SSHProfilePropertyNames.AgentForward,
identityfile: SSHProfilePropertyNames.PrivateKeys,
proxycommand: SSHProfilePropertyNames.ProxyCommand,
localforward: SSHProfilePropertyNames.ForwardedPorts,
remoteforward: SSHProfilePropertyNames.ForwardedPorts,
dynamicforward: SSHProfilePropertyNames.ForwardedPorts,
}
// Function to use the above to return details corresponding to the supplied SSHProperty name.
// If the name of the supplied SSH Config file Property is valid, and one that we process,
// then we get back the name of the corresponding Property in the SSHProfile object
function decodeTarget (SSHProperty: string): string {
const lower = SSHProperty.toLowerCase()
if (lower in decodeFields) {
return decodeFields[lower]
}
return ''
}
// Function to combine SSHConfig values into a single string. This is used to smash
// together the proxyCommand values which are split on whitespace and presented as
// an array of objects in the SSHConfig object
function convertSSHConfigValuesToString (arg: string | string[] | object[]): string {
if (typeof arg === 'string') { return arg }
let allStrings = true
for (const item of arg) {
if (typeof item !== 'string') {
allStrings = false
break
}
}
if (allStrings) {
return arg.join(' ')
}
// Have to explicitly unwrap the arg into a list of objects to avoid Typescript grumbles
const objList: object[] = []
for (const item of arg) {
if ( typeof item === 'object' && 'val' in item ) {
objList.push(item)
}
}
return objList.filter(obj => 'val' in obj)
.map(obj => 'val' in obj ? obj.val as string: '')
.join(' ')
}
// Function to read in the SSH config file recursively and parse any Include directives
async function parseSSHConfigFile (
filePath: string,
visited = new Set<string>(),
): Promise<SSHConfig> {
// If we've already processed this file, return an empty config to avoid infinite recursion
if (visited.has(filePath)) {
return SSHConfig.parse('')
}
visited.add(filePath)
let raw = ''
try {
raw = await fs.readFile(filePath, 'utf8')
} catch (err) {
console.error(`Error reading SSH config file: ${filePath}`, err)
return SSHConfig.parse('')
}
const parsed = SSHConfig.parse(raw)
const merged = SSHConfig.parse('')
for (const entry of parsed) {
if (entry.type === LineType.DIRECTIVE && entry.param.toLowerCase() === 'include') {
const directive = entry as Directive
if (typeof directive.value !== 'string') {
continue
}
// ssh_config(5) says "Files without absolute paths are assumed to be in ~/.ssh if included in a user configuration file or /etc/ssh if included from the system configuration file."
let incPath = ''
if (path.isAbsolute(directive.value)) {
incPath = directive.value
} else if (directive.value.startsWith('~')) {
incPath = path.join(process.env.HOME ?? '~', directive.value.slice(1))
} else {
incPath = path.join(process.env.HOME ?? '~', '.ssh', directive.value)
}
const matches = glob.sync(incPath)
for (const match of matches) {
const stat = await fs.stat(match)
if (stat.isDirectory()) {
continue
}
const matchedConfig = await parseSSHConfigFile(match, visited)
merged.push(...matchedConfig)
}
} else {
merged.push(entry)
}
}
return merged
}
// Function to take an ssh-config entry and convert it into an SSHProfile
function convertHostToSSHProfile (host: string, settings: Record<string, string | string[] | object[] >): PartialProfile<SSHProfile> {
// inline function to generate an id for this profile
const deriveID = (name: string) => 'openssh-config:' + slugify(name)
// Start point of the profile, with an ID, name, type and group
const thisProfile: PartialProfile<SSHProfile> = {
id: deriveID(host),
name: `${host} (.ssh/config)`,
type: 'ssh',
group: 'Imported from .ssh/config',
}
const options = {}
function convertToForwardedPortDescriptor (forwardType: PortForwardType.Local | PortForwardType.Remote | PortForwardType.Dynamic, details: string): ForwardedPortConfig {
const detailsParts = details.split(/\s/)
const bindParts = detailsParts[0].trim().split(':')
if (bindParts.length === 1) {
bindParts.unshift('127.0.0.1')
}
let tgtParts = ['', '22']
if ( detailsParts.length > 1 ) {
tgtParts = detailsParts[1].trim().split(':')
}
return {
host: bindParts[0],
port: parseInt(bindParts[1]),
targetAddress: tgtParts[0],
targetPort: parseInt(tgtParts[1]),
type: forwardType,
description: details,
}
}
// for each ssh-config key in turn...
for (const key in settings) {
// decode a target attribute and an action
const targetName = decodeTarget(key)
switch (targetName) {
// The following have single string values
case SSHProfilePropertyNames.User:
case SSHProfilePropertyNames.Host:
case SSHProfilePropertyNames.JumpHost:
const basicString = settings[key]
if (typeof basicString === 'string') {
if (targetName === SSHProfilePropertyNames.JumpHost) {
options[targetName] = deriveID(basicString)
} else {
options[targetName] = basicString
}
} else {
console.log('Unexpected value in settings for ' + key)
}
break
// The following have single integer values
case SSHProfilePropertyNames.Port:
case SSHProfilePropertyNames.KeepaliveInterval:
case SSHProfilePropertyNames.KeepaliveCountMax:
case SSHProfilePropertyNames.ReadyTimeout:
const numberString = settings[key]
if (typeof numberString === 'string') {
options[targetName] = parseInt(numberString, 10)
} else {
console.log('Unexpected value in settings for ' + key)
}
break
// The following have single yes/no values
case SSHProfilePropertyNames.X11:
case SSHProfilePropertyNames.AgentForward:
let booleanString = settings[key]
booleanString = typeof booleanString === 'string' ? booleanString.toLowerCase() : ''
if ( booleanString === 'yes' || booleanString === 'no' ) {
options[targetName] = booleanString === 'yes'
} else {
console.log('Unexpected value in settings for ' + key)
}
break
// ProxyCommand will be an array if unquoted and containing multiple words,
// or a simple string otherwise
case SSHProfilePropertyNames.ProxyCommand:
const proxyCommand = convertSSHConfigValuesToString(settings[key])
options[targetName] = proxyCommand
break
// IdentityFile may have multiple values and the need to have '~' converted to the
// path to the HOME directory
case SSHProfilePropertyNames.PrivateKeys:
const processedKeys: string [] = (settings[key] as string[]).map( s => {
let retVal: string = s
if (s.startsWith('~/')) {
retVal = path.join(process.env.HOME ?? '~', s.slice(2))
}
return retVal
})
options[targetName] = processedKeys
break
// The port forwarding directives all end up in the same space, but with a different value
// in the SSHProfileOptions object
case SSHProfilePropertyNames.ForwardedPorts:
const forwardTypeString = key.toLowerCase()
let forwardType: PortForwardType | null = null
switch (forwardTypeString) {
case 'localforward':
forwardType = PortForwardType.Local
break
case 'remoteforward':
forwardType = PortForwardType.Remote
break
case 'dynamicforward':
forwardType = PortForwardType.Dynamic
break
}
if (forwardType) {
options[targetName] ??= []
for (const forwarderDetails of settings[key]) {
if (typeof forwarderDetails === 'string') {
options[targetName].push(convertToForwardedPortDescriptor(forwardType, forwarderDetails))
}
}
}
break
}
}
thisProfile.options = options
return thisProfile
}
function convertToSSHProfiles (config: SSHConfig): PartialProfile<SSHProfile>[] {
const myMap = new Map<string, PartialProfile<SSHProfile>>()
function noWildCardsInName (name: string) {
return !/[?*]/.test(name)
}
for (const entry of config) {
// Each entry represents a line in the SSH Config. If the line is a 'Host' line,
// then it will also contain the configuration for that identifiable Host.
// There may be more than one host per line and some 'Hosts' have wildcards in their
// names
// If this is a genuine entry rather than a Comment...
// ... and there is a 'Host' Parameter
if (entry.type === LineType.DIRECTIVE && entry.param === 'Host') {
// for each Name in this entry
const hostList: string[] = []
// if there is more than one host specified on this line, then the names will be
// in an array
if (typeof entry.value === 'string') {
hostList.push(entry.value)
} else if (Array.isArray(entry.value)) {
for (const item of entry.value) {
hostList.push(item.val)
}
}
// for each Host identified on this line, check that there are no wildcards in the
// name and that we've not seen the name before.
// If that is the case, then get the full configuration for this name.
// If that has a 'Hostname' property (if that's missing, the name is not usable
// for our purposes) then convert the configuration into an SSHProfile and stash it
for (const host of hostList) {
if (noWildCardsInName(host)) {
if (!(host in myMap)) {
// NOTE: SSHConfig.compute() lies about the return types
const configuration: Record<string, string | string[] | object[]> = config.compute(host)
if (Object.keys(configuration).map(key => key.toLowerCase()).includes('hostname')) {
myMap[host] = convertHostToSSHProfile(host, configuration)
}
}
}
}
}
}
// Convert the values from the map into a list of Partial SSHProfiles sorted
// by Hostname
return Object.keys(myMap).sort().map(key => myMap[key])
}
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class OpenSSHImporter extends SSHProfileImporter { export class OpenSSHImporter extends SSHProfileImporter {
async getProfiles (): Promise<PartialProfile<SSHProfile>[]> { async getProfiles (): Promise<PartialProfile<SSHProfile>[]> {
const deriveID = name => 'openssh-config:' + slugify(name)
const results: PartialProfile<SSHProfile>[] = []
const configPath = path.join(process.env.HOME ?? '~', '.ssh', 'config') const configPath = path.join(process.env.HOME ?? '~', '.ssh', 'config')
try { try {
const config: SSHConfig = await parseSSHConfigFile(configPath) const lines = (await fs.readFile(configPath, 'utf8')).split('\n')
return convertToSSHProfiles(config) const globalOptions: Partial<SSHProfileOptions> = {}
let currentProfile: PartialProfile<SSHProfile>|null = null
for (let line of lines) {
if (line.trim().startsWith('#') || !line.trim()) {
continue
}
if (line.toLowerCase().startsWith('host ')) {
if (currentProfile) {
results.push(currentProfile)
}
const name = line.substr(5).trim()
currentProfile = {
id: deriveID(name),
name: `${name} (.ssh/config)`,
type: 'ssh',
group: 'Imported from .ssh/config',
options: {
...globalOptions,
host: name,
},
}
} else {
const target: Partial<SSHProfileOptions> = currentProfile?.options ?? globalOptions
line = line.trim()
const idx = /\s/.exec(line)?.index ?? -1
if (idx === -1) {
continue
}
const key = line.substr(0, idx).trim()
const value = line.substr(idx + 1).trim()
if (key === 'IdentityFile') {
target.privateKeys = value.split(',').map(s => s.trim()).map(s => {
if (s.startsWith('~')) {
s = path.join(process.env.HOME ?? '~', s.slice(2))
}
return s
})
} else if (key === 'RemoteForward') {
const bind = value.split(/\s/)[0].trim()
const tgt = value.split(/\s/)[1].trim()
target.forwardedPorts ??= []
target.forwardedPorts.push({
type: PortForwardType.Remote,
description: value,
host: bind.split(':')[0] ?? '127.0.0.1',
port: parseInt(bind.split(':')[1] ?? bind),
targetAddress: tgt.split(':')[0],
targetPort: parseInt(tgt.split(':')[1]),
})
} else if (key === 'LocalForward') {
const bind = value.split(/\s/)[0].trim()
const tgt = value.split(/\s/)[1].trim()
target.forwardedPorts ??= []
target.forwardedPorts.push({
type: PortForwardType.Local,
description: value,
host: bind.includes(':') ? bind.split(':')[0] : '127.0.0.1',
port: parseInt(at(bind.split(':'), -1)),
targetAddress: tgt.split(':')[0],
targetPort: parseInt(tgt.split(':')[1]),
})
} else if (key === 'DynamicForward') {
const bind = value.trim()
target.forwardedPorts ??= []
target.forwardedPorts.push({
type: PortForwardType.Dynamic,
description: value,
host: bind.includes(':') ? bind.split(':')[0] : '127.0.0.1',
port: parseInt(at(bind.split(':'), -1)),
targetAddress: '',
targetPort: 22,
})
} else {
const mappedKey = {
hostname: 'host',
host: 'host',
port: 'port',
user: 'user',
forwardx11: 'x11',
serveraliveinterval: 'keepaliveInterval',
serveralivecountmax: 'keepaliveCountMax',
proxycommand: 'proxyCommand',
proxyjump: 'jumpHost',
}[key.toLowerCase()]
if (mappedKey) {
target[mappedKey] = value
}
}
}
}
if (currentProfile) {
results.push(currentProfile)
}
for (const p of results) {
if (p.options?.proxyCommand) {
p.options.proxyCommand = p.options.proxyCommand
.replace('%h', p.options.host ?? '')
.replace('%p', (p.options.port ?? 22).toString())
}
if (p.options?.jumpHost) {
p.options.jumpHost = deriveID(p.options.jumpHost)
}
}
return results
} catch (e) { } catch (e) {
if (e.code === 'ENOENT') { if (e.code === 'ENOENT') {
return [] return []

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