1
1
mirror of https://github.com/wez/wezterm.git synced 2024-10-04 02:08:07 +03:00

Merge branch 'wez:main' into nix-add-overlay

This commit is contained in:
notohh 2024-08-05 23:17:57 -04:00 committed by GitHub
commit e7ac13d03d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
109 changed files with 2061 additions and 1155 deletions

View File

@ -3,11 +3,11 @@ env:
CIRRUS_CLONE_DEPTH: 1
task:
name: freebsd-13
name: freebsd-14
compute_engine_instance:
image_project: freebsd-org-cloud-dev
image: family/freebsd-13-2
image: family/freebsd-14-0
platform: freebsd
cpu: 4
memory: 8G

View File

@ -60,7 +60,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -63,7 +63,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -43,7 +43,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -63,7 +63,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -66,7 +66,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -46,7 +46,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -63,7 +63,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -66,7 +66,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -46,7 +46,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -63,7 +63,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -66,7 +66,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -46,7 +46,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -57,7 +57,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -60,7 +60,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -40,7 +40,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -57,7 +57,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -60,7 +60,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -40,7 +40,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -57,7 +57,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -60,7 +60,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -40,7 +40,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -19,7 +19,7 @@ on:
jobs:
build:
runs-on: "macos-11"
runs-on: "macos-latest"
env:
CARGO_INCREMENTAL: "0"
@ -32,13 +32,14 @@ jobs:
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Install Rust (ARM)"
shell: bash
run: "rustup target add aarch64-apple-darwin"
- name: "Install Rust (Intel)"
shell: bash
run: "rustup target add x86_64-apple-darwin"
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -21,7 +21,7 @@ on:
jobs:
build:
runs-on: "macos-11"
runs-on: "macos-latest"
env:
BUILD_REASON: "Schedule"
@ -35,13 +35,14 @@ jobs:
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Install Rust (ARM)"
shell: bash
run: "rustup target add aarch64-apple-darwin"
- name: "Install Rust (Intel)"
shell: bash
run: "rustup target add x86_64-apple-darwin"
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -7,7 +7,7 @@ on:
jobs:
build:
runs-on: "macos-11"
runs-on: "macos-latest"
env:
CARGO_INCREMENTAL: "0"
@ -20,13 +20,14 @@ jobs:
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Install Rust (ARM)"
shell: bash
run: "rustup target add aarch64-apple-darwin"
- name: "Install Rust (Intel)"
shell: bash
run: "rustup target add x86_64-apple-darwin"
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -68,7 +68,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -71,7 +71,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -48,7 +48,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -63,7 +63,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -66,7 +66,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -46,7 +46,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -1,4 +1,4 @@
name: centos8
name: ubuntu24.04
on:
pull_request:
@ -8,7 +8,7 @@ on:
- "**/*.rs"
- "**/Cargo.lock"
- "**/Cargo.toml"
- ".github/workflows/gen_centos8.yml"
- ".github/workflows/gen_ubuntu24.04.yml"
- "assets/fonts/**/*"
- "assets/icon/*"
- "assets/open-wezterm-here"
@ -25,31 +25,34 @@ on:
jobs:
build:
runs-on: "ubuntu-latest"
container: "quay.io/centos/centos:stream8"
container: "ubuntu:24.04"
env:
CARGO_INCREMENTAL: "0"
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- name: "Install config manager"
- name: "set APT to non-interactive"
shell: bash
run: "dnf install -y 'dnf-command(config-manager)'"
- name: "Enable PowerTools"
run: "echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections"
- name: "Update APT"
shell: bash
run: "dnf config-manager --set-enabled powertools"
run: "apt update"
- name: "Install git"
shell: bash
run: "yum install -y git"
run: "apt-get install -y git"
- name: "Install curl"
shell: bash
run: "yum install -y curl"
run: "apt-get install -y curl"
- name: "Update APT"
shell: bash
run: "apt update"
- name: "Ensure /run/sshd exists"
shell: bash
run: "mkdir -p /run/sshd"
- name: "Install openssh-server"
shell: bash
run: "yum install -y openssh-server"
run: "apt-get install -y openssh-server"
- name: "Workaround git permissions issue"
shell: bash
run: "git config --global --add safe.directory /__w/wezterm/wezterm"
@ -60,7 +63,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor
@ -92,18 +95,17 @@ jobs:
uses: baptiste0928/cargo-install@v3
with:
crate: "cargo-nextest"
cache-key: "centos8"
cache-key: "ubuntu24.04"
- name: "Test"
shell: bash
run: "cargo nextest run --all --no-fail-fast"
- name: "Package"
shell: bash
run: "bash ci/deploy.sh"
- name: "Move RPM"
shell: bash
run: "mv ~/rpmbuild/RPMS/*/*.rpm ."
- name: "Upload artifact"
uses: actions/upload-artifact@v3
with:
name: "centos8"
path: "wezterm-*.rpm"
name: "ubuntu24.04"
path: |
wezterm-*.deb
wezterm-*.xz

View File

@ -1,4 +1,4 @@
name: centos8_continuous
name: ubuntu24.04_continuous
on:
schedule:
@ -10,7 +10,7 @@ on:
- "**/*.rs"
- "**/Cargo.lock"
- "**/Cargo.toml"
- ".github/workflows/gen_centos8_continuous.yml"
- ".github/workflows/gen_ubuntu24.04_continuous.yml"
- "assets/fonts/**/*"
- "assets/icon/*"
- "assets/open-wezterm-here"
@ -27,7 +27,7 @@ on:
jobs:
build:
runs-on: "ubuntu-latest"
container: "quay.io/centos/centos:stream8"
container: "ubuntu:24.04"
env:
BUILD_REASON: "Schedule"
CARGO_INCREMENTAL: "0"
@ -35,24 +35,27 @@ jobs:
RUSTC_WRAPPER: "sccache"
steps:
- name: "Install config manager"
- name: "set APT to non-interactive"
shell: bash
run: "dnf install -y 'dnf-command(config-manager)'"
- name: "Enable PowerTools"
run: "echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections"
- name: "Update APT"
shell: bash
run: "dnf config-manager --set-enabled powertools"
run: "apt update"
- name: "Install git"
shell: bash
run: "yum install -y git"
run: "apt-get install -y git"
- name: "Install curl"
shell: bash
run: "yum install -y curl"
run: "apt-get install -y curl"
- name: "Update APT"
shell: bash
run: "apt update"
- name: "Ensure /run/sshd exists"
shell: bash
run: "mkdir -p /run/sshd"
- name: "Install openssh-server"
shell: bash
run: "yum install -y openssh-server"
run: "apt-get install -y openssh-server"
- name: "Workaround git permissions issue"
shell: bash
run: "git config --global --add safe.directory /__w/wezterm/wezterm"
@ -63,7 +66,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor
@ -95,21 +98,20 @@ jobs:
uses: baptiste0928/cargo-install@v3
with:
crate: "cargo-nextest"
cache-key: "centos8"
cache-key: "ubuntu24.04"
- name: "Test"
shell: bash
run: "cargo nextest run --all --no-fail-fast"
- name: "Package"
shell: bash
run: "bash ci/deploy.sh"
- name: "Move RPM"
shell: bash
run: "mv ~/rpmbuild/RPMS/*/*.rpm wezterm-nightly-centos8.rpm"
- name: "Upload artifact"
uses: actions/upload-artifact@v3
with:
name: "centos8"
path: "wezterm-*.rpm"
name: "ubuntu24.04"
path: |
wezterm-*.deb
wezterm-*.xz
retention-days: 5
upload:
@ -125,12 +127,12 @@ jobs:
- name: "Download artifact"
uses: actions/download-artifact@v3
with:
name: "centos8"
name: "ubuntu24.04"
- name: "Checksum"
shell: bash
run: "for f in wezterm-*.rpm ; do sha256sum $f > $f.sha256 ; done"
run: "for f in wezterm-*.deb wezterm-*.xz ; do sha256sum $f > $f.sha256 ; done"
- name: "Upload to Nightly Release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: "bash ci/retry.sh gh release upload --clobber nightly wezterm-*.rpm *.sha256"
run: "bash ci/retry.sh gh release upload --clobber nightly wezterm-*.deb wezterm-*.xz *.sha256"

View File

@ -1,4 +1,4 @@
name: centos8_tag
name: ubuntu24.04_tag
on:
push:
@ -8,31 +8,34 @@ on:
jobs:
build:
runs-on: "ubuntu-latest"
container: "quay.io/centos/centos:stream8"
container: "ubuntu:24.04"
env:
CARGO_INCREMENTAL: "0"
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- name: "Install config manager"
- name: "set APT to non-interactive"
shell: bash
run: "dnf install -y 'dnf-command(config-manager)'"
- name: "Enable PowerTools"
run: "echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections"
- name: "Update APT"
shell: bash
run: "dnf config-manager --set-enabled powertools"
run: "apt update"
- name: "Install git"
shell: bash
run: "yum install -y git"
run: "apt-get install -y git"
- name: "Install curl"
shell: bash
run: "yum install -y curl"
run: "apt-get install -y curl"
- name: "Update APT"
shell: bash
run: "apt update"
- name: "Ensure /run/sshd exists"
shell: bash
run: "mkdir -p /run/sshd"
- name: "Install openssh-server"
shell: bash
run: "yum install -y openssh-server"
run: "apt-get install -y openssh-server"
- name: "Workaround git permissions issue"
shell: bash
run: "git config --global --add safe.directory /__w/wezterm/wezterm"
@ -43,7 +46,7 @@ jobs:
- name: "Install Rust"
uses: dtolnay/rust-toolchain@stable
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor
@ -75,21 +78,20 @@ jobs:
uses: baptiste0928/cargo-install@v3
with:
crate: "cargo-nextest"
cache-key: "centos8"
cache-key: "ubuntu24.04"
- name: "Test"
shell: bash
run: "cargo nextest run --all --no-fail-fast"
- name: "Package"
shell: bash
run: "bash ci/deploy.sh"
- name: "Move RPM"
shell: bash
run: "mv ~/rpmbuild/RPMS/*/*.rpm ."
- name: "Upload artifact"
uses: actions/upload-artifact@v3
with:
name: "centos8"
path: "wezterm-*.rpm"
name: "ubuntu24.04"
path: |
wezterm-*.deb
wezterm-*.xz
upload:
runs-on: ubuntu-latest
@ -104,10 +106,10 @@ jobs:
- name: "Download artifact"
uses: actions/download-artifact@v3
with:
name: "centos8"
name: "ubuntu24.04"
- name: "Checksum"
shell: bash
run: "for f in wezterm-*.rpm ; do sha256sum $f > $f.sha256 ; done"
run: "for f in wezterm-*.deb wezterm-*.xz ; do sha256sum $f > $f.sha256 ; done"
- name: "Create pre-release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -117,4 +119,4 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: "bash ci/retry.sh gh release upload --clobber $(ci/tag-name.sh) wezterm-*.rpm *.sha256"
run: "bash ci/retry.sh gh release upload --clobber $(ci/tag-name.sh) wezterm-*.deb wezterm-*.xz *.sha256"

View File

@ -35,7 +35,7 @@ jobs:
with:
target: "x86_64-pc-windows-msvc"
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -38,7 +38,7 @@ jobs:
with:
target: "x86_64-pc-windows-msvc"
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

View File

@ -25,7 +25,7 @@ jobs:
with:
target: "x86_64-pc-windows-msvc"
- name: "Compile with sccache"
uses: mozilla-actions/sccache-action@v0.0.4
uses: mozilla-actions/sccache-action@v0.0.5
- name: "Cache Rust Dependencies"
uses: actions/cache@v4
id: cache-cargo-vendor

