Compare commits
56 Commits
fix-git-ht
...
new-diff-m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51ab619a84 | ||
|
|
848df0a887 | ||
|
|
c3734400af | ||
|
|
df81a91bf9 | ||
|
|
7adcf903cc | ||
|
|
062b4a2dd8 | ||
|
|
2cca833d7b | ||
|
|
0b3715ae44 | ||
|
|
2b68817ed8 | ||
|
|
d1239f6cdb | ||
|
|
d600c58d3c | ||
|
|
c160ce6a24 | ||
|
|
9450de73b3 | ||
|
|
5cc3bd1585 | ||
|
|
87d50ee54c | ||
|
|
2f5ea92fe1 | ||
|
|
2625719ca2 | ||
|
|
88b4628c00 | ||
|
|
241c7a6645 | ||
|
|
f6aa7df14f | ||
|
|
472fee6b62 | ||
|
|
093c3d3652 | ||
|
|
1f28437c82 | ||
|
|
2266b3cb96 | ||
|
|
4369890646 | ||
|
|
82fbe27c08 | ||
|
|
41c5e45ca2 | ||
|
|
243d7c6d5a | ||
|
|
9025fb226a | ||
|
|
07eb573a2c | ||
|
|
b552e32b18 | ||
|
|
9b526a4d42 | ||
|
|
cc4ecacc04 | ||
|
|
dc814cb3af | ||
|
|
ad87dfe908 | ||
|
|
99edc9583c | ||
|
|
c015553b1f | ||
|
|
e53d8bb8d2 | ||
|
|
6e724c1168 | ||
|
|
a8a9177878 | ||
|
|
9dc5ebab85 | ||
|
|
2630dfdd23 | ||
|
|
20ec116932 | ||
|
|
dac0a07770 | ||
|
|
61e42b986a | ||
|
|
a20715d663 | ||
|
|
33833533bd | ||
|
|
023f9239b4 | ||
|
|
946ae93f68 | ||
|
|
011880c48c | ||
|
|
440b632b09 | ||
|
|
d0a8b0f8b1 | ||
|
|
09082d103e | ||
|
|
90c9ad4fd6 | ||
|
|
67ffe999e5 | ||
|
|
159c2239cc |
@@ -1,12 +0,0 @@
|
|||||||
# This config is different from config.toml in this directory, as the latter is recognized by Cargo.
|
|
||||||
# This file is placed in ./../.cargo/config.toml on CI runs. Cargo then merges Zeds .cargo/config.toml with ./../.cargo/config.toml
|
|
||||||
# with preference for settings from Zeds config.toml.
|
|
||||||
# TL;DR: If a value is set in both ci-config.toml and config.toml, config.toml value takes precedence.
|
|
||||||
# Arrays are merged together though. See: https://doc.rust-lang.org/cargo/reference/config.html#hierarchical-structure
|
|
||||||
# The intent for this file is to configure CI build process with a divergance from Zed developers experience; for example, in this config file
|
|
||||||
# we use `-D warnings` for rustflags (which makes compilation fail in presence of warnings during build process). Placing that in developers `config.toml`
|
|
||||||
# would be incovenient.
|
|
||||||
# The reason for not using the RUSTFLAGS environment variable is that doing so would override all the settings in the config.toml file, even if the contents of the latter are completely nonsensical. See: https://github.com/rust-lang/cargo/issues/5376
|
|
||||||
# Here, we opted to use `[target.'cfg(all())']` instead of `[build]` because `[target.'**']` is guaranteed to be cumulative.
|
|
||||||
[target.'cfg(all())']
|
|
||||||
rustflags = ["-D", "warnings"]
|
|
||||||
@@ -19,10 +19,6 @@ rustflags = ["-C", "link-args=-Objc -all_load"]
|
|||||||
[target.x86_64-apple-darwin]
|
[target.x86_64-apple-darwin]
|
||||||
rustflags = ["-C", "link-args=-Objc -all_load"]
|
rustflags = ["-C", "link-args=-Objc -all_load"]
|
||||||
|
|
||||||
|
# This cfg will reduce the size of `windows::core::Error` from 16 bytes to 4 bytes
|
||||||
[target.'cfg(target_os = "windows")']
|
[target.'cfg(target_os = "windows")']
|
||||||
rustflags = [
|
rustflags = ["--cfg", "windows_slim_errors"]
|
||||||
"--cfg",
|
|
||||||
"windows_slim_errors", # This cfg will reduce the size of `windows::core::Error` from 16 bytes to 4 bytes
|
|
||||||
"-C",
|
|
||||||
"target-feature=+crt-static", # This fixes the linking issue when compiling livekit on Windows
|
|
||||||
]
|
|
||||||
|
|||||||
31
.github/ISSUE_TEMPLATE/0_feature_request.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: "Tip: open this issue template from within Zed with the `request feature` command palette action"
|
||||||
|
labels: ["admin read", "triage", "enhancement"]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Check for existing issues
|
||||||
|
description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it.
|
||||||
|
options:
|
||||||
|
- label: Completed
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the feature
|
||||||
|
description: A clear and concise description of what you want to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: Environment
|
||||||
|
description: Run the `copy system specs into clipboard` command palette action and paste the output in the field below. If you are unable to run the command, please include your Zed version and release channel, operating system and version, RAM amount, and architecture.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: |
|
||||||
|
If applicable, add mockups / screenshots to help present your vision of the feature
|
||||||
|
description: Drag images into the text input below
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
82
.github/ISSUE_TEMPLATE/1_bug_report.yml
vendored
@@ -1,57 +1,49 @@
|
|||||||
name: Bug Report
|
name: Bug Report
|
||||||
description: |
|
description: |
|
||||||
Something is broken in Zed (exclude crashing).
|
Use this template for **non-crash-related** bug reports.
|
||||||
type: "Bug"
|
Tip: open this issue template from within Zed with the `file bug report` command palette action.
|
||||||
|
labels: ["admin read", "triage", "bug"]
|
||||||
body:
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Check for existing issues
|
||||||
|
description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it.
|
||||||
|
options:
|
||||||
|
- label: Completed
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Summary
|
label: Describe the bug / provide steps to reproduce it
|
||||||
description: Describe the bug with a one line summary, and provide detailed reproduction steps
|
description: A clear and concise description of what the bug is.
|
||||||
value: |
|
|
||||||
<!-- Please insert a one line summary of the issue below -->
|
|
||||||
|
|
||||||
SUMMARY_SENTENCE_HERE
|
|
||||||
|
|
||||||
<!-- Be verbose: Include all steps necessary to reproduce from a clean Zed installation. -->
|
|
||||||
<!-- Code snippets are better than images, a repository link that reproduces the issue is ideal. -->
|
|
||||||
|
|
||||||
Steps to trigger the problem:
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
4.
|
|
||||||
|
|
||||||
Actual Behavior:
|
|
||||||
|
|
||||||
Expected Behavior:
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Is there anything additional necessary to reproduce this issue?
|
|
||||||
- settings.json, keymap.json, .editorconfig etc?
|
|
||||||
- Does it happen intermittently or only with specific projects / file types?
|
|
||||||
- Have you found a workaround?
|
|
||||||
|
|
||||||
Did you check your Zed.log to see if there is any relevant details there?
|
|
||||||
- When including large items (videos, screenshots, logs, configs) please wrap with:
|
|
||||||
|
|
||||||
<details><summary>See inside for XXXXYYY</summary>
|
|
||||||
|
|
||||||
```shell
|
|
||||||
code
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
-->
|
|
||||||
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: environment
|
id: environment
|
||||||
attributes:
|
attributes:
|
||||||
label: Zed Version and System Specs
|
label: Environment
|
||||||
description: 'Open Zed, and in the command palette select "zed: Copy System Specs Into Clipboard"'
|
description: Run the `copy system specs into clipboard` command palette action and paste the output in the field below. If you are unable to run the command, please include your Zed version and release channel, operating system and version, RAM amount, and architecture.
|
||||||
placeholder: |
|
|
||||||
Output of "zed: Copy System Specs Into Clipboard"
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: If applicable, add screenshots or screencasts of the incorrect state / behavior
|
||||||
|
description: Drag images / videos into the text input below
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: If applicable, attach your Zed.log file to this issue.
|
||||||
|
description: |
|
||||||
|
macOS: `~/Library/Logs/Zed/Zed.log`
|
||||||
|
Linux: `~/.local/share/zed/logs/Zed.log` or $XDG_DATA_HOME
|
||||||
|
If you only need the most recent lines, you can run the `zed: open log` command palette action to see the last 1000.
|
||||||
|
value: |
|
||||||
|
<details><summary>Zed.log</summary>
|
||||||
|
|
||||||
|
<!-- Click below this line and paste or drag-and-drop your log-->
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
<!-- Click above this line and paste or drag-and-drop your log--></details>
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|||||||
35
.github/ISSUE_TEMPLATE/2_crash_report.yml
vendored
@@ -1,33 +1,26 @@
|
|||||||
name: Crash Report
|
name: Crash Report
|
||||||
description: Zed is Crashing or Hanging
|
description: |
|
||||||
type: "Crash"
|
Use this template for crash reports.
|
||||||
|
labels: ["admin read", "triage", "bug", "panic / crash"]
|
||||||
body:
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Check for existing issues
|
||||||
|
description: Check the backlog of issues to reduce the chances of creating duplicates; if an issue already exists, place a `+1` (👍) on it.
|
||||||
|
options:
|
||||||
|
- label: Completed
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Summary
|
label: Describe the bug / provide steps to reproduce it
|
||||||
description: Describe the bug with a one line summary, and provide detailed reproduction steps
|
description: A clear and concise description of what the bug is.
|
||||||
value: |
|
|
||||||
<!-- Please insert a one line summary of the issue below -->
|
|
||||||
|
|
||||||
<!-- Include all steps necessary to reproduce from a clean Zed installation. Be verbose -->
|
|
||||||
Steps to trigger the problem:
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
Actual Behavior:
|
|
||||||
|
|
||||||
Expected Behavior:
|
|
||||||
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: environment
|
id: environment
|
||||||
attributes:
|
attributes:
|
||||||
label: Zed Version and System Specs
|
label: Environment
|
||||||
description: 'Open Zed, and in the command palette select "zed: Copy System Specs Into Clipboard"'
|
description: Run the `copy system specs into clipboard` command palette action and paste the output in the field below. If you are unable to run the command, please include your Zed version and release channel, operating system and version, RAM amount, and architecture.
|
||||||
placeholder: |
|
|
||||||
Output of "zed: Copy System Specs Into Clipboard"
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
|||||||
24
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,12 +1,18 @@
|
|||||||
# yaml-language-server: $schema=https://json.schemastore.org/github-issue-config.json
|
# yaml-language-server: $schema=https://json.schemastore.org/github-issue-config.json
|
||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Feature Request
|
- name: Language Request
|
||||||
url: https://github.com/zed-industries/zed/discussions/new/choose
|
url: https://github.com/zed-industries/extensions/issues/new?assignees=&labels=language&projects=&template=1_language_request.yml&title=%3Cname_of_language%3E
|
||||||
about: To request a feature, open a new Discussion in one of the appropriate Discussion categories
|
about: Request a language in the extensions repository
|
||||||
- name: Zed Discussion Forum
|
- name: Theme Request
|
||||||
url: https://github.com/zed-industries/zed/discussions
|
url: https://github.com/zed-industries/extensions/issues/new?assignees=&labels=theme&projects=&template=0_theme_request.yml&title=%3Cname_of_theme%3E+theme
|
||||||
about: A community discussion forum
|
about: Request a theme in the extensions repository
|
||||||
- name: "Zed Discord: #Support Channel"
|
- name: Top-Ranking Issues
|
||||||
url: https://zed.dev/community-links
|
url: https://github.com/zed-industries/zed/issues/5393
|
||||||
about: Real-time discussion and user support
|
about: See an overview of the most popular Zed issues
|
||||||
|
- name: Platform Support
|
||||||
|
url: https://github.com/zed-industries/zed/issues/5391
|
||||||
|
about: A quick note on platform support
|
||||||
|
- name: Positive Feedback
|
||||||
|
url: https://github.com/zed-industries/zed/discussions/5397
|
||||||
|
about: A central location for kind words about Zed
|
||||||
|
|||||||
4
.github/actions/run_tests/action.yml
vendored
@@ -7,10 +7,10 @@ runs:
|
|||||||
- name: Install Rust
|
- name: Install Rust
|
||||||
shell: bash -euxo pipefail {0}
|
shell: bash -euxo pipefail {0}
|
||||||
run: |
|
run: |
|
||||||
cargo install cargo-nextest --locked
|
cargo install cargo-nextest
|
||||||
|
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
|
||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
|
|
||||||
|
|||||||
26
.github/actions/run_tests_windows/action.yml
vendored
@@ -1,26 +0,0 @@
|
|||||||
name: "Run tests on Windows"
|
|
||||||
description: "Runs the tests on Windows"
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
working-directory:
|
|
||||||
description: "The working directory"
|
|
||||||
required: true
|
|
||||||
default: "."
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: "composite"
|
|
||||||
steps:
|
|
||||||
- name: Install Rust
|
|
||||||
shell: pwsh
|
|
||||||
working-directory: ${{ inputs.working-directory }}
|
|
||||||
run: cargo install cargo-nextest --locked
|
|
||||||
|
|
||||||
- name: Install Node
|
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
|
||||||
with:
|
|
||||||
node-version: "18"
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
shell: pwsh
|
|
||||||
working-directory: ${{ inputs.working-directory }}
|
|
||||||
run: cargo nextest run --workspace --no-fail-fast
|
|
||||||
1
.github/workflows/bump_patch_version.yml
vendored
@@ -14,7 +14,6 @@ concurrency:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
bump_patch_version:
|
bump_patch_version:
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on:
|
runs-on:
|
||||||
- buildjet-16vcpu-ubuntu-2204
|
- buildjet-16vcpu-ubuntu-2204
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
133
.github/workflows/ci.yml
vendored
@@ -7,10 +7,14 @@ on:
|
|||||||
- "v[0-9]+.[0-9]+.x"
|
- "v[0-9]+.[0-9]+.x"
|
||||||
tags:
|
tags:
|
||||||
- "v*"
|
- "v*"
|
||||||
|
paths-ignore:
|
||||||
|
- "docs/**"
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- "**"
|
- "**"
|
||||||
|
paths-ignore:
|
||||||
|
- "docs/**/*"
|
||||||
|
- ".github/workflows/community_*"
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
# Allow only one workflow per any non-`main` branch.
|
# Allow only one workflow per any non-`main` branch.
|
||||||
@@ -21,6 +25,7 @@ env:
|
|||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
RUST_BACKTRACE: 1
|
RUST_BACKTRACE: 1
|
||||||
|
RUSTFLAGS: "-D warnings"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
migration_checks:
|
migration_checks:
|
||||||
@@ -76,10 +81,6 @@ jobs:
|
|||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||||
|
|
||||||
# To support writing comments that they will certainly be revisited.
|
|
||||||
- name: Check for todo! and FIXME comments
|
|
||||||
run: script/check-todos
|
|
||||||
|
|
||||||
- name: Run style checks
|
- name: Run style checks
|
||||||
uses: ./.github/actions/check_style
|
uses: ./.github/actions/check_style
|
||||||
|
|
||||||
@@ -101,24 +102,11 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
clean: false
|
clean: false
|
||||||
|
|
||||||
- name: Configure CI
|
|
||||||
run: |
|
|
||||||
mkdir -p ./../.cargo
|
|
||||||
cp ./.cargo/ci-config.toml ./../.cargo/config.toml
|
|
||||||
|
|
||||||
- name: cargo clippy
|
- name: cargo clippy
|
||||||
run: ./script/clippy
|
run: ./script/clippy
|
||||||
|
|
||||||
- name: Install cargo-machete
|
|
||||||
uses: clechasseur/rs-cargo@8435b10f6e71c2e3d4d3b7573003a8ce4bfc6386 # v2
|
|
||||||
with:
|
|
||||||
command: install
|
|
||||||
args: cargo-machete@0.7.0
|
|
||||||
|
|
||||||
- name: Check unused dependencies
|
- name: Check unused dependencies
|
||||||
uses: clechasseur/rs-cargo@8435b10f6e71c2e3d4d3b7573003a8ce4bfc6386 # v2
|
uses: bnjbvr/cargo-machete@main
|
||||||
with:
|
|
||||||
command: machete
|
|
||||||
|
|
||||||
- name: Check licenses
|
- name: Check licenses
|
||||||
run: |
|
run: |
|
||||||
@@ -143,14 +131,8 @@ jobs:
|
|||||||
cargo check -p gpui --features "macos-blade"
|
cargo check -p gpui --features "macos-blade"
|
||||||
cargo check -p workspace
|
cargo check -p workspace
|
||||||
cargo build -p remote_server
|
cargo build -p remote_server
|
||||||
cargo check -p gpui --examples
|
|
||||||
script/check-rust-livekit-macos
|
script/check-rust-livekit-macos
|
||||||
|
|
||||||
# Since the macOS runners are stateful, so we need to remove the config file to prevent potential bug.
|
|
||||||
- name: Clean CI config file
|
|
||||||
if: always()
|
|
||||||
run: rm -rf ./../.cargo
|
|
||||||
|
|
||||||
linux_tests:
|
linux_tests:
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
name: (Linux) Run Clippy and tests
|
name: (Linux) Run Clippy and tests
|
||||||
@@ -167,7 +149,7 @@ jobs:
|
|||||||
clean: false
|
clean: false
|
||||||
|
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
|
uses: swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2
|
||||||
with:
|
with:
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
||||||
cache-provider: "buildjet"
|
cache-provider: "buildjet"
|
||||||
@@ -175,11 +157,6 @@ jobs:
|
|||||||
- name: Install Linux dependencies
|
- name: Install Linux dependencies
|
||||||
run: ./script/linux
|
run: ./script/linux
|
||||||
|
|
||||||
- name: Configure CI
|
|
||||||
run: |
|
|
||||||
mkdir -p ./../.cargo
|
|
||||||
cp ./.cargo/ci-config.toml ./../.cargo/config.toml
|
|
||||||
|
|
||||||
- name: cargo clippy
|
- name: cargo clippy
|
||||||
run: ./script/clippy
|
run: ./script/clippy
|
||||||
|
|
||||||
@@ -190,15 +167,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cargo build -p zed
|
cargo build -p zed
|
||||||
cargo check -p workspace
|
cargo check -p workspace
|
||||||
cargo check -p gpui --examples
|
|
||||||
|
|
||||||
# Even the Linux runner is not stateful, in theory there is no need to do this cleanup.
|
|
||||||
# But, to avoid potential issues in the future if we choose to use a stateful Linux runner and forget to add code
|
|
||||||
# to clean up the config file, I’ve included the cleanup code here as a precaution.
|
|
||||||
# While it’s not strictly necessary at this moment, I believe it’s better to err on the side of caution.
|
|
||||||
- name: Clean CI config file
|
|
||||||
if: always()
|
|
||||||
run: rm -rf ./../.cargo
|
|
||||||
|
|
||||||
build_remote_server:
|
build_remote_server:
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
@@ -216,7 +184,7 @@ jobs:
|
|||||||
clean: false
|
clean: false
|
||||||
|
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
|
uses: swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2
|
||||||
with:
|
with:
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
||||||
cache-provider: "buildjet"
|
cache-provider: "buildjet"
|
||||||
@@ -224,78 +192,39 @@ jobs:
|
|||||||
- name: Install Clang & Mold
|
- name: Install Clang & Mold
|
||||||
run: ./script/remote-server && ./script/install-mold 2.34.0
|
run: ./script/remote-server && ./script/install-mold 2.34.0
|
||||||
|
|
||||||
- name: Configure CI
|
|
||||||
run: |
|
|
||||||
mkdir -p ./../.cargo
|
|
||||||
cp ./.cargo/ci-config.toml ./../.cargo/config.toml
|
|
||||||
|
|
||||||
- name: Build Remote Server
|
- name: Build Remote Server
|
||||||
run: cargo build -p remote_server
|
run: cargo build -p remote_server
|
||||||
|
|
||||||
- name: Clean CI config file
|
# todo(windows): Actually run the tests
|
||||||
if: always()
|
|
||||||
run: rm -rf ./../.cargo
|
|
||||||
|
|
||||||
windows_tests:
|
windows_tests:
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
name: (Windows) Run Clippy and tests
|
name: (Windows) Run Clippy and tests
|
||||||
if: github.repository_owner == 'zed-industries'
|
if: github.repository_owner == 'zed-industries'
|
||||||
runs-on: hosted-windows-2
|
runs-on: hosted-windows-1
|
||||||
steps:
|
steps:
|
||||||
# more info here:- https://github.com/rust-lang/cargo/issues/13020
|
# more info here:- https://github.com/rust-lang/cargo/issues/13020
|
||||||
- name: Enable longer pathnames for git
|
- name: Enable longer pathnames for git
|
||||||
run: git config --system core.longpaths true
|
run: git config --system core.longpaths true
|
||||||
|
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||||
with:
|
with:
|
||||||
clean: false
|
clean: false
|
||||||
|
|
||||||
- name: Create Dev Drive using ReFS
|
|
||||||
run: ./script/setup-dev-driver.ps1
|
|
||||||
|
|
||||||
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
|
|
||||||
- name: Copy Git Repo to Dev Drive
|
|
||||||
run: |
|
|
||||||
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.ZED_WORKSPACE }}" -Recurse
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
|
uses: swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2
|
||||||
with:
|
with:
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
||||||
workspaces: ${{ env.ZED_WORKSPACE }}
|
|
||||||
cache-provider: "github"
|
cache-provider: "github"
|
||||||
|
|
||||||
- name: Configure CI
|
|
||||||
run: |
|
|
||||||
mkdir -p ${{ env.CARGO_HOME }} -ErrorAction Ignore
|
|
||||||
cp ./.cargo/ci-config.toml ${{ env.CARGO_HOME }}/config.toml
|
|
||||||
|
|
||||||
- name: cargo clippy
|
- name: cargo clippy
|
||||||
working-directory: ${{ env.ZED_WORKSPACE }}
|
# Windows can't run shell scripts, so we need to use `cargo xtask`.
|
||||||
run: ./script/clippy.ps1
|
run: cargo xtask clippy
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
uses: ./.github/actions/run_tests_windows
|
|
||||||
with:
|
|
||||||
working-directory: ${{ env.ZED_WORKSPACE }}
|
|
||||||
|
|
||||||
- name: Build Zed
|
- name: Build Zed
|
||||||
working-directory: ${{ env.ZED_WORKSPACE }}
|
|
||||||
run: cargo build
|
run: cargo build
|
||||||
|
|
||||||
- name: Check dev drive space
|
|
||||||
working-directory: ${{ env.ZED_WORKSPACE }}
|
|
||||||
# `setup-dev-driver.ps1` creates a 100GB drive, with CI taking up ~45GB of the drive.
|
|
||||||
run: ./script/exit-ci-if-dev-drive-is-full.ps1 95
|
|
||||||
|
|
||||||
# Since the Windows runners are stateful, so we need to remove the config file to prevent potential bug.
|
|
||||||
- name: Clean CI config file
|
|
||||||
if: always()
|
|
||||||
run: Remove-Item -Path "${{ env.CARGO_HOME }}/config.toml" -Force
|
|
||||||
|
|
||||||
bundle-mac:
|
bundle-mac:
|
||||||
timeout-minutes: 120
|
timeout-minutes: 60
|
||||||
name: Create a macOS bundle
|
name: Create a macOS bundle
|
||||||
runs-on:
|
runs-on:
|
||||||
- self-hosted
|
- self-hosted
|
||||||
@@ -305,16 +234,15 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
|
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
|
||||||
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
||||||
APPLE_NOTARIZATION_KEY: ${{ secrets.APPLE_NOTARIZATION_KEY }}
|
APPLE_NOTARIZATION_USERNAME: ${{ secrets.APPLE_NOTARIZATION_USERNAME }}
|
||||||
APPLE_NOTARIZATION_KEY_ID: ${{ secrets.APPLE_NOTARIZATION_KEY_ID }}
|
APPLE_NOTARIZATION_PASSWORD: ${{ secrets.APPLE_NOTARIZATION_PASSWORD }}
|
||||||
APPLE_NOTARIZATION_ISSUER_ID: ${{ secrets.APPLE_NOTARIZATION_ISSUER_ID }}
|
|
||||||
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
||||||
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
||||||
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
||||||
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
||||||
steps:
|
steps:
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
|
||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
|
|
||||||
@@ -348,6 +276,9 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Generate license file
|
||||||
|
run: script/generate-licenses
|
||||||
|
|
||||||
- name: Create macOS app bundle
|
- name: Create macOS app bundle
|
||||||
run: script/bundle-mac
|
run: script/bundle-mac
|
||||||
|
|
||||||
@@ -358,14 +289,14 @@ jobs:
|
|||||||
mv target/x86_64-apple-darwin/release/Zed.dmg target/x86_64-apple-darwin/release/Zed-x86_64.dmg
|
mv target/x86_64-apple-darwin/release/Zed.dmg target/x86_64-apple-darwin/release/Zed-x86_64.dmg
|
||||||
|
|
||||||
- name: Upload app bundle (aarch64) to workflow run if main branch or specific label
|
- name: Upload app bundle (aarch64) to workflow run if main branch or specific label
|
||||||
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
|
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
|
||||||
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
||||||
with:
|
with:
|
||||||
name: Zed_${{ github.event.pull_request.head.sha || github.sha }}-aarch64.dmg
|
name: Zed_${{ github.event.pull_request.head.sha || github.sha }}-aarch64.dmg
|
||||||
path: target/aarch64-apple-darwin/release/Zed-aarch64.dmg
|
path: target/aarch64-apple-darwin/release/Zed-aarch64.dmg
|
||||||
|
|
||||||
- name: Upload app bundle (x86_64) to workflow run if main branch or specific label
|
- name: Upload app bundle (x86_64) to workflow run if main branch or specific label
|
||||||
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
|
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
|
||||||
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
||||||
with:
|
with:
|
||||||
name: Zed_${{ github.event.pull_request.head.sha || github.sha }}-x86_64.dmg
|
name: Zed_${{ github.event.pull_request.head.sha || github.sha }}-x86_64.dmg
|
||||||
@@ -385,9 +316,9 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
bundle-linux-x86_x64:
|
bundle-linux:
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
name: Linux x86_x64 release bundle
|
name: Create a Linux bundle
|
||||||
runs-on:
|
runs-on:
|
||||||
- buildjet-16vcpu-ubuntu-2004
|
- buildjet-16vcpu-ubuntu-2004
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
||||||
@@ -395,8 +326,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
||||||
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
||||||
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
|
||||||
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||||
@@ -416,7 +345,7 @@ jobs:
|
|||||||
run: script/bundle-linux
|
run: script/bundle-linux
|
||||||
|
|
||||||
- name: Upload Linux bundle to workflow run if main branch or specific label
|
- name: Upload Linux bundle to workflow run if main branch or specific label
|
||||||
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
|
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
|
||||||
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
||||||
with:
|
with:
|
||||||
name: zed-${{ github.event.pull_request.head.sha || github.sha }}-x86_64-unknown-linux-gnu.tar.gz
|
name: zed-${{ github.event.pull_request.head.sha || github.sha }}-x86_64-unknown-linux-gnu.tar.gz
|
||||||
@@ -435,7 +364,7 @@ jobs:
|
|||||||
|
|
||||||
bundle-linux-aarch64: # this runs on ubuntu22.04
|
bundle-linux-aarch64: # this runs on ubuntu22.04
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
name: Linux arm64 release bundle
|
name: Create arm64 Linux bundle
|
||||||
runs-on:
|
runs-on:
|
||||||
- buildjet-16vcpu-ubuntu-2204-arm
|
- buildjet-16vcpu-ubuntu-2204-arm
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
||||||
@@ -443,8 +372,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
||||||
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
||||||
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
|
||||||
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||||
@@ -464,7 +391,7 @@ jobs:
|
|||||||
run: script/bundle-linux
|
run: script/bundle-linux
|
||||||
|
|
||||||
- name: Upload Linux bundle to workflow run if main branch or specific label
|
- name: Upload Linux bundle to workflow run if main branch or specific label
|
||||||
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
|
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
|
||||||
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
if: ${{ github.ref == 'refs/heads/main' }} || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
|
||||||
with:
|
with:
|
||||||
name: zed-${{ github.event.pull_request.head.sha || github.sha }}-aarch64-unknown-linux-gnu.tar.gz
|
name: zed-${{ github.event.pull_request.head.sha || github.sha }}-aarch64-unknown-linux-gnu.tar.gz
|
||||||
@@ -484,12 +411,12 @@ jobs:
|
|||||||
auto-release-preview:
|
auto-release-preview:
|
||||||
name: Auto release preview
|
name: Auto release preview
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/v') && endsWith(github.ref, '-pre') && !endsWith(github.ref, '.0-pre') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/v') && endsWith(github.ref, '-pre') && !endsWith(github.ref, '.0-pre') }}
|
||||||
needs: [bundle-mac, bundle-linux-x86_x64, bundle-linux-aarch64]
|
needs: [bundle-mac, bundle-linux, bundle-linux-aarch64]
|
||||||
runs-on:
|
runs-on:
|
||||||
- self-hosted
|
- self-hosted
|
||||||
- bundle
|
- bundle
|
||||||
steps:
|
steps:
|
||||||
- name: gh release
|
- name: gh release
|
||||||
run: gh release edit $GITHUB_REF_NAME --draft=true
|
run: gh release edit $GITHUB_REF_NAME --draft=false
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ jobs:
|
|||||||
if: github.repository_owner == 'zed-industries'
|
if: github.repository_owner == 'zed-industries'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9
|
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
stale-issue-message: >
|
stale-issue-message: >
|
||||||
@@ -19,7 +19,11 @@ jobs:
|
|||||||
|
|
||||||
Thanks for your help!
|
Thanks for your help!
|
||||||
close-issue-message: "This issue was closed due to inactivity. If you're still experiencing this problem, please open a new issue with a link to this issue."
|
close-issue-message: "This issue was closed due to inactivity. If you're still experiencing this problem, please open a new issue with a link to this issue."
|
||||||
days-before-stale: 120
|
# We will increase `days-before-stale` to 365 on or after Jan 24th,
|
||||||
|
# 2024. This date marks one year since migrating issues from
|
||||||
|
# 'community' to 'zed' repository. The migration added activity to all
|
||||||
|
# issues, preventing 365 days from working until then.
|
||||||
|
days-before-stale: 180
|
||||||
days-before-close: 7
|
days-before-close: 7
|
||||||
any-of-issue-labels: "bug,panic / crash"
|
any-of-issue-labels: "bug,panic / crash"
|
||||||
operations-per-run: 1000
|
operations-per-run: 1000
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
delete_comment:
|
delete_comment:
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check for specific strings in comment
|
- name: Check for specific strings in comment
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
discord_release:
|
discord_release:
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Get release URL
|
- name: Get release URL
|
||||||
@@ -19,7 +18,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
echo "::set-output name=URL::$URL"
|
echo "::set-output name=URL::$URL"
|
||||||
- name: Get content
|
- name: Get content
|
||||||
uses: 2428392/gh-truncate-string-action@b3ff790d21cf42af3ca7579146eedb93c8fb0757 # v1.4.1
|
uses: 2428392/gh-truncate-string-action@e6b5885fb83c81ca9a700a91b079baec2133be3e # v1.4.0
|
||||||
id: get-content
|
id: get-content
|
||||||
with:
|
with:
|
||||||
stringToTruncate: |
|
stringToTruncate: |
|
||||||
|
|||||||
3
.github/workflows/danger.yml
vendored
@@ -11,7 +11,6 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
danger:
|
danger:
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -22,7 +21,7 @@ jobs:
|
|||||||
version: 9
|
version: 9
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
|
||||||
with:
|
with:
|
||||||
node-version: "20"
|
node-version: "20"
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
|
|||||||
15
.github/workflows/deploy_cloudflare.yml
vendored
@@ -37,36 +37,29 @@ jobs:
|
|||||||
mdbook build ./docs --dest-dir=../target/deploy/docs/
|
mdbook build ./docs --dest-dir=../target/deploy/docs/
|
||||||
|
|
||||||
- name: Deploy Docs
|
- name: Deploy Docs
|
||||||
uses: cloudflare/wrangler-action@392082e81ffbcb9ebdde27400634aa004b35ea37 # v3
|
uses: cloudflare/wrangler-action@6d58852c35a27e6034745c5d0bc373d739014f7f # v3
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
command: pages deploy target/deploy --project-name=docs
|
command: pages deploy target/deploy --project-name=docs
|
||||||
|
|
||||||
- name: Deploy Install
|
- name: Deploy Install
|
||||||
uses: cloudflare/wrangler-action@392082e81ffbcb9ebdde27400634aa004b35ea37 # v3
|
uses: cloudflare/wrangler-action@6d58852c35a27e6034745c5d0bc373d739014f7f # v3
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
command: r2 object put -f script/install.sh zed-open-source-website-assets/install.sh
|
command: r2 object put -f script/install.sh zed-open-source-website-assets/install.sh
|
||||||
|
|
||||||
- name: Deploy Docs Workers
|
- name: Deploy Docs Workers
|
||||||
uses: cloudflare/wrangler-action@392082e81ffbcb9ebdde27400634aa004b35ea37 # v3
|
uses: cloudflare/wrangler-action@6d58852c35a27e6034745c5d0bc373d739014f7f # v3
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
command: deploy .cloudflare/docs-proxy/src/worker.js
|
command: deploy .cloudflare/docs-proxy/src/worker.js
|
||||||
|
|
||||||
- name: Deploy Install Workers
|
- name: Deploy Install Workers
|
||||||
uses: cloudflare/wrangler-action@392082e81ffbcb9ebdde27400634aa004b35ea37 # v3
|
uses: cloudflare/wrangler-action@6d58852c35a27e6034745c5d0bc373d739014f7f # v3
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
command: deploy .cloudflare/docs-proxy/src/worker.js
|
command: deploy .cloudflare/docs-proxy/src/worker.js
|
||||||
|
|
||||||
- name: Preserve Wrangler logs
|
|
||||||
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
name: wrangler_logs
|
|
||||||
path: /home/runner/.config/.wrangler/logs/
|
|
||||||
|
|||||||
3
.github/workflows/deploy_collab.yml
vendored
@@ -12,7 +12,6 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
style:
|
style:
|
||||||
name: Check formatting and Clippy lints
|
name: Check formatting and Clippy lints
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on:
|
runs-on:
|
||||||
- self-hosted
|
- self-hosted
|
||||||
- test
|
- test
|
||||||
@@ -45,7 +44,7 @@ jobs:
|
|||||||
- name: Install cargo nextest
|
- name: Install cargo nextest
|
||||||
shell: bash -euxo pipefail {0}
|
shell: bash -euxo pipefail {0}
|
||||||
run: |
|
run: |
|
||||||
cargo install cargo-nextest --locked
|
cargo install cargo-nextest
|
||||||
|
|
||||||
- name: Limit target directory size
|
- name: Limit target directory size
|
||||||
shell: bash -euxo pipefail {0}
|
shell: bash -euxo pipefail {0}
|
||||||
|
|||||||
6
.github/workflows/docs.yml
vendored
@@ -24,13 +24,11 @@ jobs:
|
|||||||
- name: Prettier Check on /docs
|
- name: Prettier Check on /docs
|
||||||
working-directory: ./docs
|
working-directory: ./docs
|
||||||
run: |
|
run: |
|
||||||
pnpm dlx prettier@${PRETTIER_VERSION} . --check || {
|
pnpm dlx prettier . --check || {
|
||||||
echo "To fix, run from the root of the zed repo:"
|
echo "To fix, run from the root of the zed repo:"
|
||||||
echo " cd docs && pnpm dlx prettier@${PRETTIER_VERSION} . --write && cd .."
|
echo " cd docs && pnpm dlx prettier . --write && cd .."
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
env:
|
|
||||||
PRETTIER_VERSION: 3.5.0
|
|
||||||
|
|
||||||
- name: Check for Typos with Typos-CLI
|
- name: Check for Typos with Typos-CLI
|
||||||
uses: crate-ci/typos@8e6a4285bcbde632c5d79900a7779746e8b7ea3f # v1.24.6
|
uses: crate-ci/typos@8e6a4285bcbde632c5d79900a7779746e8b7ea3f # v1.24.6
|
||||||
|
|||||||
33
.github/workflows/issue_response.yml
vendored
@@ -1,33 +0,0 @@
|
|||||||
name: Issue Response
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 12 * * 2"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
issue-response:
|
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0
|
|
||||||
with:
|
|
||||||
version: 9
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
|
||||||
with:
|
|
||||||
node-version: "20"
|
|
||||||
cache: "pnpm"
|
|
||||||
cache-dependency-path: "script/issue_response/pnpm-lock.yaml"
|
|
||||||
|
|
||||||
- run: pnpm install --dir script/issue_response
|
|
||||||
|
|
||||||
- name: Run Issue Response
|
|
||||||
run: pnpm run --dir script/issue_response start
|
|
||||||
env:
|
|
||||||
ISSUE_RESPONSE_GITHUB_TOKEN: ${{ secrets.ISSUE_RESPONSE_GITHUB_TOKEN }}
|
|
||||||
SLACK_ISSUE_RESPONSE_WEBHOOK_URL: ${{ secrets.SLACK_ISSUE_RESPONSE_WEBHOOK_URL }}
|
|
||||||
3
.github/workflows/publish_extension_cli.yml
vendored
@@ -12,7 +12,6 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
name: Publish zed-extension CLI
|
name: Publish zed-extension CLI
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on:
|
runs-on:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -22,7 +21,7 @@ jobs:
|
|||||||
clean: false
|
clean: false
|
||||||
|
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
|
uses: swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2
|
||||||
with:
|
with:
|
||||||
save-if: ${{ github.ref == 'refs/heads/main' }}
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
||||||
cache-provider: "github"
|
cache-provider: "github"
|
||||||
|
|||||||
3
.github/workflows/randomized_tests.yml
vendored
@@ -18,12 +18,11 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
name: Run randomized tests
|
name: Run randomized tests
|
||||||
if: github.repository_owner == 'zed-industries'
|
|
||||||
runs-on:
|
runs-on:
|
||||||
- buildjet-16vcpu-ubuntu-2204
|
- buildjet-16vcpu-ubuntu-2204
|
||||||
steps:
|
steps:
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
|
||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
|
|
||||||
|
|||||||
10
.github/workflows/release_nightly.yml
vendored
@@ -62,16 +62,15 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
|
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
|
||||||
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
||||||
APPLE_NOTARIZATION_KEY: ${{ secrets.APPLE_NOTARIZATION_KEY }}
|
APPLE_NOTARIZATION_USERNAME: ${{ secrets.APPLE_NOTARIZATION_USERNAME }}
|
||||||
APPLE_NOTARIZATION_KEY_ID: ${{ secrets.APPLE_NOTARIZATION_KEY_ID }}
|
APPLE_NOTARIZATION_PASSWORD: ${{ secrets.APPLE_NOTARIZATION_PASSWORD }}
|
||||||
APPLE_NOTARIZATION_ISSUER_ID: ${{ secrets.APPLE_NOTARIZATION_ISSUER_ID }}
|
|
||||||
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
||||||
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
||||||
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
|
||||||
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
|
||||||
steps:
|
steps:
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
|
||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
|
|
||||||
@@ -87,6 +86,9 @@ jobs:
|
|||||||
echo "Publishing version: ${version} on release channel nightly"
|
echo "Publishing version: ${version} on release channel nightly"
|
||||||
echo "nightly" > crates/zed/RELEASE_CHANNEL
|
echo "nightly" > crates/zed/RELEASE_CHANNEL
|
||||||
|
|
||||||
|
- name: Generate license file
|
||||||
|
run: script/generate-licenses
|
||||||
|
|
||||||
- name: Create macOS app bundle
|
- name: Create macOS app bundle
|
||||||
run: script/bundle-mac
|
run: script/bundle-mac
|
||||||
|
|
||||||
|
|||||||
55
.gitignore
vendored
@@ -1,36 +1,35 @@
|
|||||||
**/*.db
|
|
||||||
**/cargo-target
|
|
||||||
**/target
|
|
||||||
**/venv
|
|
||||||
*.wasm
|
|
||||||
*.xcodeproj
|
|
||||||
.DS_Store
|
|
||||||
.blob_store
|
|
||||||
.build
|
|
||||||
.envrc
|
|
||||||
.flatpak-builder
|
|
||||||
.idea
|
|
||||||
.netrc
|
|
||||||
.pytest_cache
|
|
||||||
.swiftpm
|
|
||||||
.swiftpm/config/registries.json
|
|
||||||
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
|
|
||||||
.venv
|
|
||||||
.vscode
|
|
||||||
.wrangler
|
|
||||||
/.direnv
|
/.direnv
|
||||||
/assets/*licenses.*
|
.envrc
|
||||||
/crates/collab/seed.json
|
.idea
|
||||||
/crates/theme/schemas/theme.json
|
**/target
|
||||||
/crates/zed/resources/flatpak/flatpak-cargo-sources.json
|
**/cargo-target
|
||||||
/dev.zed.Zed*.json
|
/zed.xcworkspace
|
||||||
|
.DS_Store
|
||||||
/plugins/bin
|
/plugins/bin
|
||||||
/script/node_modules
|
/script/node_modules
|
||||||
/snap
|
/crates/theme/schemas/theme.json
|
||||||
/zed.xcworkspace
|
/crates/collab/seed.json
|
||||||
DerivedData/
|
/crates/zed/resources/flatpak/flatpak-cargo-sources.json
|
||||||
|
/dev.zed.Zed*.json
|
||||||
|
/assets/*licenses.*
|
||||||
|
**/venv
|
||||||
|
.build
|
||||||
|
*.wasm
|
||||||
Packages
|
Packages
|
||||||
|
*.xcodeproj
|
||||||
xcuserdata/
|
xcuserdata/
|
||||||
|
DerivedData/
|
||||||
|
.swiftpm/config/registries.json
|
||||||
|
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
|
||||||
|
.netrc
|
||||||
|
.swiftpm
|
||||||
|
**/*.db
|
||||||
|
.pytest_cache
|
||||||
|
.venv
|
||||||
|
.blob_store
|
||||||
|
.vscode
|
||||||
|
.wrangler
|
||||||
|
.flatpak-builder
|
||||||
|
|
||||||
# Don't commit any secrets to the repo.
|
# Don't commit any secrets to the repo.
|
||||||
.env.secret.toml
|
.env.secret.toml
|
||||||
|
|||||||
21
.mailmap
@@ -9,8 +9,6 @@
|
|||||||
# Keep these entries sorted alphabetically.
|
# Keep these entries sorted alphabetically.
|
||||||
# In Zed: `editor: sort lines case insensitive`
|
# In Zed: `editor: sort lines case insensitive`
|
||||||
|
|
||||||
Agus Zubiaga <agus@zed.dev>
|
|
||||||
Agus Zubiaga <agus@zed.dev> <hi@aguz.me>
|
|
||||||
Alex Viscreanu <alexviscreanu@gmail.com>
|
Alex Viscreanu <alexviscreanu@gmail.com>
|
||||||
Alex Viscreanu <alexviscreanu@gmail.com> <alexandru.viscreanu@kiwi.com>
|
Alex Viscreanu <alexviscreanu@gmail.com> <alexandru.viscreanu@kiwi.com>
|
||||||
Alexander Mankuta <alex@pointless.one>
|
Alexander Mankuta <alex@pointless.one>
|
||||||
@@ -21,14 +19,11 @@ Andrei Zvonimir Crnković <andrei@0x7f.dev>
|
|||||||
Andrei Zvonimir Crnković <andrei@0x7f.dev> <andreicek@0x7f.dev>
|
Andrei Zvonimir Crnković <andrei@0x7f.dev> <andreicek@0x7f.dev>
|
||||||
Antonio Scandurra <me@as-cii.com>
|
Antonio Scandurra <me@as-cii.com>
|
||||||
Antonio Scandurra <me@as-cii.com> <antonio@zed.dev>
|
Antonio Scandurra <me@as-cii.com> <antonio@zed.dev>
|
||||||
Ben Kunkle <ben@zed.dev>
|
|
||||||
Ben Kunkle <ben@zed.dev> <ben.kunkle@gmail.com>
|
|
||||||
Bennet Bo Fenner <bennet@zed.dev>
|
Bennet Bo Fenner <bennet@zed.dev>
|
||||||
Bennet Bo Fenner <bennet@zed.dev> <53836821+bennetbo@users.noreply.github.com>
|
Bennet Bo Fenner <bennet@zed.dev> <53836821+bennetbo@users.noreply.github.com>
|
||||||
Bennet Bo Fenner <bennet@zed.dev> <bennetbo@gmx.de>
|
Bennet Bo Fenner <bennet@zed.dev> <bennetbo@gmx.de>
|
||||||
Boris Cherny <boris@anthropic.com>
|
Boris Cherny <boris@anthropic.com>
|
||||||
Boris Cherny <boris@anthropic.com> <boris@performancejs.com>
|
Boris Cherny <boris@anthropic.com> <boris@performancejs.com>
|
||||||
Brian Tan <brian.tan88@gmail.com>
|
|
||||||
Chris Hayes <chris+git@hayes.software>
|
Chris Hayes <chris+git@hayes.software>
|
||||||
Christian Bergschneider <christian.bergschneider@gmx.de>
|
Christian Bergschneider <christian.bergschneider@gmx.de>
|
||||||
Christian Bergschneider <christian.bergschneider@gmx.de> <magiclake@gmx.de>
|
Christian Bergschneider <christian.bergschneider@gmx.de> <magiclake@gmx.de>
|
||||||
@@ -37,16 +32,11 @@ Conrad Irwin <conrad@zed.dev> <conrad.irwin@gmail.com>
|
|||||||
Dairon Medina <dairon.medina@gmail.com>
|
Dairon Medina <dairon.medina@gmail.com>
|
||||||
Danilo Leal <danilo@zed.dev>
|
Danilo Leal <danilo@zed.dev>
|
||||||
Danilo Leal <danilo@zed.dev> <67129314+danilo-leal@users.noreply.github.com>
|
Danilo Leal <danilo@zed.dev> <67129314+danilo-leal@users.noreply.github.com>
|
||||||
Edwin Aronsson <75266237+4teapo@users.noreply.github.com>
|
|
||||||
Evren Sen <nervenes@icloud.com>
|
Evren Sen <nervenes@icloud.com>
|
||||||
Evren Sen <nervenes@icloud.com> <146845123+evrensen467@users.noreply.github.com>
|
Evren Sen <nervenes@icloud.com> <146845123+evrensen467@users.noreply.github.com>
|
||||||
Evren Sen <nervenes@icloud.com> <146845123+evrsen@users.noreply.github.com>
|
Evren Sen <nervenes@icloud.com> <146845123+evrsen@users.noreply.github.com>
|
||||||
Fernando Tagawa <tagawafernando@gmail.com>
|
Fernando Tagawa <tagawafernando@gmail.com>
|
||||||
Fernando Tagawa <tagawafernando@gmail.com> <fernando.tagawa.gamail.com@gmail.com>
|
Fernando Tagawa <tagawafernando@gmail.com> <fernando.tagawa.gamail.com@gmail.com>
|
||||||
Finn Evers <dev@bahn.sh>
|
|
||||||
Finn Evers <dev@bahn.sh> <75036051+MrSubidubi@users.noreply.github.com>
|
|
||||||
Finn Evers <dev@bahn.sh> <finn.evers@outlook.de>
|
|
||||||
Gowtham K <73059450+dovakin0007@users.noreply.github.com>
|
|
||||||
Greg Morenz <greg-morenz@droid.cafe>
|
Greg Morenz <greg-morenz@droid.cafe>
|
||||||
Greg Morenz <greg-morenz@droid.cafe> <morenzg@gmail.com>
|
Greg Morenz <greg-morenz@droid.cafe> <morenzg@gmail.com>
|
||||||
Ihnat Aŭtuška <autushka.ihnat@gmail.com>
|
Ihnat Aŭtuška <autushka.ihnat@gmail.com>
|
||||||
@@ -64,14 +54,11 @@ Kirill Bulatov <kirill@zed.dev>
|
|||||||
Kirill Bulatov <kirill@zed.dev> <mail4score@gmail.com>
|
Kirill Bulatov <kirill@zed.dev> <mail4score@gmail.com>
|
||||||
Kyle Caverly <kylebcaverly@gmail.com>
|
Kyle Caverly <kylebcaverly@gmail.com>
|
||||||
Kyle Caverly <kylebcaverly@gmail.com> <kyle@zed.dev>
|
Kyle Caverly <kylebcaverly@gmail.com> <kyle@zed.dev>
|
||||||
Lilith Iris <itslirissama@gmail.com>
|
|
||||||
Lilith Iris <itslirissama@gmail.com> <83819417+Irilith@users.noreply.github.com>
|
|
||||||
LoganDark <contact@logandark.mozmail.com>
|
LoganDark <contact@logandark.mozmail.com>
|
||||||
LoganDark <contact@logandark.mozmail.com> <git@logandark.mozmail.com>
|
LoganDark <contact@logandark.mozmail.com> <git@logandark.mozmail.com>
|
||||||
LoganDark <contact@logandark.mozmail.com> <github@logandark.mozmail.com>
|
LoganDark <contact@logandark.mozmail.com> <github@logandark.mozmail.com>
|
||||||
Marshall Bowers <git@maxdeviant.com>
|
Marshall Bowers <elliott.codes@gmail.com>
|
||||||
Marshall Bowers <git@maxdeviant.com> <elliott.codes@gmail.com>
|
Marshall Bowers <elliott.codes@gmail.com> <marshall@zed.dev>
|
||||||
Marshall Bowers <git@maxdeviant.com> <marshall@zed.dev>
|
|
||||||
Matt Fellenz <matt@felle.nz>
|
Matt Fellenz <matt@felle.nz>
|
||||||
Matt Fellenz <matt@felle.nz> <matt+github@felle.nz>
|
Matt Fellenz <matt@felle.nz> <matt+github@felle.nz>
|
||||||
Max Brunsfeld <maxbrunsfeld@gmail.com>
|
Max Brunsfeld <maxbrunsfeld@gmail.com>
|
||||||
@@ -114,8 +101,6 @@ Sebastijan Kelnerič <sebastijan.kelneric@sebba.dev> <sebastijan.kelneric@vichav
|
|||||||
Sergey Onufrienko <sergey@onufrienko.com>
|
Sergey Onufrienko <sergey@onufrienko.com>
|
||||||
Shish <webmaster@shishnet.org>
|
Shish <webmaster@shishnet.org>
|
||||||
Shish <webmaster@shishnet.org> <shish@shishnet.org>
|
Shish <webmaster@shishnet.org> <shish@shishnet.org>
|
||||||
Smit Barmase <0xtimsb@gmail.com>
|
|
||||||
Smit Barmase <0xtimsb@gmail.com> <smit@zed.dev>
|
|
||||||
Thorben Kröger <dev@thorben.net>
|
Thorben Kröger <dev@thorben.net>
|
||||||
Thorben Kröger <dev@thorben.net> <thorben.kroeger@hexagon.com>
|
Thorben Kröger <dev@thorben.net> <thorben.kroeger@hexagon.com>
|
||||||
Thorsten Ball <thorsten@zed.dev>
|
Thorsten Ball <thorsten@zed.dev>
|
||||||
@@ -127,7 +112,5 @@ Uladzislau Kaminski <i@uladkaminski.com>
|
|||||||
Uladzislau Kaminski <i@uladkaminski.com> <uladzislau_kaminski@epam.com>
|
Uladzislau Kaminski <i@uladkaminski.com> <uladzislau_kaminski@epam.com>
|
||||||
Vitaly Slobodin <vitaliy.slobodin@gmail.com>
|
Vitaly Slobodin <vitaliy.slobodin@gmail.com>
|
||||||
Vitaly Slobodin <vitaliy.slobodin@gmail.com> <vitaly_slobodin@fastmail.com>
|
Vitaly Slobodin <vitaliy.slobodin@gmail.com> <vitaly_slobodin@fastmail.com>
|
||||||
Will Bradley <williambbradley@gmail.com>
|
|
||||||
Will Bradley <williambbradley@gmail.com> <will@zed.dev>
|
|
||||||
WindSoilder <WindSoilder@outlook.com>
|
WindSoilder <WindSoilder@outlook.com>
|
||||||
张小白 <364772080@qq.com>
|
张小白 <364772080@qq.com>
|
||||||
|
|||||||
@@ -14,12 +14,12 @@
|
|||||||
},
|
},
|
||||||
"JSON": {
|
"JSON": {
|
||||||
"tab_size": 2,
|
"tab_size": 2,
|
||||||
"preferred_line_length": 120,
|
"preferred_line_length": 100,
|
||||||
"formatter": "prettier"
|
"formatter": "prettier"
|
||||||
},
|
},
|
||||||
"JSONC": {
|
"JSONC": {
|
||||||
"tab_size": 2,
|
"tab_size": 2,
|
||||||
"preferred_line_length": 120,
|
"preferred_line_length": 100,
|
||||||
"formatter": "prettier"
|
"formatter": "prettier"
|
||||||
},
|
},
|
||||||
"JavaScript": {
|
"JavaScript": {
|
||||||
|
|||||||
@@ -37,16 +37,6 @@ We plan to set aside time each week to pair program with contributors on promisi
|
|||||||
- Pair with us and watch us code to learn the codebase
|
- Pair with us and watch us code to learn the codebase
|
||||||
- Low effort PRs, such as those that just re-arrange syntax, won't be merged without a compelling justification
|
- Low effort PRs, such as those that just re-arrange syntax, won't be merged without a compelling justification
|
||||||
|
|
||||||
## File icons
|
|
||||||
|
|
||||||
Zed's default icon theme consists of icons that are hand-designed to fit together in a cohesive manner.
|
|
||||||
|
|
||||||
We do not accept PRs for file icons that are just an off-the-shelf SVG taken from somewhere else.
|
|
||||||
|
|
||||||
### Adding new icons to the Zed icon theme
|
|
||||||
|
|
||||||
If you would like to add a new icon to the Zed icon theme, [open a Discussion](https://github.com/zed-industries/zed/discussions/new?category=ux-and-design) and we can work with you on getting an icon designed and added to Zed.
|
|
||||||
|
|
||||||
## Bird's-eye view of Zed
|
## Bird's-eye view of Zed
|
||||||
|
|
||||||
Zed is made up of several smaller crates - let's go over those you're most likely to interact with:
|
Zed is made up of several smaller crates - let's go over those you're most likely to interact with:
|
||||||
@@ -62,9 +52,3 @@ Zed is made up of several smaller crates - let's go over those you're most likel
|
|||||||
- [`rpc`](/crates/rpc) defines messages to be exchanged with collaboration server.
|
- [`rpc`](/crates/rpc) defines messages to be exchanged with collaboration server.
|
||||||
- [`theme`](/crates/theme) defines the theme system and provides a default theme.
|
- [`theme`](/crates/theme) defines the theme system and provides a default theme.
|
||||||
- [`ui`](/crates/ui) is a collection of UI components and common patterns used throughout Zed.
|
- [`ui`](/crates/ui) is a collection of UI components and common patterns used throughout Zed.
|
||||||
- [`cli`](/crates/cli) is the CLI crate which invokes the Zed binary.
|
|
||||||
- [`zed`](/crates/zed) is where all things come together, and the `main` entry point for Zed.
|
|
||||||
|
|
||||||
## Packaging Zed
|
|
||||||
|
|
||||||
Check our [notes for packaging Zed](https://zed.dev/docs/development/linux#notes-for-packaging-zed).
|
|
||||||
|
|||||||
3410
Cargo.lock
generated
172
Cargo.toml
@@ -6,19 +6,13 @@ members = [
|
|||||||
"crates/assets",
|
"crates/assets",
|
||||||
"crates/assistant",
|
"crates/assistant",
|
||||||
"crates/assistant2",
|
"crates/assistant2",
|
||||||
"crates/assistant_context_editor",
|
|
||||||
"crates/assistant_settings",
|
|
||||||
"crates/assistant_slash_command",
|
"crates/assistant_slash_command",
|
||||||
"crates/assistant_slash_commands",
|
|
||||||
"crates/assistant_tool",
|
"crates/assistant_tool",
|
||||||
"crates/assistant_tools",
|
"crates/assistant_tools",
|
||||||
"crates/audio",
|
"crates/audio",
|
||||||
"crates/auto_update",
|
"crates/auto_update",
|
||||||
"crates/auto_update_ui",
|
"crates/auto_update_ui",
|
||||||
"crates/aws_http_client",
|
|
||||||
"crates/bedrock",
|
|
||||||
"crates/breadcrumbs",
|
"crates/breadcrumbs",
|
||||||
"crates/buffer_diff",
|
|
||||||
"crates/call",
|
"crates/call",
|
||||||
"crates/channel",
|
"crates/channel",
|
||||||
"crates/cli",
|
"crates/cli",
|
||||||
@@ -29,14 +23,10 @@ members = [
|
|||||||
"crates/collections",
|
"crates/collections",
|
||||||
"crates/command_palette",
|
"crates/command_palette",
|
||||||
"crates/command_palette_hooks",
|
"crates/command_palette_hooks",
|
||||||
"crates/component",
|
|
||||||
"crates/component_preview",
|
|
||||||
"crates/context_server",
|
"crates/context_server",
|
||||||
"crates/context_server_settings",
|
"crates/context_server_settings",
|
||||||
"crates/copilot",
|
"crates/copilot",
|
||||||
"crates/credentials_provider",
|
|
||||||
"crates/db",
|
"crates/db",
|
||||||
"crates/deepseek",
|
|
||||||
"crates/diagnostics",
|
"crates/diagnostics",
|
||||||
"crates/docs_preprocessor",
|
"crates/docs_preprocessor",
|
||||||
"crates/editor",
|
"crates/editor",
|
||||||
@@ -55,12 +45,10 @@ members = [
|
|||||||
"crates/fuzzy",
|
"crates/fuzzy",
|
||||||
"crates/git",
|
"crates/git",
|
||||||
"crates/git_hosting_providers",
|
"crates/git_hosting_providers",
|
||||||
"crates/git_ui",
|
|
||||||
"crates/go_to_line",
|
"crates/go_to_line",
|
||||||
"crates/google_ai",
|
"crates/google_ai",
|
||||||
"crates/gpui",
|
"crates/gpui",
|
||||||
"crates/gpui_macros",
|
"crates/gpui_macros",
|
||||||
"crates/gpui_tokio",
|
|
||||||
"crates/html_to_markdown",
|
"crates/html_to_markdown",
|
||||||
"crates/http_client",
|
"crates/http_client",
|
||||||
"crates/image_viewer",
|
"crates/image_viewer",
|
||||||
@@ -77,17 +65,14 @@ members = [
|
|||||||
"crates/language_selector",
|
"crates/language_selector",
|
||||||
"crates/language_tools",
|
"crates/language_tools",
|
||||||
"crates/languages",
|
"crates/languages",
|
||||||
"crates/livekit_api",
|
|
||||||
"crates/livekit_client",
|
"crates/livekit_client",
|
||||||
"crates/livekit_client_macos",
|
"crates/livekit_client_macos",
|
||||||
"crates/lmstudio",
|
"crates/livekit_server",
|
||||||
"crates/lsp",
|
"crates/lsp",
|
||||||
"crates/markdown",
|
"crates/markdown",
|
||||||
"crates/markdown_preview",
|
"crates/markdown_preview",
|
||||||
"crates/media",
|
"crates/media",
|
||||||
"crates/menu",
|
"crates/menu",
|
||||||
"crates/migrator",
|
|
||||||
"crates/mistral",
|
|
||||||
"crates/multi_buffer",
|
"crates/multi_buffer",
|
||||||
"crates/node_runtime",
|
"crates/node_runtime",
|
||||||
"crates/notifications",
|
"crates/notifications",
|
||||||
@@ -95,14 +80,12 @@ members = [
|
|||||||
"crates/open_ai",
|
"crates/open_ai",
|
||||||
"crates/outline",
|
"crates/outline",
|
||||||
"crates/outline_panel",
|
"crates/outline_panel",
|
||||||
"crates/panel",
|
|
||||||
"crates/paths",
|
"crates/paths",
|
||||||
"crates/picker",
|
"crates/picker",
|
||||||
"crates/prettier",
|
"crates/prettier",
|
||||||
"crates/project",
|
"crates/project",
|
||||||
"crates/project_panel",
|
"crates/project_panel",
|
||||||
"crates/project_symbols",
|
"crates/project_symbols",
|
||||||
"crates/prompt_library",
|
|
||||||
"crates/proto",
|
"crates/proto",
|
||||||
"crates/recent_projects",
|
"crates/recent_projects",
|
||||||
"crates/refineable",
|
"crates/refineable",
|
||||||
@@ -115,7 +98,6 @@ members = [
|
|||||||
"crates/rich_text",
|
"crates/rich_text",
|
||||||
"crates/rope",
|
"crates/rope",
|
||||||
"crates/rpc",
|
"crates/rpc",
|
||||||
"crates/schema_generator",
|
|
||||||
"crates/search",
|
"crates/search",
|
||||||
"crates/semantic_index",
|
"crates/semantic_index",
|
||||||
"crates/semantic_version",
|
"crates/semantic_version",
|
||||||
@@ -129,7 +111,6 @@ members = [
|
|||||||
"crates/sqlez_macros",
|
"crates/sqlez_macros",
|
||||||
"crates/story",
|
"crates/story",
|
||||||
"crates/storybook",
|
"crates/storybook",
|
||||||
"crates/streaming_diff",
|
|
||||||
"crates/sum_tree",
|
"crates/sum_tree",
|
||||||
"crates/supermaven",
|
"crates/supermaven",
|
||||||
"crates/supermaven_api",
|
"crates/supermaven_api",
|
||||||
@@ -151,8 +132,9 @@ members = [
|
|||||||
"crates/ui",
|
"crates/ui",
|
||||||
"crates/ui_input",
|
"crates/ui_input",
|
||||||
"crates/ui_macros",
|
"crates/ui_macros",
|
||||||
|
"crates/reqwest_client",
|
||||||
"crates/util",
|
"crates/util",
|
||||||
"crates/util_macros",
|
"crates/vcs_menu",
|
||||||
"crates/vim",
|
"crates/vim",
|
||||||
"crates/vim_mode_setting",
|
"crates/vim_mode_setting",
|
||||||
"crates/welcome",
|
"crates/welcome",
|
||||||
@@ -161,21 +143,27 @@ members = [
|
|||||||
"crates/zed",
|
"crates/zed",
|
||||||
"crates/zed_actions",
|
"crates/zed_actions",
|
||||||
"crates/zeta",
|
"crates/zeta",
|
||||||
|
"crates/git_ui",
|
||||||
|
|
||||||
#
|
#
|
||||||
# Extensions
|
# Extensions
|
||||||
#
|
#
|
||||||
|
|
||||||
|
"extensions/astro",
|
||||||
|
"extensions/clojure",
|
||||||
"extensions/csharp",
|
"extensions/csharp",
|
||||||
"extensions/deno",
|
"extensions/deno",
|
||||||
"extensions/elixir",
|
"extensions/elixir",
|
||||||
|
"extensions/elm",
|
||||||
"extensions/emmet",
|
"extensions/emmet",
|
||||||
"extensions/erlang",
|
"extensions/erlang",
|
||||||
"extensions/glsl",
|
"extensions/glsl",
|
||||||
"extensions/haskell",
|
"extensions/haskell",
|
||||||
"extensions/html",
|
"extensions/html",
|
||||||
"extensions/lua",
|
"extensions/lua",
|
||||||
|
"extensions/php",
|
||||||
"extensions/perplexity",
|
"extensions/perplexity",
|
||||||
|
"extensions/prisma",
|
||||||
"extensions/proto",
|
"extensions/proto",
|
||||||
"extensions/purescript",
|
"extensions/purescript",
|
||||||
"extensions/ruff",
|
"extensions/ruff",
|
||||||
@@ -195,10 +183,6 @@ members = [
|
|||||||
]
|
]
|
||||||
default-members = ["crates/zed"]
|
default-members = ["crates/zed"]
|
||||||
|
|
||||||
[workspace.package]
|
|
||||||
publish = false
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -211,17 +195,12 @@ anthropic = { path = "crates/anthropic" }
|
|||||||
assets = { path = "crates/assets" }
|
assets = { path = "crates/assets" }
|
||||||
assistant = { path = "crates/assistant" }
|
assistant = { path = "crates/assistant" }
|
||||||
assistant2 = { path = "crates/assistant2" }
|
assistant2 = { path = "crates/assistant2" }
|
||||||
assistant_context_editor = { path = "crates/assistant_context_editor" }
|
|
||||||
assistant_settings = { path = "crates/assistant_settings" }
|
|
||||||
assistant_slash_command = { path = "crates/assistant_slash_command" }
|
assistant_slash_command = { path = "crates/assistant_slash_command" }
|
||||||
assistant_slash_commands = { path = "crates/assistant_slash_commands" }
|
|
||||||
assistant_tool = { path = "crates/assistant_tool" }
|
assistant_tool = { path = "crates/assistant_tool" }
|
||||||
assistant_tools = { path = "crates/assistant_tools" }
|
assistant_tools = { path = "crates/assistant_tools" }
|
||||||
audio = { path = "crates/audio" }
|
audio = { path = "crates/audio" }
|
||||||
auto_update = { path = "crates/auto_update" }
|
auto_update = { path = "crates/auto_update" }
|
||||||
auto_update_ui = { path = "crates/auto_update_ui" }
|
auto_update_ui = { path = "crates/auto_update_ui" }
|
||||||
aws_http_client = { path = "crates/aws_http_client" }
|
|
||||||
bedrock = { path = "crates/bedrock" }
|
|
||||||
breadcrumbs = { path = "crates/breadcrumbs" }
|
breadcrumbs = { path = "crates/breadcrumbs" }
|
||||||
call = { path = "crates/call" }
|
call = { path = "crates/call" }
|
||||||
channel = { path = "crates/channel" }
|
channel = { path = "crates/channel" }
|
||||||
@@ -233,16 +212,11 @@ collab_ui = { path = "crates/collab_ui" }
|
|||||||
collections = { path = "crates/collections" }
|
collections = { path = "crates/collections" }
|
||||||
command_palette = { path = "crates/command_palette" }
|
command_palette = { path = "crates/command_palette" }
|
||||||
command_palette_hooks = { path = "crates/command_palette_hooks" }
|
command_palette_hooks = { path = "crates/command_palette_hooks" }
|
||||||
component = { path = "crates/component" }
|
|
||||||
component_preview = { path = "crates/component_preview" }
|
|
||||||
context_server = { path = "crates/context_server" }
|
context_server = { path = "crates/context_server" }
|
||||||
context_server_settings = { path = "crates/context_server_settings" }
|
context_server_settings = { path = "crates/context_server_settings" }
|
||||||
copilot = { path = "crates/copilot" }
|
copilot = { path = "crates/copilot" }
|
||||||
credentials_provider = { path = "crates/credentials_provider" }
|
|
||||||
db = { path = "crates/db" }
|
db = { path = "crates/db" }
|
||||||
deepseek = { path = "crates/deepseek" }
|
|
||||||
diagnostics = { path = "crates/diagnostics" }
|
diagnostics = { path = "crates/diagnostics" }
|
||||||
buffer_diff = { path = "crates/buffer_diff" }
|
|
||||||
editor = { path = "crates/editor" }
|
editor = { path = "crates/editor" }
|
||||||
extension = { path = "crates/extension" }
|
extension = { path = "crates/extension" }
|
||||||
extension_host = { path = "crates/extension_host" }
|
extension_host = { path = "crates/extension_host" }
|
||||||
@@ -255,15 +229,14 @@ fs = { path = "crates/fs" }
|
|||||||
fsevent = { path = "crates/fsevent" }
|
fsevent = { path = "crates/fsevent" }
|
||||||
fuzzy = { path = "crates/fuzzy" }
|
fuzzy = { path = "crates/fuzzy" }
|
||||||
git = { path = "crates/git" }
|
git = { path = "crates/git" }
|
||||||
git_hosting_providers = { path = "crates/git_hosting_providers" }
|
|
||||||
git_ui = { path = "crates/git_ui" }
|
git_ui = { path = "crates/git_ui" }
|
||||||
|
git_hosting_providers = { path = "crates/git_hosting_providers" }
|
||||||
go_to_line = { path = "crates/go_to_line" }
|
go_to_line = { path = "crates/go_to_line" }
|
||||||
google_ai = { path = "crates/google_ai" }
|
google_ai = { path = "crates/google_ai" }
|
||||||
gpui = { path = "crates/gpui", default-features = false, features = [
|
gpui = { path = "crates/gpui", default-features = false, features = [
|
||||||
"http_client",
|
"http_client",
|
||||||
] }
|
] }
|
||||||
gpui_macros = { path = "crates/gpui_macros" }
|
gpui_macros = { path = "crates/gpui_macros" }
|
||||||
gpui_tokio = { path = "crates/gpui_tokio" }
|
|
||||||
html_to_markdown = { path = "crates/html_to_markdown" }
|
html_to_markdown = { path = "crates/html_to_markdown" }
|
||||||
http_client = { path = "crates/http_client" }
|
http_client = { path = "crates/http_client" }
|
||||||
image_viewer = { path = "crates/image_viewer" }
|
image_viewer = { path = "crates/image_viewer" }
|
||||||
@@ -280,17 +253,14 @@ language_models = { path = "crates/language_models" }
|
|||||||
language_selector = { path = "crates/language_selector" }
|
language_selector = { path = "crates/language_selector" }
|
||||||
language_tools = { path = "crates/language_tools" }
|
language_tools = { path = "crates/language_tools" }
|
||||||
languages = { path = "crates/languages" }
|
languages = { path = "crates/languages" }
|
||||||
livekit_api = { path = "crates/livekit_api" }
|
|
||||||
livekit_client = { path = "crates/livekit_client" }
|
livekit_client = { path = "crates/livekit_client" }
|
||||||
livekit_client_macos = { path = "crates/livekit_client_macos" }
|
livekit_client_macos = { path = "crates/livekit_client_macos" }
|
||||||
lmstudio = { path = "crates/lmstudio" }
|
livekit_server = { path = "crates/livekit_server" }
|
||||||
lsp = { path = "crates/lsp" }
|
lsp = { path = "crates/lsp" }
|
||||||
markdown = { path = "crates/markdown" }
|
markdown = { path = "crates/markdown" }
|
||||||
markdown_preview = { path = "crates/markdown_preview" }
|
markdown_preview = { path = "crates/markdown_preview" }
|
||||||
media = { path = "crates/media" }
|
media = { path = "crates/media" }
|
||||||
menu = { path = "crates/menu" }
|
menu = { path = "crates/menu" }
|
||||||
migrator = { path = "crates/migrator" }
|
|
||||||
mistral = { path = "crates/mistral" }
|
|
||||||
multi_buffer = { path = "crates/multi_buffer" }
|
multi_buffer = { path = "crates/multi_buffer" }
|
||||||
node_runtime = { path = "crates/node_runtime" }
|
node_runtime = { path = "crates/node_runtime" }
|
||||||
notifications = { path = "crates/notifications" }
|
notifications = { path = "crates/notifications" }
|
||||||
@@ -299,7 +269,6 @@ open_ai = { path = "crates/open_ai" }
|
|||||||
outline = { path = "crates/outline" }
|
outline = { path = "crates/outline" }
|
||||||
outline_panel = { path = "crates/outline_panel" }
|
outline_panel = { path = "crates/outline_panel" }
|
||||||
paths = { path = "crates/paths" }
|
paths = { path = "crates/paths" }
|
||||||
panel = { path = "crates/panel" }
|
|
||||||
picker = { path = "crates/picker" }
|
picker = { path = "crates/picker" }
|
||||||
plugin = { path = "crates/plugin" }
|
plugin = { path = "crates/plugin" }
|
||||||
plugin_macros = { path = "crates/plugin_macros" }
|
plugin_macros = { path = "crates/plugin_macros" }
|
||||||
@@ -307,7 +276,6 @@ prettier = { path = "crates/prettier" }
|
|||||||
project = { path = "crates/project" }
|
project = { path = "crates/project" }
|
||||||
project_panel = { path = "crates/project_panel" }
|
project_panel = { path = "crates/project_panel" }
|
||||||
project_symbols = { path = "crates/project_symbols" }
|
project_symbols = { path = "crates/project_symbols" }
|
||||||
prompt_library = { path = "crates/prompt_library" }
|
|
||||||
proto = { path = "crates/proto" }
|
proto = { path = "crates/proto" }
|
||||||
recent_projects = { path = "crates/recent_projects" }
|
recent_projects = { path = "crates/recent_projects" }
|
||||||
refineable = { path = "crates/refineable" }
|
refineable = { path = "crates/refineable" }
|
||||||
@@ -332,7 +300,6 @@ sqlez = { path = "crates/sqlez" }
|
|||||||
sqlez_macros = { path = "crates/sqlez_macros" }
|
sqlez_macros = { path = "crates/sqlez_macros" }
|
||||||
story = { path = "crates/story" }
|
story = { path = "crates/story" }
|
||||||
storybook = { path = "crates/storybook" }
|
storybook = { path = "crates/storybook" }
|
||||||
streaming_diff = { path = "crates/streaming_diff" }
|
|
||||||
sum_tree = { path = "crates/sum_tree" }
|
sum_tree = { path = "crates/sum_tree" }
|
||||||
supermaven = { path = "crates/supermaven" }
|
supermaven = { path = "crates/supermaven" }
|
||||||
supermaven_api = { path = "crates/supermaven_api" }
|
supermaven_api = { path = "crates/supermaven_api" }
|
||||||
@@ -355,7 +322,7 @@ ui = { path = "crates/ui" }
|
|||||||
ui_input = { path = "crates/ui_input" }
|
ui_input = { path = "crates/ui_input" }
|
||||||
ui_macros = { path = "crates/ui_macros" }
|
ui_macros = { path = "crates/ui_macros" }
|
||||||
util = { path = "crates/util" }
|
util = { path = "crates/util" }
|
||||||
util_macros = { path = "crates/util_macros" }
|
vcs_menu = { path = "crates/vcs_menu" }
|
||||||
vim = { path = "crates/vim" }
|
vim = { path = "crates/vim" }
|
||||||
vim_mode_setting = { path = "crates/vim_mode_setting" }
|
vim_mode_setting = { path = "crates/vim_mode_setting" }
|
||||||
welcome = { path = "crates/welcome" }
|
welcome = { path = "crates/welcome" }
|
||||||
@@ -370,15 +337,15 @@ zeta = { path = "crates/zeta" }
|
|||||||
#
|
#
|
||||||
|
|
||||||
aho-corasick = "1.1"
|
aho-corasick = "1.1"
|
||||||
alacritty_terminal = { git = "https://github.com/zed-industries/alacritty.git", rev = "03c2907b44b4189aac5fdeaea331f5aab5c7072e" }
|
alacritty_terminal = { git = "https://github.com/alacritty/alacritty", rev = "91d034ff8b53867143c005acfaa14609147c9a2c" }
|
||||||
any_vec = "0.14"
|
any_vec = "0.14"
|
||||||
anyhow = "1.0.86"
|
anyhow = "1.0.86"
|
||||||
arrayvec = { version = "0.7.4", features = ["serde"] }
|
arrayvec = { version = "0.7.4", features = ["serde"] }
|
||||||
ashpd = { version = "0.11", default-features = false, features = ["async-std"] }
|
ashpd = { version = "0.10", default-features = false, features = ["async-std"]}
|
||||||
async-compat = "0.2.1"
|
async-compat = "0.2.1"
|
||||||
async-compression = { version = "0.4", features = ["gzip", "futures-io"] }
|
async-compression = { version = "0.4", features = ["gzip", "futures-io"] }
|
||||||
async-dispatcher = "0.1"
|
async-dispatcher = "0.1"
|
||||||
async-fs = "2.1"
|
async-fs = "1.6"
|
||||||
async-pipe = { git = "https://github.com/zed-industries/async-pipe-rs", rev = "82d00a04211cf4e1236029aa03e6b6ce2a74c553" }
|
async-pipe = { git = "https://github.com/zed-industries/async-pipe-rs", rev = "82d00a04211cf4e1236029aa03e6b6ce2a74c553" }
|
||||||
async-recursion = "1.0.0"
|
async-recursion = "1.0.0"
|
||||||
async-tar = "0.5.0"
|
async-tar = "0.5.0"
|
||||||
@@ -386,29 +353,23 @@ async-trait = "0.1"
|
|||||||
async-tungstenite = "0.28"
|
async-tungstenite = "0.28"
|
||||||
async-watch = "0.3.1"
|
async-watch = "0.3.1"
|
||||||
async_zip = { version = "0.0.17", features = ["deflate", "deflate64"] }
|
async_zip = { version = "0.0.17", features = ["deflate", "deflate64"] }
|
||||||
aws-config = { version = "1.5.16", features = ["behavior-version-latest"] }
|
|
||||||
aws-credential-types = { version = "1.2.1", features = ["hardcoded-credentials"] }
|
|
||||||
aws-sdk-bedrockruntime = { version = "1.73.0", features = ["behavior-version-latest"] }
|
|
||||||
aws-smithy-runtime-api = { version = "1.7.3", features = ["http-1x", "client"] }
|
|
||||||
aws-smithy-types = { version = "1.2.13", features = ["http-body-1-x"] }
|
|
||||||
base64 = "0.22"
|
base64 = "0.22"
|
||||||
bitflags = "2.6.0"
|
bitflags = "2.6.0"
|
||||||
blade-graphics = { git = "https://github.com/kvark/blade", rev = "b16f5c7bd873c7126f48c82c39e7ae64602ae74f" }
|
blade-graphics = { git = "https://github.com/kvark/blade", rev = "e142a3a5e678eb6a13e642ad8401b1f3aa38e969" }
|
||||||
blade-macros = { git = "https://github.com/kvark/blade", rev = "b16f5c7bd873c7126f48c82c39e7ae64602ae74f" }
|
blade-macros = { git = "https://github.com/kvark/blade", rev = "e142a3a5e678eb6a13e642ad8401b1f3aa38e969" }
|
||||||
blade-util = { git = "https://github.com/kvark/blade", rev = "b16f5c7bd873c7126f48c82c39e7ae64602ae74f" }
|
blade-util = { git = "https://github.com/kvark/blade", rev = "e142a3a5e678eb6a13e642ad8401b1f3aa38e969" }
|
||||||
naga = { version = "23.1.0", features = ["wgsl-in"] }
|
|
||||||
blake3 = "1.5.3"
|
blake3 = "1.5.3"
|
||||||
bytes = "1.0"
|
bytes = "1.0"
|
||||||
cargo_metadata = "0.19"
|
cargo_metadata = "0.19"
|
||||||
cargo_toml = "0.21"
|
cargo_toml = "0.20"
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
clap = { version = "4.4", features = ["derive"] }
|
clap = { version = "4.4", features = ["derive"] }
|
||||||
cocoa = "0.26"
|
cocoa = "0.26"
|
||||||
cocoa-foundation = "0.2.0"
|
cocoa-foundation = "0.2.0"
|
||||||
convert_case = "0.8.0"
|
convert_case = "0.6.0"
|
||||||
core-foundation = "0.9.3"
|
core-foundation = "0.9.3"
|
||||||
core-foundation-sys = "0.8.6"
|
core-foundation-sys = "0.8.6"
|
||||||
ctor = "0.4.0"
|
ctor = "0.2.6"
|
||||||
dashmap = "6.0"
|
dashmap = "6.0"
|
||||||
derive_more = "0.99.17"
|
derive_more = "0.99.17"
|
||||||
dirs = "4.0"
|
dirs = "4.0"
|
||||||
@@ -421,60 +382,50 @@ fork = "0.2.0"
|
|||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
futures-batch = "0.6.1"
|
futures-batch = "0.6.1"
|
||||||
futures-lite = "1.13"
|
futures-lite = "1.13"
|
||||||
# TODO: get back to regular versions when https://github.com/rust-lang/git2-rs/pull/1120 is released
|
git2 = { version = "0.19", default-features = false }
|
||||||
git2 = { git = "https://github.com/rust-lang/git2-rs", rev = "a3b90cb3756c1bb63e2317bf9cfa57838178de5c", default-features = false }
|
|
||||||
globset = "0.4"
|
globset = "0.4"
|
||||||
handlebars = "4.3"
|
handlebars = "4.3"
|
||||||
heed = { version = "0.21.0", features = ["read-txn-no-tls"] }
|
heed = { version = "0.20.1", features = ["read-txn-no-tls"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
html5ever = "0.27.0"
|
html5ever = "0.27.0"
|
||||||
hyper = "0.14"
|
hyper = "0.14"
|
||||||
http = "1.1"
|
http = "1.1"
|
||||||
ignore = "0.4.22"
|
ignore = "0.4.22"
|
||||||
image = "0.25.1"
|
image = "0.25.1"
|
||||||
imara-diff = "0.1.8"
|
indexmap = { version = "1.6.2", features = ["serde"] }
|
||||||
indexmap = { version = "2.7.0", features = ["serde"] }
|
|
||||||
indoc = "2"
|
indoc = "2"
|
||||||
inventory = "0.3.19"
|
itertools = "0.13.0"
|
||||||
itertools = "0.14.0"
|
|
||||||
jsonwebtoken = "9.3"
|
jsonwebtoken = "9.3"
|
||||||
jupyter-protocol = { version = "0.6.0" }
|
jupyter-protocol = { version = "0.5.0" }
|
||||||
jupyter-websocket-client = { version = "0.9.0" }
|
jupyter-websocket-client = { version = "0.8.0" }
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
libsqlite3-sys = { version = "0.30.1", features = ["bundled"] }
|
libsqlite3-sys = { version = "0.30.1", features = ["bundled"] }
|
||||||
linkify = "0.10.0"
|
linkify = "0.10.0"
|
||||||
linkme = "0.3.31"
|
livekit = { git = "https://github.com/zed-industries/rust-sdks", rev="799f10133d93ba2a88642cd480d01ec4da53408c", features = ["dispatcher", "services-dispatcher", "rustls-tls-native-roots"], default-features = false }
|
||||||
livekit = { git = "https://github.com/zed-industries/livekit-rust-sdks", rev = "811ceae29fabee455f110c56cd66b3f49a7e5003", features = [
|
|
||||||
"dispatcher",
|
|
||||||
"services-dispatcher",
|
|
||||||
"rustls-tls-native-roots",
|
|
||||||
], default-features = false }
|
|
||||||
log = { version = "0.4.16", features = ["kv_unstable_serde", "serde"] }
|
log = { version = "0.4.16", features = ["kv_unstable_serde", "serde"] }
|
||||||
markup5ever_rcdom = "0.3.0"
|
markup5ever_rcdom = "0.3.0"
|
||||||
nanoid = "0.4"
|
nanoid = "0.4"
|
||||||
nbformat = { version = "0.10.0" }
|
nbformat = { version = "0.9.0" }
|
||||||
nix = "0.29"
|
nix = "0.29"
|
||||||
num-format = "0.4.4"
|
num-format = "0.4.4"
|
||||||
|
once_cell = "1.19.0"
|
||||||
ordered-float = "2.1.1"
|
ordered-float = "2.1.1"
|
||||||
palette = { version = "0.7.5", default-features = false, features = ["std"] }
|
palette = { version = "0.7.5", default-features = false, features = ["std"] }
|
||||||
parking_lot = "0.12.1"
|
parking_lot = "0.12.1"
|
||||||
pathdiff = "0.2"
|
pathdiff = "0.2"
|
||||||
pet = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
pet = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "ffcbf3f28c46633abd5448a52b1f396c322e0d6c" }
|
||||||
pet-fs = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
pet-fs = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "ffcbf3f28c46633abd5448a52b1f396c322e0d6c" }
|
||||||
pet-pixi = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
pet-conda = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "ffcbf3f28c46633abd5448a52b1f396c322e0d6c" }
|
||||||
pet-conda = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
pet-core = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "ffcbf3f28c46633abd5448a52b1f396c322e0d6c" }
|
||||||
pet-core = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
pet-poetry = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "ffcbf3f28c46633abd5448a52b1f396c322e0d6c" }
|
||||||
pet-poetry = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
pet-reporter = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "ffcbf3f28c46633abd5448a52b1f396c322e0d6c" }
|
||||||
pet-reporter = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "1abe5cec5ebfbe97ca71746a4cfc7fe89bddf8e0" }
|
|
||||||
postage = { version = "0.5", features = ["futures-traits"] }
|
postage = { version = "0.5", features = ["futures-traits"] }
|
||||||
pretty_assertions = { version = "1.3.0", features = ["unstable"] }
|
pretty_assertions = { version = "1.3.0", features = ["unstable"] }
|
||||||
proc-macro2 = "1.0.93"
|
|
||||||
profiling = "1"
|
profiling = "1"
|
||||||
prost = "0.9"
|
prost = "0.9"
|
||||||
prost-build = "0.9"
|
prost-build = "0.9"
|
||||||
prost-types = "0.9"
|
prost-types = "0.9"
|
||||||
pulldown-cmark = { version = "0.12.0", default-features = false }
|
pulldown-cmark = { version = "0.12.0", default-features = false }
|
||||||
quote = "1.0.9"
|
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
rayon = "1.8"
|
rayon = "1.8"
|
||||||
regex = "1.5"
|
regex = "1.5"
|
||||||
@@ -488,15 +439,14 @@ reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "fd110f
|
|||||||
"stream",
|
"stream",
|
||||||
] }
|
] }
|
||||||
rsa = "0.9.6"
|
rsa = "0.9.6"
|
||||||
runtimelib = { version = "0.25.0", default-features = false, features = [
|
runtimelib = { version = "0.24.0", default-features = false, features = [
|
||||||
"async-dispatcher-runtime",
|
"async-dispatcher-runtime",
|
||||||
] }
|
] }
|
||||||
rustc-demangle = "0.1.23"
|
rustc-demangle = "0.1.23"
|
||||||
rust-embed = { version = "8.4", features = ["include-exclude"] }
|
rust-embed = { version = "8.4", features = ["include-exclude"] }
|
||||||
rustc-hash = "2.1.0"
|
rustls = "0.21.12"
|
||||||
rustls = { version = "0.23.22" }
|
rustls-native-certs = "0.8.0"
|
||||||
rustls-platform-verifier = "0.5.0"
|
schemars = { version = "0.8", features = ["impl_json_schema"] }
|
||||||
schemars = { version = "0.8", features = ["impl_json_schema", "indexmap2"] }
|
|
||||||
semver = "1.0"
|
semver = "1.0"
|
||||||
serde = { version = "1.0", features = ["derive", "rc"] }
|
serde = { version = "1.0", features = ["derive", "rc"] }
|
||||||
serde_derive = { version = "1.0", features = ["deserialize_in_place"] }
|
serde_derive = { version = "1.0", features = ["deserialize_in_place"] }
|
||||||
@@ -510,21 +460,19 @@ sha2 = "0.10"
|
|||||||
shellexpand = "2.1.0"
|
shellexpand = "2.1.0"
|
||||||
shlex = "1.3.0"
|
shlex = "1.3.0"
|
||||||
signal-hook = "0.3.17"
|
signal-hook = "0.3.17"
|
||||||
|
similar = "1.3"
|
||||||
simplelog = "0.12.2"
|
simplelog = "0.12.2"
|
||||||
smallvec = { version = "1.6", features = ["union"] }
|
smallvec = { version = "1.6", features = ["union"] }
|
||||||
smol = "2.0"
|
smol = "1.2"
|
||||||
sqlformat = "0.2"
|
sqlformat = "0.2"
|
||||||
streaming-iterator = "0.1"
|
|
||||||
strsim = "0.11"
|
strsim = "0.11"
|
||||||
strum = { version = "0.26.0", features = ["derive"] }
|
strum = { version = "0.25.0", features = ["derive"] }
|
||||||
subtle = "2.5.0"
|
subtle = "2.5.0"
|
||||||
syn = { version = "1.0.72", features = ["full", "extra-traits"] }
|
|
||||||
sys-locale = "0.3.1"
|
sys-locale = "0.3.1"
|
||||||
sysinfo = "0.31.0"
|
sysinfo = "0.31.0"
|
||||||
take-until = "0.2.0"
|
|
||||||
tempfile = "3.9.0"
|
tempfile = "3.9.0"
|
||||||
thiserror = "1.0.29"
|
thiserror = "1.0.29"
|
||||||
tiktoken-rs = "0.6.0"
|
tiktoken-rs = "0.5.9"
|
||||||
time = { version = "0.3", features = [
|
time = { version = "0.3", features = [
|
||||||
"macros",
|
"macros",
|
||||||
"parsing",
|
"parsing",
|
||||||
@@ -536,50 +484,47 @@ tiny_http = "0.8"
|
|||||||
toml = "0.8"
|
toml = "0.8"
|
||||||
tokio = { version = "1" }
|
tokio = { version = "1" }
|
||||||
tower-http = "0.4.4"
|
tower-http = "0.4.4"
|
||||||
tree-sitter = { version = "0.25.2", features = ["wasm"] }
|
tree-sitter = { version = "0.23", features = ["wasm"] }
|
||||||
tree-sitter-bash = "0.23"
|
tree-sitter-bash = "0.23"
|
||||||
tree-sitter-c = "0.23"
|
tree-sitter-c = "0.23"
|
||||||
tree-sitter-cpp = "0.23"
|
tree-sitter-cpp = "0.23"
|
||||||
tree-sitter-css = "0.23"
|
tree-sitter-css = "0.23"
|
||||||
tree-sitter-elixir = "0.3"
|
tree-sitter-elixir = "0.3"
|
||||||
tree-sitter-embedded-template = "0.23.0"
|
tree-sitter-embedded-template = "0.23.0"
|
||||||
tree-sitter-gitcommit = { git = "https://github.com/zed-industries/tree-sitter-git-commit", rev = "88309716a69dd13ab83443721ba6e0b491d37ee9" }
|
|
||||||
tree-sitter-go = "0.23"
|
tree-sitter-go = "0.23"
|
||||||
tree-sitter-go-mod = { git = "https://github.com/camdencheek/tree-sitter-go-mod", rev = "6efb59652d30e0e9cd5f3b3a669afd6f1a926d3c", package = "tree-sitter-gomod" }
|
tree-sitter-go-mod = { git = "https://github.com/zed-industries/tree-sitter-go-mod", rev = "a9aea5e358cde4d0f8ff20b7bc4fa311e359c7ca", package = "tree-sitter-gomod" }
|
||||||
tree-sitter-gowork = { git = "https://github.com/zed-industries/tree-sitter-go-work", rev = "acb0617bf7f4fda02c6217676cc64acb89536dc7" }
|
tree-sitter-gowork = { git = "https://github.com/zed-industries/tree-sitter-go-work", rev = "acb0617bf7f4fda02c6217676cc64acb89536dc7" }
|
||||||
tree-sitter-heex = { git = "https://github.com/zed-industries/tree-sitter-heex", rev = "1dd45142fbb05562e35b2040c6129c9bca346592" }
|
tree-sitter-heex = { git = "https://github.com/zed-industries/tree-sitter-heex", rev = "1dd45142fbb05562e35b2040c6129c9bca346592" }
|
||||||
tree-sitter-diff = "0.1.0"
|
tree-sitter-diff = "0.1.0"
|
||||||
tree-sitter-html = "0.23"
|
tree-sitter-html = "0.20"
|
||||||
tree-sitter-jsdoc = "0.23"
|
tree-sitter-jsdoc = "0.23"
|
||||||
tree-sitter-json = "0.24"
|
tree-sitter-json = "0.23"
|
||||||
tree-sitter-md = { git = "https://github.com/tree-sitter-grammars/tree-sitter-markdown", rev = "9a23c1a96c0513d8fc6520972beedd419a973539" }
|
tree-sitter-md = { git = "https://github.com/tree-sitter-grammars/tree-sitter-markdown", rev = "9a23c1a96c0513d8fc6520972beedd419a973539" }
|
||||||
tree-sitter-python = "0.23"
|
tree-sitter-python = "0.23"
|
||||||
tree-sitter-regex = "0.24"
|
tree-sitter-regex = "0.23"
|
||||||
tree-sitter-ruby = "0.23"
|
tree-sitter-ruby = "0.23"
|
||||||
tree-sitter-rust = "0.23"
|
tree-sitter-rust = "0.23"
|
||||||
tree-sitter-typescript = "0.23"
|
tree-sitter-typescript = "0.23"
|
||||||
tree-sitter-yaml = { git = "https://github.com/zed-industries/tree-sitter-yaml", rev = "baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a" }
|
tree-sitter-yaml = { git = "https://github.com/zed-industries/tree-sitter-yaml", rev = "baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a" }
|
||||||
unicase = "2.6"
|
unicase = "2.6"
|
||||||
unindent = "0.2.0"
|
unindent = "0.1.7"
|
||||||
unicode-segmentation = "1.10"
|
unicode-segmentation = "1.10"
|
||||||
unicode-script = "0.5.7"
|
unicode-script = "0.5.7"
|
||||||
url = "2.2"
|
url = "2.2"
|
||||||
uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] }
|
uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] }
|
||||||
wasmparser = "0.221"
|
wasmparser = "0.215"
|
||||||
wasm-encoder = "0.221"
|
wasm-encoder = "0.215"
|
||||||
wasmtime = { version = "29", default-features = false, features = [
|
wasmtime = { version = "24", default-features = false, features = [
|
||||||
"async",
|
"async",
|
||||||
"demangle",
|
"demangle",
|
||||||
"runtime",
|
"runtime",
|
||||||
"cranelift",
|
"cranelift",
|
||||||
"component-model",
|
"component-model",
|
||||||
] }
|
] }
|
||||||
wasmtime-wasi = "29"
|
wasmtime-wasi = "24"
|
||||||
which = "6.0.0"
|
which = "6.0.0"
|
||||||
wit-component = "0.221"
|
wit-component = "0.201"
|
||||||
zed_llm_client = "0.4"
|
|
||||||
zstd = "0.11"
|
zstd = "0.11"
|
||||||
metal = "0.31"
|
|
||||||
|
|
||||||
[workspace.dependencies.async-stripe]
|
[workspace.dependencies.async-stripe]
|
||||||
git = "https://github.com/zed-industries/async-stripe"
|
git = "https://github.com/zed-industries/async-stripe"
|
||||||
@@ -618,7 +563,6 @@ features = [
|
|||||||
"Win32_Storage_FileSystem",
|
"Win32_Storage_FileSystem",
|
||||||
"Win32_System_Com",
|
"Win32_System_Com",
|
||||||
"Win32_System_Com_StructuredStorage",
|
"Win32_System_Com_StructuredStorage",
|
||||||
"Win32_System_Console",
|
|
||||||
"Win32_System_DataExchange",
|
"Win32_System_DataExchange",
|
||||||
"Win32_System_LibraryLoader",
|
"Win32_System_LibraryLoader",
|
||||||
"Win32_System_Memory",
|
"Win32_System_Memory",
|
||||||
@@ -639,7 +583,6 @@ features = [
|
|||||||
# TODO livekit https://github.com/RustAudio/cpal/pull/891
|
# TODO livekit https://github.com/RustAudio/cpal/pull/891
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
cpal = { git = "https://github.com/zed-industries/cpal", rev = "fd8bc2fd39f1f5fdee5a0690656caff9a26d9d50" }
|
cpal = { git = "https://github.com/zed-industries/cpal", rev = "fd8bc2fd39f1f5fdee5a0690656caff9a26d9d50" }
|
||||||
real-async-tls = { git = "https://github.com/zed-industries/async-tls", rev = "1e759a4b5e370f87dc15e40756ac4f8815b61d9d", package = "async-tls" }
|
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
split-debuginfo = "unpacked"
|
split-debuginfo = "unpacked"
|
||||||
@@ -670,7 +613,6 @@ image_viewer = { codegen-units = 1 }
|
|||||||
inline_completion_button = { codegen-units = 1 }
|
inline_completion_button = { codegen-units = 1 }
|
||||||
install_cli = { codegen-units = 1 }
|
install_cli = { codegen-units = 1 }
|
||||||
journal = { codegen-units = 1 }
|
journal = { codegen-units = 1 }
|
||||||
lmstudio = { codegen-units = 1 }
|
|
||||||
menu = { codegen-units = 1 }
|
menu = { codegen-units = 1 }
|
||||||
notifications = { codegen-units = 1 }
|
notifications = { codegen-units = 1 }
|
||||||
ollama = { codegen-units = 1 }
|
ollama = { codegen-units = 1 }
|
||||||
@@ -693,6 +635,7 @@ telemetry_events = { codegen-units = 1 }
|
|||||||
theme_selector = { codegen-units = 1 }
|
theme_selector = { codegen-units = 1 }
|
||||||
time_format = { codegen-units = 1 }
|
time_format = { codegen-units = 1 }
|
||||||
ui_input = { codegen-units = 1 }
|
ui_input = { codegen-units = 1 }
|
||||||
|
vcs_menu = { codegen-units = 1 }
|
||||||
zed_actions = { codegen-units = 1 }
|
zed_actions = { codegen-units = 1 }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
@@ -709,9 +652,6 @@ debug = "full"
|
|||||||
lto = false
|
lto = false
|
||||||
codegen-units = 16
|
codegen-units = 16
|
||||||
|
|
||||||
[workspace.lints.rust]
|
|
||||||
unexpected_cfgs = { level = "allow" }
|
|
||||||
|
|
||||||
[workspace.lints.clippy]
|
[workspace.lints.clippy]
|
||||||
dbg_macro = "deny"
|
dbg_macro = "deny"
|
||||||
todo = "deny"
|
todo = "deny"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright 2022 - 2025 Zed Industries, Inc.
|
Copyright 2022 - 2024 Zed Industries, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright 2022 - 2025 Zed Industries, Inc.
|
Copyright 2022 - 2024 Zed Industries, Inc.
|
||||||
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="283.6413 127.3453 56 55.9999" width="16px" height="16px">
|
|
||||||
<path d="M 808.592 158.131 C 807.489 158.131 806.592 157.234 806.592 156.131 C 806.592 155.028 807.489 154.131 808.592 154.131 C 809.695 154.131 810.592 155.028 810.592 156.131 C 810.592 157.234 809.695 158.131 808.592 158.131 Z M 776.705 185.039 L 773.457 183.145 L 780.122 178.979 L 779.062 177.283 L 771.505 182.006 L 765.592 178.557 L 765.592 169.666 L 771.147 165.963 L 770.037 164.299 L 764.551 167.956 L 758.592 164.551 L 758.592 159.711 L 765.088 155.999 L 764.096 154.263 L 758.592 157.408 L 758.592 153.711 L 764.592 150.283 L 770.592 153.711 L 770.592 157.565 L 766.077 160.274 L 767.107 161.988 L 771.592 159.297 L 776.077 161.988 L 777.107 160.274 L 772.592 157.565 L 772.592 153.666 L 778.147 149.963 C 778.425 149.777 778.592 149.465 778.592 149.131 L 778.592 142.131 L 776.592 142.131 L 776.592 148.596 L 771.551 151.956 L 765.592 148.551 L 765.592 139.705 L 770.592 136.789 L 770.592 145.131 L 772.592 145.131 L 772.592 135.622 L 776.705 133.223 L 784.592 135.852 L 784.592 164.565 L 770.077 173.274 L 771.107 174.988 L 784.592 166.897 L 784.592 182.41 L 776.705 185.039 Z M 806.592 169.131 C 806.592 170.234 805.695 171.131 804.592 171.131 C 803.489 171.131 802.592 170.234 802.592 169.131 C 802.592 168.028 803.489 167.131 804.592 167.131 C 805.695 167.131 806.592 168.028 806.592 169.131 Z M 796.592 179.131 C 796.592 180.234 795.695 181.131 794.592 181.131 C 793.489 181.131 792.592 180.234 792.592 179.131 C 792.592 178.028 793.489 177.131 794.592 177.131 C 795.695 177.131 796.592 178.028 796.592 179.131 Z M 795.592 139.131 C 795.592 138.028 796.489 137.131 797.592 137.131 C 798.695 137.131 799.592 138.028 799.592 139.131 C 799.592 140.234 798.695 141.131 797.592 141.131 C 796.489 141.131 795.592 140.234 795.592 139.131 Z M 808.592 152.131 C 806.733 152.131 805.181 153.411 804.734 155.131 L 786.592 155.131 L 786.592 150.131 L 797.592 150.131 C 798.145 150.131 798.592 149.683 798.592 149.131 L 798.592 142.989 C 800.312 142.542 801.592 140.989 801.592 139.131 C 801.592 136.925 799.798 135.131 797.592 135.131 C 795.386 135.131 793.592 136.925 793.592 139.131 C 793.592 140.989 794.872 142.542 796.592 142.989 L 796.592 148.131 L 786.592 148.131 L 786.592 135.131 C 786.592 134.7 786.317 134.319 785.908 134.182 L 776.908 131.182 C 776.634 131.092 776.336 131.122 776.088 131.267 L 764.088 138.267 C 763.78 138.446 763.592 138.776 763.592 139.131 L 763.592 148.551 L 757.096 152.263 C 756.784 152.441 756.592 152.772 756.592 153.131 L 756.592 165.131 C 756.592 165.49 756.784 165.821 757.096 165.999 L 763.592 169.711 L 763.592 179.131 C 763.592 179.486 763.78 179.816 764.088 179.995 L 776.088 186.995 C 776.242 187.085 776.417 187.131 776.592 187.131 C 776.698 187.131 776.805 187.114 776.908 187.08 L 785.908 184.08 C 786.317 183.943 786.592 183.562 786.592 183.131 L 786.592 171.131 L 793.592 171.131 L 793.592 175.273 C 791.872 175.72 790.592 177.273 790.592 179.131 C 790.592 181.337 792.386 183.131 794.592 183.131 C 796.798 183.131 798.592 181.337 798.592 179.131 C 798.592 177.273 797.312 175.72 795.592 175.273 L 795.592 170.131 C 795.592 169.579 795.145 169.131 794.592 169.131 L 786.592 169.131 L 786.592 164.131 L 799.092 164.131 L 801.23 166.981 C 800.831 167.603 800.592 168.338 800.592 169.131 C 800.592 171.337 802.386 173.131 804.592 173.131 C 806.798 173.131 808.592 171.337 808.592 169.131 C 808.592 166.925 806.798 165.131 804.592 165.131 C 803.908 165.131 803.274 165.319 802.711 165.623 L 800.392 162.531 C 800.203 162.279 799.906 162.131 799.592 162.131 L 786.592 162.131 L 786.592 157.131 L 804.734 157.131 C 805.181 158.851 806.733 160.131 808.592 160.131 C 810.798 160.131 812.592 158.337 812.592 156.131 C 812.592 153.925 810.798 152.131 808.592 152.131 Z" fill-rule="evenodd" fill-opacity="1" style="" id="object-0" transform="matrix(1, 0, 0, 1, -472.9506530761719, -3.7858259677886963)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.9 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="black"></path></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>Artboard</title>
|
|
||||||
<g id="Artboard" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<rect id="Rectangle" stroke="black" stroke-width="1.26" x="1.22" y="1.22" width="13.56" height="13.56" rx="2.66"></rect>
|
|
||||||
<g id="Group-7" transform="translate(2.44, 3.03)" fill="black">
|
|
||||||
<g id="Group" transform="translate(0.37, 0)">
|
|
||||||
<rect id="Rectangle" opacity="0.487118676" x="1.9" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
<rect id="Rectangle" opacity="0.845098586" x="0" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
</g>
|
|
||||||
<g id="Group-2" transform="translate(2.88, 1.7)">
|
|
||||||
<rect id="Rectangle" opacity="0.487118676" x="1.9" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
<rect id="Rectangle" opacity="0.845098586" x="0" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
</g>
|
|
||||||
<g id="Group-3" transform="translate(1.53, 3.38)">
|
|
||||||
<rect id="Rectangle" opacity="0.487118676" x="1.92" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
<rect id="Rectangle" opacity="0.845098586" x="0" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
</g>
|
|
||||||
<g id="Group-4" transform="translate(0, 5.09)">
|
|
||||||
<rect id="Rectangle" opacity="0.487118676" x="1.9" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
<rect id="Rectangle" opacity="0.845098586" x="0" y="0" width="6.28" height="1.43" rx="0.71"></rect>
|
|
||||||
</g>
|
|
||||||
<g id="Group-5" transform="translate(1.64, 6.77)">
|
|
||||||
<rect id="Rectangle" opacity="0.487118676" x="1.94" y="0" width="5.46" height="1.43" rx="0.71"></rect>
|
|
||||||
<rect id="Rectangle" opacity="0.845098586" x="0" y="0" width="5.46" height="1.43" rx="0.71"></rect>
|
|
||||||
</g>
|
|
||||||
<g id="Group-6" transform="translate(4.24, 8.47)">
|
|
||||||
<rect id="Rectangle" opacity="0.487118676" x="2.11" y="0" width="4.56" height="1.43" rx="0.71"></rect>
|
|
||||||
<rect id="Rectangle" opacity="0.845098586" x="0" y="0" width="4.56" height="1.43" rx="0.71"></rect>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Mistral</title><g><path d="M15 6v4h-2V6h2zm4-4v4h-2V2h2zM3 2H1h2zM1 2h2v20H1V2zm8 12h2v4H9v-4zm8 0h2v8h-2v-8z"></path><path d="M19 2h4v4h-4V2zM3 2h4v4H3V2z" opacity=".4"></path><path d="M15 10V6h8v4h-8zM3 10V6h8v4H3z" opacity=".5"></path><path d="M3 14v-4h20v4z" opacity=".6"></path><path d="M11 14h4v4h-4v-4zm8 0h4v4h-4v-4zM3 14h4v4H3v-4z" opacity=".7"></path><path d="M19 18h4v4h-4v-4zM3 18h4v4H3v-4z" opacity=".8"></path></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 598 B |
@@ -1 +0,0 @@
|
|||||||
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="7.25" cy="7.25" r="3" fill="currentColor"></circle></svg>
|
|
||||||
|
Before Width: | Height: | Size: 165 B |
@@ -1,4 +1 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>
|
||||||
<path d="M18.4286 9H10.5714C9.70355 9 9 9.70355 9 10.5714V18.4286C9 19.2964 9.70355 20 10.5714 20H18.4286C19.2964 20 20 19.2964 20 18.4286V10.5714C20 9.70355 19.2964 9 18.4286 9Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M5.57143 15C4.70714 15 4 14.2929 4 13.4286V5.57143C4 4.70714 4.70714 4 5.57143 4H13.4286C14.2929 4 15 4.70714 15 5.57143" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 576 B After Width: | Height: | Size: 338 B |
@@ -1,4 +1,8 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M10.0001 1.33334H4.00008C3.64646 1.33334 3.30732 1.47382 3.05727 1.72387C2.80722 1.97392 2.66675 2.31305 2.66675 2.66668V13.3333C2.66675 13.687 2.80722 14.0261 3.05727 14.2762C3.30732 14.5262 3.64646 14.6667 4.00008 14.6667H12.0001C12.3537 14.6667 12.6928 14.5262 12.9429 14.2762C13.1929 14.0261 13.3334 13.687 13.3334 13.3333V4.66668L10.0001 1.33334Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path
|
||||||
<path d="M9.33325 1.33334V4.00001C9.33325 4.35363 9.47373 4.69277 9.72378 4.94282C9.97383 5.19287 10.313 5.33334 10.6666 5.33334H13.3333" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M3.5 2C3.22386 2 3 2.22386 3 2.5V12.5C3 12.7761 3.22386 13 3.5 13H11.5C11.7761 13 12 12.7761 12 12.5V6H8.5C8.22386 6 8 5.77614 8 5.5V2H3.5ZM9 2.70711L11.2929 5H9V2.70711ZM2 2.5C2 1.67157 2.67157 1 3.5 1H8.5C8.63261 1 8.75979 1.05268 8.85355 1.14645L12.8536 5.14645C12.9473 5.24021 13 5.36739 13 5.5V12.5C13 13.3284 12.3284 14 11.5 14H3.5C2.67157 14 2 13.3284 2 12.5V2.5Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 769 B After Width: | Height: | Size: 567 B |
@@ -1,3 +1,3 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.58 2H2.5V12.08C2.5 12.5892 2.70229 13.0776 3.06235 13.4376C3.42242 13.7977 3.91078 14 4.42 14H12.58C13.0892 14 13.5776 13.7977 13.9376 13.4376C14.2977 13.0776 14.5 12.5892 14.5 12.08V3.92C14.5 3.41078 14.2977 2.92242 13.9376 2.56235C13.5776 2.20229 13.0892 2 12.58 2ZM3.358 11.6285C3.34615 12.6668 3.96437 13.2311 4.96636 13.232H4.96621C6.06429 13.2456 6.70951 12.4798 6.63088 11.3867H5.48085C5.4899 11.601 5.47243 11.8974 5.36026 12.0313C5.27992 12.1441 5.16183 12.2005 5.00645 12.2005C4.67402 12.1952 4.50788 11.9534 4.50788 11.4753V9.19488C4.50788 8.94247 4.54407 8.75168 4.61645 8.62283C4.73423 8.38524 5.17961 8.3584 5.34825 8.58663C5.47804 8.71252 5.48974 9.04683 5.48101 9.26757H6.63104C6.66099 8.70582 6.53494 8.10381 6.20079 7.80913C5.65853 7.23521 4.37403 7.26765 3.82039 7.80102C3.51213 8.07495 3.358 8.47525 3.358 9.00159V11.6285ZM7.04116 11.3867C7.01043 12.4573 7.50713 13.2473 8.61739 13.232L8.61723 13.2317C10.1571 13.2967 10.5874 11.592 9.96023 10.4759C9.74995 10.1097 9.16994 9.80702 8.71379 9.62981C8.36155 9.46772 8.21038 9.3086 8.20711 8.92079C8.20711 8.55559 8.35983 8.37291 8.66543 8.37291C8.83688 8.37291 8.95357 8.42939 9.01519 8.54217C9.10317 8.6754 9.12454 9.0409 9.11565 9.26742H10.1612C10.1866 8.71627 10.0554 8.11739 9.75509 7.81303C9.26822 7.22257 7.99791 7.24909 7.5115 7.82504C7.0109 8.29179 6.97783 9.4437 7.3346 9.96848C7.49278 10.205 7.75143 10.409 8.1107 10.5809C8.15897 10.6051 8.21552 10.6314 8.27633 10.6598C8.53247 10.7792 8.86416 10.9338 8.97119 11.1046C9.16073 11.3241 9.13593 11.8913 9.00333 12.0877C8.9336 12.1952 8.81285 12.2489 8.64141 12.2489C8.25703 12.2785 8.09666 11.8534 8.12677 11.3867H7.04116ZM10.5474 11.3867C10.5167 12.4573 11.0134 13.2473 12.1236 13.232L12.1235 13.2317C13.6634 13.2967 14.0936 11.592 13.4665 10.4759C13.2562 10.1097 12.6762 9.80702 12.2201 9.62981C11.8678 9.46772 11.7166 9.3086 11.7134 8.92079C11.7134 8.55559 11.8661 8.37291 12.1717 8.37291C12.3431 8.37291 12.4598 8.42939 12.5214 8.54217C12.6094 8.6754 12.6308 9.0409 12.6219 9.26742H13.6674C13.6928 8.71627 13.5617 8.11739 13.2614 7.81303C12.7745 7.22257 11.5042 7.24909 11.0178 7.82504C10.5172 8.29179 10.4841 9.4437 10.8409 9.96848C10.999 10.205 11.2577 10.409 11.617 10.5809C11.6652 10.6051 11.7218 10.6314 11.7826 10.6598C12.0387 10.7792 12.3704 10.9338 12.4775 11.1046C12.667 11.3241 12.6422 11.8913 12.5096 12.0877C12.4399 12.1952 12.3191 12.2489 12.1477 12.2489C11.7633 12.2785 11.6029 11.8534 11.633 11.3867H10.5474Z" fill="black"/>
|
<path d="M11.7633 4.2078H4.23674L4.3551 5.5189H10.1429L9.99592 6.87645H6.20408L6.33877 8.16255H9.86939L9.66122 9.92379L8 10.3275L6.3102 9.92021L6.20408 8.86633H4.7102L4.87755 10.7955L8 11.6457L11.0694 10.8812L11.7633 4.2078ZM2 2H14L12.9061 12.7818L7.98775 14L3.09388 12.7818L2 2Z" fill="black"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 403 B |
417
assets/icons/file_icons/file_types.json
Normal file
@@ -0,0 +1,417 @@
|
|||||||
|
{
|
||||||
|
"stems": {
|
||||||
|
"Dockerfile": "docker",
|
||||||
|
"Podfile": "ruby",
|
||||||
|
"Procfile": "heroku"
|
||||||
|
},
|
||||||
|
"suffixes": {
|
||||||
|
"Emakefile": "erlang",
|
||||||
|
"aac": "audio",
|
||||||
|
"accdb": "storage",
|
||||||
|
"app.src": "erlang",
|
||||||
|
"astro": "astro",
|
||||||
|
"avi": "video",
|
||||||
|
"avif": "image",
|
||||||
|
"bak": "backup",
|
||||||
|
"bash": "terminal",
|
||||||
|
"bash_aliases": "terminal",
|
||||||
|
"bash_logout": "terminal",
|
||||||
|
"bash_profile": "terminal",
|
||||||
|
"bashrc": "terminal",
|
||||||
|
"bmp": "image",
|
||||||
|
"c": "c",
|
||||||
|
"c++": "cpp",
|
||||||
|
"cc": "cpp",
|
||||||
|
"cjs": "javascript",
|
||||||
|
"coffee": "coffeescript",
|
||||||
|
"conf": "settings",
|
||||||
|
"cpp": "cpp",
|
||||||
|
"css": "css",
|
||||||
|
"csv": "storage",
|
||||||
|
"cxx": "cpp",
|
||||||
|
"cts": "typescript",
|
||||||
|
"dart": "dart",
|
||||||
|
"dat": "storage",
|
||||||
|
"db": "storage",
|
||||||
|
"dbf": "storage",
|
||||||
|
"diff": "diff",
|
||||||
|
"dll": "storage",
|
||||||
|
"doc": "document",
|
||||||
|
"docx": "document",
|
||||||
|
"eex": "elixir",
|
||||||
|
"elm": "elm",
|
||||||
|
"erl": "erlang",
|
||||||
|
"escript": "erlang",
|
||||||
|
"eslintrc": "eslint",
|
||||||
|
"eslintrc.js": "eslint",
|
||||||
|
"eslintrc.json": "eslint",
|
||||||
|
"ex": "elixir",
|
||||||
|
"exs": "elixir",
|
||||||
|
"fish": "terminal",
|
||||||
|
"flac": "audio",
|
||||||
|
"fmp": "storage",
|
||||||
|
"fp7": "storage",
|
||||||
|
"frm": "storage",
|
||||||
|
"fs": "fsharp",
|
||||||
|
"gdb": "storage",
|
||||||
|
"gif": "image",
|
||||||
|
"gitattributes": "vcs",
|
||||||
|
"gitignore": "vcs",
|
||||||
|
"gitkeep": "vcs",
|
||||||
|
"gitmodules": "vcs",
|
||||||
|
"TAG_EDITMSG": "vcs",
|
||||||
|
"MERGE_MSG": "vcs",
|
||||||
|
"COMMIT_EDITMSG": "vcs",
|
||||||
|
"NOTES_EDITMSG": "vcs",
|
||||||
|
"EDIT_DESCRIPTION": "vcs",
|
||||||
|
"gleam": "gleam",
|
||||||
|
"go": "go",
|
||||||
|
"gql": "graphql",
|
||||||
|
"graphql": "graphql",
|
||||||
|
"graphqls": "graphql",
|
||||||
|
"h": "c",
|
||||||
|
"handlebars": "code",
|
||||||
|
"hbs": "template",
|
||||||
|
"hcl": "hcl",
|
||||||
|
"heex": "elixir",
|
||||||
|
"heic": "image",
|
||||||
|
"heif": "image",
|
||||||
|
"hh": "cpp",
|
||||||
|
"hpp": "cpp",
|
||||||
|
"hrl": "erlang",
|
||||||
|
"hs": "haskell",
|
||||||
|
"htm": "template",
|
||||||
|
"html": "template",
|
||||||
|
"hxx": "cpp",
|
||||||
|
"ib": "storage",
|
||||||
|
"ico": "image",
|
||||||
|
"ini": "settings",
|
||||||
|
"inl": "cpp",
|
||||||
|
"j2k": "image",
|
||||||
|
"java": "java",
|
||||||
|
"jfif": "image",
|
||||||
|
"jl": "julia",
|
||||||
|
"jp2": "image",
|
||||||
|
"jpeg": "image",
|
||||||
|
"jpg": "image",
|
||||||
|
"js": "javascript",
|
||||||
|
"json": "storage",
|
||||||
|
"jsonc": "storage",
|
||||||
|
"jsx": "react",
|
||||||
|
"jxl": "image",
|
||||||
|
"kt": "kotlin",
|
||||||
|
"ldf": "storage",
|
||||||
|
"lock": "lock",
|
||||||
|
"lockb": "bun",
|
||||||
|
"log": "log",
|
||||||
|
"lua": "lua",
|
||||||
|
"m4a": "audio",
|
||||||
|
"m4v": "video",
|
||||||
|
"markdown": "document",
|
||||||
|
"md": "document",
|
||||||
|
"mdb": "storage",
|
||||||
|
"mdf": "storage",
|
||||||
|
"mdx": "document",
|
||||||
|
"metadata": "code",
|
||||||
|
"metal": "metal",
|
||||||
|
"mjs": "javascript",
|
||||||
|
"mka": "audio",
|
||||||
|
"mkv": "video",
|
||||||
|
"ml": "ocaml",
|
||||||
|
"mli": "ocaml",
|
||||||
|
"mod": "go",
|
||||||
|
"mov": "video",
|
||||||
|
"mp3": "audio",
|
||||||
|
"mp4": "video",
|
||||||
|
"mts": "typescript",
|
||||||
|
"myd": "storage",
|
||||||
|
"myi": "storage",
|
||||||
|
"nim": "nim",
|
||||||
|
"nix": "nix",
|
||||||
|
"nu": "terminal",
|
||||||
|
"odp": "document",
|
||||||
|
"ods": "document",
|
||||||
|
"odt": "document",
|
||||||
|
"ogg": "audio",
|
||||||
|
"opus": "audio",
|
||||||
|
"otf": "font",
|
||||||
|
"pcss": "css",
|
||||||
|
"pdb": "storage",
|
||||||
|
"pdf": "document",
|
||||||
|
"php": "php",
|
||||||
|
"plist": "template",
|
||||||
|
"png": "image",
|
||||||
|
"postcss": "css",
|
||||||
|
"ppt": "document",
|
||||||
|
"pptx": "document",
|
||||||
|
"prettierignore": "prettier",
|
||||||
|
"prettierrc": "prettier",
|
||||||
|
"prisma": "prisma",
|
||||||
|
"profile": "terminal",
|
||||||
|
"ps1": "terminal",
|
||||||
|
"psd": "image",
|
||||||
|
"py": "python",
|
||||||
|
"qoi": "image",
|
||||||
|
"r": "r",
|
||||||
|
"rb": "ruby",
|
||||||
|
"rebar.config": "erlang",
|
||||||
|
"rkt": "code",
|
||||||
|
"roc": "roc",
|
||||||
|
"rs": "rust",
|
||||||
|
"rtf": "document",
|
||||||
|
"sass": "sass",
|
||||||
|
"sav": "storage",
|
||||||
|
"sc": "scala",
|
||||||
|
"scala": "scala",
|
||||||
|
"scm": "code",
|
||||||
|
"scss": "sass",
|
||||||
|
"sdf": "storage",
|
||||||
|
"sh": "terminal",
|
||||||
|
"sql": "storage",
|
||||||
|
"sqlite": "storage",
|
||||||
|
"svelte": "template",
|
||||||
|
"svg": "image",
|
||||||
|
"swift": "swift",
|
||||||
|
"tcl": "tcl",
|
||||||
|
"tf": "terraform",
|
||||||
|
"tfvars": "terraform",
|
||||||
|
"tiff": "image",
|
||||||
|
"toml": "toml",
|
||||||
|
"ts": "typescript",
|
||||||
|
"tsv": "storage",
|
||||||
|
"tsx": "react",
|
||||||
|
"ttf": "font",
|
||||||
|
"txt": "document",
|
||||||
|
"v": "v",
|
||||||
|
"vsh": "v",
|
||||||
|
"vv": "v",
|
||||||
|
"vue": "vue",
|
||||||
|
"wav": "audio",
|
||||||
|
"webm": "video",
|
||||||
|
"webp": "image",
|
||||||
|
"wma": "audio",
|
||||||
|
"wmv": "video",
|
||||||
|
"woff": "font",
|
||||||
|
"woff2": "font",
|
||||||
|
"work": "go",
|
||||||
|
"wv": "audio",
|
||||||
|
"xls": "document",
|
||||||
|
"xlsx": "document",
|
||||||
|
"xml": "template",
|
||||||
|
"xrl": "erlang",
|
||||||
|
"yaml": "settings",
|
||||||
|
"yml": "settings",
|
||||||
|
"yrl": "erlang",
|
||||||
|
"zig": "zig",
|
||||||
|
"zlogin": "terminal",
|
||||||
|
"zsh": "terminal",
|
||||||
|
"zsh_aliases": "terminal",
|
||||||
|
"zsh_histfile": "terminal",
|
||||||
|
"zsh_profile": "terminal",
|
||||||
|
"zshenv": "terminal",
|
||||||
|
"zshrc": "terminal"
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"astro": {
|
||||||
|
"icon": "icons/file_icons/astro.svg"
|
||||||
|
},
|
||||||
|
"audio": {
|
||||||
|
"icon": "icons/file_icons/audio.svg"
|
||||||
|
},
|
||||||
|
"bun": {
|
||||||
|
"icon": "icons/file_icons/bun.svg"
|
||||||
|
},
|
||||||
|
"c": {
|
||||||
|
"icon": "icons/file_icons/c.svg"
|
||||||
|
},
|
||||||
|
"code": {
|
||||||
|
"icon": "icons/file_icons/code.svg"
|
||||||
|
},
|
||||||
|
"coffeescript": {
|
||||||
|
"icon": "icons/file_icons/coffeescript.svg"
|
||||||
|
},
|
||||||
|
"collapsed_chevron": {
|
||||||
|
"icon": "icons/file_icons/chevron_right.svg"
|
||||||
|
},
|
||||||
|
"collapsed_folder": {
|
||||||
|
"icon": "icons/file_icons/folder.svg"
|
||||||
|
},
|
||||||
|
"cpp": {
|
||||||
|
"icon": "icons/file_icons/cpp.svg"
|
||||||
|
},
|
||||||
|
"css": {
|
||||||
|
"icon": "icons/file_icons/css.svg"
|
||||||
|
},
|
||||||
|
"dart": {
|
||||||
|
"icon": "icons/file_icons/dart.svg"
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"icon": "icons/file_icons/file.svg"
|
||||||
|
},
|
||||||
|
"diff": {
|
||||||
|
"icon": "icons/file_icons/diff.svg"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"icon": "icons/file_icons/docker.svg"
|
||||||
|
},
|
||||||
|
"document": {
|
||||||
|
"icon": "icons/file_icons/book.svg"
|
||||||
|
},
|
||||||
|
"elixir": {
|
||||||
|
"icon": "icons/file_icons/elixir.svg"
|
||||||
|
},
|
||||||
|
"elm": {
|
||||||
|
"icon": "icons/file_icons/elm.svg"
|
||||||
|
},
|
||||||
|
"erlang": {
|
||||||
|
"icon": "icons/file_icons/erlang.svg"
|
||||||
|
},
|
||||||
|
"eslint": {
|
||||||
|
"icon": "icons/file_icons/eslint.svg"
|
||||||
|
},
|
||||||
|
"expanded_chevron": {
|
||||||
|
"icon": "icons/file_icons/chevron_down.svg"
|
||||||
|
},
|
||||||
|
"expanded_folder": {
|
||||||
|
"icon": "icons/file_icons/folder_open.svg"
|
||||||
|
},
|
||||||
|
"font": {
|
||||||
|
"icon": "icons/file_icons/font.svg"
|
||||||
|
},
|
||||||
|
"fsharp": {
|
||||||
|
"icon": "icons/file_icons/fsharp.svg"
|
||||||
|
},
|
||||||
|
"gleam": {
|
||||||
|
"icon": "icons/file_icons/gleam.svg"
|
||||||
|
},
|
||||||
|
"go": {
|
||||||
|
"icon": "icons/file_icons/go.svg"
|
||||||
|
},
|
||||||
|
"graphql": {
|
||||||
|
"icon": "icons/file_icons/graphql.svg"
|
||||||
|
},
|
||||||
|
"haskell": {
|
||||||
|
"icon": "icons/file_icons/haskell.svg"
|
||||||
|
},
|
||||||
|
"hcl": {
|
||||||
|
"icon": "icons/file_icons/hcl.svg"
|
||||||
|
},
|
||||||
|
"heroku": {
|
||||||
|
"icon": "icons/file_icons/heroku.svg"
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"icon": "icons/file_icons/image.svg"
|
||||||
|
},
|
||||||
|
"java": {
|
||||||
|
"icon": "icons/file_icons/java.svg"
|
||||||
|
},
|
||||||
|
"javascript": {
|
||||||
|
"icon": "icons/file_icons/javascript.svg"
|
||||||
|
},
|
||||||
|
"julia": {
|
||||||
|
"icon": "icons/file_icons/julia.svg"
|
||||||
|
},
|
||||||
|
"kotlin": {
|
||||||
|
"icon": "icons/file_icons/kotlin.svg"
|
||||||
|
},
|
||||||
|
"lock": {
|
||||||
|
"icon": "icons/file_icons/lock.svg"
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"icon": "icons/file_icons/info.svg"
|
||||||
|
},
|
||||||
|
"lua": {
|
||||||
|
"icon": "icons/file_icons/lua.svg"
|
||||||
|
},
|
||||||
|
"metal": {
|
||||||
|
"icon": "icons/file_icons/metal.svg"
|
||||||
|
},
|
||||||
|
"nim": {
|
||||||
|
"icon": "icons/file_icons/nim.svg"
|
||||||
|
},
|
||||||
|
"nix": {
|
||||||
|
"icon": "icons/file_icons/nix.svg"
|
||||||
|
},
|
||||||
|
"ocaml": {
|
||||||
|
"icon": "icons/file_icons/ocaml.svg"
|
||||||
|
},
|
||||||
|
"phoenix": {
|
||||||
|
"icon": "icons/file_icons/phoenix.svg"
|
||||||
|
},
|
||||||
|
"php": {
|
||||||
|
"icon": "icons/file_icons/php.svg"
|
||||||
|
},
|
||||||
|
"prettier": {
|
||||||
|
"icon": "icons/file_icons/prettier.svg"
|
||||||
|
},
|
||||||
|
"prisma": {
|
||||||
|
"icon": "icons/file_icons/prisma.svg"
|
||||||
|
},
|
||||||
|
"python": {
|
||||||
|
"icon": "icons/file_icons/python.svg"
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"icon": "icons/file_icons/r.svg"
|
||||||
|
},
|
||||||
|
"react": {
|
||||||
|
"icon": "icons/file_icons/react.svg"
|
||||||
|
},
|
||||||
|
"roc": {
|
||||||
|
"icon": "icons/file_icons/roc.svg"
|
||||||
|
},
|
||||||
|
"ruby": {
|
||||||
|
"icon": "icons/file_icons/ruby.svg"
|
||||||
|
},
|
||||||
|
"rust": {
|
||||||
|
"icon": "icons/file_icons/rust.svg"
|
||||||
|
},
|
||||||
|
"sass": {
|
||||||
|
"icon": "icons/file_icons/sass.svg"
|
||||||
|
},
|
||||||
|
"scala": {
|
||||||
|
"icon": "icons/file_icons/scala.svg"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"icon": "icons/file_icons/settings.svg"
|
||||||
|
},
|
||||||
|
"storage": {
|
||||||
|
"icon": "icons/file_icons/database.svg"
|
||||||
|
},
|
||||||
|
"swift": {
|
||||||
|
"icon": "icons/file_icons/swift.svg"
|
||||||
|
},
|
||||||
|
"tcl": {
|
||||||
|
"icon": "icons/file_icons/tcl.svg"
|
||||||
|
},
|
||||||
|
"template": {
|
||||||
|
"icon": "icons/file_icons/html.svg"
|
||||||
|
},
|
||||||
|
"terminal": {
|
||||||
|
"icon": "icons/file_icons/terminal.svg"
|
||||||
|
},
|
||||||
|
"terraform": {
|
||||||
|
"icon": "icons/file_icons/terraform.svg"
|
||||||
|
},
|
||||||
|
"toml": {
|
||||||
|
"icon": "icons/file_icons/toml.svg"
|
||||||
|
},
|
||||||
|
"typescript": {
|
||||||
|
"icon": "icons/file_icons/typescript.svg"
|
||||||
|
},
|
||||||
|
"v": {
|
||||||
|
"icon": "icons/file_icons/v.svg"
|
||||||
|
},
|
||||||
|
"vcs": {
|
||||||
|
"icon": "icons/file_icons/git.svg"
|
||||||
|
},
|
||||||
|
"video": {
|
||||||
|
"icon": "icons/file_icons/video.svg"
|
||||||
|
},
|
||||||
|
"vue": {
|
||||||
|
"icon": "icons/file_icons/vue.svg"
|
||||||
|
},
|
||||||
|
"zig": {
|
||||||
|
"icon": "icons/file_icons/zig.svg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1 @@
|
|||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-search"><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M4.268 21a2 2 0 0 0 1.727 1H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3"/><path d="m9 18-1.5-1.5"/><circle cx="5" cy="14" r="3"/></svg>
|
||||||
<path d="M5.2345 20.1C5.38772 20.373 5.60794 20.5998 5.87313 20.7577C6.13832 20.9157 6.43919 20.9992 6.74562 21H17.25C17.7141 21 18.1592 20.8104 18.4874 20.4728C18.8156 20.1352 19 19.6774 19 19.2V7.5L14.625 3H6.75C6.28587 3 5.84075 3.18964 5.51256 3.52721C5.18437 3.86477 5 4.32261 5 4.8V6.5" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10 16.8182L8.5 15.3182" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M6 15.8182C7.65685 15.8182 9 14.475 9 12.8182C9 11.1613 7.65685 9.81818 6 9.81818C4.34315 9.81818 3 11.1613 3 12.8182C3 14.475 4.34315 15.8182 6 15.8182Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 837 B After Width: | Height: | Size: 393 B |
@@ -1,3 +1,3 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M12.9416 2.99643C13.08 2.79636 12.9568 2.5 12.7352 2.5H3.26475C3.04317 2.5 2.91999 2.79636 3.0584 2.99643L6.04033 7.30646C6.24713 7.60535 6.35981 7.97674 6.35981 8.3596C6.35981 9.18422 6.35981 11.4639 6.35981 12.891C6.35981 13.2285 6.59643 13.5 6.88831 13.5H9.11168C9.40357 13.5 9.64019 13.2285 9.64019 12.891C9.64019 11.4639 9.64019 9.18422 9.64019 8.3596C9.64019 7.97674 9.75289 7.60535 9.95969 7.30646L12.9416 2.99643Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M11.6749 2.40608C11.8058 2.24239 11.6893 1.99991 11.4796 1.99991H2.51996C2.31033 1.99991 2.19379 2.24239 2.32474 2.40608L5.14583 5.93246C5.34148 6.17701 5.44808 6.48087 5.44808 6.79412C5.44808 7.46881 5.44808 10.334 5.44808 11.5016C5.44808 11.7778 5.67194 11.9999 5.94808 11.9999H8.05153C8.32767 11.9999 8.55153 11.7778 8.55153 11.5016C8.55153 10.334 8.55153 7.46881 8.55153 6.79412C8.55153 6.48087 8.65815 6.17701 8.8538 5.93246L11.6749 2.40608Z" stroke="black" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 618 B After Width: | Height: | Size: 644 B |
@@ -1,3 +1,3 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M13.3333 13.3333C13.6869 13.3333 14.026 13.1929 14.2761 12.9428C14.5261 12.6928 14.6666 12.3536 14.6666 12V5.33333C14.6666 4.97971 14.5261 4.64057 14.2761 4.39052C14.026 4.14048 13.6869 4 13.3333 4H8.06659C7.84359 4.00219 7.62362 3.94841 7.42679 3.84359C7.22996 3.73877 7.06256 3.58625 6.93992 3.4L6.39992 2.6C6.27851 2.41565 6.11324 2.26432 5.91892 2.1596C5.7246 2.05488 5.50732 2.00004 5.28659 2H2.66659C2.31296 2 1.97382 2.14048 1.72378 2.39052C1.47373 2.64057 1.33325 2.97971 1.33325 3.33333V12C1.33325 12.3536 1.47373 12.6928 1.72378 12.9428C1.97382 13.1929 2.31296 13.3333 2.66659 13.3333H13.3333Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M8.26046 3.97337C8.3527 4.17617 8.4795 4.47151 8.57375 4.69341C8.65258 4.87898 8.83437 4.99999 9.03599 4.99999H12.5C12.7761 4.99999 13 5.22385 13 5.49999V12.125C13 12.4011 12.7761 12.625 12.5 12.625H3.5C3.22386 12.625 3 12.4011 3 12.125V3.86932C3 3.59318 3.22386 3.36932 3.5 3.36932H7.34219C7.74141 3.36932 8.09483 3.60924 8.26046 3.97337Z" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 800 B After Width: | Height: | Size: 512 B |
@@ -1,12 +1 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-globe"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
|
||||||
<g clip-path="url(#clip0_2226_61)">
|
|
||||||
<path d="M7.99992 14.6667C11.6818 14.6667 14.6666 11.6819 14.6666 8C14.6666 4.3181 11.6818 1.33333 7.99992 1.33333C4.31802 1.33333 1.33325 4.3181 1.33325 8C1.33325 11.6819 4.31802 14.6667 7.99992 14.6667Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M7.99992 1.33333C6.28807 3.13076 5.33325 5.51782 5.33325 8C5.33325 10.4822 6.28807 12.8692 7.99992 14.6667C9.71176 12.8692 10.6666 10.4822 10.6666 8C10.6666 5.51782 9.71176 3.13076 7.99992 1.33333Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M1.33325 8H14.6666" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_2226_61">
|
|
||||||
<rect width="16" height="16" fill="white"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 937 B After Width: | Height: | Size: 327 B |
@@ -1,6 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M5 5C5 3.89543 5.89543 3 7 3H9C10.1046 3 11 3.89543 11 5V6H5V5Z" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M8 9V11" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
|
|
||||||
<circle cx="8" cy="9" r="1" fill="black"/>
|
|
||||||
<rect x="3.75" y="5.75" width="8.5" height="7.5" rx="1.25" stroke="black" stroke-width="1.5" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 452 B |
@@ -1,3 +1,3 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M13 13L10.4138 10.4138M3 7.31034C3 4.92981 4.92981 3 7.31034 3C9.6909 3 11.6207 4.92981 11.6207 7.31034C11.6207 9.6909 9.6909 11.6207 7.31034 11.6207C4.92981 11.6207 3 9.6909 3 7.31034Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M12 12L9.41379 9.41379M2 6.31034C2 3.92981 3.92981 2 6.31034 2C8.6909 2 10.6207 3.92981 10.6207 6.31034C10.6207 8.6909 8.6909 10.6207 6.31034 10.6207C3.92981 10.6207 2 8.6909 2 6.31034Z" stroke="black" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 382 B After Width: | Height: | Size: 383 B |
@@ -1,6 +1,4 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M5.26659 13.3333C6.53897 13.986 8.00264 14.1628 9.39384 13.8319C10.785 13.5009 12.0123 12.6839 12.8544 11.5281C13.6966 10.3724 14.0982 8.95381 13.987 7.52811C13.8758 6.10241 13.259 4.76332 12.2478 3.75213C11.2366 2.74095 9.89751 2.12417 8.47181 2.01295C7.04611 1.90173 5.62757 2.30337 4.4718 3.1455C3.31603 3.98764 2.49905 5.21488 2.16807 6.60608C1.83709 7.99728 2.01388 9.46095 2.66659 10.7333L1.33325 14.6667L5.26659 13.3333Z" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M5.46115 8.43419C7.30678 8.43419 8.92229 7.43411 8.92229 5.21171C8.92229 2.98933 7.30678 1.98926 5.46115 1.98926C3.61553 1.98926 2 2.98933 2 5.21171C2 6.028 2.21794 6.67935 2.58519 7.17685C2.7184 7.35732 2.69033 7.77795 2.58387 7.97539C2.32908 8.44793 2.81048 8.9657 3.33372 8.84571C3.72539 8.75597 4.13621 8.63447 4.49574 8.4715C4.62736 8.41181 4.7727 8.38777 4.91631 8.40402C5.09471 8.42416 5.27678 8.43419 5.46115 8.43419Z" fill="black" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
<path d="M5.33325 8H5.33992" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M11.3385 6.24835C11.7049 6.74561 11.9224 7.39641 11.9224 8.2117C11.9224 9.02799 11.7044 9.67934 11.3372 10.1768C11.204 10.3573 11.232 10.7779 11.3385 10.9754C11.5933 11.4479 11.1119 11.9657 10.5886 11.8457C10.197 11.756 9.78615 11.6345 9.42662 11.4715C9.295 11.4118 9.14966 11.3878 9.00605 11.404C8.82765 11.4242 8.64558 11.4342 8.46121 11.4342C7.61469 11.4342 6.81658 11.2238 6.20055 10.7816" stroke="black" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
<path d="M8 8H8.00667" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M10.6667 8H10.6734" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 954 B After Width: | Height: | Size: 1.1 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-user"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="10" r="3"/><path d="M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 345 B |
@@ -1,5 +0,0 @@
|
|||||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M5.27772 1.38585L4.39187 4.07909C4.34653 4.21692 4.26946 4.34219 4.16685 4.44479C4.06425 4.5474 3.93898 4.62447 3.80115 4.66981L1.10791 5.55566L3.80115 6.44151C3.93898 6.48685 4.06425 6.56392 4.16685 6.66653C4.26946 6.76913 4.34653 6.8944 4.39187 7.03223L5.27772 9.72547L6.16357 7.03223C6.20891 6.8944 6.28598 6.76913 6.38859 6.66653C6.49119 6.56392 6.61646 6.48685 6.7543 6.44151L9.44753 5.55566L6.7543 4.66981C6.61646 4.62447 6.49119 4.5474 6.38859 4.44479C6.28598 4.34219 6.20891 4.21692 6.16357 4.07909L5.27772 1.38585Z" fill="black" fill-opacity="0.15" stroke="black" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path d="M8.35938 12.3555C8.35938 12.0664 8.52734 11.8086 9.00781 11.3594L10.2031 10.2344C10.6094 9.85156 10.7891 9.60156 10.7891 9.34375C10.7891 9.05469 10.5781 8.85938 10.2734 8.85938C10.0391 8.85938 9.87109 8.95312 9.66406 9.21094C9.42578 9.50781 9.25391 9.60938 8.99219 9.60938C8.61719 9.60938 8.35156 9.35938 8.35156 9.01172C8.35156 8.25 9.26953 7.57812 10.3594 7.57812C11.4961 7.57812 12.3438 8.26172 12.3438 9.17969C12.3438 9.75391 12.0391 10.3008 11.418 10.8516L10.4961 11.6719V11.7344H11.8047C12.2578 11.7344 12.5391 11.9766 12.5391 12.3711C12.5391 12.7656 12.2656 13 11.8047 13H9.08203C8.65234 13 8.35938 12.7383 8.35938 12.3555Z" fill="black"/>
|
|
||||||
<path d="M11.0834 1.38585V3.71918M9.91675 2.55248H12.2501" stroke="black" stroke-opacity="0.75" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,5 +1,5 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M7 8.9V11C5.34478 11 4.65522 11 3 11V10.4L7 5.6V5H3V7.1" stroke="black" stroke-width="1.5"/>
|
||||||
<path d="M12 5L14 8L12 11" stroke="black" stroke-width="1.5"/>
|
<path d="M12 5L14 8L12 11" stroke="black" stroke-width="1.5"/>
|
||||||
<path d="M10 6.5L11 8L10 9.5" stroke="black" stroke-width="1.5"/>
|
<path d="M10 6.5L11 8L10 9.5" stroke="black" stroke-width="1.5"/>
|
||||||
<path d="M7.5 8.9V11C5.43097 11 4.56903 11 2.5 11V10.4L7.5 5.6V5H2.5V7.1" stroke="black" stroke-width="1.5"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 342 B After Width: | Height: | Size: 334 B |
@@ -1,19 +0,0 @@
|
|||||||
<svg width="550" height="128" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<pattern id="tilePattern" width="23" height="23" patternUnits="userSpaceOnUse">
|
|
||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M12 5L14 8L12 11" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M10 6.5L11 8L10 9.5" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M7.5 8.9V11C5.43097 11 4.56903 11 2.5 11V10.4L7.5 5.6V5H2.5V7.1" stroke="black" stroke-width="1.5"/>
|
|
||||||
</svg>
|
|
||||||
</pattern>
|
|
||||||
<linearGradient id="fade" y2="1" x2="0">
|
|
||||||
<stop offset="0" stop-color="white" stop-opacity=".24"/>
|
|
||||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
|
||||||
</linearGradient>
|
|
||||||
<mask id="fadeMask" maskContentUnits="objectBoundingBox">
|
|
||||||
<rect width="1" height="1" fill="url(#fade)"/>
|
|
||||||
</mask>
|
|
||||||
</defs>
|
|
||||||
<rect width="100%" height="100%" fill="url(#tilePattern)" mask="url(#fadeMask)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 971 B |
@@ -1,6 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path opacity="0.6" fill-rule="evenodd" clip-rule="evenodd" d="M6.75 9.31247L8.25 10.5576V11.75H1.75V10.0803L4.49751 7.44273L5.65909 8.40693L3.73923 10.25H6.75V9.31247ZM8.25 5.85739V4.25H6.31358L8.25 5.85739ZM1.75 5.16209V7.1H3.25V6.4072L1.75 5.16209Z" fill="black"/>
|
|
||||||
<path opacity="0.6" fill-rule="evenodd" clip-rule="evenodd" d="M10.9624 9.40853L11.9014 8L10.6241 6.08397L9.37598 6.91603L10.0986 8L9.80184 8.44518L10.9624 9.40853Z" fill="black"/>
|
|
||||||
<path opacity="0.6" fill-rule="evenodd" clip-rule="evenodd" d="M12.8936 11.0116L14.9014 8L12.6241 4.58397L11.376 5.41603L13.0986 8L11.7331 10.0483L12.8936 11.0116Z" fill="black"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1225 13.809C14.0341 13.9146 13.877 13.9289 13.7711 13.8409L1.19311 3.40021C1.08659 3.31178 1.07221 3.15362 1.16104 3.04743L1.87752 2.19101C1.96588 2.0854 2.123 2.07112 2.22895 2.15906L14.8069 12.5998C14.9134 12.6882 14.9278 12.8464 14.839 12.9526L14.1225 13.809Z" fill="black"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1,5 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M15 9.33333L14.5 9.66667L12.5 11L10.5 9.66667L10 9.33333" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M12.5 11V4.5" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M7.5 8.9V11C5.43097 11 4.56903 11 2.5 11V10.4L7.5 5.6V5H2.5V7.1" stroke="black" stroke-width="1.5"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 375 B |
@@ -1,5 +0,0 @@
|
|||||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M10 6.66667L10.5 6.33333L12.5 5L14.5 6.33333L15 6.66667" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M12.5 11V5" stroke="black" stroke-width="1.5"/>
|
|
||||||
<path d="M7.5 8.9V11C5.43097 11 4.56903 11 2.5 11V10.4L7.5 5.6V5H2.5V7.1" stroke="black" stroke-width="1.5"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 372 B |
@@ -2,37 +2,34 @@
|
|||||||
// Standard Linux bindings
|
// Standard Linux bindings
|
||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"home": "menu::SelectFirst",
|
|
||||||
"shift-pageup": "menu::SelectFirst",
|
|
||||||
"pageup": "menu::SelectFirst",
|
|
||||||
"end": "menu::SelectLast",
|
|
||||||
"shift-pagedown": "menu::SelectLast",
|
|
||||||
"pagedown": "menu::SelectLast",
|
|
||||||
"ctrl-n": "menu::SelectNext",
|
|
||||||
"tab": "menu::SelectNext",
|
|
||||||
"ctrl-p": "menu::SelectPrev",
|
|
||||||
"shift-tab": "menu::SelectPrev",
|
"shift-tab": "menu::SelectPrev",
|
||||||
|
"home": "menu::SelectFirst",
|
||||||
|
"pageup": "menu::SelectFirst",
|
||||||
|
"shift-pageup": "menu::SelectFirst",
|
||||||
|
"ctrl-p": "menu::SelectPrev",
|
||||||
|
"tab": "menu::SelectNext",
|
||||||
|
"end": "menu::SelectLast",
|
||||||
|
"pagedown": "menu::SelectLast",
|
||||||
|
"shift-pagedown": "menu::SelectFirst",
|
||||||
|
"ctrl-n": "menu::SelectNext",
|
||||||
"enter": "menu::Confirm",
|
"enter": "menu::Confirm",
|
||||||
"ctrl-enter": "menu::SecondaryConfirm",
|
"ctrl-enter": "menu::SecondaryConfirm",
|
||||||
|
"escape": "menu::Cancel",
|
||||||
"ctrl-escape": "menu::Cancel",
|
"ctrl-escape": "menu::Cancel",
|
||||||
"ctrl-c": "menu::Cancel",
|
"ctrl-c": "menu::Cancel",
|
||||||
"escape": "menu::Cancel",
|
|
||||||
"alt-shift-enter": "menu::Restart",
|
"alt-shift-enter": "menu::Restart",
|
||||||
"alt-enter": ["picker::ConfirmInput", { "secondary": false }],
|
"alt-enter": ["picker::ConfirmInput", { "secondary": false }],
|
||||||
"ctrl-alt-enter": ["picker::ConfirmInput", { "secondary": true }],
|
"ctrl-alt-enter": ["picker::ConfirmInput", { "secondary": true }],
|
||||||
"ctrl-shift-w": "workspace::CloseWindow",
|
"ctrl-shift-w": "workspace::CloseWindow",
|
||||||
"shift-escape": "workspace::ToggleZoom",
|
"shift-escape": "workspace::ToggleZoom",
|
||||||
"open": "workspace::Open",
|
|
||||||
"ctrl-o": "workspace::Open",
|
"ctrl-o": "workspace::Open",
|
||||||
"ctrl-=": ["zed::IncreaseBufferFontSize", { "persist": false }],
|
"ctrl-=": "zed::IncreaseBufferFontSize",
|
||||||
"ctrl-+": ["zed::IncreaseBufferFontSize", { "persist": false }],
|
"ctrl-+": "zed::IncreaseBufferFontSize",
|
||||||
"ctrl--": ["zed::DecreaseBufferFontSize", { "persist": false }],
|
"ctrl--": "zed::DecreaseBufferFontSize",
|
||||||
"ctrl-0": ["zed::ResetBufferFontSize", { "persist": false }],
|
"ctrl-0": "zed::ResetBufferFontSize",
|
||||||
"ctrl-,": "zed::OpenSettings",
|
"ctrl-,": "zed::OpenSettings",
|
||||||
"ctrl-q": "zed::Quit",
|
"ctrl-q": "zed::Quit",
|
||||||
"f11": "zed::ToggleFullScreen",
|
"f11": "zed::ToggleFullScreen"
|
||||||
"ctrl-alt-z": "edit_prediction::RateCompletions",
|
|
||||||
"ctrl-shift-i": "edit_prediction::ToggleMenu"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -53,8 +50,8 @@
|
|||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"escape": "editor::Cancel",
|
"escape": "editor::Cancel",
|
||||||
"shift-backspace": "editor::Backspace",
|
|
||||||
"backspace": "editor::Backspace",
|
"backspace": "editor::Backspace",
|
||||||
|
"shift-backspace": "editor::Backspace",
|
||||||
"delete": "editor::Delete",
|
"delete": "editor::Delete",
|
||||||
"tab": "editor::Tab",
|
"tab": "editor::Tab",
|
||||||
"shift-tab": "editor::TabPrev",
|
"shift-tab": "editor::TabPrev",
|
||||||
@@ -64,19 +61,11 @@
|
|||||||
"ctrl-k q": "editor::Rewrap",
|
"ctrl-k q": "editor::Rewrap",
|
||||||
"ctrl-backspace": "editor::DeleteToPreviousWordStart",
|
"ctrl-backspace": "editor::DeleteToPreviousWordStart",
|
||||||
"ctrl-delete": "editor::DeleteToNextWordEnd",
|
"ctrl-delete": "editor::DeleteToNextWordEnd",
|
||||||
"cut": "editor::Cut",
|
|
||||||
"shift-delete": "editor::Cut",
|
"shift-delete": "editor::Cut",
|
||||||
"ctrl-x": "editor::Cut",
|
|
||||||
"copy": "editor::Copy",
|
|
||||||
"ctrl-insert": "editor::Copy",
|
"ctrl-insert": "editor::Copy",
|
||||||
"ctrl-c": "editor::Copy",
|
|
||||||
"paste": "editor::Paste",
|
|
||||||
"shift-insert": "editor::Paste",
|
"shift-insert": "editor::Paste",
|
||||||
"ctrl-v": "editor::Paste",
|
|
||||||
"undo": "editor::Undo",
|
|
||||||
"ctrl-z": "editor::Undo",
|
|
||||||
"redo": "editor::Redo",
|
|
||||||
"ctrl-y": "editor::Redo",
|
"ctrl-y": "editor::Redo",
|
||||||
|
"ctrl-z": "editor::Undo",
|
||||||
"ctrl-shift-z": "editor::Redo",
|
"ctrl-shift-z": "editor::Redo",
|
||||||
"up": "editor::MoveUp",
|
"up": "editor::MoveUp",
|
||||||
"ctrl-up": "editor::LineUp",
|
"ctrl-up": "editor::LineUp",
|
||||||
@@ -84,12 +73,12 @@
|
|||||||
"pageup": "editor::MovePageUp",
|
"pageup": "editor::MovePageUp",
|
||||||
"alt-pageup": "editor::PageUp",
|
"alt-pageup": "editor::PageUp",
|
||||||
"shift-pageup": "editor::SelectPageUp",
|
"shift-pageup": "editor::SelectPageUp",
|
||||||
"home": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"home": "editor::MoveToBeginningOfLine",
|
||||||
"down": "editor::MoveDown",
|
"down": "editor::MoveDown",
|
||||||
"pagedown": "editor::MovePageDown",
|
"pagedown": "editor::MovePageDown",
|
||||||
"alt-pagedown": "editor::PageDown",
|
"alt-pagedown": "editor::PageDown",
|
||||||
"shift-pagedown": "editor::SelectPageDown",
|
"shift-pagedown": "editor::SelectPageDown",
|
||||||
"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": true }],
|
"end": "editor::MoveToEndOfLine",
|
||||||
"left": "editor::MoveLeft",
|
"left": "editor::MoveLeft",
|
||||||
"right": "editor::MoveRight",
|
"right": "editor::MoveRight",
|
||||||
"ctrl-left": "editor::MoveToPreviousWordStart",
|
"ctrl-left": "editor::MoveToPreviousWordStart",
|
||||||
@@ -107,56 +96,62 @@
|
|||||||
"ctrl-a": "editor::SelectAll",
|
"ctrl-a": "editor::SelectAll",
|
||||||
"ctrl-l": "editor::SelectLine",
|
"ctrl-l": "editor::SelectLine",
|
||||||
"ctrl-shift-i": "editor::Format",
|
"ctrl-shift-i": "editor::Format",
|
||||||
// "cmd-shift-left": ["editor::SelectToBeginningOfLine", {"stop_at_soft_wraps": true, "stop_at_indent": true }],
|
// "cmd-shift-left": ["editor::SelectToBeginningOfLine", {"stop_at_soft_wraps": true }],
|
||||||
// "ctrl-shift-a": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],
|
||||||
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
// "ctrl-shift-a": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],
|
||||||
// "cmd-shift-right": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
// "cmd-shift-right": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
||||||
// "ctrl-shift-e": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
|
||||||
"shift-end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
"shift-end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
||||||
|
// "ctrl-shift-e": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
||||||
// "alt-v": ["editor::MovePageUp", { "center_cursor": true }],
|
// "alt-v": ["editor::MovePageUp", { "center_cursor": true }],
|
||||||
"ctrl-alt-space": "editor::ShowCharacterPalette",
|
"ctrl-alt-space": "editor::ShowCharacterPalette",
|
||||||
"ctrl-;": "editor::ToggleLineNumbers",
|
"ctrl-;": "editor::ToggleLineNumbers",
|
||||||
"ctrl-k ctrl-r": "git::Restore",
|
"ctrl-k ctrl-r": "editor::RevertSelectedHunks",
|
||||||
"ctrl-'": "editor::ToggleSelectedDiffHunks",
|
"ctrl-'": "editor::ToggleHunkDiff",
|
||||||
"ctrl-\"": "editor::ExpandAllDiffHunks",
|
"ctrl-\"": "editor::ExpandAllHunkDiffs",
|
||||||
"ctrl-i": "editor::ShowSignatureHelp",
|
"ctrl-i": "editor::ShowSignatureHelp",
|
||||||
"alt-g b": "editor::ToggleGitBlame",
|
"alt-g b": "editor::ToggleGitBlame",
|
||||||
"menu": "editor::OpenContextMenu",
|
"menu": "editor::OpenContextMenu",
|
||||||
"shift-f10": "editor::OpenContextMenu",
|
"shift-f10": "editor::OpenContextMenu"
|
||||||
"ctrl-shift-e": "editor::ToggleEditPrediction"
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Separate block with same context so these display in context menus
|
||||||
|
"context": "Editor",
|
||||||
|
"bindings": {
|
||||||
|
"ctrl-x": "editor::Cut",
|
||||||
|
"ctrl-c": "editor::Copy",
|
||||||
|
"ctrl-v": "editor::Paste"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && mode == full",
|
"context": "Editor && mode == full",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"shift-enter": "editor::Newline",
|
|
||||||
"enter": "editor::Newline",
|
"enter": "editor::Newline",
|
||||||
|
"shift-enter": "editor::Newline",
|
||||||
"ctrl-enter": "editor::NewlineAbove",
|
"ctrl-enter": "editor::NewlineAbove",
|
||||||
"ctrl-shift-enter": "editor::NewlineBelow",
|
"ctrl-shift-enter": "editor::NewlineBelow",
|
||||||
"ctrl-k ctrl-z": "editor::ToggleSoftWrap",
|
"ctrl-k ctrl-z": "editor::ToggleSoftWrap",
|
||||||
"ctrl-k z": "editor::ToggleSoftWrap",
|
"ctrl-k z": "editor::ToggleSoftWrap",
|
||||||
"find": "buffer_search::Deploy",
|
|
||||||
"ctrl-f": "buffer_search::Deploy",
|
"ctrl-f": "buffer_search::Deploy",
|
||||||
"ctrl-h": "buffer_search::DeployReplace",
|
"ctrl-h": ["buffer_search::Deploy", { "replace_enabled": true }],
|
||||||
// "cmd-e": ["buffer_search::Deploy", { "focus": false }],
|
// "cmd-e": ["buffer_search::Deploy", { "focus": false }],
|
||||||
"ctrl->": "assistant::QuoteSelection",
|
"ctrl->": "assistant::QuoteSelection",
|
||||||
"ctrl-<": "assistant::InsertIntoEditor",
|
"ctrl-<": "assistant::InsertIntoEditor",
|
||||||
"ctrl-alt-e": "editor::SelectEnclosingSymbol",
|
"ctrl-alt-e": "editor::SelectEnclosingSymbol"
|
||||||
"alt-enter": "editor::OpenSelectionsInMultibuffer"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && mode == full && edit_prediction",
|
"context": "Editor && mode == full && inline_completion",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-]": "editor::NextEditPrediction",
|
"alt-]": "editor::NextInlineCompletion",
|
||||||
"alt-[": "editor::PreviousEditPrediction",
|
"alt-[": "editor::PreviousInlineCompletion",
|
||||||
"alt-right": "editor::AcceptPartialEditPrediction"
|
"alt-right": "editor::AcceptPartialInlineCompletion"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && !edit_prediction",
|
"context": "Editor && !inline_completion",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-\\": "editor::ShowEditPrediction"
|
"alt-\\": "editor::ShowInlineCompletion"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -170,7 +165,6 @@
|
|||||||
{
|
{
|
||||||
"context": "Markdown",
|
"context": "Markdown",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"copy": "markdown::Copy",
|
|
||||||
"ctrl-c": "markdown::Copy"
|
"ctrl-c": "markdown::Copy"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -178,21 +172,17 @@
|
|||||||
"context": "AssistantPanel",
|
"context": "AssistantPanel",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-k c": "assistant::CopyCode",
|
"ctrl-k c": "assistant::CopyCode",
|
||||||
"ctrl-shift-e": "project_panel::ToggleFocus",
|
|
||||||
"ctrl-g": "search::SelectNextMatch",
|
"ctrl-g": "search::SelectNextMatch",
|
||||||
"ctrl-shift-g": "search::SelectPrevMatch",
|
"ctrl-shift-g": "search::SelectPrevMatch",
|
||||||
"ctrl-alt-/": "assistant::ToggleModelSelector",
|
"ctrl-shift-m": "assistant::ToggleModelSelector",
|
||||||
"ctrl-k h": "assistant::DeployHistory",
|
"ctrl-k h": "assistant::DeployHistory",
|
||||||
"ctrl-k l": "assistant::DeployPromptLibrary",
|
"ctrl-k l": "assistant::DeployPromptLibrary",
|
||||||
"new": "assistant::NewChat",
|
"ctrl-n": "assistant::NewContext"
|
||||||
"ctrl-t": "assistant::NewChat",
|
|
||||||
"ctrl-n": "assistant::NewChat"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "PromptLibrary",
|
"context": "PromptLibrary",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"new": "prompt_library::NewPrompt",
|
|
||||||
"ctrl-n": "prompt_library::NewPrompt",
|
"ctrl-n": "prompt_library::NewPrompt",
|
||||||
"ctrl-shift-s": "prompt_library::ToggleDefaultPrompt"
|
"ctrl-shift-s": "prompt_library::ToggleDefaultPrompt"
|
||||||
}
|
}
|
||||||
@@ -205,7 +195,6 @@
|
|||||||
"enter": "search::SelectNextMatch",
|
"enter": "search::SelectNextMatch",
|
||||||
"shift-enter": "search::SelectPrevMatch",
|
"shift-enter": "search::SelectPrevMatch",
|
||||||
"alt-enter": "search::SelectAllMatches",
|
"alt-enter": "search::SelectAllMatches",
|
||||||
"find": "search::FocusSearch",
|
|
||||||
"ctrl-f": "search::FocusSearch",
|
"ctrl-f": "search::FocusSearch",
|
||||||
"ctrl-h": "search::ToggleReplace",
|
"ctrl-h": "search::ToggleReplace",
|
||||||
"ctrl-l": "search::ToggleSelection"
|
"ctrl-l": "search::ToggleSelection"
|
||||||
@@ -229,7 +218,6 @@
|
|||||||
"context": "ProjectSearchBar",
|
"context": "ProjectSearchBar",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"escape": "project_search::ToggleFocus",
|
"escape": "project_search::ToggleFocus",
|
||||||
"shift-find": "search::FocusSearch",
|
|
||||||
"ctrl-shift-f": "search::FocusSearch",
|
"ctrl-shift-f": "search::FocusSearch",
|
||||||
"ctrl-shift-h": "search::ToggleReplace",
|
"ctrl-shift-h": "search::ToggleReplace",
|
||||||
"alt-ctrl-g": "search::ToggleRegex",
|
"alt-ctrl-g": "search::ToggleRegex",
|
||||||
@@ -262,48 +250,30 @@
|
|||||||
{
|
{
|
||||||
"context": "Pane",
|
"context": "Pane",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-1": ["pane::ActivateItem", 0],
|
|
||||||
"alt-2": ["pane::ActivateItem", 1],
|
|
||||||
"alt-3": ["pane::ActivateItem", 2],
|
|
||||||
"alt-4": ["pane::ActivateItem", 3],
|
|
||||||
"alt-5": ["pane::ActivateItem", 4],
|
|
||||||
"alt-6": ["pane::ActivateItem", 5],
|
|
||||||
"alt-7": ["pane::ActivateItem", 6],
|
|
||||||
"alt-8": ["pane::ActivateItem", 7],
|
|
||||||
"alt-9": ["pane::ActivateItem", 8],
|
|
||||||
"alt-0": "pane::ActivateLastItem",
|
|
||||||
"ctrl-pageup": "pane::ActivatePrevItem",
|
"ctrl-pageup": "pane::ActivatePrevItem",
|
||||||
"ctrl-pagedown": "pane::ActivateNextItem",
|
"ctrl-pagedown": "pane::ActivateNextItem",
|
||||||
"ctrl-shift-pageup": "pane::SwapItemLeft",
|
"ctrl-shift-pageup": "pane::SwapItemLeft",
|
||||||
"ctrl-shift-pagedown": "pane::SwapItemRight",
|
"ctrl-shift-pagedown": "pane::SwapItemRight",
|
||||||
"ctrl-f4": ["pane::CloseActiveItem", { "close_pinned": false }],
|
"back": "pane::GoBack",
|
||||||
"ctrl-w": ["pane::CloseActiveItem", { "close_pinned": false }],
|
"forward": "pane::GoForward",
|
||||||
|
"ctrl-w": "pane::CloseActiveItem",
|
||||||
|
"ctrl-f4": "pane::CloseActiveItem",
|
||||||
"alt-ctrl-t": ["pane::CloseInactiveItems", { "close_pinned": false }],
|
"alt-ctrl-t": ["pane::CloseInactiveItems", { "close_pinned": false }],
|
||||||
"alt-ctrl-shift-w": "workspace::CloseInactiveTabsAndPanes",
|
"alt-ctrl-shift-w": "workspace::CloseInactiveTabsAndPanes",
|
||||||
"ctrl-k e": ["pane::CloseItemsToTheLeft", { "close_pinned": false }],
|
|
||||||
"ctrl-k t": ["pane::CloseItemsToTheRight", { "close_pinned": false }],
|
|
||||||
"ctrl-k u": ["pane::CloseCleanItems", { "close_pinned": false }],
|
"ctrl-k u": ["pane::CloseCleanItems", { "close_pinned": false }],
|
||||||
"ctrl-k w": ["pane::CloseAllItems", { "close_pinned": false }],
|
"ctrl-k w": ["pane::CloseAllItems", { "close_pinned": false }],
|
||||||
"back": "pane::GoBack",
|
|
||||||
"ctrl-alt--": "pane::GoBack",
|
|
||||||
"ctrl-alt-_": "pane::GoForward",
|
|
||||||
"forward": "pane::GoForward",
|
|
||||||
"ctrl-alt-g": "search::SelectNextMatch",
|
|
||||||
"f3": "search::SelectNextMatch",
|
|
||||||
"ctrl-alt-shift-g": "search::SelectPrevMatch",
|
|
||||||
"shift-f3": "search::SelectPrevMatch",
|
|
||||||
"shift-find": "project_search::ToggleFocus",
|
|
||||||
"ctrl-shift-f": "project_search::ToggleFocus",
|
"ctrl-shift-f": "project_search::ToggleFocus",
|
||||||
|
"ctrl-alt-g": "search::SelectNextMatch",
|
||||||
|
"ctrl-alt-shift-g": "search::SelectPrevMatch",
|
||||||
"ctrl-alt-shift-h": "search::ToggleReplace",
|
"ctrl-alt-shift-h": "search::ToggleReplace",
|
||||||
"ctrl-alt-shift-l": "search::ToggleSelection",
|
"ctrl-alt-shift-l": "search::ToggleSelection",
|
||||||
"alt-enter": "search::SelectAllMatches",
|
"alt-enter": "search::SelectAllMatches",
|
||||||
"alt-c": "search::ToggleCaseSensitive",
|
"alt-c": "search::ToggleCaseSensitive",
|
||||||
"alt-w": "search::ToggleWholeWord",
|
"alt-w": "search::ToggleWholeWord",
|
||||||
"alt-find": "project_search::ToggleFilters",
|
"alt-r": "search::ToggleRegex",
|
||||||
"alt-ctrl-f": "project_search::ToggleFilters",
|
"alt-ctrl-f": "project_search::ToggleFilters",
|
||||||
"ctrl-alt-shift-r": "search::ToggleRegex",
|
"ctrl-alt-shift-r": "search::ToggleRegex",
|
||||||
"ctrl-alt-shift-x": "search::ToggleRegex",
|
"ctrl-alt-shift-x": "search::ToggleRegex",
|
||||||
"alt-r": "search::ToggleRegex",
|
|
||||||
"ctrl-k shift-enter": "pane::TogglePinTab"
|
"ctrl-k shift-enter": "pane::TogglePinTab"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -344,21 +314,21 @@
|
|||||||
"alt-ctrl-f12": "editor::GoToTypeDefinitionSplit",
|
"alt-ctrl-f12": "editor::GoToTypeDefinitionSplit",
|
||||||
"alt-shift-f12": "editor::FindAllReferences",
|
"alt-shift-f12": "editor::FindAllReferences",
|
||||||
"ctrl-m": "editor::MoveToEnclosingBracket",
|
"ctrl-m": "editor::MoveToEnclosingBracket",
|
||||||
"ctrl-|": "editor::MoveToEnclosingBracket",
|
"ctrl-shift-\\": "editor::MoveToEnclosingBracket",
|
||||||
"ctrl-{": "editor::Fold",
|
"ctrl-shift-[": "editor::Fold",
|
||||||
"ctrl-}": "editor::UnfoldLines",
|
"ctrl-shift-]": "editor::UnfoldLines",
|
||||||
"ctrl-k ctrl-l": "editor::ToggleFold",
|
"ctrl-k ctrl-l": "editor::ToggleFold",
|
||||||
"ctrl-k ctrl-[": "editor::FoldRecursive",
|
"ctrl-k ctrl-[": "editor::FoldRecursive",
|
||||||
"ctrl-k ctrl-]": "editor::UnfoldRecursive",
|
"ctrl-k ctrl-]": "editor::UnfoldRecursive",
|
||||||
"ctrl-k ctrl-1": ["editor::FoldAtLevel", 1],
|
"ctrl-k ctrl-1": ["editor::FoldAtLevel", { "level": 1 }],
|
||||||
"ctrl-k ctrl-2": ["editor::FoldAtLevel", 2],
|
"ctrl-k ctrl-2": ["editor::FoldAtLevel", { "level": 2 }],
|
||||||
"ctrl-k ctrl-3": ["editor::FoldAtLevel", 3],
|
"ctrl-k ctrl-3": ["editor::FoldAtLevel", { "level": 3 }],
|
||||||
"ctrl-k ctrl-4": ["editor::FoldAtLevel", 4],
|
"ctrl-k ctrl-4": ["editor::FoldAtLevel", { "level": 4 }],
|
||||||
"ctrl-k ctrl-5": ["editor::FoldAtLevel", 5],
|
"ctrl-k ctrl-5": ["editor::FoldAtLevel", { "level": 5 }],
|
||||||
"ctrl-k ctrl-6": ["editor::FoldAtLevel", 6],
|
"ctrl-k ctrl-6": ["editor::FoldAtLevel", { "level": 6 }],
|
||||||
"ctrl-k ctrl-7": ["editor::FoldAtLevel", 7],
|
"ctrl-k ctrl-7": ["editor::FoldAtLevel", { "level": 7 }],
|
||||||
"ctrl-k ctrl-8": ["editor::FoldAtLevel", 8],
|
"ctrl-k ctrl-8": ["editor::FoldAtLevel", { "level": 8 }],
|
||||||
"ctrl-k ctrl-9": ["editor::FoldAtLevel", 9],
|
"ctrl-k ctrl-9": ["editor::FoldAtLevel", { "level": 9 }],
|
||||||
"ctrl-k ctrl-0": "editor::FoldAll",
|
"ctrl-k ctrl-0": "editor::FoldAll",
|
||||||
"ctrl-k ctrl-j": "editor::UnfoldAll",
|
"ctrl-k ctrl-j": "editor::UnfoldAll",
|
||||||
"ctrl-space": "editor::ShowCompletions",
|
"ctrl-space": "editor::ShowCompletions",
|
||||||
@@ -368,12 +338,7 @@
|
|||||||
"ctrl-\\": "pane::SplitRight",
|
"ctrl-\\": "pane::SplitRight",
|
||||||
"ctrl-k v": "markdown::OpenPreviewToTheSide",
|
"ctrl-k v": "markdown::OpenPreviewToTheSide",
|
||||||
"ctrl-shift-v": "markdown::OpenPreview",
|
"ctrl-shift-v": "markdown::OpenPreview",
|
||||||
"ctrl-alt-shift-c": "editor::DisplayCursorNames",
|
"ctrl-alt-shift-c": "editor::DisplayCursorNames"
|
||||||
"ctrl-alt-y": "git::ToggleStaged",
|
|
||||||
"alt-y": "git::StageAndNext",
|
|
||||||
"alt-shift-y": "git::UnstageAndNext",
|
|
||||||
"alt-.": "editor::GoToHunk",
|
|
||||||
"alt-,": "editor::GoToPrevHunk"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -383,25 +348,39 @@
|
|||||||
"ctrl-g": "go_to_line::Toggle"
|
"ctrl-g": "go_to_line::Toggle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"context": "Pane",
|
||||||
|
"bindings": {
|
||||||
|
"alt-1": ["pane::ActivateItem", 0],
|
||||||
|
"alt-2": ["pane::ActivateItem", 1],
|
||||||
|
"alt-3": ["pane::ActivateItem", 2],
|
||||||
|
"alt-4": ["pane::ActivateItem", 3],
|
||||||
|
"alt-5": ["pane::ActivateItem", 4],
|
||||||
|
"alt-6": ["pane::ActivateItem", 5],
|
||||||
|
"alt-7": ["pane::ActivateItem", 6],
|
||||||
|
"alt-8": ["pane::ActivateItem", 7],
|
||||||
|
"alt-9": ["pane::ActivateItem", 8],
|
||||||
|
"alt-0": "pane::ActivateLastItem",
|
||||||
|
"ctrl-alt--": "pane::GoBack",
|
||||||
|
"ctrl-alt-_": "pane::GoForward",
|
||||||
|
"ctrl-shift-t": "pane::ReopenClosedItem",
|
||||||
|
"f3": "search::SelectNextMatch",
|
||||||
|
"shift-f3": "search::SelectPrevMatch",
|
||||||
|
"ctrl-shift-f": "project_search::ToggleFocus"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"context": "Workspace",
|
"context": "Workspace",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
// Change the default action on `menu::Confirm` by setting the parameter
|
// Change the default action on `menu::Confirm` by setting the parameter
|
||||||
// "alt-ctrl-o": ["projects::OpenRecent", { "create_new_window": true }],
|
// "alt-ctrl-o": ["projects::OpenRecent", { "create_new_window": true }],
|
||||||
"alt-open": "projects::OpenRecent",
|
|
||||||
"alt-ctrl-o": "projects::OpenRecent",
|
"alt-ctrl-o": "projects::OpenRecent",
|
||||||
"alt-shift-open": "projects::OpenRemote",
|
|
||||||
"alt-ctrl-shift-o": "projects::OpenRemote",
|
|
||||||
"alt-ctrl-shift-b": "branches::OpenRecent",
|
"alt-ctrl-shift-b": "branches::OpenRecent",
|
||||||
"ctrl-~": "workspace::NewTerminal",
|
"ctrl-~": "workspace::NewTerminal",
|
||||||
"save": "workspace::Save",
|
|
||||||
"ctrl-s": "workspace::Save",
|
"ctrl-s": "workspace::Save",
|
||||||
"ctrl-k s": "workspace::SaveWithoutFormat",
|
"ctrl-k s": "workspace::SaveWithoutFormat",
|
||||||
"shift-save": "workspace::SaveAs",
|
|
||||||
"ctrl-shift-s": "workspace::SaveAs",
|
"ctrl-shift-s": "workspace::SaveAs",
|
||||||
"new": "workspace::NewFile",
|
|
||||||
"ctrl-n": "workspace::NewFile",
|
"ctrl-n": "workspace::NewFile",
|
||||||
"shift-new": "workspace::NewWindow",
|
|
||||||
"ctrl-shift-n": "workspace::NewWindow",
|
"ctrl-shift-n": "workspace::NewWindow",
|
||||||
"ctrl-`": "terminal_panel::ToggleFocus",
|
"ctrl-`": "terminal_panel::ToggleFocus",
|
||||||
"alt-1": ["workspace::ActivatePane", 0],
|
"alt-1": ["workspace::ActivatePane", 0],
|
||||||
@@ -417,10 +396,8 @@
|
|||||||
"ctrl-b": "workspace::ToggleLeftDock",
|
"ctrl-b": "workspace::ToggleLeftDock",
|
||||||
"ctrl-j": "workspace::ToggleBottomDock",
|
"ctrl-j": "workspace::ToggleBottomDock",
|
||||||
"ctrl-alt-y": "workspace::CloseAllDocks",
|
"ctrl-alt-y": "workspace::CloseAllDocks",
|
||||||
"shift-find": "pane::DeploySearch",
|
|
||||||
"ctrl-shift-f": "pane::DeploySearch",
|
"ctrl-shift-f": "pane::DeploySearch",
|
||||||
"ctrl-shift-h": ["pane::DeploySearch", { "replace_enabled": true }],
|
"ctrl-shift-h": ["pane::DeploySearch", { "replace_enabled": true }],
|
||||||
"ctrl-shift-t": "pane::ReopenClosedItem",
|
|
||||||
"ctrl-k ctrl-s": "zed::OpenKeymap",
|
"ctrl-k ctrl-s": "zed::OpenKeymap",
|
||||||
"ctrl-k ctrl-t": "theme_selector::Toggle",
|
"ctrl-k ctrl-t": "theme_selector::Toggle",
|
||||||
"ctrl-t": "project_symbols::Toggle",
|
"ctrl-t": "project_symbols::Toggle",
|
||||||
@@ -428,25 +405,23 @@
|
|||||||
"ctrl-tab": "tab_switcher::Toggle",
|
"ctrl-tab": "tab_switcher::Toggle",
|
||||||
"ctrl-shift-tab": ["tab_switcher::Toggle", { "select_last": true }],
|
"ctrl-shift-tab": ["tab_switcher::Toggle", { "select_last": true }],
|
||||||
"ctrl-e": "file_finder::Toggle",
|
"ctrl-e": "file_finder::Toggle",
|
||||||
"f1": "command_palette::Toggle",
|
|
||||||
"ctrl-shift-p": "command_palette::Toggle",
|
"ctrl-shift-p": "command_palette::Toggle",
|
||||||
|
"f1": "command_palette::Toggle",
|
||||||
"ctrl-shift-m": "diagnostics::Deploy",
|
"ctrl-shift-m": "diagnostics::Deploy",
|
||||||
"ctrl-shift-e": "project_panel::ToggleFocus",
|
"ctrl-shift-e": "pane::RevealInProjectPanel",
|
||||||
"ctrl-shift-b": "outline_panel::ToggleFocus",
|
"ctrl-shift-b": "outline_panel::ToggleFocus",
|
||||||
"ctrl-shift-g": "git_panel::ToggleFocus",
|
|
||||||
"ctrl-?": "assistant::ToggleFocus",
|
"ctrl-?": "assistant::ToggleFocus",
|
||||||
"alt-save": "workspace::SaveAll",
|
|
||||||
"ctrl-alt-s": "workspace::SaveAll",
|
"ctrl-alt-s": "workspace::SaveAll",
|
||||||
"ctrl-k m": "language_selector::Toggle",
|
"ctrl-k m": "language_selector::Toggle",
|
||||||
"escape": "workspace::Unfollow",
|
"escape": "workspace::Unfollow",
|
||||||
"ctrl-k ctrl-left": "workspace::ActivatePaneLeft",
|
"ctrl-k ctrl-left": ["workspace::ActivatePaneInDirection", "Left"],
|
||||||
"ctrl-k ctrl-right": "workspace::ActivatePaneRight",
|
"ctrl-k ctrl-right": ["workspace::ActivatePaneInDirection", "Right"],
|
||||||
"ctrl-k ctrl-up": "workspace::ActivatePaneUp",
|
"ctrl-k ctrl-up": ["workspace::ActivatePaneInDirection", "Up"],
|
||||||
"ctrl-k ctrl-down": "workspace::ActivatePaneDown",
|
"ctrl-k ctrl-down": ["workspace::ActivatePaneInDirection", "Down"],
|
||||||
"ctrl-k shift-left": "workspace::SwapPaneLeft",
|
"ctrl-k shift-left": ["workspace::SwapPaneInDirection", "Left"],
|
||||||
"ctrl-k shift-right": "workspace::SwapPaneRight",
|
"ctrl-k shift-right": ["workspace::SwapPaneInDirection", "Right"],
|
||||||
"ctrl-k shift-up": "workspace::SwapPaneUp",
|
"ctrl-k shift-up": ["workspace::SwapPaneInDirection", "Up"],
|
||||||
"ctrl-k shift-down": "workspace::SwapPaneDown",
|
"ctrl-k shift-down": ["workspace::SwapPaneInDirection", "Down"],
|
||||||
"ctrl-shift-x": "zed::Extensions",
|
"ctrl-shift-x": "zed::Extensions",
|
||||||
"ctrl-shift-r": "task::Rerun",
|
"ctrl-shift-r": "task::Rerun",
|
||||||
"ctrl-alt-r": "task::Rerun",
|
"ctrl-alt-r": "task::Rerun",
|
||||||
@@ -457,17 +432,11 @@
|
|||||||
// "foo-bar": ["task::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
|
// "foo-bar": ["task::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "ApplicationMenu",
|
|
||||||
"bindings": {
|
|
||||||
"left": "app_menu::ActivateMenuLeft",
|
|
||||||
"right": "app_menu::ActivateMenuRight"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Bindings from Sublime Text
|
// Bindings from Sublime Text
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
|
"ctrl-shift-k": "editor::DeleteLine",
|
||||||
"ctrl-shift-d": "editor::DuplicateLineDown",
|
"ctrl-shift-d": "editor::DuplicateLineDown",
|
||||||
"ctrl-shift-j": "editor::JoinLines",
|
"ctrl-shift-j": "editor::JoinLines",
|
||||||
"ctrl-alt-backspace": "editor::DeleteToPreviousSubwordStart",
|
"ctrl-alt-backspace": "editor::DeleteToPreviousSubwordStart",
|
||||||
@@ -503,28 +472,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && showing_completions",
|
"context": "Editor && showing_completions",
|
||||||
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"enter": "editor::ConfirmCompletion",
|
"enter": "editor::ConfirmCompletion",
|
||||||
"tab": "editor::ComposeCompletion"
|
"tab": "editor::ComposeCompletion"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Bindings for accepting edit predictions
|
|
||||||
//
|
|
||||||
// alt-l is provided as an alternative to tab/alt-tab. and will be displayed in the UI. This is
|
|
||||||
// because alt-tab may not be available, as it is often used for window switching.
|
|
||||||
{
|
{
|
||||||
"context": "Editor && edit_prediction",
|
"context": "Editor && inline_completion && !showing_completions",
|
||||||
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-tab": "editor::AcceptEditPrediction",
|
"tab": "editor::AcceptInlineCompletion"
|
||||||
"alt-l": "editor::AcceptEditPrediction",
|
|
||||||
"tab": "editor::AcceptEditPrediction"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "Editor && edit_prediction_conflict",
|
|
||||||
"bindings": {
|
|
||||||
"alt-tab": "editor::AcceptEditPrediction",
|
|
||||||
"alt-l": "editor::AcceptEditPrediction"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -536,10 +494,10 @@
|
|||||||
{
|
{
|
||||||
"context": "Editor && (showing_code_actions || showing_completions)",
|
"context": "Editor && (showing_code_actions || showing_completions)",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-p": "editor::ContextMenuPrev",
|
|
||||||
"up": "editor::ContextMenuPrev",
|
"up": "editor::ContextMenuPrev",
|
||||||
"ctrl-n": "editor::ContextMenuNext",
|
"ctrl-p": "editor::ContextMenuPrev",
|
||||||
"down": "editor::ContextMenuNext",
|
"down": "editor::ContextMenuNext",
|
||||||
|
"ctrl-n": "editor::ContextMenuNext",
|
||||||
"pageup": "editor::ContextMenuFirst",
|
"pageup": "editor::ContextMenuFirst",
|
||||||
"pagedown": "editor::ContextMenuLast"
|
"pagedown": "editor::ContextMenuLast"
|
||||||
}
|
}
|
||||||
@@ -548,7 +506,8 @@
|
|||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-alt-shift-f": "workspace::FollowNextCollaborator",
|
"ctrl-alt-shift-f": "workspace::FollowNextCollaborator",
|
||||||
"ctrl-alt-i": "zed::DebugElements"
|
"ctrl-alt-i": "zed::DebugElements",
|
||||||
|
"ctrl-:": "editor::ToggleInlayHints"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -562,12 +521,10 @@
|
|||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-enter": "editor::OpenExcerpts",
|
"alt-enter": "editor::OpenExcerpts",
|
||||||
"shift-enter": "editor::ExpandExcerpts",
|
"shift-enter": "editor::ExpandExcerpts",
|
||||||
"ctrl-alt-enter": "editor::OpenExcerptsSplit",
|
"ctrl-k enter": "editor::OpenExcerptsSplit",
|
||||||
"ctrl-shift-e": "pane::RevealInProjectPanel",
|
|
||||||
"ctrl-f8": "editor::GoToHunk",
|
"ctrl-f8": "editor::GoToHunk",
|
||||||
"ctrl-shift-f8": "editor::GoToPrevHunk",
|
"ctrl-shift-f8": "editor::GoToPrevHunk",
|
||||||
"ctrl-enter": "assistant::InlineAssist",
|
"ctrl-enter": "assistant::InlineAssist"
|
||||||
"ctrl-:": "editor::ToggleInlayHints"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -590,57 +547,19 @@
|
|||||||
"ctrl-enter": "assistant::Assist",
|
"ctrl-enter": "assistant::Assist",
|
||||||
"ctrl-shift-enter": "assistant::Edit",
|
"ctrl-shift-enter": "assistant::Edit",
|
||||||
"ctrl-s": "workspace::Save",
|
"ctrl-s": "workspace::Save",
|
||||||
"save": "workspace::Save",
|
|
||||||
"ctrl->": "assistant::QuoteSelection",
|
"ctrl->": "assistant::QuoteSelection",
|
||||||
"ctrl-<": "assistant::InsertIntoEditor",
|
"ctrl-<": "assistant::InsertIntoEditor",
|
||||||
"ctrl-alt-/": "assistant::ToggleModelSelector",
|
|
||||||
"shift-enter": "assistant::Split",
|
"shift-enter": "assistant::Split",
|
||||||
"ctrl-r": "assistant::CycleMessageRole",
|
"ctrl-r": "assistant::CycleMessageRole",
|
||||||
"enter": "assistant::ConfirmCommand",
|
"enter": "assistant::ConfirmCommand",
|
||||||
"alt-enter": "editor::Newline"
|
"alt-enter": "editor::Newline"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "AssistantPanel2",
|
|
||||||
"bindings": {
|
|
||||||
"ctrl-n": "assistant2::NewThread",
|
|
||||||
"new": "assistant2::NewThread",
|
|
||||||
"ctrl-shift-h": "assistant2::OpenHistory",
|
|
||||||
"ctrl-alt-/": "assistant::ToggleModelSelector",
|
|
||||||
"ctrl-shift-a": "assistant2::ToggleContextPicker",
|
|
||||||
"ctrl-e": "assistant2::ChatMode",
|
|
||||||
"ctrl-alt-e": "assistant2::RemoveAllContext"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "MessageEditor > Editor",
|
|
||||||
"bindings": {
|
|
||||||
"enter": "assistant2::Chat"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "ContextStrip",
|
|
||||||
"bindings": {
|
|
||||||
"up": "assistant2::FocusUp",
|
|
||||||
"right": "assistant2::FocusRight",
|
|
||||||
"left": "assistant2::FocusLeft",
|
|
||||||
"down": "assistant2::FocusDown",
|
|
||||||
"backspace": "assistant2::RemoveFocusedContext",
|
|
||||||
"enter": "assistant2::AcceptSuggestedContext"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "ThreadHistory",
|
|
||||||
"bindings": {
|
|
||||||
"backspace": "assistant2::RemoveSelectedThread"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "PromptEditor",
|
"context": "PromptEditor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-[": "assistant::CyclePreviousInlineAssist",
|
"ctrl-[": "assistant::CyclePreviousInlineAssist",
|
||||||
"ctrl-]": "assistant::CycleNextInlineAssist",
|
"ctrl-]": "assistant::CycleNextInlineAssist"
|
||||||
"ctrl-alt-e": "assistant2::RemoveAllContext"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -655,16 +574,14 @@
|
|||||||
"escape": "menu::Cancel",
|
"escape": "menu::Cancel",
|
||||||
"left": "outline_panel::CollapseSelectedEntry",
|
"left": "outline_panel::CollapseSelectedEntry",
|
||||||
"right": "outline_panel::ExpandSelectedEntry",
|
"right": "outline_panel::ExpandSelectedEntry",
|
||||||
"alt-copy": "outline_panel::CopyPath",
|
|
||||||
"ctrl-alt-c": "outline_panel::CopyPath",
|
"ctrl-alt-c": "outline_panel::CopyPath",
|
||||||
"alt-shift-copy": "workspace::CopyRelativePath",
|
"alt-ctrl-shift-c": "outline_panel::CopyRelativePath",
|
||||||
"alt-ctrl-shift-c": "workspace::CopyRelativePath",
|
|
||||||
"alt-ctrl-r": "outline_panel::RevealInFileManager",
|
"alt-ctrl-r": "outline_panel::RevealInFileManager",
|
||||||
"space": "outline_panel::Open",
|
"space": "outline_panel::Open",
|
||||||
"shift-down": "menu::SelectNext",
|
"shift-down": "menu::SelectNext",
|
||||||
"shift-up": "menu::SelectPrev",
|
"shift-up": "menu::SelectPrev",
|
||||||
"alt-enter": "editor::OpenExcerpts",
|
"alt-enter": "editor::OpenExcerpts",
|
||||||
"ctrl-alt-enter": "editor::OpenExcerptsSplit"
|
"ctrl-k enter": "editor::OpenExcerptsSplit"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -672,91 +589,43 @@
|
|||||||
"bindings": {
|
"bindings": {
|
||||||
"left": "project_panel::CollapseSelectedEntry",
|
"left": "project_panel::CollapseSelectedEntry",
|
||||||
"right": "project_panel::ExpandSelectedEntry",
|
"right": "project_panel::ExpandSelectedEntry",
|
||||||
"new": "project_panel::NewFile",
|
|
||||||
"ctrl-n": "project_panel::NewFile",
|
"ctrl-n": "project_panel::NewFile",
|
||||||
"alt-new": "project_panel::NewDirectory",
|
|
||||||
"alt-ctrl-n": "project_panel::NewDirectory",
|
"alt-ctrl-n": "project_panel::NewDirectory",
|
||||||
"cut": "project_panel::Cut",
|
|
||||||
"ctrl-x": "project_panel::Cut",
|
|
||||||
"copy": "project_panel::Copy",
|
|
||||||
"ctrl-insert": "project_panel::Copy",
|
"ctrl-insert": "project_panel::Copy",
|
||||||
"ctrl-c": "project_panel::Copy",
|
|
||||||
"paste": "project_panel::Paste",
|
|
||||||
"shift-insert": "project_panel::Paste",
|
"shift-insert": "project_panel::Paste",
|
||||||
"ctrl-v": "project_panel::Paste",
|
|
||||||
"alt-copy": "project_panel::CopyPath",
|
|
||||||
"ctrl-alt-c": "project_panel::CopyPath",
|
"ctrl-alt-c": "project_panel::CopyPath",
|
||||||
"alt-shift-copy": "workspace::CopyRelativePath",
|
"alt-ctrl-shift-c": "project_panel::CopyRelativePath",
|
||||||
"alt-ctrl-shift-c": "workspace::CopyRelativePath",
|
|
||||||
"enter": "project_panel::Rename",
|
"enter": "project_panel::Rename",
|
||||||
"f2": "project_panel::Rename",
|
|
||||||
"backspace": ["project_panel::Trash", { "skip_prompt": false }],
|
"backspace": ["project_panel::Trash", { "skip_prompt": false }],
|
||||||
"delete": ["project_panel::Trash", { "skip_prompt": false }],
|
|
||||||
"shift-delete": ["project_panel::Delete", { "skip_prompt": false }],
|
"shift-delete": ["project_panel::Delete", { "skip_prompt": false }],
|
||||||
"ctrl-backspace": ["project_panel::Delete", { "skip_prompt": false }],
|
"ctrl-backspace": ["project_panel::Delete", { "skip_prompt": false }],
|
||||||
"ctrl-delete": ["project_panel::Delete", { "skip_prompt": false }],
|
"ctrl-delete": ["project_panel::Delete", { "skip_prompt": false }],
|
||||||
"alt-ctrl-r": "project_panel::RevealInFileManager",
|
"alt-ctrl-r": "project_panel::RevealInFileManager",
|
||||||
"ctrl-shift-enter": "project_panel::OpenWithSystem",
|
"ctrl-shift-enter": "project_panel::OpenWithSystem",
|
||||||
"shift-find": "project_panel::NewSearchInDirectory",
|
"ctrl-shift-e": "project_panel::ToggleFocus",
|
||||||
"ctrl-shift-f": "project_panel::NewSearchInDirectory",
|
"ctrl-shift-f": "project_panel::NewSearchInDirectory",
|
||||||
"shift-down": "menu::SelectNext",
|
"shift-down": "menu::SelectNext",
|
||||||
"shift-up": "menu::SelectPrev",
|
"shift-up": "menu::SelectPrev",
|
||||||
"escape": "menu::Cancel"
|
"escape": "menu::Cancel"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Separate block with same context so these display in context menus
|
||||||
|
"context": "ProjectPanel",
|
||||||
|
"bindings": {
|
||||||
|
"f2": "project_panel::Rename",
|
||||||
|
"ctrl-c": "project_panel::Copy",
|
||||||
|
"ctrl-x": "project_panel::Cut",
|
||||||
|
"ctrl-v": "project_panel::Paste",
|
||||||
|
"delete": ["project_panel::Trash", { "skip_prompt": false }]
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"context": "ProjectPanel && not_editing",
|
"context": "ProjectPanel && not_editing",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"space": "project_panel::Open"
|
"space": "project_panel::Open"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "GitPanel && ChangesList",
|
|
||||||
"bindings": {
|
|
||||||
"up": "menu::SelectPrev",
|
|
||||||
"down": "menu::SelectNext",
|
|
||||||
"enter": "menu::Confirm",
|
|
||||||
"space": "git::ToggleStaged",
|
|
||||||
"ctrl-space": "git::StageAll",
|
|
||||||
"ctrl-shift-space": "git::UnstageAll",
|
|
||||||
"tab": "git_panel::FocusEditor",
|
|
||||||
"shift-tab": "git_panel::FocusEditor",
|
|
||||||
"escape": "git_panel::ToggleFocus",
|
|
||||||
"ctrl-enter": "git::Commit",
|
|
||||||
"alt-enter": "menu::SecondaryConfirm"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitCommit > Editor",
|
|
||||||
"bindings": {
|
|
||||||
"enter": "editor::Newline",
|
|
||||||
"ctrl-enter": "git::Commit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitDiff > Editor",
|
|
||||||
"bindings": {
|
|
||||||
"ctrl-enter": "git::Commit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitPanel > Editor",
|
|
||||||
"bindings": {
|
|
||||||
"escape": "git_panel::FocusChanges",
|
|
||||||
"tab": "git_panel::FocusChanges",
|
|
||||||
"shift-tab": "git_panel::FocusChanges",
|
|
||||||
"ctrl-enter": "git::Commit",
|
|
||||||
"alt-up": "git_panel::FocusChanges"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitCommit > Editor",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"enter": "editor::Newline",
|
|
||||||
"ctrl-enter": "git::Commit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "CollabPanel && not_editing",
|
"context": "CollabPanel && not_editing",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
@@ -790,7 +659,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "FileFinder || (FileFinder > Picker > Editor) || (FileFinder > Picker > menu)",
|
"context": "FileFinder",
|
||||||
|
"bindings": {
|
||||||
|
"ctrl": "file_finder::ToggleMenu"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"context": "FileFinder && !menu_open",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-shift-p": "file_finder::SelectPrev",
|
"ctrl-shift-p": "file_finder::SelectPrev",
|
||||||
"ctrl-j": "pane::SplitDown",
|
"ctrl-j": "pane::SplitDown",
|
||||||
@@ -799,12 +674,21 @@
|
|||||||
"ctrl-l": "pane::SplitRight"
|
"ctrl-l": "pane::SplitRight"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"context": "FileFinder && menu_open",
|
||||||
|
"bindings": {
|
||||||
|
"j": "pane::SplitDown",
|
||||||
|
"k": "pane::SplitUp",
|
||||||
|
"h": "pane::SplitLeft",
|
||||||
|
"l": "pane::SplitRight"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"context": "TabSwitcher",
|
"context": "TabSwitcher",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-shift-tab": "menu::SelectPrev",
|
|
||||||
"ctrl-up": "menu::SelectPrev",
|
"ctrl-up": "menu::SelectPrev",
|
||||||
"ctrl-down": "menu::SelectNext",
|
"ctrl-down": "menu::SelectNext",
|
||||||
|
"ctrl-shift-tab": "menu::SelectPrev",
|
||||||
"ctrl-backspace": "tab_switcher::CloseSelectedItem"
|
"ctrl-backspace": "tab_switcher::CloseSelectedItem"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -812,19 +696,12 @@
|
|||||||
"context": "Terminal",
|
"context": "Terminal",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-alt-space": "terminal::ShowCharacterPalette",
|
"ctrl-alt-space": "terminal::ShowCharacterPalette",
|
||||||
"copy": "terminal::Copy",
|
|
||||||
"ctrl-insert": "terminal::Copy",
|
"ctrl-insert": "terminal::Copy",
|
||||||
"ctrl-shift-c": "terminal::Copy",
|
|
||||||
"paste": "terminal::Paste",
|
|
||||||
"shift-insert": "terminal::Paste",
|
"shift-insert": "terminal::Paste",
|
||||||
"ctrl-shift-v": "terminal::Paste",
|
|
||||||
"ctrl-enter": "assistant::InlineAssist",
|
"ctrl-enter": "assistant::InlineAssist",
|
||||||
"alt-b": ["terminal::SendText", "\u001bb"],
|
|
||||||
"alt-f": ["terminal::SendText", "\u001bf"],
|
|
||||||
// Overrides for conflicting keybindings
|
// Overrides for conflicting keybindings
|
||||||
"ctrl-w": ["terminal::SendKeystroke", "ctrl-w"],
|
"ctrl-w": ["terminal::SendKeystroke", "ctrl-w"],
|
||||||
"ctrl-shift-a": "editor::SelectAll",
|
"ctrl-shift-a": "editor::SelectAll",
|
||||||
"find": "buffer_search::Deploy",
|
|
||||||
"ctrl-shift-f": "buffer_search::Deploy",
|
"ctrl-shift-f": "buffer_search::Deploy",
|
||||||
"ctrl-shift-l": "terminal::Clear",
|
"ctrl-shift-l": "terminal::Clear",
|
||||||
"ctrl-shift-w": "pane::CloseActiveItem",
|
"ctrl-shift-w": "pane::CloseActiveItem",
|
||||||
@@ -835,7 +712,6 @@
|
|||||||
"pagedown": ["terminal::SendKeystroke", "pagedown"],
|
"pagedown": ["terminal::SendKeystroke", "pagedown"],
|
||||||
"escape": ["terminal::SendKeystroke", "escape"],
|
"escape": ["terminal::SendKeystroke", "escape"],
|
||||||
"enter": ["terminal::SendKeystroke", "enter"],
|
"enter": ["terminal::SendKeystroke", "enter"],
|
||||||
"ctrl-b": ["terminal::SendKeystroke", "ctrl-b"],
|
|
||||||
"ctrl-c": ["terminal::SendKeystroke", "ctrl-c"],
|
"ctrl-c": ["terminal::SendKeystroke", "ctrl-c"],
|
||||||
"shift-pageup": "terminal::ScrollPageUp",
|
"shift-pageup": "terminal::ScrollPageUp",
|
||||||
"shift-pagedown": "terminal::ScrollPageDown",
|
"shift-pagedown": "terminal::ScrollPageDown",
|
||||||
@@ -847,9 +723,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "ZedPredictModal",
|
// Separate block with same context so these display in context menus
|
||||||
|
"context": "Terminal",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"escape": "menu::Cancel"
|
"ctrl-shift-c": "terminal::Copy",
|
||||||
|
"ctrl-shift-v": "terminal::Paste"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,44 +3,41 @@
|
|||||||
{
|
{
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"home": "menu::SelectFirst",
|
|
||||||
"shift-pageup": "menu::SelectFirst",
|
|
||||||
"pageup": "menu::SelectFirst",
|
|
||||||
"cmd-up": "menu::SelectFirst",
|
|
||||||
"end": "menu::SelectLast",
|
|
||||||
"shift-pagedown": "menu::SelectLast",
|
|
||||||
"pagedown": "menu::SelectLast",
|
|
||||||
"cmd-down": "menu::SelectLast",
|
|
||||||
"tab": "menu::SelectNext",
|
|
||||||
"ctrl-n": "menu::SelectNext",
|
|
||||||
"down": "menu::SelectNext",
|
|
||||||
"shift-tab": "menu::SelectPrev",
|
|
||||||
"ctrl-p": "menu::SelectPrev",
|
|
||||||
"up": "menu::SelectPrev",
|
"up": "menu::SelectPrev",
|
||||||
|
"shift-tab": "menu::SelectPrev",
|
||||||
|
"home": "menu::SelectFirst",
|
||||||
|
"pageup": "menu::SelectFirst",
|
||||||
|
"shift-pageup": "menu::SelectFirst",
|
||||||
|
"ctrl-p": "menu::SelectPrev",
|
||||||
|
"down": "menu::SelectNext",
|
||||||
|
"tab": "menu::SelectNext",
|
||||||
|
"end": "menu::SelectLast",
|
||||||
|
"pagedown": "menu::SelectLast",
|
||||||
|
"shift-pagedown": "menu::SelectFirst",
|
||||||
|
"ctrl-n": "menu::SelectNext",
|
||||||
|
"cmd-up": "menu::SelectFirst",
|
||||||
|
"cmd-down": "menu::SelectLast",
|
||||||
"enter": "menu::Confirm",
|
"enter": "menu::Confirm",
|
||||||
"ctrl-enter": "menu::SecondaryConfirm",
|
"ctrl-enter": "menu::SecondaryConfirm",
|
||||||
"cmd-enter": "menu::SecondaryConfirm",
|
"cmd-enter": "menu::SecondaryConfirm",
|
||||||
"ctrl-escape": "menu::Cancel",
|
|
||||||
"cmd-escape": "menu::Cancel",
|
|
||||||
"ctrl-c": "menu::Cancel",
|
|
||||||
"escape": "menu::Cancel",
|
"escape": "menu::Cancel",
|
||||||
|
"cmd-escape": "menu::Cancel",
|
||||||
|
"ctrl-escape": "menu::Cancel",
|
||||||
|
"ctrl-c": "menu::Cancel",
|
||||||
"alt-shift-enter": "menu::Restart",
|
"alt-shift-enter": "menu::Restart",
|
||||||
"cmd-shift-w": "workspace::CloseWindow",
|
"cmd-shift-w": "workspace::CloseWindow",
|
||||||
"shift-escape": "workspace::ToggleZoom",
|
"shift-escape": "workspace::ToggleZoom",
|
||||||
"cmd-o": "workspace::Open",
|
"cmd-o": "workspace::Open",
|
||||||
"cmd-=": ["zed::IncreaseBufferFontSize", { "persist": false }],
|
"cmd-=": "zed::IncreaseBufferFontSize",
|
||||||
"cmd-+": ["zed::IncreaseBufferFontSize", { "persist": false }],
|
"cmd-+": "zed::IncreaseBufferFontSize",
|
||||||
"cmd--": ["zed::DecreaseBufferFontSize", { "persist": false }],
|
"cmd--": "zed::DecreaseBufferFontSize",
|
||||||
"cmd-0": ["zed::ResetBufferFontSize", { "persist": false }],
|
"cmd-0": "zed::ResetBufferFontSize",
|
||||||
"cmd-,": "zed::OpenSettings",
|
"cmd-,": "zed::OpenSettings",
|
||||||
"cmd-q": "zed::Quit",
|
"cmd-q": "zed::Quit",
|
||||||
"cmd-h": "zed::Hide",
|
"cmd-h": "zed::Hide",
|
||||||
"alt-cmd-h": "zed::HideOthers",
|
"alt-cmd-h": "zed::HideOthers",
|
||||||
"cmd-m": "zed::Minimize",
|
"cmd-m": "zed::Minimize",
|
||||||
"fn-f": "zed::ToggleFullScreen",
|
"ctrl-cmd-f": "zed::ToggleFullScreen"
|
||||||
"ctrl-cmd-f": "zed::ToggleFullScreen",
|
|
||||||
"ctrl-cmd-z": "edit_prediction::RateCompletions",
|
|
||||||
"ctrl-cmd-i": "edit_prediction::ToggleMenu"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -48,18 +45,18 @@
|
|||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"escape": "editor::Cancel",
|
"escape": "editor::Cancel",
|
||||||
|
"backspace": "editor::Backspace",
|
||||||
"shift-backspace": "editor::Backspace",
|
"shift-backspace": "editor::Backspace",
|
||||||
"ctrl-h": "editor::Backspace",
|
"ctrl-h": "editor::Backspace",
|
||||||
"backspace": "editor::Backspace",
|
|
||||||
"ctrl-d": "editor::Delete",
|
|
||||||
"delete": "editor::Delete",
|
"delete": "editor::Delete",
|
||||||
|
"ctrl-d": "editor::Delete",
|
||||||
"tab": "editor::Tab",
|
"tab": "editor::Tab",
|
||||||
"shift-tab": "editor::TabPrev",
|
"shift-tab": "editor::TabPrev",
|
||||||
"ctrl-t": "editor::Transpose",
|
"ctrl-t": "editor::Transpose",
|
||||||
"ctrl-k": "editor::KillRingCut",
|
"ctrl-k": "editor::KillRingCut",
|
||||||
"ctrl-y": "editor::KillRingYank",
|
"ctrl-y": "editor::KillRingYank",
|
||||||
"cmd-k cmd-q": "editor::Rewrap",
|
|
||||||
"cmd-k q": "editor::Rewrap",
|
"cmd-k q": "editor::Rewrap",
|
||||||
|
"cmd-k cmd-q": "editor::Rewrap",
|
||||||
"cmd-backspace": "editor::DeleteToBeginningOfLine",
|
"cmd-backspace": "editor::DeleteToBeginningOfLine",
|
||||||
"cmd-delete": "editor::DeleteToEndOfLine",
|
"cmd-delete": "editor::DeleteToEndOfLine",
|
||||||
"alt-backspace": "editor::DeleteToPreviousWordStart",
|
"alt-backspace": "editor::DeleteToPreviousWordStart",
|
||||||
@@ -70,37 +67,36 @@
|
|||||||
"cmd-v": "editor::Paste",
|
"cmd-v": "editor::Paste",
|
||||||
"cmd-z": "editor::Undo",
|
"cmd-z": "editor::Undo",
|
||||||
"cmd-shift-z": "editor::Redo",
|
"cmd-shift-z": "editor::Redo",
|
||||||
|
"ctrl-shift-z": "zeta::RateCompletions",
|
||||||
"up": "editor::MoveUp",
|
"up": "editor::MoveUp",
|
||||||
"ctrl-up": "editor::MoveToStartOfParagraph",
|
"ctrl-up": "editor::MoveToStartOfParagraph",
|
||||||
"pageup": "editor::MovePageUp",
|
"pageup": "editor::MovePageUp",
|
||||||
"shift-pageup": "editor::SelectPageUp",
|
"shift-pageup": "editor::SelectPageUp",
|
||||||
"cmd-pageup": "editor::PageUp",
|
"cmd-pageup": "editor::PageUp",
|
||||||
"ctrl-pageup": "editor::LineUp",
|
"ctrl-pageup": "editor::LineUp",
|
||||||
|
"home": "editor::MoveToBeginningOfLine",
|
||||||
"down": "editor::MoveDown",
|
"down": "editor::MoveDown",
|
||||||
"ctrl-down": "editor::MoveToEndOfParagraph",
|
"ctrl-down": "editor::MoveToEndOfParagraph",
|
||||||
"pagedown": "editor::MovePageDown",
|
"pagedown": "editor::MovePageDown",
|
||||||
"shift-pagedown": "editor::SelectPageDown",
|
"shift-pagedown": "editor::SelectPageDown",
|
||||||
"cmd-pagedown": "editor::PageDown",
|
"cmd-pagedown": "editor::PageDown",
|
||||||
"ctrl-pagedown": "editor::LineDown",
|
"ctrl-pagedown": "editor::LineDown",
|
||||||
|
"end": "editor::MoveToEndOfLine",
|
||||||
|
"left": "editor::MoveLeft",
|
||||||
|
"right": "editor::MoveRight",
|
||||||
"ctrl-p": "editor::MoveUp",
|
"ctrl-p": "editor::MoveUp",
|
||||||
"ctrl-n": "editor::MoveDown",
|
"ctrl-n": "editor::MoveDown",
|
||||||
"ctrl-b": "editor::MoveLeft",
|
"ctrl-b": "editor::MoveLeft",
|
||||||
"left": "editor::MoveLeft",
|
|
||||||
"ctrl-f": "editor::MoveRight",
|
"ctrl-f": "editor::MoveRight",
|
||||||
"right": "editor::MoveRight",
|
|
||||||
"ctrl-l": "editor::ScrollCursorCenter",
|
"ctrl-l": "editor::ScrollCursorCenter",
|
||||||
"alt-left": "editor::MoveToPreviousWordStart",
|
"alt-left": "editor::MoveToPreviousWordStart",
|
||||||
"alt-right": "editor::MoveToNextWordEnd",
|
"alt-right": "editor::MoveToNextWordEnd",
|
||||||
"cmd-left": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"cmd-left": "editor::MoveToBeginningOfLine",
|
||||||
"ctrl-a": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false, "stop_at_indent": true }],
|
"ctrl-a": "editor::MoveToBeginningOfLine",
|
||||||
"home": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"cmd-right": "editor::MoveToEndOfLine",
|
||||||
"cmd-right": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": true }],
|
"ctrl-e": "editor::MoveToEndOfLine",
|
||||||
"ctrl-e": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }],
|
"cmd-up": "editor::MoveToBeginning",
|
||||||
"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": true }],
|
"cmd-down": "editor::MoveToEnd",
|
||||||
"cmd-up": "editor::MoveToStartOfExcerpt",
|
|
||||||
"cmd-down": "editor::MoveToEndOfExcerpt",
|
|
||||||
"cmd-home": "editor::MoveToBeginning", // Typed via `cmd-fn-left`
|
|
||||||
"cmd-end": "editor::MoveToEnd", // Typed via `cmd-fn-right`
|
|
||||||
"shift-up": "editor::SelectUp",
|
"shift-up": "editor::SelectUp",
|
||||||
"ctrl-shift-p": "editor::SelectUp",
|
"ctrl-shift-p": "editor::SelectUp",
|
||||||
"shift-down": "editor::SelectDown",
|
"shift-down": "editor::SelectDown",
|
||||||
@@ -113,14 +109,14 @@
|
|||||||
"alt-shift-right": "editor::SelectToNextWordEnd", // cursorWordRightSelect
|
"alt-shift-right": "editor::SelectToNextWordEnd", // cursorWordRightSelect
|
||||||
"ctrl-shift-up": "editor::SelectToStartOfParagraph",
|
"ctrl-shift-up": "editor::SelectToStartOfParagraph",
|
||||||
"ctrl-shift-down": "editor::SelectToEndOfParagraph",
|
"ctrl-shift-down": "editor::SelectToEndOfParagraph",
|
||||||
"cmd-shift-up": "editor::SelectToStartOfExcerpt",
|
"cmd-shift-up": "editor::SelectToBeginning",
|
||||||
"cmd-shift-down": "editor::SelectToEndOfExcerpt",
|
"cmd-shift-down": "editor::SelectToEnd",
|
||||||
"cmd-a": "editor::SelectAll",
|
"cmd-a": "editor::SelectAll",
|
||||||
"cmd-l": "editor::SelectLine",
|
"cmd-l": "editor::SelectLine",
|
||||||
"cmd-shift-i": "editor::Format",
|
"cmd-shift-i": "editor::Format",
|
||||||
"cmd-shift-left": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"cmd-shift-left": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],
|
||||||
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],
|
||||||
"ctrl-shift-a": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true, "stop_at_indent": true }],
|
"ctrl-shift-a": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],
|
||||||
"cmd-shift-right": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
"cmd-shift-right": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
||||||
"shift-end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
"shift-end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
||||||
"ctrl-shift-e": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
"ctrl-shift-e": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": true }],
|
||||||
@@ -128,52 +124,47 @@
|
|||||||
"ctrl-shift-v": ["editor::MovePageUp", { "center_cursor": true }],
|
"ctrl-shift-v": ["editor::MovePageUp", { "center_cursor": true }],
|
||||||
"ctrl-cmd-space": "editor::ShowCharacterPalette",
|
"ctrl-cmd-space": "editor::ShowCharacterPalette",
|
||||||
"cmd-;": "editor::ToggleLineNumbers",
|
"cmd-;": "editor::ToggleLineNumbers",
|
||||||
"cmd-alt-z": "git::Restore",
|
"cmd-alt-z": "editor::RevertSelectedHunks",
|
||||||
"cmd-alt-y": "git::ToggleStaged",
|
"cmd-'": "editor::ToggleHunkDiff",
|
||||||
"cmd-y": "git::StageAndNext",
|
"cmd-\"": "editor::ExpandAllHunkDiffs",
|
||||||
"cmd-shift-y": "git::UnstageAndNext",
|
|
||||||
"cmd-'": "editor::ToggleSelectedDiffHunks",
|
|
||||||
"cmd-\"": "editor::ExpandAllDiffHunks",
|
|
||||||
"cmd-alt-g b": "editor::ToggleGitBlame",
|
"cmd-alt-g b": "editor::ToggleGitBlame",
|
||||||
"cmd-i": "editor::ShowSignatureHelp",
|
"cmd-i": "editor::ShowSignatureHelp",
|
||||||
"ctrl-f12": "editor::GoToDeclaration",
|
"ctrl-f12": "editor::GoToDeclaration",
|
||||||
"alt-ctrl-f12": "editor::GoToDeclarationSplit",
|
"alt-ctrl-f12": "editor::GoToDeclarationSplit"
|
||||||
"ctrl-cmd-e": "editor::ToggleEditPrediction"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && mode == full",
|
"context": "Editor && mode == full",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"shift-enter": "editor::Newline",
|
|
||||||
"enter": "editor::Newline",
|
"enter": "editor::Newline",
|
||||||
|
"shift-enter": "editor::Newline",
|
||||||
"cmd-enter": "editor::NewlineBelow",
|
"cmd-enter": "editor::NewlineBelow",
|
||||||
"cmd-shift-enter": "editor::NewlineAbove",
|
"cmd-shift-enter": "editor::NewlineAbove",
|
||||||
"cmd-k z": "editor::ToggleSoftWrap",
|
"cmd-k z": "editor::ToggleSoftWrap",
|
||||||
"cmd-f": "buffer_search::Deploy",
|
"cmd-f": "buffer_search::Deploy",
|
||||||
"cmd-alt-f": "buffer_search::DeployReplace",
|
"cmd-alt-f": ["buffer_search::Deploy", { "replace_enabled": true }],
|
||||||
"cmd-alt-l": ["buffer_search::Deploy", { "selection_search_enabled": true }],
|
"cmd-alt-l": ["buffer_search::Deploy", { "selection_search_enabled": true }],
|
||||||
"cmd-e": ["buffer_search::Deploy", { "focus": false }],
|
"cmd-e": ["buffer_search::Deploy", { "focus": false }],
|
||||||
"cmd->": "assistant::QuoteSelection",
|
"cmd->": "assistant::QuoteSelection",
|
||||||
"cmd-<": "assistant::InsertIntoEditor",
|
"cmd-<": "assistant::InsertIntoEditor",
|
||||||
"cmd-alt-e": "editor::SelectEnclosingSymbol",
|
"cmd-alt-e": "editor::SelectEnclosingSymbol"
|
||||||
"alt-enter": "editor::OpenSelectionsInMultibuffer"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && mode == full && edit_prediction",
|
"context": "Editor && mode == full && inline_completion",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-tab": "editor::NextEditPrediction",
|
"alt-tab": "editor::NextInlineCompletion",
|
||||||
"alt-shift-tab": "editor::PreviousEditPrediction",
|
"alt-shift-tab": "editor::PreviousInlineCompletion",
|
||||||
"ctrl-cmd-right": "editor::AcceptPartialEditPrediction"
|
"ctrl-right": "editor::AcceptPartialInlineCompletion"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && !edit_prediction",
|
"context": "Editor && !inline_completion",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-tab": "editor::ShowEditPrediction"
|
"alt-tab": "editor::ShowInlineCompletion"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -205,14 +196,12 @@
|
|||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-k c": "assistant::CopyCode",
|
"cmd-k c": "assistant::CopyCode",
|
||||||
"cmd-shift-e": "project_panel::ToggleFocus",
|
|
||||||
"cmd-g": "search::SelectNextMatch",
|
"cmd-g": "search::SelectNextMatch",
|
||||||
"cmd-shift-g": "search::SelectPrevMatch",
|
"cmd-shift-g": "search::SelectPrevMatch",
|
||||||
"cmd-alt-/": "assistant::ToggleModelSelector",
|
"cmd-shift-m": "assistant::ToggleModelSelector",
|
||||||
"cmd-k h": "assistant::DeployHistory",
|
"cmd-k h": "assistant::DeployHistory",
|
||||||
"cmd-k l": "assistant::DeployPromptLibrary",
|
"cmd-k l": "assistant::DeployPromptLibrary",
|
||||||
"cmd-t": "assistant::NewChat",
|
"cmd-n": "assistant::NewContext"
|
||||||
"cmd-n": "assistant::NewChat"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -224,7 +213,6 @@
|
|||||||
"cmd-s": "workspace::Save",
|
"cmd-s": "workspace::Save",
|
||||||
"cmd->": "assistant::QuoteSelection",
|
"cmd->": "assistant::QuoteSelection",
|
||||||
"cmd-<": "assistant::InsertIntoEditor",
|
"cmd-<": "assistant::InsertIntoEditor",
|
||||||
"cmd-alt-/": "assistant::ToggleModelSelector",
|
|
||||||
"shift-enter": "assistant::Split",
|
"shift-enter": "assistant::Split",
|
||||||
"ctrl-r": "assistant::CycleMessageRole",
|
"ctrl-r": "assistant::CycleMessageRole",
|
||||||
"enter": "assistant::ConfirmCommand",
|
"enter": "assistant::ConfirmCommand",
|
||||||
@@ -236,12 +224,9 @@
|
|||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-n": "assistant2::NewThread",
|
"cmd-n": "assistant2::NewThread",
|
||||||
"cmd-alt-p": "assistant2::NewPromptEditor",
|
|
||||||
"cmd-shift-h": "assistant2::OpenHistory",
|
"cmd-shift-h": "assistant2::OpenHistory",
|
||||||
"cmd-alt-/": "assistant::ToggleModelSelector",
|
"cmd-shift-m": "assistant2::ToggleModelSelector",
|
||||||
"cmd-shift-a": "assistant2::ToggleContextPicker",
|
"cmd-shift-a": "assistant2::ToggleContextPicker"
|
||||||
"cmd-e": "assistant2::ChatMode",
|
|
||||||
"cmd-alt-e": "assistant2::RemoveAllContext"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -251,24 +236,6 @@
|
|||||||
"enter": "assistant2::Chat"
|
"enter": "assistant2::Chat"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "ContextStrip",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"up": "assistant2::FocusUp",
|
|
||||||
"right": "assistant2::FocusRight",
|
|
||||||
"left": "assistant2::FocusLeft",
|
|
||||||
"down": "assistant2::FocusDown",
|
|
||||||
"backspace": "assistant2::RemoveFocusedContext",
|
|
||||||
"enter": "assistant2::AcceptSuggestedContext"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "ThreadHistory",
|
|
||||||
"bindings": {
|
|
||||||
"backspace": "assistant2::RemoveSelectedThread"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "PromptLibrary",
|
"context": "PromptLibrary",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
@@ -289,8 +256,7 @@
|
|||||||
"alt-enter": "search::SelectAllMatches",
|
"alt-enter": "search::SelectAllMatches",
|
||||||
"cmd-f": "search::FocusSearch",
|
"cmd-f": "search::FocusSearch",
|
||||||
"cmd-alt-f": "search::ToggleReplace",
|
"cmd-alt-f": "search::ToggleReplace",
|
||||||
"cmd-alt-l": "search::ToggleSelection",
|
"cmd-alt-l": "search::ToggleSelection"
|
||||||
"cmd-shift-o": "outline::Toggle"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -352,17 +318,15 @@
|
|||||||
"context": "Pane",
|
"context": "Pane",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-cmd-left": "pane::ActivatePrevItem",
|
|
||||||
"cmd-{": "pane::ActivatePrevItem",
|
"cmd-{": "pane::ActivatePrevItem",
|
||||||
"alt-cmd-right": "pane::ActivateNextItem",
|
|
||||||
"cmd-}": "pane::ActivateNextItem",
|
"cmd-}": "pane::ActivateNextItem",
|
||||||
|
"alt-cmd-left": "pane::ActivatePrevItem",
|
||||||
|
"alt-cmd-right": "pane::ActivateNextItem",
|
||||||
"ctrl-shift-pageup": "pane::SwapItemLeft",
|
"ctrl-shift-pageup": "pane::SwapItemLeft",
|
||||||
"ctrl-shift-pagedown": "pane::SwapItemRight",
|
"ctrl-shift-pagedown": "pane::SwapItemRight",
|
||||||
"cmd-w": ["pane::CloseActiveItem", { "close_pinned": false }],
|
"cmd-w": "pane::CloseActiveItem",
|
||||||
"alt-cmd-t": ["pane::CloseInactiveItems", { "close_pinned": false }],
|
"alt-cmd-t": ["pane::CloseInactiveItems", { "close_pinned": false }],
|
||||||
"ctrl-alt-cmd-w": "workspace::CloseInactiveTabsAndPanes",
|
"ctrl-alt-cmd-w": "workspace::CloseInactiveTabsAndPanes",
|
||||||
"cmd-k e": ["pane::CloseItemsToTheLeft", { "close_pinned": false }],
|
|
||||||
"cmd-k t": ["pane::CloseItemsToTheRight", { "close_pinned": false }],
|
|
||||||
"cmd-k u": ["pane::CloseCleanItems", { "close_pinned": false }],
|
"cmd-k u": ["pane::CloseCleanItems", { "close_pinned": false }],
|
||||||
"cmd-k cmd-w": ["pane::CloseAllItems", { "close_pinned": false }],
|
"cmd-k cmd-w": ["pane::CloseAllItems", { "close_pinned": false }],
|
||||||
"cmd-f": "project_search::ToggleFocus",
|
"cmd-f": "project_search::ToggleFocus",
|
||||||
@@ -385,10 +349,10 @@
|
|||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-[": "editor::Outdent",
|
"cmd-[": "editor::Outdent",
|
||||||
"cmd-]": "editor::Indent",
|
"cmd-]": "editor::Indent",
|
||||||
"cmd-ctrl-p": "editor::AddSelectionAbove", // Insert cursor above
|
"cmd-alt-up": "editor::AddSelectionAbove", // Insert cursor above
|
||||||
"cmd-alt-up": "editor::AddSelectionAbove",
|
"cmd-ctrl-p": "editor::AddSelectionAbove",
|
||||||
"cmd-ctrl-n": "editor::AddSelectionBelow", // Insert cursor below
|
"cmd-alt-down": "editor::AddSelectionBelow", // Insert cursor below
|
||||||
"cmd-alt-down": "editor::AddSelectionBelow",
|
"cmd-ctrl-n": "editor::AddSelectionBelow",
|
||||||
"cmd-shift-k": "editor::DeleteLine",
|
"cmd-shift-k": "editor::DeleteLine",
|
||||||
"alt-up": "editor::MoveLineUp",
|
"alt-up": "editor::MoveLineUp",
|
||||||
"alt-down": "editor::MoveLineDown",
|
"alt-down": "editor::MoveLineDown",
|
||||||
@@ -415,26 +379,24 @@
|
|||||||
"shift-f12": "editor::GoToImplementation",
|
"shift-f12": "editor::GoToImplementation",
|
||||||
"alt-cmd-f12": "editor::GoToTypeDefinitionSplit",
|
"alt-cmd-f12": "editor::GoToTypeDefinitionSplit",
|
||||||
"alt-shift-f12": "editor::FindAllReferences",
|
"alt-shift-f12": "editor::FindAllReferences",
|
||||||
"cmd-|": "editor::MoveToEnclosingBracket",
|
|
||||||
"ctrl-m": "editor::MoveToEnclosingBracket",
|
"ctrl-m": "editor::MoveToEnclosingBracket",
|
||||||
|
"cmd-|": "editor::MoveToEnclosingBracket",
|
||||||
"alt-cmd-[": "editor::Fold",
|
"alt-cmd-[": "editor::Fold",
|
||||||
"alt-cmd-]": "editor::UnfoldLines",
|
"alt-cmd-]": "editor::UnfoldLines",
|
||||||
"cmd-k cmd-l": "editor::ToggleFold",
|
"cmd-k cmd-l": "editor::ToggleFold",
|
||||||
"cmd-k cmd-[": "editor::FoldRecursive",
|
"cmd-k cmd-[": "editor::FoldRecursive",
|
||||||
"cmd-k cmd-]": "editor::UnfoldRecursive",
|
"cmd-k cmd-]": "editor::UnfoldRecursive",
|
||||||
"cmd-k cmd-1": ["editor::FoldAtLevel", 1],
|
"cmd-k cmd-1": ["editor::FoldAtLevel", { "level": 1 }],
|
||||||
"cmd-k cmd-2": ["editor::FoldAtLevel", 2],
|
"cmd-k cmd-2": ["editor::FoldAtLevel", { "level": 2 }],
|
||||||
"cmd-k cmd-3": ["editor::FoldAtLevel", 3],
|
"cmd-k cmd-3": ["editor::FoldAtLevel", { "level": 3 }],
|
||||||
"cmd-k cmd-4": ["editor::FoldAtLevel", 4],
|
"cmd-k cmd-4": ["editor::FoldAtLevel", { "level": 4 }],
|
||||||
"cmd-k cmd-5": ["editor::FoldAtLevel", 5],
|
"cmd-k cmd-5": ["editor::FoldAtLevel", { "level": 5 }],
|
||||||
"cmd-k cmd-6": ["editor::FoldAtLevel", 6],
|
"cmd-k cmd-6": ["editor::FoldAtLevel", { "level": 6 }],
|
||||||
"cmd-k cmd-7": ["editor::FoldAtLevel", 7],
|
"cmd-k cmd-7": ["editor::FoldAtLevel", { "level": 7 }],
|
||||||
"cmd-k cmd-8": ["editor::FoldAtLevel", 8],
|
"cmd-k cmd-8": ["editor::FoldAtLevel", { "level": 8 }],
|
||||||
"cmd-k cmd-9": ["editor::FoldAtLevel", 9],
|
"cmd-k cmd-9": ["editor::FoldAtLevel", { "level": 9 }],
|
||||||
"cmd-k cmd-0": "editor::FoldAll",
|
"cmd-k cmd-0": "editor::FoldAll",
|
||||||
"cmd-k cmd-j": "editor::UnfoldAll",
|
"cmd-k cmd-j": "editor::UnfoldAll",
|
||||||
// Using `ctrl-space` in Zed requires disabling the macOS global shortcut.
|
|
||||||
// System Preferences->Keyboard->Keyboard Shortcuts->Input Sources->Select the previous input source (uncheck)
|
|
||||||
"ctrl-space": "editor::ShowCompletions",
|
"ctrl-space": "editor::ShowCompletions",
|
||||||
"cmd-.": "editor::ToggleCodeActions",
|
"cmd-.": "editor::ToggleCodeActions",
|
||||||
"cmd-k r": "editor::RevealInFileManager",
|
"cmd-k r": "editor::RevealInFileManager",
|
||||||
@@ -468,8 +430,9 @@
|
|||||||
"ctrl-9": ["pane::ActivateItem", 8],
|
"ctrl-9": ["pane::ActivateItem", 8],
|
||||||
"ctrl-0": "pane::ActivateLastItem",
|
"ctrl-0": "pane::ActivateLastItem",
|
||||||
"ctrl--": "pane::GoBack",
|
"ctrl--": "pane::GoBack",
|
||||||
"ctrl-_": "pane::GoForward",
|
"ctrl-shift--": "pane::GoForward",
|
||||||
"cmd-shift-f": "pane::DeploySearch"
|
"cmd-shift-t": "pane::ReopenClosedItem",
|
||||||
|
"cmd-shift-f": "project_search::ToggleFocus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -485,6 +448,7 @@
|
|||||||
"cmd-s": "workspace::Save",
|
"cmd-s": "workspace::Save",
|
||||||
"cmd-k s": "workspace::SaveWithoutFormat",
|
"cmd-k s": "workspace::SaveWithoutFormat",
|
||||||
"cmd-shift-s": "workspace::SaveAs",
|
"cmd-shift-s": "workspace::SaveAs",
|
||||||
|
"cmd-n": "workspace::NewFile",
|
||||||
"cmd-shift-n": "workspace::NewWindow",
|
"cmd-shift-n": "workspace::NewWindow",
|
||||||
"ctrl-`": "terminal_panel::ToggleFocus",
|
"ctrl-`": "terminal_panel::ToggleFocus",
|
||||||
"cmd-1": ["workspace::ActivatePane", 0],
|
"cmd-1": ["workspace::ActivatePane", 0],
|
||||||
@@ -502,7 +466,6 @@
|
|||||||
"alt-cmd-y": "workspace::CloseAllDocks",
|
"alt-cmd-y": "workspace::CloseAllDocks",
|
||||||
"cmd-shift-f": "pane::DeploySearch",
|
"cmd-shift-f": "pane::DeploySearch",
|
||||||
"cmd-shift-h": ["pane::DeploySearch", { "replace_enabled": true }],
|
"cmd-shift-h": ["pane::DeploySearch", { "replace_enabled": true }],
|
||||||
"cmd-shift-t": "pane::ReopenClosedItem",
|
|
||||||
"cmd-k cmd-s": "zed::OpenKeymap",
|
"cmd-k cmd-s": "zed::OpenKeymap",
|
||||||
"cmd-k cmd-t": "theme_selector::Toggle",
|
"cmd-k cmd-t": "theme_selector::Toggle",
|
||||||
"cmd-t": "project_symbols::Toggle",
|
"cmd-t": "project_symbols::Toggle",
|
||||||
@@ -511,21 +474,20 @@
|
|||||||
"ctrl-shift-tab": ["tab_switcher::Toggle", { "select_last": true }],
|
"ctrl-shift-tab": ["tab_switcher::Toggle", { "select_last": true }],
|
||||||
"cmd-shift-p": "command_palette::Toggle",
|
"cmd-shift-p": "command_palette::Toggle",
|
||||||
"cmd-shift-m": "diagnostics::Deploy",
|
"cmd-shift-m": "diagnostics::Deploy",
|
||||||
"cmd-shift-e": "project_panel::ToggleFocus",
|
"cmd-shift-e": "pane::RevealInProjectPanel",
|
||||||
"cmd-shift-b": "outline_panel::ToggleFocus",
|
"cmd-shift-b": "outline_panel::ToggleFocus",
|
||||||
"ctrl-shift-g": "git_panel::ToggleFocus",
|
|
||||||
"cmd-?": "assistant::ToggleFocus",
|
"cmd-?": "assistant::ToggleFocus",
|
||||||
"cmd-alt-s": "workspace::SaveAll",
|
"cmd-alt-s": "workspace::SaveAll",
|
||||||
"cmd-k m": "language_selector::Toggle",
|
"cmd-k m": "language_selector::Toggle",
|
||||||
"escape": "workspace::Unfollow",
|
"escape": "workspace::Unfollow",
|
||||||
"cmd-k cmd-left": "workspace::ActivatePaneLeft",
|
"cmd-k cmd-left": ["workspace::ActivatePaneInDirection", "Left"],
|
||||||
"cmd-k cmd-right": "workspace::ActivatePaneRight",
|
"cmd-k cmd-right": ["workspace::ActivatePaneInDirection", "Right"],
|
||||||
"cmd-k cmd-up": "workspace::ActivatePaneUp",
|
"cmd-k cmd-up": ["workspace::ActivatePaneInDirection", "Up"],
|
||||||
"cmd-k cmd-down": "workspace::ActivatePaneDown",
|
"cmd-k cmd-down": ["workspace::ActivatePaneInDirection", "Down"],
|
||||||
"cmd-k shift-left": "workspace::SwapPaneLeft",
|
"cmd-k shift-left": ["workspace::SwapPaneInDirection", "Left"],
|
||||||
"cmd-k shift-right": "workspace::SwapPaneRight",
|
"cmd-k shift-right": ["workspace::SwapPaneInDirection", "Right"],
|
||||||
"cmd-k shift-up": "workspace::SwapPaneUp",
|
"cmd-k shift-up": ["workspace::SwapPaneInDirection", "Up"],
|
||||||
"cmd-k shift-down": "workspace::SwapPaneDown",
|
"cmd-k shift-down": ["workspace::SwapPaneInDirection", "Down"],
|
||||||
"cmd-shift-x": "zed::Extensions"
|
"cmd-shift-x": "zed::Extensions"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -533,12 +495,11 @@
|
|||||||
"context": "Workspace && !Terminal",
|
"context": "Workspace && !Terminal",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-n": "workspace::NewFile",
|
|
||||||
"cmd-shift-r": "task::Spawn",
|
"cmd-shift-r": "task::Spawn",
|
||||||
"cmd-alt-r": "task::Rerun",
|
"cmd-alt-r": "task::Rerun",
|
||||||
"ctrl-alt-shift-r": ["task::Spawn", { "reveal_target": "center" }]
|
"ctrl-alt-shift-r": ["task::Spawn", { "reveal_target": "center" }]
|
||||||
// also possible to spawn tasks by name:
|
// also possible to spawn tasks by name:
|
||||||
// "foo-bar": ["task::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
|
// "foo-bar": ["task_name::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Bindings from Sublime Text
|
// Bindings from Sublime Text
|
||||||
@@ -589,17 +550,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && edit_prediction",
|
"context": "Editor && inline_completion && !showing_completions",
|
||||||
"bindings": {
|
|
||||||
"alt-tab": "editor::AcceptEditPrediction",
|
|
||||||
"tab": "editor::AcceptEditPrediction"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "Editor && edit_prediction_conflict",
|
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-tab": "editor::AcceptEditPrediction"
|
"tab": "editor::AcceptInlineCompletion"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -628,7 +582,8 @@
|
|||||||
"ctrl-alt-cmd-f": "workspace::FollowNextCollaborator",
|
"ctrl-alt-cmd-f": "workspace::FollowNextCollaborator",
|
||||||
// TODO: Move this to a dock open action
|
// TODO: Move this to a dock open action
|
||||||
"cmd-shift-c": "collab_panel::ToggleFocus",
|
"cmd-shift-c": "collab_panel::ToggleFocus",
|
||||||
"cmd-alt-i": "zed::DebugElements"
|
"cmd-alt-i": "zed::DebugElements",
|
||||||
|
"ctrl-:": "editor::ToggleInlayHints"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -637,12 +592,10 @@
|
|||||||
"bindings": {
|
"bindings": {
|
||||||
"alt-enter": "editor::OpenExcerpts",
|
"alt-enter": "editor::OpenExcerpts",
|
||||||
"shift-enter": "editor::ExpandExcerpts",
|
"shift-enter": "editor::ExpandExcerpts",
|
||||||
"cmd-alt-enter": "editor::OpenExcerptsSplit",
|
"cmd-k enter": "editor::OpenExcerptsSplit",
|
||||||
"cmd-shift-e": "pane::RevealInProjectPanel",
|
|
||||||
"cmd-f8": "editor::GoToHunk",
|
"cmd-f8": "editor::GoToHunk",
|
||||||
"cmd-shift-f8": "editor::GoToPrevHunk",
|
"cmd-shift-f8": "editor::GoToPrevHunk",
|
||||||
"ctrl-enter": "assistant::InlineAssist",
|
"ctrl-enter": "assistant::InlineAssist"
|
||||||
"ctrl-:": "editor::ToggleInlayHints"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -658,8 +611,6 @@
|
|||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-shift-a": "assistant2::ToggleContextPicker",
|
"cmd-shift-a": "assistant2::ToggleContextPicker",
|
||||||
"cmd-alt-/": "assistant::ToggleModelSelector",
|
|
||||||
"cmd-alt-e": "assistant2::RemoveAllContext",
|
|
||||||
"ctrl-[": "assistant::CyclePreviousInlineAssist",
|
"ctrl-[": "assistant::CyclePreviousInlineAssist",
|
||||||
"ctrl-]": "assistant::CycleNextInlineAssist"
|
"ctrl-]": "assistant::CycleNextInlineAssist"
|
||||||
}
|
}
|
||||||
@@ -678,14 +629,14 @@
|
|||||||
"escape": "menu::Cancel",
|
"escape": "menu::Cancel",
|
||||||
"left": "outline_panel::CollapseSelectedEntry",
|
"left": "outline_panel::CollapseSelectedEntry",
|
||||||
"right": "outline_panel::ExpandSelectedEntry",
|
"right": "outline_panel::ExpandSelectedEntry",
|
||||||
"cmd-alt-c": "workspace::CopyPath",
|
"cmd-alt-c": "outline_panel::CopyPath",
|
||||||
"alt-cmd-shift-c": "workspace::CopyRelativePath",
|
"alt-cmd-shift-c": "outline_panel::CopyRelativePath",
|
||||||
"alt-cmd-r": "outline_panel::RevealInFileManager",
|
"alt-cmd-r": "outline_panel::RevealInFileManager",
|
||||||
"space": "outline_panel::Open",
|
"space": "outline_panel::Open",
|
||||||
"shift-down": "menu::SelectNext",
|
"shift-down": "menu::SelectNext",
|
||||||
"shift-up": "menu::SelectPrev",
|
"shift-up": "menu::SelectPrev",
|
||||||
"alt-enter": "editor::OpenExcerpts",
|
"alt-enter": "editor::OpenExcerpts",
|
||||||
"cmd-alt-enter": "editor::OpenExcerptsSplit"
|
"cmd-k enter": "editor::OpenExcerptsSplit"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -700,8 +651,8 @@
|
|||||||
"cmd-x": "project_panel::Cut",
|
"cmd-x": "project_panel::Cut",
|
||||||
"cmd-c": "project_panel::Copy",
|
"cmd-c": "project_panel::Copy",
|
||||||
"cmd-v": "project_panel::Paste",
|
"cmd-v": "project_panel::Paste",
|
||||||
"cmd-alt-c": "workspace::CopyPath",
|
"cmd-alt-c": "project_panel::CopyPath",
|
||||||
"alt-cmd-shift-c": "workspace::CopyRelativePath",
|
"alt-cmd-shift-c": "project_panel::CopyRelativePath",
|
||||||
"enter": "project_panel::Rename",
|
"enter": "project_panel::Rename",
|
||||||
"f2": "project_panel::Rename",
|
"f2": "project_panel::Rename",
|
||||||
"backspace": ["project_panel::Trash", { "skip_prompt": false }],
|
"backspace": ["project_panel::Trash", { "skip_prompt": false }],
|
||||||
@@ -710,6 +661,7 @@
|
|||||||
"cmd-delete": ["project_panel::Delete", { "skip_prompt": false }],
|
"cmd-delete": ["project_panel::Delete", { "skip_prompt": false }],
|
||||||
"alt-cmd-r": "project_panel::RevealInFileManager",
|
"alt-cmd-r": "project_panel::RevealInFileManager",
|
||||||
"ctrl-shift-enter": "project_panel::OpenWithSystem",
|
"ctrl-shift-enter": "project_panel::OpenWithSystem",
|
||||||
|
"cmd-shift-e": "project_panel::ToggleFocus",
|
||||||
"cmd-alt-backspace": ["project_panel::Delete", { "skip_prompt": false }],
|
"cmd-alt-backspace": ["project_panel::Delete", { "skip_prompt": false }],
|
||||||
"cmd-shift-f": "project_panel::NewSearchInDirectory",
|
"cmd-shift-f": "project_panel::NewSearchInDirectory",
|
||||||
"shift-down": "menu::SelectNext",
|
"shift-down": "menu::SelectNext",
|
||||||
@@ -724,51 +676,6 @@
|
|||||||
"space": "project_panel::Open"
|
"space": "project_panel::Open"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "GitPanel && ChangesList",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"up": "menu::SelectPrev",
|
|
||||||
"down": "menu::SelectNext",
|
|
||||||
"cmd-up": "menu::SelectFirst",
|
|
||||||
"cmd-down": "menu::SelectLast",
|
|
||||||
"enter": "menu::Confirm",
|
|
||||||
"space": "git::ToggleStaged",
|
|
||||||
"cmd-shift-space": "git::StageAll",
|
|
||||||
"ctrl-shift-space": "git::UnstageAll",
|
|
||||||
"alt-down": "git_panel::FocusEditor",
|
|
||||||
"tab": "git_panel::FocusEditor",
|
|
||||||
"shift-tab": "git_panel::FocusEditor",
|
|
||||||
"escape": "git_panel::ToggleFocus",
|
|
||||||
"cmd-enter": "git::Commit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitDiff > Editor",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"cmd-enter": "git::Commit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitPanel > Editor",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"enter": "editor::Newline",
|
|
||||||
"cmd-enter": "git::Commit",
|
|
||||||
"tab": "git_panel::FocusChanges",
|
|
||||||
"shift-tab": "git_panel::FocusChanges",
|
|
||||||
"alt-up": "git_panel::FocusChanges"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitCommit > Editor",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"enter": "editor::Newline",
|
|
||||||
"cmd-enter": "git::Commit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "CollabPanel && not_editing",
|
"context": "CollabPanel && not_editing",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
@@ -808,7 +715,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "FileFinder || (FileFinder > Picker > Editor) || (FileFinder > Picker > menu)",
|
"context": "FileFinder",
|
||||||
|
"use_key_equivalents": true,
|
||||||
|
"bindings": {
|
||||||
|
"cmd": "file_finder::ToggleMenu"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"context": "FileFinder && !menu_open",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-shift-p": "file_finder::SelectPrev",
|
"cmd-shift-p": "file_finder::SelectPrev",
|
||||||
@@ -818,13 +732,23 @@
|
|||||||
"cmd-l": "pane::SplitRight"
|
"cmd-l": "pane::SplitRight"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"context": "FileFinder && menu_open",
|
||||||
|
"use_key_equivalents": true,
|
||||||
|
"bindings": {
|
||||||
|
"j": "pane::SplitDown",
|
||||||
|
"k": "pane::SplitUp",
|
||||||
|
"h": "pane::SplitLeft",
|
||||||
|
"l": "pane::SplitRight"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"context": "TabSwitcher",
|
"context": "TabSwitcher",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-shift-tab": "menu::SelectPrev",
|
|
||||||
"ctrl-up": "menu::SelectPrev",
|
"ctrl-up": "menu::SelectPrev",
|
||||||
"ctrl-down": "menu::SelectNext",
|
"ctrl-down": "menu::SelectNext",
|
||||||
|
"ctrl-shift-tab": "menu::SelectPrev",
|
||||||
"ctrl-backspace": "tab_switcher::CloseSelectedItem"
|
"ctrl-backspace": "tab_switcher::CloseSelectedItem"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -837,9 +761,7 @@
|
|||||||
"cmd-v": "terminal::Paste",
|
"cmd-v": "terminal::Paste",
|
||||||
"cmd-a": "editor::SelectAll",
|
"cmd-a": "editor::SelectAll",
|
||||||
"cmd-k": "terminal::Clear",
|
"cmd-k": "terminal::Clear",
|
||||||
"cmd-n": "workspace::NewTerminal",
|
|
||||||
"ctrl-enter": "assistant::InlineAssist",
|
"ctrl-enter": "assistant::InlineAssist",
|
||||||
"ctrl-_": null, // emacs undo
|
|
||||||
// Some nice conveniences
|
// Some nice conveniences
|
||||||
"cmd-backspace": ["terminal::SendText", "\u0015"],
|
"cmd-backspace": ["terminal::SendText", "\u0015"],
|
||||||
"cmd-right": ["terminal::SendText", "\u0005"],
|
"cmd-right": ["terminal::SendText", "\u0005"],
|
||||||
@@ -847,8 +769,6 @@
|
|||||||
// Terminal.app compatibility
|
// Terminal.app compatibility
|
||||||
"alt-left": ["terminal::SendText", "\u001bb"],
|
"alt-left": ["terminal::SendText", "\u001bb"],
|
||||||
"alt-right": ["terminal::SendText", "\u001bf"],
|
"alt-right": ["terminal::SendText", "\u001bf"],
|
||||||
"alt-b": ["terminal::SendText", "\u001bb"],
|
|
||||||
"alt-f": ["terminal::SendText", "\u001bf"],
|
|
||||||
// There are conflicting bindings for these keys in the global context.
|
// There are conflicting bindings for these keys in the global context.
|
||||||
// these bindings override them, remove at your own risk:
|
// these bindings override them, remove at your own risk:
|
||||||
"up": ["terminal::SendKeystroke", "up"],
|
"up": ["terminal::SendKeystroke", "up"],
|
||||||
@@ -858,16 +778,16 @@
|
|||||||
"escape": ["terminal::SendKeystroke", "escape"],
|
"escape": ["terminal::SendKeystroke", "escape"],
|
||||||
"enter": ["terminal::SendKeystroke", "enter"],
|
"enter": ["terminal::SendKeystroke", "enter"],
|
||||||
"ctrl-c": ["terminal::SendKeystroke", "ctrl-c"],
|
"ctrl-c": ["terminal::SendKeystroke", "ctrl-c"],
|
||||||
"shift-pageup": "terminal::ScrollPageUp",
|
|
||||||
"cmd-up": "terminal::ScrollPageUp",
|
"cmd-up": "terminal::ScrollPageUp",
|
||||||
"shift-pagedown": "terminal::ScrollPageDown",
|
|
||||||
"cmd-down": "terminal::ScrollPageDown",
|
"cmd-down": "terminal::ScrollPageDown",
|
||||||
|
"shift-pageup": "terminal::ScrollPageUp",
|
||||||
|
"shift-pagedown": "terminal::ScrollPageDown",
|
||||||
"shift-up": "terminal::ScrollLineUp",
|
"shift-up": "terminal::ScrollLineUp",
|
||||||
"shift-down": "terminal::ScrollLineDown",
|
"shift-down": "terminal::ScrollLineDown",
|
||||||
"shift-home": "terminal::ScrollToTop",
|
|
||||||
"cmd-home": "terminal::ScrollToTop",
|
"cmd-home": "terminal::ScrollToTop",
|
||||||
"shift-end": "terminal::ScrollToBottom",
|
|
||||||
"cmd-end": "terminal::ScrollToBottom",
|
"cmd-end": "terminal::ScrollToBottom",
|
||||||
|
"shift-home": "terminal::ScrollToTop",
|
||||||
|
"shift-end": "terminal::ScrollToBottom",
|
||||||
"ctrl-shift-space": "terminal::ToggleViMode",
|
"ctrl-shift-space": "terminal::ToggleViMode",
|
||||||
"ctrl-k up": "pane::SplitUp",
|
"ctrl-k up": "pane::SplitUp",
|
||||||
"ctrl-k down": "pane::SplitDown",
|
"ctrl-k down": "pane::SplitDown",
|
||||||
@@ -879,8 +799,7 @@
|
|||||||
"context": "RateCompletionModal",
|
"context": "RateCompletionModal",
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-shift-enter": "zeta::ThumbsUpActiveCompletion",
|
"cmd-enter": "zeta::ThumbsUp",
|
||||||
"cmd-shift-backspace": "zeta::ThumbsDownActiveCompletion",
|
|
||||||
"shift-down": "zeta::NextEdit",
|
"shift-down": "zeta::NextEdit",
|
||||||
"shift-up": "zeta::PreviousEdit",
|
"shift-up": "zeta::PreviousEdit",
|
||||||
"right": "zeta::PreviewCompletion"
|
"right": "zeta::PreviewCompletion"
|
||||||
@@ -894,12 +813,5 @@
|
|||||||
"cmd-shift-enter": "zeta::ThumbsUpActiveCompletion",
|
"cmd-shift-enter": "zeta::ThumbsUpActiveCompletion",
|
||||||
"cmd-shift-backspace": "zeta::ThumbsDownActiveCompletion"
|
"cmd-shift-backspace": "zeta::ThumbsDownActiveCompletion"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "ZedPredictModal",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"escape": "menu::Cancel"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,119 +3,56 @@
|
|||||||
// To see the default key bindings run `zed: open default keymap`
|
// To see the default key bindings run `zed: open default keymap`
|
||||||
// from the command palette.
|
// from the command palette.
|
||||||
[
|
[
|
||||||
{
|
|
||||||
"bindings": {
|
|
||||||
"ctrl-g": "menu::Cancel"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-g": "editor::Cancel",
|
"ctrl-g": "editor::Cancel",
|
||||||
"ctrl-x b": "tab_switcher::Toggle", // switch-to-buffer
|
"ctrl-shift-g": "go_to_line::Toggle",
|
||||||
"alt-g g": "go_to_line::Toggle", // goto-line
|
//"ctrl-space": "editor::SetMark",
|
||||||
"alt-g alt-g": "go_to_line::Toggle", // goto-line
|
"ctrl-x u": "editor::Undo",
|
||||||
"ctrl-space": "editor::SetMark", // set-mark
|
"ctrl-x ctrl-u": "editor::Redo",
|
||||||
"ctrl-@": "editor::SetMark", // set-mark
|
"ctrl-f": "editor::MoveRight",
|
||||||
"ctrl-x ctrl-x": "editor::SwapSelectionEnds", // exchange-point-and-mark
|
"ctrl-b": "editor::MoveLeft",
|
||||||
"ctrl-f": "editor::MoveRight", // forward-char
|
"ctrl-n": "editor::MoveDown",
|
||||||
"ctrl-b": "editor::MoveLeft", // backward-char
|
"ctrl-p": "editor::MoveUp",
|
||||||
"ctrl-n": "editor::MoveDown", // next-line
|
"home": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"ctrl-p": "editor::MoveUp", // previous-line
|
"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"home": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }], // move-beginning-of-line
|
"ctrl-a": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }], // move-end-of-line
|
"ctrl-e": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"ctrl-a": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }], // move-beginning-of-line
|
"alt-f": "editor::MoveToNextSubwordEnd",
|
||||||
"ctrl-e": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }], // move-end-of-line
|
"alt-b": "editor::MoveToPreviousSubwordStart",
|
||||||
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": false }], // move-beginning-of-line
|
"ctrl-d": "editor::Delete",
|
||||||
"shift-end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": false }], // move-end-of-line
|
"alt-d": "editor::DeleteToNextWordEnd",
|
||||||
"alt-m": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false, "stop_at_indent": true }], // back-to-indentation
|
"ctrl-k": "editor::CutToEndOfLine",
|
||||||
"alt-f": "editor::MoveToNextSubwordEnd", // forward-word
|
"ctrl-w": "editor::Cut",
|
||||||
"alt-b": "editor::MoveToPreviousSubwordStart", // backward-word
|
"alt-w": "editor::Copy",
|
||||||
"alt-u": "editor::ConvertToUpperCase", // upcase-word
|
"ctrl-y": "editor::Paste",
|
||||||
"alt-l": "editor::ConvertToLowerCase", // downcase-word
|
"ctrl-_": "editor::Undo",
|
||||||
"alt-c": "editor::ConvertToUpperCamelCase", // capitalize-word
|
"ctrl-v": "editor::MovePageDown",
|
||||||
"ctrl-t": "editor::Transpose", // transpose-chars
|
"alt-v": "editor::MovePageUp",
|
||||||
"alt-;": ["editor::ToggleComments", { "advance_downwards": false }],
|
"ctrl-x ]": "editor::MoveToEnd",
|
||||||
"ctrl-x ctrl-;": "editor::ToggleComments",
|
"ctrl-x [": "editor::MoveToBeginning",
|
||||||
"alt-.": "editor::GoToDefinition", // xref-find-definitions
|
"ctrl-l": "editor::ScrollCursorCenterTopBottom",
|
||||||
"alt-,": "pane::GoBack", // xref-pop-marker-stack
|
"ctrl-s": "buffer_search::Deploy",
|
||||||
"ctrl-x h": "editor::SelectAll", // mark-whole-buffer
|
"ctrl-x ctrl-f": "file_finder::Toggle",
|
||||||
"ctrl-d": "editor::Delete", // delete-char
|
"ctrl-shift-r": "editor::Rename"
|
||||||
"alt-d": "editor::DeleteToNextWordEnd", // kill-word
|
|
||||||
"ctrl-k": "editor::KillRingCut", // kill-line
|
|
||||||
"ctrl-w": "editor::Cut", // kill-region
|
|
||||||
"alt-w": "editor::Copy", // kill-ring-save
|
|
||||||
"ctrl-y": "editor::KillRingYank", // yank
|
|
||||||
"ctrl-_": "editor::Undo", // undo
|
|
||||||
"ctrl-/": "editor::Undo", // undo
|
|
||||||
"ctrl-x u": "editor::Undo", // undo
|
|
||||||
"alt-{": "editor::MoveToStartOfParagraph", // backward-paragraph
|
|
||||||
"alt-}": "editor::MoveToEndOfParagraph", // forward-paragraph
|
|
||||||
"ctrl-v": "editor::MovePageDown", // scroll-up
|
|
||||||
"alt-v": "editor::MovePageUp", // scroll-down
|
|
||||||
"ctrl-x [": "editor::MoveToBeginning", // beginning-of-buffer
|
|
||||||
"ctrl-x ]": "editor::MoveToEnd", // end-of-buffer
|
|
||||||
"alt-<": "editor::MoveToBeginning", // beginning-of-buffer
|
|
||||||
"alt->": "editor::MoveToEnd", // end-of-buffer
|
|
||||||
"ctrl-l": "editor::ScrollCursorCenterTopBottom", // recenter-top-bottom
|
|
||||||
"ctrl-s": "buffer_search::Deploy", // isearch-forward
|
|
||||||
"alt-^": "editor::JoinLines" // join-line
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "Editor && selection_mode", // region selection
|
|
||||||
"bindings": {
|
|
||||||
"right": "editor::SelectRight",
|
|
||||||
"left": "editor::SelectLeft",
|
|
||||||
"down": "editor::SelectDown",
|
|
||||||
"up": "editor::SelectUp",
|
|
||||||
"alt-left": "editor::SelectToPreviousWordStart",
|
|
||||||
"alt-right": "editor::SelectToNextWordEnd",
|
|
||||||
"pagedown": "editor::SelectPageDown",
|
|
||||||
"pageup": "editor::SelectPageUp",
|
|
||||||
"ctrl-f": "editor::SelectRight",
|
|
||||||
"ctrl-b": "editor::SelectLeft",
|
|
||||||
"ctrl-n": "editor::SelectDown",
|
|
||||||
"ctrl-p": "editor::SelectUp",
|
|
||||||
"home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"ctrl-a": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"ctrl-e": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"alt-f": "editor::SelectToNextWordEnd",
|
|
||||||
"alt-b": "editor::SelectToPreviousSubwordStart",
|
|
||||||
"alt-<": "editor::SelectToBeginning",
|
|
||||||
"alt->": "editor::SelectToEnd",
|
|
||||||
"ctrl-g": "editor::Cancel"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Workspace",
|
"context": "Workspace",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-x ctrl-c": "zed::Quit", // save-buffers-kill-terminal
|
"ctrl-x k": "pane::CloseActiveItem",
|
||||||
"ctrl-x 5 0": "workspace::CloseWindow", // delete-frame
|
"ctrl-x ctrl-c": "workspace::CloseWindow",
|
||||||
"ctrl-x 5 2": "workspace::NewWindow", // make-frame-command
|
"ctrl-x o": "workspace::ActivateNextPane",
|
||||||
"ctrl-x o": "workspace::ActivateNextPane", // other-window
|
"ctrl-x b": "tab_switcher::Toggle",
|
||||||
"ctrl-x k": "pane::CloseActiveItem", // kill-buffer
|
"ctrl-x 0": "pane::CloseActiveItem",
|
||||||
"ctrl-x 0": "pane::CloseActiveItem", // delete-window
|
"ctrl-x 1": "pane::CloseInactiveItems",
|
||||||
"ctrl-x 1": "pane::CloseInactiveItems", // delete-other-windows
|
"ctrl-x 2": "pane::SplitVertical",
|
||||||
"ctrl-x 2": "pane::SplitDown", // split-window-below
|
"ctrl-x ctrl-f": "file_finder::Toggle",
|
||||||
"ctrl-x 3": "pane::SplitRight", // split-window-right
|
"ctrl-x ctrl-s": "workspace::Save",
|
||||||
"ctrl-x ctrl-f": "file_finder::Toggle", // find-file
|
"ctrl-x ctrl-w": "workspace::SaveAs",
|
||||||
"ctrl-x ctrl-s": "workspace::Save", // save-buffer
|
"ctrl-x s": "workspace::SaveAll",
|
||||||
"ctrl-x ctrl-w": "workspace::SaveAs", // write-file
|
"shift shift": "file_finder::Toggle"
|
||||||
"ctrl-x s": "workspace::SaveAll" // save-some-buffers
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Workaround to enable using emacs in the Zed terminal.
|
|
||||||
// Unbind so Zed ignores these keys and lets emacs handle them.
|
|
||||||
"context": "Terminal",
|
|
||||||
"bindings": {
|
|
||||||
"ctrl-x ctrl-c": null, // save-buffers-kill-terminal
|
|
||||||
"ctrl-x ctrl-f": null, // find-file
|
|
||||||
"ctrl-x ctrl-s": null, // save-buffer
|
|
||||||
"ctrl-x ctrl-w": null, // write-file
|
|
||||||
"ctrl-x s": null // save-some-buffers
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-alt-s": "zed::OpenSettings",
|
"ctrl-alt-s": "zed::OpenSettings",
|
||||||
"ctrl-{": "pane::ActivatePrevItem",
|
"ctrl-shift-[": "pane::ActivatePrevItem",
|
||||||
"ctrl-}": "pane::ActivateNextItem"
|
"ctrl-shift-]": "pane::ActivateNextItem"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl->": ["zed::IncreaseBufferFontSize", { "persist": true }],
|
"ctrl->": "zed::IncreaseBufferFontSize",
|
||||||
"ctrl-<": ["zed::DecreaseBufferFontSize", { "persist": true }],
|
"ctrl-<": "zed::DecreaseBufferFontSize",
|
||||||
"ctrl-shift-j": "editor::JoinLines",
|
"ctrl-shift-j": "editor::JoinLines",
|
||||||
"ctrl-d": "editor::DuplicateSelection",
|
"ctrl-d": "editor::DuplicateSelection",
|
||||||
"ctrl-y": "editor::DeleteLine",
|
"ctrl-y": "editor::DeleteLine",
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"shift-f2": "editor::GoToPrevDiagnostic",
|
"shift-f2": "editor::GoToPrevDiagnostic",
|
||||||
"ctrl-alt-shift-down": "editor::GoToHunk",
|
"ctrl-alt-shift-down": "editor::GoToHunk",
|
||||||
"ctrl-alt-shift-up": "editor::GoToPrevHunk",
|
"ctrl-alt-shift-up": "editor::GoToPrevHunk",
|
||||||
"ctrl-alt-z": "git::Restore",
|
"ctrl-alt-z": "editor::RevertSelectedHunks",
|
||||||
"ctrl-home": "editor::MoveToBeginning",
|
"ctrl-home": "editor::MoveToBeginning",
|
||||||
"ctrl-end": "editor::MoveToEnd",
|
"ctrl-end": "editor::MoveToEnd",
|
||||||
"ctrl-shift-home": "editor::SelectToBeginning",
|
"ctrl-shift-home": "editor::SelectToBeginning",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-{": "pane::ActivatePrevItem",
|
"ctrl-shift-[": "pane::ActivatePrevItem",
|
||||||
"ctrl-}": "pane::ActivateNextItem",
|
"ctrl-shift-]": "pane::ActivateNextItem",
|
||||||
"ctrl-pageup": "pane::ActivatePrevItem",
|
"ctrl-pageup": "pane::ActivatePrevItem",
|
||||||
"ctrl-pagedown": "pane::ActivateNextItem",
|
"ctrl-pagedown": "pane::ActivateNextItem",
|
||||||
"ctrl-1": ["workspace::ActivatePane", 0],
|
"ctrl-1": ["workspace::ActivatePane", 0],
|
||||||
@@ -14,15 +14,15 @@
|
|||||||
"ctrl-7": ["workspace::ActivatePane", 6],
|
"ctrl-7": ["workspace::ActivatePane", 6],
|
||||||
"ctrl-8": ["workspace::ActivatePane", 7],
|
"ctrl-8": ["workspace::ActivatePane", 7],
|
||||||
"ctrl-9": ["workspace::ActivatePane", 8],
|
"ctrl-9": ["workspace::ActivatePane", 8],
|
||||||
"ctrl-!": ["workspace::MoveItemToPane", { "destination": 0, "focus": true }],
|
"ctrl-shift-1": ["workspace::MoveItemToPane", { "destination": 0, "focus": true }],
|
||||||
"ctrl-@": ["workspace::MoveItemToPane", { "destination": 1 }],
|
"ctrl-shift-2": ["workspace::MoveItemToPane", { "destination": 1 }],
|
||||||
"ctrl-#": ["workspace::MoveItemToPane", { "destination": 2 }],
|
"ctrl-shift-3": ["workspace::MoveItemToPane", { "destination": 2 }],
|
||||||
"ctrl-$": ["workspace::MoveItemToPane", { "destination": 3 }],
|
"ctrl-shift-4": ["workspace::MoveItemToPane", { "destination": 3 }],
|
||||||
"ctrl-%": ["workspace::MoveItemToPane", { "destination": 4 }],
|
"ctrl-shift-5": ["workspace::MoveItemToPane", { "destination": 4 }],
|
||||||
"ctrl-^": ["workspace::MoveItemToPane", { "destination": 5 }],
|
"ctrl-shift-6": ["workspace::MoveItemToPane", { "destination": 5 }],
|
||||||
"ctrl-&": ["workspace::MoveItemToPane", { "destination": 6 }],
|
"ctrl-shift-7": ["workspace::MoveItemToPane", { "destination": 6 }],
|
||||||
"ctrl-*": ["workspace::MoveItemToPane", { "destination": 7 }],
|
"ctrl-shift-8": ["workspace::MoveItemToPane", { "destination": 7 }],
|
||||||
"ctrl-(": ["workspace::MoveItemToPane", { "destination": 8 }]
|
"ctrl-shift-9": ["workspace::MoveItemToPane", { "destination": 8 }]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,119 +3,56 @@
|
|||||||
// To see the default key bindings run `zed: open default keymap`
|
// To see the default key bindings run `zed: open default keymap`
|
||||||
// from the command palette.
|
// from the command palette.
|
||||||
[
|
[
|
||||||
{
|
|
||||||
"bindings": {
|
|
||||||
"ctrl-g": "menu::Cancel"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-g": "editor::Cancel",
|
"ctrl-g": "editor::Cancel",
|
||||||
"ctrl-x b": "tab_switcher::Toggle", // switch-to-buffer
|
"ctrl-shift-g": "go_to_line::Toggle",
|
||||||
"alt-g g": "go_to_line::Toggle", // goto-line
|
//"ctrl-space": "editor::SetMark",
|
||||||
"alt-g alt-g": "go_to_line::Toggle", // goto-line
|
"ctrl-x u": "editor::Undo",
|
||||||
"ctrl-space": "editor::SetMark", // set-mark
|
"ctrl-x ctrl-u": "editor::Redo",
|
||||||
"ctrl-@": "editor::SetMark", // set-mark
|
"ctrl-f": "editor::MoveRight",
|
||||||
"ctrl-x ctrl-x": "editor::SwapSelectionEnds", // exchange-point-and-mark
|
"ctrl-b": "editor::MoveLeft",
|
||||||
"ctrl-f": "editor::MoveRight", // forward-char
|
"ctrl-n": "editor::MoveDown",
|
||||||
"ctrl-b": "editor::MoveLeft", // backward-char
|
"ctrl-p": "editor::MoveUp",
|
||||||
"ctrl-n": "editor::MoveDown", // next-line
|
"home": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"ctrl-p": "editor::MoveUp", // previous-line
|
"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"home": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }], // move-beginning-of-line
|
"ctrl-a": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }], // move-end-of-line
|
"ctrl-e": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }],
|
||||||
"ctrl-a": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false }], // move-beginning-of-line
|
"alt-f": "editor::MoveToNextSubwordEnd",
|
||||||
"ctrl-e": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": false }], // move-end-of-line
|
"alt-b": "editor::MoveToPreviousSubwordStart",
|
||||||
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": false }], // move-beginning-of-line
|
"ctrl-d": "editor::Delete",
|
||||||
"shift-end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": false }], // move-end-of-line
|
"alt-d": "editor::DeleteToNextWordEnd",
|
||||||
"alt-m": ["editor::MoveToBeginningOfLine", { "stop_at_soft_wraps": false, "stop_at_indent": true }], // back-to-indentation
|
"ctrl-k": "editor::CutToEndOfLine",
|
||||||
"alt-f": "editor::MoveToNextSubwordEnd", // forward-word
|
"ctrl-w": "editor::Cut",
|
||||||
"alt-b": "editor::MoveToPreviousSubwordStart", // backward-word
|
"alt-w": "editor::Copy",
|
||||||
"alt-u": "editor::ConvertToUpperCase", // upcase-word
|
"ctrl-y": "editor::Paste",
|
||||||
"alt-l": "editor::ConvertToLowerCase", // downcase-word
|
"ctrl-_": "editor::Undo",
|
||||||
"alt-c": "editor::ConvertToUpperCamelCase", // capitalize-word
|
"ctrl-v": "editor::MovePageDown",
|
||||||
"ctrl-t": "editor::Transpose", // transpose-chars
|
"alt-v": "editor::MovePageUp",
|
||||||
"alt-;": ["editor::ToggleComments", { "advance_downwards": false }],
|
"ctrl-x ]": "editor::MoveToEnd",
|
||||||
"ctrl-x ctrl-;": "editor::ToggleComments",
|
"ctrl-x [": "editor::MoveToBeginning",
|
||||||
"alt-.": "editor::GoToDefinition", // xref-find-definitions
|
"ctrl-l": "editor::ScrollCursorCenterTopBottom",
|
||||||
"alt-,": "pane::GoBack", // xref-pop-marker-stack
|
"ctrl-s": "buffer_search::Deploy",
|
||||||
"ctrl-x h": "editor::SelectAll", // mark-whole-buffer
|
"ctrl-x ctrl-f": "file_finder::Toggle",
|
||||||
"ctrl-d": "editor::Delete", // delete-char
|
"ctrl-shift-r": "editor::Rename"
|
||||||
"alt-d": "editor::DeleteToNextWordEnd", // kill-word
|
|
||||||
"ctrl-k": "editor::KillRingCut", // kill-line
|
|
||||||
"ctrl-w": "editor::Cut", // kill-region
|
|
||||||
"alt-w": "editor::Copy", // kill-ring-save
|
|
||||||
"ctrl-y": "editor::KillRingYank", // yank
|
|
||||||
"ctrl-_": "editor::Undo", // undo
|
|
||||||
"ctrl-/": "editor::Undo", // undo
|
|
||||||
"ctrl-x u": "editor::Undo", // undo
|
|
||||||
"alt-{": "editor::MoveToStartOfParagraph", // backward-paragraph
|
|
||||||
"alt-}": "editor::MoveToEndOfParagraph", // forward-paragraph
|
|
||||||
"ctrl-v": "editor::MovePageDown", // scroll-up
|
|
||||||
"alt-v": "editor::MovePageUp", // scroll-down
|
|
||||||
"ctrl-x [": "editor::MoveToBeginning", // beginning-of-buffer
|
|
||||||
"ctrl-x ]": "editor::MoveToEnd", // end-of-buffer
|
|
||||||
"alt-<": "editor::MoveToBeginning", // beginning-of-buffer
|
|
||||||
"alt->": "editor::MoveToEnd", // end-of-buffer
|
|
||||||
"ctrl-l": "editor::ScrollCursorCenterTopBottom", // recenter-top-bottom
|
|
||||||
"ctrl-s": "buffer_search::Deploy", // isearch-forward
|
|
||||||
"alt-^": "editor::JoinLines" // join-line
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "Editor && selection_mode", // region selection
|
|
||||||
"bindings": {
|
|
||||||
"right": "editor::SelectRight",
|
|
||||||
"left": "editor::SelectLeft",
|
|
||||||
"down": "editor::SelectDown",
|
|
||||||
"up": "editor::SelectUp",
|
|
||||||
"alt-left": "editor::SelectToPreviousWordStart",
|
|
||||||
"alt-right": "editor::SelectToNextWordEnd",
|
|
||||||
"pagedown": "editor::SelectPageDown",
|
|
||||||
"pageup": "editor::SelectPageUp",
|
|
||||||
"ctrl-f": "editor::SelectRight",
|
|
||||||
"ctrl-b": "editor::SelectLeft",
|
|
||||||
"ctrl-n": "editor::SelectDown",
|
|
||||||
"ctrl-p": "editor::SelectUp",
|
|
||||||
"home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"end": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"ctrl-a": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"ctrl-e": ["editor::SelectToEndOfLine", { "stop_at_soft_wraps": false }],
|
|
||||||
"alt-f": "editor::SelectToNextWordEnd",
|
|
||||||
"alt-b": "editor::SelectToPreviousSubwordStart",
|
|
||||||
"alt-<": "editor::SelectToBeginning",
|
|
||||||
"alt->": "editor::SelectToEnd",
|
|
||||||
"ctrl-g": "editor::Cancel"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Workspace",
|
"context": "Workspace",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-x ctrl-c": "zed::Quit", // save-buffers-kill-terminal
|
"ctrl-x k": "pane::CloseActiveItem",
|
||||||
"ctrl-x 5 0": "workspace::CloseWindow", // delete-frame
|
"ctrl-x ctrl-c": "workspace::CloseWindow",
|
||||||
"ctrl-x 5 2": "workspace::NewWindow", // make-frame-command
|
"ctrl-x o": "workspace::ActivateNextPane",
|
||||||
"ctrl-x o": "workspace::ActivateNextPane", // other-window
|
"ctrl-x b": "tab_switcher::Toggle",
|
||||||
"ctrl-x k": "pane::CloseActiveItem", // kill-buffer
|
"ctrl-x 0": "pane::CloseActiveItem",
|
||||||
"ctrl-x 0": "pane::CloseActiveItem", // delete-window
|
"ctrl-x 1": "pane::CloseInactiveItems",
|
||||||
"ctrl-x 1": "pane::CloseInactiveItems", // delete-other-windows
|
"ctrl-x 2": "pane::SplitVertical",
|
||||||
"ctrl-x 2": "pane::SplitDown", // split-window-below
|
"ctrl-x ctrl-f": "file_finder::Toggle",
|
||||||
"ctrl-x 3": "pane::SplitRight", // split-window-right
|
"ctrl-x ctrl-s": "workspace::Save",
|
||||||
"ctrl-x ctrl-f": "file_finder::Toggle", // find-file
|
"ctrl-x ctrl-w": "workspace::SaveAs",
|
||||||
"ctrl-x ctrl-s": "workspace::Save", // save-buffer
|
"ctrl-x s": "workspace::SaveAll",
|
||||||
"ctrl-x ctrl-w": "workspace::SaveAs", // write-file
|
"shift shift": "file_finder::Toggle"
|
||||||
"ctrl-x s": "workspace::SaveAll" // save-some-buffers
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Workaround to enable using emacs in the Zed terminal.
|
|
||||||
// Unbind so Zed ignores these keys and lets emacs handle them.
|
|
||||||
"context": "Terminal",
|
|
||||||
"bindings": {
|
|
||||||
"ctrl-x ctrl-c": null, // save-buffers-kill-terminal
|
|
||||||
"ctrl-x ctrl-f": null, // find-file
|
|
||||||
"ctrl-x ctrl-s": null, // save-buffer
|
|
||||||
"ctrl-x ctrl-w": null, // write-file
|
|
||||||
"ctrl-x s": null // save-some-buffers
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-{": "pane::ActivatePrevItem",
|
"cmd-shift-[": "pane::ActivatePrevItem",
|
||||||
"cmd-}": "pane::ActivateNextItem"
|
"cmd-shift-]": "pane::ActivateNextItem"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl->": ["zed::IncreaseBufferFontSize", { "persist": true }],
|
"ctrl->": "zed::IncreaseBufferFontSize",
|
||||||
"ctrl-<": ["zed::DecreaseBufferFontSize", { "persist": true }],
|
"ctrl-<": "zed::DecreaseBufferFontSize",
|
||||||
"ctrl-shift-j": "editor::JoinLines",
|
"ctrl-shift-j": "editor::JoinLines",
|
||||||
"cmd-d": "editor::DuplicateSelection",
|
"cmd-d": "editor::DuplicateSelection",
|
||||||
"cmd-backspace": "editor::DeleteLine",
|
"cmd-backspace": "editor::DeleteLine",
|
||||||
@@ -24,8 +24,8 @@
|
|||||||
"ctrl-g": ["editor::SelectNext", { "replace_newest": false }],
|
"ctrl-g": ["editor::SelectNext", { "replace_newest": false }],
|
||||||
"ctrl-cmd-g": ["editor::SelectPrevious", { "replace_newest": false }],
|
"ctrl-cmd-g": ["editor::SelectPrevious", { "replace_newest": false }],
|
||||||
"cmd-/": ["editor::ToggleComments", { "advance_downwards": true }],
|
"cmd-/": ["editor::ToggleComments", { "advance_downwards": true }],
|
||||||
"alt-up": "editor::SelectLargerSyntaxNode",
|
"cmd-up": "editor::SelectLargerSyntaxNode",
|
||||||
"alt-down": "editor::SelectSmallerSyntaxNode",
|
"cmd-down": "editor::SelectSmallerSyntaxNode",
|
||||||
"shift-alt-up": "editor::MoveLineUp",
|
"shift-alt-up": "editor::MoveLineUp",
|
||||||
"shift-alt-down": "editor::MoveLineDown",
|
"shift-alt-down": "editor::MoveLineDown",
|
||||||
"cmd-alt-l": "editor::Format",
|
"cmd-alt-l": "editor::Format",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-{": "pane::ActivatePrevItem",
|
"cmd-shift-[": "pane::ActivatePrevItem",
|
||||||
"cmd-}": "pane::ActivateNextItem",
|
"cmd-shift-]": "pane::ActivateNextItem",
|
||||||
"ctrl-pageup": "pane::ActivatePrevItem",
|
"ctrl-pageup": "pane::ActivatePrevItem",
|
||||||
"ctrl-pagedown": "pane::ActivateNextItem",
|
"ctrl-pagedown": "pane::ActivateNextItem",
|
||||||
"ctrl-1": ["workspace::ActivatePane", 0],
|
"ctrl-1": ["workspace::ActivatePane", 0],
|
||||||
@@ -14,15 +14,15 @@
|
|||||||
"ctrl-7": ["workspace::ActivatePane", 6],
|
"ctrl-7": ["workspace::ActivatePane", 6],
|
||||||
"ctrl-8": ["workspace::ActivatePane", 7],
|
"ctrl-8": ["workspace::ActivatePane", 7],
|
||||||
"ctrl-9": ["workspace::ActivatePane", 8],
|
"ctrl-9": ["workspace::ActivatePane", 8],
|
||||||
"ctrl-!": ["workspace::MoveItemToPane", { "destination": 0, "focus": true }],
|
"ctrl-shift-1": ["workspace::MoveItemToPane", { "destination": 0, "focus": true }],
|
||||||
"ctrl-@": ["workspace::MoveItemToPane", { "destination": 1 }],
|
"ctrl-shift-2": ["workspace::MoveItemToPane", { "destination": 1 }],
|
||||||
"ctrl-#": ["workspace::MoveItemToPane", { "destination": 2 }],
|
"ctrl-shift-3": ["workspace::MoveItemToPane", { "destination": 2 }],
|
||||||
"ctrl-$": ["workspace::MoveItemToPane", { "destination": 3 }],
|
"ctrl-shift-4": ["workspace::MoveItemToPane", { "destination": 3 }],
|
||||||
"ctrl-%": ["workspace::MoveItemToPane", { "destination": 4 }],
|
"ctrl-shift-5": ["workspace::MoveItemToPane", { "destination": 4 }],
|
||||||
"ctrl-^": ["workspace::MoveItemToPane", { "destination": 5 }],
|
"ctrl-shift-6": ["workspace::MoveItemToPane", { "destination": 5 }],
|
||||||
"ctrl-&": ["workspace::MoveItemToPane", { "destination": 6 }],
|
"ctrl-shift-7": ["workspace::MoveItemToPane", { "destination": 6 }],
|
||||||
"ctrl-*": ["workspace::MoveItemToPane", { "destination": 7 }],
|
"ctrl-shift-8": ["workspace::MoveItemToPane", { "destination": 7 }],
|
||||||
"ctrl-(": ["workspace::MoveItemToPane", { "destination": 8 }]
|
"ctrl-shift-9": ["workspace::MoveItemToPane", { "destination": 8 }]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"cmd-b": "editor::GoToDefinition",
|
"cmd-b": "editor::GoToDefinition",
|
||||||
"cmd-j": "editor::ScrollCursorCenter",
|
"cmd-j": "editor::ScrollCursorCenter",
|
||||||
"cmd-enter": "editor::NewlineBelow",
|
"cmd-enter": "editor::NewlineBelow",
|
||||||
"cmd-alt-enter": "editor::NewlineAbove",
|
"cmd-alt-enter": "editor::NewLineAbove",
|
||||||
"cmd-shift-l": "editor::SelectLine",
|
"cmd-shift-l": "editor::SelectLine",
|
||||||
"cmd-shift-t": "outline::Toggle",
|
"cmd-shift-t": "outline::Toggle",
|
||||||
"alt-backspace": "editor::DeleteToPreviousWordStart",
|
"alt-backspace": "editor::DeleteToPreviousWordStart",
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-backspace": ["project_panel::Trash", { "skip_prompt": true }],
|
"cmd-backspace": ["project_panel::Trash", { "skip_prompt": true }],
|
||||||
"cmd-d": "project_panel::Duplicate",
|
"cmd-d": "project_panel::Duplicate",
|
||||||
"cmd-n": "project_panel::NewDirectory",
|
"cmd-n": "project_panel::NewFolder",
|
||||||
"return": "project_panel::Rename",
|
"return": "project_panel::Rename",
|
||||||
"cmd-c": "project_panel::Copy",
|
"cmd-c": "project_panel::Copy",
|
||||||
"cmd-v": "project_panel::Paste",
|
"cmd-v": "project_panel::Paste",
|
||||||
|
|||||||
@@ -2,27 +2,21 @@
|
|||||||
// Standard macOS bindings
|
// Standard macOS bindings
|
||||||
{
|
{
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"home": "menu::SelectFirst",
|
|
||||||
"shift-pageup": "menu::SelectFirst",
|
|
||||||
"pageup": "menu::SelectFirst",
|
|
||||||
"cmd-up": "menu::SelectFirst",
|
|
||||||
"end": "menu::SelectLast",
|
|
||||||
"shift-pagedown": "menu::SelectLast",
|
|
||||||
"pagedown": "menu::SelectLast",
|
|
||||||
"cmd-down": "menu::SelectLast",
|
|
||||||
"tab": "menu::SelectNext",
|
|
||||||
"ctrl-n": "menu::SelectNext",
|
|
||||||
"down": "menu::SelectNext",
|
|
||||||
"shift-tab": "menu::SelectPrev",
|
|
||||||
"ctrl-p": "menu::SelectPrev",
|
|
||||||
"up": "menu::SelectPrev",
|
"up": "menu::SelectPrev",
|
||||||
|
"pageup": "menu::SelectFirst",
|
||||||
|
"shift-pageup": "menu::SelectFirst",
|
||||||
|
"ctrl-p": "menu::SelectPrev",
|
||||||
|
"down": "menu::SelectNext",
|
||||||
|
"pagedown": "menu::SelectLast",
|
||||||
|
"shift-pagedown": "menu::SelectFirst",
|
||||||
|
"ctrl-n": "menu::SelectNext",
|
||||||
|
"cmd-up": "menu::SelectFirst",
|
||||||
|
"cmd-down": "menu::SelectLast",
|
||||||
"enter": "menu::Confirm",
|
"enter": "menu::Confirm",
|
||||||
"ctrl-enter": "menu::SecondaryConfirm",
|
"ctrl-enter": "menu::SecondaryConfirm",
|
||||||
"cmd-enter": "menu::SecondaryConfirm",
|
"cmd-enter": "menu::SecondaryConfirm",
|
||||||
"ctrl-escape": "menu::Cancel",
|
|
||||||
"cmd-escape": "menu::Cancel",
|
|
||||||
"ctrl-c": "menu::Cancel",
|
|
||||||
"escape": "menu::Cancel",
|
"escape": "menu::Cancel",
|
||||||
|
"ctrl-c": "menu::Cancel",
|
||||||
"cmd-q": "storybook::Quit",
|
"cmd-q": "storybook::Quit",
|
||||||
"backspace": "editor::Backspace",
|
"backspace": "editor::Backspace",
|
||||||
"delete": "editor::Delete",
|
"delete": "editor::Delete",
|
||||||
|
|||||||
@@ -2,27 +2,27 @@
|
|||||||
{
|
{
|
||||||
"context": "VimControl && !menu",
|
"context": "VimControl && !menu",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"i": ["vim::PushObject", { "around": false }],
|
"i": ["vim::PushOperator", { "Object": { "around": false } }],
|
||||||
"a": ["vim::PushObject", { "around": true }],
|
"a": ["vim::PushOperator", { "Object": { "around": true } }],
|
||||||
"left": "vim::Left",
|
|
||||||
"h": "vim::Left",
|
"h": "vim::Left",
|
||||||
|
"left": "vim::Left",
|
||||||
"backspace": "vim::Backspace",
|
"backspace": "vim::Backspace",
|
||||||
|
"j": "vim::Down",
|
||||||
"down": "vim::Down",
|
"down": "vim::Down",
|
||||||
"ctrl-j": "vim::Down",
|
"ctrl-j": "vim::Down",
|
||||||
"j": "vim::Down",
|
"enter": "vim::NextLineStart",
|
||||||
"ctrl-m": "vim::NextLineStart",
|
"ctrl-m": "vim::NextLineStart",
|
||||||
"+": "vim::NextLineStart",
|
"+": "vim::NextLineStart",
|
||||||
"enter": "vim::NextLineStart",
|
|
||||||
"-": "vim::PreviousLineStart",
|
"-": "vim::PreviousLineStart",
|
||||||
"shift-tab": "vim::Tab",
|
|
||||||
"tab": "vim::Tab",
|
"tab": "vim::Tab",
|
||||||
"up": "vim::Up",
|
"shift-tab": "vim::Tab",
|
||||||
"k": "vim::Up",
|
"k": "vim::Up",
|
||||||
"right": "vim::Right",
|
"up": "vim::Up",
|
||||||
"l": "vim::Right",
|
"l": "vim::Right",
|
||||||
|
"right": "vim::Right",
|
||||||
"space": "vim::Space",
|
"space": "vim::Space",
|
||||||
"end": "vim::EndOfLine",
|
|
||||||
"$": "vim::EndOfLine",
|
"$": "vim::EndOfLine",
|
||||||
|
"end": "vim::EndOfLine",
|
||||||
"^": "vim::FirstNonWhitespace",
|
"^": "vim::FirstNonWhitespace",
|
||||||
"_": "vim::StartOfLineDownward",
|
"_": "vim::StartOfLineDownward",
|
||||||
"g _": "vim::EndOfLineDownward",
|
"g _": "vim::EndOfLineDownward",
|
||||||
@@ -37,9 +37,9 @@
|
|||||||
"[ [": "vim::PreviousSectionStart",
|
"[ [": "vim::PreviousSectionStart",
|
||||||
"[ ]": "vim::PreviousSectionEnd",
|
"[ ]": "vim::PreviousSectionEnd",
|
||||||
"] m": "vim::NextMethodStart",
|
"] m": "vim::NextMethodStart",
|
||||||
"] shift-m": "vim::NextMethodEnd",
|
"] M": "vim::NextMethodEnd",
|
||||||
"[ m": "vim::PreviousMethodStart",
|
"[ m": "vim::PreviousMethodStart",
|
||||||
"[ shift-m": "vim::PreviousMethodEnd",
|
"[ M": "vim::PreviousMethodEnd",
|
||||||
"[ *": "vim::PreviousComment",
|
"[ *": "vim::PreviousComment",
|
||||||
"[ /": "vim::PreviousComment",
|
"[ /": "vim::PreviousComment",
|
||||||
"] *": "vim::NextComment",
|
"] *": "vim::NextComment",
|
||||||
@@ -54,10 +54,10 @@
|
|||||||
// "b": "vim::PreviousSubwordStart",
|
// "b": "vim::PreviousSubwordStart",
|
||||||
// "e": "vim::NextSubwordEnd",
|
// "e": "vim::NextSubwordEnd",
|
||||||
// "g e": "vim::PreviousSubwordEnd",
|
// "g e": "vim::PreviousSubwordEnd",
|
||||||
"shift-w": ["vim::NextWordStart", { "ignore_punctuation": true }],
|
"shift-w": ["vim::NextWordStart", { "ignorePunctuation": true }],
|
||||||
"shift-e": ["vim::NextWordEnd", { "ignore_punctuation": true }],
|
"shift-e": ["vim::NextWordEnd", { "ignorePunctuation": true }],
|
||||||
"shift-b": ["vim::PreviousWordStart", { "ignore_punctuation": true }],
|
"shift-b": ["vim::PreviousWordStart", { "ignorePunctuation": true }],
|
||||||
"g shift-e": ["vim::PreviousWordEnd", { "ignore_punctuation": true }],
|
"g shift-e": ["vim::PreviousWordEnd", { "ignorePunctuation": true }],
|
||||||
"/": "vim::Search",
|
"/": "vim::Search",
|
||||||
"g /": "pane::DeploySearch",
|
"g /": "pane::DeploySearch",
|
||||||
"?": ["vim::Search", { "backwards": true }],
|
"?": ["vim::Search", { "backwards": true }],
|
||||||
@@ -70,23 +70,22 @@
|
|||||||
"[ {": ["vim::UnmatchedBackward", { "char": "{" }],
|
"[ {": ["vim::UnmatchedBackward", { "char": "{" }],
|
||||||
"] )": ["vim::UnmatchedForward", { "char": ")" }],
|
"] )": ["vim::UnmatchedForward", { "char": ")" }],
|
||||||
"[ (": ["vim::UnmatchedBackward", { "char": "(" }],
|
"[ (": ["vim::UnmatchedBackward", { "char": "(" }],
|
||||||
"f": ["vim::PushFindForward", { "before": false }],
|
"f": ["vim::PushOperator", { "FindForward": { "before": false } }],
|
||||||
"t": ["vim::PushFindForward", { "before": true }],
|
"t": ["vim::PushOperator", { "FindForward": { "before": true } }],
|
||||||
"shift-f": ["vim::PushFindBackward", { "after": false }],
|
"shift-f": ["vim::PushOperator", { "FindBackward": { "after": false } }],
|
||||||
"shift-t": ["vim::PushFindBackward", { "after": true }],
|
"shift-t": ["vim::PushOperator", { "FindBackward": { "after": true } }],
|
||||||
"m": "vim::PushMark",
|
"m": ["vim::PushOperator", "Mark"],
|
||||||
"'": ["vim::PushJump", { "line": true }],
|
"'": ["vim::PushOperator", { "Jump": { "line": true } }],
|
||||||
"`": ["vim::PushJump", { "line": false }],
|
"`": ["vim::PushOperator", { "Jump": { "line": false } }],
|
||||||
";": "vim::RepeatFind",
|
";": "vim::RepeatFind",
|
||||||
",": "vim::RepeatFindReversed",
|
",": "vim::RepeatFindReversed",
|
||||||
"ctrl-o": "pane::GoBack",
|
"ctrl-o": "pane::GoBack",
|
||||||
"ctrl-i": "pane::GoForward",
|
"ctrl-i": "pane::GoForward",
|
||||||
"ctrl-]": "editor::GoToDefinition",
|
"ctrl-]": "editor::GoToDefinition",
|
||||||
"escape": "vim::SwitchToNormalMode",
|
"escape": ["vim::SwitchMode", "Normal"],
|
||||||
"ctrl-[": "vim::SwitchToNormalMode",
|
"ctrl-[": ["vim::SwitchMode", "Normal"],
|
||||||
"v": "vim::ToggleVisual",
|
"v": "vim::ToggleVisual",
|
||||||
"shift-v": "vim::ToggleVisualLine",
|
"shift-v": "vim::ToggleVisualLine",
|
||||||
"ctrl-g": "vim::ShowLocation",
|
|
||||||
"ctrl-v": "vim::ToggleVisualBlock",
|
"ctrl-v": "vim::ToggleVisualBlock",
|
||||||
"ctrl-q": "vim::ToggleVisualBlock",
|
"ctrl-q": "vim::ToggleVisualBlock",
|
||||||
"shift-k": "editor::Hover",
|
"shift-k": "editor::Hover",
|
||||||
@@ -102,7 +101,6 @@
|
|||||||
"ctrl-e": "vim::LineDown",
|
"ctrl-e": "vim::LineDown",
|
||||||
"ctrl-y": "vim::LineUp",
|
"ctrl-y": "vim::LineUp",
|
||||||
// "g" commands
|
// "g" commands
|
||||||
"g r": "vim::PushReplaceWithRegister",
|
|
||||||
"g g": "vim::StartOfDocument",
|
"g g": "vim::StartOfDocument",
|
||||||
"g h": "editor::Hover",
|
"g h": "editor::Hover",
|
||||||
"g t": "pane::ActivateNextItem",
|
"g t": "pane::ActivateNextItem",
|
||||||
@@ -112,7 +110,7 @@
|
|||||||
"g y": "editor::GoToTypeDefinition",
|
"g y": "editor::GoToTypeDefinition",
|
||||||
"g shift-i": "editor::GoToImplementation",
|
"g shift-i": "editor::GoToImplementation",
|
||||||
"g x": "editor::OpenUrl",
|
"g x": "editor::OpenUrl",
|
||||||
"g f": "editor::OpenSelectedFilename",
|
"g f": "editor::OpenFile",
|
||||||
"g n": "vim::SelectNextMatch",
|
"g n": "vim::SelectNextMatch",
|
||||||
"g shift-n": "vim::SelectPreviousMatch",
|
"g shift-n": "vim::SelectPreviousMatch",
|
||||||
"g l": "vim::SelectNext",
|
"g l": "vim::SelectNext",
|
||||||
@@ -125,17 +123,17 @@
|
|||||||
"g .": "editor::ToggleCodeActions", // zed specific
|
"g .": "editor::ToggleCodeActions", // zed specific
|
||||||
"g shift-a": "editor::FindAllReferences", // zed specific
|
"g shift-a": "editor::FindAllReferences", // zed specific
|
||||||
"g space": "editor::OpenExcerpts", // zed specific
|
"g space": "editor::OpenExcerpts", // zed specific
|
||||||
"g *": ["vim::MoveToNext", { "partial_word": true }],
|
"g *": ["vim::MoveToNext", { "partialWord": true }],
|
||||||
"g #": ["vim::MoveToPrev", { "partial_word": true }],
|
"g #": ["vim::MoveToPrev", { "partialWord": true }],
|
||||||
"g j": ["vim::Down", { "display_lines": true }],
|
"g j": ["vim::Down", { "displayLines": true }],
|
||||||
"g down": ["vim::Down", { "display_lines": true }],
|
"g down": ["vim::Down", { "displayLines": true }],
|
||||||
"g k": ["vim::Up", { "display_lines": true }],
|
"g k": ["vim::Up", { "displayLines": true }],
|
||||||
"g up": ["vim::Up", { "display_lines": true }],
|
"g up": ["vim::Up", { "displayLines": true }],
|
||||||
"g $": ["vim::EndOfLine", { "display_lines": true }],
|
"g $": ["vim::EndOfLine", { "displayLines": true }],
|
||||||
"g end": ["vim::EndOfLine", { "display_lines": true }],
|
"g end": ["vim::EndOfLine", { "displayLines": true }],
|
||||||
"g 0": ["vim::StartOfLine", { "display_lines": true }],
|
"g 0": ["vim::StartOfLine", { "displayLines": true }],
|
||||||
"g home": ["vim::StartOfLine", { "display_lines": true }],
|
"g home": ["vim::StartOfLine", { "displayLines": true }],
|
||||||
"g ^": ["vim::FirstNonWhitespace", { "display_lines": true }],
|
"g ^": ["vim::FirstNonWhitespace", { "displayLines": true }],
|
||||||
"g v": "vim::RestoreVisualSelection",
|
"g v": "vim::RestoreVisualSelection",
|
||||||
"g ]": "editor::GoToDiagnostic",
|
"g ]": "editor::GoToDiagnostic",
|
||||||
"g [": "editor::GoToPrevDiagnostic",
|
"g [": "editor::GoToPrevDiagnostic",
|
||||||
@@ -147,7 +145,7 @@
|
|||||||
"shift-l": "vim::WindowBottom",
|
"shift-l": "vim::WindowBottom",
|
||||||
"q": "vim::ToggleRecord",
|
"q": "vim::ToggleRecord",
|
||||||
"shift-q": "vim::ReplayLastRecording",
|
"shift-q": "vim::ReplayLastRecording",
|
||||||
"@": "vim::PushReplayRegister",
|
"@": ["vim::PushOperator", "ReplayRegister"],
|
||||||
// z commands
|
// z commands
|
||||||
"z enter": ["workspace::SendKeystrokes", "z t ^"],
|
"z enter": ["workspace::SendKeystrokes", "z t ^"],
|
||||||
"z -": ["workspace::SendKeystrokes", "z b ^"],
|
"z -": ["workspace::SendKeystrokes", "z b ^"],
|
||||||
@@ -166,8 +164,8 @@
|
|||||||
"z f": "editor::FoldSelectedRanges",
|
"z f": "editor::FoldSelectedRanges",
|
||||||
"z shift-m": "editor::FoldAll",
|
"z shift-m": "editor::FoldAll",
|
||||||
"z shift-r": "editor::UnfoldAll",
|
"z shift-r": "editor::UnfoldAll",
|
||||||
"shift-z shift-q": ["pane::CloseActiveItem", { "save_intent": "skip" }],
|
"shift-z shift-q": ["pane::CloseActiveItem", { "saveIntent": "skip" }],
|
||||||
"shift-z shift-z": ["pane::CloseActiveItem", { "save_intent": "save_all" }],
|
"shift-z shift-z": ["pane::CloseActiveItem", { "saveIntent": "saveAll" }],
|
||||||
// Count support
|
// Count support
|
||||||
"1": ["vim::Number", 1],
|
"1": ["vim::Number", 1],
|
||||||
"2": ["vim::Number", 2],
|
"2": ["vim::Number", 2],
|
||||||
@@ -190,17 +188,16 @@
|
|||||||
{
|
{
|
||||||
"context": "vim_mode == normal",
|
"context": "vim_mode == normal",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-[": "editor::Cancel",
|
|
||||||
"escape": "editor::Cancel",
|
"escape": "editor::Cancel",
|
||||||
|
"ctrl-[": "editor::Cancel",
|
||||||
":": "command_palette::Toggle",
|
":": "command_palette::Toggle",
|
||||||
".": "vim::Repeat",
|
".": "vim::Repeat",
|
||||||
"c": "vim::PushChange",
|
"c": ["vim::PushOperator", "Change"],
|
||||||
"shift-c": "vim::ChangeToEndOfLine",
|
"shift-c": "vim::ChangeToEndOfLine",
|
||||||
"d": "vim::PushDelete",
|
"d": ["vim::PushOperator", "Delete"],
|
||||||
"shift-d": "vim::DeleteToEndOfLine",
|
"shift-d": "vim::DeleteToEndOfLine",
|
||||||
"shift-j": "vim::JoinLines",
|
"shift-j": "vim::JoinLines",
|
||||||
"g shift-j": "vim::JoinLinesNoWhitespace",
|
"y": ["vim::PushOperator", "Yank"],
|
||||||
"y": "vim::PushYank",
|
|
||||||
"shift-y": "vim::YankLine",
|
"shift-y": "vim::YankLine",
|
||||||
"i": "vim::InsertBefore",
|
"i": "vim::InsertBefore",
|
||||||
"shift-i": "vim::InsertFirstNonWhitespace",
|
"shift-i": "vim::InsertFirstNonWhitespace",
|
||||||
@@ -217,30 +214,29 @@
|
|||||||
"shift-p": ["vim::Paste", { "before": true }],
|
"shift-p": ["vim::Paste", { "before": true }],
|
||||||
"u": "vim::Undo",
|
"u": "vim::Undo",
|
||||||
"ctrl-r": "vim::Redo",
|
"ctrl-r": "vim::Redo",
|
||||||
"r": "vim::PushReplace",
|
"r": ["vim::PushOperator", "Replace"],
|
||||||
"s": "vim::Substitute",
|
"s": "vim::Substitute",
|
||||||
"shift-s": "vim::SubstituteLine",
|
"shift-s": "vim::SubstituteLine",
|
||||||
">": "vim::PushIndent",
|
">": ["vim::PushOperator", "Indent"],
|
||||||
"<": "vim::PushOutdent",
|
"<": ["vim::PushOperator", "Outdent"],
|
||||||
"=": "vim::PushAutoIndent",
|
"=": ["vim::PushOperator", "AutoIndent"],
|
||||||
"!": "vim::PushShellCommand",
|
"g u": ["vim::PushOperator", "Lowercase"],
|
||||||
"g u": "vim::PushLowercase",
|
"g shift-u": ["vim::PushOperator", "Uppercase"],
|
||||||
"g shift-u": "vim::PushUppercase",
|
"g ~": ["vim::PushOperator", "OppositeCase"],
|
||||||
"g ~": "vim::PushOppositeCase",
|
"\"": ["vim::PushOperator", "Register"],
|
||||||
"\"": "vim::PushRegister",
|
"g q": ["vim::PushOperator", "Rewrap"],
|
||||||
"g w": "vim::PushRewrap",
|
"g w": ["vim::PushOperator", "Rewrap"],
|
||||||
"g q": "vim::PushRewrap",
|
|
||||||
"ctrl-pagedown": "pane::ActivateNextItem",
|
"ctrl-pagedown": "pane::ActivateNextItem",
|
||||||
"ctrl-pageup": "pane::ActivatePrevItem",
|
"ctrl-pageup": "pane::ActivatePrevItem",
|
||||||
"insert": "vim::InsertBefore",
|
"insert": "vim::InsertBefore",
|
||||||
// tree-sitter related commands
|
// tree-sitter related commands
|
||||||
"[ x": "vim::SelectLargerSyntaxNode",
|
"[ x": "editor::SelectLargerSyntaxNode",
|
||||||
"] x": "vim::SelectSmallerSyntaxNode",
|
"] x": "editor::SelectSmallerSyntaxNode",
|
||||||
"] d": "editor::GoToDiagnostic",
|
"] d": "editor::GoToDiagnostic",
|
||||||
"[ d": "editor::GoToPrevDiagnostic",
|
"[ d": "editor::GoToPrevDiagnostic",
|
||||||
"] c": "editor::GoToHunk",
|
"] c": "editor::GoToHunk",
|
||||||
"[ c": "editor::GoToPrevHunk",
|
"[ c": "editor::GoToPrevHunk",
|
||||||
"g c": "vim::PushToggleComments"
|
"g c": ["vim::PushOperator", "ToggleComments"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -256,23 +252,23 @@
|
|||||||
":": "vim::VisualCommand",
|
":": "vim::VisualCommand",
|
||||||
"u": "vim::ConvertToLowerCase",
|
"u": "vim::ConvertToLowerCase",
|
||||||
"shift-u": "vim::ConvertToUpperCase",
|
"shift-u": "vim::ConvertToUpperCase",
|
||||||
"shift-o": "vim::OtherEnd",
|
|
||||||
"o": "vim::OtherEnd",
|
"o": "vim::OtherEnd",
|
||||||
|
"shift-o": "vim::OtherEnd",
|
||||||
"d": "vim::VisualDelete",
|
"d": "vim::VisualDelete",
|
||||||
"x": "vim::VisualDelete",
|
"x": "vim::VisualDelete",
|
||||||
"shift-d": "vim::VisualDeleteLine",
|
"shift-d": "vim::VisualDeleteLine",
|
||||||
"shift-x": "vim::VisualDeleteLine",
|
"shift-x": "vim::VisualDeleteLine",
|
||||||
"y": "vim::VisualYank",
|
"y": "vim::VisualYank",
|
||||||
"shift-y": "vim::VisualYankLine",
|
"shift-y": "vim::VisualYank",
|
||||||
"p": "vim::Paste",
|
"p": "vim::Paste",
|
||||||
"shift-p": ["vim::Paste", { "preserve_clipboard": true }],
|
"shift-p": ["vim::Paste", { "preserveClipboard": true }],
|
||||||
"c": "vim::Substitute",
|
|
||||||
"s": "vim::Substitute",
|
"s": "vim::Substitute",
|
||||||
"shift-r": "vim::SubstituteLine",
|
|
||||||
"shift-s": "vim::SubstituteLine",
|
"shift-s": "vim::SubstituteLine",
|
||||||
|
"shift-r": "vim::SubstituteLine",
|
||||||
|
"c": "vim::Substitute",
|
||||||
"~": "vim::ChangeCase",
|
"~": "vim::ChangeCase",
|
||||||
"*": ["vim::MoveToNext", { "partial_word": true }],
|
"*": ["vim::MoveToNext", { "partialWord": true }],
|
||||||
"#": ["vim::MoveToPrev", { "partial_word": true }],
|
"#": ["vim::MoveToPrev", { "partialWord": true }],
|
||||||
"ctrl-a": "vim::Increment",
|
"ctrl-a": "vim::Increment",
|
||||||
"ctrl-x": "vim::Decrement",
|
"ctrl-x": "vim::Decrement",
|
||||||
"g ctrl-a": ["vim::Increment", { "step": true }],
|
"g ctrl-a": ["vim::Increment", { "step": true }],
|
||||||
@@ -282,21 +278,18 @@
|
|||||||
"g shift-i": "vim::VisualInsertFirstNonWhiteSpace",
|
"g shift-i": "vim::VisualInsertFirstNonWhiteSpace",
|
||||||
"g shift-a": "vim::VisualInsertEndOfLine",
|
"g shift-a": "vim::VisualInsertEndOfLine",
|
||||||
"shift-j": "vim::JoinLines",
|
"shift-j": "vim::JoinLines",
|
||||||
"g shift-j": "vim::JoinLinesNoWhitespace",
|
"r": ["vim::PushOperator", "Replace"],
|
||||||
"r": "vim::PushReplace",
|
"ctrl-c": ["vim::SwitchMode", "Normal"],
|
||||||
"ctrl-c": "vim::SwitchToNormalMode",
|
"escape": ["vim::SwitchMode", "Normal"],
|
||||||
"ctrl-[": "vim::SwitchToNormalMode",
|
"ctrl-[": ["vim::SwitchMode", "Normal"],
|
||||||
"escape": "vim::SwitchToNormalMode",
|
|
||||||
">": "vim::Indent",
|
">": "vim::Indent",
|
||||||
"<": "vim::Outdent",
|
"<": "vim::Outdent",
|
||||||
"=": "vim::AutoIndent",
|
"=": "vim::AutoIndent",
|
||||||
"!": "vim::ShellCommand",
|
"i": ["vim::PushOperator", { "Object": { "around": false } }],
|
||||||
"i": ["vim::PushObject", { "around": false }],
|
"a": ["vim::PushOperator", { "Object": { "around": true } }],
|
||||||
"a": ["vim::PushObject", { "around": true }],
|
|
||||||
"g r": ["vim::Paste", { "preserve_clipboard": true }],
|
|
||||||
"g c": "vim::ToggleComments",
|
"g c": "vim::ToggleComments",
|
||||||
"g q": "vim::Rewrap",
|
"g q": "vim::Rewrap",
|
||||||
"\"": "vim::PushRegister",
|
"\"": ["vim::PushOperator", "Register"],
|
||||||
// tree-sitter related commands
|
// tree-sitter related commands
|
||||||
"[ x": "editor::SelectLargerSyntaxNode",
|
"[ x": "editor::SelectLargerSyntaxNode",
|
||||||
"] x": "editor::SelectSmallerSyntaxNode"
|
"] x": "editor::SelectSmallerSyntaxNode"
|
||||||
@@ -305,25 +298,25 @@
|
|||||||
{
|
{
|
||||||
"context": "vim_mode == insert",
|
"context": "vim_mode == insert",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
|
"escape": "vim::NormalBefore",
|
||||||
"ctrl-c": "vim::NormalBefore",
|
"ctrl-c": "vim::NormalBefore",
|
||||||
"ctrl-[": "vim::NormalBefore",
|
"ctrl-[": "vim::NormalBefore",
|
||||||
"escape": "vim::NormalBefore",
|
|
||||||
"ctrl-x": null,
|
"ctrl-x": null,
|
||||||
"ctrl-x ctrl-o": "editor::ShowCompletions",
|
"ctrl-x ctrl-o": "editor::ShowCompletions",
|
||||||
"ctrl-x ctrl-a": "assistant::InlineAssist", // zed specific
|
"ctrl-x ctrl-a": "assistant::InlineAssist", // zed specific
|
||||||
"ctrl-x ctrl-c": "editor::ShowEditPrediction", // zed specific
|
"ctrl-x ctrl-c": "editor::ShowInlineCompletion", // zed specific
|
||||||
"ctrl-x ctrl-l": "editor::ToggleCodeActions", // zed specific
|
"ctrl-x ctrl-l": "editor::ToggleCodeActions", // zed specific
|
||||||
"ctrl-x ctrl-z": "editor::Cancel",
|
"ctrl-x ctrl-z": "editor::Cancel",
|
||||||
"ctrl-w": "editor::DeleteToPreviousWordStart",
|
"ctrl-w": "editor::DeleteToPreviousWordStart",
|
||||||
"ctrl-u": "editor::DeleteToBeginningOfLine",
|
"ctrl-u": "editor::DeleteToBeginningOfLine",
|
||||||
"ctrl-t": "vim::Indent",
|
"ctrl-t": "vim::Indent",
|
||||||
"ctrl-d": "vim::Outdent",
|
"ctrl-d": "vim::Outdent",
|
||||||
"ctrl-k": ["vim::PushDigraph", {}],
|
"ctrl-k": ["vim::PushOperator", { "Digraph": {} }],
|
||||||
"ctrl-v": ["vim::PushLiteral", {}],
|
"ctrl-v": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"ctrl-shift-v": "editor::Paste", // note: this is *very* similar to ctrl-v in vim, but ctrl-shift-v on linux is the typical shortcut for paste when ctrl-v is already in use.
|
"ctrl-shift-v": "editor::Paste", // note: this is *very* similar to ctrl-v in vim, but ctrl-shift-v on linux is the typical shortcut for paste when ctrl-v is already in use.
|
||||||
"ctrl-q": ["vim::PushLiteral", {}],
|
"ctrl-q": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"ctrl-shift-q": ["vim::PushLiteral", {}],
|
"ctrl-shift-q": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"ctrl-r": "vim::PushRegister",
|
"ctrl-r": ["vim::PushOperator", "Register"],
|
||||||
"insert": "vim::ToggleReplace",
|
"insert": "vim::ToggleReplace",
|
||||||
"ctrl-o": "vim::TemporaryNormal"
|
"ctrl-o": "vim::TemporaryNormal"
|
||||||
}
|
}
|
||||||
@@ -355,14 +348,14 @@
|
|||||||
{
|
{
|
||||||
"context": "vim_mode == replace",
|
"context": "vim_mode == replace",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
|
"escape": "vim::NormalBefore",
|
||||||
"ctrl-c": "vim::NormalBefore",
|
"ctrl-c": "vim::NormalBefore",
|
||||||
"ctrl-[": "vim::NormalBefore",
|
"ctrl-[": "vim::NormalBefore",
|
||||||
"escape": "vim::NormalBefore",
|
"ctrl-k": ["vim::PushOperator", { "Digraph": {} }],
|
||||||
"ctrl-k": ["vim::PushDigraph", {}],
|
"ctrl-v": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"ctrl-v": ["vim::PushLiteral", {}],
|
|
||||||
"ctrl-shift-v": "editor::Paste", // note: this is *very* similar to ctrl-v in vim, but ctrl-shift-v on linux is the typical shortcut for paste when ctrl-v is already in use.
|
"ctrl-shift-v": "editor::Paste", // note: this is *very* similar to ctrl-v in vim, but ctrl-shift-v on linux is the typical shortcut for paste when ctrl-v is already in use.
|
||||||
"ctrl-q": ["vim::PushLiteral", {}],
|
"ctrl-q": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"ctrl-shift-q": ["vim::PushLiteral", {}],
|
"ctrl-shift-q": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"backspace": "vim::UndoReplace",
|
"backspace": "vim::UndoReplace",
|
||||||
"tab": "vim::Tab",
|
"tab": "vim::Tab",
|
||||||
"enter": "vim::Enter",
|
"enter": "vim::Enter",
|
||||||
@@ -374,26 +367,20 @@
|
|||||||
"bindings": {
|
"bindings": {
|
||||||
"tab": "vim::Tab",
|
"tab": "vim::Tab",
|
||||||
"enter": "vim::Enter",
|
"enter": "vim::Enter",
|
||||||
|
"escape": "vim::ClearOperators",
|
||||||
"ctrl-c": "vim::ClearOperators",
|
"ctrl-c": "vim::ClearOperators",
|
||||||
"ctrl-[": "vim::ClearOperators",
|
"ctrl-[": "vim::ClearOperators",
|
||||||
"escape": "vim::ClearOperators",
|
"ctrl-k": ["vim::PushOperator", { "Digraph": {} }],
|
||||||
"ctrl-k": ["vim::PushDigraph", {}],
|
"ctrl-v": ["vim::PushOperator", { "Literal": {} }],
|
||||||
"ctrl-v": ["vim::PushLiteral", {}],
|
"ctrl-q": ["vim::PushOperator", { "Literal": {} }]
|
||||||
"ctrl-q": ["vim::PushLiteral", {}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "Editor && vim_mode == waiting && (vim_operator == ys || vim_operator == cs)",
|
|
||||||
"bindings": {
|
|
||||||
"escape": "vim::SwitchToNormalMode"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "vim_mode == operator",
|
"context": "vim_mode == operator",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
|
"escape": "vim::ClearOperators",
|
||||||
"ctrl-c": "vim::ClearOperators",
|
"ctrl-c": "vim::ClearOperators",
|
||||||
"ctrl-[": "vim::ClearOperators",
|
"ctrl-[": "vim::ClearOperators",
|
||||||
"escape": "vim::ClearOperators",
|
|
||||||
"g c": "vim::Comment"
|
"g c": "vim::Comment"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -401,22 +388,17 @@
|
|||||||
"context": "vim_operator == a || vim_operator == i || vim_operator == cs",
|
"context": "vim_operator == a || vim_operator == i || vim_operator == cs",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"w": "vim::Word",
|
"w": "vim::Word",
|
||||||
"shift-w": ["vim::Word", { "ignore_punctuation": true }],
|
"shift-w": ["vim::Word", { "ignorePunctuation": true }],
|
||||||
// Subword TextObject
|
|
||||||
// "w": "vim::Subword",
|
|
||||||
// "shift-w": ["vim::Subword", { "ignore_punctuation": true }],
|
|
||||||
"t": "vim::Tag",
|
"t": "vim::Tag",
|
||||||
"s": "vim::Sentence",
|
"s": "vim::Sentence",
|
||||||
"p": "vim::Paragraph",
|
"p": "vim::Paragraph",
|
||||||
"'": "vim::Quotes",
|
"'": "vim::Quotes",
|
||||||
"`": "vim::BackQuotes",
|
"`": "vim::BackQuotes",
|
||||||
"\"": "vim::DoubleQuotes",
|
"\"": "vim::DoubleQuotes",
|
||||||
"q": "vim::AnyQuotes",
|
|
||||||
"|": "vim::VerticalBars",
|
"|": "vim::VerticalBars",
|
||||||
"(": "vim::Parentheses",
|
"(": "vim::Parentheses",
|
||||||
")": "vim::Parentheses",
|
")": "vim::Parentheses",
|
||||||
"b": "vim::Parentheses",
|
"b": "vim::Parentheses",
|
||||||
// "b": "vim::AnyBrackets",
|
|
||||||
"[": "vim::SquareBrackets",
|
"[": "vim::SquareBrackets",
|
||||||
"]": "vim::SquareBrackets",
|
"]": "vim::SquareBrackets",
|
||||||
"r": "vim::SquareBrackets",
|
"r": "vim::SquareBrackets",
|
||||||
@@ -427,28 +409,26 @@
|
|||||||
">": "vim::AngleBrackets",
|
">": "vim::AngleBrackets",
|
||||||
"a": "vim::Argument",
|
"a": "vim::Argument",
|
||||||
"i": "vim::IndentObj",
|
"i": "vim::IndentObj",
|
||||||
"shift-i": ["vim::IndentObj", { "include_below": true }],
|
"shift-i": ["vim::IndentObj", { "includeBelow": true }],
|
||||||
"f": "vim::Method",
|
"f": "vim::Method",
|
||||||
"c": "vim::Class",
|
"c": "vim::Class"
|
||||||
"e": "vim::EntireFile"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "vim_operator == c",
|
"context": "vim_operator == c",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"c": "vim::CurrentLine",
|
"c": "vim::CurrentLine",
|
||||||
"x": "vim::Exchange",
|
|
||||||
"d": "editor::Rename", // zed specific
|
"d": "editor::Rename", // zed specific
|
||||||
"s": ["vim::PushChangeSurrounds", {}]
|
"s": ["vim::PushOperator", { "ChangeSurrounds": {} }]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "vim_operator == d",
|
"context": "vim_operator == d",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"d": "vim::CurrentLine",
|
"d": "vim::CurrentLine",
|
||||||
"s": "vim::PushDeleteSurrounds",
|
"s": ["vim::PushOperator", "DeleteSurrounds"],
|
||||||
"o": "editor::ToggleSelectedDiffHunks", // "d o"
|
"o": "editor::ToggleHunkDiff", // "d o"
|
||||||
"p": "git::Restore" // "d p"
|
"p": "editor::RevertSelectedHunks" // "d p"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -485,7 +465,7 @@
|
|||||||
"context": "vim_operator == y",
|
"context": "vim_operator == y",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"y": "vim::CurrentLine",
|
"y": "vim::CurrentLine",
|
||||||
"s": ["vim::PushAddSurrounds", {}]
|
"s": ["vim::PushOperator", { "AddSurrounds": {} }]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -512,31 +492,12 @@
|
|||||||
"=": "vim::CurrentLine"
|
"=": "vim::CurrentLine"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "vim_operator == sh",
|
|
||||||
"bindings": {
|
|
||||||
"!": "vim::CurrentLine"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "vim_operator == gc",
|
"context": "vim_operator == gc",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"c": "vim::CurrentLine"
|
"c": "vim::CurrentLine"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"context": "vim_operator == gr",
|
|
||||||
"bindings": {
|
|
||||||
"r": "vim::CurrentLine"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "vim_operator == cx",
|
|
||||||
"bindings": {
|
|
||||||
"x": "vim::CurrentLine",
|
|
||||||
"c": "vim::ClearExchange"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"context": "vim_mode == literal",
|
"context": "vim_mode == literal",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
@@ -588,34 +549,34 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "GitPanel || ProjectPanel || CollabPanel || OutlinePanel || ChatPanel || VimControl || EmptyPane || SharedScreen || MarkdownPreview || KeyContextView",
|
"context": "ProjectPanel || CollabPanel || OutlinePanel || ChatPanel || VimControl || EmptyPane || SharedScreen || MarkdownPreview || KeyContextView",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
// window related commands (ctrl-w X)
|
// window related commands (ctrl-w X)
|
||||||
"ctrl-w": null,
|
"ctrl-w": null,
|
||||||
"ctrl-w left": "workspace::ActivatePaneLeft",
|
"ctrl-w left": ["workspace::ActivatePaneInDirection", "Left"],
|
||||||
"ctrl-w right": "workspace::ActivatePaneRight",
|
"ctrl-w right": ["workspace::ActivatePaneInDirection", "Right"],
|
||||||
"ctrl-w up": "workspace::ActivatePaneUp",
|
"ctrl-w up": ["workspace::ActivatePaneInDirection", "Up"],
|
||||||
"ctrl-w down": "workspace::ActivatePaneDown",
|
"ctrl-w down": ["workspace::ActivatePaneInDirection", "Down"],
|
||||||
"ctrl-w ctrl-h": "workspace::ActivatePaneLeft",
|
"ctrl-w h": ["workspace::ActivatePaneInDirection", "Left"],
|
||||||
"ctrl-w ctrl-l": "workspace::ActivatePaneRight",
|
"ctrl-w l": ["workspace::ActivatePaneInDirection", "Right"],
|
||||||
"ctrl-w ctrl-k": "workspace::ActivatePaneUp",
|
"ctrl-w k": ["workspace::ActivatePaneInDirection", "Up"],
|
||||||
"ctrl-w ctrl-j": "workspace::ActivatePaneDown",
|
"ctrl-w j": ["workspace::ActivatePaneInDirection", "Down"],
|
||||||
"ctrl-w h": "workspace::ActivatePaneLeft",
|
"ctrl-w ctrl-h": ["workspace::ActivatePaneInDirection", "Left"],
|
||||||
"ctrl-w l": "workspace::ActivatePaneRight",
|
"ctrl-w ctrl-l": ["workspace::ActivatePaneInDirection", "Right"],
|
||||||
"ctrl-w k": "workspace::ActivatePaneUp",
|
"ctrl-w ctrl-k": ["workspace::ActivatePaneInDirection", "Up"],
|
||||||
"ctrl-w j": "workspace::ActivatePaneDown",
|
"ctrl-w ctrl-j": ["workspace::ActivatePaneInDirection", "Down"],
|
||||||
"ctrl-w shift-left": "workspace::SwapPaneLeft",
|
"ctrl-w shift-left": ["workspace::SwapPaneInDirection", "Left"],
|
||||||
"ctrl-w shift-right": "workspace::SwapPaneRight",
|
"ctrl-w shift-right": ["workspace::SwapPaneInDirection", "Right"],
|
||||||
"ctrl-w shift-up": "workspace::SwapPaneUp",
|
"ctrl-w shift-up": ["workspace::SwapPaneInDirection", "Up"],
|
||||||
"ctrl-w shift-down": "workspace::SwapPaneDown",
|
"ctrl-w shift-down": ["workspace::SwapPaneInDirection", "Down"],
|
||||||
"ctrl-w shift-h": "workspace::SwapPaneLeft",
|
"ctrl-w shift-h": ["workspace::SwapPaneInDirection", "Left"],
|
||||||
"ctrl-w shift-l": "workspace::SwapPaneRight",
|
"ctrl-w shift-l": ["workspace::SwapPaneInDirection", "Right"],
|
||||||
"ctrl-w shift-k": "workspace::SwapPaneUp",
|
"ctrl-w shift-k": ["workspace::SwapPaneInDirection", "Up"],
|
||||||
"ctrl-w shift-j": "workspace::SwapPaneDown",
|
"ctrl-w shift-j": ["workspace::SwapPaneInDirection", "Down"],
|
||||||
"ctrl-w >": "vim::ResizePaneRight",
|
"ctrl-w >": ["vim::ResizePane", "Widen"],
|
||||||
"ctrl-w <": "vim::ResizePaneLeft",
|
"ctrl-w <": ["vim::ResizePane", "Narrow"],
|
||||||
"ctrl-w -": "vim::ResizePaneDown",
|
"ctrl-w -": ["vim::ResizePane", "Shorten"],
|
||||||
"ctrl-w +": "vim::ResizePaneUp",
|
"ctrl-w +": ["vim::ResizePane", "Lengthen"],
|
||||||
"ctrl-w _": "vim::MaximizePane",
|
"ctrl-w _": "vim::MaximizePane",
|
||||||
"ctrl-w =": "vim::ResetPaneSizes",
|
"ctrl-w =": "vim::ResetPaneSizes",
|
||||||
"ctrl-w g t": "pane::ActivateNextItem",
|
"ctrl-w g t": "pane::ActivateNextItem",
|
||||||
@@ -628,25 +589,23 @@
|
|||||||
"ctrl-w ctrl-p": "workspace::ActivatePreviousPane",
|
"ctrl-w ctrl-p": "workspace::ActivatePreviousPane",
|
||||||
"ctrl-w shift-w": "workspace::ActivatePreviousPane",
|
"ctrl-w shift-w": "workspace::ActivatePreviousPane",
|
||||||
"ctrl-w ctrl-shift-w": "workspace::ActivatePreviousPane",
|
"ctrl-w ctrl-shift-w": "workspace::ActivatePreviousPane",
|
||||||
"ctrl-w ctrl-v": "pane::SplitVertical",
|
|
||||||
"ctrl-w v": "pane::SplitVertical",
|
"ctrl-w v": "pane::SplitVertical",
|
||||||
|
"ctrl-w ctrl-v": "pane::SplitVertical",
|
||||||
|
"ctrl-w s": "pane::SplitHorizontal",
|
||||||
"ctrl-w shift-s": "pane::SplitHorizontal",
|
"ctrl-w shift-s": "pane::SplitHorizontal",
|
||||||
"ctrl-w ctrl-s": "pane::SplitHorizontal",
|
"ctrl-w ctrl-s": "pane::SplitHorizontal",
|
||||||
"ctrl-w s": "pane::SplitHorizontal",
|
"ctrl-w c": "pane::CloseAllItems",
|
||||||
"ctrl-w ctrl-c": "pane::CloseActiveItem",
|
"ctrl-w ctrl-c": "pane::CloseAllItems",
|
||||||
"ctrl-w c": "pane::CloseActiveItem",
|
"ctrl-w q": "pane::CloseAllItems",
|
||||||
"ctrl-w ctrl-q": "pane::CloseActiveItem",
|
"ctrl-w ctrl-q": "pane::CloseAllItems",
|
||||||
"ctrl-w q": "pane::CloseActiveItem",
|
|
||||||
"ctrl-w ctrl-a": "pane::CloseAllItems",
|
|
||||||
"ctrl-w a": "pane::CloseAllItems",
|
|
||||||
"ctrl-w ctrl-o": "workspace::CloseInactiveTabsAndPanes",
|
|
||||||
"ctrl-w o": "workspace::CloseInactiveTabsAndPanes",
|
"ctrl-w o": "workspace::CloseInactiveTabsAndPanes",
|
||||||
"ctrl-w ctrl-n": "workspace::NewFileSplitHorizontal",
|
"ctrl-w ctrl-o": "workspace::CloseInactiveTabsAndPanes",
|
||||||
"ctrl-w n": "workspace::NewFileSplitHorizontal"
|
"ctrl-w n": "workspace::NewFileSplitHorizontal",
|
||||||
|
"ctrl-w ctrl-n": "workspace::NewFileSplitHorizontal"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"context": "ChangesList || EmptyPane || SharedScreen || MarkdownPreview || KeyContextView || Welcome",
|
"context": "EmptyPane || SharedScreen || MarkdownPreview || KeyContextView || Welcome",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
":": "command_palette::Toggle",
|
":": "command_palette::Toggle",
|
||||||
"g /": "pane::DeploySearch"
|
"g /": "pane::DeploySearch"
|
||||||
@@ -694,37 +653,5 @@
|
|||||||
"shift-g": "menu::SelectLast",
|
"shift-g": "menu::SelectLast",
|
||||||
"g g": "menu::SelectFirst"
|
"g g": "menu::SelectFirst"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "GitPanel && ChangesList",
|
|
||||||
"use_key_equivalents": true,
|
|
||||||
"bindings": {
|
|
||||||
"k": "menu::SelectPrev",
|
|
||||||
"j": "menu::SelectNext",
|
|
||||||
"g g": "menu::SelectFirst",
|
|
||||||
"shift-g": "menu::SelectLast",
|
|
||||||
"g f": "menu::Confirm",
|
|
||||||
"i": "git_panel::FocusEditor",
|
|
||||||
"x": "git::ToggleStaged",
|
|
||||||
"shift-x": "git::StageAll",
|
|
||||||
"shift-u": "git::UnstageAll"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "Editor && edit_prediction",
|
|
||||||
"bindings": {
|
|
||||||
// This is identical to the binding in the base keymap, but the vim bindings above to
|
|
||||||
// "vim::Tab" shadow it, so it needs to be bound again.
|
|
||||||
"tab": "editor::AcceptEditPrediction"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"context": "os != macos && Editor && edit_prediction_conflict",
|
|
||||||
"bindings": {
|
|
||||||
// alt-l is provided as an alternative to tab/alt-tab. and will be displayed in the UI. This
|
|
||||||
// is because alt-tab may not be available, as it is often used for window switching on Linux
|
|
||||||
// and Windows.
|
|
||||||
"alt-l": "editor::AcceptEditPrediction"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -13,15 +13,15 @@ You must describe the change using the following XML structure:
|
|||||||
- <description> (optional) - An arbitrarily-long comment that describes the purpose
|
- <description> (optional) - An arbitrarily-long comment that describes the purpose
|
||||||
of this edit.
|
of this edit.
|
||||||
- <old_text> (optional) - An excerpt from the file's current contents that uniquely
|
- <old_text> (optional) - An excerpt from the file's current contents that uniquely
|
||||||
identifies a range within the file where the edit should occur. Required for all operations
|
identifies a range within the file where the edit should occur. If this tag is not
|
||||||
except `create`.
|
specified, then the entire file will be used as the range.
|
||||||
- <new_text> (required) - The new text to insert into the file.
|
- <new_text> (required) - The new text to insert into the file.
|
||||||
- <operation> (required) - The type of change that should occur at the given range
|
- <operation> (required) - The type of change that should occur at the given range
|
||||||
of the file. Must be one of the following values:
|
of the file. Must be one of the following values:
|
||||||
- `update`: Replaces the entire range with the new text.
|
- `update`: Replaces the entire range with the new text.
|
||||||
- `insert_before`: Inserts the new text before the range.
|
- `insert_before`: Inserts the new text before the range.
|
||||||
- `insert_after`: Inserts new text after the range.
|
- `insert_after`: Inserts new text after the range.
|
||||||
- `create`: Creates or overwrites a file with the given path and the new text.
|
- `create`: Creates a new file with the given path and the new text.
|
||||||
- `delete`: Deletes the specified range from the file.
|
- `delete`: Deletes the specified range from the file.
|
||||||
|
|
||||||
<guidelines>
|
<guidelines>
|
||||||
|
|||||||
@@ -10,9 +10,8 @@
|
|||||||
"light": "One Light",
|
"light": "One Light",
|
||||||
"dark": "One Dark"
|
"dark": "One Dark"
|
||||||
},
|
},
|
||||||
"icon_theme": "Zed (Default)",
|
|
||||||
// The name of a base set of key bindings to use.
|
// The name of a base set of key bindings to use.
|
||||||
// This setting can take six values, each named after another
|
// This setting can take four values, each named after another
|
||||||
// text editor:
|
// text editor:
|
||||||
//
|
//
|
||||||
// 1. "VSCode"
|
// 1. "VSCode"
|
||||||
@@ -24,8 +23,8 @@
|
|||||||
"base_keymap": "VSCode",
|
"base_keymap": "VSCode",
|
||||||
// Features that can be globally enabled or disabled
|
// Features that can be globally enabled or disabled
|
||||||
"features": {
|
"features": {
|
||||||
// Which edit prediction provider to use.
|
// Which inline completion provider to use.
|
||||||
"edit_prediction_provider": "copilot"
|
"inline_completion_provider": "copilot"
|
||||||
},
|
},
|
||||||
// The name of a font to use for rendering text in the editor
|
// The name of a font to use for rendering text in the editor
|
||||||
"buffer_font_family": "Zed Plex Mono",
|
"buffer_font_family": "Zed Plex Mono",
|
||||||
@@ -93,13 +92,6 @@
|
|||||||
// workspace when the centered layout is used.
|
// workspace when the centered layout is used.
|
||||||
"right_padding": 0.2
|
"right_padding": 0.2
|
||||||
},
|
},
|
||||||
// All settings related to the image viewer.
|
|
||||||
"image_viewer": {
|
|
||||||
// The unit for image file sizes.
|
|
||||||
// By default we're setting it to binary.
|
|
||||||
// The second option is decimal.
|
|
||||||
"unit": "binary"
|
|
||||||
},
|
|
||||||
// The key to use for adding multiple cursors
|
// The key to use for adding multiple cursors
|
||||||
// Currently "alt" or "cmd_or_ctrl" (also aliased as
|
// Currently "alt" or "cmd_or_ctrl" (also aliased as
|
||||||
// "cmd" and "ctrl") are supported.
|
// "cmd" and "ctrl") are supported.
|
||||||
@@ -126,13 +118,6 @@
|
|||||||
// 3. Never close the window
|
// 3. Never close the window
|
||||||
// "when_closing_with_no_tabs": "keep_window_open",
|
// "when_closing_with_no_tabs": "keep_window_open",
|
||||||
"when_closing_with_no_tabs": "platform_default",
|
"when_closing_with_no_tabs": "platform_default",
|
||||||
// What to do when the last window is closed.
|
|
||||||
// May take 2 values:
|
|
||||||
// 1. Use the current platform's convention
|
|
||||||
// "on_last_window_closed": "platform_default"
|
|
||||||
// 2. Always quit the application
|
|
||||||
// "on_last_window_closed": "quit_app",
|
|
||||||
"on_last_window_closed": "platform_default",
|
|
||||||
// Whether to use the system provided dialogs for Open and Save As.
|
// Whether to use the system provided dialogs for Open and Save As.
|
||||||
// When set to false, Zed will use the built-in keyboard-first pickers.
|
// When set to false, Zed will use the built-in keyboard-first pickers.
|
||||||
"use_system_path_prompts": true,
|
"use_system_path_prompts": true,
|
||||||
@@ -161,10 +146,6 @@
|
|||||||
// 4. Highlight the full line (default):
|
// 4. Highlight the full line (default):
|
||||||
// "all"
|
// "all"
|
||||||
"current_line_highlight": "all",
|
"current_line_highlight": "all",
|
||||||
// Whether to highlight all occurrences of the selected text in an editor.
|
|
||||||
"selection_highlight": true,
|
|
||||||
// The debounce delay before querying highlights based on the selected text.
|
|
||||||
"selection_highlight_debounce": 50,
|
|
||||||
// The debounce delay before querying highlights from the language
|
// The debounce delay before querying highlights from the language
|
||||||
// server based on the current cursor location.
|
// server based on the current cursor location.
|
||||||
"lsp_highlight_debounce": 75,
|
"lsp_highlight_debounce": 75,
|
||||||
@@ -176,8 +157,8 @@
|
|||||||
"show_completion_documentation": true,
|
"show_completion_documentation": true,
|
||||||
// Show method signatures in the editor, when inside parentheses.
|
// Show method signatures in the editor, when inside parentheses.
|
||||||
"auto_signature_help": false,
|
"auto_signature_help": false,
|
||||||
// Whether to show the signature help after completion or a bracket pair inserted.
|
/// Whether to show the signature help after completion or a bracket pair inserted.
|
||||||
// If `auto_signature_help` is enabled, this setting will be treated as enabled also.
|
/// If `auto_signature_help` is enabled, this setting will be treated as enabled also.
|
||||||
"show_signature_help_after_edits": false,
|
"show_signature_help_after_edits": false,
|
||||||
// Whether to show wrap guides (vertical rulers) in the editor.
|
// Whether to show wrap guides (vertical rulers) in the editor.
|
||||||
// Setting this to true will show a guide at the 'preferred_line_length' value
|
// Setting this to true will show a guide at the 'preferred_line_length' value
|
||||||
@@ -211,31 +192,14 @@
|
|||||||
// Otherwise(when `true`), the closing characters are always skipped over and auto-removed
|
// Otherwise(when `true`), the closing characters are always skipped over and auto-removed
|
||||||
// no matter how they were inserted.
|
// no matter how they were inserted.
|
||||||
"always_treat_brackets_as_autoclosed": false,
|
"always_treat_brackets_as_autoclosed": false,
|
||||||
// Controls where the `editor::Rewrap` action is allowed in the current language scope.
|
// Controls whether inline completions are shown immediately (true)
|
||||||
//
|
// or manually by triggering `editor::ShowInlineCompletion` (false).
|
||||||
// This setting can take three values:
|
"show_inline_completions": true,
|
||||||
//
|
// Controls whether inline completions are shown in a given language scope.
|
||||||
// 1. Only allow rewrapping in comments:
|
|
||||||
// "in_comments"
|
|
||||||
// 2. Only allow rewrapping in the current selection(s):
|
|
||||||
// "in_selections"
|
|
||||||
// 3. Allow rewrapping anywhere:
|
|
||||||
// "anywhere"
|
|
||||||
//
|
|
||||||
// When using values other than `in_comments`, it is possible for the rewrapping to produce code
|
|
||||||
// that is syntactically invalid. Keep this in mind when selecting which behavior you would like
|
|
||||||
// to use.
|
|
||||||
//
|
|
||||||
// Note: This setting has no effect in Vim mode, as rewrap is already allowed everywhere.
|
|
||||||
"allow_rewrap": "in_comments",
|
|
||||||
// Controls whether edit predictions are shown immediately (true)
|
|
||||||
// or manually by triggering `editor::ShowEditPrediction` (false).
|
|
||||||
"show_edit_predictions": true,
|
|
||||||
// Controls whether edit predictions are shown in a given language scope.
|
|
||||||
// Example: ["string", "comment"]
|
// Example: ["string", "comment"]
|
||||||
"edit_predictions_disabled_in": [],
|
"inline_completions_disabled_in": [],
|
||||||
// Whether to show tabs and spaces in the editor.
|
// Whether to show tabs and spaces in the editor.
|
||||||
// This setting can take four values:
|
// This setting can take three values:
|
||||||
//
|
//
|
||||||
// 1. Draw tabs and spaces only for the selected text (default):
|
// 1. Draw tabs and spaces only for the selected text (default):
|
||||||
// "selection"
|
// "selection"
|
||||||
@@ -287,22 +251,15 @@
|
|||||||
"git_diff": true,
|
"git_diff": true,
|
||||||
// Whether to show buffer search results in the scrollbar.
|
// Whether to show buffer search results in the scrollbar.
|
||||||
"search_results": true,
|
"search_results": true,
|
||||||
// Whether to show selected text occurrences in the scrollbar.
|
|
||||||
"selected_text": true,
|
|
||||||
// Whether to show selected symbol occurrences in the scrollbar.
|
// Whether to show selected symbol occurrences in the scrollbar.
|
||||||
"selected_symbol": true,
|
"selected_symbol": true,
|
||||||
// Which diagnostic indicators to show in the scrollbar:
|
// Whether to show diagnostic indicators in the scrollbar.
|
||||||
// - "none" or false: do not show diagnostics
|
"diagnostics": true,
|
||||||
// - "error": show only errors
|
/// Forcefully enable or disable the scrollbar for each axis
|
||||||
// - "warning": show only errors and warnings
|
|
||||||
// - "information": show only errors, warnings, and information
|
|
||||||
// - "all" or true: show all diagnostics
|
|
||||||
"diagnostics": "all",
|
|
||||||
// Forcefully enable or disable the scrollbar for each axis
|
|
||||||
"axes": {
|
"axes": {
|
||||||
// When false, forcefully disables the horizontal scrollbar. Otherwise, obey other settings.
|
/// When false, forcefully disables the horizontal scrollbar. Otherwise, obey other settings.
|
||||||
"horizontal": true,
|
"horizontal": true,
|
||||||
// When false, forcefully disables the vertical scrollbar. Otherwise, obey other settings.
|
/// When false, forcefully disables the vertical scrollbar. Otherwise, obey other settings.
|
||||||
"vertical": true
|
"vertical": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -328,24 +285,24 @@
|
|||||||
"folds": true
|
"folds": true
|
||||||
},
|
},
|
||||||
"indent_guides": {
|
"indent_guides": {
|
||||||
// Whether to show indent guides in the editor.
|
/// Whether to show indent guides in the editor.
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
// The width of the indent guides in pixels, between 1 and 10.
|
/// The width of the indent guides in pixels, between 1 and 10.
|
||||||
"line_width": 1,
|
"line_width": 1,
|
||||||
// The width of the active indent guide in pixels, between 1 and 10.
|
/// The width of the active indent guide in pixels, between 1 and 10.
|
||||||
"active_line_width": 1,
|
"active_line_width": 1,
|
||||||
// Determines how indent guides are colored.
|
/// Determines how indent guides are colored.
|
||||||
// This setting can take the following three values:
|
/// This setting can take the following three values:
|
||||||
///
|
///
|
||||||
// 1. "disabled"
|
/// 1. "disabled"
|
||||||
// 2. "fixed"
|
/// 2. "fixed"
|
||||||
// 3. "indent_aware"
|
/// 3. "indent_aware"
|
||||||
"coloring": "fixed",
|
"coloring": "fixed",
|
||||||
// Determines how indent guide backgrounds are colored.
|
/// Determines how indent guide backgrounds are colored.
|
||||||
// This setting can take the following two values:
|
/// This setting can take the following two values:
|
||||||
///
|
///
|
||||||
// 1. "disabled"
|
/// 1. "disabled"
|
||||||
// 2. "indent_aware"
|
/// 2. "indent_aware"
|
||||||
"background_coloring": "disabled"
|
"background_coloring": "disabled"
|
||||||
},
|
},
|
||||||
// Whether the editor will scroll beyond the last line.
|
// Whether the editor will scroll beyond the last line.
|
||||||
@@ -379,9 +336,6 @@
|
|||||||
// 3. Never populate the search query
|
// 3. Never populate the search query
|
||||||
// "never"
|
// "never"
|
||||||
"seed_search_query_from_cursor": "always",
|
"seed_search_query_from_cursor": "always",
|
||||||
// When enabled, automatically adjusts search case sensitivity based on your query.
|
|
||||||
// If your search query contains any uppercase letters, the search becomes case-sensitive;
|
|
||||||
// if it contains only lowercase letters, the search becomes case-insensitive.
|
|
||||||
"use_smartcase_search": false,
|
"use_smartcase_search": false,
|
||||||
// Inlay hint related settings
|
// Inlay hint related settings
|
||||||
"inlay_hints": {
|
"inlay_hints": {
|
||||||
@@ -401,16 +355,7 @@
|
|||||||
"edit_debounce_ms": 700,
|
"edit_debounce_ms": 700,
|
||||||
// Time to wait after scrolling the buffer, before requesting the hints,
|
// Time to wait after scrolling the buffer, before requesting the hints,
|
||||||
// set to 0 to disable debouncing.
|
// set to 0 to disable debouncing.
|
||||||
"scroll_debounce_ms": 50,
|
"scroll_debounce_ms": 50
|
||||||
/// A set of modifiers which, when pressed, will toggle the visibility of inlay hints.
|
|
||||||
/// If the set if empty or not all the modifiers specified are pressed, inlay hints will not be toggled.
|
|
||||||
"toggle_on_modifiers_press": {
|
|
||||||
"control": false,
|
|
||||||
"shift": false,
|
|
||||||
"alt": false,
|
|
||||||
"platform": false,
|
|
||||||
"function": false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"project_panel": {
|
"project_panel": {
|
||||||
// Whether to show the project panel button in the status bar
|
// Whether to show the project panel button in the status bar
|
||||||
@@ -419,8 +364,6 @@
|
|||||||
"default_width": 240,
|
"default_width": 240,
|
||||||
// Where to dock the project panel. Can be 'left' or 'right'.
|
// Where to dock the project panel. Can be 'left' or 'right'.
|
||||||
"dock": "left",
|
"dock": "left",
|
||||||
// Spacing between worktree entries in the project panel. Can be 'comfortable' or 'standard'.
|
|
||||||
"entry_spacing": "comfortable",
|
|
||||||
// Whether to show file icons in the project panel.
|
// Whether to show file icons in the project panel.
|
||||||
"file_icons": true,
|
"file_icons": true,
|
||||||
// Whether to show folder icons or chevrons for directories in the project panel.
|
// Whether to show folder icons or chevrons for directories in the project panel.
|
||||||
@@ -436,32 +379,32 @@
|
|||||||
// Whether to fold directories automatically and show compact folders
|
// Whether to fold directories automatically and show compact folders
|
||||||
// (e.g. "a/b/c" ) when a directory has only one subdirectory inside.
|
// (e.g. "a/b/c" ) when a directory has only one subdirectory inside.
|
||||||
"auto_fold_dirs": true,
|
"auto_fold_dirs": true,
|
||||||
// Scrollbar-related settings
|
/// Scrollbar-related settings
|
||||||
"scrollbar": {
|
"scrollbar": {
|
||||||
// When to show the scrollbar in the project panel.
|
/// When to show the scrollbar in the project panel.
|
||||||
// This setting can take five values:
|
/// This setting can take four values:
|
||||||
///
|
///
|
||||||
// 1. null (default): Inherit editor settings
|
/// 1. null (default): Inherit editor settings
|
||||||
// 2. Show the scrollbar if there's important information or
|
/// 2. Show the scrollbar if there's important information or
|
||||||
// follow the system's configured behavior (default):
|
/// follow the system's configured behavior (default):
|
||||||
// "auto"
|
/// "auto"
|
||||||
// 3. Match the system's configured behavior:
|
/// 3. Match the system's configured behavior:
|
||||||
// "system"
|
/// "system"
|
||||||
// 4. Always show the scrollbar:
|
/// 4. Always show the scrollbar:
|
||||||
// "always"
|
/// "always"
|
||||||
// 5. Never show the scrollbar:
|
/// 5. Never show the scrollbar:
|
||||||
// "never"
|
/// "never"
|
||||||
"show": null
|
"show": null
|
||||||
},
|
},
|
||||||
// Which files containing diagnostic errors/warnings to mark in the project panel.
|
/// Which files containing diagnostic errors/warnings to mark in the project panel.
|
||||||
// This setting can take the following three values:
|
/// This setting can take the following three values:
|
||||||
///
|
///
|
||||||
// 1. Do not mark any files:
|
/// 1. Do not mark any files:
|
||||||
// "off"
|
/// "off"
|
||||||
// 2. Only mark files with errors:
|
/// 2. Only mark files with errors:
|
||||||
// "errors"
|
/// "errors"
|
||||||
// 3. Mark files with errors and warnings:
|
/// 3. Mark files with errors and warnings:
|
||||||
// "all"
|
/// "all"
|
||||||
"show_diagnostics": "all",
|
"show_diagnostics": "all",
|
||||||
// Settings related to indent guides in the project panel.
|
// Settings related to indent guides in the project panel.
|
||||||
"indent_guides": {
|
"indent_guides": {
|
||||||
@@ -494,8 +437,8 @@
|
|||||||
// when a corresponding outline entry becomes active.
|
// when a corresponding outline entry becomes active.
|
||||||
// Gitignored entries are never auto revealed.
|
// Gitignored entries are never auto revealed.
|
||||||
"auto_reveal_entries": true,
|
"auto_reveal_entries": true,
|
||||||
// Whether to fold directories automatically
|
/// Whether to fold directories automatically
|
||||||
// when a directory has only one directory inside.
|
/// when a directory has only one directory inside.
|
||||||
"auto_fold_dirs": true,
|
"auto_fold_dirs": true,
|
||||||
// Settings related to indent guides in the outline panel.
|
// Settings related to indent guides in the outline panel.
|
||||||
"indent_guides": {
|
"indent_guides": {
|
||||||
@@ -508,21 +451,21 @@
|
|||||||
// "never"
|
// "never"
|
||||||
"show": "always"
|
"show": "always"
|
||||||
},
|
},
|
||||||
// Scrollbar-related settings
|
/// Scrollbar-related settings
|
||||||
"scrollbar": {
|
"scrollbar": {
|
||||||
// When to show the scrollbar in the project panel.
|
/// When to show the scrollbar in the project panel.
|
||||||
// This setting can take five values:
|
/// This setting can take four values:
|
||||||
///
|
///
|
||||||
// 1. null (default): Inherit editor settings
|
/// 1. null (default): Inherit editor settings
|
||||||
// 2. Show the scrollbar if there's important information or
|
/// 2. Show the scrollbar if there's important information or
|
||||||
// follow the system's configured behavior (default):
|
/// follow the system's configured behavior (default):
|
||||||
// "auto"
|
/// "auto"
|
||||||
// 3. Match the system's configured behavior:
|
/// 3. Match the system's configured behavior:
|
||||||
// "system"
|
/// "system"
|
||||||
// 4. Always show the scrollbar:
|
/// 4. Always show the scrollbar:
|
||||||
// "always"
|
/// "always"
|
||||||
// 5. Never show the scrollbar:
|
/// 5. Never show the scrollbar:
|
||||||
// "never"
|
/// "never"
|
||||||
"show": null
|
"show": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -535,10 +478,8 @@
|
|||||||
"default_width": 240
|
"default_width": 240
|
||||||
},
|
},
|
||||||
"chat_panel": {
|
"chat_panel": {
|
||||||
// When to show the chat panel button in the status bar.
|
// Whether to show the chat panel button in the status bar.
|
||||||
// Can be 'never', 'always', or 'when_in_call',
|
"button": true,
|
||||||
// or a boolean (interpreted as 'never'/'always').
|
|
||||||
"button": "when_in_call",
|
|
||||||
// Where to the chat panel. Can be 'left' or 'right'.
|
// Where to the chat panel. Can be 'left' or 'right'.
|
||||||
"dock": "right",
|
"dock": "right",
|
||||||
// Default width of the chat panel.
|
// Default width of the chat panel.
|
||||||
@@ -550,17 +491,7 @@
|
|||||||
// Where to the git panel. Can be 'left' or 'right'.
|
// Where to the git panel. Can be 'left' or 'right'.
|
||||||
"dock": "left",
|
"dock": "left",
|
||||||
// Default width of the git panel.
|
// Default width of the git panel.
|
||||||
"default_width": 360,
|
"default_width": 360
|
||||||
// Style of the git status indicator in the panel.
|
|
||||||
//
|
|
||||||
// Default: icon
|
|
||||||
"status_style": "icon",
|
|
||||||
"scrollbar": {
|
|
||||||
// When to show the scrollbar in the git panel.
|
|
||||||
//
|
|
||||||
// Default: inherits editor scrollbar settings
|
|
||||||
"show": null
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"message_editor": {
|
"message_editor": {
|
||||||
// Whether to automatically replace emoji shortcodes with emoji characters.
|
// Whether to automatically replace emoji shortcodes with emoji characters.
|
||||||
@@ -593,7 +524,7 @@
|
|||||||
// The provider to use.
|
// The provider to use.
|
||||||
"provider": "zed.dev",
|
"provider": "zed.dev",
|
||||||
// The model to use.
|
// The model to use.
|
||||||
"model": "claude-3-5-sonnet-latest"
|
"model": "claude-3-5-sonnet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// The settings for slash commands.
|
// The settings for slash commands.
|
||||||
@@ -639,9 +570,7 @@
|
|||||||
// Whether or not to show the tab bar in the editor
|
// Whether or not to show the tab bar in the editor
|
||||||
"show": true,
|
"show": true,
|
||||||
// Whether or not to show the navigation history buttons.
|
// Whether or not to show the navigation history buttons.
|
||||||
"show_nav_history_buttons": true,
|
"show_nav_history_buttons": true
|
||||||
// Whether or not to show the tab bar buttons.
|
|
||||||
"show_tab_bar_buttons": true
|
|
||||||
},
|
},
|
||||||
// Settings related to the editor's tabs
|
// Settings related to the editor's tabs
|
||||||
"tabs": {
|
"tabs": {
|
||||||
@@ -662,16 +591,16 @@
|
|||||||
// 3. Activate the left neighbour tab if present
|
// 3. Activate the left neighbour tab if present
|
||||||
// "left_neighbour"
|
// "left_neighbour"
|
||||||
"activate_on_close": "history",
|
"activate_on_close": "history",
|
||||||
// Which files containing diagnostic errors/warnings to mark in the tabs.
|
/// Which files containing diagnostic errors/warnings to mark in the tabs.
|
||||||
// Diagnostics are only shown when file icons are also active.
|
/// Diagnostics are only shown when file icons are also active.
|
||||||
// This setting only works when can take the following three values:
|
/// This setting only works when can take the following three values:
|
||||||
///
|
///
|
||||||
// 1. Do not mark any files:
|
/// 1. Do not mark any files:
|
||||||
// "off"
|
/// "off"
|
||||||
// 2. Only mark files with errors:
|
/// 2. Only mark files with errors:
|
||||||
// "errors"
|
/// "errors"
|
||||||
// 3. Mark files with errors and warnings:
|
/// 3. Mark files with errors and warnings:
|
||||||
// "all"
|
/// "all"
|
||||||
"show_diagnostics": "off"
|
"show_diagnostics": "off"
|
||||||
},
|
},
|
||||||
// Settings related to preview tabs.
|
// Settings related to preview tabs.
|
||||||
@@ -694,15 +623,15 @@
|
|||||||
// There are 5 possible width values:
|
// There are 5 possible width values:
|
||||||
//
|
//
|
||||||
// 1. Small: This value is essentially a fixed width.
|
// 1. Small: This value is essentially a fixed width.
|
||||||
// "modal_max_width": "small"
|
// "modal_width": "small"
|
||||||
// 2. Medium:
|
// 2. Medium:
|
||||||
// "modal_max_width": "medium"
|
// "modal_width": "medium"
|
||||||
// 3. Large:
|
// 3. Large:
|
||||||
// "modal_max_width": "large"
|
// "modal_width": "large"
|
||||||
// 4. Extra Large:
|
// 4. Extra Large:
|
||||||
// "modal_max_width": "xlarge"
|
// "modal_width": "xlarge"
|
||||||
// 5. Fullscreen: This value removes any horizontal padding, as it consumes the whole viewport width.
|
// 5. Fullscreen: This value removes any horizontal padding, as it consumes the whole viewport width.
|
||||||
// "modal_max_width": "full"
|
// "modal_width": "full"
|
||||||
//
|
//
|
||||||
// Default: small
|
// Default: small
|
||||||
"modal_max_width": "small"
|
"modal_max_width": "small"
|
||||||
@@ -770,28 +699,11 @@
|
|||||||
// Diagnostics configuration.
|
// Diagnostics configuration.
|
||||||
"diagnostics": {
|
"diagnostics": {
|
||||||
// Whether to show warnings or not by default.
|
// Whether to show warnings or not by default.
|
||||||
"include_warnings": true,
|
"include_warnings": true
|
||||||
// Settings for inline diagnostics
|
|
||||||
"inline": {
|
|
||||||
// Whether to show diagnostics inline or not
|
|
||||||
"enabled": false,
|
|
||||||
// The delay in milliseconds to show inline diagnostics after the
|
|
||||||
// last diagnostic update.
|
|
||||||
"update_debounce_ms": 150,
|
|
||||||
// The amount of padding between the end of the source line and the start
|
|
||||||
// of the inline diagnostic in units of em widths.
|
|
||||||
"padding": 4,
|
|
||||||
// The minimum column to display inline diagnostics. This setting can be
|
|
||||||
// used to horizontally align inline diagnostics at some column. Lines
|
|
||||||
// longer than this value will still push diagnostics further to the right.
|
|
||||||
"min_column": 0,
|
|
||||||
// The minimum severity of the diagnostics to show inline.
|
|
||||||
// Shows all diagnostics when not specified.
|
|
||||||
"max_severity": null
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
// Files or globs of files that will be excluded by Zed entirely. They will be skipped during file
|
// Add files or globs of files that will be excluded by Zed entirely:
|
||||||
// scans, file searches, and not be displayed in the project file tree. Takes precedence over `file_scan_inclusions`.
|
// they will be skipped during FS scan(s), file tree and file search
|
||||||
|
// will lack the corresponding file entries. Overrides `file_scan_inclusions`.
|
||||||
"file_scan_exclusions": [
|
"file_scan_exclusions": [
|
||||||
"**/.git",
|
"**/.git",
|
||||||
"**/.svn",
|
"**/.svn",
|
||||||
@@ -803,10 +715,10 @@
|
|||||||
"**/.classpath",
|
"**/.classpath",
|
||||||
"**/.settings"
|
"**/.settings"
|
||||||
],
|
],
|
||||||
// Files or globs of files that will be included by Zed, even when ignored by git. This is useful
|
// Add files or globs of files that will be included by Zed, even when
|
||||||
// for files that are not tracked by git, but are still important to your project. Note that globs
|
// ignored by git. This is useful for files that are not tracked by git,
|
||||||
// that are overly broad can slow down Zed's file scanning. `file_scan_exclusions` takes
|
// but are still important to your project. Note that globs that are
|
||||||
// precedence over these inclusions.
|
// overly broad can slow down Zed's file scanning. Overridden by `file_scan_exclusions`.
|
||||||
"file_scan_inclusions": [".env*"],
|
"file_scan_inclusions": [".env*"],
|
||||||
// Git gutter behavior configuration.
|
// Git gutter behavior configuration.
|
||||||
"git": {
|
"git": {
|
||||||
@@ -824,7 +736,7 @@
|
|||||||
// Delay is restarted with every cursor movement.
|
// Delay is restarted with every cursor movement.
|
||||||
// "delay_ms": 600
|
// "delay_ms": 600
|
||||||
//
|
//
|
||||||
// Whether or not to display the git commit summary on the same line.
|
// Whether or not do display the git commit summary on the same line.
|
||||||
// "show_commit_summary": false
|
// "show_commit_summary": false
|
||||||
//
|
//
|
||||||
// The minimum column number to show the inline blame information at
|
// The minimum column number to show the inline blame information at
|
||||||
@@ -837,31 +749,9 @@
|
|||||||
// 2. Load direnv configuration through the shell hook, works for POSIX shells and fish.
|
// 2. Load direnv configuration through the shell hook, works for POSIX shells and fish.
|
||||||
// "load_direnv": "shell_hook"
|
// "load_direnv": "shell_hook"
|
||||||
"load_direnv": "direct",
|
"load_direnv": "direct",
|
||||||
"edit_predictions": {
|
"inline_completions": {
|
||||||
// A list of globs representing files that edit predictions should be disabled for.
|
// A list of globs representing files that inline completions should be disabled for.
|
||||||
// There's a sensible default list of globs already included.
|
"disabled_globs": [".env"]
|
||||||
// Any addition to this list will be merged with the default list.
|
|
||||||
// Globs are matched relative to the worktree root,
|
|
||||||
// except when starting with a slash (/) or equivalent in Windows.
|
|
||||||
"disabled_globs": [
|
|
||||||
"**/.env*",
|
|
||||||
"**/*.pem",
|
|
||||||
"**/*.key",
|
|
||||||
"**/*.cert",
|
|
||||||
"**/*.crt",
|
|
||||||
"**/.dev.vars",
|
|
||||||
"**/secrets.yml"
|
|
||||||
],
|
|
||||||
// When to show edit predictions previews in buffer.
|
|
||||||
// This setting takes two possible values:
|
|
||||||
// 1. Display predictions inline when there are no language server completions available.
|
|
||||||
// "mode": "eager"
|
|
||||||
// 2. Display predictions inline only when holding a modifier key (alt by default).
|
|
||||||
// "mode": "subtle"
|
|
||||||
"mode": "eager",
|
|
||||||
// Whether edit predictions are enabled in the assistant panel.
|
|
||||||
// This setting has no effect if globally disabled.
|
|
||||||
"enabled_in_assistant": true
|
|
||||||
},
|
},
|
||||||
// Settings specific to journaling
|
// Settings specific to journaling
|
||||||
"journal": {
|
"journal": {
|
||||||
@@ -996,23 +886,6 @@
|
|||||||
// The shell running in the terminal needs to be configured to emit the title.
|
// The shell running in the terminal needs to be configured to emit the title.
|
||||||
// Example: `echo -e "\e]2;New Title\007";`
|
// Example: `echo -e "\e]2;New Title\007";`
|
||||||
"breadcrumbs": true
|
"breadcrumbs": true
|
||||||
},
|
|
||||||
// Scrollbar-related settings
|
|
||||||
"scrollbar": {
|
|
||||||
// When to show the scrollbar in the terminal.
|
|
||||||
// This setting can take five values:
|
|
||||||
///
|
|
||||||
// 1. null (default): Inherit editor settings
|
|
||||||
// 2. Show the scrollbar if there's important information or
|
|
||||||
// follow the system's configured behavior (default):
|
|
||||||
// "auto"
|
|
||||||
// 3. Match the system's configured behavior:
|
|
||||||
// "system"
|
|
||||||
// 4. Always show the scrollbar:
|
|
||||||
// "always"
|
|
||||||
// 5. Never show the scrollbar:
|
|
||||||
// "never"
|
|
||||||
"show": null
|
|
||||||
}
|
}
|
||||||
// Set the terminal's font size. If this option is not included,
|
// Set the terminal's font size. If this option is not included,
|
||||||
// the terminal will default to matching the buffer's font size.
|
// the terminal will default to matching the buffer's font size.
|
||||||
@@ -1030,7 +903,7 @@
|
|||||||
// "max_scroll_history_lines": 10000,
|
// "max_scroll_history_lines": 10000,
|
||||||
},
|
},
|
||||||
"code_actions_on_format": {},
|
"code_actions_on_format": {},
|
||||||
// Settings related to running tasks.
|
/// Settings related to running tasks.
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"variables": {}
|
"variables": {}
|
||||||
},
|
},
|
||||||
@@ -1051,20 +924,20 @@
|
|||||||
"JSONC": ["**/.zed/**/*.json", "**/zed/**/*.json", "**/Zed/**/*.json", "**/.vscode/**/*.json"],
|
"JSONC": ["**/.zed/**/*.json", "**/zed/**/*.json", "**/Zed/**/*.json", "**/.vscode/**/*.json"],
|
||||||
"Shell Script": [".env.*"]
|
"Shell Script": [".env.*"]
|
||||||
},
|
},
|
||||||
// By default use a recent system version of node, or install our own.
|
/// By default use a recent system version of node, or install our own.
|
||||||
// You can override this to use a version of node that is not in $PATH with:
|
/// You can override this to use a version of node that is not in $PATH with:
|
||||||
// {
|
/// {
|
||||||
// "node": {
|
/// "node": {
|
||||||
// "path": "/path/to/node"
|
/// "path": "/path/to/node"
|
||||||
// "npm_path": "/path/to/npm" (defaults to node_path/../npm)
|
/// "npm_path": "/path/to/npm" (defaults to node_path/../npm)
|
||||||
// }
|
/// }
|
||||||
// }
|
/// }
|
||||||
// or to ensure Zed always downloads and installs an isolated version of node:
|
/// or to ensure Zed always downloads and installs an isolated version of node:
|
||||||
// {
|
/// {
|
||||||
// "node": {
|
/// "node": {
|
||||||
// "ignore_system_version": true,
|
/// "ignore_system_version": true,
|
||||||
// }
|
/// }
|
||||||
// NOTE: changing this setting currently requires restarting Zed.
|
/// NOTE: changing this setting currently requires restarting Zed.
|
||||||
"node": {},
|
"node": {},
|
||||||
// The extensions that Zed should automatically install on startup.
|
// The extensions that Zed should automatically install on startup.
|
||||||
//
|
//
|
||||||
@@ -1089,17 +962,11 @@
|
|||||||
},
|
},
|
||||||
"C": {
|
"C": {
|
||||||
"format_on_save": "off",
|
"format_on_save": "off",
|
||||||
"use_on_type_format": false,
|
"use_on_type_format": false
|
||||||
"prettier": {
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"C++": {
|
"C++": {
|
||||||
"format_on_save": "off",
|
"format_on_save": "off",
|
||||||
"use_on_type_format": false,
|
"use_on_type_format": false
|
||||||
"prettier": {
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"CSS": {
|
"CSS": {
|
||||||
"prettier": {
|
"prettier": {
|
||||||
@@ -1110,7 +977,6 @@
|
|||||||
"tab_size": 2
|
"tab_size": 2
|
||||||
},
|
},
|
||||||
"Diff": {
|
"Diff": {
|
||||||
"show_edit_predictions": false,
|
|
||||||
"remove_trailing_whitespace_on_save": false,
|
"remove_trailing_whitespace_on_save": false,
|
||||||
"ensure_final_newline_on_save": false
|
"ensure_final_newline_on_save": false
|
||||||
},
|
},
|
||||||
@@ -1120,9 +986,6 @@
|
|||||||
"Erlang": {
|
"Erlang": {
|
||||||
"language_servers": ["erlang-ls", "!elp", "..."]
|
"language_servers": ["erlang-ls", "!elp", "..."]
|
||||||
},
|
},
|
||||||
"Git Commit": {
|
|
||||||
"allow_rewrap": "anywhere"
|
|
||||||
},
|
|
||||||
"Go": {
|
"Go": {
|
||||||
"code_actions_on_format": {
|
"code_actions_on_format": {
|
||||||
"source.organizeImports": true
|
"source.organizeImports": true
|
||||||
@@ -1166,7 +1029,6 @@
|
|||||||
"Markdown": {
|
"Markdown": {
|
||||||
"format_on_save": "off",
|
"format_on_save": "off",
|
||||||
"use_on_type_format": false,
|
"use_on_type_format": false,
|
||||||
"allow_rewrap": "anywhere",
|
|
||||||
"prettier": {
|
"prettier": {
|
||||||
"allowed": true
|
"allowed": true
|
||||||
}
|
}
|
||||||
@@ -1179,9 +1041,6 @@
|
|||||||
"parser": "php"
|
"parser": "php"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Plain Text": {
|
|
||||||
"allow_rewrap": "anywhere"
|
|
||||||
},
|
|
||||||
"Ruby": {
|
"Ruby": {
|
||||||
"language_servers": ["solargraph", "!ruby-lsp", "!rubocop", "..."]
|
"language_servers": ["solargraph", "!ruby-lsp", "!rubocop", "..."]
|
||||||
},
|
},
|
||||||
@@ -1239,9 +1098,6 @@
|
|||||||
"prettier": {
|
"prettier": {
|
||||||
"allowed": true
|
"allowed": true
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Zig": {
|
|
||||||
"language_servers": ["zls", "..."]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Different settings for specific language models.
|
// Different settings for specific language models.
|
||||||
@@ -1259,15 +1115,6 @@
|
|||||||
"openai": {
|
"openai": {
|
||||||
"version": "1",
|
"version": "1",
|
||||||
"api_url": "https://api.openai.com/v1"
|
"api_url": "https://api.openai.com/v1"
|
||||||
},
|
|
||||||
"lmstudio": {
|
|
||||||
"api_url": "http://localhost:1234/api/v0"
|
|
||||||
},
|
|
||||||
"deepseek": {
|
|
||||||
"api_url": "https://api.deepseek.com"
|
|
||||||
},
|
|
||||||
"mistral": {
|
|
||||||
"api_url": "https://api.mistral.ai/v1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Zed's Prettier integration settings.
|
// Zed's Prettier integration settings.
|
||||||
@@ -1313,7 +1160,6 @@
|
|||||||
},
|
},
|
||||||
// Vim settings
|
// Vim settings
|
||||||
"vim": {
|
"vim": {
|
||||||
"default_mode": "normal",
|
|
||||||
"toggle_relative_line_numbers": false,
|
"toggle_relative_line_numbers": false,
|
||||||
"use_system_clipboard": "always",
|
"use_system_clipboard": "always",
|
||||||
"use_multiline_find": false,
|
"use_multiline_find": false,
|
||||||
|
|||||||
@@ -1,3 +1,549 @@
|
|||||||
|
## [Andromeda](https://github.com/EliverLara/Andromeda)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017 <eliverlara@gmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Cave Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Cave Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Dune Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Dune Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Estuary Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Estuary Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Forest Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Forest Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Heath Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Heath Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Lakeside Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Lakeside Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Plateau Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Plateau Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Savanna Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Savanna Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Seaside Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Seaside Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Sulphurpool Dark](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Atelier Sulphurpool Light](https://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave/)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
## [Ayu Dark](https://github.com/dempfi/ayu)
|
## [Ayu Dark](https://github.com/dempfi/ayu)
|
||||||
|
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
@@ -281,3 +827,187 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Rosé Pine](https://github.com/edunfelt/base16-rose-pine-scheme)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2021 Emilia Dunfelt
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Rosé Pine Dawn](https://github.com/edunfelt/base16-rose-pine-scheme)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2021 Emilia Dunfelt
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Rosé Pine Moon](https://github.com/edunfelt/base16-rose-pine-scheme)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2021 Emilia Dunfelt
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Sandcastle](https://github.com/gessig/base16-sandcastle-scheme)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019 George Essig
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Solarized Dark](https://github.com/altercation/solarized)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2011 Ethan Schoonover
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Solarized Light](https://github.com/altercation/solarized)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2011 Ethan Schoonover
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
## [Summercamp](https://github.com/zoefiri/base16-sc)
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019 Zoe FiriH
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
|||||||
21
assets/themes/andromeda/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017 <eliverlara@gmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
377
assets/themes/andromeda/andromeda.json
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
|
||||||
|
"name": "Andromeda",
|
||||||
|
"author": "Zed Industries",
|
||||||
|
"themes": [
|
||||||
|
{
|
||||||
|
"name": "Andromeda",
|
||||||
|
"appearance": "dark",
|
||||||
|
"style": {
|
||||||
|
"border": "#2b2f38ff",
|
||||||
|
"border.variant": "#252931ff",
|
||||||
|
"border.focused": "#183934ff",
|
||||||
|
"border.selected": "#183934ff",
|
||||||
|
"border.transparent": "#00000000",
|
||||||
|
"border.disabled": "#292d37ff",
|
||||||
|
"elevated_surface.background": "#21242bff",
|
||||||
|
"surface.background": "#21242bff",
|
||||||
|
"background": "#262933ff",
|
||||||
|
"element.background": "#21242bff",
|
||||||
|
"element.hover": "#252931ff",
|
||||||
|
"element.active": "#2a2f39ff",
|
||||||
|
"element.selected": "#2a2f39ff",
|
||||||
|
"element.disabled": "#21242bff",
|
||||||
|
"drop_target.background": "#aca8ae80",
|
||||||
|
"ghost_element.background": "#00000000",
|
||||||
|
"ghost_element.hover": "#252931ff",
|
||||||
|
"ghost_element.active": "#2a2f39ff",
|
||||||
|
"ghost_element.selected": "#2a2f39ff",
|
||||||
|
"ghost_element.disabled": "#21242bff",
|
||||||
|
"text": "#f7f7f8ff",
|
||||||
|
"text.muted": "#aca8aeff",
|
||||||
|
"text.placeholder": "#6b6b73ff",
|
||||||
|
"text.disabled": "#6b6b73ff",
|
||||||
|
"text.accent": "#10a793ff",
|
||||||
|
"icon": "#f7f7f8ff",
|
||||||
|
"icon.muted": "#aca8aeff",
|
||||||
|
"icon.disabled": "#6b6b73ff",
|
||||||
|
"icon.placeholder": "#aca8aeff",
|
||||||
|
"icon.accent": "#10a793ff",
|
||||||
|
"status_bar.background": "#262933ff",
|
||||||
|
"title_bar.background": "#262933ff",
|
||||||
|
"title_bar.inactive_background": "#21242bff",
|
||||||
|
"toolbar.background": "#1e2025ff",
|
||||||
|
"tab_bar.background": "#21242bff",
|
||||||
|
"tab.inactive_background": "#21242bff",
|
||||||
|
"tab.active_background": "#1e2025ff",
|
||||||
|
"search.match_background": "#11a79366",
|
||||||
|
"panel.background": "#21242bff",
|
||||||
|
"panel.focused_border": "#10a793ff",
|
||||||
|
"pane.focused_border": null,
|
||||||
|
"scrollbar.thumb.background": "#f7f7f84c",
|
||||||
|
"scrollbar.thumb.hover_background": "#252931ff",
|
||||||
|
"scrollbar.thumb.border": "#252931ff",
|
||||||
|
"scrollbar.track.background": "#00000000",
|
||||||
|
"scrollbar.track.border": "#21232aff",
|
||||||
|
"editor.foreground": "#f7f7f8ff",
|
||||||
|
"editor.background": "#1e2025ff",
|
||||||
|
"editor.gutter.background": "#1e2025ff",
|
||||||
|
"editor.subheader.background": "#21242bff",
|
||||||
|
"editor.active_line.background": "#21242bbf",
|
||||||
|
"editor.highlighted_line.background": "#21242bff",
|
||||||
|
"editor.line_number": "#f7f7f859",
|
||||||
|
"editor.active_line_number": "#f7f7f8ff",
|
||||||
|
"editor.invisible": "#64646dff",
|
||||||
|
"editor.wrap_guide": "#f7f7f80d",
|
||||||
|
"editor.active_wrap_guide": "#f7f7f81a",
|
||||||
|
"editor.document_highlight.read_background": "#10a7931a",
|
||||||
|
"editor.document_highlight.write_background": "#64646d66",
|
||||||
|
"terminal.background": "#1e2025ff",
|
||||||
|
"terminal.foreground": "#f7f7f8ff",
|
||||||
|
"terminal.bright_foreground": "#f7f7f8ff",
|
||||||
|
"terminal.dim_foreground": "#1e2025ff",
|
||||||
|
"terminal.ansi.black": "#1e2025ff",
|
||||||
|
"terminal.ansi.bright_black": "#40434cff",
|
||||||
|
"terminal.ansi.dim_black": "#f7f7f8ff",
|
||||||
|
"terminal.ansi.red": "#f82871ff",
|
||||||
|
"terminal.ansi.bright_red": "#8e0f3aff",
|
||||||
|
"terminal.ansi.dim_red": "#ffa3b5ff",
|
||||||
|
"terminal.ansi.green": "#96df71ff",
|
||||||
|
"terminal.ansi.bright_green": "#457c38ff",
|
||||||
|
"terminal.ansi.dim_green": "#cef0b9ff",
|
||||||
|
"terminal.ansi.yellow": "#fee56cff",
|
||||||
|
"terminal.ansi.bright_yellow": "#958334ff",
|
||||||
|
"terminal.ansi.dim_yellow": "#fef1b7ff",
|
||||||
|
"terminal.ansi.blue": "#10a793ff",
|
||||||
|
"terminal.ansi.bright_blue": "#1a5148ff",
|
||||||
|
"terminal.ansi.dim_blue": "#9cd4c7ff",
|
||||||
|
"terminal.ansi.magenta": "#c74cecff",
|
||||||
|
"terminal.ansi.bright_magenta": "#682681ff",
|
||||||
|
"terminal.ansi.dim_magenta": "#e7abf7ff",
|
||||||
|
"terminal.ansi.cyan": "#08e7c5ff",
|
||||||
|
"terminal.ansi.bright_cyan": "#008169ff",
|
||||||
|
"terminal.ansi.dim_cyan": "#a9f4e1ff",
|
||||||
|
"terminal.ansi.white": "#f7f7f8ff",
|
||||||
|
"terminal.ansi.bright_white": "#f7f7f8ff",
|
||||||
|
"terminal.ansi.dim_white": "#87858cff",
|
||||||
|
"link_text.hover": "#10a793ff",
|
||||||
|
"conflict": "#fee56cff",
|
||||||
|
"conflict.background": "#5c5014ff",
|
||||||
|
"conflict.border": "#796b26ff",
|
||||||
|
"created": "#96df71ff",
|
||||||
|
"created.background": "#184618ff",
|
||||||
|
"created.border": "#306129ff",
|
||||||
|
"deleted": "#f82871ff",
|
||||||
|
"deleted.background": "#54051bff",
|
||||||
|
"deleted.border": "#72092aff",
|
||||||
|
"error": "#f82871ff",
|
||||||
|
"error.background": "#54051bff",
|
||||||
|
"error.border": "#72092aff",
|
||||||
|
"hidden": "#6b6b73ff",
|
||||||
|
"hidden.background": "#262933ff",
|
||||||
|
"hidden.border": "#292d37ff",
|
||||||
|
"hint": "#618399ff",
|
||||||
|
"hint.background": "#12231fff",
|
||||||
|
"hint.border": "#183934ff",
|
||||||
|
"ignored": "#6b6b73ff",
|
||||||
|
"ignored.background": "#262933ff",
|
||||||
|
"ignored.border": "#2b2f38ff",
|
||||||
|
"info": "#10a793ff",
|
||||||
|
"info.background": "#12231fff",
|
||||||
|
"info.border": "#183934ff",
|
||||||
|
"modified": "#fee56cff",
|
||||||
|
"modified.background": "#5c5014ff",
|
||||||
|
"modified.border": "#796b26ff",
|
||||||
|
"predictive": "#315f70ff",
|
||||||
|
"predictive.background": "#184618ff",
|
||||||
|
"predictive.border": "#306129ff",
|
||||||
|
"renamed": "#10a793ff",
|
||||||
|
"renamed.background": "#12231fff",
|
||||||
|
"renamed.border": "#183934ff",
|
||||||
|
"success": "#96df71ff",
|
||||||
|
"success.background": "#184618ff",
|
||||||
|
"success.border": "#306129ff",
|
||||||
|
"unreachable": "#aca8aeff",
|
||||||
|
"unreachable.background": "#262933ff",
|
||||||
|
"unreachable.border": "#2b2f38ff",
|
||||||
|
"warning": "#fee56cff",
|
||||||
|
"warning.background": "#5c5014ff",
|
||||||
|
"warning.border": "#796b26ff",
|
||||||
|
"players": [
|
||||||
|
{
|
||||||
|
"cursor": "#10a793ff",
|
||||||
|
"background": "#10a793ff",
|
||||||
|
"selection": "#10a7933d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#c74cecff",
|
||||||
|
"background": "#c74cecff",
|
||||||
|
"selection": "#c74cec3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#f29c14ff",
|
||||||
|
"background": "#f29c14ff",
|
||||||
|
"selection": "#f29c143d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#893ea6ff",
|
||||||
|
"background": "#893ea6ff",
|
||||||
|
"selection": "#893ea63d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#08e7c5ff",
|
||||||
|
"background": "#08e7c5ff",
|
||||||
|
"selection": "#08e7c53d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#f82871ff",
|
||||||
|
"background": "#f82871ff",
|
||||||
|
"selection": "#f828713d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#fee56cff",
|
||||||
|
"background": "#fee56cff",
|
||||||
|
"selection": "#fee56c3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#96df71ff",
|
||||||
|
"background": "#96df71ff",
|
||||||
|
"selection": "#96df713d"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"syntax": {
|
||||||
|
"attribute": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"boolean": {
|
||||||
|
"color": "#96df71ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"color": "#afabb1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment.doc": {
|
||||||
|
"color": "#afabb1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"color": "#96df71ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constructor": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"embedded": {
|
||||||
|
"color": "#f7f7f8ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis.strong": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"function": {
|
||||||
|
"color": "#fee56cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"hint": {
|
||||||
|
"color": "#618399ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"keyword": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"label": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_text": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_uri": {
|
||||||
|
"color": "#96df71ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"number": {
|
||||||
|
"color": "#96df71ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"predictive": {
|
||||||
|
"color": "#315f70ff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"preproc": {
|
||||||
|
"color": "#f7f7f8ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"color": "#f7f7f8ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"property": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation": {
|
||||||
|
"color": "#d8d5dbff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.bracket": {
|
||||||
|
"color": "#d8d5dbff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.delimiter": {
|
||||||
|
"color": "#d8d5dbff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.list_marker": {
|
||||||
|
"color": "#d8d5dbff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.special": {
|
||||||
|
"color": "#d8d5dbff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.escape": {
|
||||||
|
"color": "#afabb1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.regex": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special.symbol": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"text.literal": {
|
||||||
|
"color": "#f29c14ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"color": "#f7f7f8ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"color": "#08e7c5ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variable": {
|
||||||
|
"color": "#f7f7f8ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variant": {
|
||||||
|
"color": "#10a793ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
21
assets/themes/atelier/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2023 Bram de Haan, http://atelierbramdehaan.nl
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
7707
assets/themes/atelier/atelier.json
Normal file
@@ -59,9 +59,8 @@
|
|||||||
"editor.subheader.background": "#1f2127ff",
|
"editor.subheader.background": "#1f2127ff",
|
||||||
"editor.active_line.background": "#1f2127bf",
|
"editor.active_line.background": "#1f2127bf",
|
||||||
"editor.highlighted_line.background": "#1f2127ff",
|
"editor.highlighted_line.background": "#1f2127ff",
|
||||||
"editor.line_number": "#4b4c4e",
|
"editor.line_number": "#bfbdb659",
|
||||||
"editor.active_line_number": "#cbcccd",
|
"editor.active_line_number": "#bfbdb6ff",
|
||||||
"editor.hover_line_number": "#a1a2a5",
|
|
||||||
"editor.invisible": "#666767ff",
|
"editor.invisible": "#666767ff",
|
||||||
"editor.wrap_guide": "#bfbdb60d",
|
"editor.wrap_guide": "#bfbdb60d",
|
||||||
"editor.active_wrap_guide": "#bfbdb61a",
|
"editor.active_wrap_guide": "#bfbdb61a",
|
||||||
@@ -430,9 +429,8 @@
|
|||||||
"editor.subheader.background": "#ececedff",
|
"editor.subheader.background": "#ececedff",
|
||||||
"editor.active_line.background": "#ececedbf",
|
"editor.active_line.background": "#ececedbf",
|
||||||
"editor.highlighted_line.background": "#ececedff",
|
"editor.highlighted_line.background": "#ececedff",
|
||||||
"editor.line_number": "#b0b3b5",
|
"editor.line_number": "#5c616659",
|
||||||
"editor.active_line_number": "#313435",
|
"editor.active_line_number": "#5c6166ff",
|
||||||
"editor.hover_line_number": "#62686a",
|
|
||||||
"editor.invisible": "#acafb1ff",
|
"editor.invisible": "#acafb1ff",
|
||||||
"editor.wrap_guide": "#5c61660d",
|
"editor.wrap_guide": "#5c61660d",
|
||||||
"editor.active_wrap_guide": "#5c61661a",
|
"editor.active_wrap_guide": "#5c61661a",
|
||||||
@@ -801,9 +799,8 @@
|
|||||||
"editor.subheader.background": "#353944ff",
|
"editor.subheader.background": "#353944ff",
|
||||||
"editor.active_line.background": "#353944bf",
|
"editor.active_line.background": "#353944bf",
|
||||||
"editor.highlighted_line.background": "#353944ff",
|
"editor.highlighted_line.background": "#353944ff",
|
||||||
"editor.line_number": "#575c6b",
|
"editor.line_number": "#cccac259",
|
||||||
"editor.active_line_number": "#e1e3ea",
|
"editor.active_line_number": "#cccac2ff",
|
||||||
"editor.hover_line_number": "#b2b6c8",
|
|
||||||
"editor.invisible": "#787a7cff",
|
"editor.invisible": "#787a7cff",
|
||||||
"editor.wrap_guide": "#cccac20d",
|
"editor.wrap_guide": "#cccac20d",
|
||||||
"editor.active_wrap_guide": "#cccac21a",
|
"editor.active_wrap_guide": "#cccac21a",
|
||||||
|
|||||||
@@ -68,9 +68,8 @@
|
|||||||
"editor.subheader.background": "#3a3735ff",
|
"editor.subheader.background": "#3a3735ff",
|
||||||
"editor.active_line.background": "#3a3735bf",
|
"editor.active_line.background": "#3a3735bf",
|
||||||
"editor.highlighted_line.background": "#3a3735ff",
|
"editor.highlighted_line.background": "#3a3735ff",
|
||||||
"editor.line_number": "#6e6b5e",
|
"editor.line_number": "#fbf1c759",
|
||||||
"editor.active_line_number": "#dedcd3",
|
"editor.active_line_number": "#fbf1c7ff",
|
||||||
"editor.hover_line_number": "#c9c5b6",
|
|
||||||
"editor.invisible": "#928474ff",
|
"editor.invisible": "#928474ff",
|
||||||
"editor.wrap_guide": "#fbf1c70d",
|
"editor.wrap_guide": "#fbf1c70d",
|
||||||
"editor.active_wrap_guide": "#fbf1c71a",
|
"editor.active_wrap_guide": "#fbf1c71a",
|
||||||
@@ -105,9 +104,6 @@
|
|||||||
"terminal.ansi.bright_white": "#fbf1c7ff",
|
"terminal.ansi.bright_white": "#fbf1c7ff",
|
||||||
"terminal.ansi.dim_white": "#b0a189ff",
|
"terminal.ansi.dim_white": "#b0a189ff",
|
||||||
"link_text.hover": "#83a598ff",
|
"link_text.hover": "#83a598ff",
|
||||||
"version_control_added": "#b7bb26ff",
|
|
||||||
"version_control_modified": "#f9bd2fff",
|
|
||||||
"version_control_deleted": "#fb4a35ff",
|
|
||||||
"conflict": "#f9bd2fff",
|
"conflict": "#f9bd2fff",
|
||||||
"conflict.background": "#572e10ff",
|
"conflict.background": "#572e10ff",
|
||||||
"conflict.border": "#754916ff",
|
"conflict.border": "#754916ff",
|
||||||
@@ -379,7 +375,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#ebdbb2ff",
|
"color": "#83a598ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
@@ -456,9 +452,8 @@
|
|||||||
"editor.subheader.background": "#393634ff",
|
"editor.subheader.background": "#393634ff",
|
||||||
"editor.active_line.background": "#393634bf",
|
"editor.active_line.background": "#393634bf",
|
||||||
"editor.highlighted_line.background": "#393634ff",
|
"editor.highlighted_line.background": "#393634ff",
|
||||||
"editor.line_number": "#6e6b5e",
|
"editor.line_number": "#fbf1c759",
|
||||||
"editor.active_line_number": "#dedcd3",
|
"editor.active_line_number": "#fbf1c7ff",
|
||||||
"editor.hover_line_number": "#c9c5b6",
|
|
||||||
"editor.invisible": "#928474ff",
|
"editor.invisible": "#928474ff",
|
||||||
"editor.wrap_guide": "#fbf1c70d",
|
"editor.wrap_guide": "#fbf1c70d",
|
||||||
"editor.active_wrap_guide": "#fbf1c71a",
|
"editor.active_wrap_guide": "#fbf1c71a",
|
||||||
@@ -493,9 +488,6 @@
|
|||||||
"terminal.ansi.bright_white": "#fbf1c7ff",
|
"terminal.ansi.bright_white": "#fbf1c7ff",
|
||||||
"terminal.ansi.dim_white": "#b0a189ff",
|
"terminal.ansi.dim_white": "#b0a189ff",
|
||||||
"link_text.hover": "#83a598ff",
|
"link_text.hover": "#83a598ff",
|
||||||
"version_control_added": "#b7bb26ff",
|
|
||||||
"version_control_modified": "#f9bd2fff",
|
|
||||||
"version_control_deleted": "#fb4a35ff",
|
|
||||||
"conflict": "#f9bd2fff",
|
"conflict": "#f9bd2fff",
|
||||||
"conflict.background": "#572e10ff",
|
"conflict.background": "#572e10ff",
|
||||||
"conflict.border": "#754916ff",
|
"conflict.border": "#754916ff",
|
||||||
@@ -767,7 +759,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#ebdbb2ff",
|
"color": "#83a598ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
@@ -844,9 +836,8 @@
|
|||||||
"editor.subheader.background": "#3b3735ff",
|
"editor.subheader.background": "#3b3735ff",
|
||||||
"editor.active_line.background": "#3b3735bf",
|
"editor.active_line.background": "#3b3735bf",
|
||||||
"editor.highlighted_line.background": "#3b3735ff",
|
"editor.highlighted_line.background": "#3b3735ff",
|
||||||
"editor.line_number": "#6e6b5e",
|
"editor.line_number": "#fbf1c759",
|
||||||
"editor.active_line_number": "#dedcd3",
|
"editor.active_line_number": "#fbf1c7ff",
|
||||||
"editor.hover_line_number": "#c9c5b6",
|
|
||||||
"editor.invisible": "#928474ff",
|
"editor.invisible": "#928474ff",
|
||||||
"editor.wrap_guide": "#fbf1c70d",
|
"editor.wrap_guide": "#fbf1c70d",
|
||||||
"editor.active_wrap_guide": "#fbf1c71a",
|
"editor.active_wrap_guide": "#fbf1c71a",
|
||||||
@@ -881,9 +872,6 @@
|
|||||||
"terminal.ansi.bright_white": "#fbf1c7ff",
|
"terminal.ansi.bright_white": "#fbf1c7ff",
|
||||||
"terminal.ansi.dim_white": "#b0a189ff",
|
"terminal.ansi.dim_white": "#b0a189ff",
|
||||||
"link_text.hover": "#83a598ff",
|
"link_text.hover": "#83a598ff",
|
||||||
"version_control_added": "#b7bb26ff",
|
|
||||||
"version_control_modified": "#f9bd2fff",
|
|
||||||
"version_control_deleted": "#fb4a35ff",
|
|
||||||
"conflict": "#f9bd2fff",
|
"conflict": "#f9bd2fff",
|
||||||
"conflict.background": "#572e10ff",
|
"conflict.background": "#572e10ff",
|
||||||
"conflict.border": "#754916ff",
|
"conflict.border": "#754916ff",
|
||||||
@@ -1155,7 +1143,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#ebdbb2ff",
|
"color": "#83a598ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
@@ -1232,9 +1220,8 @@
|
|||||||
"editor.subheader.background": "#ecddb4ff",
|
"editor.subheader.background": "#ecddb4ff",
|
||||||
"editor.active_line.background": "#ecddb4bf",
|
"editor.active_line.background": "#ecddb4bf",
|
||||||
"editor.highlighted_line.background": "#ecddb4ff",
|
"editor.highlighted_line.background": "#ecddb4ff",
|
||||||
"editor.line_number": "#a9a389",
|
"editor.line_number": "#28282859",
|
||||||
"editor.active_line_number": "#3b382b",
|
"editor.active_line_number": "#282828ff",
|
||||||
"editor.hover_line_number": "#5e5a45",
|
|
||||||
"editor.invisible": "#928474ff",
|
"editor.invisible": "#928474ff",
|
||||||
"editor.wrap_guide": "#2828280d",
|
"editor.wrap_guide": "#2828280d",
|
||||||
"editor.active_wrap_guide": "#2828281a",
|
"editor.active_wrap_guide": "#2828281a",
|
||||||
@@ -1269,9 +1256,6 @@
|
|||||||
"terminal.ansi.bright_white": "#282828ff",
|
"terminal.ansi.bright_white": "#282828ff",
|
||||||
"terminal.ansi.dim_white": "#73675eff",
|
"terminal.ansi.dim_white": "#73675eff",
|
||||||
"link_text.hover": "#0b6678ff",
|
"link_text.hover": "#0b6678ff",
|
||||||
"version_control_added": "#797410ff",
|
|
||||||
"version_control_modified": "#b57615ff",
|
|
||||||
"version_control_deleted": "#9d0308ff",
|
|
||||||
"conflict": "#b57615ff",
|
"conflict": "#b57615ff",
|
||||||
"conflict.background": "#f5e2d0ff",
|
"conflict.background": "#f5e2d0ff",
|
||||||
"conflict.border": "#ebccabff",
|
"conflict.border": "#ebccabff",
|
||||||
@@ -1543,7 +1527,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#282828ff",
|
"color": "#066578ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
@@ -1620,9 +1604,8 @@
|
|||||||
"editor.subheader.background": "#ecddb5ff",
|
"editor.subheader.background": "#ecddb5ff",
|
||||||
"editor.active_line.background": "#ecddb5bf",
|
"editor.active_line.background": "#ecddb5bf",
|
||||||
"editor.highlighted_line.background": "#ecddb5ff",
|
"editor.highlighted_line.background": "#ecddb5ff",
|
||||||
"editor.line_number": "#a9a389",
|
"editor.line_number": "#28282859",
|
||||||
"editor.active_line_number": "#3b382b",
|
"editor.active_line_number": "#282828ff",
|
||||||
"editor.hover_line_number": "#5e5a45",
|
|
||||||
"editor.invisible": "#928474ff",
|
"editor.invisible": "#928474ff",
|
||||||
"editor.wrap_guide": "#2828280d",
|
"editor.wrap_guide": "#2828280d",
|
||||||
"editor.active_wrap_guide": "#2828281a",
|
"editor.active_wrap_guide": "#2828281a",
|
||||||
@@ -1657,9 +1640,6 @@
|
|||||||
"terminal.ansi.bright_white": "#282828ff",
|
"terminal.ansi.bright_white": "#282828ff",
|
||||||
"terminal.ansi.dim_white": "#73675eff",
|
"terminal.ansi.dim_white": "#73675eff",
|
||||||
"link_text.hover": "#0b6678ff",
|
"link_text.hover": "#0b6678ff",
|
||||||
"version_control_added": "#797410ff",
|
|
||||||
"version_control_modified": "#b57615ff",
|
|
||||||
"version_control_deleted": "#9d0308ff",
|
|
||||||
"conflict": "#b57615ff",
|
"conflict": "#b57615ff",
|
||||||
"conflict.background": "#f5e2d0ff",
|
"conflict.background": "#f5e2d0ff",
|
||||||
"conflict.border": "#ebccabff",
|
"conflict.border": "#ebccabff",
|
||||||
@@ -1931,7 +1911,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#282828ff",
|
"color": "#066578ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
@@ -2008,9 +1988,8 @@
|
|||||||
"editor.subheader.background": "#ecdcb3ff",
|
"editor.subheader.background": "#ecdcb3ff",
|
||||||
"editor.active_line.background": "#ecdcb3bf",
|
"editor.active_line.background": "#ecdcb3bf",
|
||||||
"editor.highlighted_line.background": "#ecdcb3ff",
|
"editor.highlighted_line.background": "#ecdcb3ff",
|
||||||
"editor.line_number": "#a9a389",
|
"editor.line_number": "#28282859",
|
||||||
"editor.active_line_number": "#3b382b",
|
"editor.active_line_number": "#282828ff",
|
||||||
"editor.hover_line_number": "#5e5a45",
|
|
||||||
"editor.invisible": "#928474ff",
|
"editor.invisible": "#928474ff",
|
||||||
"editor.wrap_guide": "#2828280d",
|
"editor.wrap_guide": "#2828280d",
|
||||||
"editor.active_wrap_guide": "#2828281a",
|
"editor.active_wrap_guide": "#2828281a",
|
||||||
@@ -2045,9 +2024,6 @@
|
|||||||
"terminal.ansi.bright_white": "#282828ff",
|
"terminal.ansi.bright_white": "#282828ff",
|
||||||
"terminal.ansi.dim_white": "#73675eff",
|
"terminal.ansi.dim_white": "#73675eff",
|
||||||
"link_text.hover": "#0b6678ff",
|
"link_text.hover": "#0b6678ff",
|
||||||
"version_control_added": "#797410ff",
|
|
||||||
"version_control_modified": "#b57615ff",
|
|
||||||
"version_control_deleted": "#9d0308ff",
|
|
||||||
"conflict": "#b57615ff",
|
"conflict": "#b57615ff",
|
||||||
"conflict.background": "#f5e2d0ff",
|
"conflict.background": "#f5e2d0ff",
|
||||||
"conflict.border": "#ebccabff",
|
"conflict.border": "#ebccabff",
|
||||||
@@ -2319,7 +2295,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#282828ff",
|
"color": "#066578ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -59,9 +59,8 @@
|
|||||||
"editor.subheader.background": "#2f343eff",
|
"editor.subheader.background": "#2f343eff",
|
||||||
"editor.active_line.background": "#2f343ebf",
|
"editor.active_line.background": "#2f343ebf",
|
||||||
"editor.highlighted_line.background": "#2f343eff",
|
"editor.highlighted_line.background": "#2f343eff",
|
||||||
"editor.line_number": "#4e5a5f",
|
"editor.line_number": "#c8ccd459",
|
||||||
"editor.active_line_number": "#d0d4da",
|
"editor.active_line_number": "#dce0e5ff",
|
||||||
"editor.hover_line_number": "#acb0b4",
|
|
||||||
"editor.invisible": "#878a98ff",
|
"editor.invisible": "#878a98ff",
|
||||||
"editor.wrap_guide": "#c8ccd40d",
|
"editor.wrap_guide": "#c8ccd40d",
|
||||||
"editor.active_wrap_guide": "#c8ccd41a",
|
"editor.active_wrap_guide": "#c8ccd41a",
|
||||||
@@ -81,7 +80,7 @@
|
|||||||
"terminal.ansi.bright_green": "#4d6140ff",
|
"terminal.ansi.bright_green": "#4d6140ff",
|
||||||
"terminal.ansi.dim_green": "#d1e0bfff",
|
"terminal.ansi.dim_green": "#d1e0bfff",
|
||||||
"terminal.ansi.yellow": "#dec184ff",
|
"terminal.ansi.yellow": "#dec184ff",
|
||||||
"terminal.ansi.bright_yellow": "#e5c07bff",
|
"terminal.ansi.bright_yellow": "#786441ff",
|
||||||
"terminal.ansi.dim_yellow": "#f1dfc1ff",
|
"terminal.ansi.dim_yellow": "#f1dfc1ff",
|
||||||
"terminal.ansi.blue": "#74ade8ff",
|
"terminal.ansi.blue": "#74ade8ff",
|
||||||
"terminal.ansi.bright_blue": "#385378ff",
|
"terminal.ansi.bright_blue": "#385378ff",
|
||||||
@@ -96,9 +95,6 @@
|
|||||||
"terminal.ansi.bright_white": "#dce0e5ff",
|
"terminal.ansi.bright_white": "#dce0e5ff",
|
||||||
"terminal.ansi.dim_white": "#575d65ff",
|
"terminal.ansi.dim_white": "#575d65ff",
|
||||||
"link_text.hover": "#74ade8ff",
|
"link_text.hover": "#74ade8ff",
|
||||||
"version_control_added": "#a7c088ff",
|
|
||||||
"version_control_modified": "#dec184ff",
|
|
||||||
"version_control_deleted": "#d07277ff",
|
|
||||||
"conflict": "#dec184ff",
|
"conflict": "#dec184ff",
|
||||||
"conflict.background": "#dec1841a",
|
"conflict.background": "#dec1841a",
|
||||||
"conflict.border": "#5d4c2fff",
|
"conflict.border": "#5d4c2fff",
|
||||||
@@ -365,7 +361,7 @@
|
|||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#acb2beff",
|
"color": "#dce0e5ff",
|
||||||
"font_style": null,
|
"font_style": null,
|
||||||
"font_weight": null
|
"font_weight": null
|
||||||
},
|
},
|
||||||
@@ -438,13 +434,12 @@
|
|||||||
"editor.subheader.background": "#ebebecff",
|
"editor.subheader.background": "#ebebecff",
|
||||||
"editor.active_line.background": "#ebebecbf",
|
"editor.active_line.background": "#ebebecbf",
|
||||||
"editor.highlighted_line.background": "#ebebecff",
|
"editor.highlighted_line.background": "#ebebecff",
|
||||||
"editor.line_number": "#b4b4bb",
|
"editor.line_number": "#383a4159",
|
||||||
"editor.active_line_number": "#44454b",
|
"editor.active_line_number": "#242529ff",
|
||||||
"editor.hover_line_number": "#61616b",
|
|
||||||
"editor.invisible": "#a3a3a4ff",
|
"editor.invisible": "#a3a3a4ff",
|
||||||
"editor.wrap_guide": "#383a410d",
|
"editor.wrap_guide": "#383a410d",
|
||||||
"editor.active_wrap_guide": "#383a411a",
|
"editor.active_wrap_guide": "#383a411a",
|
||||||
"editor.document_highlight.read_background": "#5c78e225",
|
"editor.document_highlight.read_background": "#5c78e21a",
|
||||||
"editor.document_highlight.write_background": "#a3a3a466",
|
"editor.document_highlight.write_background": "#a3a3a466",
|
||||||
"terminal.background": "#fafafaff",
|
"terminal.background": "#fafafaff",
|
||||||
"terminal.foreground": "#242529ff",
|
"terminal.foreground": "#242529ff",
|
||||||
@@ -460,7 +455,7 @@
|
|||||||
"terminal.ansi.bright_green": "#b2cfa9ff",
|
"terminal.ansi.bright_green": "#b2cfa9ff",
|
||||||
"terminal.ansi.dim_green": "#354d2eff",
|
"terminal.ansi.dim_green": "#354d2eff",
|
||||||
"terminal.ansi.yellow": "#dec184ff",
|
"terminal.ansi.yellow": "#dec184ff",
|
||||||
"terminal.ansi.bright_yellow": "#826221ff",
|
"terminal.ansi.bright_yellow": "#f1dfc1ff",
|
||||||
"terminal.ansi.dim_yellow": "#786441ff",
|
"terminal.ansi.dim_yellow": "#786441ff",
|
||||||
"terminal.ansi.blue": "#5c78e2ff",
|
"terminal.ansi.blue": "#5c78e2ff",
|
||||||
"terminal.ansi.bright_blue": "#b5baf2ff",
|
"terminal.ansi.bright_blue": "#b5baf2ff",
|
||||||
@@ -475,9 +470,6 @@
|
|||||||
"terminal.ansi.bright_white": "#242529ff",
|
"terminal.ansi.bright_white": "#242529ff",
|
||||||
"terminal.ansi.dim_white": "#97979aff",
|
"terminal.ansi.dim_white": "#97979aff",
|
||||||
"link_text.hover": "#5c78e2ff",
|
"link_text.hover": "#5c78e2ff",
|
||||||
"version_control_added": "#669f59ff",
|
|
||||||
"version_control_modified": "#a48819ff",
|
|
||||||
"version_control_deleted": "#d36151ff",
|
|
||||||
"conflict": "#a48819ff",
|
"conflict": "#a48819ff",
|
||||||
"conflict.background": "#faf2e6ff",
|
"conflict.background": "#faf2e6ff",
|
||||||
"conflict.border": "#f4e7d1ff",
|
"conflict.border": "#f4e7d1ff",
|
||||||
|
|||||||
21
assets/themes/rose_pine/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2021 Emilia Dunfelt
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
1147
assets/themes/rose_pine/rose_pine.json
Normal file
21
assets/themes/sandcastle/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019 George Essig
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
377
assets/themes/sandcastle/sandcastle.json
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
|
||||||
|
"name": "Sandcastle",
|
||||||
|
"author": "Zed Industries",
|
||||||
|
"themes": [
|
||||||
|
{
|
||||||
|
"name": "Sandcastle",
|
||||||
|
"appearance": "dark",
|
||||||
|
"style": {
|
||||||
|
"border": "#3d4350ff",
|
||||||
|
"border.variant": "#313741ff",
|
||||||
|
"border.focused": "#223131ff",
|
||||||
|
"border.selected": "#223131ff",
|
||||||
|
"border.transparent": "#00000000",
|
||||||
|
"border.disabled": "#393f4aff",
|
||||||
|
"elevated_surface.background": "#2b3038ff",
|
||||||
|
"surface.background": "#2b3038ff",
|
||||||
|
"background": "#333944ff",
|
||||||
|
"element.background": "#2b3038ff",
|
||||||
|
"element.hover": "#313741ff",
|
||||||
|
"element.active": "#3d4350ff",
|
||||||
|
"element.selected": "#3d4350ff",
|
||||||
|
"element.disabled": "#2b3038ff",
|
||||||
|
"drop_target.background": "#a6978280",
|
||||||
|
"ghost_element.background": "#00000000",
|
||||||
|
"ghost_element.hover": "#313741ff",
|
||||||
|
"ghost_element.active": "#3d4350ff",
|
||||||
|
"ghost_element.selected": "#3d4350ff",
|
||||||
|
"ghost_element.disabled": "#2b3038ff",
|
||||||
|
"text": "#fdf4c1ff",
|
||||||
|
"text.muted": "#a69782ff",
|
||||||
|
"text.placeholder": "#827568ff",
|
||||||
|
"text.disabled": "#827568ff",
|
||||||
|
"text.accent": "#518b8bff",
|
||||||
|
"icon": "#fdf4c1ff",
|
||||||
|
"icon.muted": "#a69782ff",
|
||||||
|
"icon.disabled": "#827568ff",
|
||||||
|
"icon.placeholder": "#a69782ff",
|
||||||
|
"icon.accent": "#518b8bff",
|
||||||
|
"status_bar.background": "#333944ff",
|
||||||
|
"title_bar.background": "#333944ff",
|
||||||
|
"title_bar.inactive_background": "#2b3038ff",
|
||||||
|
"toolbar.background": "#282c33ff",
|
||||||
|
"tab_bar.background": "#2b3038ff",
|
||||||
|
"tab.inactive_background": "#2b3038ff",
|
||||||
|
"tab.active_background": "#282c33ff",
|
||||||
|
"search.match_background": "#528b8b66",
|
||||||
|
"panel.background": "#2b3038ff",
|
||||||
|
"panel.focused_border": "#518b8bff",
|
||||||
|
"pane.focused_border": null,
|
||||||
|
"scrollbar.thumb.background": "#fdf4c14c",
|
||||||
|
"scrollbar.thumb.hover_background": "#313741ff",
|
||||||
|
"scrollbar.thumb.border": "#313741ff",
|
||||||
|
"scrollbar.track.background": "#00000000",
|
||||||
|
"scrollbar.track.border": "#2a2f38ff",
|
||||||
|
"editor.foreground": "#fdf4c1ff",
|
||||||
|
"editor.background": "#282c33ff",
|
||||||
|
"editor.gutter.background": "#282c33ff",
|
||||||
|
"editor.subheader.background": "#2b3038ff",
|
||||||
|
"editor.active_line.background": "#2b3038bf",
|
||||||
|
"editor.highlighted_line.background": "#2b3038ff",
|
||||||
|
"editor.line_number": "#fdf4c159",
|
||||||
|
"editor.active_line_number": "#fdf4c1ff",
|
||||||
|
"editor.invisible": "#7c6f64ff",
|
||||||
|
"editor.wrap_guide": "#fdf4c10d",
|
||||||
|
"editor.active_wrap_guide": "#fdf4c11a",
|
||||||
|
"editor.document_highlight.read_background": "#518b8b1a",
|
||||||
|
"editor.document_highlight.write_background": "#7c6f6466",
|
||||||
|
"terminal.background": "#282c33ff",
|
||||||
|
"terminal.foreground": "#fdf4c1ff",
|
||||||
|
"terminal.bright_foreground": "#fdf4c1ff",
|
||||||
|
"terminal.dim_foreground": "#282c33ff",
|
||||||
|
"terminal.ansi.black": "#282c33ff",
|
||||||
|
"terminal.ansi.bright_black": "#5e5753ff",
|
||||||
|
"terminal.ansi.dim_black": "#fdf4c1ff",
|
||||||
|
"terminal.ansi.red": "#b3627aff",
|
||||||
|
"terminal.ansi.bright_red": "#57333dff",
|
||||||
|
"terminal.ansi.dim_red": "#dcb0bbff",
|
||||||
|
"terminal.ansi.green": "#83a598ff",
|
||||||
|
"terminal.ansi.bright_green": "#414f4aff",
|
||||||
|
"terminal.ansi.dim_green": "#c0d2cbff",
|
||||||
|
"terminal.ansi.yellow": "#a07d3aff",
|
||||||
|
"terminal.ansi.bright_yellow": "#4e3f22ff",
|
||||||
|
"terminal.ansi.dim_yellow": "#d3bd9aff",
|
||||||
|
"terminal.ansi.blue": "#518b8bff",
|
||||||
|
"terminal.ansi.bright_blue": "#2c4444ff",
|
||||||
|
"terminal.ansi.dim_blue": "#a8c4c4ff",
|
||||||
|
"terminal.ansi.magenta": "#a87222ff",
|
||||||
|
"terminal.ansi.bright_magenta": "#523918ff",
|
||||||
|
"terminal.ansi.dim_magenta": "#dab78eff",
|
||||||
|
"terminal.ansi.cyan": "#83a598ff",
|
||||||
|
"terminal.ansi.bright_cyan": "#414f4aff",
|
||||||
|
"terminal.ansi.dim_cyan": "#c0d2cbff",
|
||||||
|
"terminal.ansi.white": "#fdf4c1ff",
|
||||||
|
"terminal.ansi.bright_white": "#fdf4c1ff",
|
||||||
|
"terminal.ansi.dim_white": "#958776ff",
|
||||||
|
"link_text.hover": "#518b8bff",
|
||||||
|
"conflict": "#a07d3aff",
|
||||||
|
"conflict.background": "#231d12ff",
|
||||||
|
"conflict.border": "#392e19ff",
|
||||||
|
"created": "#83a598ff",
|
||||||
|
"created.background": "#1e2321ff",
|
||||||
|
"created.border": "#303a36ff",
|
||||||
|
"deleted": "#b3627aff",
|
||||||
|
"deleted.background": "#26191cff",
|
||||||
|
"deleted.border": "#3e272dff",
|
||||||
|
"error": "#b3627aff",
|
||||||
|
"error.background": "#26191cff",
|
||||||
|
"error.border": "#3e272dff",
|
||||||
|
"hidden": "#827568ff",
|
||||||
|
"hidden.background": "#333944ff",
|
||||||
|
"hidden.border": "#393f4aff",
|
||||||
|
"hint": "#727d68ff",
|
||||||
|
"hint.background": "#171e1eff",
|
||||||
|
"hint.border": "#223131ff",
|
||||||
|
"ignored": "#827568ff",
|
||||||
|
"ignored.background": "#333944ff",
|
||||||
|
"ignored.border": "#3d4350ff",
|
||||||
|
"info": "#518b8bff",
|
||||||
|
"info.background": "#171e1eff",
|
||||||
|
"info.border": "#223131ff",
|
||||||
|
"modified": "#a07d3aff",
|
||||||
|
"modified.background": "#231d12ff",
|
||||||
|
"modified.border": "#392e19ff",
|
||||||
|
"predictive": "#5c6152ff",
|
||||||
|
"predictive.background": "#1e2321ff",
|
||||||
|
"predictive.border": "#303a36ff",
|
||||||
|
"renamed": "#518b8bff",
|
||||||
|
"renamed.background": "#171e1eff",
|
||||||
|
"renamed.border": "#223131ff",
|
||||||
|
"success": "#83a598ff",
|
||||||
|
"success.background": "#1e2321ff",
|
||||||
|
"success.border": "#303a36ff",
|
||||||
|
"unreachable": "#a69782ff",
|
||||||
|
"unreachable.background": "#333944ff",
|
||||||
|
"unreachable.border": "#3d4350ff",
|
||||||
|
"warning": "#a07d3aff",
|
||||||
|
"warning.background": "#231d12ff",
|
||||||
|
"warning.border": "#392e19ff",
|
||||||
|
"players": [
|
||||||
|
{
|
||||||
|
"cursor": "#518b8bff",
|
||||||
|
"background": "#518b8bff",
|
||||||
|
"selection": "#518b8b3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#a87222ff",
|
||||||
|
"background": "#a87222ff",
|
||||||
|
"selection": "#a872223d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#a07d3aff",
|
||||||
|
"background": "#a07d3aff",
|
||||||
|
"selection": "#a07d3a3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#d75f5fff",
|
||||||
|
"background": "#d75f5fff",
|
||||||
|
"selection": "#d75f5f3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#83a598ff",
|
||||||
|
"background": "#83a598ff",
|
||||||
|
"selection": "#83a5983d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#b3627aff",
|
||||||
|
"background": "#b3627aff",
|
||||||
|
"selection": "#b3627a3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#a07d3aff",
|
||||||
|
"background": "#a07d3aff",
|
||||||
|
"selection": "#a07d3a3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#83a598ff",
|
||||||
|
"background": "#83a598ff",
|
||||||
|
"selection": "#83a5983d"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"syntax": {
|
||||||
|
"attribute": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"boolean": {
|
||||||
|
"color": "#83a598ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"color": "#a89984ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment.doc": {
|
||||||
|
"color": "#a89984ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"color": "#83a598ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constructor": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"embedded": {
|
||||||
|
"color": "#fdf4c1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis.strong": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"function": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"hint": {
|
||||||
|
"color": "#727d68ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"keyword": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"label": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_text": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_uri": {
|
||||||
|
"color": "#83a598ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"number": {
|
||||||
|
"color": "#83a598ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"predictive": {
|
||||||
|
"color": "#5c6152ff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"preproc": {
|
||||||
|
"color": "#fdf4c1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"color": "#fdf4c1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"property": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation": {
|
||||||
|
"color": "#d5c5a1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.bracket": {
|
||||||
|
"color": "#d5c5a1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.delimiter": {
|
||||||
|
"color": "#d5c5a1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.list_marker": {
|
||||||
|
"color": "#d5c5a1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.special": {
|
||||||
|
"color": "#d5c5a1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.escape": {
|
||||||
|
"color": "#a89984ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.regex": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special.symbol": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"text.literal": {
|
||||||
|
"color": "#a07d3aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"color": "#fdf4c1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"color": "#83a598ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variable": {
|
||||||
|
"color": "#fdf4c1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variant": {
|
||||||
|
"color": "#518b8bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
21
assets/themes/solarized/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2011 Ethan Schoonover
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
747
assets/themes/solarized/solarized.json
Normal file
@@ -0,0 +1,747 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
|
||||||
|
"name": "Solarized",
|
||||||
|
"author": "Zed Industries",
|
||||||
|
"themes": [
|
||||||
|
{
|
||||||
|
"name": "Solarized Dark",
|
||||||
|
"appearance": "dark",
|
||||||
|
"style": {
|
||||||
|
"border": "#2b4e58ff",
|
||||||
|
"border.variant": "#053541ff",
|
||||||
|
"border.focused": "#1b3149ff",
|
||||||
|
"border.selected": "#1b3149ff",
|
||||||
|
"border.transparent": "#00000000",
|
||||||
|
"border.disabled": "#19424dff",
|
||||||
|
"elevated_surface.background": "#04313bff",
|
||||||
|
"surface.background": "#04313bff",
|
||||||
|
"background": "#073743ff",
|
||||||
|
"element.background": "#04313bff",
|
||||||
|
"element.hover": "#053541ff",
|
||||||
|
"element.active": "#294d58ff",
|
||||||
|
"element.selected": "#294d58ff",
|
||||||
|
"element.disabled": "#04313bff",
|
||||||
|
"drop_target.background": "#93a1a180",
|
||||||
|
"ghost_element.background": "#00000000",
|
||||||
|
"ghost_element.hover": "#053541ff",
|
||||||
|
"ghost_element.active": "#294d58ff",
|
||||||
|
"ghost_element.selected": "#294d58ff",
|
||||||
|
"ghost_element.disabled": "#04313bff",
|
||||||
|
"text": "#fdf6e3ff",
|
||||||
|
"text.muted": "#93a1a1ff",
|
||||||
|
"text.placeholder": "#6f8389ff",
|
||||||
|
"text.disabled": "#6f8389ff",
|
||||||
|
"text.accent": "#278ad1ff",
|
||||||
|
"icon": "#fdf6e3ff",
|
||||||
|
"icon.muted": "#93a1a1ff",
|
||||||
|
"icon.disabled": "#6f8389ff",
|
||||||
|
"icon.placeholder": "#93a1a1ff",
|
||||||
|
"icon.accent": "#278ad1ff",
|
||||||
|
"status_bar.background": "#073743ff",
|
||||||
|
"title_bar.background": "#073743ff",
|
||||||
|
"title_bar.inactive_background": "#04313bff",
|
||||||
|
"toolbar.background": "#002a35ff",
|
||||||
|
"tab_bar.background": "#04313bff",
|
||||||
|
"tab.inactive_background": "#04313bff",
|
||||||
|
"tab.active_background": "#002a35ff",
|
||||||
|
"search.match_background": "#288bd166",
|
||||||
|
"panel.background": "#04313bff",
|
||||||
|
"panel.focused_border": "#278ad1ff",
|
||||||
|
"pane.focused_border": null,
|
||||||
|
"scrollbar.thumb.background": "#fdf6e34c",
|
||||||
|
"scrollbar.thumb.hover_background": "#053541ff",
|
||||||
|
"scrollbar.thumb.border": "#053541ff",
|
||||||
|
"scrollbar.track.background": "#00000000",
|
||||||
|
"scrollbar.track.border": "#022f3bff",
|
||||||
|
"editor.foreground": "#fdf6e3ff",
|
||||||
|
"editor.background": "#002a35ff",
|
||||||
|
"editor.gutter.background": "#002a35ff",
|
||||||
|
"editor.subheader.background": "#04313bff",
|
||||||
|
"editor.active_line.background": "#04313bbf",
|
||||||
|
"editor.highlighted_line.background": "#04313bff",
|
||||||
|
"editor.line_number": "#fdf6e359",
|
||||||
|
"editor.active_line_number": "#fdf6e3ff",
|
||||||
|
"editor.invisible": "#6c8287ff",
|
||||||
|
"editor.wrap_guide": "#fdf6e30d",
|
||||||
|
"editor.active_wrap_guide": "#fdf6e31a",
|
||||||
|
"editor.document_highlight.read_background": "#278ad11a",
|
||||||
|
"editor.document_highlight.write_background": "#6c828766",
|
||||||
|
"terminal.background": "#002a35ff",
|
||||||
|
"terminal.foreground": "#fdf6e3ff",
|
||||||
|
"terminal.bright_foreground": "#fdf6e3ff",
|
||||||
|
"terminal.dim_foreground": "#002a35ff",
|
||||||
|
"terminal.ansi.black": "#002a35ff",
|
||||||
|
"terminal.ansi.bright_black": "#5c7279ff",
|
||||||
|
"terminal.ansi.dim_black": "#fdf6e3ff",
|
||||||
|
"terminal.ansi.red": "#dc3330ff",
|
||||||
|
"terminal.ansi.bright_red": "#7d181cff",
|
||||||
|
"terminal.ansi.dim_red": "#faa091ff",
|
||||||
|
"terminal.ansi.green": "#849903ff",
|
||||||
|
"terminal.ansi.bright_green": "#434a10ff",
|
||||||
|
"terminal.ansi.dim_green": "#c6cb8bff",
|
||||||
|
"terminal.ansi.yellow": "#b58902ff",
|
||||||
|
"terminal.ansi.bright_yellow": "#5d430fff",
|
||||||
|
"terminal.ansi.dim_yellow": "#e0c189ff",
|
||||||
|
"terminal.ansi.blue": "#278ad1ff",
|
||||||
|
"terminal.ansi.bright_blue": "#214365ff",
|
||||||
|
"terminal.ansi.dim_blue": "#a5c3e9ff",
|
||||||
|
"terminal.ansi.magenta": "#d33781ff",
|
||||||
|
"terminal.ansi.bright_magenta": "#6f1f3fff",
|
||||||
|
"terminal.ansi.dim_magenta": "#f0a2beff",
|
||||||
|
"terminal.ansi.cyan": "#2ba198ff",
|
||||||
|
"terminal.ansi.bright_cyan": "#204e4aff",
|
||||||
|
"terminal.ansi.dim_cyan": "#9fd0cbff",
|
||||||
|
"terminal.ansi.white": "#fdf6e3ff",
|
||||||
|
"terminal.ansi.bright_white": "#fdf6e3ff",
|
||||||
|
"terminal.ansi.dim_white": "#7b8e91ff",
|
||||||
|
"link_text.hover": "#278ad1ff",
|
||||||
|
"conflict": "#b58902ff",
|
||||||
|
"conflict.background": "#2e1d0cff",
|
||||||
|
"conflict.border": "#47300fff",
|
||||||
|
"created": "#849903ff",
|
||||||
|
"created.background": "#1e210cff",
|
||||||
|
"created.border": "#313510ff",
|
||||||
|
"deleted": "#dc3330ff",
|
||||||
|
"deleted.background": "#4a080eff",
|
||||||
|
"deleted.border": "#641015ff",
|
||||||
|
"error": "#dc3330ff",
|
||||||
|
"error.background": "#4a080eff",
|
||||||
|
"error.border": "#641015ff",
|
||||||
|
"hidden": "#6f8389ff",
|
||||||
|
"hidden.background": "#073743ff",
|
||||||
|
"hidden.border": "#19424dff",
|
||||||
|
"hint": "#4f8297ff",
|
||||||
|
"hint.background": "#141f2cff",
|
||||||
|
"hint.border": "#1b3149ff",
|
||||||
|
"ignored": "#6f8389ff",
|
||||||
|
"ignored.background": "#073743ff",
|
||||||
|
"ignored.border": "#2b4e58ff",
|
||||||
|
"info": "#278ad1ff",
|
||||||
|
"info.background": "#141f2cff",
|
||||||
|
"info.border": "#1b3149ff",
|
||||||
|
"modified": "#b58902ff",
|
||||||
|
"modified.background": "#2e1d0cff",
|
||||||
|
"modified.border": "#47300fff",
|
||||||
|
"predictive": "#3f718bff",
|
||||||
|
"predictive.background": "#1e210cff",
|
||||||
|
"predictive.border": "#313510ff",
|
||||||
|
"renamed": "#278ad1ff",
|
||||||
|
"renamed.background": "#141f2cff",
|
||||||
|
"renamed.border": "#1b3149ff",
|
||||||
|
"success": "#849903ff",
|
||||||
|
"success.background": "#1e210cff",
|
||||||
|
"success.border": "#313510ff",
|
||||||
|
"unreachable": "#93a1a1ff",
|
||||||
|
"unreachable.background": "#073743ff",
|
||||||
|
"unreachable.border": "#2b4e58ff",
|
||||||
|
"warning": "#b58902ff",
|
||||||
|
"warning.background": "#2e1d0cff",
|
||||||
|
"warning.border": "#47300fff",
|
||||||
|
"players": [
|
||||||
|
{
|
||||||
|
"cursor": "#278ad1ff",
|
||||||
|
"background": "#278ad1ff",
|
||||||
|
"selection": "#278ad13d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#d33781ff",
|
||||||
|
"background": "#d33781ff",
|
||||||
|
"selection": "#d337813d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#cb4b16ff",
|
||||||
|
"background": "#cb4b16ff",
|
||||||
|
"selection": "#cb4b163d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#6c71c4ff",
|
||||||
|
"background": "#6c71c4ff",
|
||||||
|
"selection": "#6c71c43d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#2ba198ff",
|
||||||
|
"background": "#2ba198ff",
|
||||||
|
"selection": "#2ba1983d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#dc3330ff",
|
||||||
|
"background": "#dc3330ff",
|
||||||
|
"selection": "#dc33303d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#b58902ff",
|
||||||
|
"background": "#b58902ff",
|
||||||
|
"selection": "#b589023d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#849903ff",
|
||||||
|
"background": "#849903ff",
|
||||||
|
"selection": "#8499033d"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"syntax": {
|
||||||
|
"attribute": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"boolean": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"color": "#99a5a4ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment.doc": {
|
||||||
|
"color": "#99a5a4ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constructor": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"embedded": {
|
||||||
|
"color": "#fdf6e3ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis.strong": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"function": {
|
||||||
|
"color": "#b58902ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"hint": {
|
||||||
|
"color": "#4f8297ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"keyword": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"label": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_text": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_uri": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"number": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"predictive": {
|
||||||
|
"color": "#3f718bff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"preproc": {
|
||||||
|
"color": "#fdf6e3ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"color": "#fdf6e3ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"property": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation": {
|
||||||
|
"color": "#efe9d6ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.bracket": {
|
||||||
|
"color": "#efe9d6ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.delimiter": {
|
||||||
|
"color": "#efe9d6ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.list_marker": {
|
||||||
|
"color": "#efe9d6ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.special": {
|
||||||
|
"color": "#efe9d6ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.escape": {
|
||||||
|
"color": "#99a5a4ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.regex": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special.symbol": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"text.literal": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"color": "#fdf6e3ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"color": "#2ba198ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variable": {
|
||||||
|
"color": "#fdf6e3ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variant": {
|
||||||
|
"color": "#278ad1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Solarized Light",
|
||||||
|
"appearance": "light",
|
||||||
|
"style": {
|
||||||
|
"border": "#9faaa8ff",
|
||||||
|
"border.variant": "#dcdacbff",
|
||||||
|
"border.focused": "#bfd3efff",
|
||||||
|
"border.selected": "#bfd3efff",
|
||||||
|
"border.transparent": "#00000000",
|
||||||
|
"border.disabled": "#b6bcb5ff",
|
||||||
|
"elevated_surface.background": "#f3eddaff",
|
||||||
|
"surface.background": "#f3eddaff",
|
||||||
|
"background": "#cfd0c4ff",
|
||||||
|
"element.background": "#f3eddaff",
|
||||||
|
"element.hover": "#dcdacbff",
|
||||||
|
"element.active": "#a2aca9ff",
|
||||||
|
"element.selected": "#a2aca9ff",
|
||||||
|
"element.disabled": "#f3eddaff",
|
||||||
|
"drop_target.background": "#34555e80",
|
||||||
|
"ghost_element.background": "#00000000",
|
||||||
|
"ghost_element.hover": "#dcdacbff",
|
||||||
|
"ghost_element.active": "#a2aca9ff",
|
||||||
|
"ghost_element.selected": "#a2aca9ff",
|
||||||
|
"ghost_element.disabled": "#f3eddaff",
|
||||||
|
"text": "#002a35ff",
|
||||||
|
"text.muted": "#34555eff",
|
||||||
|
"text.placeholder": "#6a7f86ff",
|
||||||
|
"text.disabled": "#6a7f86ff",
|
||||||
|
"text.accent": "#288bd1ff",
|
||||||
|
"icon": "#002a35ff",
|
||||||
|
"icon.muted": "#34555eff",
|
||||||
|
"icon.disabled": "#6a7f86ff",
|
||||||
|
"icon.placeholder": "#34555eff",
|
||||||
|
"icon.accent": "#288bd1ff",
|
||||||
|
"status_bar.background": "#cfd0c4ff",
|
||||||
|
"title_bar.background": "#cfd0c4ff",
|
||||||
|
"title_bar.inactive_background": "#f3eddaff",
|
||||||
|
"toolbar.background": "#fdf6e3ff",
|
||||||
|
"tab_bar.background": "#f3eddaff",
|
||||||
|
"tab.inactive_background": "#f3eddaff",
|
||||||
|
"tab.active_background": "#fdf6e3ff",
|
||||||
|
"search.match_background": "#298bd166",
|
||||||
|
"panel.background": "#f3eddaff",
|
||||||
|
"panel.focused_border": "#288bd1ff",
|
||||||
|
"pane.focused_border": null,
|
||||||
|
"scrollbar.thumb.background": "#002a354c",
|
||||||
|
"scrollbar.thumb.hover_background": "#dcdacbff",
|
||||||
|
"scrollbar.thumb.border": "#dcdacbff",
|
||||||
|
"scrollbar.track.background": "#00000000",
|
||||||
|
"scrollbar.track.border": "#f5eedbff",
|
||||||
|
"editor.foreground": "#002a35ff",
|
||||||
|
"editor.background": "#fdf6e3ff",
|
||||||
|
"editor.gutter.background": "#fdf6e3ff",
|
||||||
|
"editor.subheader.background": "#f3eddaff",
|
||||||
|
"editor.active_line.background": "#f3eddabf",
|
||||||
|
"editor.highlighted_line.background": "#f3eddaff",
|
||||||
|
"editor.line_number": "#002a3559",
|
||||||
|
"editor.active_line_number": "#002a35ff",
|
||||||
|
"editor.invisible": "#6c8287ff",
|
||||||
|
"editor.wrap_guide": "#002a350d",
|
||||||
|
"editor.active_wrap_guide": "#002a351a",
|
||||||
|
"editor.document_highlight.read_background": "#288bd11a",
|
||||||
|
"editor.document_highlight.write_background": "#6c828766",
|
||||||
|
"terminal.background": "#fdf6e3ff",
|
||||||
|
"terminal.foreground": "#002a35ff",
|
||||||
|
"terminal.bright_foreground": "#002a35ff",
|
||||||
|
"terminal.dim_foreground": "#fdf6e3ff",
|
||||||
|
"terminal.ansi.black": "#fdf6e3ff",
|
||||||
|
"terminal.ansi.bright_black": "#7b8e91ff",
|
||||||
|
"terminal.ansi.dim_black": "#002a35ff",
|
||||||
|
"terminal.ansi.red": "#dc3330ff",
|
||||||
|
"terminal.ansi.bright_red": "#faa091ff",
|
||||||
|
"terminal.ansi.dim_red": "#7d181cff",
|
||||||
|
"terminal.ansi.green": "#849903ff",
|
||||||
|
"terminal.ansi.bright_green": "#c6cb8bff",
|
||||||
|
"terminal.ansi.dim_green": "#434a10ff",
|
||||||
|
"terminal.ansi.yellow": "#b58903ff",
|
||||||
|
"terminal.ansi.bright_yellow": "#e0c189ff",
|
||||||
|
"terminal.ansi.dim_yellow": "#5d430fff",
|
||||||
|
"terminal.ansi.blue": "#288bd1ff",
|
||||||
|
"terminal.ansi.bright_blue": "#a5c3e9ff",
|
||||||
|
"terminal.ansi.dim_blue": "#214365ff",
|
||||||
|
"terminal.ansi.magenta": "#d33781ff",
|
||||||
|
"terminal.ansi.bright_magenta": "#f0a2beff",
|
||||||
|
"terminal.ansi.dim_magenta": "#6f1f3fff",
|
||||||
|
"terminal.ansi.cyan": "#2ba198ff",
|
||||||
|
"terminal.ansi.bright_cyan": "#9fd0cbff",
|
||||||
|
"terminal.ansi.dim_cyan": "#204e4aff",
|
||||||
|
"terminal.ansi.white": "#002a35ff",
|
||||||
|
"terminal.ansi.bright_white": "#002a35ff",
|
||||||
|
"terminal.ansi.dim_white": "#5c7279ff",
|
||||||
|
"link_text.hover": "#288bd1ff",
|
||||||
|
"conflict": "#b58903ff",
|
||||||
|
"conflict.background": "#f5e6d0ff",
|
||||||
|
"conflict.border": "#ebd3aaff",
|
||||||
|
"created": "#849903ff",
|
||||||
|
"created.background": "#e9ead0ff",
|
||||||
|
"created.border": "#d6d9abff",
|
||||||
|
"deleted": "#dc3330ff",
|
||||||
|
"deleted.background": "#ffd9d2ff",
|
||||||
|
"deleted.border": "#ffbbafff",
|
||||||
|
"error": "#dc3330ff",
|
||||||
|
"error.background": "#ffd9d2ff",
|
||||||
|
"error.border": "#ffbbafff",
|
||||||
|
"hidden": "#6a7f86ff",
|
||||||
|
"hidden.background": "#cfd0c4ff",
|
||||||
|
"hidden.border": "#b6bcb5ff",
|
||||||
|
"hint": "#5789a3ff",
|
||||||
|
"hint.background": "#dbe6f6ff",
|
||||||
|
"hint.border": "#bfd3efff",
|
||||||
|
"ignored": "#6a7f86ff",
|
||||||
|
"ignored.background": "#cfd0c4ff",
|
||||||
|
"ignored.border": "#9faaa8ff",
|
||||||
|
"info": "#288bd1ff",
|
||||||
|
"info.background": "#dbe6f6ff",
|
||||||
|
"info.border": "#bfd3efff",
|
||||||
|
"modified": "#b58903ff",
|
||||||
|
"modified.background": "#f5e6d0ff",
|
||||||
|
"modified.border": "#ebd3aaff",
|
||||||
|
"predictive": "#679aafff",
|
||||||
|
"predictive.background": "#e9ead0ff",
|
||||||
|
"predictive.border": "#d6d9abff",
|
||||||
|
"renamed": "#288bd1ff",
|
||||||
|
"renamed.background": "#dbe6f6ff",
|
||||||
|
"renamed.border": "#bfd3efff",
|
||||||
|
"success": "#849903ff",
|
||||||
|
"success.background": "#e9ead0ff",
|
||||||
|
"success.border": "#d6d9abff",
|
||||||
|
"unreachable": "#34555eff",
|
||||||
|
"unreachable.background": "#cfd0c4ff",
|
||||||
|
"unreachable.border": "#9faaa8ff",
|
||||||
|
"warning": "#b58903ff",
|
||||||
|
"warning.background": "#f5e6d0ff",
|
||||||
|
"warning.border": "#ebd3aaff",
|
||||||
|
"players": [
|
||||||
|
{
|
||||||
|
"cursor": "#288bd1ff",
|
||||||
|
"background": "#288bd1ff",
|
||||||
|
"selection": "#288bd13d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#d33781ff",
|
||||||
|
"background": "#d33781ff",
|
||||||
|
"selection": "#d337813d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#cb4b16ff",
|
||||||
|
"background": "#cb4b16ff",
|
||||||
|
"selection": "#cb4b173d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#6c71c3ff",
|
||||||
|
"background": "#6c71c3ff",
|
||||||
|
"selection": "#6c71c33d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#2ba198ff",
|
||||||
|
"background": "#2ba198ff",
|
||||||
|
"selection": "#2ba1983d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#dc3330ff",
|
||||||
|
"background": "#dc3330ff",
|
||||||
|
"selection": "#dc33303d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#b58903ff",
|
||||||
|
"background": "#b58903ff",
|
||||||
|
"selection": "#b589033d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#849903ff",
|
||||||
|
"background": "#849903ff",
|
||||||
|
"selection": "#8499033d"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"syntax": {
|
||||||
|
"attribute": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"boolean": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"color": "#30525bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment.doc": {
|
||||||
|
"color": "#30525bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constructor": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"embedded": {
|
||||||
|
"color": "#002a35ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis.strong": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"function": {
|
||||||
|
"color": "#b58903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"hint": {
|
||||||
|
"color": "#5789a3ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"keyword": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"label": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_text": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_uri": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"number": {
|
||||||
|
"color": "#849903ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"predictive": {
|
||||||
|
"color": "#679aafff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"preproc": {
|
||||||
|
"color": "#002a35ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"color": "#002a35ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"property": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation": {
|
||||||
|
"color": "#04333eff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.bracket": {
|
||||||
|
"color": "#04333eff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.delimiter": {
|
||||||
|
"color": "#04333eff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.list_marker": {
|
||||||
|
"color": "#04333eff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.special": {
|
||||||
|
"color": "#04333eff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.escape": {
|
||||||
|
"color": "#30525bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.regex": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special.symbol": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"text.literal": {
|
||||||
|
"color": "#cb4b16ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"color": "#002a35ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"color": "#2ba198ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variable": {
|
||||||
|
"color": "#002a35ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variant": {
|
||||||
|
"color": "#288bd1ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
21
assets/themes/summercamp/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019 Zoe FiriH
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
377
assets/themes/summercamp/summercamp.json
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
|
||||||
|
"name": "Summercamp",
|
||||||
|
"author": "Zed Industries",
|
||||||
|
"themes": [
|
||||||
|
{
|
||||||
|
"name": "Summercamp",
|
||||||
|
"appearance": "dark",
|
||||||
|
"style": {
|
||||||
|
"border": "#302c21ff",
|
||||||
|
"border.variant": "#29251bff",
|
||||||
|
"border.focused": "#193760ff",
|
||||||
|
"border.selected": "#193760ff",
|
||||||
|
"border.transparent": "#00000000",
|
||||||
|
"border.disabled": "#2e2a1fff",
|
||||||
|
"elevated_surface.background": "#231f16ff",
|
||||||
|
"surface.background": "#231f16ff",
|
||||||
|
"background": "#2a261cff",
|
||||||
|
"element.background": "#231f16ff",
|
||||||
|
"element.hover": "#29251bff",
|
||||||
|
"element.active": "#2f2b20ff",
|
||||||
|
"element.selected": "#2f2b20ff",
|
||||||
|
"element.disabled": "#231f16ff",
|
||||||
|
"drop_target.background": "#736e5580",
|
||||||
|
"ghost_element.background": "#00000000",
|
||||||
|
"ghost_element.hover": "#29251bff",
|
||||||
|
"ghost_element.active": "#2f2b20ff",
|
||||||
|
"ghost_element.selected": "#2f2b20ff",
|
||||||
|
"ghost_element.disabled": "#231f16ff",
|
||||||
|
"text": "#f8f5deff",
|
||||||
|
"text.muted": "#736e55ff",
|
||||||
|
"text.placeholder": "#4c4735ff",
|
||||||
|
"text.disabled": "#4c4735ff",
|
||||||
|
"text.accent": "#499befff",
|
||||||
|
"icon": "#f8f5deff",
|
||||||
|
"icon.muted": "#736e55ff",
|
||||||
|
"icon.disabled": "#4c4735ff",
|
||||||
|
"icon.placeholder": "#736e55ff",
|
||||||
|
"icon.accent": "#499befff",
|
||||||
|
"status_bar.background": "#2a261cff",
|
||||||
|
"title_bar.background": "#2a261cff",
|
||||||
|
"title_bar.inactive_background": "#231f16ff",
|
||||||
|
"toolbar.background": "#1b1810ff",
|
||||||
|
"tab_bar.background": "#231f16ff",
|
||||||
|
"tab.inactive_background": "#231f16ff",
|
||||||
|
"tab.active_background": "#1b1810ff",
|
||||||
|
"search.match_background": "#499bef66",
|
||||||
|
"panel.background": "#231f16ff",
|
||||||
|
"panel.focused_border": "#499befff",
|
||||||
|
"pane.focused_border": null,
|
||||||
|
"scrollbar.thumb.background": "#f8f5de4c",
|
||||||
|
"scrollbar.thumb.hover_background": "#29251bff",
|
||||||
|
"scrollbar.thumb.border": "#29251bff",
|
||||||
|
"scrollbar.track.background": "#00000000",
|
||||||
|
"scrollbar.track.border": "#221e15ff",
|
||||||
|
"editor.foreground": "#f8f5deff",
|
||||||
|
"editor.background": "#1b1810ff",
|
||||||
|
"editor.gutter.background": "#1b1810ff",
|
||||||
|
"editor.subheader.background": "#231f16ff",
|
||||||
|
"editor.active_line.background": "#231f16bf",
|
||||||
|
"editor.highlighted_line.background": "#231f16ff",
|
||||||
|
"editor.line_number": "#f8f5de59",
|
||||||
|
"editor.active_line_number": "#f8f5deff",
|
||||||
|
"editor.invisible": "#494433ff",
|
||||||
|
"editor.wrap_guide": "#f8f5de0d",
|
||||||
|
"editor.active_wrap_guide": "#f8f5de1a",
|
||||||
|
"editor.document_highlight.read_background": "#499bef1a",
|
||||||
|
"editor.document_highlight.write_background": "#49443366",
|
||||||
|
"terminal.background": "#1b1810ff",
|
||||||
|
"terminal.foreground": "#f8f5deff",
|
||||||
|
"terminal.bright_foreground": "#f8f5deff",
|
||||||
|
"terminal.dim_foreground": "#1b1810ff",
|
||||||
|
"terminal.ansi.black": "#1b1810ff",
|
||||||
|
"terminal.ansi.bright_black": "#3a3527ff",
|
||||||
|
"terminal.ansi.dim_black": "#f8f5deff",
|
||||||
|
"terminal.ansi.red": "#e35041ff",
|
||||||
|
"terminal.ansi.bright_red": "#7f2724ff",
|
||||||
|
"terminal.ansi.dim_red": "#faaa9bff",
|
||||||
|
"terminal.ansi.green": "#5dea5aff",
|
||||||
|
"terminal.ansi.bright_green": "#28842cff",
|
||||||
|
"terminal.ansi.dim_green": "#b9f7aeff",
|
||||||
|
"terminal.ansi.yellow": "#f1fe28ff",
|
||||||
|
"terminal.ansi.bright_yellow": "#8c9a0fff",
|
||||||
|
"terminal.ansi.dim_yellow": "#ffffa2ff",
|
||||||
|
"terminal.ansi.blue": "#499befff",
|
||||||
|
"terminal.ansi.bright_blue": "#234b7fff",
|
||||||
|
"terminal.ansi.dim_blue": "#b1ccf8ff",
|
||||||
|
"terminal.ansi.magenta": "#f59be6ff",
|
||||||
|
"terminal.ansi.bright_magenta": "#88487eff",
|
||||||
|
"terminal.ansi.dim_magenta": "#fccef3ff",
|
||||||
|
"terminal.ansi.cyan": "#5aeabbff",
|
||||||
|
"terminal.ansi.bright_cyan": "#288461ff",
|
||||||
|
"terminal.ansi.dim_cyan": "#b7f6ddff",
|
||||||
|
"terminal.ansi.white": "#f8f5deff",
|
||||||
|
"terminal.ansi.bright_white": "#f8f5deff",
|
||||||
|
"terminal.ansi.dim_white": "#57533fff",
|
||||||
|
"link_text.hover": "#499befff",
|
||||||
|
"conflict": "#f1fe28ff",
|
||||||
|
"conflict.background": "#546205ff",
|
||||||
|
"conflict.border": "#717f0aff",
|
||||||
|
"created": "#5dea5aff",
|
||||||
|
"created.background": "#094d12ff",
|
||||||
|
"created.border": "#1a6a20ff",
|
||||||
|
"deleted": "#e35041ff",
|
||||||
|
"deleted.background": "#490f12ff",
|
||||||
|
"deleted.border": "#651c1cff",
|
||||||
|
"error": "#e35041ff",
|
||||||
|
"error.background": "#490f12ff",
|
||||||
|
"error.border": "#651c1cff",
|
||||||
|
"hidden": "#4c4735ff",
|
||||||
|
"hidden.background": "#2a261cff",
|
||||||
|
"hidden.border": "#2e2a1fff",
|
||||||
|
"hint": "#246e61ff",
|
||||||
|
"hint.background": "#0e2242ff",
|
||||||
|
"hint.border": "#193760ff",
|
||||||
|
"ignored": "#4c4735ff",
|
||||||
|
"ignored.background": "#2a261cff",
|
||||||
|
"ignored.border": "#302c21ff",
|
||||||
|
"info": "#499befff",
|
||||||
|
"info.background": "#0e2242ff",
|
||||||
|
"info.border": "#193760ff",
|
||||||
|
"modified": "#f1fe28ff",
|
||||||
|
"modified.background": "#546205ff",
|
||||||
|
"modified.border": "#717f0aff",
|
||||||
|
"predictive": "#78434aff",
|
||||||
|
"predictive.background": "#094d12ff",
|
||||||
|
"predictive.border": "#1a6a20ff",
|
||||||
|
"renamed": "#499befff",
|
||||||
|
"renamed.background": "#0e2242ff",
|
||||||
|
"renamed.border": "#193760ff",
|
||||||
|
"success": "#5dea5aff",
|
||||||
|
"success.background": "#094d12ff",
|
||||||
|
"success.border": "#1a6a20ff",
|
||||||
|
"unreachable": "#736e55ff",
|
||||||
|
"unreachable.background": "#2a261cff",
|
||||||
|
"unreachable.border": "#302c21ff",
|
||||||
|
"warning": "#f1fe28ff",
|
||||||
|
"warning.background": "#546205ff",
|
||||||
|
"warning.border": "#717f0aff",
|
||||||
|
"players": [
|
||||||
|
{
|
||||||
|
"cursor": "#499befff",
|
||||||
|
"background": "#499befff",
|
||||||
|
"selection": "#499bef3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#f59be6ff",
|
||||||
|
"background": "#f59be6ff",
|
||||||
|
"selection": "#f59be63d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#faa11cff",
|
||||||
|
"background": "#faa11cff",
|
||||||
|
"selection": "#faa11c3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#fe8080ff",
|
||||||
|
"background": "#fe8080ff",
|
||||||
|
"selection": "#fe80803d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#5aeabbff",
|
||||||
|
"background": "#5aeabbff",
|
||||||
|
"selection": "#5aeabb3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#e35041ff",
|
||||||
|
"background": "#e35041ff",
|
||||||
|
"selection": "#e350413d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#f1fe28ff",
|
||||||
|
"background": "#f1fe28ff",
|
||||||
|
"selection": "#f1fe283d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "#5dea5aff",
|
||||||
|
"background": "#5dea5aff",
|
||||||
|
"selection": "#5dea5a3d"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"syntax": {
|
||||||
|
"attribute": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"boolean": {
|
||||||
|
"color": "#5dea5aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"color": "#777159ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"comment.doc": {
|
||||||
|
"color": "#777159ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"color": "#5dea5aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"constructor": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"embedded": {
|
||||||
|
"color": "#f8f5deff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"emphasis.strong": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"function": {
|
||||||
|
"color": "#f1fe28ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"hint": {
|
||||||
|
"color": "#246e61ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"keyword": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"label": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_text": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"link_uri": {
|
||||||
|
"color": "#5dea5aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"number": {
|
||||||
|
"color": "#5dea5aff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"operator": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"predictive": {
|
||||||
|
"color": "#78434aff",
|
||||||
|
"font_style": "italic",
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"preproc": {
|
||||||
|
"color": "#f8f5deff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"color": "#f8f5deff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"property": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation": {
|
||||||
|
"color": "#bfbb9bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.bracket": {
|
||||||
|
"color": "#bfbb9bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.delimiter": {
|
||||||
|
"color": "#bfbb9bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.list_marker": {
|
||||||
|
"color": "#bfbb9bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"punctuation.special": {
|
||||||
|
"color": "#bfbb9bff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.escape": {
|
||||||
|
"color": "#777159ff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.regex": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"string.special.symbol": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"text.literal": {
|
||||||
|
"color": "#faa11cff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"color": "#f8f5deff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": 700
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"color": "#5aeabbff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variable": {
|
||||||
|
"color": "#f8f5deff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
},
|
||||||
|
"variant": {
|
||||||
|
"color": "#499befff",
|
||||||
|
"font_style": null,
|
||||||
|
"font_weight": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "activity_indicator"
|
name = "activity_indicator"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition.workspace = true
|
edition = "2021"
|
||||||
publish.workspace = true
|
publish = false
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ use editor::Editor;
|
|||||||
use extension_host::ExtensionStore;
|
use extension_host::ExtensionStore;
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use gpui::{
|
use gpui::{
|
||||||
actions, percentage, Animation, AnimationExt as _, App, Context, CursorStyle, Entity,
|
actions, percentage, Animation, AnimationExt as _, AppContext, CursorStyle, EventEmitter,
|
||||||
EventEmitter, InteractiveElement as _, ParentElement as _, Render, SharedString,
|
InteractiveElement as _, Model, ParentElement as _, Render, SharedString,
|
||||||
StatefulInteractiveElement, Styled, Transformation, Window,
|
StatefulInteractiveElement, Styled, Transformation, View, ViewContext, VisualContext as _,
|
||||||
};
|
};
|
||||||
use language::{LanguageRegistry, LanguageServerBinaryStatus, LanguageServerId};
|
use language::{LanguageRegistry, LanguageServerBinaryStatus, LanguageServerId};
|
||||||
use lsp::LanguageServerName;
|
use lsp::LanguageServerName;
|
||||||
@@ -27,8 +27,8 @@ pub enum Event {
|
|||||||
|
|
||||||
pub struct ActivityIndicator {
|
pub struct ActivityIndicator {
|
||||||
statuses: Vec<LspStatus>,
|
statuses: Vec<LspStatus>,
|
||||||
project: Entity<Project>,
|
project: Model<Project>,
|
||||||
auto_updater: Option<Entity<AutoUpdater>>,
|
auto_updater: Option<Model<AutoUpdater>>,
|
||||||
context_menu_handle: PopoverMenuHandle<ContextMenu>,
|
context_menu_handle: PopoverMenuHandle<ContextMenu>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,24 +46,22 @@ struct PendingWork<'a> {
|
|||||||
struct Content {
|
struct Content {
|
||||||
icon: Option<gpui::AnyElement>,
|
icon: Option<gpui::AnyElement>,
|
||||||
message: String,
|
message: String,
|
||||||
on_click:
|
on_click: Option<Arc<dyn Fn(&mut ActivityIndicator, &mut ViewContext<ActivityIndicator>)>>,
|
||||||
Option<Arc<dyn Fn(&mut ActivityIndicator, &mut Window, &mut Context<ActivityIndicator>)>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ActivityIndicator {
|
impl ActivityIndicator {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
workspace: &mut Workspace,
|
workspace: &mut Workspace,
|
||||||
languages: Arc<LanguageRegistry>,
|
languages: Arc<LanguageRegistry>,
|
||||||
window: &mut Window,
|
cx: &mut ViewContext<Workspace>,
|
||||||
cx: &mut Context<Workspace>,
|
) -> View<ActivityIndicator> {
|
||||||
) -> Entity<ActivityIndicator> {
|
|
||||||
let project = workspace.project().clone();
|
let project = workspace.project().clone();
|
||||||
let auto_updater = AutoUpdater::get(cx);
|
let auto_updater = AutoUpdater::get(cx);
|
||||||
let this = cx.new(|cx| {
|
let this = cx.new_view(|cx: &mut ViewContext<Self>| {
|
||||||
let mut status_events = languages.language_server_binary_statuses();
|
let mut status_events = languages.language_server_binary_statuses();
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
while let Some((name, status)) = status_events.next().await {
|
while let Some((name, status)) = status_events.next().await {
|
||||||
this.update(&mut cx, |this: &mut ActivityIndicator, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
this.statuses.retain(|s| s.name != name);
|
this.statuses.retain(|s| s.name != name);
|
||||||
this.statuses.push(LspStatus { name, status });
|
this.statuses.push(LspStatus { name, status });
|
||||||
cx.notify();
|
cx.notify();
|
||||||
@@ -72,7 +70,6 @@ impl ActivityIndicator {
|
|||||||
anyhow::Ok(())
|
anyhow::Ok(())
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
cx.observe(&project, |_, _, cx| cx.notify()).detach();
|
cx.observe(&project, |_, _, cx| cx.notify()).detach();
|
||||||
|
|
||||||
if let Some(auto_updater) = auto_updater.as_ref() {
|
if let Some(auto_updater) = auto_updater.as_ref() {
|
||||||
@@ -87,13 +84,13 @@ impl ActivityIndicator {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cx.subscribe_in(&this, window, move |_, _, event, window, cx| match event {
|
cx.subscribe(&this, move |_, _, event, cx| match event {
|
||||||
Event::ShowError { lsp_name, error } => {
|
Event::ShowError { lsp_name, error } => {
|
||||||
let create_buffer = project.update(cx, |project, cx| project.create_buffer(cx));
|
let create_buffer = project.update(cx, |project, cx| project.create_buffer(cx));
|
||||||
let project = project.clone();
|
let project = project.clone();
|
||||||
let error = error.clone();
|
let error = error.clone();
|
||||||
let lsp_name = lsp_name.clone();
|
let lsp_name = lsp_name.clone();
|
||||||
cx.spawn_in(window, |workspace, mut cx| async move {
|
cx.spawn(|workspace, mut cx| async move {
|
||||||
let buffer = create_buffer.await?;
|
let buffer = create_buffer.await?;
|
||||||
buffer.update(&mut cx, |buffer, cx| {
|
buffer.update(&mut cx, |buffer, cx| {
|
||||||
buffer.edit(
|
buffer.edit(
|
||||||
@@ -106,14 +103,13 @@ impl ActivityIndicator {
|
|||||||
);
|
);
|
||||||
buffer.set_capability(language::Capability::ReadOnly, cx);
|
buffer.set_capability(language::Capability::ReadOnly, cx);
|
||||||
})?;
|
})?;
|
||||||
workspace.update_in(&mut cx, |workspace, window, cx| {
|
workspace.update(&mut cx, |workspace, cx| {
|
||||||
workspace.add_item_to_active_pane(
|
workspace.add_item_to_active_pane(
|
||||||
Box::new(cx.new(|cx| {
|
Box::new(cx.new_view(|cx| {
|
||||||
Editor::for_buffer(buffer, Some(project.clone()), window, cx)
|
Editor::for_buffer(buffer, Some(project.clone()), cx)
|
||||||
})),
|
})),
|
||||||
None,
|
None,
|
||||||
true,
|
true,
|
||||||
window,
|
|
||||||
cx,
|
cx,
|
||||||
);
|
);
|
||||||
})?;
|
})?;
|
||||||
@@ -127,7 +123,7 @@ impl ActivityIndicator {
|
|||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
||||||
fn show_error_message(&mut self, _: &ShowErrorMessage, _: &mut Window, cx: &mut Context<Self>) {
|
fn show_error_message(&mut self, _: &ShowErrorMessage, cx: &mut ViewContext<Self>) {
|
||||||
self.statuses.retain(|status| {
|
self.statuses.retain(|status| {
|
||||||
if let LanguageServerBinaryStatus::Failed { error } = &status.status {
|
if let LanguageServerBinaryStatus::Failed { error } = &status.status {
|
||||||
cx.emit(Event::ShowError {
|
cx.emit(Event::ShowError {
|
||||||
@@ -143,12 +139,7 @@ impl ActivityIndicator {
|
|||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dismiss_error_message(
|
fn dismiss_error_message(&mut self, _: &DismissErrorMessage, cx: &mut ViewContext<Self>) {
|
||||||
&mut self,
|
|
||||||
_: &DismissErrorMessage,
|
|
||||||
_: &mut Window,
|
|
||||||
cx: &mut Context<Self>,
|
|
||||||
) {
|
|
||||||
if let Some(updater) = &self.auto_updater {
|
if let Some(updater) = &self.auto_updater {
|
||||||
updater.update(cx, |updater, cx| {
|
updater.update(cx, |updater, cx| {
|
||||||
updater.dismiss_error(cx);
|
updater.dismiss_error(cx);
|
||||||
@@ -159,7 +150,7 @@ impl ActivityIndicator {
|
|||||||
|
|
||||||
fn pending_language_server_work<'a>(
|
fn pending_language_server_work<'a>(
|
||||||
&self,
|
&self,
|
||||||
cx: &'a App,
|
cx: &'a AppContext,
|
||||||
) -> impl Iterator<Item = PendingWork<'a>> {
|
) -> impl Iterator<Item = PendingWork<'a>> {
|
||||||
self.project
|
self.project
|
||||||
.read(cx)
|
.read(cx)
|
||||||
@@ -187,12 +178,12 @@ impl ActivityIndicator {
|
|||||||
|
|
||||||
fn pending_environment_errors<'a>(
|
fn pending_environment_errors<'a>(
|
||||||
&'a self,
|
&'a self,
|
||||||
cx: &'a App,
|
cx: &'a AppContext,
|
||||||
) -> impl Iterator<Item = (&'a WorktreeId, &'a EnvironmentErrorMessage)> {
|
) -> impl Iterator<Item = (&'a WorktreeId, &'a EnvironmentErrorMessage)> {
|
||||||
self.project.read(cx).shell_environment_errors(cx)
|
self.project.read(cx).shell_environment_errors(cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn content_to_render(&mut self, cx: &mut Context<Self>) -> Option<Content> {
|
fn content_to_render(&mut self, cx: &mut ViewContext<Self>) -> Option<Content> {
|
||||||
// Show if any direnv calls failed
|
// Show if any direnv calls failed
|
||||||
if let Some((&worktree_id, error)) = self.pending_environment_errors(cx).next() {
|
if let Some((&worktree_id, error)) = self.pending_environment_errors(cx).next() {
|
||||||
return Some(Content {
|
return Some(Content {
|
||||||
@@ -202,11 +193,11 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: error.0.clone(),
|
message: error.0.clone(),
|
||||||
on_click: Some(Arc::new(move |this, window, cx| {
|
on_click: Some(Arc::new(move |this, cx| {
|
||||||
this.project.update(cx, |project, cx| {
|
this.project.update(cx, |project, cx| {
|
||||||
project.remove_environment_error(cx, worktree_id);
|
project.remove_environment_error(cx, worktree_id);
|
||||||
});
|
});
|
||||||
window.dispatch_action(Box::new(workspace::OpenLog), cx);
|
cx.dispatch_action(Box::new(workspace::OpenLog));
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -289,10 +280,10 @@ impl ActivityIndicator {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
on_click: Some(Arc::new(move |this, window, cx| {
|
on_click: Some(Arc::new(move |this, cx| {
|
||||||
this.statuses
|
this.statuses
|
||||||
.retain(|status| !downloading.contains(&status.name));
|
.retain(|status| !downloading.contains(&status.name));
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -317,10 +308,10 @@ impl ActivityIndicator {
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
on_click: Some(Arc::new(move |this, window, cx| {
|
on_click: Some(Arc::new(move |this, cx| {
|
||||||
this.statuses
|
this.statuses
|
||||||
.retain(|status| !checking_for_update.contains(&status.name));
|
.retain(|status| !checking_for_update.contains(&status.name));
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -345,8 +336,8 @@ impl ActivityIndicator {
|
|||||||
acc
|
acc
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
on_click: Some(Arc::new(|this, window, cx| {
|
on_click: Some(Arc::new(|this, cx| {
|
||||||
this.show_error_message(&Default::default(), window, cx)
|
this.show_error_message(&Default::default(), cx)
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -360,11 +351,11 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: format!("Formatting failed: {}. Click to see logs.", failure),
|
message: format!("Formatting failed: {}. Click to see logs.", failure),
|
||||||
on_click: Some(Arc::new(|indicator, window, cx| {
|
on_click: Some(Arc::new(|indicator, cx| {
|
||||||
indicator.project.update(cx, |project, cx| {
|
indicator.project.update(cx, |project, cx| {
|
||||||
project.reset_last_formatting_failure(cx);
|
project.reset_last_formatting_failure(cx);
|
||||||
});
|
});
|
||||||
window.dispatch_action(Box::new(workspace::OpenLog), cx);
|
cx.dispatch_action(Box::new(workspace::OpenLog));
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -379,8 +370,8 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: "Checking for Zed updates…".to_string(),
|
message: "Checking for Zed updates…".to_string(),
|
||||||
on_click: Some(Arc::new(|this, window, cx| {
|
on_click: Some(Arc::new(|this, cx| {
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
}),
|
}),
|
||||||
AutoUpdateStatus::Downloading => Some(Content {
|
AutoUpdateStatus::Downloading => Some(Content {
|
||||||
@@ -390,8 +381,8 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: "Downloading Zed update…".to_string(),
|
message: "Downloading Zed update…".to_string(),
|
||||||
on_click: Some(Arc::new(|this, window, cx| {
|
on_click: Some(Arc::new(|this, cx| {
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
}),
|
}),
|
||||||
AutoUpdateStatus::Installing => Some(Content {
|
AutoUpdateStatus::Installing => Some(Content {
|
||||||
@@ -401,8 +392,8 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: "Installing Zed update…".to_string(),
|
message: "Installing Zed update…".to_string(),
|
||||||
on_click: Some(Arc::new(|this, window, cx| {
|
on_click: Some(Arc::new(|this, cx| {
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
}),
|
}),
|
||||||
AutoUpdateStatus::Updated { binary_path } => Some(Content {
|
AutoUpdateStatus::Updated { binary_path } => Some(Content {
|
||||||
@@ -412,7 +403,7 @@ impl ActivityIndicator {
|
|||||||
let reload = workspace::Reload {
|
let reload = workspace::Reload {
|
||||||
binary_path: Some(binary_path.clone()),
|
binary_path: Some(binary_path.clone()),
|
||||||
};
|
};
|
||||||
move |_, _, cx| workspace::reload(&reload, cx)
|
move |_, cx| workspace::reload(&reload, cx)
|
||||||
})),
|
})),
|
||||||
}),
|
}),
|
||||||
AutoUpdateStatus::Errored => Some(Content {
|
AutoUpdateStatus::Errored => Some(Content {
|
||||||
@@ -422,8 +413,8 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: "Auto update failed".to_string(),
|
message: "Auto update failed".to_string(),
|
||||||
on_click: Some(Arc::new(|this, window, cx| {
|
on_click: Some(Arc::new(|this, cx| {
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
}),
|
}),
|
||||||
AutoUpdateStatus::Idle => None,
|
AutoUpdateStatus::Idle => None,
|
||||||
@@ -441,8 +432,8 @@ impl ActivityIndicator {
|
|||||||
.into_any_element(),
|
.into_any_element(),
|
||||||
),
|
),
|
||||||
message: format!("Updating {extension_id} extension…"),
|
message: format!("Updating {extension_id} extension…"),
|
||||||
on_click: Some(Arc::new(|this, window, cx| {
|
on_click: Some(Arc::new(|this, cx| {
|
||||||
this.dismiss_error_message(&DismissErrorMessage, window, cx)
|
this.dismiss_error_message(&DismissErrorMessage, cx)
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -451,12 +442,8 @@ impl ActivityIndicator {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn toggle_language_server_work_context_menu(
|
fn toggle_language_server_work_context_menu(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
&mut self,
|
self.context_menu_handle.toggle(cx);
|
||||||
window: &mut Window,
|
|
||||||
cx: &mut Context<Self>,
|
|
||||||
) {
|
|
||||||
self.context_menu_handle.toggle(window, cx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -465,7 +452,7 @@ impl EventEmitter<Event> for ActivityIndicator {}
|
|||||||
const MAX_MESSAGE_LEN: usize = 50;
|
const MAX_MESSAGE_LEN: usize = 50;
|
||||||
|
|
||||||
impl Render for ActivityIndicator {
|
impl Render for ActivityIndicator {
|
||||||
fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
|
fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
|
||||||
let result = h_flex()
|
let result = h_flex()
|
||||||
.id("activity-indicator")
|
.id("activity-indicator")
|
||||||
.on_action(cx.listener(Self::show_error_message))
|
.on_action(cx.listener(Self::show_error_message))
|
||||||
@@ -473,7 +460,7 @@ impl Render for ActivityIndicator {
|
|||||||
let Some(content) = self.content_to_render(cx) else {
|
let Some(content) = self.content_to_render(cx) else {
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
let this = cx.entity().downgrade();
|
let this = cx.view().downgrade();
|
||||||
let truncate_content = content.message.len() > MAX_MESSAGE_LEN;
|
let truncate_content = content.message.len() > MAX_MESSAGE_LEN;
|
||||||
result.gap_2().child(
|
result.gap_2().child(
|
||||||
PopoverMenu::new("activity-indicator-popover")
|
PopoverMenu::new("activity-indicator-popover")
|
||||||
@@ -493,24 +480,24 @@ impl Render for ActivityIndicator {
|
|||||||
))
|
))
|
||||||
.size(LabelSize::Small),
|
.size(LabelSize::Small),
|
||||||
)
|
)
|
||||||
.tooltip(Tooltip::text(content.message))
|
.tooltip(move |cx| Tooltip::text(&content.message, cx))
|
||||||
} else {
|
} else {
|
||||||
button.child(Label::new(content.message).size(LabelSize::Small))
|
button.child(Label::new(content.message).size(LabelSize::Small))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.when_some(content.on_click, |this, handler| {
|
.when_some(content.on_click, |this, handler| {
|
||||||
this.on_click(cx.listener(move |this, _, window, cx| {
|
this.on_click(cx.listener(move |this, _, cx| {
|
||||||
handler(this, window, cx);
|
handler(this, cx);
|
||||||
}))
|
}))
|
||||||
.cursor(CursorStyle::PointingHand)
|
.cursor(CursorStyle::PointingHand)
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.anchor(gpui::Corner::BottomLeft)
|
.anchor(gpui::Corner::BottomLeft)
|
||||||
.menu(move |window, cx| {
|
.menu(move |cx| {
|
||||||
let strong_this = this.upgrade()?;
|
let strong_this = this.upgrade()?;
|
||||||
let mut has_work = false;
|
let mut has_work = false;
|
||||||
let menu = ContextMenu::build(window, cx, |mut menu, _, cx| {
|
let menu = ContextMenu::build(cx, |mut menu, cx| {
|
||||||
for work in strong_this.read(cx).pending_language_server_work(cx) {
|
for work in strong_this.read(cx).pending_language_server_work(cx) {
|
||||||
has_work = true;
|
has_work = true;
|
||||||
let this = this.clone();
|
let this = this.clone();
|
||||||
@@ -526,7 +513,7 @@ impl Render for ActivityIndicator {
|
|||||||
let token = work.progress_token.to_string();
|
let token = work.progress_token.to_string();
|
||||||
let title = SharedString::from(title);
|
let title = SharedString::from(title);
|
||||||
menu = menu.custom_entry(
|
menu = menu.custom_entry(
|
||||||
move |_, _| {
|
move |_| {
|
||||||
h_flex()
|
h_flex()
|
||||||
.w_full()
|
.w_full()
|
||||||
.justify_between()
|
.justify_between()
|
||||||
@@ -534,7 +521,7 @@ impl Render for ActivityIndicator {
|
|||||||
.child(Icon::new(IconName::XCircle))
|
.child(Icon::new(IconName::XCircle))
|
||||||
.into_any_element()
|
.into_any_element()
|
||||||
},
|
},
|
||||||
move |_, cx| {
|
move |cx| {
|
||||||
this.update(cx, |this, cx| {
|
this.update(cx, |this, cx| {
|
||||||
this.project.update(cx, |project, cx| {
|
this.project.update(cx, |project, cx| {
|
||||||
project.cancel_language_server_work(
|
project.cancel_language_server_work(
|
||||||
@@ -567,11 +554,5 @@ impl Render for ActivityIndicator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl StatusItemView for ActivityIndicator {
|
impl StatusItemView for ActivityIndicator {
|
||||||
fn set_active_pane_item(
|
fn set_active_pane_item(&mut self, _: Option<&dyn ItemHandle>, _: &mut ViewContext<Self>) {}
|
||||||
&mut self,
|
|
||||||
_: Option<&dyn ItemHandle>,
|
|
||||||
_window: &mut Window,
|
|
||||||
_: &mut Context<Self>,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "anthropic"
|
name = "anthropic"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition.workspace = true
|
edition = "2021"
|
||||||
publish.workspace = true
|
publish = false
|
||||||
license = "GPL-3.0-or-later"
|
license = "AGPL-3.0-or-later"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
|
|||||||
1
crates/anthropic/LICENSE-AGPL
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../LICENSE-AGPL
|
||||||
@@ -2,7 +2,7 @@ mod supported_countries;
|
|||||||
|
|
||||||
use std::{pin::Pin, str::FromStr};
|
use std::{pin::Pin, str::FromStr};
|
||||||
|
|
||||||
use anyhow::{anyhow, Context as _, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
use futures::{io::BufReader, stream::BoxStream, AsyncBufReadExt, AsyncReadExt, Stream, StreamExt};
|
use futures::{io::BufReader, stream::BoxStream, AsyncBufReadExt, AsyncReadExt, Stream, StreamExt};
|
||||||
use http_client::http::{HeaderMap, HeaderValue};
|
use http_client::http::{HeaderMap, HeaderValue};
|
||||||
@@ -30,10 +30,6 @@ pub enum Model {
|
|||||||
#[default]
|
#[default]
|
||||||
#[serde(rename = "claude-3-5-sonnet", alias = "claude-3-5-sonnet-latest")]
|
#[serde(rename = "claude-3-5-sonnet", alias = "claude-3-5-sonnet-latest")]
|
||||||
Claude3_5Sonnet,
|
Claude3_5Sonnet,
|
||||||
#[serde(rename = "claude-3-7-sonnet", alias = "claude-3-7-sonnet-latest")]
|
|
||||||
Claude3_7Sonnet,
|
|
||||||
#[serde(rename = "claude-3-5-haiku", alias = "claude-3-5-haiku-latest")]
|
|
||||||
Claude3_5Haiku,
|
|
||||||
#[serde(rename = "claude-3-opus", alias = "claude-3-opus-latest")]
|
#[serde(rename = "claude-3-opus", alias = "claude-3-opus-latest")]
|
||||||
Claude3Opus,
|
Claude3Opus,
|
||||||
#[serde(rename = "claude-3-sonnet", alias = "claude-3-sonnet-latest")]
|
#[serde(rename = "claude-3-sonnet", alias = "claude-3-sonnet-latest")]
|
||||||
@@ -52,8 +48,6 @@ pub enum Model {
|
|||||||
cache_configuration: Option<AnthropicModelCacheConfiguration>,
|
cache_configuration: Option<AnthropicModelCacheConfiguration>,
|
||||||
max_output_tokens: Option<u32>,
|
max_output_tokens: Option<u32>,
|
||||||
default_temperature: Option<f32>,
|
default_temperature: Option<f32>,
|
||||||
#[serde(default)]
|
|
||||||
extra_beta_headers: Vec<String>,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,10 +55,6 @@ impl Model {
|
|||||||
pub fn from_id(id: &str) -> Result<Self> {
|
pub fn from_id(id: &str) -> Result<Self> {
|
||||||
if id.starts_with("claude-3-5-sonnet") {
|
if id.starts_with("claude-3-5-sonnet") {
|
||||||
Ok(Self::Claude3_5Sonnet)
|
Ok(Self::Claude3_5Sonnet)
|
||||||
} else if id.starts_with("claude-3-7-sonnet") {
|
|
||||||
Ok(Self::Claude3_7Sonnet)
|
|
||||||
} else if id.starts_with("claude-3-5-haiku") {
|
|
||||||
Ok(Self::Claude3_5Haiku)
|
|
||||||
} else if id.starts_with("claude-3-opus") {
|
} else if id.starts_with("claude-3-opus") {
|
||||||
Ok(Self::Claude3Opus)
|
Ok(Self::Claude3Opus)
|
||||||
} else if id.starts_with("claude-3-sonnet") {
|
} else if id.starts_with("claude-3-sonnet") {
|
||||||
@@ -79,20 +69,16 @@ impl Model {
|
|||||||
pub fn id(&self) -> &str {
|
pub fn id(&self) -> &str {
|
||||||
match self {
|
match self {
|
||||||
Model::Claude3_5Sonnet => "claude-3-5-sonnet-latest",
|
Model::Claude3_5Sonnet => "claude-3-5-sonnet-latest",
|
||||||
Model::Claude3_7Sonnet => "claude-3-7-sonnet-latest",
|
|
||||||
Model::Claude3_5Haiku => "claude-3-5-haiku-latest",
|
|
||||||
Model::Claude3Opus => "claude-3-opus-latest",
|
Model::Claude3Opus => "claude-3-opus-latest",
|
||||||
Model::Claude3Sonnet => "claude-3-sonnet-20240229",
|
Model::Claude3Sonnet => "claude-3-sonnet-latest",
|
||||||
Model::Claude3Haiku => "claude-3-haiku-20240307",
|
Model::Claude3Haiku => "claude-3-haiku-latest",
|
||||||
Self::Custom { name, .. } => name,
|
Self::Custom { name, .. } => name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn display_name(&self) -> &str {
|
pub fn display_name(&self) -> &str {
|
||||||
match self {
|
match self {
|
||||||
Self::Claude3_7Sonnet => "Claude 3.7 Sonnet",
|
|
||||||
Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
|
Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
|
||||||
Self::Claude3_5Haiku => "Claude 3.5 Haiku",
|
|
||||||
Self::Claude3Opus => "Claude 3 Opus",
|
Self::Claude3Opus => "Claude 3 Opus",
|
||||||
Self::Claude3Sonnet => "Claude 3 Sonnet",
|
Self::Claude3Sonnet => "Claude 3 Sonnet",
|
||||||
Self::Claude3Haiku => "Claude 3 Haiku",
|
Self::Claude3Haiku => "Claude 3 Haiku",
|
||||||
@@ -104,10 +90,7 @@ impl Model {
|
|||||||
|
|
||||||
pub fn cache_configuration(&self) -> Option<AnthropicModelCacheConfiguration> {
|
pub fn cache_configuration(&self) -> Option<AnthropicModelCacheConfiguration> {
|
||||||
match self {
|
match self {
|
||||||
Self::Claude3_5Sonnet
|
Self::Claude3_5Sonnet | Self::Claude3Haiku => Some(AnthropicModelCacheConfiguration {
|
||||||
| Self::Claude3_5Haiku
|
|
||||||
| Self::Claude3_7Sonnet
|
|
||||||
| Self::Claude3Haiku => Some(AnthropicModelCacheConfiguration {
|
|
||||||
min_total_token: 2_048,
|
min_total_token: 2_048,
|
||||||
should_speculate: true,
|
should_speculate: true,
|
||||||
max_cache_anchors: 4,
|
max_cache_anchors: 4,
|
||||||
@@ -123,8 +106,6 @@ impl Model {
|
|||||||
pub fn max_token_count(&self) -> usize {
|
pub fn max_token_count(&self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
Self::Claude3_5Sonnet
|
Self::Claude3_5Sonnet
|
||||||
| Self::Claude3_5Haiku
|
|
||||||
| Self::Claude3_7Sonnet
|
|
||||||
| Self::Claude3Opus
|
| Self::Claude3Opus
|
||||||
| Self::Claude3Sonnet
|
| Self::Claude3Sonnet
|
||||||
| Self::Claude3Haiku => 200_000,
|
| Self::Claude3Haiku => 200_000,
|
||||||
@@ -135,7 +116,7 @@ impl Model {
|
|||||||
pub fn max_output_tokens(&self) -> u32 {
|
pub fn max_output_tokens(&self) -> u32 {
|
||||||
match self {
|
match self {
|
||||||
Self::Claude3Opus | Self::Claude3Sonnet | Self::Claude3Haiku => 4_096,
|
Self::Claude3Opus | Self::Claude3Sonnet | Self::Claude3Haiku => 4_096,
|
||||||
Self::Claude3_5Sonnet | Self::Claude3_7Sonnet | Self::Claude3_5Haiku => 8_192,
|
Self::Claude3_5Sonnet => 8_192,
|
||||||
Self::Custom {
|
Self::Custom {
|
||||||
max_output_tokens, ..
|
max_output_tokens, ..
|
||||||
} => max_output_tokens.unwrap_or(4_096),
|
} => max_output_tokens.unwrap_or(4_096),
|
||||||
@@ -145,8 +126,6 @@ impl Model {
|
|||||||
pub fn default_temperature(&self) -> f32 {
|
pub fn default_temperature(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Self::Claude3_5Sonnet
|
Self::Claude3_5Sonnet
|
||||||
| Self::Claude3_7Sonnet
|
|
||||||
| Self::Claude3_5Haiku
|
|
||||||
| Self::Claude3Opus
|
| Self::Claude3Opus
|
||||||
| Self::Claude3Sonnet
|
| Self::Claude3Sonnet
|
||||||
| Self::Claude3Haiku => 1.0,
|
| Self::Claude3Haiku => 1.0,
|
||||||
@@ -157,29 +136,6 @@ impl Model {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const DEFAULT_BETA_HEADERS: &[&str] = &["prompt-caching-2024-07-31"];
|
|
||||||
|
|
||||||
pub fn beta_headers(&self) -> String {
|
|
||||||
let mut headers = Self::DEFAULT_BETA_HEADERS
|
|
||||||
.into_iter()
|
|
||||||
.map(|header| header.to_string())
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
if let Self::Custom {
|
|
||||||
extra_beta_headers, ..
|
|
||||||
} = self
|
|
||||||
{
|
|
||||||
headers.extend(
|
|
||||||
extra_beta_headers
|
|
||||||
.iter()
|
|
||||||
.filter(|header| !header.trim().is_empty())
|
|
||||||
.cloned(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
headers.join(",")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn tool_model_id(&self) -> &str {
|
pub fn tool_model_id(&self) -> &str {
|
||||||
if let Self::Custom {
|
if let Self::Custom {
|
||||||
tool_override: Some(tool_override),
|
tool_override: Some(tool_override),
|
||||||
@@ -200,14 +156,11 @@ pub async fn complete(
|
|||||||
request: Request,
|
request: Request,
|
||||||
) -> Result<Response, AnthropicError> {
|
) -> Result<Response, AnthropicError> {
|
||||||
let uri = format!("{api_url}/v1/messages");
|
let uri = format!("{api_url}/v1/messages");
|
||||||
let beta_headers = Model::from_id(&request.model)
|
|
||||||
.map(|model| model.beta_headers())
|
|
||||||
.unwrap_or_else(|_err| Model::DEFAULT_BETA_HEADERS.join(","));
|
|
||||||
let request_builder = HttpRequest::builder()
|
let request_builder = HttpRequest::builder()
|
||||||
.method(Method::POST)
|
.method(Method::POST)
|
||||||
.uri(uri)
|
.uri(uri)
|
||||||
.header("Anthropic-Version", "2023-06-01")
|
.header("Anthropic-Version", "2023-06-01")
|
||||||
.header("Anthropic-Beta", beta_headers)
|
.header("Anthropic-Beta", "prompt-caching-2024-07-31")
|
||||||
.header("X-Api-Key", api_key)
|
.header("X-Api-Key", api_key)
|
||||||
.header("Content-Type", "application/json");
|
.header("Content-Type", "application/json");
|
||||||
|
|
||||||
@@ -259,7 +212,7 @@ pub async fn stream_completion(
|
|||||||
.map(|output| output.0)
|
.map(|output| output.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://docs.anthropic.com/en/api/rate-limits#response-headers>
|
/// https://docs.anthropic.com/en/api/rate-limits#response-headers
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RateLimitInfo {
|
pub struct RateLimitInfo {
|
||||||
pub requests_limit: usize,
|
pub requests_limit: usize,
|
||||||
@@ -318,14 +271,14 @@ pub async fn stream_completion_with_rate_limit_info(
|
|||||||
stream: true,
|
stream: true,
|
||||||
};
|
};
|
||||||
let uri = format!("{api_url}/v1/messages");
|
let uri = format!("{api_url}/v1/messages");
|
||||||
let beta_headers = Model::from_id(&request.base.model)
|
|
||||||
.map(|model| model.beta_headers())
|
|
||||||
.unwrap_or_else(|_err| Model::DEFAULT_BETA_HEADERS.join(","));
|
|
||||||
let request_builder = HttpRequest::builder()
|
let request_builder = HttpRequest::builder()
|
||||||
.method(Method::POST)
|
.method(Method::POST)
|
||||||
.uri(uri)
|
.uri(uri)
|
||||||
.header("Anthropic-Version", "2023-06-01")
|
.header("Anthropic-Version", "2023-06-01")
|
||||||
.header("Anthropic-Beta", beta_headers)
|
.header(
|
||||||
|
"Anthropic-Beta",
|
||||||
|
"tools-2024-04-04,prompt-caching-2024-07-31,max-tokens-3-5-sonnet-2024-07-15",
|
||||||
|
)
|
||||||
.header("X-Api-Key", api_key)
|
.header("X-Api-Key", api_key)
|
||||||
.header("Content-Type", "application/json");
|
.header("Content-Type", "application/json");
|
||||||
let serialized_request =
|
let serialized_request =
|
||||||
@@ -635,7 +588,7 @@ pub struct ApiError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// An Anthropic API error code.
|
/// An Anthropic API error code.
|
||||||
/// <https://docs.anthropic.com/en/api/errors#http-errors>
|
/// https://docs.anthropic.com/en/api/errors#http-errors
|
||||||
#[derive(Debug, PartialEq, Eq, Clone, Copy, EnumString)]
|
#[derive(Debug, PartialEq, Eq, Clone, Copy, EnumString)]
|
||||||
#[strum(serialize_all = "snake_case")]
|
#[strum(serialize_all = "snake_case")]
|
||||||
pub enum ApiErrorCode {
|
pub enum ApiErrorCode {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use std::sync::LazyLock;
|
|||||||
|
|
||||||
/// Returns whether the given country code is supported by Anthropic.
|
/// Returns whether the given country code is supported by Anthropic.
|
||||||
///
|
///
|
||||||
/// <https://www.anthropic.com/supported-countries>
|
/// https://www.anthropic.com/supported-countries
|
||||||
pub fn is_supported_country(country_code: &str) -> bool {
|
pub fn is_supported_country(country_code: &str) -> bool {
|
||||||
SUPPORTED_COUNTRIES.contains(&country_code)
|
SUPPORTED_COUNTRIES.contains(&country_code)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "assets"
|
name = "assets"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition.workspace = true
|
edition = "2021"
|
||||||
publish.workspace = true
|
publish = false
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// This crate was essentially pulled out verbatim from main `zed` crate to avoid having to run RustEmbed macro whenever zed has to be rebuilt. It saves a second or two on an incremental build.
|
// This crate was essentially pulled out verbatim from main `zed` crate to avoid having to run RustEmbed macro whenever zed has to be rebuilt. It saves a second or two on an incremental build.
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
|
|
||||||
use gpui::{App, AssetSource, Result, SharedString};
|
use gpui::{AppContext, AssetSource, Result, SharedString};
|
||||||
use rust_embed::RustEmbed;
|
use rust_embed::RustEmbed;
|
||||||
|
|
||||||
#[derive(RustEmbed)]
|
#[derive(RustEmbed)]
|
||||||
@@ -39,7 +39,7 @@ impl AssetSource for Assets {
|
|||||||
|
|
||||||
impl Assets {
|
impl Assets {
|
||||||
/// Populate the [`TextSystem`] of the given [`AppContext`] with all `.ttf` fonts in the `fonts` directory.
|
/// Populate the [`TextSystem`] of the given [`AppContext`] with all `.ttf` fonts in the `fonts` directory.
|
||||||
pub fn load_fonts(&self, cx: &App) -> gpui::Result<()> {
|
pub fn load_fonts(&self, cx: &AppContext) -> gpui::Result<()> {
|
||||||
let font_paths = self.list("fonts")?;
|
let font_paths = self.list("fonts")?;
|
||||||
let mut embedded_fonts = Vec::new();
|
let mut embedded_fonts = Vec::new();
|
||||||
for font_path in font_paths {
|
for font_path in font_paths {
|
||||||
@@ -55,7 +55,7 @@ impl Assets {
|
|||||||
cx.text_system().add_fonts(embedded_fonts)
|
cx.text_system().add_fonts(embedded_fonts)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_test_fonts(&self, cx: &App) {
|
pub fn load_test_fonts(&self, cx: &AppContext) {
|
||||||
cx.text_system()
|
cx.text_system()
|
||||||
.add_fonts(vec![self
|
.add_fonts(vec![self
|
||||||
.load("fonts/plex-mono/ZedPlexMono-Regular.ttf")
|
.load("fonts/plex-mono/ZedPlexMono-Regular.ttf")
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "assistant"
|
name = "assistant"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition.workspace = true
|
edition = "2021"
|
||||||
publish.workspace = true
|
publish = false
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
@@ -21,14 +21,16 @@ test-support = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
anthropic = { workspace = true, features = ["schemars"] }
|
||||||
anyhow.workspace = true
|
anyhow.workspace = true
|
||||||
assistant_context_editor.workspace = true
|
assets.workspace = true
|
||||||
assistant_settings.workspace = true
|
|
||||||
assistant_slash_command.workspace = true
|
assistant_slash_command.workspace = true
|
||||||
assistant_slash_commands.workspace = true
|
|
||||||
assistant_tool.workspace = true
|
assistant_tool.workspace = true
|
||||||
async-watch.workspace = true
|
async-watch.workspace = true
|
||||||
|
cargo_toml.workspace = true
|
||||||
|
chrono.workspace = true
|
||||||
client.workspace = true
|
client.workspace = true
|
||||||
|
clock.workspace = true
|
||||||
collections.workspace = true
|
collections.workspace = true
|
||||||
command_palette_hooks.workspace = true
|
command_palette_hooks.workspace = true
|
||||||
context_server.workspace = true
|
context_server.workspace = true
|
||||||
@@ -37,37 +39,55 @@ editor.workspace = true
|
|||||||
feature_flags.workspace = true
|
feature_flags.workspace = true
|
||||||
fs.workspace = true
|
fs.workspace = true
|
||||||
futures.workspace = true
|
futures.workspace = true
|
||||||
|
fuzzy.workspace = true
|
||||||
|
globset.workspace = true
|
||||||
gpui.workspace = true
|
gpui.workspace = true
|
||||||
|
handlebars.workspace = true
|
||||||
|
heed.workspace = true
|
||||||
|
html_to_markdown.workspace = true
|
||||||
|
http_client.workspace = true
|
||||||
indexed_docs.workspace = true
|
indexed_docs.workspace = true
|
||||||
indoc.workspace = true
|
indoc.workspace = true
|
||||||
language.workspace = true
|
language.workspace = true
|
||||||
language_model.workspace = true
|
language_model.workspace = true
|
||||||
language_model_selector.workspace = true
|
language_model_selector.workspace = true
|
||||||
|
language_models.workspace = true
|
||||||
log.workspace = true
|
log.workspace = true
|
||||||
lsp.workspace = true
|
lsp.workspace = true
|
||||||
|
markdown.workspace = true
|
||||||
menu.workspace = true
|
menu.workspace = true
|
||||||
multi_buffer.workspace = true
|
multi_buffer.workspace = true
|
||||||
|
ollama = { workspace = true, features = ["schemars"] }
|
||||||
|
open_ai = { workspace = true, features = ["schemars"] }
|
||||||
|
ordered-float.workspace = true
|
||||||
parking_lot.workspace = true
|
parking_lot.workspace = true
|
||||||
paths.workspace = true
|
paths.workspace = true
|
||||||
|
picker.workspace = true
|
||||||
project.workspace = true
|
project.workspace = true
|
||||||
prompt_library.workspace = true
|
|
||||||
proto.workspace = true
|
proto.workspace = true
|
||||||
|
regex.workspace = true
|
||||||
|
release_channel.workspace = true
|
||||||
rope.workspace = true
|
rope.workspace = true
|
||||||
|
rpc.workspace = true
|
||||||
schemars.workspace = true
|
schemars.workspace = true
|
||||||
search.workspace = true
|
search.workspace = true
|
||||||
semantic_index.workspace = true
|
semantic_index.workspace = true
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
|
serde_json.workspace = true
|
||||||
settings.workspace = true
|
settings.workspace = true
|
||||||
|
similar.workspace = true
|
||||||
|
smallvec.workspace = true
|
||||||
smol.workspace = true
|
smol.workspace = true
|
||||||
streaming_diff.workspace = true
|
strum.workspace = true
|
||||||
telemetry.workspace = true
|
|
||||||
telemetry_events.workspace = true
|
telemetry_events.workspace = true
|
||||||
terminal.workspace = true
|
terminal.workspace = true
|
||||||
terminal_view.workspace = true
|
terminal_view.workspace = true
|
||||||
text.workspace = true
|
text.workspace = true
|
||||||
theme.workspace = true
|
theme.workspace = true
|
||||||
|
toml.workspace = true
|
||||||
ui.workspace = true
|
ui.workspace = true
|
||||||
util.workspace = true
|
util.workspace = true
|
||||||
|
uuid.workspace = true
|
||||||
workspace.workspace = true
|
workspace.workspace = true
|
||||||
zed_actions.workspace = true
|
zed_actions.workspace = true
|
||||||
|
|
||||||
@@ -83,7 +103,6 @@ pretty_assertions.workspace = true
|
|||||||
project = { workspace = true, features = ["test-support"] }
|
project = { workspace = true, features = ["test-support"] }
|
||||||
rand.workspace = true
|
rand.workspace = true
|
||||||
serde_json_lenient.workspace = true
|
serde_json_lenient.workspace = true
|
||||||
terminal_view = { workspace = true, features = ["test-support"] }
|
|
||||||
text = { workspace = true, features = ["test-support"] }
|
text = { workspace = true, features = ["test-support"] }
|
||||||
tree-sitter-md.workspace = true
|
tree-sitter-md.workspace = true
|
||||||
unindent.workspace = true
|
unindent.workspace = true
|
||||||
|
|||||||
@@ -1,46 +1,98 @@
|
|||||||
#![cfg_attr(target_os = "windows", allow(unused, dead_code))]
|
#![cfg_attr(target_os = "windows", allow(unused, dead_code))]
|
||||||
|
|
||||||
mod assistant_configuration;
|
|
||||||
pub mod assistant_panel;
|
pub mod assistant_panel;
|
||||||
|
pub mod assistant_settings;
|
||||||
|
mod context;
|
||||||
|
pub mod context_store;
|
||||||
mod inline_assistant;
|
mod inline_assistant;
|
||||||
|
mod patch;
|
||||||
|
mod prompt_library;
|
||||||
|
mod prompts;
|
||||||
|
mod slash_command;
|
||||||
|
pub(crate) mod slash_command_picker;
|
||||||
pub mod slash_command_settings;
|
pub mod slash_command_settings;
|
||||||
|
mod slash_command_working_set;
|
||||||
|
mod streaming_diff;
|
||||||
mod terminal_inline_assistant;
|
mod terminal_inline_assistant;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use crate::slash_command::project_command::ProjectSlashCommandFeatureFlag;
|
||||||
|
pub use crate::slash_command_working_set::{SlashCommandId, SlashCommandWorkingSet};
|
||||||
|
pub use assistant_panel::{AssistantPanel, AssistantPanelEvent};
|
||||||
use assistant_settings::AssistantSettings;
|
use assistant_settings::AssistantSettings;
|
||||||
use assistant_slash_command::SlashCommandRegistry;
|
use assistant_slash_command::SlashCommandRegistry;
|
||||||
use assistant_slash_commands::{ProjectSlashCommandFeatureFlag, SearchSlashCommandFeatureFlag};
|
use client::{proto, Client};
|
||||||
use client::Client;
|
|
||||||
use command_palette_hooks::CommandPaletteFilter;
|
use command_palette_hooks::CommandPaletteFilter;
|
||||||
|
pub use context::*;
|
||||||
|
pub use context_store::*;
|
||||||
use feature_flags::FeatureFlagAppExt;
|
use feature_flags::FeatureFlagAppExt;
|
||||||
use fs::Fs;
|
use fs::Fs;
|
||||||
use gpui::{actions, App, Global, UpdateGlobal};
|
use gpui::impl_actions;
|
||||||
|
use gpui::{actions, AppContext, Global, SharedString, UpdateGlobal};
|
||||||
|
pub(crate) use inline_assistant::*;
|
||||||
use language_model::{
|
use language_model::{
|
||||||
LanguageModelId, LanguageModelProviderId, LanguageModelRegistry, LanguageModelResponseMessage,
|
LanguageModelId, LanguageModelProviderId, LanguageModelRegistry, LanguageModelResponseMessage,
|
||||||
};
|
};
|
||||||
use prompt_library::PromptBuilder;
|
pub use patch::*;
|
||||||
|
pub use prompts::PromptBuilder;
|
||||||
|
use prompts::PromptLoadingParams;
|
||||||
use semantic_index::{CloudEmbeddingProvider, SemanticDb};
|
use semantic_index::{CloudEmbeddingProvider, SemanticDb};
|
||||||
use serde::Deserialize;
|
use serde::{Deserialize, Serialize};
|
||||||
use settings::{Settings, SettingsStore};
|
use settings::{update_settings_file, Settings, SettingsStore};
|
||||||
|
use slash_command::search_command::SearchSlashCommandFeatureFlag;
|
||||||
|
use slash_command::{
|
||||||
|
auto_command, cargo_workspace_command, default_command, delta_command, diagnostics_command,
|
||||||
|
docs_command, fetch_command, file_command, now_command, project_command, prompt_command,
|
||||||
|
search_command, selection_command, symbols_command, tab_command, terminal_command,
|
||||||
|
};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Arc;
|
||||||
|
pub(crate) use streaming_diff::*;
|
||||||
|
use util::ResultExt;
|
||||||
|
|
||||||
pub use crate::assistant_panel::{AssistantPanel, AssistantPanelEvent};
|
use crate::slash_command::streaming_example_command;
|
||||||
pub(crate) use crate::inline_assistant::*;
|
|
||||||
use crate::slash_command_settings::SlashCommandSettings;
|
use crate::slash_command_settings::SlashCommandSettings;
|
||||||
|
|
||||||
actions!(
|
actions!(
|
||||||
assistant,
|
assistant,
|
||||||
[
|
[
|
||||||
|
Assist,
|
||||||
|
Edit,
|
||||||
|
Split,
|
||||||
|
CopyCode,
|
||||||
|
CycleMessageRole,
|
||||||
|
QuoteSelection,
|
||||||
|
InsertIntoEditor,
|
||||||
|
ToggleFocus,
|
||||||
InsertActivePrompt,
|
InsertActivePrompt,
|
||||||
DeployHistory,
|
DeployHistory,
|
||||||
NewChat,
|
DeployPromptLibrary,
|
||||||
|
ConfirmCommand,
|
||||||
|
NewContext,
|
||||||
|
ToggleModelSelector,
|
||||||
CycleNextInlineAssist,
|
CycleNextInlineAssist,
|
||||||
CyclePreviousInlineAssist
|
CyclePreviousInlineAssist
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#[derive(PartialEq, Clone, Deserialize)]
|
||||||
|
pub enum InsertDraggedFiles {
|
||||||
|
ProjectPaths(Vec<PathBuf>),
|
||||||
|
ExternalFiles(Vec<PathBuf>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_actions!(assistant, [InsertDraggedFiles]);
|
||||||
|
|
||||||
const DEFAULT_CONTEXT_LINES: usize = 50;
|
const DEFAULT_CONTEXT_LINES: usize = 50;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
|
||||||
|
pub struct MessageId(clock::Lamport);
|
||||||
|
|
||||||
|
impl MessageId {
|
||||||
|
pub fn as_u64(self) -> u64 {
|
||||||
|
self.0.as_u64()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct LanguageModelUsage {
|
pub struct LanguageModelUsage {
|
||||||
pub prompt_tokens: u32,
|
pub prompt_tokens: u32,
|
||||||
@@ -55,6 +107,55 @@ pub struct LanguageModelChoiceDelta {
|
|||||||
pub finish_reason: Option<String>,
|
pub finish_reason: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub enum MessageStatus {
|
||||||
|
Pending,
|
||||||
|
Done,
|
||||||
|
Error(SharedString),
|
||||||
|
Canceled,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessageStatus {
|
||||||
|
pub fn from_proto(status: proto::ContextMessageStatus) -> MessageStatus {
|
||||||
|
match status.variant {
|
||||||
|
Some(proto::context_message_status::Variant::Pending(_)) => MessageStatus::Pending,
|
||||||
|
Some(proto::context_message_status::Variant::Done(_)) => MessageStatus::Done,
|
||||||
|
Some(proto::context_message_status::Variant::Error(error)) => {
|
||||||
|
MessageStatus::Error(error.message.into())
|
||||||
|
}
|
||||||
|
Some(proto::context_message_status::Variant::Canceled(_)) => MessageStatus::Canceled,
|
||||||
|
None => MessageStatus::Pending,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_proto(&self) -> proto::ContextMessageStatus {
|
||||||
|
match self {
|
||||||
|
MessageStatus::Pending => proto::ContextMessageStatus {
|
||||||
|
variant: Some(proto::context_message_status::Variant::Pending(
|
||||||
|
proto::context_message_status::Pending {},
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
MessageStatus::Done => proto::ContextMessageStatus {
|
||||||
|
variant: Some(proto::context_message_status::Variant::Done(
|
||||||
|
proto::context_message_status::Done {},
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
MessageStatus::Error(message) => proto::ContextMessageStatus {
|
||||||
|
variant: Some(proto::context_message_status::Variant::Error(
|
||||||
|
proto::context_message_status::Error {
|
||||||
|
message: message.to_string(),
|
||||||
|
},
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
MessageStatus::Canceled => proto::ContextMessageStatus {
|
||||||
|
variant: Some(proto::context_message_status::Variant::Canceled(
|
||||||
|
proto::context_message_status::Canceled {},
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The state pertaining to the Assistant.
|
/// The state pertaining to the Assistant.
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct Assistant {
|
struct Assistant {
|
||||||
@@ -67,7 +168,7 @@ impl Global for Assistant {}
|
|||||||
impl Assistant {
|
impl Assistant {
|
||||||
const NAMESPACE: &'static str = "assistant";
|
const NAMESPACE: &'static str = "assistant";
|
||||||
|
|
||||||
fn set_enabled(&mut self, enabled: bool, cx: &mut App) {
|
fn set_enabled(&mut self, enabled: bool, cx: &mut AppContext) {
|
||||||
if self.enabled == enabled {
|
if self.enabled == enabled {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -91,13 +192,23 @@ impl Assistant {
|
|||||||
pub fn init(
|
pub fn init(
|
||||||
fs: Arc<dyn Fs>,
|
fs: Arc<dyn Fs>,
|
||||||
client: Arc<Client>,
|
client: Arc<Client>,
|
||||||
prompt_builder: Arc<PromptBuilder>,
|
stdout_is_a_pty: bool,
|
||||||
cx: &mut App,
|
cx: &mut AppContext,
|
||||||
) {
|
) -> Arc<PromptBuilder> {
|
||||||
cx.set_global(Assistant::default());
|
cx.set_global(Assistant::default());
|
||||||
AssistantSettings::register(cx);
|
AssistantSettings::register(cx);
|
||||||
SlashCommandSettings::register(cx);
|
SlashCommandSettings::register(cx);
|
||||||
|
|
||||||
|
// TODO: remove this when 0.148.0 is released.
|
||||||
|
if AssistantSettings::get_global(cx).using_outdated_settings_version {
|
||||||
|
update_settings_file::<AssistantSettings>(fs.clone(), cx, {
|
||||||
|
let fs = fs.clone();
|
||||||
|
|content, cx| {
|
||||||
|
content.update_file(fs, cx);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
cx.spawn(|mut cx| {
|
cx.spawn(|mut cx| {
|
||||||
let client = client.clone();
|
let client = client.clone();
|
||||||
async move {
|
async move {
|
||||||
@@ -125,7 +236,7 @@ pub fn init(
|
|||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
assistant_context_editor::init(client.clone(), cx);
|
context_store::init(&client.clone().into());
|
||||||
prompt_library::init(cx);
|
prompt_library::init(cx);
|
||||||
init_language_model_settings(cx);
|
init_language_model_settings(cx);
|
||||||
assistant_slash_command::init(cx);
|
assistant_slash_command::init(cx);
|
||||||
@@ -133,6 +244,16 @@ pub fn init(
|
|||||||
assistant_panel::init(cx);
|
assistant_panel::init(cx);
|
||||||
context_server::init(cx);
|
context_server::init(cx);
|
||||||
|
|
||||||
|
let prompt_builder = prompts::PromptBuilder::new(Some(PromptLoadingParams {
|
||||||
|
fs: fs.clone(),
|
||||||
|
repo_path: stdout_is_a_pty
|
||||||
|
.then(|| std::env::current_dir().log_err())
|
||||||
|
.flatten(),
|
||||||
|
cx,
|
||||||
|
}))
|
||||||
|
.log_err()
|
||||||
|
.map(Arc::new)
|
||||||
|
.unwrap_or_else(|| Arc::new(prompts::PromptBuilder::new(None).unwrap()));
|
||||||
register_slash_commands(Some(prompt_builder.clone()), cx);
|
register_slash_commands(Some(prompt_builder.clone()), cx);
|
||||||
inline_assistant::init(
|
inline_assistant::init(
|
||||||
fs.clone(),
|
fs.clone(),
|
||||||
@@ -163,9 +284,11 @@ pub fn init(
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
|
prompt_builder
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_language_model_settings(cx: &mut App) {
|
fn init_language_model_settings(cx: &mut AppContext) {
|
||||||
update_active_language_model_from_settings(cx);
|
update_active_language_model_from_settings(cx);
|
||||||
|
|
||||||
cx.observe_global::<SettingsStore>(update_active_language_model_from_settings)
|
cx.observe_global::<SettingsStore>(update_active_language_model_from_settings)
|
||||||
@@ -184,7 +307,7 @@ fn init_language_model_settings(cx: &mut App) {
|
|||||||
.detach();
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_active_language_model_from_settings(cx: &mut App) {
|
fn update_active_language_model_from_settings(cx: &mut AppContext) {
|
||||||
let settings = AssistantSettings::get_global(cx);
|
let settings = AssistantSettings::get_global(cx);
|
||||||
let provider_name = LanguageModelProviderId::from(settings.default_model.provider.clone());
|
let provider_name = LanguageModelProviderId::from(settings.default_model.provider.clone());
|
||||||
let model_id = LanguageModelId::from(settings.default_model.model.clone());
|
let model_id = LanguageModelId::from(settings.default_model.model.clone());
|
||||||
@@ -204,31 +327,30 @@ fn update_active_language_model_from_settings(cx: &mut App) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn register_slash_commands(prompt_builder: Option<Arc<PromptBuilder>>, cx: &mut App) {
|
fn register_slash_commands(prompt_builder: Option<Arc<PromptBuilder>>, cx: &mut AppContext) {
|
||||||
let slash_command_registry = SlashCommandRegistry::global(cx);
|
let slash_command_registry = SlashCommandRegistry::global(cx);
|
||||||
|
|
||||||
slash_command_registry.register_command(assistant_slash_commands::FileSlashCommand, true);
|
slash_command_registry.register_command(file_command::FileSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::DeltaSlashCommand, true);
|
slash_command_registry.register_command(delta_command::DeltaSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::OutlineSlashCommand, true);
|
slash_command_registry.register_command(symbols_command::OutlineSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::TabSlashCommand, true);
|
slash_command_registry.register_command(tab_command::TabSlashCommand, true);
|
||||||
slash_command_registry
|
slash_command_registry
|
||||||
.register_command(assistant_slash_commands::CargoWorkspaceSlashCommand, true);
|
.register_command(cargo_workspace_command::CargoWorkspaceSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::PromptSlashCommand, true);
|
slash_command_registry.register_command(prompt_command::PromptSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::SelectionCommand, true);
|
slash_command_registry.register_command(selection_command::SelectionCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::DefaultSlashCommand, false);
|
slash_command_registry.register_command(default_command::DefaultSlashCommand, false);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::TerminalSlashCommand, true);
|
slash_command_registry.register_command(terminal_command::TerminalSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::NowSlashCommand, false);
|
slash_command_registry.register_command(now_command::NowSlashCommand, false);
|
||||||
slash_command_registry
|
slash_command_registry.register_command(diagnostics_command::DiagnosticsSlashCommand, true);
|
||||||
.register_command(assistant_slash_commands::DiagnosticsSlashCommand, true);
|
slash_command_registry.register_command(fetch_command::FetchSlashCommand, true);
|
||||||
slash_command_registry.register_command(assistant_slash_commands::FetchSlashCommand, true);
|
|
||||||
|
|
||||||
if let Some(prompt_builder) = prompt_builder {
|
if let Some(prompt_builder) = prompt_builder {
|
||||||
cx.observe_flag::<assistant_slash_commands::ProjectSlashCommandFeatureFlag, _>({
|
cx.observe_flag::<project_command::ProjectSlashCommandFeatureFlag, _>({
|
||||||
let slash_command_registry = slash_command_registry.clone();
|
let slash_command_registry = slash_command_registry.clone();
|
||||||
move |is_enabled, _cx| {
|
move |is_enabled, _cx| {
|
||||||
if is_enabled {
|
if is_enabled {
|
||||||
slash_command_registry.register_command(
|
slash_command_registry.register_command(
|
||||||
assistant_slash_commands::ProjectSlashCommand::new(prompt_builder.clone()),
|
project_command::ProjectSlashCommand::new(prompt_builder.clone()),
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -237,24 +359,23 @@ fn register_slash_commands(prompt_builder: Option<Arc<PromptBuilder>>, cx: &mut
|
|||||||
.detach();
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
cx.observe_flag::<assistant_slash_commands::AutoSlashCommandFeatureFlag, _>({
|
cx.observe_flag::<auto_command::AutoSlashCommandFeatureFlag, _>({
|
||||||
let slash_command_registry = slash_command_registry.clone();
|
let slash_command_registry = slash_command_registry.clone();
|
||||||
move |is_enabled, _cx| {
|
move |is_enabled, _cx| {
|
||||||
if is_enabled {
|
if is_enabled {
|
||||||
// [#auto-staff-ship] TODO remove this when /auto is no longer staff-shipped
|
// [#auto-staff-ship] TODO remove this when /auto is no longer staff-shipped
|
||||||
slash_command_registry
|
slash_command_registry.register_command(auto_command::AutoCommand, true);
|
||||||
.register_command(assistant_slash_commands::AutoCommand, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
cx.observe_flag::<assistant_slash_commands::StreamingExampleSlashCommandFeatureFlag, _>({
|
cx.observe_flag::<streaming_example_command::StreamingExampleSlashCommandFeatureFlag, _>({
|
||||||
let slash_command_registry = slash_command_registry.clone();
|
let slash_command_registry = slash_command_registry.clone();
|
||||||
move |is_enabled, _cx| {
|
move |is_enabled, _cx| {
|
||||||
if is_enabled {
|
if is_enabled {
|
||||||
slash_command_registry.register_command(
|
slash_command_registry.register_command(
|
||||||
assistant_slash_commands::StreamingExampleSlashCommand,
|
streaming_example_command::StreamingExampleSlashCommand,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -266,34 +387,51 @@ fn register_slash_commands(prompt_builder: Option<Arc<PromptBuilder>>, cx: &mut
|
|||||||
cx.observe_global::<SettingsStore>(update_slash_commands_from_settings)
|
cx.observe_global::<SettingsStore>(update_slash_commands_from_settings)
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
cx.observe_flag::<assistant_slash_commands::SearchSlashCommandFeatureFlag, _>({
|
cx.observe_flag::<search_command::SearchSlashCommandFeatureFlag, _>({
|
||||||
let slash_command_registry = slash_command_registry.clone();
|
let slash_command_registry = slash_command_registry.clone();
|
||||||
move |is_enabled, _cx| {
|
move |is_enabled, _cx| {
|
||||||
if is_enabled {
|
if is_enabled {
|
||||||
slash_command_registry
|
slash_command_registry.register_command(search_command::SearchSlashCommand, true);
|
||||||
.register_command(assistant_slash_commands::SearchSlashCommand, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_slash_commands_from_settings(cx: &mut App) {
|
fn update_slash_commands_from_settings(cx: &mut AppContext) {
|
||||||
let slash_command_registry = SlashCommandRegistry::global(cx);
|
let slash_command_registry = SlashCommandRegistry::global(cx);
|
||||||
let settings = SlashCommandSettings::get_global(cx);
|
let settings = SlashCommandSettings::get_global(cx);
|
||||||
|
|
||||||
if settings.docs.enabled {
|
if settings.docs.enabled {
|
||||||
slash_command_registry.register_command(assistant_slash_commands::DocsSlashCommand, true);
|
slash_command_registry.register_command(docs_command::DocsSlashCommand, true);
|
||||||
} else {
|
} else {
|
||||||
slash_command_registry.unregister_command(assistant_slash_commands::DocsSlashCommand);
|
slash_command_registry.unregister_command(docs_command::DocsSlashCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
if settings.cargo_workspace.enabled {
|
if settings.cargo_workspace.enabled {
|
||||||
slash_command_registry
|
slash_command_registry
|
||||||
.register_command(assistant_slash_commands::CargoWorkspaceSlashCommand, true);
|
.register_command(cargo_workspace_command::CargoWorkspaceSlashCommand, true);
|
||||||
} else {
|
} else {
|
||||||
slash_command_registry
|
slash_command_registry
|
||||||
.unregister_command(assistant_slash_commands::CargoWorkspaceSlashCommand);
|
.unregister_command(cargo_workspace_command::CargoWorkspaceSlashCommand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn humanize_token_count(count: usize) -> String {
|
||||||
|
match count {
|
||||||
|
0..=999 => count.to_string(),
|
||||||
|
1000..=9999 => {
|
||||||
|
let thousands = count / 1000;
|
||||||
|
let hundreds = (count % 1000 + 50) / 100;
|
||||||
|
if hundreds == 0 {
|
||||||
|
format!("{}k", thousands)
|
||||||
|
} else if hundreds == 10 {
|
||||||
|
format!("{}k", thousands + 1)
|
||||||
|
} else {
|
||||||
|
format!("{}.{}k", thousands, hundreds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => format!("{}k", (count + 500) / 1000),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,199 +0,0 @@
|
|||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use collections::HashMap;
|
|
||||||
use gpui::{canvas, AnyView, App, EventEmitter, FocusHandle, Focusable, Subscription};
|
|
||||||
use language_model::{LanguageModelProvider, LanguageModelProviderId, LanguageModelRegistry};
|
|
||||||
use ui::{prelude::*, ElevationIndex};
|
|
||||||
use workspace::Item;
|
|
||||||
|
|
||||||
pub struct ConfigurationView {
|
|
||||||
focus_handle: FocusHandle,
|
|
||||||
configuration_views: HashMap<LanguageModelProviderId, AnyView>,
|
|
||||||
_registry_subscription: Subscription,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConfigurationView {
|
|
||||||
pub fn new(window: &mut Window, cx: &mut Context<Self>) -> Self {
|
|
||||||
let focus_handle = cx.focus_handle();
|
|
||||||
|
|
||||||
let registry_subscription = cx.subscribe_in(
|
|
||||||
&LanguageModelRegistry::global(cx),
|
|
||||||
window,
|
|
||||||
|this, _, event: &language_model::Event, window, cx| match event {
|
|
||||||
language_model::Event::AddedProvider(provider_id) => {
|
|
||||||
let provider = LanguageModelRegistry::read_global(cx).provider(provider_id);
|
|
||||||
if let Some(provider) = provider {
|
|
||||||
this.add_configuration_view(&provider, window, cx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
language_model::Event::RemovedProvider(provider_id) => {
|
|
||||||
this.remove_configuration_view(provider_id);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut this = Self {
|
|
||||||
focus_handle,
|
|
||||||
configuration_views: HashMap::default(),
|
|
||||||
_registry_subscription: registry_subscription,
|
|
||||||
};
|
|
||||||
this.build_configuration_views(window, cx);
|
|
||||||
this
|
|
||||||
}
|
|
||||||
|
|
||||||
fn build_configuration_views(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
|
||||||
let providers = LanguageModelRegistry::read_global(cx).providers();
|
|
||||||
for provider in providers {
|
|
||||||
self.add_configuration_view(&provider, window, cx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove_configuration_view(&mut self, provider_id: &LanguageModelProviderId) {
|
|
||||||
self.configuration_views.remove(provider_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_configuration_view(
|
|
||||||
&mut self,
|
|
||||||
provider: &Arc<dyn LanguageModelProvider>,
|
|
||||||
window: &mut Window,
|
|
||||||
cx: &mut Context<Self>,
|
|
||||||
) {
|
|
||||||
let configuration_view = provider.configuration_view(window, cx);
|
|
||||||
self.configuration_views
|
|
||||||
.insert(provider.id(), configuration_view);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn render_provider_view(
|
|
||||||
&mut self,
|
|
||||||
provider: &Arc<dyn LanguageModelProvider>,
|
|
||||||
cx: &mut Context<Self>,
|
|
||||||
) -> Div {
|
|
||||||
let provider_id = provider.id().0.clone();
|
|
||||||
let provider_name = provider.name().0.clone();
|
|
||||||
let configuration_view = self.configuration_views.get(&provider.id()).cloned();
|
|
||||||
|
|
||||||
let open_new_context = cx.listener({
|
|
||||||
let provider = provider.clone();
|
|
||||||
move |_, _, _window, cx| {
|
|
||||||
cx.emit(ConfigurationViewEvent::NewProviderContextEditor(
|
|
||||||
provider.clone(),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
v_flex()
|
|
||||||
.gap_2()
|
|
||||||
.child(
|
|
||||||
h_flex()
|
|
||||||
.justify_between()
|
|
||||||
.child(Headline::new(provider_name.clone()).size(HeadlineSize::Small))
|
|
||||||
.when(provider.is_authenticated(cx), move |this| {
|
|
||||||
this.child(
|
|
||||||
h_flex().justify_end().child(
|
|
||||||
Button::new(
|
|
||||||
SharedString::from(format!("new-context-{provider_id}")),
|
|
||||||
"Open New Chat",
|
|
||||||
)
|
|
||||||
.icon_position(IconPosition::Start)
|
|
||||||
.icon(IconName::Plus)
|
|
||||||
.style(ButtonStyle::Filled)
|
|
||||||
.layer(ElevationIndex::ModalSurface)
|
|
||||||
.on_click(open_new_context),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.child(
|
|
||||||
div()
|
|
||||||
.p(DynamicSpacing::Base08.rems(cx))
|
|
||||||
.bg(cx.theme().colors().surface_background)
|
|
||||||
.border_1()
|
|
||||||
.border_color(cx.theme().colors().border_variant)
|
|
||||||
.rounded_md()
|
|
||||||
.when(configuration_view.is_none(), |this| {
|
|
||||||
this.child(div().child(Label::new(format!(
|
|
||||||
"No configuration view for {}",
|
|
||||||
provider_name
|
|
||||||
))))
|
|
||||||
})
|
|
||||||
.when_some(configuration_view, |this, configuration_view| {
|
|
||||||
this.child(configuration_view)
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Render for ConfigurationView {
|
|
||||||
fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
|
|
||||||
let providers = LanguageModelRegistry::read_global(cx).providers();
|
|
||||||
let provider_views = providers
|
|
||||||
.into_iter()
|
|
||||||
.map(|provider| self.render_provider_view(&provider, cx))
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
let mut element = v_flex()
|
|
||||||
.id("assistant-configuration-view")
|
|
||||||
.track_focus(&self.focus_handle(cx))
|
|
||||||
.bg(cx.theme().colors().editor_background)
|
|
||||||
.size_full()
|
|
||||||
.overflow_y_scroll()
|
|
||||||
.child(
|
|
||||||
v_flex()
|
|
||||||
.p(DynamicSpacing::Base16.rems(cx))
|
|
||||||
.border_b_1()
|
|
||||||
.border_color(cx.theme().colors().border)
|
|
||||||
.gap_1()
|
|
||||||
.child(Headline::new("Configure your Assistant").size(HeadlineSize::Medium))
|
|
||||||
.child(
|
|
||||||
Label::new(
|
|
||||||
"At least one LLM provider must be configured to use the Assistant.",
|
|
||||||
)
|
|
||||||
.color(Color::Muted),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.child(
|
|
||||||
v_flex()
|
|
||||||
.p(DynamicSpacing::Base16.rems(cx))
|
|
||||||
.mt_1()
|
|
||||||
.gap_6()
|
|
||||||
.flex_1()
|
|
||||||
.children(provider_views),
|
|
||||||
)
|
|
||||||
.into_any();
|
|
||||||
|
|
||||||
// We use a canvas here to get scrolling to work in the ConfigurationView. It's a workaround
|
|
||||||
// because we couldn't the element to take up the size of the parent.
|
|
||||||
canvas(
|
|
||||||
move |bounds, window, cx| {
|
|
||||||
element.prepaint_as_root(bounds.origin, bounds.size.into(), window, cx);
|
|
||||||
element
|
|
||||||
},
|
|
||||||
|_, mut element, window, cx| {
|
|
||||||
element.paint(window, cx);
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.flex_1()
|
|
||||||
.w_full()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum ConfigurationViewEvent {
|
|
||||||
NewProviderContextEditor(Arc<dyn LanguageModelProvider>),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EventEmitter<ConfigurationViewEvent> for ConfigurationView {}
|
|
||||||
|
|
||||||
impl Focusable for ConfigurationView {
|
|
||||||
fn focus_handle(&self, _: &App) -> FocusHandle {
|
|
||||||
self.focus_handle.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Item for ConfigurationView {
|
|
||||||
type Event = ConfigurationViewEvent;
|
|
||||||
|
|
||||||
fn tab_content_text(&self, _window: &Window, _cx: &App) -> Option<SharedString> {
|
|
||||||
Some("Configuration".into())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
603
crates/assistant/src/assistant_settings.rs
Normal file
@@ -0,0 +1,603 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use ::open_ai::Model as OpenAiModel;
|
||||||
|
use anthropic::Model as AnthropicModel;
|
||||||
|
use feature_flags::FeatureFlagAppExt;
|
||||||
|
use fs::Fs;
|
||||||
|
use gpui::{AppContext, Pixels};
|
||||||
|
use language_model::{CloudModel, LanguageModel};
|
||||||
|
use language_models::{
|
||||||
|
provider::open_ai, AllLanguageModelSettings, AnthropicSettingsContent,
|
||||||
|
AnthropicSettingsContentV1, OllamaSettingsContent, OpenAiSettingsContent,
|
||||||
|
OpenAiSettingsContentV1, VersionedAnthropicSettingsContent, VersionedOpenAiSettingsContent,
|
||||||
|
};
|
||||||
|
use ollama::Model as OllamaModel;
|
||||||
|
use schemars::{schema::Schema, JsonSchema};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use settings::{update_settings_file, Settings, SettingsSources};
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema)]
|
||||||
|
#[serde(rename_all = "snake_case")]
|
||||||
|
pub enum AssistantDockPosition {
|
||||||
|
Left,
|
||||||
|
#[default]
|
||||||
|
Right,
|
||||||
|
Bottom,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
||||||
|
#[serde(tag = "name", rename_all = "snake_case")]
|
||||||
|
pub enum AssistantProviderContentV1 {
|
||||||
|
#[serde(rename = "zed.dev")]
|
||||||
|
ZedDotDev { default_model: Option<CloudModel> },
|
||||||
|
#[serde(rename = "openai")]
|
||||||
|
OpenAi {
|
||||||
|
default_model: Option<OpenAiModel>,
|
||||||
|
api_url: Option<String>,
|
||||||
|
available_models: Option<Vec<OpenAiModel>>,
|
||||||
|
},
|
||||||
|
#[serde(rename = "anthropic")]
|
||||||
|
Anthropic {
|
||||||
|
default_model: Option<AnthropicModel>,
|
||||||
|
api_url: Option<String>,
|
||||||
|
},
|
||||||
|
#[serde(rename = "ollama")]
|
||||||
|
Ollama {
|
||||||
|
default_model: Option<OllamaModel>,
|
||||||
|
api_url: Option<String>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct AssistantSettings {
|
||||||
|
pub enabled: bool,
|
||||||
|
pub button: bool,
|
||||||
|
pub dock: AssistantDockPosition,
|
||||||
|
pub default_width: Pixels,
|
||||||
|
pub default_height: Pixels,
|
||||||
|
pub default_model: LanguageModelSelection,
|
||||||
|
pub inline_alternatives: Vec<LanguageModelSelection>,
|
||||||
|
pub using_outdated_settings_version: bool,
|
||||||
|
pub enable_experimental_live_diffs: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AssistantSettings {
|
||||||
|
pub fn are_live_diffs_enabled(&self, cx: &AppContext) -> bool {
|
||||||
|
cx.is_staff() || self.enable_experimental_live_diffs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Assistant panel settings
|
||||||
|
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
pub enum AssistantSettingsContent {
|
||||||
|
Versioned(VersionedAssistantSettingsContent),
|
||||||
|
Legacy(LegacyAssistantSettingsContent),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl JsonSchema for AssistantSettingsContent {
|
||||||
|
fn schema_name() -> String {
|
||||||
|
VersionedAssistantSettingsContent::schema_name()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> Schema {
|
||||||
|
VersionedAssistantSettingsContent::json_schema(gen)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_referenceable() -> bool {
|
||||||
|
VersionedAssistantSettingsContent::is_referenceable()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for AssistantSettingsContent {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Versioned(VersionedAssistantSettingsContent::default())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AssistantSettingsContent {
|
||||||
|
pub fn is_version_outdated(&self) -> bool {
|
||||||
|
match self {
|
||||||
|
AssistantSettingsContent::Versioned(settings) => match settings {
|
||||||
|
VersionedAssistantSettingsContent::V1(_) => true,
|
||||||
|
VersionedAssistantSettingsContent::V2(_) => false,
|
||||||
|
},
|
||||||
|
AssistantSettingsContent::Legacy(_) => true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_file(&mut self, fs: Arc<dyn Fs>, cx: &AppContext) {
|
||||||
|
if let AssistantSettingsContent::Versioned(settings) = self {
|
||||||
|
if let VersionedAssistantSettingsContent::V1(settings) = settings {
|
||||||
|
if let Some(provider) = settings.provider.clone() {
|
||||||
|
match provider {
|
||||||
|
AssistantProviderContentV1::Anthropic { api_url, .. } => {
|
||||||
|
update_settings_file::<AllLanguageModelSettings>(
|
||||||
|
fs,
|
||||||
|
cx,
|
||||||
|
move |content, _| {
|
||||||
|
if content.anthropic.is_none() {
|
||||||
|
content.anthropic =
|
||||||
|
Some(AnthropicSettingsContent::Versioned(
|
||||||
|
VersionedAnthropicSettingsContent::V1(
|
||||||
|
AnthropicSettingsContentV1 {
|
||||||
|
api_url,
|
||||||
|
available_models: None,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
AssistantProviderContentV1::Ollama { api_url, .. } => {
|
||||||
|
update_settings_file::<AllLanguageModelSettings>(
|
||||||
|
fs,
|
||||||
|
cx,
|
||||||
|
move |content, _| {
|
||||||
|
if content.ollama.is_none() {
|
||||||
|
content.ollama = Some(OllamaSettingsContent {
|
||||||
|
api_url,
|
||||||
|
available_models: None,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
AssistantProviderContentV1::OpenAi {
|
||||||
|
api_url,
|
||||||
|
available_models,
|
||||||
|
..
|
||||||
|
} => update_settings_file::<AllLanguageModelSettings>(
|
||||||
|
fs,
|
||||||
|
cx,
|
||||||
|
move |content, _| {
|
||||||
|
if content.openai.is_none() {
|
||||||
|
let available_models = available_models.map(|models| {
|
||||||
|
models
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|model| match model {
|
||||||
|
OpenAiModel::Custom {
|
||||||
|
name,
|
||||||
|
display_name,
|
||||||
|
max_tokens,
|
||||||
|
max_output_tokens,
|
||||||
|
max_completion_tokens: None,
|
||||||
|
} => Some(open_ai::AvailableModel {
|
||||||
|
name,
|
||||||
|
display_name,
|
||||||
|
max_tokens,
|
||||||
|
max_output_tokens,
|
||||||
|
max_completion_tokens: None,
|
||||||
|
}),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
});
|
||||||
|
content.openai = Some(OpenAiSettingsContent::Versioned(
|
||||||
|
VersionedOpenAiSettingsContent::V1(
|
||||||
|
OpenAiSettingsContentV1 {
|
||||||
|
api_url,
|
||||||
|
available_models,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*self = AssistantSettingsContent::Versioned(VersionedAssistantSettingsContent::V2(
|
||||||
|
self.upgrade(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn upgrade(&self) -> AssistantSettingsContentV2 {
|
||||||
|
match self {
|
||||||
|
AssistantSettingsContent::Versioned(settings) => match settings {
|
||||||
|
VersionedAssistantSettingsContent::V1(settings) => AssistantSettingsContentV2 {
|
||||||
|
enabled: settings.enabled,
|
||||||
|
button: settings.button,
|
||||||
|
dock: settings.dock,
|
||||||
|
default_width: settings.default_width,
|
||||||
|
default_height: settings.default_width,
|
||||||
|
default_model: settings
|
||||||
|
.provider
|
||||||
|
.clone()
|
||||||
|
.and_then(|provider| match provider {
|
||||||
|
AssistantProviderContentV1::ZedDotDev { default_model } => {
|
||||||
|
default_model.map(|model| LanguageModelSelection {
|
||||||
|
provider: "zed.dev".to_string(),
|
||||||
|
model: model.id().to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
AssistantProviderContentV1::OpenAi { default_model, .. } => {
|
||||||
|
default_model.map(|model| LanguageModelSelection {
|
||||||
|
provider: "openai".to_string(),
|
||||||
|
model: model.id().to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
AssistantProviderContentV1::Anthropic { default_model, .. } => {
|
||||||
|
default_model.map(|model| LanguageModelSelection {
|
||||||
|
provider: "anthropic".to_string(),
|
||||||
|
model: model.id().to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
AssistantProviderContentV1::Ollama { default_model, .. } => {
|
||||||
|
default_model.map(|model| LanguageModelSelection {
|
||||||
|
provider: "ollama".to_string(),
|
||||||
|
model: model.id().to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
inline_alternatives: None,
|
||||||
|
enable_experimental_live_diffs: None,
|
||||||
|
},
|
||||||
|
VersionedAssistantSettingsContent::V2(settings) => settings.clone(),
|
||||||
|
},
|
||||||
|
AssistantSettingsContent::Legacy(settings) => AssistantSettingsContentV2 {
|
||||||
|
enabled: None,
|
||||||
|
button: settings.button,
|
||||||
|
dock: settings.dock,
|
||||||
|
default_width: settings.default_width,
|
||||||
|
default_height: settings.default_height,
|
||||||
|
default_model: Some(LanguageModelSelection {
|
||||||
|
provider: "openai".to_string(),
|
||||||
|
model: settings
|
||||||
|
.default_open_ai_model
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.id()
|
||||||
|
.to_string(),
|
||||||
|
}),
|
||||||
|
inline_alternatives: None,
|
||||||
|
enable_experimental_live_diffs: None,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_dock(&mut self, dock: AssistantDockPosition) {
|
||||||
|
match self {
|
||||||
|
AssistantSettingsContent::Versioned(settings) => match settings {
|
||||||
|
VersionedAssistantSettingsContent::V1(settings) => {
|
||||||
|
settings.dock = Some(dock);
|
||||||
|
}
|
||||||
|
VersionedAssistantSettingsContent::V2(settings) => {
|
||||||
|
settings.dock = Some(dock);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
AssistantSettingsContent::Legacy(settings) => {
|
||||||
|
settings.dock = Some(dock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_model(&mut self, language_model: Arc<dyn LanguageModel>) {
|
||||||
|
let model = language_model.id().0.to_string();
|
||||||
|
let provider = language_model.provider_id().0.to_string();
|
||||||
|
|
||||||
|
match self {
|
||||||
|
AssistantSettingsContent::Versioned(settings) => match settings {
|
||||||
|
VersionedAssistantSettingsContent::V1(settings) => match provider.as_ref() {
|
||||||
|
"zed.dev" => {
|
||||||
|
log::warn!("attempted to set zed.dev model on outdated settings");
|
||||||
|
}
|
||||||
|
"anthropic" => {
|
||||||
|
let api_url = match &settings.provider {
|
||||||
|
Some(AssistantProviderContentV1::Anthropic { api_url, .. }) => {
|
||||||
|
api_url.clone()
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
settings.provider = Some(AssistantProviderContentV1::Anthropic {
|
||||||
|
default_model: AnthropicModel::from_id(&model).ok(),
|
||||||
|
api_url,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
"ollama" => {
|
||||||
|
let api_url = match &settings.provider {
|
||||||
|
Some(AssistantProviderContentV1::Ollama { api_url, .. }) => {
|
||||||
|
api_url.clone()
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
settings.provider = Some(AssistantProviderContentV1::Ollama {
|
||||||
|
default_model: Some(ollama::Model::new(&model, None, None)),
|
||||||
|
api_url,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
"openai" => {
|
||||||
|
let (api_url, available_models) = match &settings.provider {
|
||||||
|
Some(AssistantProviderContentV1::OpenAi {
|
||||||
|
api_url,
|
||||||
|
available_models,
|
||||||
|
..
|
||||||
|
}) => (api_url.clone(), available_models.clone()),
|
||||||
|
_ => (None, None),
|
||||||
|
};
|
||||||
|
settings.provider = Some(AssistantProviderContentV1::OpenAi {
|
||||||
|
default_model: OpenAiModel::from_id(&model).ok(),
|
||||||
|
api_url,
|
||||||
|
available_models,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
VersionedAssistantSettingsContent::V2(settings) => {
|
||||||
|
settings.default_model = Some(LanguageModelSelection { provider, model });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
AssistantSettingsContent::Legacy(settings) => {
|
||||||
|
if let Ok(model) = OpenAiModel::from_id(&language_model.id().0) {
|
||||||
|
settings.default_open_ai_model = Some(model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug)]
|
||||||
|
#[serde(tag = "version")]
|
||||||
|
pub enum VersionedAssistantSettingsContent {
|
||||||
|
#[serde(rename = "1")]
|
||||||
|
V1(AssistantSettingsContentV1),
|
||||||
|
#[serde(rename = "2")]
|
||||||
|
V2(AssistantSettingsContentV2),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for VersionedAssistantSettingsContent {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::V2(AssistantSettingsContentV2 {
|
||||||
|
enabled: None,
|
||||||
|
button: None,
|
||||||
|
dock: None,
|
||||||
|
default_width: None,
|
||||||
|
default_height: None,
|
||||||
|
default_model: None,
|
||||||
|
inline_alternatives: None,
|
||||||
|
enable_experimental_live_diffs: None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug)]
|
||||||
|
pub struct AssistantSettingsContentV2 {
|
||||||
|
/// Whether the Assistant is enabled.
|
||||||
|
///
|
||||||
|
/// Default: true
|
||||||
|
enabled: Option<bool>,
|
||||||
|
/// Whether to show the assistant panel button in the status bar.
|
||||||
|
///
|
||||||
|
/// Default: true
|
||||||
|
button: Option<bool>,
|
||||||
|
/// Where to dock the assistant.
|
||||||
|
///
|
||||||
|
/// Default: right
|
||||||
|
dock: Option<AssistantDockPosition>,
|
||||||
|
/// Default width in pixels when the assistant is docked to the left or right.
|
||||||
|
///
|
||||||
|
/// Default: 640
|
||||||
|
default_width: Option<f32>,
|
||||||
|
/// Default height in pixels when the assistant is docked to the bottom.
|
||||||
|
///
|
||||||
|
/// Default: 320
|
||||||
|
default_height: Option<f32>,
|
||||||
|
/// The default model to use when creating new chats.
|
||||||
|
default_model: Option<LanguageModelSelection>,
|
||||||
|
/// Additional models with which to generate alternatives when performing inline assists.
|
||||||
|
inline_alternatives: Option<Vec<LanguageModelSelection>>,
|
||||||
|
/// Enable experimental live diffs in the assistant panel.
|
||||||
|
///
|
||||||
|
/// Default: false
|
||||||
|
enable_experimental_live_diffs: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
||||||
|
pub struct LanguageModelSelection {
|
||||||
|
#[schemars(schema_with = "providers_schema")]
|
||||||
|
pub provider: String,
|
||||||
|
pub model: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn providers_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
|
||||||
|
schemars::schema::SchemaObject {
|
||||||
|
enum_values: Some(vec![
|
||||||
|
"anthropic".into(),
|
||||||
|
"google".into(),
|
||||||
|
"ollama".into(),
|
||||||
|
"openai".into(),
|
||||||
|
"zed.dev".into(),
|
||||||
|
"copilot_chat".into(),
|
||||||
|
]),
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for LanguageModelSelection {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
provider: "openai".to_string(),
|
||||||
|
model: "gpt-4".to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug)]
|
||||||
|
pub struct AssistantSettingsContentV1 {
|
||||||
|
/// Whether the Assistant is enabled.
|
||||||
|
///
|
||||||
|
/// Default: true
|
||||||
|
enabled: Option<bool>,
|
||||||
|
/// Whether to show the assistant panel button in the status bar.
|
||||||
|
///
|
||||||
|
/// Default: true
|
||||||
|
button: Option<bool>,
|
||||||
|
/// Where to dock the assistant.
|
||||||
|
///
|
||||||
|
/// Default: right
|
||||||
|
dock: Option<AssistantDockPosition>,
|
||||||
|
/// Default width in pixels when the assistant is docked to the left or right.
|
||||||
|
///
|
||||||
|
/// Default: 640
|
||||||
|
default_width: Option<f32>,
|
||||||
|
/// Default height in pixels when the assistant is docked to the bottom.
|
||||||
|
///
|
||||||
|
/// Default: 320
|
||||||
|
default_height: Option<f32>,
|
||||||
|
/// The provider of the assistant service.
|
||||||
|
///
|
||||||
|
/// This can be "openai", "anthropic", "ollama", "zed.dev"
|
||||||
|
/// each with their respective default models and configurations.
|
||||||
|
provider: Option<AssistantProviderContentV1>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug)]
|
||||||
|
pub struct LegacyAssistantSettingsContent {
|
||||||
|
/// Whether to show the assistant panel button in the status bar.
|
||||||
|
///
|
||||||
|
/// Default: true
|
||||||
|
pub button: Option<bool>,
|
||||||
|
/// Where to dock the assistant.
|
||||||
|
///
|
||||||
|
/// Default: right
|
||||||
|
pub dock: Option<AssistantDockPosition>,
|
||||||
|
/// Default width in pixels when the assistant is docked to the left or right.
|
||||||
|
///
|
||||||
|
/// Default: 640
|
||||||
|
pub default_width: Option<f32>,
|
||||||
|
/// Default height in pixels when the assistant is docked to the bottom.
|
||||||
|
///
|
||||||
|
/// Default: 320
|
||||||
|
pub default_height: Option<f32>,
|
||||||
|
/// The default OpenAI model to use when creating new chats.
|
||||||
|
///
|
||||||
|
/// Default: gpt-4-1106-preview
|
||||||
|
pub default_open_ai_model: Option<OpenAiModel>,
|
||||||
|
/// OpenAI API base URL to use when creating new chats.
|
||||||
|
///
|
||||||
|
/// Default: https://api.openai.com/v1
|
||||||
|
pub openai_api_url: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Settings for AssistantSettings {
|
||||||
|
const KEY: Option<&'static str> = Some("assistant");
|
||||||
|
|
||||||
|
const PRESERVED_KEYS: Option<&'static [&'static str]> = Some(&["version"]);
|
||||||
|
|
||||||
|
type FileContent = AssistantSettingsContent;
|
||||||
|
|
||||||
|
fn load(
|
||||||
|
sources: SettingsSources<Self::FileContent>,
|
||||||
|
_: &mut gpui::AppContext,
|
||||||
|
) -> anyhow::Result<Self> {
|
||||||
|
let mut settings = AssistantSettings::default();
|
||||||
|
|
||||||
|
for value in sources.defaults_and_customizations() {
|
||||||
|
if value.is_version_outdated() {
|
||||||
|
settings.using_outdated_settings_version = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = value.upgrade();
|
||||||
|
merge(&mut settings.enabled, value.enabled);
|
||||||
|
merge(&mut settings.button, value.button);
|
||||||
|
merge(&mut settings.dock, value.dock);
|
||||||
|
merge(
|
||||||
|
&mut settings.default_width,
|
||||||
|
value.default_width.map(Into::into),
|
||||||
|
);
|
||||||
|
merge(
|
||||||
|
&mut settings.default_height,
|
||||||
|
value.default_height.map(Into::into),
|
||||||
|
);
|
||||||
|
merge(&mut settings.default_model, value.default_model);
|
||||||
|
merge(&mut settings.inline_alternatives, value.inline_alternatives);
|
||||||
|
merge(
|
||||||
|
&mut settings.enable_experimental_live_diffs,
|
||||||
|
value.enable_experimental_live_diffs,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(settings)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn merge<T>(target: &mut T, value: Option<T>) {
|
||||||
|
if let Some(value) = value {
|
||||||
|
*target = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use gpui::{ReadGlobal, TestAppContext};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_deserialize_assistant_settings_with_version(cx: &mut TestAppContext) {
|
||||||
|
let fs = fs::FakeFs::new(cx.executor().clone());
|
||||||
|
fs.create_dir(paths::settings_file().parent().unwrap())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
cx.update(|cx| {
|
||||||
|
let test_settings = settings::SettingsStore::test(cx);
|
||||||
|
cx.set_global(test_settings);
|
||||||
|
AssistantSettings::register(cx);
|
||||||
|
});
|
||||||
|
|
||||||
|
cx.update(|cx| {
|
||||||
|
assert!(!AssistantSettings::get_global(cx).using_outdated_settings_version);
|
||||||
|
assert_eq!(
|
||||||
|
AssistantSettings::get_global(cx).default_model,
|
||||||
|
LanguageModelSelection {
|
||||||
|
provider: "zed.dev".into(),
|
||||||
|
model: "claude-3-5-sonnet".into(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
cx.update(|cx| {
|
||||||
|
settings::SettingsStore::global(cx).update_settings_file::<AssistantSettings>(
|
||||||
|
fs.clone(),
|
||||||
|
|settings, _| {
|
||||||
|
*settings = AssistantSettingsContent::Versioned(
|
||||||
|
VersionedAssistantSettingsContent::V2(AssistantSettingsContentV2 {
|
||||||
|
default_model: Some(LanguageModelSelection {
|
||||||
|
provider: "test-provider".into(),
|
||||||
|
model: "gpt-99".into(),
|
||||||
|
}),
|
||||||
|
inline_alternatives: None,
|
||||||
|
enabled: None,
|
||||||
|
button: None,
|
||||||
|
dock: None,
|
||||||
|
default_width: None,
|
||||||
|
default_height: None,
|
||||||
|
enable_experimental_live_diffs: None,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
cx.run_until_parked();
|
||||||
|
|
||||||
|
let raw_settings_value = fs.load(paths::settings_file()).await.unwrap();
|
||||||
|
assert!(raw_settings_value.contains(r#""version": "2""#));
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct AssistantSettingsTest {
|
||||||
|
assistant: AssistantSettingsContent,
|
||||||
|
}
|
||||||
|
|
||||||
|
let assistant_settings: AssistantSettingsTest =
|
||||||
|
serde_json_lenient::from_str(&raw_settings_value).unwrap();
|
||||||
|
|
||||||
|
assert!(!assistant_settings.assistant.is_version_outdated());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +1,42 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod context_tests;
|
mod context_tests;
|
||||||
|
|
||||||
use crate::patch::{AssistantEdit, AssistantPatch, AssistantPatchStatus};
|
use crate::slash_command_working_set::SlashCommandWorkingSet;
|
||||||
|
use crate::{
|
||||||
|
prompts::PromptBuilder,
|
||||||
|
slash_command::{file_command::FileCommandMetadata, SlashCommandLine},
|
||||||
|
AssistantEdit, AssistantPatch, AssistantPatchStatus, MessageId, MessageStatus,
|
||||||
|
};
|
||||||
use anyhow::{anyhow, Context as _, Result};
|
use anyhow::{anyhow, Context as _, Result};
|
||||||
use assistant_slash_command::{
|
use assistant_slash_command::{
|
||||||
SlashCommandContent, SlashCommandEvent, SlashCommandLine, SlashCommandOutputSection,
|
SlashCommandContent, SlashCommandEvent, SlashCommandOutputSection, SlashCommandResult,
|
||||||
SlashCommandResult, SlashCommandWorkingSet,
|
|
||||||
};
|
};
|
||||||
use assistant_slash_commands::FileCommandMetadata;
|
use assistant_tool::ToolWorkingSet;
|
||||||
use client::{self, proto, telemetry::Telemetry};
|
use client::{self, proto, telemetry::Telemetry};
|
||||||
use clock::ReplicaId;
|
use clock::ReplicaId;
|
||||||
use collections::{HashMap, HashSet};
|
use collections::{HashMap, HashSet};
|
||||||
|
use feature_flags::{FeatureFlagAppExt, ToolUseFeatureFlag};
|
||||||
use fs::{Fs, RemoveOptions};
|
use fs::{Fs, RemoveOptions};
|
||||||
use futures::{future::Shared, FutureExt, StreamExt};
|
use futures::{future::Shared, FutureExt, StreamExt};
|
||||||
use gpui::{
|
use gpui::{
|
||||||
App, AppContext as _, Context, Entity, EventEmitter, RenderImage, SharedString, Subscription,
|
AppContext, Context as _, EventEmitter, Model, ModelContext, RenderImage, SharedString,
|
||||||
Task,
|
Subscription, Task,
|
||||||
};
|
};
|
||||||
|
|
||||||
use language::{AnchorRangeExt, Bias, Buffer, LanguageRegistry, OffsetRangeExt, Point, ToOffset};
|
use language::{AnchorRangeExt, Bias, Buffer, LanguageRegistry, OffsetRangeExt, Point, ToOffset};
|
||||||
use language_model::{
|
use language_model::{
|
||||||
report_assistant_event, LanguageModel, LanguageModelCacheConfiguration,
|
LanguageModel, LanguageModelCacheConfiguration, LanguageModelCompletionEvent,
|
||||||
LanguageModelCompletionEvent, LanguageModelImage, LanguageModelRegistry, LanguageModelRequest,
|
LanguageModelImage, LanguageModelRegistry, LanguageModelRequest, LanguageModelRequestMessage,
|
||||||
LanguageModelRequestMessage, LanguageModelToolUseId, MaxMonthlySpendReachedError,
|
LanguageModelRequestTool, LanguageModelToolResult, LanguageModelToolUse,
|
||||||
MessageContent, PaymentRequiredError, Role, StopReason,
|
LanguageModelToolUseId, MessageContent, Role, StopReason,
|
||||||
|
};
|
||||||
|
use language_models::{
|
||||||
|
provider::cloud::{MaxMonthlySpendReachedError, PaymentRequiredError},
|
||||||
|
report_assistant_event,
|
||||||
};
|
};
|
||||||
use open_ai::Model as OpenAiModel;
|
use open_ai::Model as OpenAiModel;
|
||||||
use paths::contexts_dir;
|
use paths::contexts_dir;
|
||||||
use project::Project;
|
use project::Project;
|
||||||
use prompt_library::PromptBuilder;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::{
|
use std::{
|
||||||
@@ -42,9 +51,9 @@ use std::{
|
|||||||
};
|
};
|
||||||
use telemetry_events::{AssistantEvent, AssistantKind, AssistantPhase};
|
use telemetry_events::{AssistantEvent, AssistantKind, AssistantPhase};
|
||||||
use text::{BufferSnapshot, ToPoint};
|
use text::{BufferSnapshot, ToPoint};
|
||||||
use ui::IconName;
|
|
||||||
use util::{post_inc, ResultExt, TryFutureExt};
|
use util::{post_inc, ResultExt, TryFutureExt};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
use workspace::ui::IconName;
|
||||||
|
|
||||||
#[derive(Clone, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
|
#[derive(Clone, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
|
||||||
pub struct ContextId(String);
|
pub struct ContextId(String);
|
||||||
@@ -63,64 +72,6 @@ impl ContextId {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
|
|
||||||
pub struct MessageId(pub clock::Lamport);
|
|
||||||
|
|
||||||
impl MessageId {
|
|
||||||
pub fn as_u64(self) -> u64 {
|
|
||||||
self.0.as_u64()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
|
||||||
pub enum MessageStatus {
|
|
||||||
Pending,
|
|
||||||
Done,
|
|
||||||
Error(SharedString),
|
|
||||||
Canceled,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MessageStatus {
|
|
||||||
pub fn from_proto(status: proto::ContextMessageStatus) -> MessageStatus {
|
|
||||||
match status.variant {
|
|
||||||
Some(proto::context_message_status::Variant::Pending(_)) => MessageStatus::Pending,
|
|
||||||
Some(proto::context_message_status::Variant::Done(_)) => MessageStatus::Done,
|
|
||||||
Some(proto::context_message_status::Variant::Error(error)) => {
|
|
||||||
MessageStatus::Error(error.message.into())
|
|
||||||
}
|
|
||||||
Some(proto::context_message_status::Variant::Canceled(_)) => MessageStatus::Canceled,
|
|
||||||
None => MessageStatus::Pending,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_proto(&self) -> proto::ContextMessageStatus {
|
|
||||||
match self {
|
|
||||||
MessageStatus::Pending => proto::ContextMessageStatus {
|
|
||||||
variant: Some(proto::context_message_status::Variant::Pending(
|
|
||||||
proto::context_message_status::Pending {},
|
|
||||||
)),
|
|
||||||
},
|
|
||||||
MessageStatus::Done => proto::ContextMessageStatus {
|
|
||||||
variant: Some(proto::context_message_status::Variant::Done(
|
|
||||||
proto::context_message_status::Done {},
|
|
||||||
)),
|
|
||||||
},
|
|
||||||
MessageStatus::Error(message) => proto::ContextMessageStatus {
|
|
||||||
variant: Some(proto::context_message_status::Variant::Error(
|
|
||||||
proto::context_message_status::Error {
|
|
||||||
message: message.to_string(),
|
|
||||||
},
|
|
||||||
)),
|
|
||||||
},
|
|
||||||
MessageStatus::Canceled => proto::ContextMessageStatus {
|
|
||||||
variant: Some(proto::context_message_status::Variant::Canceled(
|
|
||||||
proto::context_message_status::Canceled {},
|
|
||||||
)),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
pub enum RequestType {
|
pub enum RequestType {
|
||||||
/// Request a normal chat response from the model.
|
/// Request a normal chat response from the model.
|
||||||
@@ -432,6 +383,11 @@ pub enum ContextEvent {
|
|||||||
SlashCommandOutputSectionAdded {
|
SlashCommandOutputSectionAdded {
|
||||||
section: SlashCommandOutputSection<language::Anchor>,
|
section: SlashCommandOutputSection<language::Anchor>,
|
||||||
},
|
},
|
||||||
|
UsePendingTools,
|
||||||
|
ToolFinished {
|
||||||
|
tool_use_id: LanguageModelToolUseId,
|
||||||
|
output_range: Range<language::Anchor>,
|
||||||
|
},
|
||||||
Operation(ContextOperation),
|
Operation(ContextOperation),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,7 +422,7 @@ pub struct MessageCacheMetadata {
|
|||||||
pub struct MessageMetadata {
|
pub struct MessageMetadata {
|
||||||
pub role: Role,
|
pub role: Role,
|
||||||
pub status: MessageStatus,
|
pub status: MessageStatus,
|
||||||
pub timestamp: clock::Lamport,
|
pub(crate) timestamp: clock::Lamport,
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
pub cache: Option<MessageCacheMetadata>,
|
pub cache: Option<MessageCacheMetadata>,
|
||||||
}
|
}
|
||||||
@@ -517,12 +473,21 @@ pub enum Content {
|
|||||||
render_image: Arc<RenderImage>,
|
render_image: Arc<RenderImage>,
|
||||||
image: Shared<Task<Option<LanguageModelImage>>>,
|
image: Shared<Task<Option<LanguageModelImage>>>,
|
||||||
},
|
},
|
||||||
|
ToolUse {
|
||||||
|
range: Range<language::Anchor>,
|
||||||
|
tool_use: LanguageModelToolUse,
|
||||||
|
},
|
||||||
|
ToolResult {
|
||||||
|
range: Range<language::Anchor>,
|
||||||
|
tool_use_id: LanguageModelToolUseId,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Content {
|
impl Content {
|
||||||
fn range(&self) -> Range<language::Anchor> {
|
fn range(&self) -> Range<language::Anchor> {
|
||||||
match self {
|
match self {
|
||||||
Self::Image { anchor, .. } => *anchor..*anchor,
|
Self::Image { anchor, .. } => *anchor..*anchor,
|
||||||
|
Self::ToolUse { range, .. } | Self::ToolResult { range, .. } => range.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,18 +533,20 @@ pub enum XmlTagKind {
|
|||||||
Operation,
|
Operation,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AssistantContext {
|
pub struct Context {
|
||||||
id: ContextId,
|
id: ContextId,
|
||||||
timestamp: clock::Lamport,
|
timestamp: clock::Lamport,
|
||||||
version: clock::Global,
|
version: clock::Global,
|
||||||
pending_ops: Vec<ContextOperation>,
|
pending_ops: Vec<ContextOperation>,
|
||||||
operations: Vec<ContextOperation>,
|
operations: Vec<ContextOperation>,
|
||||||
buffer: Entity<Buffer>,
|
buffer: Model<Buffer>,
|
||||||
parsed_slash_commands: Vec<ParsedSlashCommand>,
|
parsed_slash_commands: Vec<ParsedSlashCommand>,
|
||||||
invoked_slash_commands: HashMap<InvokedSlashCommandId, InvokedSlashCommand>,
|
invoked_slash_commands: HashMap<InvokedSlashCommandId, InvokedSlashCommand>,
|
||||||
edits_since_last_parse: language::Subscription,
|
edits_since_last_parse: language::Subscription,
|
||||||
slash_commands: Arc<SlashCommandWorkingSet>,
|
pub(crate) slash_commands: Arc<SlashCommandWorkingSet>,
|
||||||
|
pub(crate) tools: Arc<ToolWorkingSet>,
|
||||||
slash_command_output_sections: Vec<SlashCommandOutputSection<language::Anchor>>,
|
slash_command_output_sections: Vec<SlashCommandOutputSection<language::Anchor>>,
|
||||||
|
pending_tool_uses_by_id: HashMap<LanguageModelToolUseId, PendingToolUse>,
|
||||||
message_anchors: Vec<MessageAnchor>,
|
message_anchors: Vec<MessageAnchor>,
|
||||||
contents: Vec<Content>,
|
contents: Vec<Content>,
|
||||||
messages_metadata: HashMap<MessageId, MessageMetadata>,
|
messages_metadata: HashMap<MessageId, MessageMetadata>,
|
||||||
@@ -597,7 +564,7 @@ pub struct AssistantContext {
|
|||||||
language_registry: Arc<LanguageRegistry>,
|
language_registry: Arc<LanguageRegistry>,
|
||||||
patches: Vec<AssistantPatch>,
|
patches: Vec<AssistantPatch>,
|
||||||
xml_tags: Vec<XmlTag>,
|
xml_tags: Vec<XmlTag>,
|
||||||
project: Option<Entity<Project>>,
|
project: Option<Model<Project>>,
|
||||||
prompt_builder: Arc<PromptBuilder>,
|
prompt_builder: Arc<PromptBuilder>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -623,16 +590,17 @@ impl ContextAnnotation for XmlTag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventEmitter<ContextEvent> for AssistantContext {}
|
impl EventEmitter<ContextEvent> for Context {}
|
||||||
|
|
||||||
impl AssistantContext {
|
impl Context {
|
||||||
pub fn local(
|
pub fn local(
|
||||||
language_registry: Arc<LanguageRegistry>,
|
language_registry: Arc<LanguageRegistry>,
|
||||||
project: Option<Entity<Project>>,
|
project: Option<Model<Project>>,
|
||||||
telemetry: Option<Arc<Telemetry>>,
|
telemetry: Option<Arc<Telemetry>>,
|
||||||
prompt_builder: Arc<PromptBuilder>,
|
prompt_builder: Arc<PromptBuilder>,
|
||||||
slash_commands: Arc<SlashCommandWorkingSet>,
|
slash_commands: Arc<SlashCommandWorkingSet>,
|
||||||
cx: &mut Context<Self>,
|
tools: Arc<ToolWorkingSet>,
|
||||||
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self::new(
|
Self::new(
|
||||||
ContextId::new(),
|
ContextId::new(),
|
||||||
@@ -641,6 +609,7 @@ impl AssistantContext {
|
|||||||
language_registry,
|
language_registry,
|
||||||
prompt_builder,
|
prompt_builder,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
project,
|
project,
|
||||||
telemetry,
|
telemetry,
|
||||||
cx,
|
cx,
|
||||||
@@ -655,11 +624,12 @@ impl AssistantContext {
|
|||||||
language_registry: Arc<LanguageRegistry>,
|
language_registry: Arc<LanguageRegistry>,
|
||||||
prompt_builder: Arc<PromptBuilder>,
|
prompt_builder: Arc<PromptBuilder>,
|
||||||
slash_commands: Arc<SlashCommandWorkingSet>,
|
slash_commands: Arc<SlashCommandWorkingSet>,
|
||||||
project: Option<Entity<Project>>,
|
tools: Arc<ToolWorkingSet>,
|
||||||
|
project: Option<Model<Project>>,
|
||||||
telemetry: Option<Arc<Telemetry>>,
|
telemetry: Option<Arc<Telemetry>>,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let buffer = cx.new(|_cx| {
|
let buffer = cx.new_model(|_cx| {
|
||||||
let buffer = Buffer::remote(
|
let buffer = Buffer::remote(
|
||||||
language::BufferId::new(1).unwrap(),
|
language::BufferId::new(1).unwrap(),
|
||||||
replica_id,
|
replica_id,
|
||||||
@@ -682,6 +652,7 @@ impl AssistantContext {
|
|||||||
messages_metadata: Default::default(),
|
messages_metadata: Default::default(),
|
||||||
parsed_slash_commands: Vec::new(),
|
parsed_slash_commands: Vec::new(),
|
||||||
invoked_slash_commands: HashMap::default(),
|
invoked_slash_commands: HashMap::default(),
|
||||||
|
pending_tool_uses_by_id: HashMap::default(),
|
||||||
slash_command_output_sections: Vec::new(),
|
slash_command_output_sections: Vec::new(),
|
||||||
edits_since_last_parse: edits_since_last_slash_command_parse,
|
edits_since_last_parse: edits_since_last_slash_command_parse,
|
||||||
summary: None,
|
summary: None,
|
||||||
@@ -699,6 +670,7 @@ impl AssistantContext {
|
|||||||
project,
|
project,
|
||||||
language_registry,
|
language_registry,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
patches: Vec::new(),
|
patches: Vec::new(),
|
||||||
xml_tags: Vec::new(),
|
xml_tags: Vec::new(),
|
||||||
prompt_builder,
|
prompt_builder,
|
||||||
@@ -728,7 +700,7 @@ impl AssistantContext {
|
|||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn serialize(&self, cx: &App) -> SavedContext {
|
pub(crate) fn serialize(&self, cx: &AppContext) -> SavedContext {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
SavedContext {
|
SavedContext {
|
||||||
id: Some(self.id.clone()),
|
id: Some(self.id.clone()),
|
||||||
@@ -775,9 +747,10 @@ impl AssistantContext {
|
|||||||
language_registry: Arc<LanguageRegistry>,
|
language_registry: Arc<LanguageRegistry>,
|
||||||
prompt_builder: Arc<PromptBuilder>,
|
prompt_builder: Arc<PromptBuilder>,
|
||||||
slash_commands: Arc<SlashCommandWorkingSet>,
|
slash_commands: Arc<SlashCommandWorkingSet>,
|
||||||
project: Option<Entity<Project>>,
|
tools: Arc<ToolWorkingSet>,
|
||||||
|
project: Option<Model<Project>>,
|
||||||
telemetry: Option<Arc<Telemetry>>,
|
telemetry: Option<Arc<Telemetry>>,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let id = saved_context.id.clone().unwrap_or_else(ContextId::new);
|
let id = saved_context.id.clone().unwrap_or_else(ContextId::new);
|
||||||
let mut this = Self::new(
|
let mut this = Self::new(
|
||||||
@@ -787,6 +760,7 @@ impl AssistantContext {
|
|||||||
language_registry,
|
language_registry,
|
||||||
prompt_builder,
|
prompt_builder,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
project,
|
project,
|
||||||
telemetry,
|
telemetry,
|
||||||
cx,
|
cx,
|
||||||
@@ -808,18 +782,18 @@ impl AssistantContext {
|
|||||||
self.timestamp.replica_id
|
self.timestamp.replica_id
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn version(&self, cx: &App) -> ContextVersion {
|
pub fn version(&self, cx: &AppContext) -> ContextVersion {
|
||||||
ContextVersion {
|
ContextVersion {
|
||||||
context: self.version.clone(),
|
context: self.version.clone(),
|
||||||
buffer: self.buffer.read(cx).version(),
|
buffer: self.buffer.read(cx).version(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn slash_commands(&self) -> &Arc<SlashCommandWorkingSet> {
|
pub fn set_capability(
|
||||||
&self.slash_commands
|
&mut self,
|
||||||
}
|
capability: language::Capability,
|
||||||
|
cx: &mut ModelContext<Self>,
|
||||||
pub fn set_capability(&mut self, capability: language::Capability, cx: &mut Context<Self>) {
|
) {
|
||||||
self.buffer
|
self.buffer
|
||||||
.update(cx, |buffer, cx| buffer.set_capability(capability, cx));
|
.update(cx, |buffer, cx| buffer.set_capability(capability, cx));
|
||||||
}
|
}
|
||||||
@@ -833,7 +807,7 @@ impl AssistantContext {
|
|||||||
pub fn serialize_ops(
|
pub fn serialize_ops(
|
||||||
&self,
|
&self,
|
||||||
since: &ContextVersion,
|
since: &ContextVersion,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Task<Vec<proto::ContextOperation>> {
|
) -> Task<Vec<proto::ContextOperation>> {
|
||||||
let buffer_ops = self
|
let buffer_ops = self
|
||||||
.buffer
|
.buffer
|
||||||
@@ -848,7 +822,7 @@ impl AssistantContext {
|
|||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
context_ops.extend(self.pending_ops.iter().cloned());
|
context_ops.extend(self.pending_ops.iter().cloned());
|
||||||
|
|
||||||
cx.background_spawn(async move {
|
cx.background_executor().spawn(async move {
|
||||||
let buffer_ops = buffer_ops.await;
|
let buffer_ops = buffer_ops.await;
|
||||||
context_ops.sort_unstable_by_key(|op| op.timestamp());
|
context_ops.sort_unstable_by_key(|op| op.timestamp());
|
||||||
buffer_ops
|
buffer_ops
|
||||||
@@ -868,7 +842,7 @@ impl AssistantContext {
|
|||||||
pub fn apply_ops(
|
pub fn apply_ops(
|
||||||
&mut self,
|
&mut self,
|
||||||
ops: impl IntoIterator<Item = ContextOperation>,
|
ops: impl IntoIterator<Item = ContextOperation>,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
let mut buffer_ops = Vec::new();
|
let mut buffer_ops = Vec::new();
|
||||||
for op in ops {
|
for op in ops {
|
||||||
@@ -882,7 +856,7 @@ impl AssistantContext {
|
|||||||
self.flush_ops(cx);
|
self.flush_ops(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn flush_ops(&mut self, cx: &mut Context<AssistantContext>) {
|
fn flush_ops(&mut self, cx: &mut ModelContext<Context>) {
|
||||||
let mut changed_messages = HashSet::default();
|
let mut changed_messages = HashSet::default();
|
||||||
let mut summary_changed = false;
|
let mut summary_changed = false;
|
||||||
|
|
||||||
@@ -1001,7 +975,7 @@ impl AssistantContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn can_apply_op(&self, op: &ContextOperation, cx: &App) -> bool {
|
fn can_apply_op(&self, op: &ContextOperation, cx: &AppContext) -> bool {
|
||||||
if !self.version.observed_all(op.version()) {
|
if !self.version.observed_all(op.version()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1032,7 +1006,7 @@ impl AssistantContext {
|
|||||||
fn has_received_operations_for_anchor_range(
|
fn has_received_operations_for_anchor_range(
|
||||||
&self,
|
&self,
|
||||||
range: Range<text::Anchor>,
|
range: Range<text::Anchor>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let version = &self.buffer.read(cx).version;
|
let version = &self.buffer.read(cx).version;
|
||||||
let observed_start = range.start == language::Anchor::MIN
|
let observed_start = range.start == language::Anchor::MIN
|
||||||
@@ -1044,12 +1018,12 @@ impl AssistantContext {
|
|||||||
observed_start && observed_end
|
observed_start && observed_end
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_op(&mut self, op: ContextOperation, cx: &mut Context<Self>) {
|
fn push_op(&mut self, op: ContextOperation, cx: &mut ModelContext<Self>) {
|
||||||
self.operations.push(op.clone());
|
self.operations.push(op.clone());
|
||||||
cx.emit(ContextEvent::Operation(op));
|
cx.emit(ContextEvent::Operation(op));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn buffer(&self) -> &Entity<Buffer> {
|
pub fn buffer(&self) -> &Model<Buffer> {
|
||||||
&self.buffer
|
&self.buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1057,7 +1031,7 @@ impl AssistantContext {
|
|||||||
self.language_registry.clone()
|
self.language_registry.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn project(&self) -> Option<Entity<Project>> {
|
pub fn project(&self) -> Option<Model<Project>> {
|
||||||
self.project.clone()
|
self.project.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1073,7 +1047,11 @@ impl AssistantContext {
|
|||||||
self.summary.as_ref()
|
self.summary.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn patch_containing(&self, position: Point, cx: &App) -> Option<&AssistantPatch> {
|
pub(crate) fn patch_containing(
|
||||||
|
&self,
|
||||||
|
position: Point,
|
||||||
|
cx: &AppContext,
|
||||||
|
) -> Option<&AssistantPatch> {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
let index = self.patches.binary_search_by(|patch| {
|
let index = self.patches.binary_search_by(|patch| {
|
||||||
let patch_range = patch.range.to_point(&buffer);
|
let patch_range = patch.range.to_point(&buffer);
|
||||||
@@ -1096,10 +1074,10 @@ impl AssistantContext {
|
|||||||
self.patches.iter().map(|patch| patch.range.clone())
|
self.patches.iter().map(|patch| patch.range.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn patch_for_range(
|
pub(crate) fn patch_for_range(
|
||||||
&self,
|
&self,
|
||||||
range: &Range<language::Anchor>,
|
range: &Range<language::Anchor>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Option<&AssistantPatch> {
|
) -> Option<&AssistantPatch> {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
let index = self.patch_index_for_range(range, buffer).ok()?;
|
let index = self.patch_index_for_range(range, buffer).ok()?;
|
||||||
@@ -1130,7 +1108,7 @@ impl AssistantContext {
|
|||||||
&self.slash_command_output_sections
|
&self.slash_command_output_sections
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn contains_files(&self, cx: &App) -> bool {
|
pub fn contains_files(&self, cx: &AppContext) -> bool {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
self.slash_command_output_sections.iter().any(|section| {
|
self.slash_command_output_sections.iter().any(|section| {
|
||||||
section.is_valid(buffer)
|
section.is_valid(buffer)
|
||||||
@@ -1144,7 +1122,15 @@ impl AssistantContext {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_language(&mut self, cx: &mut Context<Self>) {
|
pub fn pending_tool_uses(&self) -> Vec<&PendingToolUse> {
|
||||||
|
self.pending_tool_uses_by_id.values().collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_tool_use_by_id(&self, id: &LanguageModelToolUseId) -> Option<&PendingToolUse> {
|
||||||
|
self.pending_tool_uses_by_id.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_language(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
let markdown = self.language_registry.language_for_name("Markdown");
|
let markdown = self.language_registry.language_for_name("Markdown");
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
let markdown = markdown.await?;
|
let markdown = markdown.await?;
|
||||||
@@ -1158,9 +1144,9 @@ impl AssistantContext {
|
|||||||
|
|
||||||
fn handle_buffer_event(
|
fn handle_buffer_event(
|
||||||
&mut self,
|
&mut self,
|
||||||
_: Entity<Buffer>,
|
_: Model<Buffer>,
|
||||||
event: &language::BufferEvent,
|
event: &language::BufferEvent,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
match event {
|
match event {
|
||||||
language::BufferEvent::Operation {
|
language::BufferEvent::Operation {
|
||||||
@@ -1178,25 +1164,22 @@ impl AssistantContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn token_count(&self) -> Option<usize> {
|
pub(crate) fn token_count(&self) -> Option<usize> {
|
||||||
self.token_count
|
self.token_count
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn count_remaining_tokens(&mut self, cx: &mut Context<Self>) {
|
pub(crate) fn count_remaining_tokens(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
// Assume it will be a Chat request, even though that takes fewer tokens (and risks going over the limit),
|
// Assume it will be a Chat request, even though that takes fewer tokens (and risks going over the limit),
|
||||||
// because otherwise you see in the UI that your empty message has a bunch of tokens already used.
|
// because otherwise you see in the UI that your empty message has a bunch of tokens already used.
|
||||||
let request = self.to_completion_request(RequestType::Chat, cx);
|
let request = self.to_completion_request(RequestType::Chat, cx);
|
||||||
let Some(model) = LanguageModelRegistry::read_global(cx).active_model() else {
|
let Some(model) = LanguageModelRegistry::read_global(cx).active_model() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let debounce = self.token_count.is_some();
|
|
||||||
self.pending_token_count = cx.spawn(|this, mut cx| {
|
self.pending_token_count = cx.spawn(|this, mut cx| {
|
||||||
async move {
|
async move {
|
||||||
if debounce {
|
cx.background_executor()
|
||||||
cx.background_executor()
|
.timer(Duration::from_millis(200))
|
||||||
.timer(Duration::from_millis(200))
|
.await;
|
||||||
.await;
|
|
||||||
}
|
|
||||||
|
|
||||||
let token_count = cx.update(|cx| model.count_tokens(request, cx))?.await?;
|
let token_count = cx.update(|cx| model.count_tokens(request, cx))?.await?;
|
||||||
this.update(&mut cx, |this, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
@@ -1213,7 +1196,7 @@ impl AssistantContext {
|
|||||||
&mut self,
|
&mut self,
|
||||||
cache_configuration: &Option<LanguageModelCacheConfiguration>,
|
cache_configuration: &Option<LanguageModelCacheConfiguration>,
|
||||||
speculative: bool,
|
speculative: bool,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let cache_configuration =
|
let cache_configuration =
|
||||||
cache_configuration
|
cache_configuration
|
||||||
@@ -1315,7 +1298,7 @@ impl AssistantContext {
|
|||||||
new_anchor_needs_caching
|
new_anchor_needs_caching
|
||||||
}
|
}
|
||||||
|
|
||||||
fn start_cache_warming(&mut self, model: &Arc<dyn LanguageModel>, cx: &mut Context<Self>) {
|
fn start_cache_warming(&mut self, model: &Arc<dyn LanguageModel>, cx: &mut ModelContext<Self>) {
|
||||||
let cache_configuration = model.cache_configuration();
|
let cache_configuration = model.cache_configuration();
|
||||||
|
|
||||||
if !self.mark_cache_anchors(&cache_configuration, true, cx) {
|
if !self.mark_cache_anchors(&cache_configuration, true, cx) {
|
||||||
@@ -1365,7 +1348,7 @@ impl AssistantContext {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_cache_status_for_completion(&mut self, cx: &mut Context<Self>) {
|
pub fn update_cache_status_for_completion(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
let cached_message_ids: Vec<MessageId> = self
|
let cached_message_ids: Vec<MessageId> = self
|
||||||
.messages_metadata
|
.messages_metadata
|
||||||
.iter()
|
.iter()
|
||||||
@@ -1390,7 +1373,7 @@ impl AssistantContext {
|
|||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reparse(&mut self, cx: &mut Context<Self>) {
|
pub fn reparse(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
let buffer = self.buffer.read(cx).text_snapshot();
|
let buffer = self.buffer.read(cx).text_snapshot();
|
||||||
let mut row_ranges = self
|
let mut row_ranges = self
|
||||||
.edits_since_last_parse
|
.edits_since_last_parse
|
||||||
@@ -1463,7 +1446,7 @@ impl AssistantContext {
|
|||||||
buffer: &BufferSnapshot,
|
buffer: &BufferSnapshot,
|
||||||
updated: &mut Vec<ParsedSlashCommand>,
|
updated: &mut Vec<ParsedSlashCommand>,
|
||||||
removed: &mut Vec<Range<text::Anchor>>,
|
removed: &mut Vec<Range<text::Anchor>>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) {
|
) {
|
||||||
let old_range = self.pending_command_indices_for_range(range.clone(), cx);
|
let old_range = self.pending_command_indices_for_range(range.clone(), cx);
|
||||||
|
|
||||||
@@ -1517,7 +1500,7 @@ impl AssistantContext {
|
|||||||
fn invalidate_pending_slash_commands(
|
fn invalidate_pending_slash_commands(
|
||||||
&mut self,
|
&mut self,
|
||||||
buffer: &BufferSnapshot,
|
buffer: &BufferSnapshot,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
let mut invalidated_command_ids = Vec::new();
|
let mut invalidated_command_ids = Vec::new();
|
||||||
for (&command_id, command) in self.invoked_slash_commands.iter_mut() {
|
for (&command_id, command) in self.invoked_slash_commands.iter_mut() {
|
||||||
@@ -1551,7 +1534,7 @@ impl AssistantContext {
|
|||||||
buffer: &BufferSnapshot,
|
buffer: &BufferSnapshot,
|
||||||
updated: &mut Vec<Range<text::Anchor>>,
|
updated: &mut Vec<Range<text::Anchor>>,
|
||||||
removed: &mut Vec<Range<text::Anchor>>,
|
removed: &mut Vec<Range<text::Anchor>>,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
// Rebuild the XML tags in the edited range.
|
// Rebuild the XML tags in the edited range.
|
||||||
let intersecting_tags_range =
|
let intersecting_tags_range =
|
||||||
@@ -1594,7 +1577,7 @@ impl AssistantContext {
|
|||||||
&self,
|
&self,
|
||||||
buffer: &BufferSnapshot,
|
buffer: &BufferSnapshot,
|
||||||
range: Range<text::Anchor>,
|
range: Range<text::Anchor>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Vec<XmlTag> {
|
) -> Vec<XmlTag> {
|
||||||
let mut messages = self.messages(cx).peekable();
|
let mut messages = self.messages(cx).peekable();
|
||||||
|
|
||||||
@@ -1651,7 +1634,7 @@ impl AssistantContext {
|
|||||||
tags_start_ix: usize,
|
tags_start_ix: usize,
|
||||||
buffer_end: text::Anchor,
|
buffer_end: text::Anchor,
|
||||||
buffer: &BufferSnapshot,
|
buffer: &BufferSnapshot,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Vec<AssistantPatch> {
|
) -> Vec<AssistantPatch> {
|
||||||
let mut new_patches = Vec::new();
|
let mut new_patches = Vec::new();
|
||||||
let mut pending_patch = None;
|
let mut pending_patch = None;
|
||||||
@@ -1809,7 +1792,7 @@ impl AssistantContext {
|
|||||||
pub fn pending_command_for_position(
|
pub fn pending_command_for_position(
|
||||||
&mut self,
|
&mut self,
|
||||||
position: language::Anchor,
|
position: language::Anchor,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Option<&mut ParsedSlashCommand> {
|
) -> Option<&mut ParsedSlashCommand> {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
match self
|
match self
|
||||||
@@ -1833,7 +1816,7 @@ impl AssistantContext {
|
|||||||
pub fn pending_commands_for_range(
|
pub fn pending_commands_for_range(
|
||||||
&self,
|
&self,
|
||||||
range: Range<language::Anchor>,
|
range: Range<language::Anchor>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> &[ParsedSlashCommand] {
|
) -> &[ParsedSlashCommand] {
|
||||||
let range = self.pending_command_indices_for_range(range, cx);
|
let range = self.pending_command_indices_for_range(range, cx);
|
||||||
&self.parsed_slash_commands[range]
|
&self.parsed_slash_commands[range]
|
||||||
@@ -1842,7 +1825,7 @@ impl AssistantContext {
|
|||||||
fn pending_command_indices_for_range(
|
fn pending_command_indices_for_range(
|
||||||
&self,
|
&self,
|
||||||
range: Range<language::Anchor>,
|
range: Range<language::Anchor>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Range<usize> {
|
) -> Range<usize> {
|
||||||
self.indices_intersecting_buffer_range(&self.parsed_slash_commands, range, cx)
|
self.indices_intersecting_buffer_range(&self.parsed_slash_commands, range, cx)
|
||||||
}
|
}
|
||||||
@@ -1851,7 +1834,7 @@ impl AssistantContext {
|
|||||||
&self,
|
&self,
|
||||||
all_annotations: &[T],
|
all_annotations: &[T],
|
||||||
range: Range<language::Anchor>,
|
range: Range<language::Anchor>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Range<usize> {
|
) -> Range<usize> {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
let start_ix = match all_annotations
|
let start_ix = match all_annotations
|
||||||
@@ -1874,7 +1857,7 @@ impl AssistantContext {
|
|||||||
name: &str,
|
name: &str,
|
||||||
output: Task<SlashCommandResult>,
|
output: Task<SlashCommandResult>,
|
||||||
ensure_trailing_newline: bool,
|
ensure_trailing_newline: bool,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
let version = self.version.clone();
|
let version = self.version.clone();
|
||||||
let command_id = InvokedSlashCommandId(self.next_timestamp());
|
let command_id = InvokedSlashCommandId(self.next_timestamp());
|
||||||
@@ -2142,7 +2125,7 @@ impl AssistantContext {
|
|||||||
fn insert_slash_command_output_section(
|
fn insert_slash_command_output_section(
|
||||||
&mut self,
|
&mut self,
|
||||||
section: SlashCommandOutputSection<language::Anchor>,
|
section: SlashCommandOutputSection<language::Anchor>,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
let insertion_ix = match self
|
let insertion_ix = match self
|
||||||
@@ -2168,11 +2151,73 @@ impl AssistantContext {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn completion_provider_changed(&mut self, cx: &mut Context<Self>) {
|
pub fn insert_tool_output(
|
||||||
|
&mut self,
|
||||||
|
tool_use_id: LanguageModelToolUseId,
|
||||||
|
output: Task<Result<String>>,
|
||||||
|
cx: &mut ModelContext<Self>,
|
||||||
|
) {
|
||||||
|
let insert_output_task = cx.spawn(|this, mut cx| {
|
||||||
|
let tool_use_id = tool_use_id.clone();
|
||||||
|
async move {
|
||||||
|
let output = output.await;
|
||||||
|
this.update(&mut cx, |this, cx| match output {
|
||||||
|
Ok(mut output) => {
|
||||||
|
const NEWLINE: char = '\n';
|
||||||
|
|
||||||
|
if !output.ends_with(NEWLINE) {
|
||||||
|
output.push(NEWLINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
let anchor_range = this.buffer.update(cx, |buffer, cx| {
|
||||||
|
let insert_start = buffer.len().to_offset(buffer);
|
||||||
|
let insert_end = insert_start;
|
||||||
|
|
||||||
|
let start = insert_start;
|
||||||
|
let end = start + output.len() - NEWLINE.len_utf8();
|
||||||
|
|
||||||
|
buffer.edit([(insert_start..insert_end, output)], None, cx);
|
||||||
|
|
||||||
|
let output_range = buffer.anchor_after(start)..buffer.anchor_after(end);
|
||||||
|
|
||||||
|
output_range
|
||||||
|
});
|
||||||
|
|
||||||
|
this.insert_content(
|
||||||
|
Content::ToolResult {
|
||||||
|
range: anchor_range.clone(),
|
||||||
|
tool_use_id: tool_use_id.clone(),
|
||||||
|
},
|
||||||
|
cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
cx.emit(ContextEvent::ToolFinished {
|
||||||
|
tool_use_id,
|
||||||
|
output_range: anchor_range,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
if let Some(tool_use) = this.pending_tool_uses_by_id.get_mut(&tool_use_id) {
|
||||||
|
tool_use.status = PendingToolUseStatus::Error(err.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(tool_use) = self.pending_tool_uses_by_id.get_mut(&tool_use_id) {
|
||||||
|
tool_use.status = PendingToolUseStatus::Running {
|
||||||
|
_task: insert_output_task.shared(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn completion_provider_changed(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
self.count_remaining_tokens(cx);
|
self.count_remaining_tokens(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_last_valid_message_id(&self, cx: &Context<Self>) -> Option<MessageId> {
|
fn get_last_valid_message_id(&self, cx: &ModelContext<Self>) -> Option<MessageId> {
|
||||||
self.message_anchors.iter().rev().find_map(|message| {
|
self.message_anchors.iter().rev().find_map(|message| {
|
||||||
message
|
message
|
||||||
.start
|
.start
|
||||||
@@ -2184,7 +2229,7 @@ impl AssistantContext {
|
|||||||
pub fn assist(
|
pub fn assist(
|
||||||
&mut self,
|
&mut self,
|
||||||
request_type: RequestType,
|
request_type: RequestType,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Option<MessageAnchor> {
|
) -> Option<MessageAnchor> {
|
||||||
let model_registry = LanguageModelRegistry::read_global(cx);
|
let model_registry = LanguageModelRegistry::read_global(cx);
|
||||||
let provider = model_registry.active_provider()?;
|
let provider = model_registry.active_provider()?;
|
||||||
@@ -2198,7 +2243,20 @@ impl AssistantContext {
|
|||||||
// Compute which messages to cache, including the last one.
|
// Compute which messages to cache, including the last one.
|
||||||
self.mark_cache_anchors(&model.cache_configuration(), false, cx);
|
self.mark_cache_anchors(&model.cache_configuration(), false, cx);
|
||||||
|
|
||||||
let request = self.to_completion_request(request_type, cx);
|
let mut request = self.to_completion_request(request_type, cx);
|
||||||
|
|
||||||
|
if cx.has_flag::<ToolUseFeatureFlag>() {
|
||||||
|
request.tools = self
|
||||||
|
.tools
|
||||||
|
.tools(cx)
|
||||||
|
.into_iter()
|
||||||
|
.map(|tool| LanguageModelRequestTool {
|
||||||
|
name: tool.name(),
|
||||||
|
description: tool.description(),
|
||||||
|
input_schema: tool.input_schema(),
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
let assistant_message = self
|
let assistant_message = self
|
||||||
.insert_message_after(last_message_id, Role::Assistant, MessageStatus::Pending, cx)
|
.insert_message_after(last_message_id, Role::Assistant, MessageStatus::Pending, cx)
|
||||||
@@ -2255,7 +2313,44 @@ impl AssistantContext {
|
|||||||
cx,
|
cx,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
LanguageModelCompletionEvent::ToolUse(_) => {}
|
LanguageModelCompletionEvent::ToolUse(tool_use) => {
|
||||||
|
const NEWLINE: char = '\n';
|
||||||
|
|
||||||
|
let mut text = String::new();
|
||||||
|
text.push(NEWLINE);
|
||||||
|
text.push_str(
|
||||||
|
&serde_json::to_string_pretty(&tool_use)
|
||||||
|
.expect("failed to serialize tool use to JSON"),
|
||||||
|
);
|
||||||
|
text.push(NEWLINE);
|
||||||
|
let text_len = text.len();
|
||||||
|
|
||||||
|
buffer.edit(
|
||||||
|
[(
|
||||||
|
message_old_end_offset..message_old_end_offset,
|
||||||
|
text,
|
||||||
|
)],
|
||||||
|
None,
|
||||||
|
cx,
|
||||||
|
);
|
||||||
|
|
||||||
|
let start_ix = message_old_end_offset + NEWLINE.len_utf8();
|
||||||
|
let end_ix =
|
||||||
|
message_old_end_offset + text_len - NEWLINE.len_utf8();
|
||||||
|
let source_range = buffer.anchor_after(start_ix)
|
||||||
|
..buffer.anchor_after(end_ix);
|
||||||
|
|
||||||
|
this.pending_tool_uses_by_id.insert(
|
||||||
|
tool_use.id.clone(),
|
||||||
|
PendingToolUse {
|
||||||
|
id: tool_use.id,
|
||||||
|
name: tool_use.name,
|
||||||
|
input: tool_use.input,
|
||||||
|
status: PendingToolUseStatus::Idle,
|
||||||
|
source_range,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -2338,7 +2433,9 @@ impl AssistantContext {
|
|||||||
|
|
||||||
if let Ok(stop_reason) = result {
|
if let Ok(stop_reason) = result {
|
||||||
match stop_reason {
|
match stop_reason {
|
||||||
StopReason::ToolUse => {}
|
StopReason::ToolUse => {
|
||||||
|
cx.emit(ContextEvent::UsePendingTools);
|
||||||
|
}
|
||||||
StopReason::EndTurn => {}
|
StopReason::EndTurn => {}
|
||||||
StopReason::MaxTokens => {}
|
StopReason::MaxTokens => {}
|
||||||
}
|
}
|
||||||
@@ -2360,7 +2457,7 @@ impl AssistantContext {
|
|||||||
pub fn to_completion_request(
|
pub fn to_completion_request(
|
||||||
&self,
|
&self,
|
||||||
request_type: RequestType,
|
request_type: RequestType,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> LanguageModelRequest {
|
) -> LanguageModelRequest {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
|
|
||||||
@@ -2417,6 +2514,23 @@ impl AssistantContext {
|
|||||||
.push(language_model::MessageContent::Image(image));
|
.push(language_model::MessageContent::Image(image));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Content::ToolUse { tool_use, .. } => {
|
||||||
|
request_message
|
||||||
|
.content
|
||||||
|
.push(language_model::MessageContent::ToolUse(tool_use.clone()));
|
||||||
|
}
|
||||||
|
Content::ToolResult { tool_use_id, .. } => {
|
||||||
|
request_message.content.push(
|
||||||
|
language_model::MessageContent::ToolResult(
|
||||||
|
LanguageModelToolResult {
|
||||||
|
tool_use_id: tool_use_id.to_string(),
|
||||||
|
is_error: false,
|
||||||
|
content: collect_text_content(buffer, range.clone())
|
||||||
|
.unwrap_or_default(),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = range.end;
|
offset = range.end;
|
||||||
@@ -2455,7 +2569,7 @@ impl AssistantContext {
|
|||||||
completion_request
|
completion_request
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cancel_last_assist(&mut self, cx: &mut Context<Self>) -> bool {
|
pub fn cancel_last_assist(&mut self, cx: &mut ModelContext<Self>) -> bool {
|
||||||
if let Some(pending_completion) = self.pending_completions.pop() {
|
if let Some(pending_completion) = self.pending_completions.pop() {
|
||||||
self.update_metadata(pending_completion.assistant_message_id, cx, |metadata| {
|
self.update_metadata(pending_completion.assistant_message_id, cx, |metadata| {
|
||||||
if metadata.status == MessageStatus::Pending {
|
if metadata.status == MessageStatus::Pending {
|
||||||
@@ -2468,7 +2582,7 @@ impl AssistantContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cycle_message_roles(&mut self, ids: HashSet<MessageId>, cx: &mut Context<Self>) {
|
pub fn cycle_message_roles(&mut self, ids: HashSet<MessageId>, cx: &mut ModelContext<Self>) {
|
||||||
for id in &ids {
|
for id in &ids {
|
||||||
if let Some(metadata) = self.messages_metadata.get(id) {
|
if let Some(metadata) = self.messages_metadata.get(id) {
|
||||||
let role = metadata.role.cycle();
|
let role = metadata.role.cycle();
|
||||||
@@ -2479,7 +2593,7 @@ impl AssistantContext {
|
|||||||
self.message_roles_updated(ids, cx);
|
self.message_roles_updated(ids, cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn message_roles_updated(&mut self, ids: HashSet<MessageId>, cx: &mut Context<Self>) {
|
fn message_roles_updated(&mut self, ids: HashSet<MessageId>, cx: &mut ModelContext<Self>) {
|
||||||
let mut ranges = Vec::new();
|
let mut ranges = Vec::new();
|
||||||
for message in self.messages(cx) {
|
for message in self.messages(cx) {
|
||||||
if ids.contains(&message.id) {
|
if ids.contains(&message.id) {
|
||||||
@@ -2502,7 +2616,7 @@ impl AssistantContext {
|
|||||||
pub fn update_metadata(
|
pub fn update_metadata(
|
||||||
&mut self,
|
&mut self,
|
||||||
id: MessageId,
|
id: MessageId,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
f: impl FnOnce(&mut MessageMetadata),
|
f: impl FnOnce(&mut MessageMetadata),
|
||||||
) {
|
) {
|
||||||
let version = self.version.clone();
|
let version = self.version.clone();
|
||||||
@@ -2526,7 +2640,7 @@ impl AssistantContext {
|
|||||||
message_id: MessageId,
|
message_id: MessageId,
|
||||||
role: Role,
|
role: Role,
|
||||||
status: MessageStatus,
|
status: MessageStatus,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Option<MessageAnchor> {
|
) -> Option<MessageAnchor> {
|
||||||
if let Some(prev_message_ix) = self
|
if let Some(prev_message_ix) = self
|
||||||
.message_anchors
|
.message_anchors
|
||||||
@@ -2560,7 +2674,7 @@ impl AssistantContext {
|
|||||||
offset: usize,
|
offset: usize,
|
||||||
role: Role,
|
role: Role,
|
||||||
status: MessageStatus,
|
status: MessageStatus,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> MessageAnchor {
|
) -> MessageAnchor {
|
||||||
let start = self.buffer.update(cx, |buffer, cx| {
|
let start = self.buffer.update(cx, |buffer, cx| {
|
||||||
buffer.edit([(offset..offset, "\n")], None, cx);
|
buffer.edit([(offset..offset, "\n")], None, cx);
|
||||||
@@ -2590,7 +2704,7 @@ impl AssistantContext {
|
|||||||
anchor
|
anchor
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_content(&mut self, content: Content, cx: &mut Context<Self>) {
|
pub fn insert_content(&mut self, content: Content, cx: &mut ModelContext<Self>) {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
let insertion_ix = match self
|
let insertion_ix = match self
|
||||||
.contents
|
.contents
|
||||||
@@ -2606,7 +2720,7 @@ impl AssistantContext {
|
|||||||
cx.emit(ContextEvent::MessagesEdited);
|
cx.emit(ContextEvent::MessagesEdited);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn contents<'a>(&'a self, cx: &'a App) -> impl 'a + Iterator<Item = Content> {
|
pub fn contents<'a>(&'a self, cx: &'a AppContext) -> impl 'a + Iterator<Item = Content> {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
self.contents
|
self.contents
|
||||||
.iter()
|
.iter()
|
||||||
@@ -2620,7 +2734,7 @@ impl AssistantContext {
|
|||||||
pub fn split_message(
|
pub fn split_message(
|
||||||
&mut self,
|
&mut self,
|
||||||
range: Range<usize>,
|
range: Range<usize>,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> (Option<MessageAnchor>, Option<MessageAnchor>) {
|
) -> (Option<MessageAnchor>, Option<MessageAnchor>) {
|
||||||
let start_message = self.message_for_offset(range.start, cx);
|
let start_message = self.message_for_offset(range.start, cx);
|
||||||
let end_message = self.message_for_offset(range.end, cx);
|
let end_message = self.message_for_offset(range.end, cx);
|
||||||
@@ -2746,7 +2860,7 @@ impl AssistantContext {
|
|||||||
&mut self,
|
&mut self,
|
||||||
new_anchor: MessageAnchor,
|
new_anchor: MessageAnchor,
|
||||||
new_metadata: MessageMetadata,
|
new_metadata: MessageMetadata,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
cx.emit(ContextEvent::MessagesEdited);
|
cx.emit(ContextEvent::MessagesEdited);
|
||||||
|
|
||||||
@@ -2764,7 +2878,7 @@ impl AssistantContext {
|
|||||||
self.message_anchors.insert(insertion_ix, new_anchor);
|
self.message_anchors.insert(insertion_ix, new_anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn summarize(&mut self, replace_old: bool, cx: &mut Context<Self>) {
|
pub(super) fn summarize(&mut self, replace_old: bool, cx: &mut ModelContext<Self>) {
|
||||||
let Some(provider) = LanguageModelRegistry::read_global(cx).active_provider() else {
|
let Some(provider) = LanguageModelRegistry::read_global(cx).active_provider() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
@@ -2842,14 +2956,14 @@ impl AssistantContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn message_for_offset(&self, offset: usize, cx: &App) -> Option<Message> {
|
fn message_for_offset(&self, offset: usize, cx: &AppContext) -> Option<Message> {
|
||||||
self.messages_for_offsets([offset], cx).pop()
|
self.messages_for_offsets([offset], cx).pop()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn messages_for_offsets(
|
pub fn messages_for_offsets(
|
||||||
&self,
|
&self,
|
||||||
offsets: impl IntoIterator<Item = usize>,
|
offsets: impl IntoIterator<Item = usize>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Vec<Message> {
|
) -> Vec<Message> {
|
||||||
let mut result = Vec::new();
|
let mut result = Vec::new();
|
||||||
|
|
||||||
@@ -2882,14 +2996,14 @@ impl AssistantContext {
|
|||||||
fn messages_from_anchors<'a>(
|
fn messages_from_anchors<'a>(
|
||||||
&'a self,
|
&'a self,
|
||||||
message_anchors: impl Iterator<Item = &'a MessageAnchor> + 'a,
|
message_anchors: impl Iterator<Item = &'a MessageAnchor> + 'a,
|
||||||
cx: &'a App,
|
cx: &'a AppContext,
|
||||||
) -> impl 'a + Iterator<Item = Message> {
|
) -> impl 'a + Iterator<Item = Message> {
|
||||||
let buffer = self.buffer.read(cx);
|
let buffer = self.buffer.read(cx);
|
||||||
|
|
||||||
Self::messages_from_iters(buffer, &self.messages_metadata, message_anchors.enumerate())
|
Self::messages_from_iters(buffer, &self.messages_metadata, message_anchors.enumerate())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn messages<'a>(&'a self, cx: &'a App) -> impl 'a + Iterator<Item = Message> {
|
pub fn messages<'a>(&'a self, cx: &'a AppContext) -> impl 'a + Iterator<Item = Message> {
|
||||||
self.messages_from_anchors(self.message_anchors.iter(), cx)
|
self.messages_from_anchors(self.message_anchors.iter(), cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2937,7 +3051,7 @@ impl AssistantContext {
|
|||||||
&mut self,
|
&mut self,
|
||||||
debounce: Option<Duration>,
|
debounce: Option<Duration>,
|
||||||
fs: Arc<dyn Fs>,
|
fs: Arc<dyn Fs>,
|
||||||
cx: &mut Context<AssistantContext>,
|
cx: &mut ModelContext<Context>,
|
||||||
) {
|
) {
|
||||||
if self.replica_id() != ReplicaId::default() {
|
if self.replica_id() != ReplicaId::default() {
|
||||||
// Prevent saving a remote context for now.
|
// Prevent saving a remote context for now.
|
||||||
@@ -3003,7 +3117,7 @@ impl AssistantContext {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn custom_summary(&mut self, custom_summary: String, cx: &mut Context<Self>) {
|
pub(crate) fn custom_summary(&mut self, custom_summary: String, cx: &mut ModelContext<Self>) {
|
||||||
let timestamp = self.next_timestamp();
|
let timestamp = self.next_timestamp();
|
||||||
let summary = self.summary.get_or_insert(ContextSummary::default());
|
let summary = self.summary.get_or_insert(ContextSummary::default());
|
||||||
summary.timestamp = timestamp;
|
summary.timestamp = timestamp;
|
||||||
@@ -3163,8 +3277,8 @@ impl SavedContext {
|
|||||||
|
|
||||||
fn into_ops(
|
fn into_ops(
|
||||||
self,
|
self,
|
||||||
buffer: &Entity<Buffer>,
|
buffer: &Model<Buffer>,
|
||||||
cx: &mut Context<AssistantContext>,
|
cx: &mut ModelContext<Context>,
|
||||||
) -> Vec<ContextOperation> {
|
) -> Vec<ContextOperation> {
|
||||||
let mut operations = Vec::new();
|
let mut operations = Vec::new();
|
||||||
let mut version = clock::Global::new();
|
let mut version = clock::Global::new();
|
||||||
@@ -3363,7 +3477,7 @@ impl SavedContextV0_1_0 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Clone)]
|
||||||
pub struct SavedContextMetadata {
|
pub struct SavedContextMetadata {
|
||||||
pub title: String,
|
pub title: String,
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
@@ -1,26 +1,28 @@
|
|||||||
|
use super::{AssistantEdit, MessageCacheMetadata};
|
||||||
|
use crate::slash_command_working_set::SlashCommandWorkingSet;
|
||||||
use crate::{
|
use crate::{
|
||||||
AssistantContext, AssistantEdit, AssistantEditKind, CacheStatus, ContextEvent, ContextId,
|
assistant_panel, prompt_library, slash_command::file_command, AssistantEditKind, CacheStatus,
|
||||||
ContextOperation, InvokedSlashCommandId, MessageCacheMetadata, MessageId, MessageStatus,
|
Context, ContextEvent, ContextId, ContextOperation, InvokedSlashCommandId, MessageId,
|
||||||
|
MessageStatus, PromptBuilder,
|
||||||
};
|
};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use assistant_slash_command::{
|
use assistant_slash_command::{
|
||||||
ArgumentCompletion, SlashCommand, SlashCommandContent, SlashCommandEvent, SlashCommandOutput,
|
ArgumentCompletion, SlashCommand, SlashCommandContent, SlashCommandEvent, SlashCommandOutput,
|
||||||
SlashCommandOutputSection, SlashCommandRegistry, SlashCommandResult, SlashCommandWorkingSet,
|
SlashCommandOutputSection, SlashCommandRegistry, SlashCommandResult,
|
||||||
};
|
};
|
||||||
use assistant_slash_commands::FileSlashCommand;
|
use assistant_tool::ToolWorkingSet;
|
||||||
use collections::{HashMap, HashSet};
|
use collections::{HashMap, HashSet};
|
||||||
use fs::FakeFs;
|
use fs::FakeFs;
|
||||||
use futures::{
|
use futures::{
|
||||||
channel::mpsc,
|
channel::mpsc,
|
||||||
stream::{self, StreamExt},
|
stream::{self, StreamExt},
|
||||||
};
|
};
|
||||||
use gpui::{prelude::*, App, Entity, SharedString, Task, TestAppContext, WeakEntity};
|
use gpui::{prelude::*, AppContext, Model, SharedString, Task, TestAppContext, WeakView};
|
||||||
use language::{Buffer, BufferSnapshot, LanguageRegistry, LspAdapterDelegate};
|
use language::{Buffer, BufferSnapshot, LanguageRegistry, LspAdapterDelegate};
|
||||||
use language_model::{LanguageModelCacheConfiguration, LanguageModelRegistry, Role};
|
use language_model::{LanguageModelCacheConfiguration, LanguageModelRegistry, Role};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
use project::Project;
|
use project::Project;
|
||||||
use prompt_library::PromptBuilder;
|
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use settings::SettingsStore;
|
use settings::SettingsStore;
|
||||||
@@ -33,7 +35,7 @@ use std::{
|
|||||||
sync::{atomic::AtomicBool, Arc},
|
sync::{atomic::AtomicBool, Arc},
|
||||||
};
|
};
|
||||||
use text::{network::Network, OffsetRangeExt as _, ReplicaId, ToOffset};
|
use text::{network::Network, OffsetRangeExt as _, ReplicaId, ToOffset};
|
||||||
use ui::{IconName, Window};
|
use ui::{IconName, WindowContext};
|
||||||
use unindent::Unindent;
|
use unindent::Unindent;
|
||||||
use util::{
|
use util::{
|
||||||
test::{generate_marked_text, marked_text_ranges},
|
test::{generate_marked_text, marked_text_ranges},
|
||||||
@@ -42,19 +44,21 @@ use util::{
|
|||||||
use workspace::Workspace;
|
use workspace::Workspace;
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_inserting_and_removing_messages(cx: &mut App) {
|
fn test_inserting_and_removing_messages(cx: &mut AppContext) {
|
||||||
let settings_store = SettingsStore::test(cx);
|
let settings_store = SettingsStore::test(cx);
|
||||||
LanguageModelRegistry::test(cx);
|
LanguageModelRegistry::test(cx);
|
||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
|
assistant_panel::init(cx);
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry,
|
registry,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -181,20 +185,22 @@ fn test_inserting_and_removing_messages(cx: &mut App) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_message_splitting(cx: &mut App) {
|
fn test_message_splitting(cx: &mut AppContext) {
|
||||||
let settings_store = SettingsStore::test(cx);
|
let settings_store = SettingsStore::test(cx);
|
||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
LanguageModelRegistry::test(cx);
|
LanguageModelRegistry::test(cx);
|
||||||
|
assistant_panel::init(cx);
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
||||||
|
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -284,19 +290,21 @@ fn test_message_splitting(cx: &mut App) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_messages_for_offsets(cx: &mut App) {
|
fn test_messages_for_offsets(cx: &mut AppContext) {
|
||||||
let settings_store = SettingsStore::test(cx);
|
let settings_store = SettingsStore::test(cx);
|
||||||
LanguageModelRegistry::test(cx);
|
LanguageModelRegistry::test(cx);
|
||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
|
assistant_panel::init(cx);
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry,
|
registry,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -363,9 +371,9 @@ fn test_messages_for_offsets(cx: &mut App) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
fn message_ids_for_offsets(
|
fn message_ids_for_offsets(
|
||||||
context: &Entity<AssistantContext>,
|
context: &Model<Context>,
|
||||||
offsets: &[usize],
|
offsets: &[usize],
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Vec<MessageId> {
|
) -> Vec<MessageId> {
|
||||||
context
|
context
|
||||||
.read(cx)
|
.read(cx)
|
||||||
@@ -382,6 +390,7 @@ async fn test_slash_commands(cx: &mut TestAppContext) {
|
|||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
cx.update(LanguageModelRegistry::test);
|
cx.update(LanguageModelRegistry::test);
|
||||||
cx.update(Project::init_settings);
|
cx.update(Project::init_settings);
|
||||||
|
cx.update(assistant_panel::init);
|
||||||
let fs = FakeFs::new(cx.background_executor.clone());
|
let fs = FakeFs::new(cx.background_executor.clone());
|
||||||
|
|
||||||
fs.insert_tree(
|
fs.insert_tree(
|
||||||
@@ -399,17 +408,18 @@ async fn test_slash_commands(cx: &mut TestAppContext) {
|
|||||||
.await;
|
.await;
|
||||||
|
|
||||||
let slash_command_registry = cx.update(SlashCommandRegistry::default_global);
|
let slash_command_registry = cx.update(SlashCommandRegistry::default_global);
|
||||||
slash_command_registry.register_command(FileSlashCommand, false);
|
slash_command_registry.register_command(file_command::FileSlashCommand, false);
|
||||||
|
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.executor()));
|
let registry = Arc::new(LanguageRegistry::test(cx.executor()));
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -603,7 +613,7 @@ async fn test_slash_commands(cx: &mut TestAppContext) {
|
|||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn assert_text_and_context_ranges(
|
fn assert_text_and_context_ranges(
|
||||||
buffer: &Entity<Buffer>,
|
buffer: &Model<Buffer>,
|
||||||
ranges: &RefCell<ContextRanges>,
|
ranges: &RefCell<ContextRanges>,
|
||||||
expected_marked_text: &str,
|
expected_marked_text: &str,
|
||||||
cx: &mut TestAppContext,
|
cx: &mut TestAppContext,
|
||||||
@@ -688,17 +698,19 @@ async fn test_workflow_step_parsing(cx: &mut TestAppContext) {
|
|||||||
let project = Project::test(fs, [Path::new("/root")], cx).await;
|
let project = Project::test(fs, [Path::new("/root")], cx).await;
|
||||||
cx.update(LanguageModelRegistry::test);
|
cx.update(LanguageModelRegistry::test);
|
||||||
|
|
||||||
|
cx.update(assistant_panel::init);
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.executor()));
|
let registry = Arc::new(LanguageRegistry::test(cx.executor()));
|
||||||
|
|
||||||
// Create a new context
|
// Create a new context
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
Some(project),
|
Some(project),
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -956,13 +968,14 @@ async fn test_workflow_step_parsing(cx: &mut TestAppContext) {
|
|||||||
|
|
||||||
// Ensure steps are re-parsed when deserializing.
|
// Ensure steps are re-parsed when deserializing.
|
||||||
let serialized_context = context.read_with(cx, |context, cx| context.serialize(cx));
|
let serialized_context = context.read_with(cx, |context, cx| context.serialize(cx));
|
||||||
let deserialized_context = cx.new(|cx| {
|
let deserialized_context = cx.new_model(|cx| {
|
||||||
AssistantContext::deserialize(
|
Context::deserialize(
|
||||||
serialized_context,
|
serialized_context,
|
||||||
Default::default(),
|
Default::default(),
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
cx,
|
cx,
|
||||||
@@ -999,11 +1012,7 @@ async fn test_workflow_step_parsing(cx: &mut TestAppContext) {
|
|||||||
cx,
|
cx,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn edit(
|
fn edit(context: &Model<Context>, new_text_marked_with_edits: &str, cx: &mut TestAppContext) {
|
||||||
context: &Entity<AssistantContext>,
|
|
||||||
new_text_marked_with_edits: &str,
|
|
||||||
cx: &mut TestAppContext,
|
|
||||||
) {
|
|
||||||
context.update(cx, |context, cx| {
|
context.update(cx, |context, cx| {
|
||||||
context.buffer.update(cx, |buffer, cx| {
|
context.buffer.update(cx, |buffer, cx| {
|
||||||
buffer.edit_via_marked_text(&new_text_marked_with_edits.unindent(), None, cx);
|
buffer.edit_via_marked_text(&new_text_marked_with_edits.unindent(), None, cx);
|
||||||
@@ -1014,7 +1023,7 @@ async fn test_workflow_step_parsing(cx: &mut TestAppContext) {
|
|||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn expect_patches(
|
fn expect_patches(
|
||||||
context: &Entity<AssistantContext>,
|
context: &Model<Context>,
|
||||||
expected_marked_text: &str,
|
expected_marked_text: &str,
|
||||||
expected_suggestions: &[&[AssistantEdit]],
|
expected_suggestions: &[&[AssistantEdit]],
|
||||||
cx: &mut TestAppContext,
|
cx: &mut TestAppContext,
|
||||||
@@ -1072,15 +1081,17 @@ async fn test_serialization(cx: &mut TestAppContext) {
|
|||||||
let settings_store = cx.update(SettingsStore::test);
|
let settings_store = cx.update(SettingsStore::test);
|
||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
cx.update(LanguageModelRegistry::test);
|
cx.update(LanguageModelRegistry::test);
|
||||||
|
cx.update(assistant_panel::init);
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.executor()));
|
let registry = Arc::new(LanguageRegistry::test(cx.executor()));
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -1117,13 +1128,14 @@ async fn test_serialization(cx: &mut TestAppContext) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let serialized_context = context.read_with(cx, |context, cx| context.serialize(cx));
|
let serialized_context = context.read_with(cx, |context, cx| context.serialize(cx));
|
||||||
let deserialized_context = cx.new(|cx| {
|
let deserialized_context = cx.new_model(|cx| {
|
||||||
AssistantContext::deserialize(
|
Context::deserialize(
|
||||||
serialized_context,
|
serialized_context,
|
||||||
Default::default(),
|
Default::default(),
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
cx,
|
cx,
|
||||||
@@ -1161,6 +1173,7 @@ async fn test_random_context_collaboration(cx: &mut TestAppContext, mut rng: Std
|
|||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
cx.update(LanguageModelRegistry::test);
|
cx.update(LanguageModelRegistry::test);
|
||||||
|
|
||||||
|
cx.update(assistant_panel::init);
|
||||||
let slash_commands = cx.update(SlashCommandRegistry::default_global);
|
let slash_commands = cx.update(SlashCommandRegistry::default_global);
|
||||||
slash_commands.register_command(FakeSlashCommand("cmd-1".into()), false);
|
slash_commands.register_command(FakeSlashCommand("cmd-1".into()), false);
|
||||||
slash_commands.register_command(FakeSlashCommand("cmd-2".into()), false);
|
slash_commands.register_command(FakeSlashCommand("cmd-2".into()), false);
|
||||||
@@ -1174,14 +1187,15 @@ async fn test_random_context_collaboration(cx: &mut TestAppContext, mut rng: Std
|
|||||||
let context_id = ContextId::new();
|
let context_id = ContextId::new();
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
for i in 0..num_peers {
|
for i in 0..num_peers {
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::new(
|
Context::new(
|
||||||
context_id.clone(),
|
context_id.clone(),
|
||||||
i as ReplicaId,
|
i as ReplicaId,
|
||||||
language::Capability::ReadWrite,
|
language::Capability::ReadWrite,
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
cx,
|
cx,
|
||||||
@@ -1428,19 +1442,21 @@ async fn test_random_context_collaboration(cx: &mut TestAppContext, mut rng: Std
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_mark_cache_anchors(cx: &mut App) {
|
fn test_mark_cache_anchors(cx: &mut AppContext) {
|
||||||
let settings_store = SettingsStore::test(cx);
|
let settings_store = SettingsStore::test(cx);
|
||||||
LanguageModelRegistry::test(cx);
|
LanguageModelRegistry::test(cx);
|
||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
|
assistant_panel::init(cx);
|
||||||
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
|
||||||
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
let prompt_builder = Arc::new(PromptBuilder::new(None).unwrap());
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::local(
|
Context::local(
|
||||||
registry,
|
registry,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
prompt_builder.clone(),
|
prompt_builder.clone(),
|
||||||
Arc::new(SlashCommandWorkingSet::default()),
|
Arc::new(SlashCommandWorkingSet::default()),
|
||||||
|
Arc::new(ToolWorkingSet::default()),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -1587,7 +1603,7 @@ fn test_mark_cache_anchors(cx: &mut App) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn messages(context: &Entity<AssistantContext>, cx: &App) -> Vec<(MessageId, Role, Range<usize>)> {
|
fn messages(context: &Model<Context>, cx: &AppContext) -> Vec<(MessageId, Role, Range<usize>)> {
|
||||||
context
|
context
|
||||||
.read(cx)
|
.read(cx)
|
||||||
.messages(cx)
|
.messages(cx)
|
||||||
@@ -1596,8 +1612,8 @@ fn messages(context: &Entity<AssistantContext>, cx: &App) -> Vec<(MessageId, Rol
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn messages_cache(
|
fn messages_cache(
|
||||||
context: &Entity<AssistantContext>,
|
context: &Model<Context>,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Vec<(MessageId, Option<MessageCacheMetadata>)> {
|
) -> Vec<(MessageId, Option<MessageCacheMetadata>)> {
|
||||||
context
|
context
|
||||||
.read(cx)
|
.read(cx)
|
||||||
@@ -1626,9 +1642,8 @@ impl SlashCommand for FakeSlashCommand {
|
|||||||
self: Arc<Self>,
|
self: Arc<Self>,
|
||||||
_arguments: &[String],
|
_arguments: &[String],
|
||||||
_cancel: Arc<AtomicBool>,
|
_cancel: Arc<AtomicBool>,
|
||||||
_workspace: Option<WeakEntity<Workspace>>,
|
_workspace: Option<WeakView<Workspace>>,
|
||||||
_window: &mut Window,
|
_cx: &mut WindowContext,
|
||||||
_cx: &mut App,
|
|
||||||
) -> Task<Result<Vec<ArgumentCompletion>>> {
|
) -> Task<Result<Vec<ArgumentCompletion>>> {
|
||||||
Task::ready(Ok(vec![]))
|
Task::ready(Ok(vec![]))
|
||||||
}
|
}
|
||||||
@@ -1642,10 +1657,9 @@ impl SlashCommand for FakeSlashCommand {
|
|||||||
_arguments: &[String],
|
_arguments: &[String],
|
||||||
_context_slash_command_output_sections: &[SlashCommandOutputSection<language::Anchor>],
|
_context_slash_command_output_sections: &[SlashCommandOutputSection<language::Anchor>],
|
||||||
_context_buffer: BufferSnapshot,
|
_context_buffer: BufferSnapshot,
|
||||||
_workspace: WeakEntity<Workspace>,
|
_workspace: WeakView<Workspace>,
|
||||||
_delegate: Option<Arc<dyn LspAdapterDelegate>>,
|
_delegate: Option<Arc<dyn LspAdapterDelegate>>,
|
||||||
_window: &mut Window,
|
_cx: &mut WindowContext,
|
||||||
_cx: &mut App,
|
|
||||||
) -> Task<SlashCommandResult> {
|
) -> Task<SlashCommandResult> {
|
||||||
Task::ready(Ok(SlashCommandOutput {
|
Task::ready(Ok(SlashCommandOutput {
|
||||||
text: format!("Executed fake command: {}", self.0),
|
text: format!("Executed fake command: {}", self.0),
|
||||||
@@ -1,25 +1,27 @@
|
|||||||
|
use crate::slash_command::context_server_command;
|
||||||
|
use crate::SlashCommandId;
|
||||||
use crate::{
|
use crate::{
|
||||||
AssistantContext, ContextEvent, ContextId, ContextOperation, ContextVersion, SavedContext,
|
prompts::PromptBuilder, slash_command_working_set::SlashCommandWorkingSet, Context,
|
||||||
SavedContextMetadata,
|
ContextEvent, ContextId, ContextOperation, ContextVersion, SavedContext, SavedContextMetadata,
|
||||||
};
|
};
|
||||||
use anyhow::{anyhow, Context as _, Result};
|
use anyhow::{anyhow, Context as _, Result};
|
||||||
use assistant_slash_command::{SlashCommandId, SlashCommandWorkingSet};
|
use assistant_tool::{ToolId, ToolWorkingSet};
|
||||||
use client::{proto, telemetry::Telemetry, Client, TypedEnvelope};
|
use client::{proto, telemetry::Telemetry, Client, TypedEnvelope};
|
||||||
use clock::ReplicaId;
|
use clock::ReplicaId;
|
||||||
use collections::HashMap;
|
use collections::HashMap;
|
||||||
use context_server::manager::ContextServerManager;
|
use context_server::manager::ContextServerManager;
|
||||||
use context_server::ContextServerFactoryRegistry;
|
use context_server::{ContextServerFactoryRegistry, ContextServerTool};
|
||||||
use fs::{Fs, RemoveOptions};
|
use fs::Fs;
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use fuzzy::StringMatchCandidate;
|
use fuzzy::StringMatchCandidate;
|
||||||
use gpui::{App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Task, WeakEntity};
|
use gpui::{
|
||||||
|
AppContext, AsyncAppContext, Context as _, EventEmitter, Model, ModelContext, Task, WeakModel,
|
||||||
|
};
|
||||||
use language::LanguageRegistry;
|
use language::LanguageRegistry;
|
||||||
use paths::contexts_dir;
|
use paths::contexts_dir;
|
||||||
use project::Project;
|
use project::Project;
|
||||||
use prompt_library::PromptBuilder;
|
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use rpc::AnyProtoClient;
|
use rpc::AnyProtoClient;
|
||||||
use std::sync::LazyLock;
|
|
||||||
use std::{
|
use std::{
|
||||||
cmp::Reverse,
|
cmp::Reverse,
|
||||||
ffi::OsStr,
|
ffi::OsStr,
|
||||||
@@ -30,12 +32,12 @@ use std::{
|
|||||||
};
|
};
|
||||||
use util::{ResultExt, TryFutureExt};
|
use util::{ResultExt, TryFutureExt};
|
||||||
|
|
||||||
pub(crate) fn init(client: &AnyProtoClient) {
|
pub fn init(client: &AnyProtoClient) {
|
||||||
client.add_entity_message_handler(ContextStore::handle_advertise_contexts);
|
client.add_model_message_handler(ContextStore::handle_advertise_contexts);
|
||||||
client.add_entity_request_handler(ContextStore::handle_open_context);
|
client.add_model_request_handler(ContextStore::handle_open_context);
|
||||||
client.add_entity_request_handler(ContextStore::handle_create_context);
|
client.add_model_request_handler(ContextStore::handle_create_context);
|
||||||
client.add_entity_message_handler(ContextStore::handle_update_context);
|
client.add_model_message_handler(ContextStore::handle_update_context);
|
||||||
client.add_entity_request_handler(ContextStore::handle_synchronize_contexts);
|
client.add_model_request_handler(ContextStore::handle_synchronize_contexts);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@@ -47,16 +49,18 @@ pub struct RemoteContextMetadata {
|
|||||||
pub struct ContextStore {
|
pub struct ContextStore {
|
||||||
contexts: Vec<ContextHandle>,
|
contexts: Vec<ContextHandle>,
|
||||||
contexts_metadata: Vec<SavedContextMetadata>,
|
contexts_metadata: Vec<SavedContextMetadata>,
|
||||||
context_server_manager: Entity<ContextServerManager>,
|
context_server_manager: Model<ContextServerManager>,
|
||||||
context_server_slash_command_ids: HashMap<Arc<str>, Vec<SlashCommandId>>,
|
context_server_slash_command_ids: HashMap<Arc<str>, Vec<SlashCommandId>>,
|
||||||
|
context_server_tool_ids: HashMap<Arc<str>, Vec<ToolId>>,
|
||||||
host_contexts: Vec<RemoteContextMetadata>,
|
host_contexts: Vec<RemoteContextMetadata>,
|
||||||
fs: Arc<dyn Fs>,
|
fs: Arc<dyn Fs>,
|
||||||
languages: Arc<LanguageRegistry>,
|
languages: Arc<LanguageRegistry>,
|
||||||
slash_commands: Arc<SlashCommandWorkingSet>,
|
slash_commands: Arc<SlashCommandWorkingSet>,
|
||||||
|
tools: Arc<ToolWorkingSet>,
|
||||||
telemetry: Arc<Telemetry>,
|
telemetry: Arc<Telemetry>,
|
||||||
_watch_updates: Task<Option<()>>,
|
_watch_updates: Task<Option<()>>,
|
||||||
client: Arc<Client>,
|
client: Arc<Client>,
|
||||||
project: Entity<Project>,
|
project: Model<Project>,
|
||||||
project_is_shared: bool,
|
project_is_shared: bool,
|
||||||
client_subscription: Option<client::Subscription>,
|
client_subscription: Option<client::Subscription>,
|
||||||
_project_subscriptions: Vec<gpui::Subscription>,
|
_project_subscriptions: Vec<gpui::Subscription>,
|
||||||
@@ -70,19 +74,19 @@ pub enum ContextStoreEvent {
|
|||||||
impl EventEmitter<ContextStoreEvent> for ContextStore {}
|
impl EventEmitter<ContextStoreEvent> for ContextStore {}
|
||||||
|
|
||||||
enum ContextHandle {
|
enum ContextHandle {
|
||||||
Weak(WeakEntity<AssistantContext>),
|
Weak(WeakModel<Context>),
|
||||||
Strong(Entity<AssistantContext>),
|
Strong(Model<Context>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ContextHandle {
|
impl ContextHandle {
|
||||||
fn upgrade(&self) -> Option<Entity<AssistantContext>> {
|
fn upgrade(&self) -> Option<Model<Context>> {
|
||||||
match self {
|
match self {
|
||||||
ContextHandle::Weak(weak) => weak.upgrade(),
|
ContextHandle::Weak(weak) => weak.upgrade(),
|
||||||
ContextHandle::Strong(strong) => Some(strong.clone()),
|
ContextHandle::Strong(strong) => Some(strong.clone()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn downgrade(&self) -> WeakEntity<AssistantContext> {
|
fn downgrade(&self) -> WeakModel<Context> {
|
||||||
match self {
|
match self {
|
||||||
ContextHandle::Weak(weak) => weak.clone(),
|
ContextHandle::Weak(weak) => weak.clone(),
|
||||||
ContextHandle::Strong(strong) => strong.downgrade(),
|
ContextHandle::Strong(strong) => strong.downgrade(),
|
||||||
@@ -92,11 +96,12 @@ impl ContextHandle {
|
|||||||
|
|
||||||
impl ContextStore {
|
impl ContextStore {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
project: Entity<Project>,
|
project: Model<Project>,
|
||||||
prompt_builder: Arc<PromptBuilder>,
|
prompt_builder: Arc<PromptBuilder>,
|
||||||
slash_commands: Arc<SlashCommandWorkingSet>,
|
slash_commands: Arc<SlashCommandWorkingSet>,
|
||||||
cx: &mut App,
|
tools: Arc<ToolWorkingSet>,
|
||||||
) -> Task<Result<Entity<Self>>> {
|
cx: &mut AppContext,
|
||||||
|
) -> Task<Result<Model<Self>>> {
|
||||||
let fs = project.read(cx).fs().clone();
|
let fs = project.read(cx).fs().clone();
|
||||||
let languages = project.read(cx).languages().clone();
|
let languages = project.read(cx).languages().clone();
|
||||||
let telemetry = project.read(cx).client().telemetry().clone();
|
let telemetry = project.read(cx).client().telemetry().clone();
|
||||||
@@ -104,10 +109,10 @@ impl ContextStore {
|
|||||||
const CONTEXT_WATCH_DURATION: Duration = Duration::from_millis(100);
|
const CONTEXT_WATCH_DURATION: Duration = Duration::from_millis(100);
|
||||||
let (mut events, _) = fs.watch(contexts_dir(), CONTEXT_WATCH_DURATION).await;
|
let (mut events, _) = fs.watch(contexts_dir(), CONTEXT_WATCH_DURATION).await;
|
||||||
|
|
||||||
let this = cx.new(|cx: &mut Context<Self>| {
|
let this = cx.new_model(|cx: &mut ModelContext<Self>| {
|
||||||
let context_server_factory_registry =
|
let context_server_factory_registry =
|
||||||
ContextServerFactoryRegistry::default_global(cx);
|
ContextServerFactoryRegistry::default_global(cx);
|
||||||
let context_server_manager = cx.new(|cx| {
|
let context_server_manager = cx.new_model(|cx| {
|
||||||
ContextServerManager::new(context_server_factory_registry, project.clone(), cx)
|
ContextServerManager::new(context_server_factory_registry, project.clone(), cx)
|
||||||
});
|
});
|
||||||
let mut this = Self {
|
let mut this = Self {
|
||||||
@@ -115,10 +120,12 @@ impl ContextStore {
|
|||||||
contexts_metadata: Vec::new(),
|
contexts_metadata: Vec::new(),
|
||||||
context_server_manager,
|
context_server_manager,
|
||||||
context_server_slash_command_ids: HashMap::default(),
|
context_server_slash_command_ids: HashMap::default(),
|
||||||
|
context_server_tool_ids: HashMap::default(),
|
||||||
host_contexts: Vec::new(),
|
host_contexts: Vec::new(),
|
||||||
fs,
|
fs,
|
||||||
languages,
|
languages,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
telemetry,
|
telemetry,
|
||||||
_watch_updates: cx.spawn(|this, mut cx| {
|
_watch_updates: cx.spawn(|this, mut cx| {
|
||||||
async move {
|
async move {
|
||||||
@@ -144,18 +151,20 @@ impl ContextStore {
|
|||||||
this.handle_project_changed(project.clone(), cx);
|
this.handle_project_changed(project.clone(), cx);
|
||||||
this.synchronize_contexts(cx);
|
this.synchronize_contexts(cx);
|
||||||
this.register_context_server_handlers(cx);
|
this.register_context_server_handlers(cx);
|
||||||
this.reload(cx).detach_and_log_err(cx);
|
|
||||||
this
|
this
|
||||||
})?;
|
})?;
|
||||||
|
this.update(&mut cx, |this, cx| this.reload(cx))?
|
||||||
|
.await
|
||||||
|
.log_err();
|
||||||
|
|
||||||
Ok(this)
|
Ok(this)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_advertise_contexts(
|
async fn handle_advertise_contexts(
|
||||||
this: Entity<Self>,
|
this: Model<Self>,
|
||||||
envelope: TypedEnvelope<proto::AdvertiseContexts>,
|
envelope: TypedEnvelope<proto::AdvertiseContexts>,
|
||||||
mut cx: AsyncApp,
|
mut cx: AsyncAppContext,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
this.update(&mut cx, |this, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
this.host_contexts = envelope
|
this.host_contexts = envelope
|
||||||
@@ -172,9 +181,9 @@ impl ContextStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_open_context(
|
async fn handle_open_context(
|
||||||
this: Entity<Self>,
|
this: Model<Self>,
|
||||||
envelope: TypedEnvelope<proto::OpenContext>,
|
envelope: TypedEnvelope<proto::OpenContext>,
|
||||||
mut cx: AsyncApp,
|
mut cx: AsyncAppContext,
|
||||||
) -> Result<proto::OpenContextResponse> {
|
) -> Result<proto::OpenContextResponse> {
|
||||||
let context_id = ContextId::from_proto(envelope.payload.context_id);
|
let context_id = ContextId::from_proto(envelope.payload.context_id);
|
||||||
let operations = this.update(&mut cx, |this, cx| {
|
let operations = this.update(&mut cx, |this, cx| {
|
||||||
@@ -202,9 +211,9 @@ impl ContextStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_create_context(
|
async fn handle_create_context(
|
||||||
this: Entity<Self>,
|
this: Model<Self>,
|
||||||
_: TypedEnvelope<proto::CreateContext>,
|
_: TypedEnvelope<proto::CreateContext>,
|
||||||
mut cx: AsyncApp,
|
mut cx: AsyncAppContext,
|
||||||
) -> Result<proto::CreateContextResponse> {
|
) -> Result<proto::CreateContextResponse> {
|
||||||
let (context_id, operations) = this.update(&mut cx, |this, cx| {
|
let (context_id, operations) = this.update(&mut cx, |this, cx| {
|
||||||
if this.project.read(cx).is_via_collab() {
|
if this.project.read(cx).is_via_collab() {
|
||||||
@@ -230,9 +239,9 @@ impl ContextStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_update_context(
|
async fn handle_update_context(
|
||||||
this: Entity<Self>,
|
this: Model<Self>,
|
||||||
envelope: TypedEnvelope<proto::UpdateContext>,
|
envelope: TypedEnvelope<proto::UpdateContext>,
|
||||||
mut cx: AsyncApp,
|
mut cx: AsyncAppContext,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
this.update(&mut cx, |this, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
let context_id = ContextId::from_proto(envelope.payload.context_id);
|
let context_id = ContextId::from_proto(envelope.payload.context_id);
|
||||||
@@ -246,9 +255,9 @@ impl ContextStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_synchronize_contexts(
|
async fn handle_synchronize_contexts(
|
||||||
this: Entity<Self>,
|
this: Model<Self>,
|
||||||
envelope: TypedEnvelope<proto::SynchronizeContexts>,
|
envelope: TypedEnvelope<proto::SynchronizeContexts>,
|
||||||
mut cx: AsyncApp,
|
mut cx: AsyncAppContext,
|
||||||
) -> Result<proto::SynchronizeContextsResponse> {
|
) -> Result<proto::SynchronizeContextsResponse> {
|
||||||
this.update(&mut cx, |this, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
if this.project.read(cx).is_via_collab() {
|
if this.project.read(cx).is_via_collab() {
|
||||||
@@ -265,18 +274,19 @@ impl ContextStore {
|
|||||||
local_versions.push(context.version(cx).to_proto(context_id.clone()));
|
local_versions.push(context.version(cx).to_proto(context_id.clone()));
|
||||||
let client = this.client.clone();
|
let client = this.client.clone();
|
||||||
let project_id = envelope.payload.project_id;
|
let project_id = envelope.payload.project_id;
|
||||||
cx.background_spawn(async move {
|
cx.background_executor()
|
||||||
let operations = operations.await;
|
.spawn(async move {
|
||||||
for operation in operations {
|
let operations = operations.await;
|
||||||
client.send(proto::UpdateContext {
|
for operation in operations {
|
||||||
project_id,
|
client.send(proto::UpdateContext {
|
||||||
context_id: context_id.to_proto(),
|
project_id,
|
||||||
operation: Some(operation),
|
context_id: context_id.to_proto(),
|
||||||
})?;
|
operation: Some(operation),
|
||||||
}
|
})?;
|
||||||
anyhow::Ok(())
|
}
|
||||||
})
|
anyhow::Ok(())
|
||||||
.detach_and_log_err(cx);
|
})
|
||||||
|
.detach_and_log_err(cx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +298,7 @@ impl ContextStore {
|
|||||||
})?
|
})?
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_project_changed(&mut self, _: Entity<Project>, cx: &mut Context<Self>) {
|
fn handle_project_changed(&mut self, _: Model<Project>, cx: &mut ModelContext<Self>) {
|
||||||
let is_shared = self.project.read(cx).is_shared();
|
let is_shared = self.project.read(cx).is_shared();
|
||||||
let was_shared = mem::replace(&mut self.project_is_shared, is_shared);
|
let was_shared = mem::replace(&mut self.project_is_shared, is_shared);
|
||||||
if is_shared == was_shared {
|
if is_shared == was_shared {
|
||||||
@@ -309,7 +319,7 @@ impl ContextStore {
|
|||||||
.client
|
.client
|
||||||
.subscribe_to_entity(remote_id)
|
.subscribe_to_entity(remote_id)
|
||||||
.log_err()
|
.log_err()
|
||||||
.map(|subscription| subscription.set_entity(&cx.entity(), &mut cx.to_async()));
|
.map(|subscription| subscription.set_model(&cx.handle(), &mut cx.to_async()));
|
||||||
self.advertise_contexts(cx);
|
self.advertise_contexts(cx);
|
||||||
} else {
|
} else {
|
||||||
self.client_subscription = None;
|
self.client_subscription = None;
|
||||||
@@ -318,9 +328,9 @@ impl ContextStore {
|
|||||||
|
|
||||||
fn handle_project_event(
|
fn handle_project_event(
|
||||||
&mut self,
|
&mut self,
|
||||||
_: Entity<Project>,
|
_: Model<Project>,
|
||||||
event: &project::Event,
|
event: &project::Event,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
match event {
|
match event {
|
||||||
project::Event::Reshared => {
|
project::Event::Reshared => {
|
||||||
@@ -350,20 +360,15 @@ impl ContextStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn contexts(&self) -> Vec<SavedContextMetadata> {
|
pub fn create(&mut self, cx: &mut ModelContext<Self>) -> Model<Context> {
|
||||||
let mut contexts = self.contexts_metadata.iter().cloned().collect::<Vec<_>>();
|
let context = cx.new_model(|cx| {
|
||||||
contexts.sort_unstable_by_key(|thread| std::cmp::Reverse(thread.mtime));
|
Context::local(
|
||||||
contexts
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn create(&mut self, cx: &mut Context<Self>) -> Entity<AssistantContext> {
|
|
||||||
let context = cx.new(|cx| {
|
|
||||||
AssistantContext::local(
|
|
||||||
self.languages.clone(),
|
self.languages.clone(),
|
||||||
Some(self.project.clone()),
|
Some(self.project.clone()),
|
||||||
Some(self.telemetry.clone()),
|
Some(self.telemetry.clone()),
|
||||||
self.prompt_builder.clone(),
|
self.prompt_builder.clone(),
|
||||||
self.slash_commands.clone(),
|
self.slash_commands.clone(),
|
||||||
|
self.tools.clone(),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -373,8 +378,8 @@ impl ContextStore {
|
|||||||
|
|
||||||
pub fn create_remote_context(
|
pub fn create_remote_context(
|
||||||
&mut self,
|
&mut self,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Task<Result<Entity<AssistantContext>>> {
|
) -> Task<Result<Model<Context>>> {
|
||||||
let project = self.project.read(cx);
|
let project = self.project.read(cx);
|
||||||
let Some(project_id) = project.remote_id() else {
|
let Some(project_id) = project.remote_id() else {
|
||||||
return Task::ready(Err(anyhow!("project was not remote")));
|
return Task::ready(Err(anyhow!("project was not remote")));
|
||||||
@@ -387,26 +392,29 @@ impl ContextStore {
|
|||||||
let telemetry = self.telemetry.clone();
|
let telemetry = self.telemetry.clone();
|
||||||
let prompt_builder = self.prompt_builder.clone();
|
let prompt_builder = self.prompt_builder.clone();
|
||||||
let slash_commands = self.slash_commands.clone();
|
let slash_commands = self.slash_commands.clone();
|
||||||
|
let tools = self.tools.clone();
|
||||||
let request = self.client.request(proto::CreateContext { project_id });
|
let request = self.client.request(proto::CreateContext { project_id });
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
let response = request.await?;
|
let response = request.await?;
|
||||||
let context_id = ContextId::from_proto(response.context_id);
|
let context_id = ContextId::from_proto(response.context_id);
|
||||||
let context_proto = response.context.context("invalid context")?;
|
let context_proto = response.context.context("invalid context")?;
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::new(
|
Context::new(
|
||||||
context_id.clone(),
|
context_id.clone(),
|
||||||
replica_id,
|
replica_id,
|
||||||
capability,
|
capability,
|
||||||
language_registry,
|
language_registry,
|
||||||
prompt_builder,
|
prompt_builder,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
Some(project),
|
Some(project),
|
||||||
Some(telemetry),
|
Some(telemetry),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let operations = cx
|
let operations = cx
|
||||||
.background_spawn(async move {
|
.background_executor()
|
||||||
|
.spawn(async move {
|
||||||
context_proto
|
context_proto
|
||||||
.operations
|
.operations
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@@ -430,8 +438,8 @@ impl ContextStore {
|
|||||||
pub fn open_local_context(
|
pub fn open_local_context(
|
||||||
&mut self,
|
&mut self,
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
cx: &Context<Self>,
|
cx: &ModelContext<Self>,
|
||||||
) -> Task<Result<Entity<AssistantContext>>> {
|
) -> Task<Result<Model<Context>>> {
|
||||||
if let Some(existing_context) = self.loaded_context_for_path(&path, cx) {
|
if let Some(existing_context) = self.loaded_context_for_path(&path, cx) {
|
||||||
return Task::ready(Ok(existing_context));
|
return Task::ready(Ok(existing_context));
|
||||||
}
|
}
|
||||||
@@ -440,7 +448,7 @@ impl ContextStore {
|
|||||||
let languages = self.languages.clone();
|
let languages = self.languages.clone();
|
||||||
let project = self.project.clone();
|
let project = self.project.clone();
|
||||||
let telemetry = self.telemetry.clone();
|
let telemetry = self.telemetry.clone();
|
||||||
let load = cx.background_spawn({
|
let load = cx.background_executor().spawn({
|
||||||
let path = path.clone();
|
let path = path.clone();
|
||||||
async move {
|
async move {
|
||||||
let saved_context = fs.load(&path).await?;
|
let saved_context = fs.load(&path).await?;
|
||||||
@@ -449,16 +457,18 @@ impl ContextStore {
|
|||||||
});
|
});
|
||||||
let prompt_builder = self.prompt_builder.clone();
|
let prompt_builder = self.prompt_builder.clone();
|
||||||
let slash_commands = self.slash_commands.clone();
|
let slash_commands = self.slash_commands.clone();
|
||||||
|
let tools = self.tools.clone();
|
||||||
|
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
let saved_context = load.await?;
|
let saved_context = load.await?;
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::deserialize(
|
Context::deserialize(
|
||||||
saved_context,
|
saved_context,
|
||||||
path.clone(),
|
path.clone(),
|
||||||
languages,
|
languages,
|
||||||
prompt_builder,
|
prompt_builder,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
Some(project),
|
Some(project),
|
||||||
Some(telemetry),
|
Some(telemetry),
|
||||||
cx,
|
cx,
|
||||||
@@ -475,39 +485,7 @@ impl ContextStore {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete_local_context(
|
fn loaded_context_for_path(&self, path: &Path, cx: &AppContext) -> Option<Model<Context>> {
|
||||||
&mut self,
|
|
||||||
path: PathBuf,
|
|
||||||
cx: &mut Context<Self>,
|
|
||||||
) -> Task<Result<()>> {
|
|
||||||
let fs = self.fs.clone();
|
|
||||||
|
|
||||||
cx.spawn(|this, mut cx| async move {
|
|
||||||
fs.remove_file(
|
|
||||||
&path,
|
|
||||||
RemoveOptions {
|
|
||||||
recursive: false,
|
|
||||||
ignore_if_not_exists: true,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
this.update(&mut cx, |this, cx| {
|
|
||||||
this.contexts.retain(|context| {
|
|
||||||
context
|
|
||||||
.upgrade()
|
|
||||||
.and_then(|context| context.read(cx).path())
|
|
||||||
!= Some(&path)
|
|
||||||
});
|
|
||||||
this.contexts_metadata
|
|
||||||
.retain(|context| context.path != path);
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn loaded_context_for_path(&self, path: &Path, cx: &App) -> Option<Entity<AssistantContext>> {
|
|
||||||
self.contexts.iter().find_map(|context| {
|
self.contexts.iter().find_map(|context| {
|
||||||
let context = context.upgrade()?;
|
let context = context.upgrade()?;
|
||||||
if context.read(cx).path() == Some(path) {
|
if context.read(cx).path() == Some(path) {
|
||||||
@@ -518,11 +496,11 @@ impl ContextStore {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn loaded_context_for_id(
|
pub(super) fn loaded_context_for_id(
|
||||||
&self,
|
&self,
|
||||||
id: &ContextId,
|
id: &ContextId,
|
||||||
cx: &App,
|
cx: &AppContext,
|
||||||
) -> Option<Entity<AssistantContext>> {
|
) -> Option<Model<Context>> {
|
||||||
self.contexts.iter().find_map(|context| {
|
self.contexts.iter().find_map(|context| {
|
||||||
let context = context.upgrade()?;
|
let context = context.upgrade()?;
|
||||||
if context.read(cx).id() == id {
|
if context.read(cx).id() == id {
|
||||||
@@ -536,8 +514,8 @@ impl ContextStore {
|
|||||||
pub fn open_remote_context(
|
pub fn open_remote_context(
|
||||||
&mut self,
|
&mut self,
|
||||||
context_id: ContextId,
|
context_id: ContextId,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Task<Result<Entity<AssistantContext>>> {
|
) -> Task<Result<Model<Context>>> {
|
||||||
let project = self.project.read(cx);
|
let project = self.project.read(cx);
|
||||||
let Some(project_id) = project.remote_id() else {
|
let Some(project_id) = project.remote_id() else {
|
||||||
return Task::ready(Err(anyhow!("project was not remote")));
|
return Task::ready(Err(anyhow!("project was not remote")));
|
||||||
@@ -558,24 +536,27 @@ impl ContextStore {
|
|||||||
});
|
});
|
||||||
let prompt_builder = self.prompt_builder.clone();
|
let prompt_builder = self.prompt_builder.clone();
|
||||||
let slash_commands = self.slash_commands.clone();
|
let slash_commands = self.slash_commands.clone();
|
||||||
|
let tools = self.tools.clone();
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
let response = request.await?;
|
let response = request.await?;
|
||||||
let context_proto = response.context.context("invalid context")?;
|
let context_proto = response.context.context("invalid context")?;
|
||||||
let context = cx.new(|cx| {
|
let context = cx.new_model(|cx| {
|
||||||
AssistantContext::new(
|
Context::new(
|
||||||
context_id.clone(),
|
context_id.clone(),
|
||||||
replica_id,
|
replica_id,
|
||||||
capability,
|
capability,
|
||||||
language_registry,
|
language_registry,
|
||||||
prompt_builder,
|
prompt_builder,
|
||||||
slash_commands,
|
slash_commands,
|
||||||
|
tools,
|
||||||
Some(project),
|
Some(project),
|
||||||
Some(telemetry),
|
Some(telemetry),
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let operations = cx
|
let operations = cx
|
||||||
.background_spawn(async move {
|
.background_executor()
|
||||||
|
.spawn(async move {
|
||||||
context_proto
|
context_proto
|
||||||
.operations
|
.operations
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@@ -596,7 +577,7 @@ impl ContextStore {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn register_context(&mut self, context: &Entity<AssistantContext>, cx: &mut Context<Self>) {
|
fn register_context(&mut self, context: &Model<Context>, cx: &mut ModelContext<Self>) {
|
||||||
let handle = if self.project_is_shared {
|
let handle = if self.project_is_shared {
|
||||||
ContextHandle::Strong(context.clone())
|
ContextHandle::Strong(context.clone())
|
||||||
} else {
|
} else {
|
||||||
@@ -609,9 +590,9 @@ impl ContextStore {
|
|||||||
|
|
||||||
fn handle_context_event(
|
fn handle_context_event(
|
||||||
&mut self,
|
&mut self,
|
||||||
context: Entity<AssistantContext>,
|
context: Model<Context>,
|
||||||
event: &ContextEvent,
|
event: &ContextEvent,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
let Some(project_id) = self.project.read(cx).remote_id() else {
|
let Some(project_id) = self.project.read(cx).remote_id() else {
|
||||||
return;
|
return;
|
||||||
@@ -636,7 +617,7 @@ impl ContextStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advertise_contexts(&self, cx: &App) {
|
fn advertise_contexts(&self, cx: &AppContext) {
|
||||||
let Some(project_id) = self.project.read(cx).remote_id() else {
|
let Some(project_id) = self.project.read(cx).remote_id() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
@@ -670,7 +651,7 @@ impl ContextStore {
|
|||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn synchronize_contexts(&mut self, cx: &mut Context<Self>) {
|
fn synchronize_contexts(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
let Some(project_id) = self.project.read(cx).remote_id() else {
|
let Some(project_id) = self.project.read(cx).remote_id() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
@@ -725,10 +706,10 @@ impl ContextStore {
|
|||||||
.detach_and_log_err(cx);
|
.detach_and_log_err(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn search(&self, query: String, cx: &App) -> Task<Vec<SavedContextMetadata>> {
|
pub fn search(&self, query: String, cx: &AppContext) -> Task<Vec<SavedContextMetadata>> {
|
||||||
let metadata = self.contexts_metadata.clone();
|
let metadata = self.contexts_metadata.clone();
|
||||||
let executor = cx.background_executor().clone();
|
let executor = cx.background_executor().clone();
|
||||||
cx.background_spawn(async move {
|
cx.background_executor().spawn(async move {
|
||||||
if query.is_empty() {
|
if query.is_empty() {
|
||||||
metadata
|
metadata
|
||||||
} else {
|
} else {
|
||||||
@@ -759,7 +740,7 @@ impl ContextStore {
|
|||||||
&self.host_contexts
|
&self.host_contexts
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reload(&mut self, cx: &mut Context<Self>) -> Task<Result<()>> {
|
fn reload(&mut self, cx: &mut ModelContext<Self>) -> Task<Result<()>> {
|
||||||
let fs = self.fs.clone();
|
let fs = self.fs.clone();
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
fs.create_dir(contexts_dir()).await?;
|
fs.create_dir(contexts_dir()).await?;
|
||||||
@@ -772,8 +753,8 @@ impl ContextStore {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ASSISTANT_CONTEXT_REGEX: LazyLock<Regex> =
|
let pattern = r" - \d+.zed.json$";
|
||||||
LazyLock::new(|| Regex::new(r" - \d+.zed.json$").unwrap());
|
let re = Regex::new(pattern).unwrap();
|
||||||
|
|
||||||
let metadata = fs.metadata(&path).await?;
|
let metadata = fs.metadata(&path).await?;
|
||||||
if let Some((file_name, metadata)) = path
|
if let Some((file_name, metadata)) = path
|
||||||
@@ -782,15 +763,11 @@ impl ContextStore {
|
|||||||
.zip(metadata)
|
.zip(metadata)
|
||||||
{
|
{
|
||||||
// This is used to filter out contexts saved by the new assistant.
|
// This is used to filter out contexts saved by the new assistant.
|
||||||
if !ASSISTANT_CONTEXT_REGEX.is_match(file_name) {
|
if !re.is_match(file_name) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(title) = ASSISTANT_CONTEXT_REGEX
|
if let Some(title) = re.replace(file_name, "").lines().next() {
|
||||||
.replace(file_name, "")
|
|
||||||
.lines()
|
|
||||||
.next()
|
|
||||||
{
|
|
||||||
contexts.push(SavedContextMetadata {
|
contexts.push(SavedContextMetadata {
|
||||||
title: title.to_string(),
|
title: title.to_string(),
|
||||||
path,
|
path,
|
||||||
@@ -808,8 +785,8 @@ impl ContextStore {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn restart_context_servers(&mut self, cx: &mut Context<Self>) {
|
pub fn restart_context_servers(&mut self, cx: &mut ModelContext<Self>) {
|
||||||
cx.update_entity(
|
cx.update_model(
|
||||||
&self.context_server_manager,
|
&self.context_server_manager,
|
||||||
|context_server_manager, cx| {
|
|context_server_manager, cx| {
|
||||||
for server in context_server_manager.servers() {
|
for server in context_server_manager.servers() {
|
||||||
@@ -821,7 +798,7 @@ impl ContextStore {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn register_context_server_handlers(&self, cx: &mut Context<Self>) {
|
fn register_context_server_handlers(&self, cx: &mut ModelContext<Self>) {
|
||||||
cx.subscribe(
|
cx.subscribe(
|
||||||
&self.context_server_manager.clone(),
|
&self.context_server_manager.clone(),
|
||||||
Self::handle_context_server_event,
|
Self::handle_context_server_event,
|
||||||
@@ -831,11 +808,12 @@ impl ContextStore {
|
|||||||
|
|
||||||
fn handle_context_server_event(
|
fn handle_context_server_event(
|
||||||
&mut self,
|
&mut self,
|
||||||
context_server_manager: Entity<ContextServerManager>,
|
context_server_manager: Model<ContextServerManager>,
|
||||||
event: &context_server::manager::Event,
|
event: &context_server::manager::Event,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) {
|
) {
|
||||||
let slash_command_working_set = self.slash_commands.clone();
|
let slash_command_working_set = self.slash_commands.clone();
|
||||||
|
let tool_working_set = self.tools.clone();
|
||||||
match event {
|
match event {
|
||||||
context_server::manager::Event::ServerStarted { server_id } => {
|
context_server::manager::Event::ServerStarted { server_id } => {
|
||||||
if let Some(server) = context_server_manager.read(cx).get_server(server_id) {
|
if let Some(server) = context_server_manager.read(cx).get_server(server_id) {
|
||||||
@@ -852,14 +830,14 @@ impl ContextStore {
|
|||||||
if let Some(prompts) = protocol.list_prompts().await.log_err() {
|
if let Some(prompts) = protocol.list_prompts().await.log_err() {
|
||||||
let slash_command_ids = prompts
|
let slash_command_ids = prompts
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(assistant_slash_commands::acceptable_prompt)
|
.filter(context_server_command::acceptable_prompt)
|
||||||
.map(|prompt| {
|
.map(|prompt| {
|
||||||
log::info!(
|
log::info!(
|
||||||
"registering context server command: {:?}",
|
"registering context server command: {:?}",
|
||||||
prompt.name
|
prompt.name
|
||||||
);
|
);
|
||||||
slash_command_working_set.insert(Arc::new(
|
slash_command_working_set.insert(Arc::new(
|
||||||
assistant_slash_commands::ContextServerSlashCommand::new(
|
context_server_command::ContextServerSlashCommand::new(
|
||||||
context_server_manager.clone(),
|
context_server_manager.clone(),
|
||||||
&server,
|
&server,
|
||||||
prompt,
|
prompt,
|
||||||
@@ -875,6 +853,29 @@ impl ContextStore {
|
|||||||
.log_err();
|
.log_err();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if protocol.capable(context_server::protocol::ServerCapability::Tools) {
|
||||||
|
if let Some(tools) = protocol.list_tools().await.log_err() {
|
||||||
|
let tool_ids = tools.tools.into_iter().map(|tool| {
|
||||||
|
log::info!("registering context server tool: {:?}", tool.name);
|
||||||
|
tool_working_set.insert(
|
||||||
|
Arc::new(ContextServerTool::new(
|
||||||
|
context_server_manager.clone(),
|
||||||
|
server.id(),
|
||||||
|
tool,
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
|
}).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
|
||||||
|
this.update(&mut cx, |this, _cx| {
|
||||||
|
this.context_server_tool_ids
|
||||||
|
.insert(server_id, tool_ids);
|
||||||
|
})
|
||||||
|
.log_err();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
@@ -886,6 +887,10 @@ impl ContextStore {
|
|||||||
{
|
{
|
||||||
slash_command_working_set.remove(&slash_command_ids);
|
slash_command_working_set.remove(&slash_command_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(tool_ids) = self.context_server_tool_ids.remove(server_id) {
|
||||||
|
tool_working_set.remove(&tool_ids);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,14 +2,14 @@ use anyhow::{anyhow, Context as _, Result};
|
|||||||
use collections::HashMap;
|
use collections::HashMap;
|
||||||
use editor::ProposedChangesEditor;
|
use editor::ProposedChangesEditor;
|
||||||
use futures::{future, TryFutureExt as _};
|
use futures::{future, TryFutureExt as _};
|
||||||
use gpui::{App, AppContext as _, AsyncApp, Entity, SharedString};
|
use gpui::{AppContext, AsyncAppContext, Model, SharedString};
|
||||||
use language::{AutoindentMode, Buffer, BufferSnapshot};
|
use language::{AutoindentMode, Buffer, BufferSnapshot};
|
||||||
use project::{Project, ProjectPath};
|
use project::{Project, ProjectPath};
|
||||||
use std::{cmp, ops::Range, path::Path, sync::Arc};
|
use std::{cmp, ops::Range, path::Path, sync::Arc};
|
||||||
use text::{AnchorRangeExt as _, Bias, OffsetRangeExt as _, Point};
|
use text::{AnchorRangeExt as _, Bias, OffsetRangeExt as _, Point};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct AssistantPatch {
|
pub(crate) struct AssistantPatch {
|
||||||
pub range: Range<language::Anchor>,
|
pub range: Range<language::Anchor>,
|
||||||
pub title: SharedString,
|
pub title: SharedString,
|
||||||
pub edits: Arc<[Result<AssistantEdit>]>,
|
pub edits: Arc<[Result<AssistantEdit>]>,
|
||||||
@@ -17,13 +17,13 @@ pub struct AssistantPatch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
pub enum AssistantPatchStatus {
|
pub(crate) enum AssistantPatchStatus {
|
||||||
Pending,
|
Pending,
|
||||||
Ready,
|
Ready,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
pub struct AssistantEdit {
|
pub(crate) struct AssistantEdit {
|
||||||
pub path: String,
|
pub path: String,
|
||||||
pub kind: AssistantEditKind,
|
pub kind: AssistantEditKind,
|
||||||
}
|
}
|
||||||
@@ -55,8 +55,8 @@ pub enum AssistantEditKind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct ResolvedPatch {
|
pub(crate) struct ResolvedPatch {
|
||||||
pub edit_groups: HashMap<Entity<Buffer>, Vec<ResolvedEditGroup>>,
|
pub edit_groups: HashMap<Model<Buffer>, Vec<ResolvedEditGroup>>,
|
||||||
pub errors: Vec<AssistantPatchResolutionError>,
|
pub errors: Vec<AssistantPatchResolutionError>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ pub struct ResolvedEdit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct AssistantPatchResolutionError {
|
pub(crate) struct AssistantPatchResolutionError {
|
||||||
pub edit_ix: usize,
|
pub edit_ix: usize,
|
||||||
pub message: String,
|
pub message: String,
|
||||||
}
|
}
|
||||||
@@ -121,7 +121,7 @@ impl SearchMatrix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ResolvedPatch {
|
impl ResolvedPatch {
|
||||||
pub fn apply(&self, editor: &ProposedChangesEditor, cx: &mut App) {
|
pub fn apply(&self, editor: &ProposedChangesEditor, cx: &mut AppContext) {
|
||||||
for (buffer, groups) in &self.edit_groups {
|
for (buffer, groups) in &self.edit_groups {
|
||||||
let branch = editor.branch_buffer_for_base(buffer).unwrap();
|
let branch = editor.branch_buffer_for_base(buffer).unwrap();
|
||||||
Self::apply_edit_groups(groups, &branch, cx);
|
Self::apply_edit_groups(groups, &branch, cx);
|
||||||
@@ -129,7 +129,11 @@ impl ResolvedPatch {
|
|||||||
editor.recalculate_all_buffer_diffs();
|
editor.recalculate_all_buffer_diffs();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn apply_edit_groups(groups: &Vec<ResolvedEditGroup>, buffer: &Entity<Buffer>, cx: &mut App) {
|
fn apply_edit_groups(
|
||||||
|
groups: &Vec<ResolvedEditGroup>,
|
||||||
|
buffer: &Model<Buffer>,
|
||||||
|
cx: &mut AppContext,
|
||||||
|
) {
|
||||||
let mut edits = Vec::new();
|
let mut edits = Vec::new();
|
||||||
for group in groups {
|
for group in groups {
|
||||||
for suggestion in &group.edits {
|
for suggestion in &group.edits {
|
||||||
@@ -140,7 +144,7 @@ impl ResolvedPatch {
|
|||||||
buffer.edit(
|
buffer.edit(
|
||||||
edits,
|
edits,
|
||||||
Some(AutoindentMode::Block {
|
Some(AutoindentMode::Block {
|
||||||
original_start_columns: Vec::new(),
|
original_indent_columns: Vec::new(),
|
||||||
}),
|
}),
|
||||||
cx,
|
cx,
|
||||||
);
|
);
|
||||||
@@ -228,9 +232,9 @@ impl AssistantEdit {
|
|||||||
|
|
||||||
pub async fn resolve(
|
pub async fn resolve(
|
||||||
&self,
|
&self,
|
||||||
project: Entity<Project>,
|
project: Model<Project>,
|
||||||
mut cx: AsyncApp,
|
mut cx: AsyncAppContext,
|
||||||
) -> Result<(Entity<Buffer>, ResolvedEdit)> {
|
) -> Result<(Model<Buffer>, ResolvedEdit)> {
|
||||||
let path = self.path.clone();
|
let path = self.path.clone();
|
||||||
let kind = self.kind.clone();
|
let kind = self.kind.clone();
|
||||||
let buffer = project
|
let buffer = project
|
||||||
@@ -258,7 +262,8 @@ impl AssistantEdit {
|
|||||||
|
|
||||||
let snapshot = buffer.update(&mut cx, |buffer, _| buffer.snapshot())?;
|
let snapshot = buffer.update(&mut cx, |buffer, _| buffer.snapshot())?;
|
||||||
let suggestion = cx
|
let suggestion = cx
|
||||||
.background_spawn(async move { kind.resolve(&snapshot) })
|
.background_executor()
|
||||||
|
.spawn(async move { kind.resolve(&snapshot) })
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
Ok((buffer, suggestion))
|
Ok((buffer, suggestion))
|
||||||
@@ -420,7 +425,11 @@ impl AssistantEditKind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AssistantPatch {
|
impl AssistantPatch {
|
||||||
pub async fn resolve(&self, project: Entity<Project>, cx: &mut AsyncApp) -> ResolvedPatch {
|
pub(crate) async fn resolve(
|
||||||
|
&self,
|
||||||
|
project: Model<Project>,
|
||||||
|
cx: &mut AsyncAppContext,
|
||||||
|
) -> ResolvedPatch {
|
||||||
let mut resolve_tasks = Vec::new();
|
let mut resolve_tasks = Vec::new();
|
||||||
for (ix, edit) in self.edits.iter().enumerate() {
|
for (ix, edit) in self.edits.iter().enumerate() {
|
||||||
if let Ok(edit) = edit.as_ref() {
|
if let Ok(edit) = edit.as_ref() {
|
||||||
@@ -546,7 +555,7 @@ impl Eq for AssistantPatch {}
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use gpui::App;
|
use gpui::{AppContext, Context};
|
||||||
use language::{
|
use language::{
|
||||||
language_settings::AllLanguageSettings, Language, LanguageConfig, LanguageMatcher,
|
language_settings::AllLanguageSettings, Language, LanguageConfig, LanguageMatcher,
|
||||||
};
|
};
|
||||||
@@ -556,7 +565,7 @@ mod tests {
|
|||||||
use util::test::{generate_marked_text, marked_text_ranges};
|
use util::test::{generate_marked_text, marked_text_ranges};
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_resolve_location(cx: &mut App) {
|
fn test_resolve_location(cx: &mut AppContext) {
|
||||||
assert_location_resolution(
|
assert_location_resolution(
|
||||||
concat!(
|
concat!(
|
||||||
" Lorem\n",
|
" Lorem\n",
|
||||||
@@ -627,7 +636,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_resolve_edits(cx: &mut App) {
|
fn test_resolve_edits(cx: &mut AppContext) {
|
||||||
init_test(cx);
|
init_test(cx);
|
||||||
|
|
||||||
assert_edits(
|
assert_edits(
|
||||||
@@ -893,7 +902,7 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_test(cx: &mut App) {
|
fn init_test(cx: &mut AppContext) {
|
||||||
let settings_store = SettingsStore::test(cx);
|
let settings_store = SettingsStore::test(cx);
|
||||||
cx.set_global(settings_store);
|
cx.set_global(settings_store);
|
||||||
language::init(cx);
|
language::init(cx);
|
||||||
@@ -903,9 +912,13 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn assert_location_resolution(text_with_expected_range: &str, query: &str, cx: &mut App) {
|
fn assert_location_resolution(
|
||||||
|
text_with_expected_range: &str,
|
||||||
|
query: &str,
|
||||||
|
cx: &mut AppContext,
|
||||||
|
) {
|
||||||
let (text, _) = marked_text_ranges(text_with_expected_range, false);
|
let (text, _) = marked_text_ranges(text_with_expected_range, false);
|
||||||
let buffer = cx.new(|cx| Buffer::local(text.clone(), cx));
|
let buffer = cx.new_model(|cx| Buffer::local(text.clone(), cx));
|
||||||
let snapshot = buffer.read(cx).snapshot();
|
let snapshot = buffer.read(cx).snapshot();
|
||||||
let range = AssistantEditKind::resolve_location(&snapshot, query).to_offset(&snapshot);
|
let range = AssistantEditKind::resolve_location(&snapshot, query).to_offset(&snapshot);
|
||||||
let text_with_actual_range = generate_marked_text(&text, &[range], false);
|
let text_with_actual_range = generate_marked_text(&text, &[range], false);
|
||||||
@@ -917,10 +930,10 @@ mod tests {
|
|||||||
old_text: String,
|
old_text: String,
|
||||||
edits: Vec<AssistantEditKind>,
|
edits: Vec<AssistantEditKind>,
|
||||||
new_text: String,
|
new_text: String,
|
||||||
cx: &mut App,
|
cx: &mut AppContext,
|
||||||
) {
|
) {
|
||||||
let buffer =
|
let buffer =
|
||||||
cx.new(|cx| Buffer::local(old_text, cx).with_language(Arc::new(rust_lang()), cx));
|
cx.new_model(|cx| Buffer::local(old_text, cx).with_language(Arc::new(rust_lang()), cx));
|
||||||
let snapshot = buffer.read(cx).snapshot();
|
let snapshot = buffer.read(cx).snapshot();
|
||||||
let resolved_edits = edits
|
let resolved_edits = edits
|
||||||
.into_iter()
|
.into_iter()
|
||||||