1132
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -136,7 +136,7 @@ class CacheStep(ActionStep):
class SccacheStep(ActionStep):
def __init__(self, name):
super().__init__(name, action="mozilla-actions/sccache-action@v0.0.4")
super().__init__(name, action="mozilla-actions/sccache-action@v0.0.5")
class CheckoutStep(ActionStep):
@ -379,6 +379,17 @@ rustup default {toolchain}
""",
),
]
elif "macos" in self.name:
steps += [
RunStep(
name="Install Rust (ARM)",
run="rustup target add aarch64-apple-darwin",
),
RunStep(
name="Install Rust (Intel)",
run="rustup target add x86_64-apple-darwin",
)
]
else:
steps += [
ActionStep(
@ -387,13 +398,6 @@ rustup default {toolchain}
params=params,
),
]
if "macos" in self.name:
steps += [
RunStep(
name="Install Rust (ARM)",
run="rustup target add aarch64-apple-darwin",
)
]
if cache:
steps += [
SccacheStep(name="Compile with sccache"),
@ -994,6 +998,7 @@ rustup default {toolchain}
TARGETS = [
Target(container="ubuntu:20.04", continuous_only=True, app_image=True),
Target(container="ubuntu:22.04", continuous_only=True),
Target(container="ubuntu:24.04", continuous_only=True),
# debian 8's wayland libraries are too old for wayland-client
# Target(container="debian:8.11", continuous_only=True, bootstrap_git=True),
# harfbuzz's C++ is too new for debian 9's toolchain
@ -1001,9 +1006,8 @@ TARGETS = [
Target(container="debian:10.3", continuous_only=True),
Target(container="debian:11", continuous_only=True),
Target(container="debian:12", continuous_only=True),
Target(name="centos8", container="quay.io/centos/centos:stream8"),
Target(name="centos9", container="quay.io/centos/centos:stream9"),
Target(name="macos", os="macos-11"),
Target(name="macos", os="macos-latest"),
# https://fedoraproject.org/wiki/End_of_life?rd=LifeCycle/EOL
Target(container="fedora:38"),
Target(container="fedora:39"),

View File

@ -12,7 +12,7 @@ anyhow = "1.0"
config = { path = "../config" }
leb128 = "0.2"
log = "0.4"
metrics = "0.22"
metrics = "0.23"
mux = { path = "../mux" }
portable-pty = { path = "../pty", features = ["serde_support"]}
rangeset = { path = "../rangeset" }

View File

@ -5,6 +5,7 @@ use syn::{
Result, Type,
};
#[allow(unused)]
pub struct ContainerInfo {
pub into: Option<Path>,
pub try_from: Option<Path>,
@ -67,6 +68,7 @@ pub enum DefValue {
Path(Path),
}
#[allow(unused)]
pub struct FieldInfo<'a> {
pub field: &'a Field,
pub type_name: String,

View File

@ -469,6 +469,9 @@ pub struct Config {
#[dynamic(default = "default_true")]
pub show_new_tab_button_in_tab_bar: bool,
#[dynamic(default = "default_true")]
pub show_close_tab_button_in_tabs: bool,
/// If true, show_tab_index_in_tab_bar uses a zero-based index.
/// The default is false and the tab shows a one-based index.
#[dynamic(default)]
@ -1673,6 +1676,14 @@ fn default_font_size() -> f64 {
12.0
}
pub(crate) fn compute_cache_dir() -> anyhow::Result<PathBuf> {
if let Some(runtime) = dirs_next::cache_dir() {
return Ok(runtime.join("wezterm"));
}
Ok(crate::HOME_DIR.join(".local/share/wezterm"))
}
pub(crate) fn compute_data_dir() -> anyhow::Result<PathBuf> {
if let Some(runtime) = dirs_next::data_dir() {
return Ok(runtime.join("wezterm"));

View File

@ -67,6 +67,7 @@ lazy_static! {
pub static ref CONFIG_DIRS: Vec<PathBuf> = config_dirs();
pub static ref RUNTIME_DIR: PathBuf = compute_runtime_dir().unwrap();
pub static ref DATA_DIR: PathBuf = compute_data_dir().unwrap();
pub static ref CACHE_DIR: PathBuf = compute_cache_dir().unwrap();
static ref CONFIG: Configuration = Configuration::new();
static ref CONFIG_FILE_OVERRIDE: Mutex<Option<PathBuf>> = Mutex::new(None);
static ref CONFIG_SKIP: AtomicBool = AtomicBool::new(false);

View File

@ -1,6 +1,6 @@
//! This file was generated by sync-color-schemes
pub const SCHEMES: [(&'static str, &'static str); 993] = [
pub const SCHEMES: [(&'static str, &'static str); 1001] = [
// Start here
("3024 (base16)", "[colors]\nansi = [\n \"#090300\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#a5a2a2\",\n]\nbackground = \"#090300\"\nbrights = [\n \"#5c5855\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#a5a2a2\"\ncursor_border = \"#a5a2a2\"\ncursor_fg = \"#090300\"\nforeground = \"#a5a2a2\"\nselection_bg = \"#a5a2a2\"\nselection_fg = \"#090300\"\n\n[colors.indexed]\n16 = \"#e8bbd0\"\n17 = \"#cdab53\"\n18 = \"#3a3432\"\n19 = \"#4a4543\"\n20 = \"#807d7c\"\n21 = \"#d6d5d4\"\n\n[metadata]\naliases = [\"3024 (dark) (terminal.sexy)\"]\nauthor = \"Jan T. Sott (http://github.com/idleberg)\"\nname = \"3024 (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -37,6 +37,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Ashes (base16)", "[colors]\nansi = [\n \"#1c2023\",\n \"#c7ae95\",\n \"#95c7ae\",\n \"#aec795\",\n \"#ae95c7\",\n \"#c795ae\",\n \"#95aec7\",\n \"#c7ccd1\",\n]\nbackground = \"#1c2023\"\nbrights = [\n \"#747c84\",\n \"#c7ae95\",\n \"#95c7ae\",\n \"#aec795\",\n \"#ae95c7\",\n \"#c795ae\",\n \"#95aec7\",\n \"#f3f4f5\",\n]\ncursor_bg = \"#c7ccd1\"\ncursor_border = \"#c7ccd1\"\ncursor_fg = \"#1c2023\"\nforeground = \"#c7ccd1\"\nselection_bg = \"#c7ccd1\"\nselection_fg = \"#1c2023\"\n\n[colors.indexed]\n16 = \"#c7c795\"\n17 = \"#c79595\"\n18 = \"#393f45\"\n19 = \"#565e65\"\n20 = \"#adb3ba\"\n21 = \"#dfe2e5\"\n\n[metadata]\naliases = [\"Ashes (dark) (terminal.sexy)\"]\nauthor = \"Jannik Siebert (https://github.com/janniks)\"\nname = \"Ashes (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Ashes (dark) (terminal.sexy)", "[colors]\nansi = [\n \"#1c2023\",\n \"#c7ae95\",\n \"#95c7ae\",\n \"#aec795\",\n \"#ae95c7\",\n \"#c795ae\",\n \"#95aec7\",\n \"#c7ccd1\",\n]\nbackground = \"#1c2023\"\nbrights = [\n \"#747c84\",\n \"#c7ae95\",\n \"#95c7ae\",\n \"#aec795\",\n \"#ae95c7\",\n \"#c795ae\",\n \"#95aec7\",\n \"#f3f4f5\",\n]\nforeground = \"#c7ccd1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Ashes (dark) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("Ashes (light) (terminal.sexy)", "[colors]\nansi = [\n \"#1c2023\",\n \"#c7ae95\",\n \"#95c7ae\",\n \"#aec795\",\n \"#ae95c7\",\n \"#c795ae\",\n \"#95aec7\",\n \"#c7ccd1\",\n]\nbackground = \"#f3f4f5\"\nbrights = [\n \"#747c84\",\n \"#c7ae95\",\n \"#95c7ae\",\n \"#aec795\",\n \"#ae95c7\",\n \"#c795ae\",\n \"#95aec7\",\n \"#f3f4f5\",\n]\nforeground = \"#565e65\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Ashes (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Astrodark (Gogh)", "[colors]\nansi = [\n \"#111317\",\n \"#f8747e\",\n \"#75ad47\",\n \"#d09214\",\n \"#50a4e9\",\n \"#cc83e3\",\n \"#00b298\",\n \"#adb0bb\",\n]\nbackground = \"#1a1d23\"\nbrights = [\n \"#576176\",\n \"#faa5ab\",\n \"#a5cd84\",\n \"#efbd58\",\n \"#8dc3f1\",\n \"#deaeed\",\n \"#27ffdf\",\n \"#caccd3\",\n]\ncursor_bg = \"#caccd3\"\ncursor_border = \"#caccd3\"\ncursor_fg = \"#1a1d23\"\nforeground = \"#9b9fa9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Astrodark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"),
("astromouse (terminal.sexy)", "[colors]\nansi = [\n \"#1c1c1c\",\n \"#d770af\",\n \"#9acc79\",\n \"#d0d26b\",\n \"#77b6c5\",\n \"#a488d9\",\n \"#7fcab3\",\n \"#8d8d8d\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#3d3a3a\",\n \"#d28abf\",\n \"#8fb676\",\n \"#c8bc45\",\n \"#8fa7b9\",\n \"#bd89de\",\n \"#6ec2a8\",\n \"#dad3d3\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"astromouse (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Atelier Cave (base16)", "[colors]\nansi = [\n \"#19171c\",\n \"#be4678\",\n \"#2a9292\",\n \"#a06e3b\",\n \"#576ddb\",\n \"#955ae7\",\n \"#398bc6\",\n \"#8b8792\",\n]\nbackground = \"#19171c\"\nbrights = [\n \"#655f6d\",\n \"#be4678\",\n \"#2a9292\",\n \"#a06e3b\",\n \"#576ddb\",\n \"#955ae7\",\n \"#398bc6\",\n \"#efecf4\",\n]\ncursor_bg = \"#8b8792\"\ncursor_border = \"#8b8792\"\ncursor_fg = \"#19171c\"\nforeground = \"#8b8792\"\nselection_bg = \"#8b8792\"\nselection_fg = \"#19171c\"\n\n[colors.indexed]\n16 = \"#aa573c\"\n17 = \"#bf40bf\"\n18 = \"#26232a\"\n19 = \"#585260\"\n20 = \"#7e7887\"\n21 = \"#e2dfe7\"\n\n[metadata]\naliases = []\nauthor = \"Bram de Haan (http://atelierbramdehaan.nl)\"\nname = \"Atelier Cave (base16)\"\norigin_url = \"https://github.com/atelierbram/base16-atelier-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Atelier Cave Light (base16)", "[colors]\nansi = [\n \"#efecf4\",\n \"#be4678\",\n \"#2a9292\",\n \"#a06e3b\",\n \"#576ddb\",\n \"#955ae7\",\n \"#398bc6\",\n \"#585260\",\n]\nbackground = \"#efecf4\"\nbrights = [\n \"#7e7887\",\n \"#be4678\",\n \"#2a9292\",\n \"#a06e3b\",\n \"#576ddb\",\n \"#955ae7\",\n \"#398bc6\",\n \"#19171c\",\n]\ncursor_bg = \"#585260\"\ncursor_border = \"#585260\"\ncursor_fg = \"#efecf4\"\nforeground = \"#585260\"\nselection_bg = \"#585260\"\nselection_fg = \"#efecf4\"\n\n[colors.indexed]\n16 = \"#aa573c\"\n17 = \"#bf40bf\"\n18 = \"#e2dfe7\"\n19 = \"#8b8792\"\n20 = \"#655f6d\"\n21 = \"#26232a\"\n\n[metadata]\naliases = []\nauthor = \"Bram de Haan (http://atelierbramdehaan.nl)\"\nname = \"Atelier Cave Light (base16)\"\norigin_url = \"https://github.com/atelierbram/base16-atelier-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -123,6 +124,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("BlulocoLight", "[colors]\nansi = [\n \"#373a41\",\n \"#d52753\",\n \"#23974a\",\n \"#df631c\",\n \"#275fe4\",\n \"#823ff1\",\n \"#27618d\",\n \"#babbc2\",\n]\nbackground = \"#f9f9f9\"\nbrights = [\n \"#676a77\",\n \"#ff6480\",\n \"#3cbc66\",\n \"#c5a332\",\n \"#0099e1\",\n \"#ce33c0\",\n \"#6d93bb\",\n \"#d3d3d3\",\n]\ncursor_bg = \"#f32759\"\ncursor_border = \"#f32759\"\ncursor_fg = \"#ffffff\"\nforeground = \"#373a41\"\nselection_bg = \"#daf0ff\"\nselection_fg = \"#373a41\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"BlulocoLight\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Borland", "[colors]\nansi = [\n \"#4f4f4f\",\n \"#ff6c60\",\n \"#a8ff60\",\n \"#ffffb6\",\n \"#96cbfe\",\n \"#ff73fd\",\n \"#c6c5fe\",\n \"#eeeeee\",\n]\nbackground = \"#0000a4\"\nbrights = [\n \"#7c7c7c\",\n \"#ffb6b0\",\n \"#ceffac\",\n \"#ffffcc\",\n \"#b5dcff\",\n \"#ff9cfe\",\n \"#dfdffe\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffa560\"\ncursor_border = \"#ffa560\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ffff4e\"\nselection_bg = \"#a4a4a4\"\nselection_fg = \"#0000a4\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Borland (Gogh)\"]\nname = \"Borland\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Borland (Gogh)", "[colors]\nansi = [\n \"#4f4f4f\",\n \"#ff6c60\",\n \"#a8ff60\",\n \"#ffffb6\",\n \"#96cbfe\",\n \"#ff73fd\",\n \"#c6c5fe\",\n \"#eeeeee\",\n]\nbackground = \"#0000a4\"\nbrights = [\n \"#7c7c7c\",\n \"#ffb6b0\",\n \"#ceffac\",\n \"#ffffcc\",\n \"#b5dcff\",\n \"#ff9cfe\",\n \"#dfdffe\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffff4e\"\ncursor_border = \"#ffff4e\"\ncursor_fg = \"#0000a4\"\nforeground = \"#ffff4e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Borland (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("Breadog (Gogh)", "[colors]\nansi = [\n \"#362c24\",\n \"#b10b00\",\n \"#007232\",\n \"#8b4c00\",\n \"#005cb4\",\n \"#9b0097\",\n \"#006a78\",\n \"#d4c3b7\",\n]\nbackground = \"#f1ebe6\"\nbrights = [\n \"#514337\",\n \"#de1100\",\n \"#008f40\",\n \"#ae6000\",\n \"#0074e1\",\n \"#c300bd\",\n \"#008697\",\n \"#eae1da\",\n]\ncursor_bg = \"#362c24\"\ncursor_border = \"#362c24\"\ncursor_fg = \"#f1ebe6\"\nforeground = \"#362c24\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Breadog (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"),
("Breath (Gogh)", "[colors]\nansi = [\n \"#1e2229\",\n \"#ed1515\",\n \"#44853a\",\n \"#f67400\",\n \"#1d99f3\",\n \"#9b59b6\",\n \"#1abc9c\",\n \"#fcfcfc\",\n]\nbackground = \"#1e2229\"\nbrights = [\n \"#7f8c8d\",\n \"#c0392b\",\n \"#55a649\",\n \"#fdbc4b\",\n \"#3daee9\",\n \"#8e44ad\",\n \"#16a085\",\n \"#ffffff\",\n]\ncursor_bg = \"#17a88b\"\ncursor_border = \"#17a88b\"\ncursor_fg = \"#1e2229\"\nforeground = \"#17a88b\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Breath (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"),
("Breath Darker (Gogh)", "[colors]\nansi = [\n \"#1e2229\",\n \"#ed1515\",\n \"#44853a\",\n \"#f67400\",\n \"#1d99f3\",\n \"#9b59b6\",\n \"#1abc9c\",\n \"#fcfcfc\",\n]\nbackground = \"#080d14\"\nbrights = [\n \"#7f8c8d\",\n \"#c0392b\",\n \"#55a649\",\n \"#fdbc4b\",\n \"#3daee9\",\n \"#8e44ad\",\n \"#16a085\",\n \"#ffffff\",\n]\ncursor_bg = \"#17a88b\"\ncursor_border = \"#17a88b\"\ncursor_fg = \"#080d14\"\nforeground = \"#17a88b\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Breath Darker (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"),
("Breath Light (Gogh)", "[colors]\nansi = [\n \"#e8e8e8\",\n \"#ed1515\",\n \"#c0392b\",\n \"#f67400\",\n \"#1d99f3\",\n \"#9b59b6\",\n \"#1abc9c\",\n \"#fcfcfc\",\n]\nbackground = \"#e8e8e8\"\nbrights = [\n \"#7f8c8d\",\n \"#c0392b\",\n \"#55a649\",\n \"#fdbc4b\",\n \"#3daee9\",\n \"#8e44ad\",\n \"#16a085\",\n \"#ffffff\",\n]\ncursor_bg = \"#292f34\"\ncursor_border = \"#292f34\"\ncursor_fg = \"#e8e8e8\"\nforeground = \"#292f34\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"BreathLight (Gogh)\"]\nname = \"Breath Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"),
@ -183,6 +185,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Ciapre", "[colors]\nansi = [\n \"#181818\",\n \"#810009\",\n \"#48513b\",\n \"#cc8b3f\",\n \"#576d8c\",\n \"#724d7c\",\n \"#5c4f4b\",\n \"#aea47f\",\n]\nbackground = \"#191c27\"\nbrights = [\n \"#555555\",\n \"#ac3835\",\n \"#a6a75d\",\n \"#dcdf7c\",\n \"#3097c6\",\n \"#d33061\",\n \"#f3dbb2\",\n \"#f4f4f4\",\n]\ncursor_bg = \"#92805b\"\ncursor_border = \"#92805b\"\ncursor_fg = \"#181818\"\nforeground = \"#aea47a\"\nselection_bg = \"#172539\"\nselection_fg = \"#aea47f\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Ciapre (Gogh)\"]\nname = \"Ciapre\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Ciapre (Gogh)", "[colors]\nansi = [\n \"#181818\",\n \"#810009\",\n \"#48513b\",\n \"#cc8b3f\",\n \"#576d8c\",\n \"#724d7c\",\n \"#5c4f4b\",\n \"#aea47f\",\n]\nbackground = \"#191c27\"\nbrights = [\n \"#555555\",\n \"#ac3835\",\n \"#a6a75d\",\n \"#dcdf7c\",\n \"#3097c6\",\n \"#d33061\",\n \"#f3dbb2\",\n \"#f4f4f4\",\n]\ncursor_bg = \"#aea47a\"\ncursor_border = \"#aea47a\"\ncursor_fg = \"#191c27\"\nforeground = \"#aea47a\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Ciapre (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("Circus (base16)", "[colors]\nansi = [\n \"#191919\",\n \"#dc657d\",\n \"#84b97c\",\n \"#c3ba63\",\n \"#639ee4\",\n \"#b888e2\",\n \"#4bb1a7\",\n \"#a7a7a7\",\n]\nbackground = \"#191919\"\nbrights = [\n \"#5f5a60\",\n \"#dc657d\",\n \"#84b97c\",\n \"#c3ba63\",\n \"#639ee4\",\n \"#b888e2\",\n \"#4bb1a7\",\n \"#ffffff\",\n]\ncursor_bg = \"#a7a7a7\"\ncursor_border = \"#a7a7a7\"\ncursor_fg = \"#191919\"\nforeground = \"#a7a7a7\"\nselection_bg = \"#a7a7a7\"\nselection_fg = \"#191919\"\n\n[colors.indexed]\n16 = \"#4bb1a7\"\n17 = \"#b888e2\"\n18 = \"#202020\"\n19 = \"#303030\"\n20 = \"#505050\"\n21 = \"#808080\"\n\n[metadata]\naliases = []\nauthor = \"Stephan Boyer (https://github.com/stepchowfun) and Esther Wang (https://github.com/ewang12)\"\nname = \"Circus (base16)\"\norigin_url = \"https://github.com/stepchowfun/base16-circus-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("City Lights (Gogh)", "[colors]\nansi = [\n \"#41505e\",\n \"#d95468\",\n \"#8bd49c\",\n \"#ebbf83\",\n \"#539afc\",\n \"#b62d65\",\n \"#70e1e8\",\n \"#ffffff\",\n]\nbackground = \"#171d23\"\nbrights = [\n \"#41505e\",\n \"#d95468\",\n \"#8bd49c\",\n \"#ebbf83\",\n \"#539afc\",\n \"#b62d65\",\n \"#70e1e8\",\n \"#ffffff\",\n]\ncursor_bg = \"#008b94\"\ncursor_border = \"#008b94\"\ncursor_fg = \"#171d23\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"City Lights (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"),
("City Streets (terminal.sexy)", "[colors]\nansi = [\n \"#201e24\",\n \"#2d2b30\",\n \"#3f3d40\",\n \"#413c3e\",\n \"#423e41\",\n \"#4e4a4b\",\n \"#6e6765\",\n \"#837e81\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#837c78\",\n \"#89827d\",\n \"#a7a099\",\n \"#c2bec1\",\n \"#c3bcb2\",\n \"#cbc5ba\",\n \"#e3ddd2\",\n \"#efe8dc\",\n]\nforeground = \"#d3d3d3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"dkeg\"\nname = \"City Streets (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Classic Dark (base16)", "[colors]\nansi = [\n \"#151515\",\n \"#ac4142\",\n \"#90a959\",\n \"#f4bf75\",\n \"#6a9fb5\",\n \"#aa759f\",\n \"#75b5aa\",\n \"#d0d0d0\",\n]\nbackground = \"#151515\"\nbrights = [\n \"#505050\",\n \"#ac4142\",\n \"#90a959\",\n \"#f4bf75\",\n \"#6a9fb5\",\n \"#aa759f\",\n \"#75b5aa\",\n \"#f5f5f5\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#151515\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#d0d0d0\"\nselection_fg = \"#151515\"\n\n[colors.indexed]\n16 = \"#d28445\"\n17 = \"#8f5536\"\n18 = \"#202020\"\n19 = \"#303030\"\n20 = \"#b0b0b0\"\n21 = \"#e0e0e0\"\n\n[metadata]\naliases = [\"Default (dark) (terminal.sexy)\"]\nauthor = \"Jason Heeris (http://heeris.id.au)\"\nname = \"Classic Dark (base16)\"\norigin_url = \"https://github.com/detly/base16-classic-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Classic Light (base16)", "[colors]\nansi = [\n \"#f5f5f5\",\n \"#ac4142\",\n \"#90a959\",\n \"#f4bf75\",\n \"#6a9fb5\",\n \"#aa759f\",\n \"#75b5aa\",\n \"#303030\",\n]\nbackground = \"#f5f5f5\"\nbrights = [\n \"#b0b0b0\",\n \"#ac4142\",\n \"#90a959\",\n \"#f4bf75\",\n \"#6a9fb5\",\n \"#aa759f\",\n \"#75b5aa\",\n \"#151515\",\n]\ncursor_bg = \"#303030\"\ncursor_border = \"#303030\"\ncursor_fg = \"#f5f5f5\"\nforeground = \"#303030\"\nselection_bg = \"#303030\"\nselection_fg = \"#f5f5f5\"\n\n[colors.indexed]\n16 = \"#d28445\"\n17 = \"#8f5536\"\n18 = \"#e0e0e0\"\n19 = \"#d0d0d0\"\n20 = \"#505050\"\n21 = \"#202020\"\n\n[metadata]\naliases = []\nauthor = \"Jason Heeris (http://heeris.id.au)\"\nname = \"Classic Light (base16)\"\norigin_url = \"https://github.com/detly/base16-classic-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -207,7 +210,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("CrayonPonyFish", "[colors]\nansi = [\n \"#2b1b1d\",\n \"#91002b\",\n \"#579524\",\n \"#ab311b\",\n \"#8c87b0\",\n \"#692f50\",\n \"#e8a866\",\n \"#68525a\",\n]\nbackground = \"#150707\"\nbrights = [\n \"#3d2b2e\",\n \"#c5255d\",\n \"#8dff57\",\n \"#c8381d\",\n \"#cfc9ff\",\n \"#fc6cba\",\n \"#ffceaf\",\n \"#b0949d\",\n]\ncursor_bg = \"#68525a\"\ncursor_border = \"#68525a\"\ncursor_fg = \"#140707\"\nforeground = \"#68525a\"\nselection_bg = \"#2b1b1d\"\nselection_fg = \"#69525a\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Crayon Pony Fish (Gogh)\"]\nname = \"CrayonPonyFish\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Cupcake (base16)", "[colors]\nansi = [\n \"#fbf1f2\",\n \"#d57e85\",\n \"#a3b367\",\n \"#dcb16c\",\n \"#7297b9\",\n \"#bb99b4\",\n \"#69a9a7\",\n \"#8b8198\",\n]\nbackground = \"#fbf1f2\"\nbrights = [\n \"#bfb9c6\",\n \"#d57e85\",\n \"#a3b367\",\n \"#dcb16c\",\n \"#7297b9\",\n \"#bb99b4\",\n \"#69a9a7\",\n \"#585062\",\n]\ncursor_bg = \"#8b8198\"\ncursor_border = \"#8b8198\"\ncursor_fg = \"#fbf1f2\"\nforeground = \"#8b8198\"\nselection_bg = \"#8b8198\"\nselection_fg = \"#fbf1f2\"\n\n[colors.indexed]\n16 = \"#ebb790\"\n17 = \"#baa58c\"\n18 = \"#f2f1f4\"\n19 = \"#d8d5dd\"\n20 = \"#a59daf\"\n21 = \"#72677e\"\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson (http://chriskempson.com)\"\nname = \"Cupcake (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-default-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Cupertino (base16)", "[colors]\nansi = [\n \"#ffffff\",\n \"#c41a15\",\n \"#007400\",\n \"#826b28\",\n \"#0000ff\",\n \"#a90d91\",\n \"#318495\",\n \"#404040\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#808080\",\n \"#c41a15\",\n \"#007400\",\n \"#826b28\",\n \"#0000ff\",\n \"#a90d91\",\n \"#318495\",\n \"#5e5e5e\",\n]\ncursor_bg = \"#404040\"\ncursor_border = \"#404040\"\ncursor_fg = \"#ffffff\"\nforeground = \"#404040\"\nselection_bg = \"#404040\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n16 = \"#eb8500\"\n17 = \"#826b28\"\n18 = \"#c0c0c0\"\n19 = \"#c0c0c0\"\n20 = \"#808080\"\n21 = \"#404040\"\n\n[metadata]\naliases = []\nauthor = \"Defman21\"\nname = \"Cupertino (base16)\"\norigin_url = \"https://github.com/Defman21/base16-cupertino\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("CutiePro", "[colors]\nansi = [\n \"#000000\",\n \"#f56e7f\",\n \"#bec975\",\n \"#f58669\",\n \"#42d9c5\",\n \"#d286b7\",\n \"#37cb8a\",\n \"#d5c3c3\",\n]\nbackground = \"#181818\"\nbrights = [\n \"#373b41\",\n \"#e5a1a3\",\n \"#e8d6a7\",\n \"#f1bb79\",\n \"#80c5de\",\n \"#b294bb\",\n \"#9dccbb\",\n \"#ffffff\",\n]\ncursor_bg = \"#efc4cd\"\ncursor_border = \"#efc4cd\"\ncursor_fg = \"#181818\"\nforeground = \"#d5d0c9\"\nselection_bg = \"#363636\"\nselection_fg = \"#d5d0c9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"CutiePro\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"),
("CutiePro", "[colors]\nansi = [\n \"#000000\",\n \"#f56e7f\",\n \"#bec975\",\n \"#f58669\",\n \"#42d9c5\",\n \"#d286b7\",\n \"#37cb8a\",\n \"#d5c3c3\",\n]\nbackground = \"#181818\"\nbrights = [\n \"#88847f\",\n \"#e5a1a3\",\n \"#e8d6a7\",\n \"#f1bb79\",\n \"#80c5de\",\n \"#b294bb\",\n \"#9dccbb\",\n \"#ffffff\",\n]\ncursor_bg = \"#efc4cd\"\ncursor_border = \"#efc4cd\"\ncursor_fg = \"#181818\"\nforeground = \"#d5d0c9\"\nselection_bg = \"#363636\"\nselection_fg = \"#d5d0c9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"CutiePro\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"),
("Cyberdyne", "[colors]\nansi = [\n \"#080808\",\n \"#ff8373\",\n \"#00c172\",\n \"#d2a700\",\n \"#0071cf\",\n \"#ff90fe\",\n \"#6bffdd\",\n \"#f1f1f1\",\n]\nbackground = \"#151144\"\nbrights = [\n \"#2e2e2e\",\n \"#ffc4be\",\n \"#d6fcba\",\n \"#fffed5\",\n \"#c2e3ff\",\n \"#ffb2fe\",\n \"#e6e7fe\",\n \"#ffffff\",\n]\ncursor_bg = \"#00ff9c\"\ncursor_border = \"#00ff9c\"\ncursor_fg = \"#ffffff\"\nforeground = \"#00ff92\"\nselection_bg = \"#454d96\"\nselection_fg = \"#f4f4f4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Cyberdyne\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("cyberpunk", "[colors]\nansi = [\n \"#000000\",\n \"#ff7092\",\n \"#00fbac\",\n \"#fffa6a\",\n \"#00bfff\",\n \"#df95ff\",\n \"#86cbfe\",\n \"#ffffff\",\n]\nbackground = \"#332a57\"\nbrights = [\n \"#000000\",\n \"#ff8aa4\",\n \"#21f6bc\",\n \"#fff787\",\n \"#1bccfd\",\n \"#e6aefe\",\n \"#99d6fc\",\n \"#ffffff\",\n]\ncursor_bg = \"#21f6bc\"\ncursor_border = \"#21f6bc\"\ncursor_fg = \"#ffffff\"\nforeground = \"#e6e6e6\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"cyberpunk\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("DanQing (base16)", "[colors]\nansi = [\n \"#2d302f\",\n \"#f9906f\",\n \"#8ab361\",\n \"#f0c239\",\n \"#b0a4e3\",\n \"#cca4e3\",\n \"#30dff3\",\n \"#e0f0ef\",\n]\nbackground = \"#2d302f\"\nbrights = [\n \"#9da8a3\",\n \"#f9906f\",\n \"#8ab361\",\n \"#f0c239\",\n \"#b0a4e3\",\n \"#cca4e3\",\n \"#30dff3\",\n \"#fcfefd\",\n]\ncursor_bg = \"#e0f0ef\"\ncursor_border = \"#e0f0ef\"\ncursor_fg = \"#2d302f\"\nforeground = \"#e0f0ef\"\nselection_bg = \"#e0f0ef\"\nselection_fg = \"#2d302f\"\n\n[colors.indexed]\n16 = \"#b38a61\"\n17 = \"#ca6924\"\n18 = \"#434846\"\n19 = \"#5a605d\"\n20 = \"#cad8d2\"\n21 = \"#ecf6f2\"\n\n[metadata]\naliases = []\nauthor = \"Wenhan Zhu (Cosmos) (zhuwenhan950913@gmail.com)\"\nname = \"DanQing (base16)\"\norigin_url = \"https://github.com/CosmosAtlas/base16-danqing-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -467,6 +470,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Ic Orange Ppl (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#c13900\",\n \"#a4a900\",\n \"#caaf00\",\n \"#bd6d00\",\n \"#fc5e00\",\n \"#f79500\",\n \"#ffc88a\",\n]\nbackground = \"#262626\"\nbrights = [\n \"#6a4f2a\",\n \"#ff8c68\",\n \"#f6ff40\",\n \"#ffe36e\",\n \"#ffbe55\",\n \"#fc874f\",\n \"#c69752\",\n \"#fafaff\",\n]\ncursor_bg = \"#ffcb83\"\ncursor_border = \"#ffcb83\"\ncursor_fg = \"#262626\"\nforeground = \"#ffcb83\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Ic Orange Ppl (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("IC_Green_PPL", "[colors]\nansi = [\n \"#014401\",\n \"#ff2736\",\n \"#41a638\",\n \"#76a831\",\n \"#2ec3b9\",\n \"#50a096\",\n \"#3ca078\",\n \"#e6fef2\",\n]\nbackground = \"#2c2c2c\"\nbrights = [\n \"#035c03\",\n \"#b4fa5c\",\n \"#aefb86\",\n \"#dafa87\",\n \"#2efaeb\",\n \"#50fafa\",\n \"#3cfac8\",\n \"#e0f1dc\",\n]\ncursor_bg = \"#47fa6b\"\ncursor_border = \"#47fa6b\"\ncursor_fg = \"#292929\"\nforeground = \"#e0f1dc\"\nselection_bg = \"#116b41\"\nselection_fg = \"#e0f1dc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"IC_Green_PPL\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("IC_Orange_PPL", "[colors]\nansi = [\n \"#000000\",\n \"#c13900\",\n \"#a4a900\",\n \"#caaf00\",\n \"#bd6d00\",\n \"#fc5e00\",\n \"#f79500\",\n \"#ffc88a\",\n]\nbackground = \"#262626\"\nbrights = [\n \"#6a4f2a\",\n \"#ff8c68\",\n \"#f6ff40\",\n \"#ffe36e\",\n \"#ffbe55\",\n \"#fc874f\",\n \"#c69752\",\n \"#fafaff\",\n]\ncursor_bg = \"#fc531d\"\ncursor_border = \"#fc531d\"\ncursor_fg = \"#ffc88a\"\nforeground = \"#ffcb83\"\nselection_bg = \"#c14020\"\nselection_fg = \"#ffc88a\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"ICOrangePPL (Gogh)\",\n \"Ic Orange Ppl (Gogh)\",\n]\nname = \"IC_Orange_PPL\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Iceberg (Gogh)", "[colors]\nansi = [\n \"#161821\",\n \"#e27878\",\n \"#b4be82\",\n \"#e2a478\",\n \"#84a0c6\",\n \"#a093c7\",\n \"#89b8c2\",\n \"#c6c8d1\",\n]\nbackground = \"#161821\"\nbrights = [\n \"#6b7089\",\n \"#e98989\",\n \"#c0ca8e\",\n \"#e9b189\",\n \"#91acd1\",\n \"#ada0d3\",\n \"#95c4ce\",\n \"#d2d4de\",\n]\ncursor_bg = \"#d2d4de\"\ncursor_border = \"#d2d4de\"\ncursor_fg = \"#161821\"\nforeground = \"#c6c8d1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Iceberg (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"),
("iceberg-dark", "[colors]\nansi = [\n \"#1e2132\",\n \"#e27878\",\n \"#b4be82\",\n \"#e2a478\",\n \"#84a0c6\",\n \"#a093c7\",\n \"#89b8c2\",\n \"#c6c8d1\",\n]\nbackground = \"#161821\"\nbrights = [\n \"#6b7089\",\n \"#e98989\",\n \"#c0ca8e\",\n \"#e9b189\",\n \"#91acd1\",\n \"#ada0d3\",\n \"#95c4ce\",\n \"#d2d4de\",\n]\ncursor_bg = \"#c6c8d1\"\ncursor_border = \"#c6c8d1\"\ncursor_fg = \"#161821\"\nforeground = \"#c6c8d1\"\nselection_bg = \"#c6c8d1\"\nselection_fg = \"#161821\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iceberg-dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("iceberg-light", "[colors]\nansi = [\n \"#dcdfe7\",\n \"#cc517a\",\n \"#668e3d\",\n \"#c57339\",\n \"#2d539e\",\n \"#7759b4\",\n \"#3f83a6\",\n \"#33374c\",\n]\nbackground = \"#e8e9ec\"\nbrights = [\n \"#8389a3\",\n \"#cc3768\",\n \"#598030\",\n \"#b6662d\",\n \"#22478e\",\n \"#6845ad\",\n \"#327698\",\n \"#262a3f\",\n]\ncursor_bg = \"#33374c\"\ncursor_border = \"#33374c\"\ncursor_fg = \"#e8e9ec\"\nforeground = \"#33374c\"\nselection_bg = \"#33374c\"\nselection_fg = \"#e8e9ec\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iceberg-light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Icy Dark (base16)", "[colors]\nansi = [\n \"#021012\",\n \"#16c1d9\",\n \"#4dd0e1\",\n \"#80deea\",\n \"#00bcd4\",\n \"#00acc1\",\n \"#26c6da\",\n \"#095b67\",\n]\nbackground = \"#021012\"\nbrights = [\n \"#052e34\",\n \"#16c1d9\",\n \"#4dd0e1\",\n \"#80deea\",\n \"#00bcd4\",\n \"#00acc1\",\n \"#26c6da\",\n \"#109cb0\",\n]\ncursor_bg = \"#095b67\"\ncursor_border = \"#095b67\"\ncursor_fg = \"#021012\"\nforeground = \"#095b67\"\nselection_bg = \"#095b67\"\nselection_fg = \"#021012\"\n\n[colors.indexed]\n16 = \"#b3ebf2\"\n17 = \"#0097a7\"\n18 = \"#031619\"\n19 = \"#041f23\"\n20 = \"#064048\"\n21 = \"#0c7c8c\"\n\n[metadata]\naliases = []\nauthor = \"icyphox (https://icyphox.ga)\"\nname = \"Icy Dark (base16)\"\norigin_url = \"https://github.com/icyphox/base16-icy-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -513,6 +517,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Kokuban (Gogh)", "[colors]\nansi = [\n \"#2e8744\",\n \"#d84e4c\",\n \"#95da5a\",\n \"#d6e264\",\n \"#4b9ed7\",\n \"#945fc5\",\n \"#d89b25\",\n \"#d8e2d7\",\n]\nbackground = \"#0d4a08\"\nbrights = [\n \"#34934f\",\n \"#ff4f59\",\n \"#aff56a\",\n \"#fcff75\",\n \"#57aeff\",\n \"#ae63e9\",\n \"#ffaa2b\",\n \"#fffefe\",\n]\ncursor_bg = \"#d8e2d7\"\ncursor_border = \"#d8e2d7\"\ncursor_fg = \"#0d4a08\"\nforeground = \"#d8e2d7\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"kokuban (Gogh)\"]\nname = \"Kokuban (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Kolorit", "[colors]\nansi = [\n \"#1d1a1e\",\n \"#ff5b82\",\n \"#47d7a1\",\n \"#e8e562\",\n \"#5db4ee\",\n \"#da6cda\",\n \"#57e9eb\",\n \"#ededed\",\n]\nbackground = \"#1d1a1e\"\nbrights = [\n \"#1d1a1e\",\n \"#ff5b82\",\n \"#47d7a1\",\n \"#e8e562\",\n \"#5db4ee\",\n \"#da6cda\",\n \"#57e9eb\",\n \"#ededed\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#ffffff\"\nforeground = \"#efecec\"\nselection_bg = \"#e1925c\"\nselection_fg = \"#1d1a1e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Kolorit\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Konsolas", "[colors]\nansi = [\n \"#000000\",\n \"#aa1717\",\n \"#18b218\",\n \"#ebae1f\",\n \"#2323a5\",\n \"#ad1edc\",\n \"#42b0c8\",\n \"#c8c1c1\",\n]\nbackground = \"#060606\"\nbrights = [\n \"#7b716e\",\n \"#ff4141\",\n \"#5fff5f\",\n \"#ffff55\",\n \"#4b4bff\",\n \"#ff54ff\",\n \"#69ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#c8c1c1\"\ncursor_border = \"#c8c1c1\"\ncursor_fg = \"#060606\"\nforeground = \"#c8c1c1\"\nselection_bg = \"#060606\"\nselection_fg = \"#c8c1c1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Konsolas\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("kurokula", "[colors]\nansi = [\n \"#333333\",\n \"#b66056\",\n \"#85b1a9\",\n \"#dbbb43\",\n \"#6890d7\",\n \"#887aa3\",\n \"#837369\",\n \"#ddd0c4\",\n]\nbackground = \"#141515\"\nbrights = [\n \"#515151\",\n \"#ffc663\",\n \"#c1ffae\",\n \"#fff700\",\n \"#a1d9ff\",\n \"#a994ff\",\n \"#f9cfb9\",\n \"#ffffff\",\n]\ncursor_bg = \"#702420\"\ncursor_border = \"#702420\"\ncursor_fg = \"#fefbf3\"\nforeground = \"#ddd0c4\"\nselection_bg = \"#515151\"\nselection_fg = \"#ffc663\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"kurokula\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"),
("Lab Fox", "[colors]\nansi = [\n \"#2e2e2e\",\n \"#fc6d26\",\n \"#3eb383\",\n \"#fca121\",\n \"#db3b21\",\n \"#380d75\",\n \"#6e49cb\",\n \"#ffffff\",\n]\nbackground = \"#2e2e2e\"\nbrights = [\n \"#464646\",\n \"#ff6517\",\n \"#53eaa8\",\n \"#fca013\",\n \"#db501f\",\n \"#441090\",\n \"#7d53e7\",\n \"#ffffff\",\n]\ncursor_bg = \"#7f7f7f\"\ncursor_border = \"#7f7f7f\"\ncursor_fg = \"#7f7f7f\"\nforeground = \"#ffffff\"\nselection_bg = \"#cb392e\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Lab Fox\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Laser", "[colors]\nansi = [\n \"#626262\",\n \"#ff8373\",\n \"#b4fb73\",\n \"#09b4bd\",\n \"#fed300\",\n \"#ff90fe\",\n \"#d1d1fe\",\n \"#f1f1f1\",\n]\nbackground = \"#030d18\"\nbrights = [\n \"#8f8f8f\",\n \"#ffc4be\",\n \"#d6fcba\",\n \"#fffed5\",\n \"#f92883\",\n \"#ffb2fe\",\n \"#e6e7fe\",\n \"#ffffff\",\n]\ncursor_bg = \"#00ff9c\"\ncursor_border = \"#00ff9c\"\ncursor_fg = \"#ffffff\"\nforeground = \"#f106e3\"\nselection_bg = \"#2e206a\"\nselection_fg = \"#f4f4f4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Laser\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Laserwave (Gogh)", "[colors]\nansi = [\n \"#39243a\",\n \"#eb64b9\",\n \"#afd686\",\n \"#feae87\",\n \"#40b4c4\",\n \"#b381c5\",\n \"#215969\",\n \"#91889b\",\n]\nbackground = \"#1f1926\"\nbrights = [\n \"#716485\",\n \"#fc2377\",\n \"#50fa7b\",\n \"#ffe261\",\n \"#74dfc4\",\n \"#6d75e0\",\n \"#b4dce7\",\n \"#ffffff\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#1f1926\"\nforeground = \"#e0e0e0\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"laserwave (Gogh)\"]\nname = \"Laserwave (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -689,6 +694,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Panda (Gogh)", "[colors]\nansi = [\n \"#1f1f20\",\n \"#fb055a\",\n \"#26ffd4\",\n \"#fdaa5a\",\n \"#5c9fff\",\n \"#fc59a6\",\n \"#26ffd4\",\n \"#f0f0f0\",\n]\nbackground = \"#1d1e20\"\nbrights = [\n \"#5c6370\",\n \"#fb055a\",\n \"#26ffd4\",\n \"#febe7e\",\n \"#55adff\",\n \"#fd95d0\",\n \"#26ffd4\",\n \"#f0f0f0\",\n]\ncursor_bg = \"#f0f0f0\"\ncursor_border = \"#f0f0f0\"\ncursor_fg = \"#1d1e20\"\nforeground = \"#f0f0f0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Panda (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Pandora", "[colors]\nansi = [\n \"#000000\",\n \"#ff4242\",\n \"#74af68\",\n \"#ffad29\",\n \"#338f86\",\n \"#9414e6\",\n \"#23d7d7\",\n \"#e2e2e2\",\n]\nbackground = \"#141e43\"\nbrights = [\n \"#3f5648\",\n \"#ff3242\",\n \"#74cd68\",\n \"#ffb929\",\n \"#23d7d7\",\n \"#ff37ff\",\n \"#00ede1\",\n \"#ffffff\",\n]\ncursor_bg = \"#43d58e\"\ncursor_border = \"#43d58e\"\ncursor_fg = \"#ffffff\"\nforeground = \"#e1e1e1\"\nselection_bg = \"#2d37ff\"\nselection_fg = \"#82e0ff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Pandora\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Panels (terminal.sexy)", "[colors]\nansi = [\n \"#191927\",\n \"#282f5e\",\n \"#2b4593\",\n \"#344276\",\n \"#4e3a4f\",\n \"#61372f\",\n \"#6b484c\",\n \"#744537\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#905749\",\n \"#94431c\",\n \"#9f582a\",\n \"#a38687\",\n \"#e1750f\",\n \"#eaaf25\",\n \"#fa8e08\",\n \"#fca806\",\n]\nforeground = \"#d3d3d3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"dkeg\"\nname = \"Panels (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Paper (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#cc3e28\",\n \"#216609\",\n \"#b58900\",\n \"#1e6fcc\",\n \"#5c21a5\",\n \"#158c86\",\n \"#aaaaaa\",\n]\nbackground = \"#f2eede\"\nbrights = [\n \"#555555\",\n \"#cc3e28\",\n \"#216609\",\n \"#b58900\",\n \"#1e6fcc\",\n \"#5c21a5\",\n \"#158c86\",\n \"#aaaaaa\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#f2eede\"\nforeground = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Paper (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"),
("PaperColor Dark (base16)", "[colors]\nansi = [\n \"#1c1c1c\",\n \"#585858\",\n \"#af87d7\",\n \"#afd700\",\n \"#ff5faf\",\n \"#00afaf\",\n \"#ffaf00\",\n \"#808080\",\n]\nbackground = \"#1c1c1c\"\nbrights = [\n \"#d7af5f\",\n \"#585858\",\n \"#af87d7\",\n \"#afd700\",\n \"#ff5faf\",\n \"#00afaf\",\n \"#ffaf00\",\n \"#d0d0d0\",\n]\ncursor_bg = \"#808080\"\ncursor_border = \"#808080\"\ncursor_fg = \"#1c1c1c\"\nforeground = \"#808080\"\nselection_bg = \"#808080\"\nselection_fg = \"#1c1c1c\"\n\n[colors.indexed]\n16 = \"#5faf5f\"\n17 = \"#5f8787\"\n18 = \"#af005f\"\n19 = \"#5faf00\"\n20 = \"#5fafd7\"\n21 = \"#d7875f\"\n\n[metadata]\naliases = []\nauthor = \"Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme)\"\nname = \"PaperColor Dark (base16)\"\norigin_url = \"https://github.com/jonleopard/base16-papercolor-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Papercolor Dark (Gogh)", "[colors]\nansi = [\n \"#1c1c1c\",\n \"#af005f\",\n \"#5faf00\",\n \"#d7af5f\",\n \"#5fafd7\",\n \"#808080\",\n \"#d7875f\",\n \"#d0d0d0\",\n]\nbackground = \"#1c1c1c\"\nbrights = [\n \"#585858\",\n \"#5faf5f\",\n \"#afd700\",\n \"#af87d7\",\n \"#ffaf00\",\n \"#ff5faf\",\n \"#00afaf\",\n \"#5f8787\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#1c1c1c\"\nforeground = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"PaperColorDark (Gogh)\"]\nname = \"Papercolor Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("PaperColor Light (base16)", "[colors]\nansi = [\n \"#eeeeee\",\n \"#bcbcbc\",\n \"#8700af\",\n \"#d70087\",\n \"#d75f00\",\n \"#005faf\",\n \"#d75f00\",\n \"#444444\",\n]\nbackground = \"#eeeeee\"\nbrights = [\n \"#5f8700\",\n \"#bcbcbc\",\n \"#8700af\",\n \"#d70087\",\n \"#d75f00\",\n \"#005faf\",\n \"#d75f00\",\n \"#878787\",\n]\ncursor_bg = \"#444444\"\ncursor_border = \"#444444\"\ncursor_fg = \"#eeeeee\"\nforeground = \"#444444\"\nselection_bg = \"#444444\"\nselection_fg = \"#eeeeee\"\n\n[colors.indexed]\n16 = \"#d70000\"\n17 = \"#005f87\"\n18 = \"#af0000\"\n19 = \"#008700\"\n20 = \"#0087af\"\n21 = \"#005f87\"\n\n[metadata]\naliases = []\nauthor = \"Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme)\"\nname = \"PaperColor Light (base16)\"\norigin_url = \"https://github.com/jonleopard/base16-papercolor-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -850,6 +856,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Srcery (Gogh)", "[colors]\nansi = [\n \"#1c1b19\",\n \"#ef2f27\",\n \"#519f50\",\n \"#fbb829\",\n \"#2c78bf\",\n \"#e02c6d\",\n \"#0aaeb3\",\n \"#baa67f\",\n]\nbackground = \"#1c1b19\"\nbrights = [\n \"#918175\",\n \"#f75341\",\n \"#98bc37\",\n \"#fed06e\",\n \"#68a8e4\",\n \"#ff5c8f\",\n \"#2be4d0\",\n \"#fce8c3\",\n]\ncursor_bg = \"#fbb829\"\ncursor_border = \"#fbb829\"\ncursor_fg = \"#1c1b19\"\nforeground = \"#fce8c3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Srcery (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Sublette", "[colors]\nansi = [\n \"#253045\",\n \"#ee5577\",\n \"#55ee77\",\n \"#ffdd88\",\n \"#5588ff\",\n \"#ff77cc\",\n \"#44eeee\",\n \"#f5f5da\",\n]\nbackground = \"#202535\"\nbrights = [\n \"#405570\",\n \"#ee6655\",\n \"#99ee77\",\n \"#ffff77\",\n \"#77bbff\",\n \"#aa88ff\",\n \"#55ffbb\",\n \"#ffffee\",\n]\ncursor_bg = \"#ccced0\"\ncursor_border = \"#ccced0\"\ncursor_fg = \"#202535\"\nforeground = \"#ccced0\"\nselection_bg = \"#ccced0\"\nselection_fg = \"#202535\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Sublette\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Subliminal", "[colors]\nansi = [\n \"#7f7f7f\",\n \"#e15a60\",\n \"#a9cfa4\",\n \"#ffe2a9\",\n \"#6699cc\",\n \"#f1a5ab\",\n \"#5fb3b3\",\n \"#d4d4d4\",\n]\nbackground = \"#282c35\"\nbrights = [\n \"#7f7f7f\",\n \"#e15a60\",\n \"#a9cfa4\",\n \"#ffe2a9\",\n \"#6699cc\",\n \"#f1a5ab\",\n \"#5fb3b3\",\n \"#d4d4d4\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#ffffff\"\nforeground = \"#d4d4d4\"\nselection_bg = \"#484e5b\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Subliminal\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Sugarplum", "[colors]\nansi = [\n \"#111147\",\n \"#5ca8dc\",\n \"#53b397\",\n \"#249a84\",\n \"#db7ddd\",\n \"#d0beee\",\n \"#f9f3f9\",\n \"#a175d4\",\n]\nbackground = \"#111147\"\nbrights = [\n \"#111147\",\n \"#5cb5dc\",\n \"#52deb5\",\n \"#01f5c7\",\n \"#fa5dfd\",\n \"#c6a5fd\",\n \"#ffffff\",\n \"#b577fd\",\n]\ncursor_bg = \"#53b397\"\ncursor_border = \"#53b397\"\ncursor_fg = \"#53b397\"\nforeground = \"#db7ddd\"\nselection_bg = \"#5ca8dc\"\nselection_fg = \"#d0beee\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"lemonlime0x3C33 (https://github.com/lemonlime0x3C33)\"\nname = \"Sugarplum\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"),
("Summer Pop (Gogh)", "[colors]\nansi = [\n \"#666666\",\n \"#ff1e8e\",\n \"#8eff1e\",\n \"#fffb00\",\n \"#1e8eff\",\n \"#e500e5\",\n \"#00e5e5\",\n \"#e5e5e5\",\n]\nbackground = \"#272822\"\nbrights = [\n \"#666666\",\n \"#ff1e8e\",\n \"#8eff1e\",\n \"#fffb00\",\n \"#1e8eff\",\n \"#e500e5\",\n \"#00e5e5\",\n \"#e5e5e5\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#272822\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"summer-pop (Gogh)\"]\nname = \"Summer Pop (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("summercamp (base16)", "[colors]\nansi = [\n \"#1c1810\",\n \"#e35142\",\n \"#5ceb5a\",\n \"#f2ff27\",\n \"#489bf0\",\n \"#ff8080\",\n \"#5aebbc\",\n \"#736e55\",\n]\nbackground = \"#1c1810\"\nbrights = [\n \"#504b38\",\n \"#e35142\",\n \"#5ceb5a\",\n \"#f2ff27\",\n \"#489bf0\",\n \"#ff8080\",\n \"#5aebbc\",\n \"#f8f5de\",\n]\ncursor_bg = \"#736e55\"\ncursor_border = \"#736e55\"\ncursor_fg = \"#1c1810\"\nforeground = \"#736e55\"\nselection_bg = \"#736e55\"\nselection_fg = \"#1c1810\"\n\n[colors.indexed]\n16 = \"#fba11b\"\n17 = \"#f69be7\"\n18 = \"#2a261c\"\n19 = \"#3a3527\"\n20 = \"#5f5b45\"\n21 = \"#bab696\"\n\n[metadata]\naliases = []\nauthor = \"zoe firi (zoefiri.github.io)\"\nname = \"summercamp (base16)\"\norigin_url = \"https://github.com/zoefiri/base16-summercamp\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Summerfruit Dark (base16)", "[colors]\nansi = [\n \"#151515\",\n \"#ff0086\",\n \"#00c918\",\n \"#aba800\",\n \"#3777e6\",\n \"#ad00a1\",\n \"#1faaaa\",\n \"#d0d0d0\",\n]\nbackground = \"#151515\"\nbrights = [\n \"#505050\",\n \"#ff0086\",\n \"#00c918\",\n \"#aba800\",\n \"#3777e6\",\n \"#ad00a1\",\n \"#1faaaa\",\n \"#ffffff\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#151515\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#d0d0d0\"\nselection_fg = \"#151515\"\n\n[colors.indexed]\n16 = \"#fd8900\"\n17 = \"#cc6633\"\n18 = \"#202020\"\n19 = \"#303030\"\n20 = \"#b0b0b0\"\n21 = \"#e0e0e0\"\n\n[metadata]\naliases = []\nauthor = \"Christopher Corley (http://christop.club/)\"\nname = \"Summerfruit Dark (base16)\"\norigin_url = \"https://github.com/cscorley/base16-summerfruit-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
@ -903,7 +910,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("tokyonight", "[colors]\nansi = [\n \"#15161e\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#a9b1d6\",\n]\nbackground = \"#1a1b26\"\nbrights = [\n \"#414868\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#c0caf5\",\n]\ncursor_bg = \"#c0caf5\"\ncursor_border = \"#c0caf5\"\ncursor_fg = \"#15161e\"\nforeground = \"#c0caf5\"\nselection_bg = \"#33467c\"\nselection_fg = \"#c0caf5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"tokyonight\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("tokyonight-day", "[colors]\nansi = [\n \"#e9e9ed\",\n \"#f52a65\",\n \"#587539\",\n \"#8c6c3e\",\n \"#2e7de9\",\n \"#9854f1\",\n \"#007197\",\n \"#6172b0\",\n]\nbackground = \"#e1e2e7\"\nbrights = [\n \"#a1a6c5\",\n \"#f52a65\",\n \"#587539\",\n \"#8c6c3e\",\n \"#2e7de9\",\n \"#9854f1\",\n \"#007197\",\n \"#3760bf\",\n]\ncursor_bg = \"#3760bf\"\ncursor_border = \"#3760bf\"\ncursor_fg = \"#e1e2e7\"\nforeground = \"#3760bf\"\nselection_bg = \"#99a7df\"\nselection_fg = \"#3760bf\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"tokyonight-day\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("tokyonight-storm", "[colors]\nansi = [\n \"#1d202f\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#a9b1d6\",\n]\nbackground = \"#24283b\"\nbrights = [\n \"#414868\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#c0caf5\",\n]\ncursor_bg = \"#c0caf5\"\ncursor_border = \"#c0caf5\"\ncursor_fg = \"#1d202f\"\nforeground = \"#c0caf5\"\nselection_bg = \"#364a82\"\nselection_fg = \"#c0caf5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"tokyonight-storm\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("tokyonight_day", "[colors]\nansi = [\n \"#e9e9ed\",\n \"#f52a65\",\n \"#587539\",\n \"#8c6c3e\",\n \"#2e7de9\",\n \"#9854f1\",\n \"#007197\",\n \"#6172b0\",\n]\nbackground = \"#e1e2e7\"\nbrights = [\n \"#a1a6c5\",\n \"#f52a65\",\n \"#587539\",\n \"#8c6c3e\",\n \"#2e7de9\",\n \"#9854f1\",\n \"#007197\",\n \"#3760bf\",\n]\ncompose_cursor = \"#b15c00\"\ncursor_bg = \"#3760bf\"\ncursor_border = \"#3760bf\"\ncursor_fg = \"#e1e2e7\"\nforeground = \"#3760bf\"\nscrollbar_thumb = \"#c4c8da\"\nselection_bg = \"#b6bfe2\"\nselection_fg = \"#3760bf\"\nsplit = \"#2e7de9\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#e1e2e7\"\ninactive_tab_edge = \"#e9e9ec\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#2e7de9\"\nfg_color = \"#e9e9ec\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#c4c8da\"\nfg_color = \"#8990b3\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#c4c8da\"\nfg_color = \"#2e7de9\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#e1e2e7\"\nfg_color = \"#2e7de9\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#e1e2e7\"\nfg_color = \"#2e7de9\"\nintensity = \"Bold\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = [\"tokyonight-day\"]\nauthor = \"folke\"\nname = \"tokyonight_day\"\norigin_url = \"https://github.com/folke/tokyonight.nvim\"\nwezterm_version = \"Always\"\n"),
("tokyonight_day", "[colors]\nansi = [\n \"#b4b5b9\",\n \"#f52a65\",\n \"#587539\",\n \"#8c6c3e\",\n \"#2e7de9\",\n \"#9854f1\",\n \"#007197\",\n \"#6172b0\",\n]\nbackground = \"#e1e2e7\"\nbrights = [\n \"#a1a6c5\",\n \"#f52a65\",\n \"#587539\",\n \"#8c6c3e\",\n \"#2e7de9\",\n \"#9854f1\",\n \"#007197\",\n \"#3760bf\",\n]\ncompose_cursor = \"#b15c00\"\ncursor_bg = \"#3760bf\"\ncursor_border = \"#3760bf\"\ncursor_fg = \"#e1e2e7\"\nforeground = \"#3760bf\"\nscrollbar_thumb = \"#c4c8da\"\nselection_bg = \"#b7c1e3\"\nselection_fg = \"#3760bf\"\nsplit = \"#2e7de9\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#e1e2e7\"\ninactive_tab_edge = \"#d0d5e3\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#2e7de9\"\nfg_color = \"#d0d5e3\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#c4c8da\"\nfg_color = \"#8990b3\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#c4c8da\"\nfg_color = \"#2e7de9\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#e1e2e7\"\nfg_color = \"#2e7de9\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#e1e2e7\"\nfg_color = \"#2e7de9\"\nintensity = \"Bold\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = [\"tokyonight-day\"]\nauthor = \"folke\"\nname = \"tokyonight_day\"\norigin_url = \"https://github.com/folke/tokyonight.nvim\"\nwezterm_version = \"Always\"\n"),
("tokyonight_moon", "[colors]\nansi = [\n \"#1b1d2b\",\n \"#ff757f\",\n \"#c3e88d\",\n \"#ffc777\",\n \"#82aaff\",\n \"#c099ff\",\n \"#86e1fc\",\n \"#828bb8\",\n]\nbackground = \"#222436\"\nbrights = [\n \"#444a73\",\n \"#ff757f\",\n \"#c3e88d\",\n \"#ffc777\",\n \"#82aaff\",\n \"#c099ff\",\n \"#86e1fc\",\n \"#c8d3f5\",\n]\ncompose_cursor = \"#ff966c\"\ncursor_bg = \"#c8d3f5\"\ncursor_border = \"#c8d3f5\"\ncursor_fg = \"#222436\"\nforeground = \"#c8d3f5\"\nscrollbar_thumb = \"#2f334d\"\nselection_bg = \"#2d3f76\"\nselection_fg = \"#c8d3f5\"\nsplit = \"#82aaff\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#222436\"\ninactive_tab_edge = \"#1e2030\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#82aaff\"\nfg_color = \"#1e2030\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#2f334d\"\nfg_color = \"#545c7e\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#2f334d\"\nfg_color = \"#82aaff\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#222436\"\nfg_color = \"#82aaff\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#222436\"\nfg_color = \"#82aaff\"\nintensity = \"Bold\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"folke\"\nname = \"tokyonight_moon\"\norigin_url = \"https://github.com/folke/tokyonight.nvim\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"),
("tokyonight_night", "[colors]\nansi = [\n \"#15161e\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#a9b1d6\",\n]\nbackground = \"#1a1b26\"\nbrights = [\n \"#414868\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#c0caf5\",\n]\ncompose_cursor = \"#ff9e64\"\ncursor_bg = \"#c0caf5\"\ncursor_border = \"#c0caf5\"\ncursor_fg = \"#1a1b26\"\nforeground = \"#c0caf5\"\nscrollbar_thumb = \"#292e42\"\nselection_bg = \"#283457\"\nselection_fg = \"#c0caf5\"\nsplit = \"#7aa2f7\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#1a1b26\"\ninactive_tab_edge = \"#16161e\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#7aa2f7\"\nfg_color = \"#16161e\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#292e42\"\nfg_color = \"#545c7e\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#292e42\"\nfg_color = \"#7aa2f7\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#1a1b26\"\nfg_color = \"#7aa2f7\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#1a1b26\"\nfg_color = \"#7aa2f7\"\nintensity = \"Bold\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = [\"tokyonight\"]\nauthor = \"folke\"\nname = \"tokyonight_night\"\norigin_url = \"https://github.com/folke/tokyonight.nvim\"\nwezterm_version = \"Always\"\n"),
("tokyonight_storm", "[colors]\nansi = [\n \"#1d202f\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#a9b1d6\",\n]\nbackground = \"#24283b\"\nbrights = [\n \"#414868\",\n \"#f7768e\",\n \"#9ece6a\",\n \"#e0af68\",\n \"#7aa2f7\",\n \"#bb9af7\",\n \"#7dcfff\",\n \"#c0caf5\",\n]\ncompose_cursor = \"#ff9e64\"\ncursor_bg = \"#c0caf5\"\ncursor_border = \"#c0caf5\"\ncursor_fg = \"#24283b\"\nforeground = \"#c0caf5\"\nscrollbar_thumb = \"#292e42\"\nselection_bg = \"#2e3c64\"\nselection_fg = \"#c0caf5\"\nsplit = \"#7aa2f7\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#24283b\"\ninactive_tab_edge = \"#1f2335\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#7aa2f7\"\nfg_color = \"#1f2335\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#292e42\"\nfg_color = \"#545c7e\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#292e42\"\nfg_color = \"#7aa2f7\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#24283b\"\nfg_color = \"#7aa2f7\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#24283b\"\nfg_color = \"#7aa2f7\"\nintensity = \"Bold\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = [\"tokyonight-storm\"]\nauthor = \"folke\"\nname = \"tokyonight_storm\"\norigin_url = \"https://github.com/folke/tokyonight.nvim\"\nwezterm_version = \"Always\"\n"),
@ -946,6 +953,7 @@ pub const SCHEMES: [(&'static str, &'static str); 993] = [
("Vag (Gogh)", "[colors]\nansi = [\n \"#303030\",\n \"#a87139\",\n \"#39a871\",\n \"#71a839\",\n \"#7139a8\",\n \"#a83971\",\n \"#3971a8\",\n \"#8a8a8a\",\n]\nbackground = \"#191f1d\"\nbrights = [\n \"#494949\",\n \"#b0763b\",\n \"#3bb076\",\n \"#76b03b\",\n \"#763bb0\",\n \"#b03b76\",\n \"#3b76b0\",\n \"#cfcfcf\",\n]\ncursor_bg = \"#d9e6f2\"\ncursor_border = \"#d9e6f2\"\ncursor_fg = \"#191f1d\"\nforeground = \"#d9e6f2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Vag (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),
("Vaughn", "[colors]\nansi = [\n \"#25234f\",\n \"#705050\",\n \"#60b48a\",\n \"#dfaf8f\",\n \"#5555ff\",\n \"#f08cc3\",\n \"#8cd0d3\",\n \"#709080\",\n]\nbackground = \"#25234f\"\nbrights = [\n \"#709080\",\n \"#dca3a3\",\n \"#60b48a\",\n \"#f0dfaf\",\n \"#5555ff\",\n \"#ec93d3\",\n \"#93e0e3\",\n \"#ffffff\",\n]\ncursor_bg = \"#ff5555\"\ncursor_border = \"#ff5555\"\ncursor_fg = \"#ffffff\"\nforeground = \"#dcdccc\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Vaughn (Gogh)\"]\nname = \"Vaughn\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Vaughn (Gogh)", "[colors]\nansi = [\n \"#25234f\",\n \"#705050\",\n \"#60b48a\",\n \"#dfaf8f\",\n \"#5555ff\",\n \"#f08cc3\",\n \"#8cd0d3\",\n \"#709080\",\n]\nbackground = \"#25234f\"\nbrights = [\n \"#709080\",\n \"#dca3a3\",\n \"#60b48a\",\n \"#f0dfaf\",\n \"#5555ff\",\n \"#ec93d3\",\n \"#93e0e3\",\n \"#ffffff\",\n]\ncursor_bg = \"#dcdccc\"\ncursor_border = \"#dcdccc\"\ncursor_fg = \"#25234f\"\nforeground = \"#dcdccc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Vaughn (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("Vesper", "[colors]\nansi = [\n \"#101010\",\n \"#f5a191\",\n \"#90b99f\",\n \"#e6b99d\",\n \"#aca1cf\",\n \"#e29eca\",\n \"#ea83a5\",\n \"#a0a0a0\",\n]\nbackground = \"#101010\"\nbrights = [\n \"#7e7e7e\",\n \"#ff8080\",\n \"#99ffe4\",\n \"#ffc799\",\n \"#b9aeda\",\n \"#ecaad6\",\n \"#f591b2\",\n \"#ffffff\",\n]\ncursor_bg = \"#acb1ab\"\ncursor_border = \"#acb1ab\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ffffff\"\nselection_bg = \"#988049\"\nselection_fg = \"#acb1ab\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Vesper\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"),
("Vibrant Ink (Gogh)", "[colors]\nansi = [\n \"#878787\",\n \"#ff6600\",\n \"#ccff04\",\n \"#ffcc00\",\n \"#44b4cc\",\n \"#9933cc\",\n \"#44b4cc\",\n \"#f5f5f5\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555555\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#e5e5e5\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Vibrant Ink (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"),
("VibrantInk", "[colors]\nansi = [\n \"#878787\",\n \"#ff6600\",\n \"#ccff04\",\n \"#ffcc00\",\n \"#44b4cc\",\n \"#9933cc\",\n \"#44b4cc\",\n \"#f5f5f5\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555555\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#e5e5e5\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Vibrant Ink (Gogh)\"]\nname = \"VibrantInk\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"),
("Vice Alt (base16)", "[colors]\nansi = [\n \"#1c1c1c\",\n \"#ff3d81\",\n \"#44ffdd\",\n \"#ffff73\",\n \"#2fb1d4\",\n \"#8265ff\",\n \"#00caff\",\n \"#555555\",\n]\nbackground = \"#1c1c1c\"\nbrights = [\n \"#323232\",\n \"#ff3d81\",\n \"#44ffdd\",\n \"#ffff73\",\n \"#2fb1d4\",\n \"#8265ff\",\n \"#00caff\",\n \"#d1d1d1\",\n]\ncursor_bg = \"#555555\"\ncursor_border = \"#555555\"\ncursor_fg = \"#1c1c1c\"\nforeground = \"#555555\"\nselection_bg = \"#555555\"\nselection_fg = \"#1c1c1c\"\n\n[colors.indexed]\n16 = \"#f67544\"\n17 = \"#f83d80\"\n18 = \"#282828\"\n19 = \"#2c2c2c\"\n20 = \"#3c3c3c\"\n21 = \"#b6b6b6\"\n\n[metadata]\naliases = []\nauthor = \"Thomas Leon Highbaugh\"\nname = \"Vice Alt (base16)\"\norigin_url = \"https://github.com/Thomashighbaugh/base16-vice-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"),

View File

@ -119,6 +119,7 @@ impl SshDomain {
name: format!("SSH:{host}"),
remote_address: host.to_string(),
multiplexing: SshMultiplexing::None,
local_echo_threshold_ms: default_local_echo_threshold_ms(),
..SshDomain::default()
});
@ -126,6 +127,7 @@ impl SshDomain {
name: format!("SSHMUX:{host}"),
remote_address: host.to_string(),
multiplexing: SshMultiplexing::WezTerm,
local_echo_threshold_ms: default_local_echo_threshold_ms(),
..SshDomain::default()
});
}

@ -1 +1 @@
Subproject commit 63973005bc07aba599b47fdd4cf788647b601ccd
Subproject commit 9c03576c49db6e7207d9bcdfe3abd170a809157f

View File

@ -24,7 +24,7 @@ As features stabilize some brief notes about them will accumulate here.
#### Changed
* Wayland: currently being reimplemented, it maybe more unstable than usual.
Please file GH issues for any problems you see.
Many thanks to @tzx! #4777
Many thanks to @tzx and @tmccombs! #4777 #5781
* [show_update_window](config/lua/config/show_update_window.md) has been
deprecated; it no longer has any effect and will be removed in a future
release.
@ -34,6 +34,15 @@ As features stabilize some brief notes about them will accumulate here.
drawing glyphs. See
[custom_block_glyphs](config/lua/config/custom_block_glyphs.md) for more
details. Thanks to @stribor14! #5051 #5169
* Switched to the [nucleo](https://github.com/helix-editor/nucleo) fuzzy
matcher which produces matches that more closely match the popular `fzf`
program. #5532
* The Copy Mode `Close` action no longer implicitly scrolls to the bottom.
This is to facilitate having a key assignment that closes copy mode without
adjusting the viewport position. You can compose multiple actions together using
`Multiple` if you wish; the default key assignments in Copy Mode use this technique
so that the effective behavior of the defaults remains unchanged.
Thanks to @LeszekSwirski! #4924 #3502
#### New
* [wezterm.serde](config/lua/wezterm.serde/index.md) module for serialization
@ -46,6 +55,10 @@ As features stabilize some brief notes about them will accumulate here.
?988 #1647
* [default_ssh_auth_sock](config/lua/config/default_ssh_auth_sock.md) option
to manage `SSH_AUTH_SOCK`.
* Search mode: now supports richer line editing. Thanks to @Mrreadiness and
@kenchou! #5416 #3087
* [show_close_tab_button_in_tabs](config/lua/config/show_close_tab_button_in_tabs.md)
option for the fancy tab bar. Thanks to @zummenix! #3818
#### Fixed
* Race condition when very quickly adjusting font scale, and other improvements
@ -59,8 +72,8 @@ As features stabilize some brief notes about them will accumulate here.
rather than the intended *starttime* field to decide which process
was the youngest. Thanks to @crides! #5001
* Wayland: fixed startup on Hyprland >= 0.37.0. Thanks to @fioncat! #5264 #5103
* Wayland: updated to SCTK 0.18. Thanks to @deviant! #5276 #5154 #5079 #5071
#4604 #5209
* Wayland: updated to SCTK 0.19. Thanks to @deviant and @tmccombs! #5276 #5154 #5079 #5071
#4604 #5209 #5781
* Windows: Window buttons stopped working when using `win32_system_backdrop`.
Thanks to @Kushagra2569! #5362 #5348
* `wezterm cli activate-pane` now respects `unzoom_on_switch_pane`. Thanks to
@ -71,16 +84,40 @@ As features stabilize some brief notes about them will accumulate here.
#3283
* Wayland: hang when launched under ChromeOS Crostini. Thanks to @dberlin!
#5393 #5397
* macOS: Fixed notch avoidance padding in full screen mode. Thanks to @mbaird!
#5515 #3807
* Render invalidation issue when closing tabs other than the last tab. Thanks
to @Mrreadiness! #5441 #5304
* Search mode now accepts composed input from the IME. Thanks to @kenchou! #5564
* Quick select mode will now accept unix paths with `//` in them. #5763
* blob leases (for image rendering) could be removed by temporary directory
cleaners, resulting in issues with rendering. We no longer store these
in a pure temporary directory; they live in a cache dir, and if someone
does remove or truncate these files, we now convert that error case
into blank frame(s). #5422 #4657
* PaneInformation object returned `pixel_width` when asked to return the
`pixel_height`.
* ssh: we now explicitly kill and reap the `ProxyCommand` associated
with an ssh session. Thanks to @daaku! #5494 #5479
* `default_ssh_domains()` didn't use the default local echo threshold
for ssh domains. #5547
* multiplexer: internal PKI certificate now supplements its list of
"Subject Alternative Names" with the list of canonical hostnames returned
for the local system via `getaddrinfo`. #5543
* DECSLRM incorrectly clamped the left margin based on the terminal height
instead of the terminal width. Thanks to @j4james and @tmccombs! #5871 #5750
#### Updated
* Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg
* Bundled harfbuzz to 8.4.0
* Bundled harfbuzz to 9.0.0
* image crate to 0.25, which means that JPEG images are now decoded via
[zune-jpeg](https://docs.rs/zune-jpeg/latest/zune_jpeg/), which improves
handling of non-conforming jpeg images. #5365
* Color schemes:
* Color schemes: [Astrodark (Gogh)](colorschemes/a/index.md#astrodark-gogh),
[Blue Dolphin (Gogh)](colorschemes/b/index.md#blue-dolphin-gogh),
[Breadog (Gogh)](colorschemes/b/index.md#breadog-gogh),
[Butrin (Gogh)](colorschemes/b/index.md#butrin-gogh),
[City Lights (Gogh)](colorschemes/c/index.md#city-lights-gogh),
[CutiePro](colorschemes/c/index.md#cutiepro),
[Ef-Dream](colorschemes/e/index.md#ef-dream),
[Ef-Reverie](colorschemes/e/index.md#ef-reverie),
@ -92,7 +129,9 @@ As features stabilize some brief notes about them will accumulate here.
[Everforest Light Medium (Gogh)](colorschemes/e/index.md#everforest-light-medium-gogh),
[Everforest Light Soft (Gogh)](colorschemes/e/index.md#everforest-light-soft-gogh),
[Github Light (Gogh)](colorschemes/g/index.md#github-light-gogh),
[Iceberg (Gogh)](colorschemes/i/index.md#iceberg-gogh),
[Kanagawa Dragon (Gogh)](colorschemes/k/index.md#kanagawa-dragon-gogh),
[kurokula](colorschemes/k/index.md#kurokula),
[Mellifluous](colorschemes/m/index.md#mellifluous),
[Miramare (Gogh)](colorschemes/m/index.md#miramare-gogh),
[Modus Operandi (Gogh)](colorschemes/m/index.md#modus-operandi-gogh),
@ -101,12 +140,15 @@ As features stabilize some brief notes about them will accumulate here.
[Modus Vivendi Tinted (Gogh)](colorschemes/m/index.md#modus-vivendi-tinted-gogh),
[NvimDark](colorschemes/n/index.md#nvimdark),
[NvimLight](colorschemes/n/index.md#nvimlight),
[Paper (Gogh)](colorschemes/p/index.md#paper-gogh),
[Quiet (Gogh)](colorschemes/q/index.md#quiet-gogh),
[Selenized Black (Gogh)](colorschemes/s/index.md#selenized-black-gogh),
[Selenized White (Gogh)](colorschemes/s/index.md#selenized-white-gogh),
[Seoul256 (Gogh)](colorschemes/s/index.md#seoul256-gogh),
[Seoul256 Light (Gogh)](colorschemes/s/index.md#seoul256-light-gogh),
[Sparky (Gogh)](colorschemes/s/index.md#sparky-gogh)
[Sparky (Gogh)](colorschemes/s/index.md#sparky-gogh),
[Sugarplum](colorschemes/s/index.md#sugarplum),
[Vesper](colorschemes/v/index.md#vesper)
### 20240203-110809-5046fc22
@ -208,7 +250,7 @@ As features stabilize some brief notes about them will accumulate here.
as a preprocessing step, and controlling the filtering and format used
by the resizing, along with showing diagnostics around the resize operation. #3264
* Color schemes: [Aardvark Blue](colorschemes/a/index.md#aardvark-blue),
[alacritty](colorschemes/a/index.md#alacritty),
[alacritty](colorschemes/a/index.md),
[Apple System Colors](colorschemes/a/index.md#apple-system-colors),
[Bamboo Light](colorschemes/b/index.md#bamboo-light),
[Campbell (Gogh)](colorschemes/c/index.md#campbell-gogh),
@ -252,7 +294,7 @@ As features stabilize some brief notes about them will accumulate here.
[Moonfly (Gogh)](colorschemes/m/index.md#moonfly-gogh),
[Nightfly (Gogh)](colorschemes/n/index.md#nightfly-gogh),
[Oxocarbon Dark (Gogh)](colorschemes/o/index.md#oxocarbon-dark-gogh),
[Rosé Pine Moon (base16)](colorschemes/r/index.md#rosé-pine-moon-base16),
[Rosé Pine Moon (base16)](colorschemes/r/index.md#rose-pine-moon-base16),
[Selenized Dark (Gogh)](colorschemes/s/index.md#selenized-dark-gogh),
[Selenized Light (Gogh)](colorschemes/s/index.md#selenized-light-gogh),
[Website (Gogh)](colorschemes/w/index.md#website-gogh)
@ -468,7 +510,7 @@ As features stabilize some brief notes about them will accumulate here.
* Bundled freetype to 2.13.0
* Bundled Nerd Font Symbols font to v3.0.1. Note that there are several
[breaking changes in v3](https://github.com/ryanoasis/nerd-fonts/releases/tag/v3.0.0).
* Color schemes: [3024 (dark) (terminal.sexy)](colorschemes/3/index.md#3024-dark-terminal-sexy),
* Color schemes: [3024 (dark) (terminal.sexy)](colorschemes/3/index.md#3024-dark-terminalsexy),
[3024 Day (Gogh)](colorschemes/3/index.md#3024-day-gogh),
[3024 Night (Gogh)](colorschemes/3/index.md#3024-night-gogh),
[Adventure Time (Gogh)](colorschemes/a/index.md#adventure-time-gogh),
@ -476,45 +518,45 @@ As features stabilize some brief notes about them will accumulate here.
[Apprentice (Gogh)](colorschemes/a/index.md#apprentice-gogh),
[Argonaut (Gogh)](colorschemes/a/index.md#argonaut-gogh),
[Arthur (Gogh)](colorschemes/a/index.md#arthur-gogh),
[Ashes (dark) (terminal.sexy)](colorschemes/a/index.md#ashes-dark-terminal-sexy),
[Ashes (dark) (terminal.sexy)](colorschemes/a/index.md#ashes-dark-terminalsexy),
[Atom (Gogh)](colorschemes/a/index.md#atom-gogh),
[Bamboo](colorschemes/b/index.md#bamboo),
[Bamboo Multiplex](colorschemes/b/index.md#bamboo-multiplex),
[Belafonte Day (Gogh)](colorschemes/b/index.md#belafonte-day-gogh),
[Belafonte Night (Gogh)](colorschemes/b/index.md#belafonte-night-gogh),
[Bespin (dark) (terminal.sexy)](colorschemes/b/index.md#bespin-dark-terminal-sexy),
[Bespin (dark) (terminal.sexy)](colorschemes/b/index.md#bespin-dark-terminalsexy),
[Birds Of Paradise (Gogh)](colorschemes/b/index.md#birds-of-paradise-gogh),
[Blazer (Gogh)](colorschemes/b/index.md#blazer-gogh),
[Borland (Gogh)](colorschemes/b/index.md#borland-gogh),
[Brewer (dark) (terminal.sexy)](colorschemes/b/index.md#brewer-dark-terminal-sexy),
[Brewer (dark) (terminal.sexy)](colorschemes/b/index.md#brewer-dark-terminalsexy),
[Broadcast (Gogh)](colorschemes/b/index.md#broadcast-gogh),
[Brogrammer (Gogh)](colorschemes/b/index.md#brogrammer-gogh),
[C64 (Gogh)](colorschemes/c/index.md#c64-gogh),
[Catppuccin Frappé (Gogh)](colorschemes/c/index.md#catppuccin-frappé-gogh),
[Catppuccin Frappé (Gogh)](colorschemes/c/index.md#catppuccin-frappe-gogh),
[Catppuccin Latte (Gogh)](colorschemes/c/index.md#catppuccin-latte-gogh),
[Catppuccin Macchiato (Gogh)](colorschemes/c/index.md#catppuccin-macchiato-gogh),
[Catppuccin Mocha (Gogh)](colorschemes/c/index.md#catppuccin-mocha-gogh),
[catppuccin-frappe](colorschemes/c/index.md#catppuccin-frappe),
[catppuccin-macchiato](colorschemes/c/index.md#catppuccin-macchiato),
[catppuccin-mocha](colorschemes/c/index.md#catppuccin-mocha),
[Chalk (dark) (terminal.sexy)](colorschemes/c/index.md#chalk-dark-terminal-sexy),
[Chalk (dark) (terminal.sexy)](colorschemes/c/index.md#chalk-dark-terminalsexy),
[Chalkboard (Gogh)](colorschemes/c/index.md#chalkboard-gogh),
[Ciapre (Gogh)](colorschemes/c/index.md#ciapre-gogh),
[Clrs (Gogh)](colorschemes/c/index.md#clrs-gogh),
[Cobalt 2 (Gogh)](colorschemes/c/index.md#cobalt-2-gogh),
[Cobalt Neon (Gogh)](colorschemes/c/index.md#cobalt-neon-gogh),
[Codeschool (dark) (terminal.sexy)](colorschemes/c/index.md#codeschool-dark-terminal-sexy),
[Codeschool (dark) (terminal.sexy)](colorschemes/c/index.md#codeschool-dark-terminalsexy),
[Crayon Pony Fish (Gogh)](colorschemes/c/index.md#crayon-pony-fish-gogh),
[Dark Pastel (Gogh)](colorschemes/d/index.md#dark-pastel-gogh),
[Darkside (Gogh)](colorschemes/d/index.md#darkside-gogh),
[Default (dark) (terminal.sexy)](colorschemes/d/index.md#default-dark-terminal-sexy),
[Default (dark) (terminal.sexy)](colorschemes/d/index.md#default-dark-terminalsexy),
[Desert (Gogh)](colorschemes/d/index.md#desert-gogh),
[Dimmed Monokai (Gogh)](colorschemes/d/index.md#dimmed-monokai-gogh),
[Earthsong (Gogh)](colorschemes/e/index.md#earthsong-gogh),
[Ef-Tritanopia-Light](colorschemes/e/index.md#ef-tritanopia-light),
[Eighties (dark) (terminal.sexy)](colorschemes/e/index.md#eighties-dark-terminal-sexy),
[Eighties (dark) (terminal.sexy)](colorschemes/e/index.md#eighties-dark-terminalsexy),
[Elemental (Gogh)](colorschemes/e/index.md#elemental-gogh),
[Embers (dark) (terminal.sexy)](colorschemes/e/index.md#embers-dark-terminal-sexy),
[Embers (dark) (terminal.sexy)](colorschemes/e/index.md#embers-dark-terminalsexy),
[Espresso (Gogh)](colorschemes/e/index.md#espresso-gogh),
[Espresso Libre (Gogh)](colorschemes/e/index.md#espresso-libre-gogh),
[Everblush (Gogh)](colorschemes/e/index.md#everblush-gogh),
@ -524,13 +566,13 @@ As features stabilize some brief notes about them will accumulate here.
[Frontend Fun Forrest (Gogh)](colorschemes/f/index.md#frontend-fun-forrest-gogh),
[Frontend Galaxy (Gogh)](colorschemes/f/index.md#frontend-galaxy-gogh),
[Github (Gogh)](colorschemes/g/index.md#github-gogh),
[Gnometerm (terminal.sexy)](colorschemes/g/index.md#gnometerm-terminal-sexy),
[Google (dark) (terminal.sexy)](colorschemes/g/index.md#google-dark-terminal-sexy),
[Gotham (terminal.sexy)](colorschemes/g/index.md#gotham-terminal-sexy),
[Gnometerm (terminal.sexy)](colorschemes/g/index.md#gnometerm-terminalsexy),
[Google (dark) (terminal.sexy)](colorschemes/g/index.md#google-dark-terminalsexy),
[Gotham (terminal.sexy)](colorschemes/g/index.md#gotham-terminalsexy),
[Grape (Gogh)](colorschemes/g/index.md#grape-gogh),
[Grass (Gogh)](colorschemes/g/index.md#grass-gogh),
[Grayscale (dark) (terminal.sexy)](colorschemes/g/index.md#grayscale-dark-terminal-sexy),
[Greenscreen (dark) (terminal.sexy)](colorschemes/g/index.md#greenscreen-dark-terminal-sexy),
[Grayscale (dark) (terminal.sexy)](colorschemes/g/index.md#grayscale-dark-terminalsexy),
[Greenscreen (dark) (terminal.sexy)](colorschemes/g/index.md#greenscreen-dark-terminalsexy),
[Gruvbox Dark (Gogh)](colorschemes/g/index.md#gruvbox-dark-gogh),
[Hardcore (Gogh)](colorschemes/h/index.md#hardcore-gogh),
[hardhacker](colorschemes/h/index.md#hardhacker),
@ -544,7 +586,7 @@ As features stabilize some brief notes about them will accumulate here.
[Hurtado (Gogh)](colorschemes/h/index.md#hurtado-gogh),
[Ic Orange Ppl (Gogh)](colorschemes/i/index.md#ic-orange-ppl-gogh),
[Idle Toes (Gogh)](colorschemes/i/index.md#idle-toes-gogh),
[Isotope (dark) (terminal.sexy)](colorschemes/i/index.md#isotope-dark-terminal-sexy),
[Isotope (dark) (terminal.sexy)](colorschemes/i/index.md#isotope-dark-terminalsexy),
[Jackie Brown (Gogh)](colorschemes/j/index.md#jackie-brown-gogh),
[Japanesque (Gogh)](colorschemes/j/index.md#japanesque-gogh),
[Jellybeans (Gogh)](colorschemes/j/index.md#jellybeans-gogh),
@ -553,15 +595,15 @@ As features stabilize some brief notes about them will accumulate here.
[Lavandula (Gogh)](colorschemes/l/index.md#lavandula-gogh),
[Liquid Carbon (Gogh)](colorschemes/l/index.md#liquid-carbon-gogh),
[Liquid Carbon Transparent (Gogh)](colorschemes/l/index.md#liquid-carbon-transparent-gogh),
[Londontube (dark) (terminal.sexy)](colorschemes/l/index.md#londontube-dark-terminal-sexy),
[Londontube (dark) (terminal.sexy)](colorschemes/l/index.md#londontube-dark-terminalsexy),
[Man Page (Gogh)](colorschemes/m/index.md#man-page-gogh),
[Marrakesh (dark) (terminal.sexy)](colorschemes/m/index.md#marrakesh-dark-terminal-sexy),
[Marrakesh (dark) (terminal.sexy)](colorschemes/m/index.md#marrakesh-dark-terminalsexy),
[Mathias (Gogh)](colorschemes/m/index.md#mathias-gogh),
[Medallion (Gogh)](colorschemes/m/index.md#medallion-gogh),
[Misterioso (Gogh)](colorschemes/m/index.md#misterioso-gogh),
[Mocha (dark) (terminal.sexy)](colorschemes/m/index.md#mocha-dark-terminal-sexy),
[Mocha (dark) (terminal.sexy)](colorschemes/m/index.md#mocha-dark-terminalsexy),
[Mona Lisa (Gogh)](colorschemes/m/index.md#mona-lisa-gogh),
[Monokai (dark) (terminal.sexy)](colorschemes/m/index.md#monokai-dark-terminal-sexy),
[Monokai (dark) (terminal.sexy)](colorschemes/m/index.md#monokai-dark-terminalsexy),
[Monokai Soda (Gogh)](colorschemes/m/index.md#monokai-soda-gogh),
[N0Tch2K (Gogh)](colorschemes/n/index.md#n0tch2k-gogh),
[Neopolitan (Gogh)](colorschemes/n/index.md#neopolitan-gogh),
@ -572,24 +614,24 @@ As features stabilize some brief notes about them will accumulate here.
[Nord (Gogh)](colorschemes/n/index.md#nord-gogh),
[Novel (Gogh)](colorschemes/n/index.md#novel-gogh),
[Obsidian (Gogh)](colorschemes/o/index.md#obsidian-gogh),
[Ocean (dark) (terminal.sexy)](colorschemes/o/index.md#ocean-dark-terminal-sexy),
[Ocean (dark) (terminal.sexy)](colorschemes/o/index.md#ocean-dark-terminalsexy),
[Oceanic Next (Gogh)](colorschemes/o/index.md#oceanic-next-gogh),
[Ollie (Gogh)](colorschemes/o/index.md#ollie-gogh),
[Paraiso (base16)](colorschemes/p/index.md#paraiso-base16),
[Paraiso (dark) (terminal.sexy)](colorschemes/p/index.md#paraiso-dark-terminal-sexy),
[Paraiso (dark) (terminal.sexy)](colorschemes/p/index.md#paraiso-dark-terminalsexy),
[Paraiso Dark (Gogh)](colorschemes/p/index.md#paraiso-dark-gogh),
[Pencil Dark (Gogh)](colorschemes/p/index.md#pencil-dark-gogh),
[Pencil Light (Gogh)](colorschemes/p/index.md#pencil-light-gogh),
[Pnevma (Gogh)](colorschemes/p/index.md#pnevma-gogh),
[Pro (Gogh)](colorschemes/p/index.md#pro-gogh),
[Railscasts (dark) (terminal.sexy)](colorschemes/r/index.md#railscasts-dark-terminal-sexy),
[Railscasts (dark) (terminal.sexy)](colorschemes/r/index.md#railscasts-dark-terminalsexy),
[Red Alert (Gogh)](colorschemes/r/index.md#red-alert-gogh),
[Red Sands (Gogh)](colorschemes/r/index.md#red-sands-gogh),
[Relaxed (Gogh)](colorschemes/r/index.md#relaxed-gogh),
[Rippedcasts (Gogh)](colorschemes/r/index.md#rippedcasts-gogh),
[Rosé Pine (Gogh)](colorschemes/r/index.md#rosé-pine-gogh),
[Rosé Pine Dawn (Gogh)](colorschemes/r/index.md#rosé-pine-dawn-gogh),
[Rosé Pine Moon (Gogh)](colorschemes/r/index.md#rosé-pine-moon-gogh),
[Rosé Pine (Gogh)](colorschemes/r/index.md#rose-pine-gogh),
[Rosé Pine Dawn (Gogh)](colorschemes/r/index.md#rose-pine-dawn-gogh),
[Rosé Pine Moon (Gogh)](colorschemes/r/index.md#rose-pine-moon-gogh),
[Royal (Gogh)](colorschemes/r/index.md#royal-gogh),
[Sea Shells (Gogh)](colorschemes/s/index.md#sea-shells-gogh),
[Seafoam Pastel (Gogh)](colorschemes/s/index.md#seafoam-pastel-gogh),
@ -618,7 +660,7 @@ As features stabilize some brief notes about them will accumulate here.
[tokyonight-storm](colorschemes/t/index.md#tokyonight-storm),
[Toy Chest (Gogh)](colorschemes/t/index.md#toy-chest-gogh),
[Treehouse (Gogh)](colorschemes/t/index.md#treehouse-gogh),
[Twilight (dark) (terminal.sexy)](colorschemes/t/index.md#twilight-dark-terminal-sexy),
[Twilight (dark) (terminal.sexy)](colorschemes/t/index.md#twilight-dark-terminalsexy),
[Twilight (Gogh)](colorschemes/t/index.md#twilight-gogh),
[Urple (Gogh)](colorschemes/u/index.md#urple-gogh),
[Vaughn (Gogh)](colorschemes/v/index.md#vaughn-gogh),
@ -860,8 +902,8 @@ As features stabilize some brief notes about them will accumulate here.
[rose-pine](colorschemes/r/index.md#rose-pine),
[rose-pine-dawn](colorschemes/r/index.md#rose-pine-dawn),
[rose-pine-moon](colorschemes/r/index.md#rose-pine-moon),
[Solarized (dark) (terminal.sexy)](colorschemes/s/index.md#solarized-dark-terminal-sexy),
[tokyonight_moon](colorschemes/t/index.md#tokyonight-moon)
[Solarized (dark) (terminal.sexy)](colorschemes/s/index.md#solarized-dark-terminalsexy),
[tokyonight_moon](colorschemes/t/index.md)
* [window:focus()](config/lua/window/focus.md),
[ActivateWindow](config/lua/keyassignment/ActivateWindow.md),
[ActivateWindowRelative](config/lua/keyassignment/ActivateWindowRelative.md),
@ -1203,7 +1245,7 @@ As features stabilize some brief notes about them will accumulate here.
#### New
* Color schemes: [carbonfox](colorschemes/c/index.md#carbonfox), [DanQing Light (base16)](colorschemes/d/index.md#danqing-light-base16), [Dracula (Official)](colorschemes/d/index.md#dracula-official), [Poimandres](colorschemes/p/index.md#poimandres), [Poimandres Storm](colorschemes/p/index.md#poimandres-storm), [Sequoia Monochrome](colorschemes/s/index.md#sequoia-monochrome), [Sequoia Moonlight](colorschemes/s/index.md#sequoia-moonlight), [SynthwaveAlpha](colorschemes/s/index.md#synthwavealpha), [SynthwaveAlpha (Gogh)](colorschemes/s/index.md#synthwavealpha-gogh)
* Color schemes: [carbonfox](colorschemes/c/index.md#carbonfox), [DanQing Light (base16)](colorschemes/d/index.md#danqing-light-base16), [Dracula (Official)](colorschemes/d/index.md#dracula-official), [Poimandres](colorschemes/p/index.md#poimandres), [Poimandres Storm](colorschemes/p/index.md#poimandres-storm), [Sequoia Monochrome](colorschemes/s/index.md#sequoia-monochrome), [Sequoia Moonlight](colorschemes/s/index.md#sequoia-moonlight), [SynthwaveAlpha](colorschemes/s/index.md#synthwavealpha), [SynthwaveAlpha (Gogh)](colorschemes/s/index.md#synthwave-alpha-gogh)
* [window_frame](config/lua/config/window_frame.md) now supports setting border size and color [#2417](https://github.com/wez/wezterm/issues/2417)
* [CopyMode](copymode.md) now supports selecting and move by semantic zones. [#2346](https://github.com/wez/wezterm/issues/2346)
* [max_fps](config/lua/config/max_fps.md) option to limit maximum frame rate [#2419](https://github.com/wez/wezterm/discussions/2419)
@ -1281,7 +1323,7 @@ As features stabilize some brief notes about them will accumulate here.
* Internal scrollback datastructure improvements reduce per-cell overhead by up to ~40x depending on the composition of the line (lines with lots of varied attributes or image attachments will have more overhead).
* Improved search performance
* Quickselect: now defaults to searching 1000 lines above and below the current viewport, making it faster and the labels shorter for users with a larger scrollback. A new `scope_lines` parameter to [QuickSelectArgs](config/lua/keyassignment/QuickSelectArgs.md) allows controlling the search region explicitly. Thanks to [@yyogo](https://github.com/yyogo) for the initial PR! [#1317](https://github.com/wez/wezterm/pull/1317)
* OSC 10, 11 and 12 (Set Default Text Background, Default Text Foreground Color, and Text Cursor Color) now support setting the alpha component [#2313](https://github.com/wez/wezterm/issues/2313), and added [CSI 38:6](escape-sequences.md#csi-386---foreground-color-rgba), `CSI 48:6` and `CSI 58:6` extensions to allow setting full color RGB with Alpha channel for spans of text.
* OSC 10, 11 and 12 (Set Default Text Background, Default Text Foreground Color, and Text Cursor Color) now support setting the alpha component [#2313](https://github.com/wez/wezterm/issues/2313), and added [CSI 38:6](escape-sequences.md#csi-386-foreground-color-rgba), `CSI 48:6` and `CSI 58:6` extensions to allow setting full color RGB with Alpha channel for spans of text.
* Copy Mode: setting the same selection mode a second time will now toggle off that mode and clear the selection, preserving the current position [#2246](https://github.com/wez/wezterm/discussions/2246)
* Copy Mode: new default vim-style `y` "yank" key assignment will copy the selection and close copy mode
@ -1341,7 +1383,7 @@ As features stabilize some brief notes about them will accumulate here.
* In Copy Mode, `SHIFT-v` will enable line selection mode. Thanks to [@bew](https://github.com/bew)! [#2086](https://github.com/wez/wezterm/pull/2086)
* In Copy Mode, `o` and `O` can be used to move the cursor to the other end of the selection, as in vim. Thanks to [@bew](https://github.com/bew)! [#2150](https://github.com/wez/wezterm/pull/2150)
* Copy Mode: key assignments are [now configurable](copymode.md#configurable-key-assignments) [#993](https://github.com/wez/wezterm/issues/993)
* Search Mode: key assignments are [now configurable](scrollback.md#configurable-key-assignments) [#993](https://github.com/wez/wezterm/issues/993)
* Search Mode: key assignments are [now configurable](scrollback.md#configurable-search-mode-key-assignments) [#993](https://github.com/wez/wezterm/issues/993)
* Search Mode: the default `CTRL-SHIFT-F` key assignment now defaults to the new `CurrentSelectionOrEmptyString` mode to search for the current selection text, if any. See [Search](config/lua/keyassignment/Search.md) for more info.
* Copy Mode and Search Mode can be toggled and remember search results and cursor positioning, making it easier to locate and select text without using the mouse [#1592](https://github.com/wez/wezterm/issues/1592)
* In the Launcher Menu, you may now use `CTRL-G` to cancel/exit the launcher [#1977](https://github.com/wez/wezterm/issues/1977)
@ -1355,7 +1397,7 @@ As features stabilize some brief notes about them will accumulate here.
* [PaneSelect](config/lua/keyassignment/PaneSelect.md) key assignment to activate the pane selection UI to activate or swap the selected pane. [#1842](https://github.com/wez/wezterm/issues/1842) [#1975](https://github.com/wez/wezterm/issues/1975)
* [window_background_gradient](config/lua/config/window_background_gradient.md) now also supports `Linear` gradients with an angle of your choice. Thanks to [@erf](https://github.com/erf)! [#2038](https://github.com/wez/wezterm/pull/2038)
* RPM and DEB packages now install zsh and bash `wezterm` CLI completions
* Color schemes: [arcoiris](colorschemes/a/index.md#arcoiris), [duckbones](colorschemes/d/index.md#duckbones), [Grey-green](colorschemes/g/index.md#grey-green), [kanagawabones](colorschemes/k/index.md#kanagawabones), [Neon](colorschemes/n/index.md#neon), [neobones_dark](colorschemes/n/index.md#neobones_dark), [neobones_light](colorschemes/n/index.md#neobones_light), [seoulbones_dark](colorschemes/s/index.md#seoulbones_dark), [seoulbones_light](colorschemes/s/index.md#seoulbones_light), [tokyonight-day](colorschemes/t/index.md#tokyonight-day), [tokyonight-storm](colorschemes/t/index.md#tokyonight-storm), [tokyonight](colorschemes/t/index.md#tokyonight), [vimbones](colorschemes/v/index.md#vimbones), [zenbones](colorschemes/z/index.md#zenbones), [zenbones_dark](colorschemes/z/index.md#zenbones_dark), [zenbones_light](colorschemes/z/index.md#zenbones_light), [zenburned](colorschemes/z/index.md#zenburned), [zenwritten_dark](colorschemes/z/index.md#zenwritten_dark), [zenwritten_light](colorschemes/z/index.md#zenwritten_light)
* Color schemes: [arcoiris](colorschemes/a/index.md#arcoiris), [duckbones](colorschemes/d/index.md#duckbones), [Grey-green](colorschemes/g/index.md#grey-green), [kanagawabones](colorschemes/k/index.md#kanagawabones), [Neon](colorschemes/n/index.md#neon), [neobones_dark](colorschemes/n/index.md#neobones_dark), [neobones_light](colorschemes/n/index.md#neobones_light), [seoulbones_dark](colorschemes/s/index.md#seoulbones_dark), [seoulbones_light](colorschemes/s/index.md#seoulbones_light), [tokyonight-day](colorschemes/t/index.md#tokyonight-day), [tokyonight-storm](colorschemes/t/index.md#tokyonight-storm), [tokyonight](colorschemes/t/index.md#tokyonight), [vimbones](colorschemes/v/index.md#vimbones), [zenbones](colorschemes/z/index.md#zenbones), [zenbones_dark](colorschemes/z/index.md#zenbones_dark), [zenbones_light](colorschemes/z/index.md), [zenburned](colorschemes/z/index.md#zenburned), [zenwritten_dark](colorschemes/z/index.md#zenwritten_dark), [zenwritten_light](colorschemes/z/index.md#zenwritten_light)
* [wezterm.GLOBAL](config/lua/wezterm/GLOBAL.md) for persisting lua data across config reloads
* `wezterm show-keys` command to show key and mouse binding assignments [#2134](https://github.com/wez/wezterm/issues/2134)
@ -1928,7 +1970,7 @@ As features stabilize some brief notes about them will accumulate here.
* macOS: Windows now have drop-shadows when they are opaque. These were disabled due transparency support was added. Thanks to [Rice](https://github.com/fanzeyi)! [#445](https://github.com/wez/wezterm/pull/445)
* Unix: adjust font-config patterns to also match "dual spacing" fonts such as [Iosevka Term](https://typeof.net/Iosevka/). Thanks to [Leiser](https://github.com/leiserfg)! [#446](https://github.com/wez/wezterm/pull/446)
* New: Added [alternate_buffer_wheel_scroll_speed](config/lua/config/alternate_buffer_wheel_scroll_speed.md) option to control how many cursor key presses are generated by the mouse wheel when the alternate screen is active. The new default for this is a faster-than-previous-releases 3 lines per wheel tick. [#432](https://github.com/wez/wezterm/issues/432)
* macOS: Dead Keys are now processed even when `use_ime=false`. [More details in the docs](config/keys.md#macos-left-and-right-option-key). [#410](https://github.com/wez/wezterm/issues/410).
* macOS: Dead Keys are now processed even when `use_ime=false`. [More details in the docs](config/keyboard-concepts.md#macos-left-and-right-option-key). [#410](https://github.com/wez/wezterm/issues/410).
* X11: attempt to load cursors from the XCursor.theme resource specified on the root window [#524](https://github.com/wez/wezterm/issues/524)
* Added `file://` URL matching to the default list of implicit hyperlink rules [#525](https://github.com/wez/wezterm/issues/525)

View File

@ -1337,6 +1337,43 @@
"wezterm_version": "20220807-113146-c2fee766"
}
},
{
"colors": {
"ansi": [
"#111317",
"#f8747e",
"#75ad47",
"#d09214",
"#50a4e9",
"#cc83e3",
"#00b298",
"#adb0bb"
],
"background": "#1a1d23",
"brights": [
"#576176",
"#faa5ab",
"#a5cd84",
"#efbd58",
"#8dc3f1",
"#deaeed",
"#27ffdf",
"#caccd3"
],
"cursor_bg": "#caccd3",
"cursor_border": "#caccd3",
"cursor_fg": "#1a1d23",
"foreground": "#9b9fa9",
"indexed": {}
},
"metadata": {
"aliases": [],
"name": "Astrodark (Gogh)",
"origin_url": "https://github.com/Gogh-Co/Gogh",
"prefix": "a",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -5037,6 +5074,43 @@
"wezterm_version": "20230712-072601-f4abf8fd"
}
},
{
"colors": {
"ansi": [
"#362c24",
"#b10b00",
"#007232",
"#8b4c00",
"#005cb4",
"#9b0097",
"#006a78",
"#d4c3b7"
],
"background": "#f1ebe6",
"brights": [
"#514337",
"#de1100",
"#008f40",
"#ae6000",
"#0074e1",
"#c300bd",
"#008697",
"#eae1da"
],
"cursor_bg": "#362c24",
"cursor_border": "#362c24",
"cursor_fg": "#f1ebe6",
"foreground": "#362c24",
"indexed": {}
},
"metadata": {
"aliases": [],
"name": "Breadog (Gogh)",
"origin_url": "https://github.com/Gogh-Co/Gogh",
"prefix": "b",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -7670,6 +7744,43 @@
"wezterm_version": "20220807-113146-c2fee766"
}
},
{
"colors": {
"ansi": [
"#41505e",
"#d95468",
"#8bd49c",
"#ebbf83",
"#539afc",
"#b62d65",
"#70e1e8",
"#ffffff"
],
"background": "#171d23",
"brights": [
"#41505e",
"#d95468",
"#8bd49c",
"#ebbf83",
"#539afc",
"#b62d65",
"#70e1e8",
"#ffffff"
],
"cursor_bg": "#008b94",
"cursor_border": "#008b94",
"cursor_fg": "#171d23",
"foreground": "#ffffff",
"indexed": {}
},
"metadata": {
"aliases": [],
"name": "City Lights (Gogh)",
"origin_url": "https://github.com/Gogh-Co/Gogh",
"prefix": "c",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -8643,7 +8754,7 @@
],
"background": "#181818",
"brights": [
"#373b41",
"#88847f",
"#e5a1a3",
"#e8d6a7",
"#f1bb79",
@ -19309,6 +19420,43 @@
"wezterm_version": "Always"
}
},
{
"colors": {
"ansi": [
"#161821",
"#e27878",
"#b4be82",
"#e2a478",
"#84a0c6",
"#a093c7",
"#89b8c2",
"#c6c8d1"
],
"background": "#161821",
"brights": [
"#6b7089",
"#e98989",
"#c0ca8e",
"#e9b189",
"#91acd1",
"#ada0d3",
"#95c4ce",
"#d2d4de"
],
"cursor_bg": "#d2d4de",
"cursor_border": "#d2d4de",
"cursor_fg": "#161821",
"foreground": "#c6c8d1",
"indexed": {}
},
"metadata": {
"aliases": [],
"name": "Iceberg (Gogh)",
"origin_url": "https://github.com/Gogh-Co/Gogh",
"prefix": "i",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -21091,6 +21239,45 @@
"wezterm_version": "Always"
}
},
{
"colors": {
"ansi": [
"#333333",
"#b66056",
"#85b1a9",
"#dbbb43",
"#6890d7",
"#887aa3",
"#837369",
"#ddd0c4"
],
"background": "#141515",
"brights": [
"#515151",
"#ffc663",
"#c1ffae",
"#fff700",
"#a1d9ff",
"#a994ff",
"#f9cfb9",
"#ffffff"
],
"cursor_bg": "#702420",
"cursor_border": "#702420",
"cursor_fg": "#fefbf3",
"foreground": "#ddd0c4",
"indexed": {},
"selection_bg": "#515151",
"selection_fg": "#ffc663"
},
"metadata": {
"aliases": [],
"name": "kurokula",
"origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes",
"prefix": "k",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -28040,6 +28227,43 @@
"wezterm_version": "20220807-113146-c2fee766"
}
},
{
"colors": {
"ansi": [
"#000000",
"#cc3e28",
"#216609",
"#b58900",
"#1e6fcc",
"#5c21a5",
"#158c86",
"#aaaaaa"
],
"background": "#f2eede",
"brights": [
"#555555",
"#cc3e28",
"#216609",
"#b58900",
"#1e6fcc",
"#5c21a5",
"#158c86",
"#aaaaaa"
],
"cursor_bg": "#000000",
"cursor_border": "#000000",
"cursor_fg": "#f2eede",
"foreground": "#000000",
"indexed": {}
},
"metadata": {
"aliases": [],
"name": "Paper (Gogh)",
"origin_url": "https://github.com/Gogh-Co/Gogh",
"prefix": "p",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -34531,6 +34755,46 @@
"wezterm_version": "Always"
}
},
{
"colors": {
"ansi": [
"#111147",
"#5ca8dc",
"#53b397",
"#249a84",
"#db7ddd",
"#d0beee",
"#f9f3f9",
"#a175d4"
],
"background": "#111147",
"brights": [
"#111147",
"#5cb5dc",
"#52deb5",
"#01f5c7",
"#fa5dfd",
"#c6a5fd",
"#ffffff",
"#b577fd"
],
"cursor_bg": "#53b397",
"cursor_border": "#53b397",
"cursor_fg": "#53b397",
"foreground": "#db7ddd",
"indexed": {},
"selection_bg": "#5ca8dc",
"selection_fg": "#d0beee"
},
"metadata": {
"aliases": [],
"author": "lemonlime0x3C33 (https://github.com/lemonlime0x3C33)",
"name": "Sugarplum",
"origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes",
"prefix": "s",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [
@ -36799,7 +37063,7 @@
{
"colors": {
"ansi": [
"#e9e9ed",
"#b4b5b9",
"#f52a65",
"#587539",
"#8c6c3e",
@ -36826,13 +37090,13 @@
"foreground": "#3760bf",
"indexed": {},
"scrollbar_thumb": "#c4c8da",
"selection_bg": "#b6bfe2",
"selection_bg": "#b7c1e3",
"selection_fg": "#3760bf",
"split": "#2e7de9",
"tab_bar": {
"active_tab": {
"bg_color": "#2e7de9",
"fg_color": "#e9e9ec",
"fg_color": "#d0d5e3",
"intensity": "Normal",
"italic": false,
"strikethrough": false,
@ -36847,7 +37111,7 @@
"strikethrough": false,
"underline": "None"
},
"inactive_tab_edge": "#e9e9ec",
"inactive_tab_edge": "#d0d5e3",
"inactive_tab_hover": {
"bg_color": "#c4c8da",
"fg_color": "#2e7de9",
@ -38671,6 +38935,45 @@
"wezterm_version": "20230712-072601-f4abf8fd"
}
},
{
"colors": {
"ansi": [
"#101010",
"#f5a191",
"#90b99f",
"#e6b99d",
"#aca1cf",
"#e29eca",
"#ea83a5",
"#a0a0a0"
],
"background": "#101010",
"brights": [
"#7e7e7e",
"#ff8080",
"#99ffe4",
"#ffc799",
"#b9aeda",
"#ecaad6",
"#f591b2",
"#ffffff"
],
"cursor_bg": "#acb1ab",
"cursor_border": "#acb1ab",
"cursor_fg": "#ffffff",
"foreground": "#ffffff",
"indexed": {},
"selection_bg": "#988049",
"selection_fg": "#acb1ab"
},
"metadata": {
"aliases": [],
"name": "Vesper",
"origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes",
"prefix": "v",
"wezterm_version": "nightly builds only"
}
},
{
"colors": {
"ansi": [

View File

@ -223,7 +223,7 @@ builting color scheme.
If you'd like to factor your color schemes out into separate files, you
can create a file with a `[colors]` section; take a look at [one of
the available color schemes for an example](https://github.com/wez/wezterm/config/src/scheme_data.rs).
the available color schemes for an example](https://github.com/wez/wezterm/tree/main/config/src/scheme_data.rs).
It is recommended that you place your custom scheme in a directory
named `$HOME/.config/wezterm/colors` if you're on a POSIX system.
@ -481,7 +481,7 @@ config.window_background_image_hsb = {
}
```
See [Styling Inactive Panes](#style-inactive-panes) for more information
See [Styling Inactive Panes](#styling-inactive-panes) for more information
on hue, saturation, brigthness transformations.
If you'd like to have control over scaling, tiling/repeating, scrolling

View File

@ -146,23 +146,53 @@ return config
## Example: docker domains
Fully working example is yet to be completely fleshed out (volunteers welcome!) but the
gist of it is:
This example shows how to add each running docker container as a domain,
so that you can spawn a shell into it and/or split it:
{% raw %}
```lua
local wezterm = require 'wezterm'
local config = {}
local config = wezterm.config_builder()
function docker_list()
-- Use wezterm.run_child_process to run
-- `docker container ls --format '{{.ID}}:{{.Names}}'` and parse
-- the output and return a mapping from ID -> name
local docker_list = {}
local success, stdout, stderr = wezterm.run_child_process {
'docker',
'container',
'ls',
'--format',
'{{.ID}}:{{.Names}}',
}
for _, line in ipairs(wezterm.split_by_newlines(stdout)) do
local id, name = line:match '(.-):(.+)'
if id and name then
docker_list[id] = name
end
end
return docker_list
end
function make_docker_label_func(id)
return function(name)
local success, stdout, stderr = wezterm.run_child_process {
'docker',
'inspect',
'--format',
'{{.State.Running}}',
id,
}
local running = stdout == 'true\n'
local color = running and 'Green' or 'Red'
return wezterm.format {
{ Foreground = { AnsiColor = color } },
{ Text = 'docker container named ' .. name },
}
end
end
function make_docker_fixup_func(id)
return function(cmd)
cmd.args = cmd.args or { '/bin/bash' }
cmd.args = cmd.args or { '/bin/sh' }
local wrapped = {
'docker',
'exec',
@ -178,32 +208,23 @@ function make_docker_fixup_func(id)
end
end
function make_docker_label_func(id)
return function(name)
-- TODO: query the container state and show info about
-- whether it is running or stopped.
-- If it stopped, you may wish to change the color to red
-- to make it stand out
return wezterm.format {
{ Foreground = { AnsiColor = 'Red' } },
{ Text = 'docker container named ' .. name },
}
end
end
local exec_domains = {}
for id, name in pairs(docker_list()) do
table.insert(
exec_domains,
wezterm.exec_domain(
'docker: ' .. name,
make_docker_fixup_func(id),
make_docker_label_func(id)
function compute_exec_domains()
local exec_domains = {}
for id, name in pairs(docker_list()) do
table.insert(
exec_domains,
wezterm.exec_domain(
'docker:' .. name,
make_docker_fixup_func(id),
make_docker_label_func(id)
)
)
)
end
return exec_domains
end
config.exec_domains = exec_domains
config.exec_domains = compute_exec_domains()
return config
```
{% endraw %}

View File

@ -17,6 +17,12 @@ config.quick_select_patterns = {
}
```
!!! note
If you want to use capture groups in your patterns, you must use
non-capturing groups `(?:)` for them to work as you intend, as
the overall list of `quick_select_patterns` is compiled into a larger
alternation regex that itself uses capture groups.
{{since('20230408-112425-69ae8472', outline=True)}}
The regex syntax now supports backreferences and look around assertions.
See [Fancy Regex Syntax](https://docs.rs/fancy-regex/latest/fancy_regex/#syntax)

View File

@ -0,0 +1,16 @@
---
tags:
- appearance
- tab_bar
---
# `show_close_tab_button_in_tabs = true`
{{since('nightly')}}
When set to `false`, the close-tab button will not be drawn in tabs when the
fancy tab bar is in use. Default is `true`.
```lua
config.show_close_tab_button_in_tabs = false
```

View File

@ -19,7 +19,7 @@ have been removed and replaced by the more flexible
{{since('20210314-114017-04b7cedd')}}
This config option allows styling the elements that appear in the tab bar.
This configuration supplements the [tab bar color](../../appearance.md#tab-bar-appearance--colors)
This configuration supplements the [tab bar color](../../appearance.md#tab-bar-appearance-colors)
options.
Styling in this context refers to how the edges of the tabs and the new tab button are rendered.

View File

@ -11,7 +11,7 @@ to take the surrounding semantic zone.
In this example, the triple-left-click mouse action is set to
automatically select the entire command output when clicking
on any character withing that region:
on any character within that region:
```lua
config.mouse_bindings = {

View File

@ -12,7 +12,7 @@ for the sake of simplicity.
A Pane object is typically passed to your code via an event callback. A Pane
object is a handle to a live instance of a Pane that is known to the wezterm
process. A Pane object tracks the psuedo terminal (or real serial terminal)
process. A Pane object tracks the pseudo terminal (or real serial terminal)
and associated process(es) and the parsed screen and scrollback.
A Pane object can be used to send input to the associated processes and

View File

@ -16,7 +16,10 @@ return {
mods = 'NONE',
action = act.CopyMode 'MoveToStartOfNextLine',
},
{ key = 'Escape', mods = 'NONE', action = act.CopyMode 'Close' },
{ key = 'Escape', mods = 'NONE', action = act.Multiple {
{ CopyMode = 'ScrollToBottom' },
{ CopyMode = 'Close' },
} },
{
key = 'Space',
mods = 'NONE',
@ -124,7 +127,10 @@ return {
{ key = 'b', mods = 'NONE', action = act.CopyMode 'MoveBackwardWord' },
{ key = 'b', mods = 'ALT', action = act.CopyMode 'MoveBackwardWord' },
{ key = 'b', mods = 'CTRL', action = act.CopyMode 'PageUp' },
{ key = 'c', mods = 'CTRL', action = act.CopyMode 'Close' },
{ key = 'c', mods = 'CTRL', action = act.Multiple {
{ CopyMode = 'ScrollToBottom' },
{ CopyMode = 'Close' },
} },
{
key = 'd',
mods = 'CTRL',
@ -147,7 +153,10 @@ return {
mods = 'NONE',
action = act.CopyMode 'MoveToScrollbackTop',
},
{ key = 'g', mods = 'CTRL', action = act.CopyMode 'Close' },
{ key = 'g', mods = 'CTRL', action = act.Multiple {
{ CopyMode = 'ScrollToBottom' },
{ CopyMode = 'Close' },
} },
{ key = 'h', mods = 'NONE', action = act.CopyMode 'MoveLeft' },
{ key = 'j', mods = 'NONE', action = act.CopyMode 'MoveDown' },
{ key = 'k', mods = 'NONE', action = act.CopyMode 'MoveUp' },
@ -162,7 +171,10 @@ return {
mods = 'NONE',
action = act.CopyMode 'MoveToSelectionOtherEnd',
},
{ key = 'q', mods = 'NONE', action = act.CopyMode 'Close' },
{ key = 'q', mods = 'NONE', action = act.Multiple {
{ CopyMode = 'ScrollToBottom' },
{ CopyMode = 'Close' },
} },
{
key = 't',
mods = 'NONE',
@ -189,6 +201,7 @@ return {
mods = 'NONE',
action = act.Multiple {
{ CopyTo = 'ClipboardAndPrimarySelection' },
{ CopyMode = 'ScrollToBottom' },
{ CopyMode = 'Close' },
},
},

View File

@ -7,7 +7,7 @@ hide:
* Runs on Linux, macOS, Windows 10 and FreeBSD
* [Multiplex terminal panes, tabs and windows on local and remote hosts, with native mouse and scrollback](multiplexing.md)
* <a href="https://github.com/tonsky/FiraCode#fira-code-monospaced-font-with-programming-ligatures">Ligatures</a>, Color Emoji and font fallback, with true color and [dynamic color schemes](config/appearance.md#colors).
* <a href="https://github.com/tonsky/FiraCode#fira-code-monospaced-font-with-programming-ligatures">Ligatures</a>, Color Emoji and font fallback, with true color and [dynamic color schemes](config/appearance.md).
* [Hyperlinks](hyperlinks.md)
* [Searchable Scrollback](scrollback.md) (use mouse wheel and `Shift-PageUp` and `Shift PageDown` to navigate, Ctrl-Shift-F to activate search mode)
* xterm style selection of text with mouse; paste selection via `Shift-Insert` (bracketed paste is supported!)

View File

@ -13,7 +13,7 @@ hide:
* Runs on Linux, macOS, Windows 10 and FreeBSD
* [Multiplex terminal panes, tabs and windows on local and remote hosts, with native mouse and scrollback](multiplexing.md)
* <a href="https://github.com/tonsky/FiraCode#fira-code-monospaced-font-with-programming-ligatures">Ligatures</a>, Color Emoji and font fallback, with true color and [dynamic color schemes](config/appearance.md#colors).
* <a href="https://github.com/tonsky/FiraCode#fira-code-monospaced-font-with-programming-ligatures">Ligatures</a>, Color Emoji and font fallback, with true color and [dynamic color schemes](config/appearance.md).
* [Hyperlinks](hyperlinks.md)
* [A full list of features can be found here](features.md)

View File

@ -103,7 +103,7 @@ hide:
$ curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/wezterm-fury.gpg
$ echo 'deb [signed-by=/usr/share/keyrings/wezterm-fury.gpg] https://apt.fury.io/wez/ * *' | sudo tee /etc/apt/sources.list.d/wezterm.list
```
Update your dependencies:
```console
@ -167,19 +167,34 @@ hide:
available in Copr for `x86_64` and `aarch64`:
* Centos Stream 8 and 9
* Fedora 38, 39, rawhide
* OpenSUSE Leap 15.5
* OpenSUSE Tumbleweed
* Fedora 38, 39, 40, rawhide
* openSUSE Leap 15.5
* openSUSE Tumbleweed
* RHEL 8, 9
To perform initial installation:
```console
$ sudo dnf copr enable wezfurlong/wezterm-nightly
$ sudo dnf install wezterm
```
## openSUSE specific
To update:
To perform initial installation:
```console
$ sudo zypper in dnf
$ sudo dnf copr enable wezfurlong/wezterm-nightly <repository>
```
where `<repository>` is one of the following, depending on the flavor and architecture:
`opensuse-tumbleweed-x86_64`, `opensuse-tumbleweed-aarch64`, `opensuse-leap-15.5-x86_64`, `opensuse-leap-15.5-aarch64`.
```console
$ sudo dnf install wezterm
```
## Update
```console
$ sudo dnf update wezterm
@ -199,11 +214,12 @@ hide:
|Distro | Stable | Nightly |
|------------|------------------|---------------------|
|CentOS8 |[{{ centos8_rpm_stable_asset }}]({{ centos8_rpm_stable }}) |[{{ centos8_rpm_nightly_asset }}]({{ centos8_rpm_nightly }})|
|CentOS8 |[{{ centos8_rpm_stable_asset }}]({{ centos8_rpm_stable }}) |No longer supported|
|CentOS9 |[{{ centos9_rpm_stable_asset }}]({{ centos9_rpm_stable }})|[{{ centos9_rpm_nightly_asset }}]({{ centos9_rpm_nightly }})|
|Fedora37 |[{{ fedora37_rpm_stable_asset }}]({{ fedora37_rpm_stable }})|[{{ fedora37_rpm_nightly_asset }}]({{ fedora37_rpm_nightly }})|
|Fedora37 |[{{ fedora37_rpm_stable_asset }}]({{ fedora37_rpm_stable }})|No longer supported|
|Fedora38 |[{{ fedora38_rpm_stable_asset }}]({{ fedora38_rpm_stable }})|[{{ fedora38_rpm_nightly_asset }}]({{ fedora38_rpm_nightly }})|
|Fedora39 |[{{ fedora39_rpm_stable_asset }}]({{ fedora39_rpm_stable }})|[{{ fedora39_rpm_nightly_asset }}]({{ fedora39_rpm_nightly }})|
|Fedora40 |Nightly only|[{{ fedora40_rpm_nightly_asset }}]({{ fedora40_rpm_nightly }})|
To download and install from the CLI you can use something like this, which
shows how to install the Fedora 39 package:
@ -212,24 +228,24 @@ hide:
$ sudo dnf install -y {{ fedora39_rpm_stable }}
```
=== "SUSE"
## SUSE Linux
=== "openSUSE"
## openSUSE
!!! note
It is recommended that you install via Copr so that it is easiest
to stay up to date as future versions of wezterm are released.
WezTerm is also available in the official Factory repo in openSUSE
Tumbleweed. To install from Factory instead of Copr:
## openSUSE Tumbleweed/Slowroll
The stable version of WezTerm is available in the official repositories.
```console
$ zypper addrepo https://download.opensuse.org/repositories/openSUSE:Factory/standard/openSUSE:Factory.repo
$ zypper refresh
$ zypper install wezterm
```
* The package installs `/usr/bin/wezterm` and `/usr/share/applications/org.wezfurlong.wezterm.desktop`
* Configuration instructions can be [found here](../config/files.md)
## openSUSE Leap
Use Copr or build if from source.
=== "Arch"
## Arch Linux

View File

@ -33,16 +33,30 @@ $ brew install --cask wezterm
If you'd like to use a nightly build:
```console
$ brew tap homebrew/cask-versions
$ brew install --cask wezterm-nightly
$ brew install --cask wezterm@nightly
```
!!! note
For users who have previously used the cask named `wezterm-nightly`,
homebrew has started issuing warnings: `Warning: Cask
homebrew/cask-versions/wezterm-nightly was renamed to wezterm@nightly`. We
recommend that you use `brew uninstall wezterm-nightly` to uninstall the
previously installed version, and then reinstall the new version using the
command above.
to upgrade to a newer nightly (normal `brew upgrade` will not upgrade it!):
```console
$ brew upgrade --cask wezterm-nightly --no-quarantine --greedy-latest
$ brew upgrade --cask wezterm@nightly --no-quarantine --greedy-latest
```
!!! note
The `--greedy-latest` option in Homebrew forces the latest version of a
formula to be installed, even if a version satisfying the formula's
requirements is already installed. This can be useful when you want to
ensure you have the most up-to-date version of a package, regardless of
whether an older version meets the current dependency requirements.
## MacPorts
WezTerm is also available via [MacPorts](https://ports.macports.org/port/wezterm/summary):

View File

@ -5,14 +5,14 @@ for yourself. WezTerm should run on any modern unix as well as Windows 10 and
macOS.
* Install `rustup` to get the `rust` compiler installed on your system.
[Install rustup](https://www.rust-lang.org/en-US/install.html)
[Install rustup](https://www.rust-lang.org/en-US/install.html).
* Rust version 1.71 or later is required
* Build in release mode: `cargo build --release`
* Run it via either `cargo run --release --bin wezterm` or `target/release/wezterm`
You will need a collection of support libraries; the [`get-deps`](https://github.com/wez/wezterm/blob/main/get-deps) script will
attempt to install them for you. If it doesn't know about your system,
[please contribute instructions!](https://github.com/wez/wezterm/blob/main/CONTRIBUTING.md)
[please contribute instructions!](https://github.com/wez/wezterm/blob/main/CONTRIBUTING.md).
If you don't plan to submit a pull request to the wezterm repo, you can
download a smaller source tarball using these steps:
@ -53,3 +53,19 @@ $ cargo build --release --no-default-features --features vendored-fonts
```
Building without X11 is not supported.
### Building on Windows
When installing Rust, you must use select the MSVC version of Rust. It is the
only supported way to build wezterm.
On Windows, instead of using `get-deps`, the only other dependency that you need is
[Strawberry Perl](https://strawberryperl.com). You must ensure that you have
your `PATH` environment set up to find that particular `perl.exe` ahead of any
other perl that you may have installed on your system. This particular version
of perl is required to build openssl on Windows.
```console
$ set PATH=c:\Strawberry\perl\bin;%PATH%
```

View File

@ -115,7 +115,6 @@ suse_deps() {
if [ "${CI}" == "yes" ] ; then
RESOLVE="--allow-downgrade"
fi
$ZYPPER install $RESOLVE -yl 'perl-FindBin' 'perl-File-Compare' || true
$ZYPPER install $RESOLVE -yl \
'make' \
'gcc' \

View File

@ -11,7 +11,7 @@ ahash = "0.8"
config = { path = "../config" }
fnv = "1.0"
intrusive-collections = "0.9"
metrics = "0.22"
metrics = "0.23"
[dev-dependencies]
k9 = "0.12"

View File

@ -200,7 +200,7 @@ pub fn extract_colors_from_image<'lua>(
}
log::trace!("loading image {file_name}");
let im = image::io::Reader::open(&file_name)
let im = image::ImageReader::open(&file_name)
.map_err(|err| mlua::Error::external(format!("{err:#} while loading {file_name}")))?
.decode()
.map_err(|err| {

View File

@ -10,12 +10,15 @@ def define_env(env):
@env.macro
def since(vers, outline=False, inline=False):
if vers == "nightly":
# Determine the relative path traversal to the root,
# so that we can emit the link to the install page
rel_root = "../" * (len(env.page.url.split('/')) - 1)
first_line = "*Since: Nightly Builds Only*"
expanded = "+"
blurb = """
blurb = f"""
The functionality described in this section requires a nightly build of wezterm.
You can obtain a nightly build by following the instructions from the
[Download](/wezterm/installation.html) section.
[Download]({rel_root}installation.md) section.
"""
else:
first_line = f"*Since: Version {vers}*"

View File

@ -25,7 +25,7 @@ lazy_static = "1.4"
libc = "0.2"
log = "0.4"
luahelper = { path = "../luahelper" }
metrics = "0.22"
metrics = "0.23"
mlua = "0.9"
names = { version = "0.12", default-features = false }
nix = {version="0.28", features=["term"]}

View File

@ -87,6 +87,23 @@ impl std::ops::DerefMut for Pattern {
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub enum PatternType {
CaseSensitiveString,
CaseInSensitiveString,
Regex,
}
impl From<&Pattern> for PatternType {
fn from(value: &Pattern) -> Self {
match value {
Pattern::CaseSensitiveString(_) => PatternType::CaseSensitiveString,
Pattern::CaseInSensitiveString(_) => PatternType::CaseInSensitiveString,
Pattern::Regex(_) => PatternType::Regex,
}
}
}
/// Why a close request is being made
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum CloseReason {

View File

@ -127,8 +127,10 @@ impl AgentProxy {
std::thread::sleep(std::time::Duration::from_millis(100));
while receiver.try_recv().is_ok() {}
if let Some(agent) = &Mux::get().agent {
agent.update_now();
if let Some(mux) = Mux::try_get() {
if let Some(agent) = &mux.agent {
agent.update_now();
}
}
}
}

View File

@ -131,6 +131,8 @@ impl Window {
if len > 0 && self.active >= len {
self.set_active_without_saving(len - 1);
} else {
self.invalidate();
}
}

View File

@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1705309234,
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
@ -71,11 +71,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1705403940,
"narHash": "sha256-bl7E3w35Bleiexg01WsN0RuAQEL23HaQeNBC2zjt+9w=",
"lastModified": 1721466660,
"narHash": "sha256-pFSxgSZqZ3h+5Du0KvEL1ccDZBwu4zvOil1zzrPNb3c=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f0326542989e1bdac955ad6269b334a8da4b0c95",
"rev": "6e14bbce7bea6c4efd7adfa88a40dac750d80100",
"type": "github"
},
"original": {
@ -98,19 +98,16 @@
},
"rust-overlay": {
"inputs": {
"flake-utils": [
"flake-utils"
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1705457855,
"narHash": "sha256-5cCHQtP/PEHK1YNTQyZN9v8ehpLTjc723ZSKAP3Tva8=",
"lastModified": 1721441897,
"narHash": "sha256-gYGX9/22tPNeF7dR6bWN5rsrpU4d06GnQNNgZ6ZiXz0=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "a854609265af0e9f48c92e497679edf8fab9e690",
"rev": "b7996075da11a2d441cfbf4e77c2939ce51506fd",
"type": "github"
},
"original": {

View File

@ -6,10 +6,7 @@
flake-utils.url = "github:numtide/flake-utils";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
nixpkgs.follows = "nixpkgs";
flake-utils.follows = "flake-utils";
};
inputs.nixpkgs.follows = "nixpkgs";
};
# NOTE: @2024-05 Nix flakes does not support getting git submodules of 'self'.
@ -159,6 +156,8 @@
tic -x -o $out/share/terminfo ${src}/termwiz/data/wezterm.terminfo
'';
};
meta.mainProgram = "wezterm";
};
devShell = pkgs.mkShell {

View File

@ -84,7 +84,9 @@ pub async fn fetch_url(url: &str) -> anyhow::Result<Vec<u8>> {
}
fn make_ident(key: &str) -> String {
let key = key.to_ascii_lowercase();
let key = key
.to_ascii_lowercase()
.replace("terminal.sexy", "terminalsexy");
let fields: Vec<&str> = key
.split(|c: char| !c.is_alphanumeric())
.filter(|c| !c.is_empty())

View File

@ -297,7 +297,7 @@ pub(crate) struct ImageInfo {
}
pub(crate) fn dimensions(data: &[u8]) -> anyhow::Result<ImageInfo> {
let reader = image::io::Reader::new(std::io::Cursor::new(data)).with_guessed_format()?;
let reader = image::ImageReader::new(std::io::Cursor::new(data)).with_guessed_format()?;
let format = reader
.format()
.ok_or_else(|| anyhow::anyhow!("unknown format!?"))?;

View File

@ -2315,9 +2315,8 @@ impl TerminalState {
// The terminal only recognizes this control function if vertical split
// screen mode (DECLRMM) is set.
if self.left_and_right_margin_mode {
let rows = self.screen().physical_rows as u32;
let cols = self.screen().physical_cols as u32;
let left = left.as_zero_based().min(rows - 1).max(0) as usize;
let left = left.as_zero_based().min(cols - 1).max(0) as usize;
let right = right.as_zero_based().min(cols - 1).max(0) as usize;
// The value of the left margin (Pl) must be less than the right margin (Pr).

View File

@ -344,7 +344,7 @@ impl ImageDataType {
pub fn dimensions(&self) -> Result<(u32, u32), InternalError> {
fn dimensions_for_data(data: &[u8]) -> image::ImageResult<(u32, u32)> {
let reader =
image::io::Reader::new(std::io::Cursor::new(data)).with_guessed_format()?;
image::ImageReader::new(std::io::Cursor::new(data)).with_guessed_format()?;
let (width, height) = reader.into_dimensions()?;
Ok((width, height))

View File

@ -0,0 +1,189 @@
use unicode_segmentation::GraphemeCursor;
use super::actions::Movement;
pub struct LineEditBuffer {
line: String,
/// byte index into the UTF-8 string data of the insertion
/// point. This is NOT the number of graphemes!
cursor: usize,
}
impl Default for LineEditBuffer {
fn default() -> Self {
Self {
line: String::new(),
cursor: 0,
}
}
}
impl LineEditBuffer {
pub fn new(line: &str, cursor: usize) -> Self {
let mut buffer = Self::default();
buffer.set_line_and_cursor(line, cursor);
return buffer;
}
pub fn get_line(&self) -> &str {
return &self.line;
}
pub fn get_cursor(&self) -> usize {
return self.cursor;
}
pub fn insert_char(&mut self, c: char) {
self.line.insert(self.cursor, c);
let mut cursor = GraphemeCursor::new(self.cursor, self.line.len(), false);
if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) {
self.cursor = pos;
}
}
pub fn insert_text(&mut self, text: &str) {
self.line.insert_str(self.cursor, text);
self.cursor += text.len();
}
/// The cursor position is the byte index into the line UTF-8 bytes.
/// Panics: the cursor must be the first byte in a UTF-8 code point
/// sequence or the end of the provided line.
pub fn set_line_and_cursor(&mut self, line: &str, cursor: usize) {
assert!(
line.is_char_boundary(cursor),
"cursor {} is not a char boundary of the new line {}",
cursor,
line
);
self.line = line.to_string();
self.cursor = cursor;
}
pub fn kill_text(&mut self, kill_movement: Movement, move_movement: Movement) {
let kill_pos = self.eval_movement(kill_movement);
let new_cursor = self.eval_movement(move_movement);
let (lower, upper) = if kill_pos < self.cursor {
(kill_pos, self.cursor)
} else {
(self.cursor, kill_pos)
};
self.line.replace_range(lower..upper, "");
// Clamp to the line length, otherwise a kill to end of line
// command will leave the cursor way off beyond the end of
// the line.
self.cursor = new_cursor.min(self.line.len());
}
pub fn clear(&mut self) {
self.line.clear();
self.cursor = 0;
}
pub fn exec_movement(&mut self, movement: Movement) {
self.cursor = self.eval_movement(movement);
}
/// Compute the cursor position after applying movement
fn eval_movement(&self, movement: Movement) -> usize {
match movement {
Movement::BackwardChar(rep) => {
let mut position = self.cursor;
for _ in 0..rep {
let mut cursor = GraphemeCursor::new(position, self.line.len(), false);
if let Ok(Some(pos)) = cursor.prev_boundary(&self.line, 0) {
position = pos;
} else {
break;
}
}
position
}
Movement::BackwardWord(rep) => {
let char_indices: Vec<(usize, char)> = self.line.char_indices().collect();
if char_indices.is_empty() {
return self.cursor;
}
let mut char_position = char_indices
.iter()
.position(|(idx, _)| *idx == self.cursor)
.unwrap_or(char_indices.len() - 1);
for _ in 0..rep {
if char_position == 0 {
break;
}
let mut found = None;
for prev in (0..char_position - 1).rev() {
if char_indices[prev].1.is_whitespace() {
found = Some(prev + 1);
break;
}
}
char_position = found.unwrap_or(0);
}
char_indices[char_position].0
}
Movement::ForwardWord(rep) => {
let char_indices: Vec<(usize, char)> = self.line.char_indices().collect();
if char_indices.is_empty() {
return self.cursor;
}
let mut char_position = char_indices
.iter()
.position(|(idx, _)| *idx == self.cursor)
.unwrap_or_else(|| char_indices.len());
for _ in 0..rep {
// Skip any non-whitespace characters
while char_position < char_indices.len()
&& !char_indices[char_position].1.is_whitespace()
{
char_position += 1;
}
// Skip any whitespace characters
while char_position < char_indices.len()
&& char_indices[char_position].1.is_whitespace()
{
char_position += 1;
}
// We are now on the start of the next word
}
char_indices
.get(char_position)
.map(|(i, _)| *i)
.unwrap_or_else(|| self.line.len())
}
Movement::ForwardChar(rep) => {
let mut position = self.cursor;
for _ in 0..rep {
let mut cursor = GraphemeCursor::new(position, self.line.len(), false);
if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) {
position = pos;
} else {
break;
}
}
position
}
Movement::StartOfLine => 0,
Movement::EndOfLine => {
let mut cursor =
GraphemeCursor::new(self.line.len().saturating_sub(1), self.line.len(), false);
if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) {
pos
} else {
self.cursor
}
}
Movement::None => self.cursor,
}
}
}

View File

@ -43,12 +43,13 @@ use crate::surface::change::ChangeSequence;
use crate::surface::{Change, Position};
use crate::terminal::{new_terminal, Terminal};
use crate::{bail, ensure, Result};
use unicode_segmentation::GraphemeCursor;
mod actions;
mod buffer;
mod history;
mod host;
pub use actions::{Action, Movement, RepeatCount};
pub use buffer::LineEditBuffer;
pub use history::*;
pub use host::*;
@ -71,10 +72,7 @@ pub use host::*;
pub struct LineEditor<'term> {
terminal: &'term mut dyn Terminal,
prompt: String,
line: String,
/// byte index into the UTF-8 string data of the insertion
/// point. This is NOT the number of graphemes!
cursor: usize,
line: LineEditBuffer,
history_pos: Option<usize>,
bottom_line: Option<String>,
@ -155,8 +153,7 @@ impl<'term> LineEditor<'term> {
Self {
terminal,
prompt: "> ".to_owned(),
line: String::new(),
cursor: 0,
line: LineEditBuffer::default(),
history_pos: None,
bottom_line: None,
completion: None,
@ -185,8 +182,8 @@ impl<'term> LineEditor<'term> {
matching_line,
cursor,
..
} => (matching_line, *cursor),
_ => (&self.line, self.cursor),
} => (matching_line.as_str(), *cursor),
_ => (self.line.get_line(), self.line.get_cursor()),
};
let cursor_position_after_printing_prompt = changes.current_cursor_position();
@ -258,7 +255,7 @@ impl<'term> LineEditor<'term> {
// the text in the line editing area, but since the input
// is drawn here, we render an `_` to indicate where the input
// position really is.
changes.add(format!("\r\n{}: {}_", label, self.line));
changes.add(format!("\r\n{}: {}_", label, self.line.get_line()));
}
// Add some debugging status at the bottom
@ -512,123 +509,9 @@ impl<'term> LineEditor<'term> {
}
}
/// Compute the cursor position after applying movement
fn eval_movement(&self, movement: Movement) -> usize {
match movement {
Movement::BackwardChar(rep) => {
let mut position = self.cursor;
for _ in 0..rep {
let mut cursor = GraphemeCursor::new(position, self.line.len(), false);
if let Ok(Some(pos)) = cursor.prev_boundary(&self.line, 0) {
position = pos;
} else {
break;
}
}
position
}
Movement::BackwardWord(rep) => {
let char_indices: Vec<(usize, char)> = self.line.char_indices().collect();
if char_indices.is_empty() {
return self.cursor;
}
let mut char_position = char_indices
.iter()
.position(|(idx, _)| *idx == self.cursor)
.unwrap_or(char_indices.len() - 1);
for _ in 0..rep {
if char_position == 0 {
break;
}
let mut found = None;
for prev in (0..char_position - 1).rev() {
if char_indices[prev].1.is_whitespace() {
found = Some(prev + 1);
break;
}
}
char_position = found.unwrap_or(0);
}
char_indices[char_position].0
}
Movement::ForwardWord(rep) => {
let char_indices: Vec<(usize, char)> = self.line.char_indices().collect();
if char_indices.is_empty() {
return self.cursor;
}
let mut char_position = char_indices
.iter()
.position(|(idx, _)| *idx == self.cursor)
.unwrap_or_else(|| char_indices.len());
for _ in 0..rep {
// Skip any non-whitespace characters
while char_position < char_indices.len()
&& !char_indices[char_position].1.is_whitespace()
{
char_position += 1;
}
// Skip any whitespace characters
while char_position < char_indices.len()
&& char_indices[char_position].1.is_whitespace()
{
char_position += 1;
}
// We are now on the start of the next word
}
char_indices
.get(char_position)
.map(|(i, _)| *i)
.unwrap_or_else(|| self.line.len())
}
Movement::ForwardChar(rep) => {
let mut position = self.cursor;
for _ in 0..rep {
let mut cursor = GraphemeCursor::new(position, self.line.len(), false);
if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) {
position = pos;
} else {
break;
}
}
position
}
Movement::StartOfLine => 0,
Movement::EndOfLine => {
let mut cursor =
GraphemeCursor::new(self.line.len().saturating_sub(1), self.line.len(), false);
if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) {
pos
} else {
self.cursor
}
}
Movement::None => self.cursor,
}
}
fn kill_text(&mut self, kill_movement: Movement, move_movement: Movement) {
self.clear_completion();
let kill_pos = self.eval_movement(kill_movement);
let new_cursor = self.eval_movement(move_movement);
let (lower, upper) = if kill_pos < self.cursor {
(kill_pos, self.cursor)
} else {
(self.cursor, kill_pos)
};
self.line.replace_range(lower..upper, "");
// Clamp to the line length, otherwise a kill to end of line
// command will leave the cursor way off beyond the end of
// the line.
self.cursor = new_cursor.min(self.line.len());
self.line.kill_text(kill_movement, move_movement);
}
fn clear_completion(&mut self) {
@ -642,8 +525,7 @@ impl<'term> LineEditor<'term> {
..
} = &self.state
{
self.line = matching_line.to_string();
self.cursor = *cursor;
self.line.set_line_and_cursor(matching_line, *cursor);
self.state = EditorState::Editing;
}
}
@ -653,23 +535,17 @@ impl<'term> LineEditor<'term> {
/// a custom editor operation on the line buffer contents.
/// The cursor position is the byte index into the line UTF-8 bytes.
pub fn get_line_and_cursor(&mut self) -> (&str, usize) {
(&self.line, self.cursor)
(self.line.get_line(), self.line.get_cursor())
}
/// Sets the current line and cursor position.
/// You don't normally need to call this unless you are defining
/// a custom editor operation on the line buffer contents.
/// The cursor position is the byte index into the line UTF-8 bytes.
/// Panics: the cursor must be within the bounds of the provided line.
/// Panics: the cursor must be the first byte in a UTF-8 code point
/// sequence or the end of the provided line.
pub fn set_line_and_cursor(&mut self, line: &str, cursor: usize) {
assert!(
cursor < line.len(),
"cursor {} is outside the byte length of the new line of length {}",
cursor,
line.len()
);
self.line = line.to_string();
self.cursor = cursor;
self.line.set_line_and_cursor(line, cursor);
}
/// Call this after changing modifying the line buffer.
@ -698,9 +574,9 @@ impl<'term> LineEditor<'term> {
let last_matching_line;
let last_cursor;
if let Some(result) = host
.history()
.search(history_pos, *style, *direction, &self.line)
if let Some(result) =
host.history()
.search(history_pos, *style, *direction, self.line.get_line())
{
self.history_pos.replace(result.idx);
last_matching_line = result.line.to_string();
@ -733,7 +609,6 @@ impl<'term> LineEditor<'term> {
// Not yet searching, so we start a new search
// with an empty pattern
self.line.clear();
self.cursor = 0;
self.history_pos.take();
}
@ -752,9 +627,9 @@ impl<'term> LineEditor<'term> {
},
};
let search_result = host
.history()
.search(history_pos, style, direction, &self.line);
let search_result =
host.history()
.search(history_pos, style, direction, self.line.get_line());
let last_matching_line;
let last_cursor;
@ -836,25 +711,20 @@ impl<'term> LineEditor<'term> {
Action::Move(movement) => {
self.clear_completion();
self.cancel_search_state();
self.cursor = self.eval_movement(movement);
self.line.exec_movement(movement);
}
Action::InsertChar(rep, c) => {
self.clear_completion();
for _ in 0..rep {
self.line.insert(self.cursor, c);
let mut cursor = GraphemeCursor::new(self.cursor, self.line.len(), false);
if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) {
self.cursor = pos;
}
self.line.insert_char(c);
}
self.reapply_search_pattern(host);
}
Action::InsertText(rep, text) => {
self.clear_completion();
for _ in 0..rep {
self.line.insert_str(self.cursor, &text);
self.cursor += text.len();
self.line.insert_text(&text);
}
self.reapply_search_pattern(host);
}
@ -870,18 +740,16 @@ impl<'term> LineEditor<'term> {
let prior_idx = cur_pos.saturating_sub(1);
if let Some(prior) = host.history().get(prior_idx) {
self.history_pos = Some(prior_idx);
self.line = prior.to_string();
self.cursor = self.line.len();
self.line.set_line_and_cursor(&prior, prior.len());
}
} else if let Some(last) = host.history().last() {
self.bottom_line = Some(self.line.clone());
self.bottom_line = Some(self.line.get_line().to_string());
self.history_pos = Some(last);
self.line = host
let line = host
.history()
.get(last)
.expect("History::last and History::get to be consistent")
.to_string();
self.cursor = self.line.len();
.expect("History::last and History::get to be consistent");
self.line.set_line_and_cursor(&line, line.len())
}
}
Action::HistoryNext => {
@ -892,14 +760,11 @@ impl<'term> LineEditor<'term> {
let next_idx = cur_pos.saturating_add(1);
if let Some(next) = host.history().get(next_idx) {
self.history_pos = Some(next_idx);
self.line = next.to_string();
self.cursor = self.line.len();
self.line.set_line_and_cursor(&next, next.len());
} else if let Some(bottom) = self.bottom_line.take() {
self.line = bottom;
self.cursor = self.line.len();
self.line.set_line_and_cursor(&bottom, bottom.len());
} else {
self.line.clear();
self.cursor = 0;
}
}
}
@ -915,18 +780,17 @@ impl<'term> LineEditor<'term> {
self.cancel_search_state();
if self.completion.is_none() {
let candidates = host.complete(&self.line, self.cursor);
let candidates = host.complete(self.line.get_line(), self.line.get_cursor());
if !candidates.is_empty() {
let state = CompletionState {
candidates,
index: 0,
original_line: self.line.clone(),
original_cursor: self.cursor,
original_line: self.line.get_line().to_string(),
original_cursor: self.line.get_cursor(),
};
let (cursor, line) = state.current();
self.cursor = cursor;
self.line = line;
self.line.set_line_and_cursor(&line, cursor);
// If there is only a single completion then don't
// leave us in a state where we just cycle on the
@ -938,8 +802,7 @@ impl<'term> LineEditor<'term> {
} else if let Some(state) = self.completion.as_mut() {
state.next();
let (cursor, line) = state.current();
self.cursor = cursor;
self.line = line;
self.line.set_line_and_cursor(&line, cursor);
}
}
}
@ -949,7 +812,6 @@ impl<'term> LineEditor<'term> {
fn read_line_impl(&mut self, host: &mut dyn LineEditorHost) -> Result<Option<String>> {
self.line.clear();
self.cursor = 0;
self.history_pos = None;
self.bottom_line = None;
self.clear_completion();
@ -964,14 +826,14 @@ impl<'term> LineEditor<'term> {
match self.state {
EditorState::Searching { .. } | EditorState::Editing => {}
EditorState::Cancelled => return Ok(None),
EditorState::Accepted => return Ok(Some(self.line.clone())),
EditorState::Accepted => return Ok(Some(self.line.get_line().to_string())),
EditorState::Inactive => bail!("editor is inactive during read line!?"),
}
} else {
self.render(host)?;
}
}
Ok(Some(self.line.clone()))
Ok(Some(self.line.get_line().to_string()))
}
}

View File

@ -1,4 +1,5 @@
use crate::ContentId;
use std::path::PathBuf;
use thiserror::Error;
#[derive(Error, Debug)]
@ -17,4 +18,7 @@ pub enum Error {
#[error("Storage has not been initialized")]
StorageNotInit,
#[error("Storage location {0} may be corrupt: {1}")]
StorageDirIoError(PathBuf, std::io::Error),
}

View File

@ -4,7 +4,7 @@ use crate::{BlobStorage, BoxedReader, BufSeekRead, ContentId, Error, LeaseId};
use std::collections::HashMap;
use std::fs::File;
use std::io::{BufReader, Write};
use std::path::PathBuf;
use std::path::{Path, PathBuf};
use std::sync::Mutex;
use tempfile::TempDir;
@ -25,9 +25,23 @@ impl SimpleTempDir {
})
}
pub fn new_in<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
let path = path.as_ref();
std::fs::create_dir_all(path)?;
let root = tempfile::Builder::new()
.prefix("wezterm-blob-lease-")
.rand_bytes(8)
.tempdir_in(path)?;
Ok(Self {
root,
refs: Mutex::new(HashMap::new()),
})
}
fn path_for_content(&self, content_id: ContentId) -> Result<PathBuf, Error> {
let path = self.root.path().join(format!("{content_id}"));
std::fs::create_dir_all(path.parent().unwrap())?;
std::fs::create_dir_all(path.parent().unwrap())
.map_err(|err| Error::StorageDirIoError(path.clone(), err))?;
Ok(path)
}
@ -91,7 +105,7 @@ impl BlobStorage for SimpleTempDir {
let _refs = self.refs.lock().unwrap();
let path = self.path_for_content(content_id)?;
Ok(std::fs::read(&path)?)
Ok(std::fs::read(&path).map_err(|err| Error::StorageDirIoError(path, err))?)
}
fn get_reader(&self, content_id: ContentId, lease_id: LeaseId) -> Result<BoxedReader, Error> {

View File

@ -20,7 +20,7 @@ lazy_static = "1.4"
log = "0.4"
libc = "0.2"
lru = "0.12"
metrics = "0.22"
metrics = "0.23"
mux = { path = "../mux" }
openssl = "0.10.57"
parking_lot = "0.12"

View File

@ -28,7 +28,7 @@ lazy_static = "1.4"
lfucache = { path = "../lfucache" }
log = "0.4"
memmap2 = "0.9"
metrics = "0.22"
metrics = "0.23"
ordered-float = "4.1"
rangeset = { path = "../rangeset" }
termwiz = { path = "../termwiz" }

View File

@ -507,6 +507,7 @@ pub enum PaintOp {
},
PopTransform,
PushGlyphClip {
#[allow(unused)]
glyph: hb_codepoint_t,
draw: Vec<DrawOp>,
},
@ -518,12 +519,15 @@ pub enum PaintOp {
},
PopClip,
PaintSolid {
#[allow(unused)]
is_foreground: bool,
color: hb_color_t,
},
PaintImage {
image: Blob,
#[allow(unused)]
width: u32,
#[allow(unused)]
height: u32,
format: hb_tag_t,
slant: f32,

View File

@ -243,7 +243,7 @@ fn record_to_cairo_surface(paint_ops: Vec<PaintOp>) -> anyhow::Result<(Recording
extents,
} => {
let image_surface = if format == IS_PNG {
let decoded = image::io::Reader::new(std::io::Cursor::new(image.as_slice()))
let decoded = image::ImageReader::new(std::io::Cursor::new(image.as_slice()))
.with_guessed_format()?
.decode()?;

View File

@ -53,16 +53,16 @@ filedescriptor = { version="0.8", path = "../filedescriptor" }
finl_unicode = "1.2"
frecency = { path = "../frecency" }
futures = "0.3"
fuzzy-matcher = "0.3"
nucleo-matcher = "0.3"
hdrhistogram = "7.1"
http_req = "0.10"
http_req = "0.11"
image = "0.25"
lazy_static = "1.4"
libc = "0.2"
lfucache = { path = "../lfucache" }
log = "0.4"
luahelper = { path = "../luahelper" }
metrics = "0.22"
metrics = "0.23"
mlua = {version="0.9", features=["send"]}
mux = { path = "../mux" }
mux-lua = { path = "../lua-api-crates/mux" }

View File

@ -168,7 +168,10 @@ END
.join("WezTerm.app")
.join("Contents")
.join("Info.plist");
let dest_plist = repo_dir.join("target").join(profile).join("Info.plist");
let build_target_dir = std::env::var("CARGO_TARGET_DIR")
.and_then(|s| Ok(std::path::PathBuf::from(s)))
.unwrap_or(repo_dir.join("target").join(profile));
let dest_plist = build_target_dir.join("Info.plist");
println!("cargo:rerun-if-changed=assets/macos/WezTerm.app/Contents/Info.plist");
std::fs::copy(&src_plist, &dest_plist)

View File

@ -9,9 +9,8 @@ use ::window::{Point, Rect};
use anyhow::Context;
use config::{AllowSquareGlyphOverflow, TextStyle};
use euclid::num::Zero;
use image::io::Limits;
use image::{
AnimationDecoder, DynamicImage, Frame, Frames, ImageDecoder, ImageFormat, ImageResult,
AnimationDecoder, DynamicImage, Frame, Frames, ImageDecoder, ImageFormat, ImageResult, Limits,
};
use lfucache::LfuCache;
use once_cell::sync::Lazy;
@ -20,6 +19,7 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::io::Seek;
use std::rc::Rc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::mpsc::{sync_channel, Receiver, RecvTimeoutError, SyncSender, TryRecvError};
use std::sync::{Arc, MutexGuard};
use std::time::{Duration, Instant};
@ -31,6 +31,20 @@ use wezterm_font::units::*;
use wezterm_font::{FontConfiguration, GlyphInfo, LoadedFont, LoadedFontId};
use wezterm_term::Underline;
static FRAME_ERROR_REPORTED: AtomicBool = AtomicBool::new(false);
/// We only want to report a frame error once at error level, because
/// if it is triggering it is likely in a animated image and will continue
/// to trigger multiple times per second as the frames are cycled.
fn report_frame_error<S: Into<String>>(message: S) {
if FRAME_ERROR_REPORTED.load(Ordering::Relaxed) {
log::debug!("{}", message.into());
} else {
log::error!("{}", message.into());
FRAME_ERROR_REPORTED.store(true, Ordering::Relaxed);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LoadState {
Loading,
@ -224,7 +238,7 @@ impl FrameDecoder {
let (tx, rx) = sync_channel(2);
let buf_reader = lease.get_reader().context("lease.get_reader()")?;
let reader = image::io::Reader::new(buf_reader)
let reader = image::ImageReader::new(buf_reader)
.with_guessed_format()
.context("guess format from lease")?;
let format = reader
@ -246,7 +260,7 @@ impl FrameDecoder {
}
fn run_decoder_thread(
reader: image::io::Reader<BoxedReader>,
reader: image::ImageReader<BoxedReader>,
format: ImageFormat,
tx: SyncSender<DecodedFrame>,
) -> anyhow::Result<()> {
@ -1025,14 +1039,35 @@ impl GlyphCache {
return Ok((sprite.clone(), next, frames.load_state));
}
let expected_byte_size =
frames.current_frame.width * frames.current_frame.height * 4;
let frame_data = match frames.current_frame.lease.get_data() {
Ok(data) => {
// If the size isn't right, ignore this frame and replace
// it with a blank one instead. This might happen if
// some process is truncating the files, or perhaps if
// the disk is full.
// We need to check for this because the consequence of
// a mismatched size is a panic in a layer where we
// cannot handle the error case.
if data.len() != expected_byte_size {
report_frame_error(format!("frame data is corrupted: expected size {expected_byte_size} but have {}", data.len()));
vec![0u8; expected_byte_size]
} else {
data
}
}
Err(err) => {
report_frame_error(format!("frame data error: {err:#}"));
vec![0u8; expected_byte_size]
}
};
let frame = Image::from_raw(
frames.current_frame.width,
frames.current_frame.height,
frames
.current_frame
.lease
.get_data()
.context("frames.current_frame.lease.get_data")?,
frame_data,
);
let sprite = atlas.allocate_with_padding(&frame, padding, scale_down)?;

View File

@ -414,9 +414,8 @@ async fn async_run_terminal_gui(
config::RUNTIME_DIR.join(format!("gui-sock-{}", unsafe { libc::getpid() }));
std::env::set_var("WEZTERM_UNIX_SOCKET", unix_socket_path.clone());
wezterm_blob_leases::register_storage(Arc::new(
wezterm_blob_leases::simple_tempdir::SimpleTempDir::new()?,
wezterm_blob_leases::simple_tempdir::SimpleTempDir::new_in(&*config::CACHE_DIR)?,
))?;
if let Err(err) = spawn_mux_server(unix_socket_path, should_publish) {
log::warn!("{:#}", err);
}

View File

@ -7,13 +7,13 @@ use config::keyassignment::{
};
use mux::domain::DomainId;
use mux::pane::{
CachePolicy, ForEachPaneLogicalLine, LogicalLine, Pane, PaneId, Pattern,
CachePolicy, ForEachPaneLogicalLine, LogicalLine, Pane, PaneId, Pattern, PatternType,
PerformAssignmentResult, SearchResult, WithPaneLines,
};
use mux::renderable::*;
use mux::tab::TabId;
use ordered_float::NotNan;
use parking_lot::{MappedMutexGuard, Mutex};
use parking_lot::{MappedMutexGuard, Mutex, MutexGuard};
use rangeset::RangeSet;
use std::collections::HashMap;
use std::ops::Range;
@ -21,6 +21,7 @@ use std::sync::Arc;
use std::time::Duration;
use termwiz::cell::{Cell, CellAttributes};
use termwiz::color::AnsiColor;
use termwiz::lineedit::{LineEditBuffer, Movement};
use termwiz::surface::{CursorVisibility, SequenceNo, SEQ_ZERO};
use unicode_segmentation::*;
use url::Url;
@ -39,7 +40,8 @@ const SEARCH_CHUNK_SIZE: StableRowIndex = 1000;
pub struct CopyOverlay {
delegate: Arc<dyn Pane>,
render: Mutex<CopyRenderable>,
render: Arc<Mutex<CopyRenderable>>,
writer: Mutex<SearchOverlayPatternWriter>,
}
#[derive(Copy, Clone, Debug)]
@ -65,7 +67,8 @@ struct CopyRenderable {
window: ::window::Window,
/// The text that the user entered
pattern: Pattern,
pattern_type: PatternType,
search_line: LineEditBuffer,
/// The most recently queried set of matches
results: Vec<SearchResult>,
by_line: HashMap<StableRowIndex, Vec<MatchResult>>,
@ -125,6 +128,17 @@ impl CopyOverlay {
.clone()
.ok_or_else(|| anyhow::anyhow!("failed to clone window handle"))?;
let dims = pane.get_dimensions();
let pattern = if params.pattern.is_empty() {
SAVED_PATTERN
.lock()
.get(&tab_id)
.map(|p| p.clone())
.unwrap_or(params.pattern)
} else {
params.pattern
};
let search_line = LineEditBuffer::new(&pattern, pattern.len());
let mut render = CopyRenderable {
cursor,
window,
@ -139,15 +153,8 @@ impl CopyOverlay {
last_result_seqno: SEQ_ZERO,
last_bar_pos: None,
tab_id,
pattern: if params.pattern.is_empty() {
SAVED_PATTERN
.lock()
.get(&tab_id)
.map(|p| p.clone())
.unwrap_or(params.pattern)
} else {
params.pattern
},
pattern_type: PatternType::from(&pattern),
search_line,
editing_search: params.editing_search,
result_pos: None,
selection_mode: SelectionMode::Cell,
@ -161,16 +168,22 @@ impl CopyOverlay {
render.dirty_results.add(search_row);
render.update_search();
let shared_render = Arc::new(Mutex::new(render));
let writer = SearchOverlayPatternWriter {
render: Arc::clone(&shared_render),
};
Ok(Arc::new(CopyOverlay {
delegate: Arc::clone(pane),
render: Mutex::new(render),
render: shared_render,
writer: Mutex::new(writer),
}))
}
pub fn get_params(&self) -> CopyModeParams {
let render = self.render.lock();
CopyModeParams {
pattern: render.pattern.clone(),
pattern: render.get_pattern(),
editing_search: render.editing_search,
}
}
@ -178,8 +191,11 @@ impl CopyOverlay {
pub fn apply_params(&self, params: CopyModeParams) {
let mut render = self.render.lock();
render.editing_search = params.editing_search;
if render.pattern != params.pattern {
render.pattern = params.pattern;
if render.get_pattern() != params.pattern {
render.pattern_type = PatternType::from(&params.pattern);
render
.search_line
.set_line_and_cursor(&params.pattern, params.pattern.len());
render.schedule_update_search();
}
let search_row = render.compute_search_row();
@ -293,18 +309,16 @@ impl CopyRenderable {
self.by_line.clear();
self.result_pos.take();
SAVED_PATTERN
.lock()
.insert(self.tab_id, self.pattern.clone());
SAVED_PATTERN.lock().insert(self.tab_id, self.get_pattern());
let bar_pos = self.compute_search_row();
self.dirty_results.add(bar_pos);
self.last_result_seqno = self.delegate.get_current_seqno();
if !self.pattern.is_empty() {
let pattern = self.get_pattern();
if !pattern.is_empty() {
let pane: Arc<dyn Pane> = self.delegate.clone();
let window = self.window.clone();
let pattern = self.pattern.clone();
let dims = pane.get_dimensions();
let end = dims.scrollback_top + dims.scrollback_rows as StableRowIndex;
@ -350,7 +364,7 @@ impl CopyRenderable {
range: Range<StableRowIndex>,
) {
self.window.invalidate();
if pattern != self.pattern {
if pattern != self.get_pattern() {
return;
}
let is_first = self.results.is_empty();
@ -557,7 +571,6 @@ impl CopyRenderable {
}
fn close(&self) {
self.set_viewport(None);
TermWindow::schedule_cancel_overlay_for_pane(self.window.clone(), self.delegate.pane_id());
}
@ -627,8 +640,17 @@ impl CopyRenderable {
}
}
fn get_pattern(&self) -> Pattern {
let pattern = self.search_line.get_line().to_string();
match self.pattern_type {
PatternType::CaseSensitiveString => Pattern::CaseSensitiveString(pattern),
PatternType::CaseInSensitiveString => Pattern::CaseInSensitiveString(pattern),
PatternType::Regex => Pattern::Regex(pattern),
}
}
fn clear_pattern(&mut self) {
self.pattern.clear();
self.search_line.clear();
self.update_search();
}
@ -670,12 +692,12 @@ impl CopyRenderable {
}
fn cycle_match_type(&mut self) {
let pattern = match &self.pattern {
Pattern::CaseSensitiveString(s) => Pattern::CaseInSensitiveString(s.clone()),
Pattern::CaseInSensitiveString(s) => Pattern::Regex(s.clone()),
Pattern::Regex(s) => Pattern::CaseSensitiveString(s.clone()),
let pattern_type = match &self.pattern_type {
PatternType::CaseSensitiveString => PatternType::CaseInSensitiveString,
PatternType::CaseInSensitiveString => PatternType::Regex,
PatternType::Regex => PatternType::CaseSensitiveString,
};
self.pattern = pattern;
self.pattern_type = pattern_type;
self.schedule_update_search();
}
@ -1090,7 +1112,7 @@ impl Pane for CopyOverlay {
fn send_paste(&self, text: &str) -> anyhow::Result<()> {
// paste into the search bar
let mut r = self.render.lock();
r.pattern.push_str(text);
r.search_line.insert_text(text);
r.schedule_update_search();
Ok(())
}
@ -1100,7 +1122,10 @@ impl Pane for CopyOverlay {
}
fn writer(&self) -> MappedMutexGuard<dyn std::io::Write> {
self.delegate.writer()
MutexGuard::map(self.writer.lock(), |writer| {
let w: &mut dyn std::io::Write = writer;
w
})
}
fn resize(&self, size: TerminalSize) -> anyhow::Result<()> {
@ -1141,14 +1166,71 @@ impl Pane for CopyOverlay {
(KeyCode::Char(c), KeyModifiers::NONE)
| (KeyCode::Char(c), KeyModifiers::SHIFT) => {
// Type to add to the pattern
render.pattern.push(c);
render.search_line.insert_char(c);
render.schedule_update_search();
}
(KeyCode::Backspace, KeyModifiers::NONE) => {
// Backspace to edit the pattern
render.pattern.pop();
(KeyCode::Char('H'), KeyModifiers::CTRL)
| (KeyCode::Backspace, KeyModifiers::NONE) => {
render
.search_line
.kill_text(Movement::BackwardChar(1), Movement::BackwardChar(1));
render.schedule_update_search();
}
(KeyCode::Delete, KeyModifiers::NONE) => {
render
.search_line
.kill_text(Movement::ForwardChar(1), Movement::None);
render.schedule_update_search();
}
(KeyCode::Backspace, KeyModifiers::ALT)
| (KeyCode::Char('W'), KeyModifiers::CTRL) => {
render
.search_line
.kill_text(Movement::BackwardWord(1), Movement::BackwardWord(1));
render.schedule_update_search();
}
(KeyCode::Backspace, KeyModifiers::SUPER) => {
render
.search_line
.kill_text(Movement::StartOfLine, Movement::StartOfLine);
render.schedule_update_search();
}
(KeyCode::Char('K'), KeyModifiers::CTRL) => {
render
.search_line
.kill_text(Movement::EndOfLine, Movement::EndOfLine);
render.schedule_update_search();
}
(KeyCode::Char('B'), KeyModifiers::CTRL)
| (KeyCode::ApplicationLeftArrow, KeyModifiers::NONE)
| (KeyCode::LeftArrow, KeyModifiers::NONE) => {
render.search_line.exec_movement(Movement::BackwardChar(1));
}
(KeyCode::Char('F'), KeyModifiers::CTRL)
| (KeyCode::ApplicationRightArrow, KeyModifiers::NONE)
| (KeyCode::RightArrow, KeyModifiers::NONE) => {
render.search_line.exec_movement(Movement::ForwardChar(1));
}
(KeyCode::ApplicationLeftArrow, KeyModifiers::CTRL)
| (KeyCode::LeftArrow, KeyModifiers::CTRL) => {
render.search_line.exec_movement(Movement::BackwardWord(1));
}
(KeyCode::ApplicationRightArrow, KeyModifiers::CTRL)
| (KeyCode::RightArrow, KeyModifiers::CTRL) => {
render.search_line.exec_movement(Movement::ForwardWord(1));
}
(KeyCode::Char('A'), KeyModifiers::CTRL) | (KeyCode::Home, KeyModifiers::NONE) => {
render.search_line.exec_movement(Movement::StartOfLine);
}
(KeyCode::Char('E'), KeyModifiers::CTRL) | (KeyCode::End, KeyModifiers::NONE) => {
render.search_line.exec_movement(Movement::EndOfLine);
}
_ => {}
}
}
@ -1259,8 +1341,14 @@ impl Pane for CopyOverlay {
let renderer = self.render.lock();
if renderer.editing_search {
// place in the search box
// Padding between the start of the editable line and the left side of the terminal
const SEARCH_CURSOR_PADDING: usize = 8;
let cursor = unicode_column_width(
&renderer.search_line.get_line()[0..renderer.search_line.get_cursor()],
None,
);
StableCursorPosition {
x: 8 + wezterm_term::unicode_column_width(&renderer.pattern, None),
x: SEARCH_CURSOR_PADDING + cursor,
y: renderer.compute_search_row(),
shape: termwiz::surface::CursorShape::SteadyBlock,
visibility: termwiz::surface::CursorVisibility::Visible,
@ -1335,13 +1423,14 @@ impl Pane for CopyOverlay {
let stable_idx = idx as StableRowIndex + first_row;
self.renderer.dirty_results.remove(stable_idx);
let pattern = self.renderer.get_pattern();
if stable_idx == self.search_row
&& (self.renderer.editing_search || !self.renderer.pattern.is_empty())
&& (self.renderer.editing_search || !pattern.is_empty())
{
// Replace with search UI
let rev = CellAttributes::default().set_reverse(true).clone();
line.fill_range(0..self.dims.cols, &Cell::new(' ', rev.clone()), SEQ_ZERO);
let mode = &match self.renderer.pattern {
let mode = &match pattern {
Pattern::CaseSensitiveString(_) => "case-sensitive",
Pattern::CaseInSensitiveString(_) => "ignore-case",
Pattern::Regex(_) => "regex",
@ -1358,7 +1447,7 @@ impl Pane for CopyOverlay {
0,
&format!(
"Search: {} ({}/{} matches. {}{remain})",
*self.renderer.pattern,
*pattern,
self.renderer.result_pos.map(|x| x + 1).unwrap_or(0),
self.renderer.results.len(),
mode
@ -1437,12 +1526,12 @@ impl Pane for CopyOverlay {
for (idx, line) in lines.iter_mut().enumerate() {
let stable_idx = idx as StableRowIndex + top;
renderer.dirty_results.remove(stable_idx);
if stable_idx == search_row && (renderer.editing_search || !renderer.pattern.is_empty())
{
let pattern = renderer.get_pattern();
if stable_idx == search_row && (renderer.editing_search || !pattern.is_empty()) {
// Replace with search UI
let rev = CellAttributes::default().set_reverse(true).clone();
line.fill_range(0..dims.cols, &Cell::new(' ', rev.clone()), SEQ_ZERO);
let mode = &match renderer.pattern {
let mode = &match pattern {
Pattern::CaseSensitiveString(_) => "case-sensitive",
Pattern::CaseInSensitiveString(_) => "ignore-case",
Pattern::Regex(_) => "regex",
@ -1451,7 +1540,7 @@ impl Pane for CopyOverlay {
0,
&format!(
"Search: {} ({}/{} matches. {})",
*renderer.pattern,
*pattern,
renderer.result_pos.map(|x| x + 1).unwrap_or(0),
renderer.results.len(),
mode
@ -1507,6 +1596,26 @@ impl Pane for CopyOverlay {
}
}
pub struct SearchOverlayPatternWriter {
render: Arc<Mutex<CopyRenderable>>,
}
impl std::io::Write for SearchOverlayPatternWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
let mut render = self.render.lock();
let s = std::str::from_utf8(buf).map_err(|err| {
std::io::Error::new(std::io::ErrorKind::Other, format!("invalid UTF-8: {err:#}"))
})?;
render.search_line.insert_text(s);
render.schedule_update_search();
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}
fn is_whitespace_word(word: &str) -> bool {
if let Some(c) = word.chars().next() {
c.is_whitespace()
@ -1574,28 +1683,35 @@ pub fn search_key_table() -> KeyTable {
table
}
fn scroll_to_bottom_and_close() -> KeyAssignment {
KeyAssignment::Multiple(vec![
KeyAssignment::ScrollToBottom,
KeyAssignment::CopyMode(CopyModeAssignment::Close),
])
}
pub fn copy_key_table() -> KeyTable {
let mut table = KeyTable::default();
for (key, mods, action) in [
(
WKeyCode::Char('c'),
Modifiers::CTRL,
KeyAssignment::CopyMode(CopyModeAssignment::Close),
scroll_to_bottom_and_close(),
),
(
WKeyCode::Char('g'),
Modifiers::CTRL,
KeyAssignment::CopyMode(CopyModeAssignment::Close),
scroll_to_bottom_and_close(),
),
(
WKeyCode::Char('q'),
Modifiers::NONE,
KeyAssignment::CopyMode(CopyModeAssignment::Close),
scroll_to_bottom_and_close(),
),
(
WKeyCode::Char('\x1b'),
Modifiers::NONE,
KeyAssignment::CopyMode(CopyModeAssignment::Close),
scroll_to_bottom_and_close(),
),
(
WKeyCode::Char('h'),
@ -1847,7 +1963,7 @@ pub fn copy_key_table() -> KeyTable {
Modifiers::NONE,
KeyAssignment::Multiple(vec![
KeyAssignment::CopyTo(ClipboardCopyDestination::ClipboardAndPrimarySelection),
KeyAssignment::CopyMode(CopyModeAssignment::Close),
scroll_to_bottom_and_close(),
]),
),
(

View File

@ -7,17 +7,16 @@
//! menus.
use crate::commands::derive_command_from_key_assignment;
use crate::inputmap::InputMap;
use crate::overlay::selector::{matcher_pattern, matcher_score};
use crate::termwindow::TermWindowNotif;
use config::configuration;
use config::keyassignment::{KeyAssignment, SpawnCommand, SpawnTabDomain};
use fuzzy_matcher::skim::SkimMatcherV2;
use fuzzy_matcher::FuzzyMatcher;
use mux::domain::{DomainId, DomainState};
use mux::pane::PaneId;
use mux::tab::TabId;
use mux::termwiztermtab::TermWizTerminal;
use mux::window::WindowId;
use mux::Mux;
use rayon::prelude::*;
use std::collections::BTreeMap;
use termwiz::cell::{AttributeChange, CellAttributes};
use termwiz::color::ColorAttribute;
@ -37,7 +36,6 @@ struct Entry {
pub struct LauncherTabEntry {
pub title: String,
pub tab_id: TabId,
pub tab_idx: usize,
pub pane_count: Option<usize>,
}
@ -102,7 +100,6 @@ impl LauncherArgs {
};
LauncherTabEntry {
title,
tab_id: tab.tab_id(),
tab_idx,
pane_count: tab.count_panes(),
}
@ -186,19 +183,19 @@ impl LauncherState {
self.filtered_entries.clear();
let matcher = SkimMatcherV2::default();
let pattern = matcher_pattern(&self.filter_term);
struct MatchResult {
row_idx: usize,
score: i64,
score: u32,
}
let mut scores: Vec<MatchResult> = self
.entries
.iter()
.par_iter()
.enumerate()
.filter_map(|(row_idx, entry)| {
let score = matcher.fuzzy_match(&entry.label, &self.filter_term)?;
let score = matcher_score(&pattern, &entry.label)?;
Some(MatchResult { row_idx, score })
})
.collect();

View File

@ -27,7 +27,7 @@ const PATTERNS: [&str; 14] = [
// markdown_url
r"\[[^]]*\]\(([^)]+)\)",
// url
r"(?:https?://|git@|git://|ssh://|ftp://|file:///)\S+",
r"(?:https?://|git@|git://|ssh://|ftp://|file://)\S+",
// diff_a
r"--- a/(\S+)",
// diff_b
@ -35,7 +35,7 @@ const PATTERNS: [&str; 14] = [
// docker
r"sha256:([0-9a-f]{64})",
// path
r"(?:[.\w\-@~]+)?(?:/[.\w\-@]+)+",
r"(?:[.\w\-@~]+)?(?:/+[.\w\-@]+)+",
// color
r"#[0-9a-fA-F]{6}",
// uuid

View File

@ -1,10 +1,12 @@
use super::quickselect;
use crate::scripting::guiwin::GuiWin;
use config::keyassignment::{InputSelector, InputSelectorEntry, KeyAssignment};
use fuzzy_matcher::skim::SkimMatcherV2;
use fuzzy_matcher::FuzzyMatcher;
use mux::termwiztermtab::TermWizTerminal;
use mux_lua::MuxPane;
use nucleo_matcher::pattern::Pattern;
use nucleo_matcher::{Matcher, Utf32Str};
use rayon::prelude::*;
use std::cell::RefCell;
use std::rc::Rc;
use termwiz::cell::{AttributeChange, CellAttributes};
use termwiz::color::ColorAttribute;
@ -15,6 +17,25 @@ use termwiz_funcs::truncate_right;
const ROW_OVERHEAD: usize = 3;
thread_local! {
pub static MATCHER: RefCell<Matcher> = RefCell::new(Matcher::new(nucleo_matcher::Config::DEFAULT));
}
pub fn matcher_score(pattern: &Pattern, s: &str) -> Option<u32> {
MATCHER.with_borrow_mut(|matcher| {
let mut buf = vec![];
pattern.score(Utf32Str::new(s, &mut buf), matcher)
})
}
pub fn matcher_pattern(s: &str) -> Pattern {
nucleo_matcher::pattern::Pattern::parse(
s,
nucleo_matcher::pattern::CaseMatching::Ignore,
nucleo_matcher::pattern::Normalization::Smart,
)
}
struct SelectorState {
active_idx: usize,
max_items: usize,
@ -40,20 +61,20 @@ impl SelectorState {
self.filtered_entries.clear();
let matcher = SkimMatcherV2::default();
struct MatchResult {
row_idx: usize,
score: i64,
score: u32,
}
let pattern = matcher_pattern(&self.filter_term);
let mut scores: Vec<MatchResult> = self
.args
.choices
.iter()
.par_iter()
.enumerate()
.filter_map(|(row_idx, entry)| {
let score = matcher.fuzzy_match(&entry.label, &self.filter_term)?;
let score = matcher_score(&pattern, &entry.label)?;
Some(MatchResult { row_idx, score })
})
.collect();

View File

@ -1,3 +1,4 @@
use crate::overlay::selector::{matcher_pattern, matcher_score};
use crate::termwindow::box_model::*;
use crate::termwindow::modal::Modal;
use crate::termwindow::render::corners::{
@ -13,8 +14,6 @@ use config::keyassignment::{
use config::Dimension;
use emojis::{Emoji, Group};
use frecency::Frecency;
use fuzzy_matcher::skim::SkimMatcherV2;
use fuzzy_matcher::FuzzyMatcher;
use rayon::prelude::*;
use serde::{Deserialize, Serialize};
use std::borrow::Cow;
@ -244,18 +243,18 @@ fn build_aliases() -> Vec<Alias> {
#[derive(Debug, Copy, Clone)]
struct MatchResult {
row_idx: usize,
score: i64,
score: u32,
}
impl MatchResult {
fn new(row_idx: usize, score: i64, selection: &str, aliases: &[Alias]) -> Self {
fn new(row_idx: usize, score: u32, selection: &str, aliases: &[Alias]) -> Self {
Self {
row_idx,
score: if aliases[row_idx].name == selection {
// Pump up the score for an exact match, otherwise
// the order may be undesirable if there are a lot
// of candidates with the same score
i64::max_value()
u32::max_value()
} else {
score
},
@ -272,7 +271,7 @@ fn compute_matches(selection: &str, aliases: &[Alias], group: CharSelectGroup) -
.map(|(idx, _a)| idx)
.collect()
} else {
let matcher = SkimMatcherV2::default();
let pattern = matcher_pattern(selection);
let numeric_selection = if selection.chars().all(|c| c.is_ascii_hexdigit()) {
// Make this uppercase so that eg: `e1` matches `U+E1` rather
@ -285,14 +284,16 @@ fn compute_matches(selection: &str, aliases: &[Alias], group: CharSelectGroup) -
None
};
let start = std::time::Instant::now();
let all_matches: Vec<(String, MatchResult)> = aliases
.par_iter()
.enumerate()
.filter_map(|(row_idx, entry)| {
let glyph = entry.glyph();
let alias_result = matcher
.fuzzy_match(&entry.name, selection)
let alias_result = matcher_score(&pattern, &entry.name)
.map(|score| MatchResult::new(row_idx, score, selection, aliases));
match &numeric_selection {
Some(sel) => {
let codepoints = entry.codepoints();
@ -301,13 +302,12 @@ fn compute_matches(selection: &str, aliases: &[Alias], group: CharSelectGroup) -
glyph,
MatchResult {
row_idx,
score: i64::max_value(),
score: u32::max_value(),
},
))
} else {
let number_result = matcher
.fuzzy_match(&codepoints, &sel)
.map(|score| MatchResult::new(row_idx, score, sel, aliases));
let number_result = matcher_score(&pattern, &codepoints)
.map(|score| MatchResult::new(row_idx, score, selection, aliases));
match (alias_result, number_result) {
(

View File

@ -283,7 +283,7 @@ impl UserData for PaneInformation {
fields.add_field_method_get("width", |_, this| Ok(this.width));
fields.add_field_method_get("height", |_, this| Ok(this.height));
fields.add_field_method_get("pixel_width", |_, this| Ok(this.pixel_width));
fields.add_field_method_get("pixel_height", |_, this| Ok(this.pixel_width));
fields.add_field_method_get("pixel_height", |_, this| Ok(this.pixel_height));
fields.add_field_method_get("title", |_, this| Ok(this.title.clone()));
fields.add_field_method_get("user_vars", |_, this| Ok(this.user_vars.clone()));
fields.add_field_method_get("foreground_process_name", |_, this| {

View File

@ -1,4 +1,5 @@
use crate::commands::{CommandDef, ExpandedCommand};
use crate::overlay::selector::{matcher_pattern, matcher_score};
use crate::termwindow::box_model::*;
use crate::termwindow::modal::Modal;
use crate::termwindow::render::corners::{
@ -10,10 +11,9 @@ use crate::utilsprites::RenderMetrics;
use config::keyassignment::KeyAssignment;
use config::Dimension;
use frecency::Frecency;
use fuzzy_matcher::skim::SkimMatcherV2;
use fuzzy_matcher::FuzzyMatcher;
use luahelper::{from_lua_value_dynamic, impl_lua_conversion_dynamic};
use mux_lua::MuxPane;
use rayon::prelude::*;
use serde::{Deserialize, Serialize};
use std::borrow::Cow;
use std::cell::{Ref, RefCell};
@ -172,18 +172,18 @@ fn build_commands(
#[derive(Debug)]
struct MatchResult {
row_idx: usize,
score: i64,
score: u32,
}
impl MatchResult {
fn new(row_idx: usize, score: i64, selection: &str, commands: &[ExpandedCommand]) -> Self {
fn new(row_idx: usize, score: u32, selection: &str, commands: &[ExpandedCommand]) -> Self {
Self {
row_idx,
score: if commands[row_idx].brief == selection {
// Pump up the score for an exact match, otherwise
// the order may be undesirable if there are a lot
// of candidates with the same score
i64::max_value()
u32::max_value()
} else {
score
},
@ -195,17 +195,16 @@ fn compute_matches(selection: &str, commands: &[ExpandedCommand]) -> Vec<usize>
if selection.is_empty() {
commands.iter().enumerate().map(|(idx, _)| idx).collect()
} else {
let matcher = SkimMatcherV2::default();
let pattern = matcher_pattern(selection);
let start = std::time::Instant::now();
let mut scores: Vec<MatchResult> = commands
.iter()
.par_iter()
.enumerate()
.filter_map(|(row_idx, entry)| {
let group = entry.menubar.join(" ");
let text = format!("{group}: {}. {} {:?}", entry.brief, entry.doc, entry.action);
matcher
.fuzzy_match(&text, selection)
matcher_score(&pattern, &text)
.map(|score| MatchResult::new(row_idx, score, selection, commands))
})
.collect();

View File

@ -7,6 +7,8 @@ use crate::termwindow::render::window_buttons::window_button_element;
use crate::termwindow::{UIItem, UIItemType};
use crate::utilsprites::RenderMetrics;
use config::{Dimension, DimensionContext, TabBarColors};
use std::rc::Rc;
use wezterm_font::LoadedFont;
use wezterm_term::color::{ColorAttribute, ColorPalette};
use window::{IntegratedTitleButtonAlignment, IntegratedTitleButtonStyle};
@ -343,63 +345,9 @@ impl crate::TermWindow {
ElementContent::Text(_) => unreachable!(),
ElementContent::Poly { .. } => unreachable!(),
ElementContent::Children(mut kids) => {
let x_button = Element::new(
&font,
ElementContent::Poly {
line_width: metrics.underline_height.max(2),
poly: SizedPoly {
poly: X_BUTTON,
width: Dimension::Pixels(
metrics.cell_size.height as f32 / 2.,
),
height: Dimension::Pixels(
metrics.cell_size.height as f32 / 2.,
),
},
},
)
// Ensure that we draw our background over the
// top of the rest of the tab contents
.zindex(1)
.vertical_align(VerticalAlign::Middle)
.float(Float::Right)
.item_type(UIItemType::CloseTab(tab_idx))
.hover_colors({
let inactive_tab_hover = colors.inactive_tab_hover();
let active_tab = colors.active_tab();
Some(ElementColors {
border: BorderColor::default(),
bg: (if active {
inactive_tab_hover.bg_color
} else {
active_tab.bg_color
})
.to_linear()
.into(),
text: (if active {
inactive_tab_hover.fg_color
} else {
active_tab.fg_color
})
.to_linear()
.into(),
})
})
.padding(BoxDimension {
left: Dimension::Cells(0.25),
right: Dimension::Cells(0.25),
top: Dimension::Cells(0.25),
bottom: Dimension::Cells(0.25),
})
.margin(BoxDimension {
left: Dimension::Cells(0.5),
right: Dimension::Cells(0.),
top: Dimension::Cells(0.),
bottom: Dimension::Cells(0.),
});
kids.push(x_button);
if self.config.show_close_tab_button_in_tabs {
kids.push(make_x_button(&font, &metrics, &colors, tab_idx, active));
}
ElementContent::Children(kids)
}
};
@ -522,3 +470,63 @@ impl crate::TermWindow {
Ok(ui_items)
}
}
fn make_x_button(
font: &Rc<LoadedFont>,
metrics: &RenderMetrics,
colors: &TabBarColors,
tab_idx: usize,
active: bool,
) -> Element {
Element::new(
&font,
ElementContent::Poly {
line_width: metrics.underline_height.max(2),
poly: SizedPoly {
poly: X_BUTTON,
width: Dimension::Pixels(metrics.cell_size.height as f32 / 2.),
height: Dimension::Pixels(metrics.cell_size.height as f32 / 2.),
},
},
)
// Ensure that we draw our background over the
// top of the rest of the tab contents
.zindex(1)
.vertical_align(VerticalAlign::Middle)
.float(Float::Right)
.item_type(UIItemType::CloseTab(tab_idx))
.hover_colors({
let inactive_tab_hover = colors.inactive_tab_hover();
let active_tab = colors.active_tab();
Some(ElementColors {
border: BorderColor::default(),
bg: (if active {
inactive_tab_hover.bg_color
} else {
active_tab.bg_color
})
.to_linear()
.into(),
text: (if active {
inactive_tab_hover.fg_color
} else {
active_tab.fg_color
})
.to_linear()
.into(),
})
})
.padding(BoxDimension {
left: Dimension::Cells(0.25),
right: Dimension::Cells(0.25),
top: Dimension::Cells(0.25),
bottom: Dimension::Cells(0.25),
})
.margin(BoxDimension {
left: Dimension::Cells(0.5),
right: Dimension::Cells(0.),
top: Dimension::Cells(0.),
bottom: Dimension::Cells(0.),
})
}

View File

@ -72,8 +72,6 @@ pub struct LineQuadCacheKey {
}
pub struct LineQuadCacheValue {
/// For resolving hash collisions
pub line: Line,
pub expires: Option<Instant>,
pub layers: HeapQuadAllocator,
// Only set if the line contains any hyperlinks, so
@ -86,9 +84,7 @@ pub struct LineToElementParams<'a> {
pub line: &'a Line,
pub config: &'a ConfigHandle,
pub palette: &'a ColorPalette,
pub stable_line_idx: StableRowIndex,
pub window_is_transparent: bool,
pub cursor: &'a StableCursorPosition,
pub reverse_video: bool,
pub shape_key: &'a Option<LineToEleShapeCacheKey>,
}
@ -110,8 +106,6 @@ pub struct LineToElementShapeItem {
}
pub struct LineToElementShape {
pub attrs: CellAttributes,
pub style: TextStyle,
pub underline_tex_rect: TextureRect,
pub fg_color: LinearRgba,
pub bg_color: LinearRgba,

View File

@ -537,7 +537,6 @@ impl crate::TermWindow {
let quad_value = LineQuadCacheValue {
layers: buf,
expires,
line: (*line).clone(),
invalidate_on_hover_change: render_result.invalidate_on_hover_change,
current_highlight: if render_result.invalidate_on_hover_change {
self.term_window.current_highlight.clone()

View File

@ -144,9 +144,7 @@ impl crate::TermWindow {
let params = LineToElementParams {
config: params.config,
line: params.line,
cursor: params.cursor,
palette: params.palette,
stable_line_idx: params.stable_line_idx.unwrap_or(0),
window_is_transparent: params.window_is_transparent,
reverse_video: params.dims.reverse_video,
shape_key: &params.shape_key,
@ -870,8 +868,6 @@ impl crate::TermWindow {
.sum();
shaped.push(LineToElementShape {
attrs: style_params.attrs.clone(),
style: style_params.style.clone(),
underline_tex_rect: style_params.underline_tex_rect,
bg_color: style_params.bg_color,
fg_color: style_params.fg_color,

View File

@ -13,9 +13,11 @@ async_ossl = { path = "../async_ossl" }
async-io = "2.3"
codec = { path = "../codec" }
config = { path = "../config" }
dns-lookup = "2.0"
futures = "0.3"
hostname = "0.4"
lazy_static = "1.4"
libc = "0.2"
log = "0.4"
mux = { path = "../mux" }
portable-pty = { path = "../pty", features = ["serde_support"]}

View File

@ -1,6 +1,10 @@
use anyhow::{anyhow, Context as _};
#[cfg(unix)]
use libc::{AF_UNSPEC, AI_CANONNAME, SOCK_DGRAM};
use rcgen::{BasicConstraints, Certificate, CertificateParams, DistinguishedName, DnType, IsCa};
use std::path::PathBuf;
#[cfg(windows)]
use winapi::shared::ws2def::{AF_UNSPEC, AI_CANONNAME, SOCK_DGRAM};
/// A helper for managing keys for the TLS server component.
/// Each time the server is started, a new CA is generated
@ -22,14 +26,35 @@ impl Pki {
pub fn init() -> anyhow::Result<Self> {
let pki_dir = config::pki_dir()?;
std::fs::create_dir_all(&pki_dir)?;
log::error!("runtime dir is {}", pki_dir.display());
log::debug!("pki dir is {}", pki_dir.display());
let hostname = hostname::get()?
.into_string()
.map_err(|_| anyhow!("hostname is not representable as unicode"))?;
let mut alt_names = vec![hostname.clone(), "localhost".to_owned()];
let hints = dns_lookup::AddrInfoHints {
flags: AI_CANONNAME,
address: AF_UNSPEC,
socktype: SOCK_DGRAM,
protocol: 0,
};
if let Ok(iter) = dns_lookup::getaddrinfo(Some(&hostname), None, Some(hints)) {
for entry in iter {
if let Ok(entry) = entry {
if let Some(canon) = entry.canonname {
alt_names.push(canon);
}
}
}
}
alt_names.sort();
alt_names.dedup();
log::debug!("generating cert with alt_names={alt_names:?}");
let alt_names = vec![
hostname::get()?
.into_string()
.map_err(|_| anyhow!("hostname is not representable as unicode"))?,
"localhost".to_owned(),
];
let unix_name = config::username_from_env()?;
// Create the CA certificate

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