├── .gitignore ├── samples ├── echo-key │ ├── .cargo │ │ └── config.toml │ ├── Cargo.toml │ ├── src │ │ └── main.rs │ ├── README.md │ └── my.kdl ├── float-pane-sized │ ├── .cargo │ │ └── config.toml │ ├── src │ │ ├── ui.rs │ │ ├── ui │ │ │ ├── tabs.rs │ │ │ ├── color.rs │ │ │ ├── panes.rs │ │ │ └── widgets.rs │ │ └── main.rs │ ├── Cargo.toml │ ├── README.md │ └── Cargo.lock └── plugin-worker │ ├── .cargo │ └── config.toml │ ├── Cargo.toml │ ├── README.md │ ├── src │ └── main.rs │ └── my.kdl ├── assets └── diagrams │ ├── key1.png │ └── Zellij_worker.png ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ └── CI.yml ├── README.md └── doc ├── Others └── takeaway.md ├── protobuf.md ├── key-press-flow.md └── wasm.md /.gitignore: -------------------------------------------------------------------------------- 1 | **/target 2 | -------------------------------------------------------------------------------- /samples/echo-key/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-wasi" 3 | 4 | -------------------------------------------------------------------------------- /samples/float-pane-sized/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-wasi" 3 | -------------------------------------------------------------------------------- /samples/plugin-worker/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-wasi" 3 | -------------------------------------------------------------------------------- /assets/diagrams/key1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kangaxx-0/first-zellij-plugin/HEAD/assets/diagrams/key1.png -------------------------------------------------------------------------------- /samples/float-pane-sized/src/ui.rs: -------------------------------------------------------------------------------- 1 | pub mod color; 2 | pub mod panes; 3 | pub mod tabs; 4 | pub mod widgets; 5 | -------------------------------------------------------------------------------- /assets/diagrams/Zellij_worker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kangaxx-0/first-zellij-plugin/HEAD/assets/diagrams/Zellij_worker.png -------------------------------------------------------------------------------- /samples/echo-key/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "my-first-zellij-plugin" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | zellij-tile = "0.38.1" 10 | -------------------------------------------------------------------------------- /samples/plugin-worker/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "plugin-worker" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | zellij-tile = "0.38.1" 10 | serde = { version = "1.0.188", features = ["derive"] } 11 | serde_json = "1.0.68" 12 | 13 | -------------------------------------------------------------------------------- /samples/float-pane-sized/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "float-pane-sized" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | zellij-tile = "0.38.1" 10 | serde = { version = "1.0.188", features = ["derive"] } 11 | serde_json = "1.0.68" 12 | nohash-hasher = "0.2.0" 13 | -------------------------------------------------------------------------------- /samples/float-pane-sized/src/ui/tabs.rs: -------------------------------------------------------------------------------- 1 | use zellij_tile::prelude::TabInfo; 2 | 3 | #[derive(Default, Debug, Clone)] 4 | pub struct TabUi { 5 | pub name: String, 6 | pub tab_id: usize, 7 | pub is_active: bool, 8 | } 9 | 10 | impl TabUi { 11 | pub fn new(tab: &TabInfo) -> Self { 12 | Self { 13 | name: tab.name.clone(), 14 | tab_id: tab.position, 15 | is_active: tab.active, 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Zellij Plugin System: A Comprehensive Walkthrough 🛠️ 2 | 3 | Elevate Your Terminal Experience with Customizable Plugins! 4 | 5 | Welcome to the definitive guide to the Zellij Plugin System! Have you ever wanted to extend your zellij functionalities but felt lost? We've got you covered! This repository serves as a hand-to-hand walkthrough that makes creating plugins for Zellij as easy as pie. 🥧 6 | 7 | > Currently, designing and implementing the basic components which wrap up ANSI code, see https://github.com/Kangaxx-0/first-zellij-plugin/issues/21 8 | 9 | ## 🌟 Features 10 | - Code Samples: Examples to learn from and experiment with. 11 | 1. [echo-key](./samples/echo-key/README.md) 12 | 2. [worker](./samples/plugin-worker/README.md) 13 | 3. [float-pane-resize](./samples/float-pane-sized/README.md) 14 | - Deep Dives: Get into the nitty-gritty of Zellij and its plugin system. 15 | 1. [WASM](./doc/wasm.md) - How zellij uses wasm 16 | 2. [key-flow](./doc/key-press-flow.md) - How zellij receive a key press 17 | 3. [Protobuf](./doc/protobuf.md) - A little more on zellij `.proto` files 18 | - Best Practices: Learn the do's and don'ts of plugin development in Zellij. 19 | 1. [Some suggestions](./doc/Others/takeaway.md) 20 | 21 | -------------------------------------------------------------------------------- /.github/workflows/CI.yml: -------------------------------------------------------------------------------- 1 | name: Rust PR Workflow 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - 'samples/**/*' 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@v2 15 | 16 | - name: Setup Rust 17 | uses: actions-rs/toolchain@v1 18 | with: 19 | toolchain: stable 20 | 21 | - name: Cache dependencies 22 | uses: actions/cache@v2 23 | with: 24 | path: | 25 | ~/.cargo/registry 26 | ~/.cargo/git 27 | target 28 | key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} 29 | 30 | - name: Find changed projects 31 | id: find-projects 32 | run: | 33 | # Custom script to find changed projects 34 | changed_projects=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep 'samples/.*Cargo.toml' | sed -E 's@samples/([^/]+)/.*@\1@' | uniq) 35 | echo "Changed projects: $changed_projects" 36 | echo "::set-output name=projects::$changed_projects" 37 | 38 | - name: Build & Test changed projects 39 | run: | 40 | for project in ${{ steps.find-projects.outputs.projects }}; do 41 | cd samples/$project 42 | cargo build --verbose 43 | cargo test --verbose 44 | cd - 45 | done 46 | -------------------------------------------------------------------------------- /doc/Others/takeaway.md: -------------------------------------------------------------------------------- 1 | 2 | ## Understanding the Environment 3 | 4 | When developing plugins for Zellij, it's important to recognize the unique environment you are working in. Unlike traditional terminal applications, Zellij plugins operate within a WebAssembly (WASM) runtime, which introduces specific constraints and considerations: 5 | 6 | ### Cursor Visibility and Interaction: 7 | - By design, the cursor in Zellij plugins is hidden by default. This is a conscious design choice rather than a limitation of the environment. 8 | - As a developer, you should be aware that standard methods to control or interact with the cursor (like those used in typical terminal applications) may not apply here. But, you can assume the cursor always begins with (0,0), and you have the renderable screen size from `render` function 9 | 10 | ### Limitations on Terminal Interactions: 11 | - Standard system calls or APIs that work directly with the terminal, such as getting the cursor position, might not function as expected in the Zellij plugin environment. 12 | - This is primarily because of the intermediary WASM runtime layer which separates the plugin from direct host terminal interactions. 13 | 14 | ### No Direct Terminal State Access: 15 | - Plugins do not have direct access to the terminal state. This means functionalities like querying or setting the terminal state, which are often available in conventional terminal applications, are not directly accessible in Zellij plugins. 16 | -------------------------------------------------------------------------------- /samples/echo-key/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::collections::BTreeMap; 2 | 3 | use zellij_tile::prelude::*; 4 | 5 | #[derive(Default)] 6 | struct State { 7 | key_strokes: Vec, 8 | counter: usize, 9 | render_event: String, 10 | } 11 | 12 | register_plugin!(State); 13 | 14 | impl ZellijPlugin for State { 15 | fn load(&mut self, _configuration: BTreeMap) { 16 | request_permission(&[PermissionType::ReadApplicationState]); 17 | subscribe(&[EventType::Key, EventType::ModeUpdate]); 18 | self.counter = 0; 19 | } 20 | 21 | fn update(&mut self, event: Event) -> bool { 22 | let mut render = false; 23 | match event { 24 | Event::Key(Key::Char(c)) => { 25 | self.key_strokes.push(c); 26 | self.render_event = "key char".into(); 27 | render = true; 28 | } 29 | Event::ModeUpdate(_) => { 30 | self.render_event = "Mode update".into(); 31 | render = true; 32 | } 33 | _ => { 34 | self.render_event = "other event".into(); 35 | } 36 | } 37 | render 38 | } 39 | 40 | fn render(&mut self, _rows: usize, _cols: usize) { 41 | self.counter += 1; 42 | println!( 43 | "\x1b[1;31m last key stroke is \x1b[0m => \x1b[1;32m {:?}\x1b[0m", 44 | self.key_strokes 45 | ); 46 | 47 | println!( 48 | "render at {} times due to event {}", 49 | self.counter, self.render_event 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /samples/float-pane-sized/README.md: -------------------------------------------------------------------------------- 1 | ## Prerequisites: 2 | This plugin has a dependency of [zellij clone](https://github.com/Kangaxx-0/zellij), it relies on new API `resize_floating_pane_by_percent` 3 | 4 | ## How it works: 5 | This plugin is able to resize any floating pane by given percentage 6 | 7 | 8 | ## What can you learn from this sample 9 | This plugin is designed and implemented because the built-in floating pane does not support the functionality I want. As the section of Prerequisites says this plugins depends on the new interface, lots of required knowledge can be found in [wasm](../../doc/wasm.md) and [protobuf](../../doc/protobuf.md) sections 10 | 11 | From UI perspective, When you design your plugin, you always need to keep in mind: 12 | 13 | - A "screen" refers to a virtual workspace that can contain multiple tiles. Each screen in Zellij is like a separate desktop environment that can be customized with its own layout and collection of tiles. 14 | - Tabs in Zellij allow you to switch between these different terminal sessions within each tile. For example, if you have two different shell sessions running in a single tile, you can use the tabs feature to switch between them. This allows you to manage multiple terminal sessions more efficiently and reduces the need to switch between separate terminal windows. 15 | - a "tiled_pane" refers to a single pane or tile in the tiling window manager. A tiled_pane is a rectangular area of the terminal window that contains a single terminal session or command. 16 | - A "float pane" is a special type of pane in Zellij that can overlap other panes. 17 | 18 | 19 | -------------------------------------------------------------------------------- /samples/float-pane-sized/src/ui/color.rs: -------------------------------------------------------------------------------- 1 | use zellij_tile::prelude::{Palette, PaletteColor}; 2 | 3 | #[derive(Debug, Default, Clone, Copy)] 4 | pub struct Colors { 5 | pub palette: Palette, 6 | } 7 | impl Colors { 8 | pub fn new(palette: Palette) -> Self { 9 | Colors { palette } 10 | } 11 | pub fn bold(&self, text: &str) -> String { 12 | format!("\u{1b}[1m{}\u{1b}[22m", text) 13 | } 14 | 15 | fn color(&self, color: &PaletteColor, text: &str) -> String { 16 | match color { 17 | PaletteColor::EightBit(byte) => { 18 | format!("\u{1b}[38;5;{};1m{}\u{1b}[39;22m", byte, text) 19 | } 20 | PaletteColor::Rgb((r, g, b)) => { 21 | format!("\u{1b}[38;2;{};{};{};1m{}\u{1b}[39;22m", r, g, b, text) 22 | } 23 | } 24 | } 25 | pub fn orange(&self, text: &str) -> String { 26 | self.color(&self.palette.orange, text) 27 | } 28 | 29 | pub fn green(&self, text: &str) -> String { 30 | self.color(&self.palette.green, text) 31 | } 32 | 33 | pub fn red(&self, text: &str) -> String { 34 | self.color(&self.palette.red, text) 35 | } 36 | 37 | pub fn cyan(&self, text: &str) -> String { 38 | self.color(&self.palette.cyan, text) 39 | } 40 | 41 | pub fn magenta(&self, text: &str) -> String { 42 | self.color(&self.palette.magenta, text) 43 | } 44 | 45 | pub fn blue(&self, text: &str) -> String { 46 | self.color(&self.palette.blue, text) 47 | } 48 | 49 | pub fn pink(&self, text: &str) -> String { 50 | self.color(&self.palette.pink, text) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /doc/protobuf.md: -------------------------------------------------------------------------------- 1 | # Zellij plugin Api 2 | 3 | In the [wasm introduction](./wasm.md) section, we touched based upon the use of Protocol Buffers(protobuf) in zellij for facilitating data transfer between the plugin and the host. In this document, we delve deeper into the architecture and specifics of the protobuf API in Zellij. 4 | 5 | > This doc is based on the following [commit](https://github.com/zellij-org/zellij/commit/7ccefc0d6ca6bcc079dcbf24f64ec1368d1b3791) 6 | 7 | ## Overview 8 | 9 | For each `.proto` file in zellij codebase, there exist a corresponding rust file responsible for conversions between protocol buffer and native rust types. 10 | 11 | ## Components 12 | 13 | Here are the major components of the API, which are defined in .proto files: 14 | 15 | ### Action 16 | TBD 17 | 18 | ### Message 19 | This component represents asynchronous messages intended for specific workers to handle. Typically, it's used for long-run job. 20 | 21 | ### Event 22 | The event is crucial for host-to-plugin communication. Whenever the host needs to inform the plugin about any changes or updates, it triggers an event which the plugin listens to. 23 | 24 | ### Plugin_command 25 | The plugin_command is arguably one of the most critical .proto files. It defines the APIs that the plugin can call. Below are the files that are related, either directly or indirectly, to plugin_command: 26 | - Plugin Permission: Manages the authorization level for different plugins. 27 | - Command: Contains definitions for specific operations that can be performed. 28 | - File: Includes functionalities related to file operations. 29 | - Input Mode: Specifies the various input modes supported by the plugin. 30 | - Key: Deals with key mappings and keyboard interactions. 31 | - Plugin IDs: Contains identifiers for each plugin for mapping and tracking. 32 | - Resize: Provides details on how resizing events should be handled. 33 | - Style: Holds information on styling and theming options for the plugin UI. 34 | -------------------------------------------------------------------------------- /doc/key-press-flow.md: -------------------------------------------------------------------------------- 1 | # What Happens When You Press a Key in Zellij (Assuming the Terminal Emulator is Alacritty and the Shell is zsh) 2 | Alacritty, as a terminal emulator, provides a "pseudo-terminal" (pty), which simulates a physical terminal from the past. This pty has two sides: the master (ptm) and the slave (pts or pty). 3 | 4 | - The master side provides an interface for the terminal emulator, allowing it to send input to and receive output from the slave side. 5 | - The slave side provides an interface for programs that wish to connect to a terminal, such as your shell (in this case, zsh). 6 | 7 | So, when you open Alacritty, it creates a pty pair, connects the ptm to itself, and starts a shell connected to the pts. 8 | 9 | When you start Zellij: 10 | 11 | 1. It connects to the pts provided by Alacritty(like other normal app) 12 | 2. For each pane you open, Zellij creates a new pty pair. It connects the ptm to itself and starts a shell connected to the pts. 13 | 14 | Therefore, when you have 4 panes open in Zellij, there are a total of 5 pty pairs: one for the connection between Alacritty and Zellij, and one for each pane. Each ptm is connected to either Alacritty or Zellij, and its pts is connected to either Zellij or a shell. In this way, Zellij acts as a middleman, controlling input and output between Alacritty and the shell. 15 | 16 | When you press a key in the terminal: 17 | 1. From the keyboard to the terminal emulator (Alacritty): You press a key on the keyboard, and then the operating system sends a message to Alacritty, telling it which key has been pressed. 18 | 2. From Alacritty to Zellij: Alacritty receives this input and sends it to the master side of its pty. Then, Zellij receives this data on the slave side of the pty. 19 | 3. From Zellij to the current active shell: Zellij has its own set of ptys for each pane. It reads the input from Alacritty, processes it, and then sends it to the master side of the pty for the current active pane. The shell (such as zsh) is connected to the slave side of this pty, so it receives this input. 20 | 4. From the shell to the command: The shell parses the received input as a command or part of a command and executes it. 21 | 22 | In Zellij, Zellij keeps track of the "current" pane, and the keypress eventually gets sent to the pts corresponding to the current pane. 23 | -------------------------------------------------------------------------------- /samples/echo-key/README.md: -------------------------------------------------------------------------------- 1 | ![diagram](../../assets/diagrams/key1.png) 2 | 3 | # Zellij Plugin: Key Stroke Echoer 4 | 5 | ## Overview 6 | This Zellij plugin captures and echoes keyboard key strokes in the terminal. It also monitors the number of times it renders content on the terminal, providing information on why a render was triggered. 7 | 8 | ## Key Features 9 | - Echoes Key Strokes: The plugin captures and displays each key pressed by the user. 10 | - Render Counting: Tracks and displays how many times the plugin's content is rendered. 11 | - Event Monitoring: Informs what type of event—either a key stroke or mode update—triggered the last render. 12 | 13 | ## Internal State 14 | The plugin maintains an internal state with three main components: 15 | 16 | 1. key_strokes: Stores the history of key strokes. 17 | 2. counter: Counts the number of rendering operations. 18 | 3. render_event: Identifies the last event that caused a render. 19 | 20 | 21 | ## Initialization (load Method) 22 | This function is called when the plugin is initially loaded, request permission, Subscribes interested event and other setup should be here. 23 | For our sample - On load, the plugin: 24 | 25 | - Requests permission to read the application state from Zellij. 26 | - Subscribes to Key and ModeUpdate events. 27 | 28 | > Event key does not really need permission, but `ModeUpdate` relies on `ReadAppliationState` 29 | 30 | ## Event Handling (update Method) 31 | This function is called when a subscribed event occurs, and this function returns true if it needs to trigger a render, indicated by the render flag. 32 | 33 | For our sample: 34 | 35 | - Updates the key_strokes if a key is pressed. 36 | - Updates the render_event to indicate what type of event was last received. 37 | 38 | ## Rendering (render Method) 39 | This function is responsible for rendering content: 40 | 41 | - Increments the render counter. 42 | - Outputs the last key stroke and reason for rendering to the terminal. 43 | 44 | --- 45 | 46 | # How to use 47 | 48 | This sample plugin provides a `my.kdl`, the only difference from the zellij default config is a keybinding `Ctrl t t` to render our plugin 49 | 50 | 51 | ``` 52 | bind "t" { 53 | LaunchOrFocusPlugin "file:[absolute-path]/my-first-zellij-plugin.wasm" { 54 | floating true 55 | move_to_focused_tab true 56 | }; 57 | SwitchToMode "Normal" 58 | } 59 | ``` 60 | 61 | Change the file path from your local, and run `zellij -c \my.kdl` 62 | -------------------------------------------------------------------------------- /samples/plugin-worker/README.md: -------------------------------------------------------------------------------- 1 | ## Why worker? 2 | Every zellij plugin is compiled into WASM, and WASI doesn't provide native support for multi-threading or asynchronous I/O. 3 | 4 | - Blocking the Main Thread: If you perform a long-running operation like scanning a disk within a function in your WASI module, it will block the main thread, potentially leading to poor system responsiveness. 5 | 6 | - Lack of Asynchronous APIs: WASI has not provided asynchronous APIs or native thread support, so you can't easily offload the task to another thread. 7 | 8 | - Resource Limitation: WebAssembly modules run in a constrained environment, which might have limited access to system resources. 9 | 10 | ## What does zellij do differently? 11 | 12 | zellij worker is essentially a thread to take care a long-run job. In zellij server, it starts off a channel and move receiver to a new thread(this is a common sense in zellij code) 13 | 14 | ![diagram](../../assets/diagrams/Zellij_worker.png) 15 | 16 | 17 | ## Code Explained 18 | 19 | The code primarily utilizes two structures - `FilesWorker` and `ModuleState` — to manage tasks asynchronously and update the plugin's state without blocking the main UI. 20 | 21 | ### Overview 22 | - The `FilesWorker` structure is a Zellij worker responsible for performing file search operations in a separate thread. It sends a message back to the plugin once the task is completed. 23 | 24 | - `ModuleState` is a Zellij plugin responsible for rendering the UI and handling various events. It manages the module's internal state, including the list of files (file_state). 25 | 26 | ### Workflow 27 | 28 | Key Points: 29 | - **Thread-Local**: Manages a thread-local variable (files) that tracks the files found in the given path. 30 | - **Long-Running Job Simulation**: The function search simulates a long-running task that lasts for 10 seconds. 31 | 32 | Functions: 33 | 34 | - search: Searches for files in the given path and fills the files vector with filenames. 35 | 1. Reads the directory of the given path and populates the files vector. 36 | 2. Simulates a long-running task (10 seconds). 37 | 3. Sends a "done" message to the plugin using `post_message_to_plugin`. 38 | 39 | ### Updating the module state 40 | 41 | Instead of updating `file_state` directly, the following steps are taken: 42 | 43 | 1. `FilesWorker's search` function sends a "done" message using post_message_to_plugin. This message is wrapped into a CustomEvent by the host. 44 | 2. The plugin subscribes to `EventType::CustomMessage` and listens for the "done" message. 45 | 3. Upon receiving the "done" message in the update function, `file_state` is updated with the new list of files. 46 | 47 | By separating the concerns of searching files and updating the UI, the plugin ensures that the main UI remains responsive while the long-running job is being processed. 48 | 49 | --- 50 | 51 | # How to use 52 | 53 | This sample plugin provides a `my.kdl`, the only difference from the zellij default config is a keybinding `Ctrl t t` to render our plugin 54 | 55 | 56 | ``` 57 | bind "t" { 58 | LaunchOrFocusPlugin "file:[absolute-path]" { 59 | floating true 60 | move_to_focused_tab true 61 | }; 62 | SwitchToMode "Normal" 63 | } 64 | ``` 65 | 66 | Change the file path from your local, and run `zellij -c \my.kdl` 67 | -------------------------------------------------------------------------------- /samples/plugin-worker/src/main.rs: -------------------------------------------------------------------------------- 1 | use zellij_tile::prelude::*; 2 | 3 | use serde::{Deserialize, Serialize}; 4 | use std::collections::BTreeMap; 5 | use std::time::{Duration, Instant}; 6 | 7 | const INIT_PATH: &str = "/host"; 8 | 9 | #[derive(Deserialize, Serialize, Debug, Default)] 10 | struct FilesWorker { 11 | files: Vec, 12 | } 13 | 14 | impl FilesWorker { 15 | fn search(&mut self, path: String) { 16 | let mut files = Vec::new(); 17 | let paths = std::fs::read_dir(path).unwrap(); 18 | for path in paths { 19 | let path = path.unwrap().path(); 20 | let file_name = path.file_name().unwrap().to_str().unwrap(); 21 | files.push(file_name.to_string()); 22 | } 23 | self.files = files; 24 | 25 | // Simulation of a long running task for 10 seconds 26 | let start_time = Instant::now(); 27 | let two_seconds = Duration::from_secs(10); 28 | loop { 29 | if Instant::now() - start_time >= two_seconds { 30 | break; 31 | } 32 | } 33 | 34 | post_message_to_plugin(PluginMessage { 35 | name: String::from("done"), 36 | payload: serde_json::to_string(&self.files).unwrap(), 37 | ..Default::default() 38 | }); 39 | } 40 | } 41 | 42 | impl<'de> ZellijWorker<'de> for FilesWorker { 43 | fn on_message(&mut self, message: String, payload: String) { 44 | if message == *"file_search" { 45 | self.search(payload); 46 | } else { 47 | println!("Unknown message: {}", message); 48 | } 49 | } 50 | } 51 | 52 | #[derive(Default)] 53 | struct ModuleState { 54 | file_state: Vec, 55 | loaded: bool, 56 | render_counter: usize, 57 | last_render_event: String, 58 | } 59 | 60 | register_plugin!(ModuleState); 61 | register_worker!(FilesWorker, file_search_worker, FILE_SEARCH); 62 | 63 | impl ZellijPlugin for ModuleState { 64 | fn load(&mut self, _configuration: BTreeMap) { 65 | self.render_counter = 0; 66 | subscribe(&[ 67 | EventType::CustomMessage, 68 | EventType::Key, 69 | EventType::SessionUpdate, 70 | ]); 71 | request_permission(&[PermissionType::ReadApplicationState]); 72 | post_message_to(PluginMessage { 73 | name: String::from("file_search"), 74 | payload: String::from(INIT_PATH), 75 | worker_name: Some("file_search".into()), 76 | }) 77 | } 78 | 79 | fn update(&mut self, event: Event) -> bool { 80 | let mut should_render = false; 81 | match event { 82 | Event::CustomMessage(name, payload) => { 83 | if name == *"done" { 84 | let files: Vec = serde_json::from_str(&payload).unwrap(); 85 | self.file_state = files; 86 | self.loaded = true; 87 | should_render = true; 88 | } 89 | } 90 | Event::Key(_) => { 91 | self.last_render_event = "key".into(); 92 | should_render = true; 93 | } 94 | Event::SessionUpdate(_) => { 95 | self.last_render_event = "session".into(); 96 | should_render = true; 97 | } 98 | _ => {} 99 | } 100 | should_render 101 | } 102 | 103 | fn render(&mut self, rows: usize, cols: usize) { 104 | self.render_counter += 1; 105 | 106 | println!("Render counter: {}", self.render_counter); 107 | println!("Last render event: {}", self.last_render_event); 108 | if !self.loaded { 109 | println!("\x1b[1;38;5;208mLoading...\x1b[0m"); 110 | return; 111 | } 112 | for (idx, file) in self.file_state.iter().enumerate() { 113 | println!( 114 | "# \x1b[1;31m{}\x1b[0m : file name \x1b[1;32m{}\x1b[0m", 115 | idx, file 116 | ); 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /samples/float-pane-sized/src/ui/panes.rs: -------------------------------------------------------------------------------- 1 | use zellij_tile::prelude::{PaletteColor, PaneInfo, TabInfo}; 2 | 3 | use super::color::Colors; 4 | use super::tabs::TabUi; 5 | const MAX_PATH_LEN: usize = 20; 6 | 7 | #[derive(Default, Debug, Clone)] 8 | pub struct PaneUi { 9 | pub name: String, 10 | pub pane_id: u32, 11 | pub is_plugin: bool, 12 | pub is_focused: bool, 13 | pub pane_x: usize, 14 | pub pane_content_x: usize, 15 | pub pane_y: usize, 16 | pub pane_content_y: usize, 17 | pub pane_rows: usize, 18 | pub pane_content_rows: usize, 19 | pub pane_columns: usize, 20 | pub pane_content_columns: usize, 21 | pub parent_tab: TabUi, 22 | } 23 | 24 | impl PaneUi { 25 | pub fn new(pane: &PaneInfo, tab: &TabInfo) -> Self { 26 | Self { 27 | name: pane.title.clone(), 28 | pane_id: pane.id, 29 | is_plugin: pane.is_plugin, 30 | is_focused: pane.is_focused, 31 | pane_x: pane.pane_x, 32 | pane_content_x: pane.pane_content_x, 33 | pane_y: pane.pane_y, 34 | pane_content_y: pane.pane_content_y, 35 | pane_rows: pane.pane_rows, 36 | pane_content_rows: pane.pane_content_rows, 37 | pane_columns: pane.pane_columns, 38 | pane_content_columns: pane.pane_content_columns, 39 | parent_tab: TabUi::new(tab), 40 | } 41 | } 42 | } 43 | 44 | pub struct DrawPaneLine<'p> { 45 | pub pane: PaneUi, 46 | pub selected_resize: Option<&'p PaneUi>, 47 | pub is_current: Option, 48 | pub colors: Colors, 49 | pub line: String, 50 | } 51 | 52 | impl<'p> DrawPaneLine<'p> { 53 | pub fn new( 54 | pane: PaneUi, 55 | selected_resize: Option<&'p PaneUi>, 56 | is_current: Option, 57 | colors: Colors, 58 | ) -> Self { 59 | Self { 60 | pane, 61 | selected_resize, 62 | is_current, 63 | colors, 64 | line: "".into(), 65 | } 66 | } 67 | 68 | pub fn draw(&mut self, index: usize) { 69 | let focused_text = if self.pane.is_focused { 70 | self.colors.blue("Yes") 71 | } else { 72 | self.colors.orange("No") 73 | }; 74 | let selected_indicator = if let Some(selected) = self.is_current { 75 | if selected == index { 76 | self.colors.green(">") 77 | } else { 78 | self.colors.green(" ") 79 | } 80 | } else { 81 | self.colors.green(" ") 82 | }; 83 | let index_color = self.colors.magenta(&(index.to_string())); 84 | let pane_id = self.colors.magenta(&(self.pane.pane_id.to_string())); 85 | let focus = self.colors.magenta("Focus"); 86 | let line = format!( 87 | "{}{}: [{}] {:<20} (ID: {}, {}: {})", 88 | selected_indicator, 89 | index_color, 90 | self.pane.parent_tab.name, 91 | middle_truncate(&self.pane.name), 92 | pane_id, 93 | focus, 94 | focused_text 95 | ); 96 | 97 | self.line.push_str(&line); 98 | 99 | if let Some(selected) = self.is_current { 100 | if selected == index { 101 | self.make_highlight(); 102 | } else { 103 | self.make_normal(); 104 | } 105 | } 106 | } 107 | 108 | // set the background color to green 109 | fn make_highlight(&mut self) { 110 | if self.is_current.is_some() { 111 | match self.colors.palette.bg { 112 | PaletteColor::EightBit(byte) => { 113 | self.line = format!("\x1b[48;5;{byte}m\x1b[K\r\x1b[48;5;{byte}m{}", self.line); 114 | } 115 | PaletteColor::Rgb((r, g, b)) => { 116 | self.line = format!( 117 | "\x1b[48;2;{};{};{}m\x1b[K\r\x1b[48;2;{};{};{}m{}", 118 | r, g, b, r, g, b, self.line 119 | ); 120 | } 121 | } 122 | } 123 | } 124 | 125 | // reset the background color to default 126 | fn make_normal(&mut self) { 127 | self.line = format!("\x1b[49m{}", self.line); 128 | } 129 | } 130 | fn middle_truncate(s: &str) -> String { 131 | if s.len() > MAX_PATH_LEN { 132 | let part_len = (MAX_PATH_LEN - 1) / 2; 133 | format!("{}~{}", &s[0..part_len], &s[s.len() - part_len..]) 134 | } else { 135 | s.to_string() 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /doc/wasm.md: -------------------------------------------------------------------------------- 1 | # WASI 2 | zellij is using [wasmer](https://wasmer.io/) as running for its plugin development. Zellij server plays the role of `Host`, and plugins are compiled to WebAssembly bytecode 3 | 4 | ### **Imports** 5 | Imports in WASI are functions, memories, globals, or tables that are defined outside the WebAssembly module but can be used within the module. When you instantiate a Wasm module in Wasmer, you need to provide an "import object" that maps the names of these imported items to their actual implementations in the host environment. 6 | 7 | In Zellij, this mapping of host environment features to WebAssembly modules is facilitated through the [shim.rs](https://github.com/zellij-org/zellij/blob/main/zellij-tile/src/shim.rs) file, a lot of interfaces calls the below function through FFI. 8 | 9 | ``` 10 | #[link(wasm_import_module = "zellij")] 11 | extern "C" { 12 | fn host_run_plugin_command(); 13 | } 14 | ``` 15 | Within shim.rs, a number of host functions are exposed and can be called from WebAssembly modules via the Foreign Function Interface (FFI). 16 | 17 | Under the hood, below macro is defined in zellij code base. 18 | ``` 19 | pub fn zellij_exports( 20 | store: &Store, 21 | plugin_env: &PluginEnv, 22 | subscriptions: &Arc>, 23 | ) -> ImportObject { 24 | imports! { 25 | "zellij" => { 26 | "host_run_plugin_command" => { 27 | Function::new_native_with_env(store, ForeignFunctionEnv::new(plugin_env, subscriptions), host_run_plugin_command) 28 | } 29 | } 30 | } 31 | } 32 | ``` 33 | 34 | ### **Exports** 35 | Exports are the opposite of imports: they are functions, memories, globals, or tables that are defined within a WebAssembly module and can be accessed from the host environment. 36 | Once you've instantiated a Wasm module in Wasmer, you can access its export function. 37 | 38 | In zellij, modules are exposing 4 functions that host can interact with: 39 | 40 | - `load`: An entry point for initializing the plugin, this exported function gets called when desired plugin is loading from host. 41 | 42 | - `update`: Be invoked when there's an event that the plugin needs to handle(Call `subscribe` to the event types). It reads a serialized event from the standard data, decodes it, and then updates the plugin's state accordingly, the return value is to indicate if a render is needed. 43 | 44 | - `render`: Draw or refresh the plugin's output. The plugin's render method is invoked with the terminal size specified by rows and cols. 45 | 46 | - `plugin_version`: Simply prints the plugin's version number. 47 | 48 | Call `register_plugin` macro would export above functions to host automatically. 49 | 50 | ### How does zellij and plugin transfer the data 51 | WASI has provided virtual file system for its `stdin`, `stdout` and `stderr`, e,g - [wasi_write_object](https://github.com/zellij-org/zellij/blob/main/zellij-server/src/plugins/zellij_exports.rs#L1069) writes the data to STDIN, and [wasi_read_object](https://github.com/zellij-org/zellij/blob/main/zellij-server/src/plugins/zellij_exports.rs#L1076) reads data from its STDOUT; 52 | for plugin module, there are a few functions can be used: 53 | 54 | 1. [object_from_stdin](https://github.com/zellij-org/zellij/blob/main/zellij-tile/src/shim.rs#L624) 55 | 2. [bytes_from_stdin](https://github.com/zellij-org/zellij/blob/main/zellij-tile/src/shim.rs#L633) 56 | 3. [object_to_stdout](https://github.com/zellij-org/zellij/blob/main/zellij-tile/src/shim.rs#L641) 57 | 58 | ### wasm runtime configraution in zellij host 59 | 1. Setting Environment Variables 60 | - Sets CLICOLOR_FORCE to "1". For more details, please click [HERE](https://bixense.com/clicolors/) 61 | 2. Mapping Directories - Maps host directories to the WASM environment: 62 | - `/host` -> self.zellij_cwd (Zellij's current working directory) 63 | - `/data` -> self.plugin_own_data_dir (plugin data directory) 64 | - `/tmp` -> ZELLIJ_TMP_DIR.as_path() (temporary directory for Zellij) 65 | > With this mounts, we can access host file system from module/plugin code 66 | 3. Configuring Standard Streams : Configures stdin, stdout, and stderr using Pipe and LoggingPipe. Handles input/output and error logging within the WASM environment. 67 | 68 | ### Protobuf support 69 | Starting from version [0.38](https://github.com/zellij-org/zellij/releases/tag/v0.38.0), Zellij has incorporated Protocol Buffers (Protobuf) for more efficient and robust data serialization and transmission between the host and various modules. This allows complex data structures to be easily transferred across the system. 70 | 71 | There are a bunches of APIs available under [zellij_utils crate](https://github.com/zellij-org/zellij/tree/main/zellij-utils/src/plugin_api).If you find that the existing APIs don't meet your requirements and you need to extend them, here's a step-by-step guide to doing so: 72 | 1. Create a New .proto File: The first step is to define your new API or message format. Create a new .proto file where you specify the message structure according to the Protobuf specification. 73 | 2. Compile the .proto File: Use the Protobuf compiler (protoc) to compile the .proto file. This will generate source code for encoding and decoding the message types in your .proto file. 74 | 3. Implement Conversion Code: Implement the necessary Rust code to convert between your custom types and the Protobuf-generated types. Add this code to the appropriate location. 75 | 4. Test Your Implementation: Before pushing your changes, make sure to thoroughly test the new API to ensure it works as expected and doesn't introduce any regressions. 76 | -------------------------------------------------------------------------------- /samples/float-pane-sized/src/ui/widgets.rs: -------------------------------------------------------------------------------- 1 | use std::io::{self, Write}; 2 | 3 | use super::color::Colors; 4 | use super::panes::{DrawPaneLine, PaneUi}; 5 | 6 | pub fn compose_ui( 7 | rows: usize, 8 | cols: usize, 9 | colors: Colors, 10 | panes: Vec, 11 | selected_pane: Option<&PaneUi>, 12 | current_pane_index: Option, 13 | new_width: u8, 14 | new_height: u8, 15 | ) { 16 | clear_screen(); 17 | if let Some(pane) = selected_pane { 18 | header_resize(rows, cols, colors, pane.pane_id); 19 | selected_pane_size(&pane, colors); 20 | set_pane_size(new_width, new_height, colors); 21 | resize_control(rows, cols, colors); 22 | } else { 23 | header_man(rows, cols, colors); 24 | listing_panes(rows, cols, colors, panes, selected_pane, current_pane_index); 25 | pane_control(rows, cols, colors); 26 | } 27 | io::stdout().flush().unwrap(); 28 | } 29 | 30 | pub fn header_man(rows: usize, cols: usize, color: Colors) { 31 | let text = color.cyan("Floating Pane Manager"); 32 | let text_length = text.len(); 33 | 34 | let padding_each_side = (cols - text_length) / 2; 35 | let repeated = " ".repeat(padding_each_side); 36 | 37 | print!("{}", repeated); 38 | println!("{}", text); 39 | 40 | if rows % 2 != text_length % 2 { 41 | print!(" "); 42 | } 43 | 44 | let split = "-".repeat(cols - 1); 45 | println!("{}", split); 46 | } 47 | 48 | pub fn header_resize(rows: usize, cols: usize, color: Colors, pane_id: u32) { 49 | let header = format!("Resize: Pane by index - {}", pane_id); 50 | let head = color.cyan(&header); 51 | let text_length = head.len(); 52 | 53 | let padding_each_side = (cols - text_length) / 2; 54 | let repeated = " ".repeat(padding_each_side); 55 | 56 | print!("{}", repeated); 57 | println!("{}", head); 58 | 59 | if rows % 2 != text_length % 2 { 60 | print!(" "); 61 | } 62 | 63 | let split = "-".repeat(cols - 1); 64 | println!("{}", split); 65 | } 66 | 67 | fn selected_pane_size(pane: &PaneUi, colors: Colors) { 68 | let width = colors.orange(&pane.pane_rows.to_string()); 69 | let height = colors.orange(&pane.pane_columns.to_string()); 70 | 71 | let cell_horizontal_border = "".repeat(32); // Adjust the length as needed 72 | let cell_vertical_border = "|"; 73 | 74 | println!("{}", cell_horizontal_border); 75 | println!( 76 | "{} Width: {} | Length: {} {}", 77 | cell_vertical_border, width, height, cell_vertical_border 78 | ); 79 | println!("{}", cell_horizontal_border); 80 | } 81 | 82 | fn set_pane_size(new_width: u8, new_height: u8, colors: Colors) { 83 | let new_width = colors.magenta(&new_width.to_string()); 84 | let new_height = colors.magenta(&new_height.to_string()); 85 | let width_text = colors.bold("Enter new width"); 86 | let height_text = colors.bold("Enter new length"); 87 | println!("- {width_text} -> [{new_width}] percent"); 88 | println!("- {height_text} -> [{new_height}] percent"); 89 | } 90 | 91 | pub fn pane_control(row: usize, max_cols: usize, colors: Colors) { 92 | let arrows = colors.magenta("<↓↑>"); 93 | let navigate = colors.bold("Navigate"); 94 | let enter = colors.magenta(""); 95 | let select = colors.bold("Select a pane"); 96 | let esc = colors.magenta(""); 97 | let hide = colors.bold("Hide this plugin"); 98 | let exit = colors.magenta(""); 99 | let close = colors.bold("Close this pane"); 100 | 101 | let split = "─".repeat(max_cols); 102 | let split_ln_no = row - 1; 103 | // ANSI escape code to draw a line at the second last line, \x1b[{}H sets the cursor to second last line 104 | println!("\x1b[{}H{}", split_ln_no, split); 105 | print!("\u{1b}[m\u{1b}[{row}H{arrows} : {navigate}; {enter} : {select}; {esc} : {hide}; {exit} : {close}"); 106 | } 107 | 108 | pub fn resize_control(row: usize, max_cols: usize, colors: Colors) { 109 | let numbers = colors.magenta("<0-99>"); 110 | let size = colors.bold("Set size"); 111 | let enter = colors.magenta(""); 112 | let confirm = colors.bold("Confirm a size"); 113 | let select = colors.magenta(""); 114 | let submit = colors.bold("Submit"); 115 | let reset = colors.magenta(""); 116 | let reset_size = colors.bold("Reset size"); 117 | let esc = colors.magenta(""); 118 | let cancel = colors.bold("Cancel"); 119 | let exit = colors.magenta(""); 120 | let close = colors.bold("Close this pane"); 121 | 122 | let split = "─".repeat(max_cols); 123 | let split_ln_no = row - 1; 124 | // ANSI escape code to draw a line at the second last line, \x1b[{}H sets the cursor to second last line 125 | println!("\x1b[{}H{}", split_ln_no, split); 126 | print!("\u{1b}[m\u{1b}[{row}H{numbers} : {size}; {enter} : {confirm}; {select} : {submit}; {reset} : {reset_size}; {esc} : {cancel}; {exit} : {close}"); 127 | } 128 | 129 | pub fn listing_panes( 130 | row: usize, 131 | max_cols: usize, 132 | colors: Colors, 133 | panes: Vec, 134 | selected_pane: Option<&PaneUi>, 135 | current_pane_index: Option, 136 | ) { 137 | let mut index = 1; 138 | for pane in panes { 139 | let mut new_line = DrawPaneLine::new(pane, selected_pane, current_pane_index, colors); 140 | new_line.draw(index); 141 | println!("{}", new_line.line); 142 | index += 1; 143 | } 144 | } 145 | 146 | fn clear_screen() { 147 | print!("\x1b[2J\x1b[H"); 148 | } 149 | -------------------------------------------------------------------------------- /samples/float-pane-sized/src/main.rs: -------------------------------------------------------------------------------- 1 | mod ui; 2 | 3 | use ui::color::Colors; 4 | use ui::panes::PaneUi; 5 | use ui::widgets::compose_ui; 6 | 7 | use zellij_tile::prelude::*; 8 | 9 | use nohash_hasher::IntMap; 10 | use std::collections::BTreeMap; 11 | 12 | #[derive(Default, Clone)] 13 | struct State { 14 | is_loading: bool, 15 | panes: IntMap, 16 | selected_pane: Option, 17 | cursor_pane_index: Option, 18 | colors: Colors, 19 | new_width: u8, 20 | new_height: u8, 21 | input_buffer: String, 22 | awaiting_length_input: bool, 23 | } 24 | 25 | register_plugin!(State); 26 | 27 | impl ZellijPlugin for State { 28 | fn load(&mut self, _configuration: BTreeMap) { 29 | request_permission(&[ 30 | PermissionType::ReadApplicationState, 31 | PermissionType::ChangeApplicationState, 32 | ]); 33 | subscribe(&[ 34 | EventType::SessionUpdate, 35 | EventType::Key, 36 | EventType::ModeUpdate, 37 | ]); 38 | self.is_loading = true; 39 | } 40 | 41 | fn update(&mut self, event: Event) -> bool { 42 | let mut render = false; 43 | match event { 44 | Event::ModeUpdate(mode_info) => { 45 | self.colors = Colors::new(mode_info.style.colors); 46 | render = true; 47 | } 48 | Event::Key(key) => { 49 | self.handle_key(key); 50 | render = true; 51 | } 52 | Event::SessionUpdate(session_info, _) => { 53 | self.get_panes(&session_info); 54 | if self.selected_pane.is_some() { 55 | self.update_selected_pane(&session_info); 56 | } 57 | self.is_loading = false; 58 | render = true; 59 | } 60 | Event::PermissionRequestResult(_result) => { 61 | render = true; 62 | } 63 | _ => { 64 | self.is_loading = true; 65 | } 66 | } 67 | render 68 | } 69 | 70 | fn render(&mut self, rows: usize, cols: usize) { 71 | if !self.is_loading { 72 | let panes: Vec = self.panes.values().cloned().collect(); 73 | compose_ui( 74 | rows, 75 | cols, 76 | self.colors, 77 | panes, 78 | self.selected_pane.as_ref(), 79 | self.cursor_pane_index, 80 | self.new_width, 81 | self.new_height, 82 | ); 83 | } 84 | } 85 | } 86 | 87 | impl State { 88 | fn get_panes(&mut self, session: &[SessionInfo]) { 89 | self.panes.clear(); 90 | let current_session = session 91 | .iter() 92 | .find(|session| session.is_current_session) 93 | .expect("no current session"); 94 | let mut start_idx = 1; 95 | 96 | for tab in ¤t_session.tabs { 97 | if let Some(related_panes) = current_session.panes.panes.get(&tab.position) { 98 | let filtered_panes: Vec = related_panes 99 | .iter() 100 | .filter_map(|pane| { 101 | if pane.is_floating { 102 | Some(PaneUi::new(pane, tab)) 103 | } else { 104 | None 105 | } 106 | }) 107 | .collect(); 108 | 109 | for pane in filtered_panes { 110 | self.panes.insert(start_idx, pane); 111 | start_idx += 1; 112 | } 113 | } 114 | } 115 | } 116 | 117 | fn update_selected_pane(&mut self, session: &[SessionInfo]) { 118 | let current_session = session 119 | .iter() 120 | .find(|session| session.is_current_session) 121 | .expect("no current session"); 122 | 123 | if let Some(selected_pane) = &self.selected_pane { 124 | let selected_tab_id = selected_pane.parent_tab.tab_id; 125 | let selected_pane_id = selected_pane.pane_id; 126 | 127 | if let Some(pane_info) = 128 | current_session 129 | .panes 130 | .panes 131 | .get(&selected_tab_id) 132 | .and_then(|pane_from_tab| { 133 | pane_from_tab 134 | .iter() 135 | .find(|pane_info| pane_info.id == selected_pane_id) 136 | }) 137 | { 138 | if let Some(parent_tab) = current_session.tabs.get(selected_tab_id) { 139 | self.selected_pane = Some(PaneUi::new(pane_info, parent_tab)); 140 | } 141 | } 142 | } 143 | } 144 | 145 | fn send_resize_event(&mut self) { 146 | let size = ResizeByPercent { 147 | width: self.new_width as u32, 148 | height: self.new_height as u32, 149 | }; 150 | 151 | let tab_pos = self.selected_pane.as_ref().unwrap().parent_tab.tab_id; 152 | let pane_id = if let Some(pane) = self.selected_pane.as_ref() { 153 | if pane.is_plugin { 154 | Some(PaneId::Plugin(pane.pane_id)) 155 | } else { 156 | Some(PaneId::Terminal(pane.pane_id)) 157 | } 158 | } else { 159 | None 160 | }; 161 | 162 | resize_floating_pane_by_percent(size, Some(tab_pos.try_into().unwrap()), pane_id); 163 | 164 | self.new_width = 0; 165 | self.new_height = 0; 166 | } 167 | 168 | fn handle_key(&mut self, e: Key) { 169 | match e { 170 | Key::Down => match self.cursor_pane_index { 171 | Some(idx) if idx < self.panes.len() => { 172 | self.cursor_pane_index = Some(idx + 1); 173 | } 174 | Some(idx) if idx == self.panes.len() => { 175 | self.cursor_pane_index = Some(1); 176 | } 177 | Some(_) => { 178 | unreachable!() 179 | } 180 | None => self.cursor_pane_index = Some(1), 181 | }, 182 | Key::Up => match self.cursor_pane_index { 183 | Some(idx) if idx > 1 => { 184 | self.cursor_pane_index = Some(idx - 1); 185 | } 186 | Some(idx) if idx == 1 => { 187 | self.cursor_pane_index = Some(self.panes.len()); 188 | } 189 | Some(_) => { 190 | unreachable!() 191 | } 192 | None => self.cursor_pane_index = Some(1), 193 | }, 194 | Key::Ctrl(c) => { 195 | if c == 's' && self.selected_pane.is_some() { 196 | self.send_resize_event(); 197 | } else if c == 'r' && self.selected_pane.is_some() { 198 | self.new_width = 0; 199 | self.new_height = 0; 200 | self.input_buffer.clear(); 201 | self.awaiting_length_input = false; 202 | } else if c == 'e' { 203 | close_focus(); 204 | } 205 | } 206 | Key::Esc => { 207 | if self.selected_pane.is_some() { 208 | self.selected_pane = None; 209 | self.new_width = 0; 210 | self.new_height = 0; 211 | } else { 212 | hide_self(); 213 | } 214 | } 215 | Key::Delete => { 216 | if self.selected_pane.is_some() { 217 | self.selected_pane = None; 218 | } else { 219 | hide_self(); 220 | } 221 | } 222 | Key::Char(c) => match c { 223 | '\n' if self.selected_pane.is_none() => { 224 | self.selected_pane = self 225 | .cursor_pane_index 226 | .and_then(|idx| self.panes.get(&idx).cloned()); 227 | } 228 | '\n' if self.selected_pane.is_some() => { 229 | if self.awaiting_length_input { 230 | self.new_height = self.input_buffer.parse::().unwrap_or(0); 231 | self.input_buffer.clear(); 232 | self.awaiting_length_input = false; 233 | } else { 234 | self.new_width = self.input_buffer.parse::().unwrap_or(0); 235 | self.input_buffer.clear(); 236 | self.awaiting_length_input = true; 237 | } 238 | } 239 | '0'..='9' => { 240 | if self.selected_pane.is_some() { 241 | self.capture_number_input(c); 242 | } 243 | } 244 | _ => {} 245 | }, 246 | _ => {} 247 | } 248 | } 249 | 250 | fn capture_number_input(&mut self, c: char) { 251 | self.input_buffer.push(c); 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /samples/plugin-worker/my.kdl: -------------------------------------------------------------------------------- 1 | // If you'd like to override the default keybindings completely, be sure to change "keybinds" to "keybinds clear-defaults=true" 2 | keybinds { 3 | normal { 4 | // uncomment this and adjust key if using copy_on_select=false 5 | // bind "Alt c" { Copy; } 6 | } 7 | locked { 8 | bind "Ctrl g" { SwitchToMode "Normal"; } 9 | } 10 | resize { 11 | bind "Ctrl n" { SwitchToMode "Normal"; } 12 | bind "h" "Left" { Resize "Increase Left"; } 13 | bind "j" "Down" { Resize "Increase Down"; } 14 | bind "k" "Up" { Resize "Increase Up"; } 15 | bind "l" "Right" { Resize "Increase Right"; } 16 | bind "H" { Resize "Decrease Left"; } 17 | bind "J" { Resize "Decrease Down"; } 18 | bind "K" { Resize "Decrease Up"; } 19 | bind "L" { Resize "Decrease Right"; } 20 | bind "=" "+" { Resize "Increase"; } 21 | bind "-" { Resize "Decrease"; } 22 | } 23 | pane { 24 | bind "Ctrl p" { SwitchToMode "Normal"; } 25 | bind "h" "Left" { MoveFocus "Left"; } 26 | bind "l" "Right" { MoveFocus "Right"; } 27 | bind "j" "Down" { MoveFocus "Down"; } 28 | bind "k" "Up" { MoveFocus "Up"; } 29 | bind "p" { SwitchFocus; } 30 | bind "n" { NewPane; SwitchToMode "Normal"; } 31 | bind "d" { NewPane "Down"; SwitchToMode "Normal"; } 32 | bind "r" { NewPane "Right"; SwitchToMode "Normal"; } 33 | bind "x" { CloseFocus; SwitchToMode "Normal"; } 34 | bind "f" { ToggleFocusFullscreen; SwitchToMode "Normal"; } 35 | bind "z" { TogglePaneFrames; SwitchToMode "Normal"; } 36 | bind "w" { ToggleFloatingPanes; SwitchToMode "Normal"; } 37 | bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "Normal"; } 38 | bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;} 39 | } 40 | move { 41 | bind "Ctrl h" { SwitchToMode "Normal"; } 42 | bind "n" "Tab" { MovePane; } 43 | bind "p" { MovePaneBackwards; } 44 | bind "h" "Left" { MovePane "Left"; } 45 | bind "j" "Down" { MovePane "Down"; } 46 | bind "k" "Up" { MovePane "Up"; } 47 | bind "l" "Right" { MovePane "Right"; } 48 | } 49 | tab { 50 | bind "Ctrl t" { SwitchToMode "Normal"; } 51 | bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; } 52 | bind "h" "Left" "Up" "k" { GoToPreviousTab; } 53 | bind "l" "Right" "Down" "j" { GoToNextTab; } 54 | bind "n" { NewTab; SwitchToMode "Normal"; } 55 | bind "x" { CloseTab; SwitchToMode "Normal"; } 56 | bind "s" { ToggleActiveSyncTab; SwitchToMode "Normal"; } 57 | bind "b" { BreakPane; SwitchToMode "Normal"; } 58 | bind "]" { BreakPaneRight; SwitchToMode "Normal"; } 59 | bind "[" { BreakPaneLeft; SwitchToMode "Normal"; } 60 | bind "1" { GoToTab 1; SwitchToMode "Normal"; } 61 | bind "2" { GoToTab 2; SwitchToMode "Normal"; } 62 | bind "3" { GoToTab 3; SwitchToMode "Normal"; } 63 | bind "4" { GoToTab 4; SwitchToMode "Normal"; } 64 | bind "5" { GoToTab 5; SwitchToMode "Normal"; } 65 | bind "6" { GoToTab 6; SwitchToMode "Normal"; } 66 | bind "7" { GoToTab 7; SwitchToMode "Normal"; } 67 | bind "8" { GoToTab 8; SwitchToMode "Normal"; } 68 | bind "9" { GoToTab 9; SwitchToMode "Normal"; } 69 | bind "Tab" { ToggleTab; } 70 | bind "t" { 71 | LaunchOrFocusPlugin "file:/plugin-worker.wasm" { 72 | floating true 73 | move_to_focused_tab true 74 | }; 75 | SwitchToMode "Normal" 76 | } 77 | } 78 | scroll { 79 | bind "Ctrl s" { SwitchToMode "Normal"; } 80 | bind "e" { EditScrollback; SwitchToMode "Normal"; } 81 | bind "s" { SwitchToMode "EnterSearch"; SearchInput 0; } 82 | bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; } 83 | bind "j" "Down" { ScrollDown; } 84 | bind "k" "Up" { ScrollUp; } 85 | bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } 86 | bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } 87 | bind "d" { HalfPageScrollDown; } 88 | bind "u" { HalfPageScrollUp; } 89 | // uncomment this and adjust key if using copy_on_select=false 90 | // bind "Alt c" { Copy; } 91 | } 92 | search { 93 | bind "Ctrl s" { SwitchToMode "Normal"; } 94 | bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; } 95 | bind "j" "Down" { ScrollDown; } 96 | bind "k" "Up" { ScrollUp; } 97 | bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } 98 | bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } 99 | bind "d" { HalfPageScrollDown; } 100 | bind "u" { HalfPageScrollUp; } 101 | bind "n" { Search "down"; } 102 | bind "p" { Search "up"; } 103 | bind "c" { SearchToggleOption "CaseSensitivity"; } 104 | bind "w" { SearchToggleOption "Wrap"; } 105 | bind "o" { SearchToggleOption "WholeWord"; } 106 | } 107 | entersearch { 108 | bind "Ctrl c" "Esc" { SwitchToMode "Scroll"; } 109 | bind "Enter" { SwitchToMode "Search"; } 110 | } 111 | renametab { 112 | bind "Ctrl c" { SwitchToMode "Normal"; } 113 | bind "Esc" { UndoRenameTab; SwitchToMode "Tab"; } 114 | } 115 | renamepane { 116 | bind "Ctrl c" { SwitchToMode "Normal"; } 117 | bind "Esc" { UndoRenamePane; SwitchToMode "Pane"; } 118 | } 119 | session { 120 | bind "Ctrl o" { SwitchToMode "Normal"; } 121 | bind "Ctrl s" { SwitchToMode "Scroll"; } 122 | bind "d" { Detach; } 123 | bind "w" { 124 | LaunchOrFocusPlugin "zellij:session-manager" { 125 | floating true 126 | move_to_focused_tab true 127 | }; 128 | SwitchToMode "Normal" 129 | } 130 | } 131 | tmux { 132 | bind "[" { SwitchToMode "Scroll"; } 133 | bind "Ctrl b" { Write 2; SwitchToMode "Normal"; } 134 | bind "\"" { NewPane "Down"; SwitchToMode "Normal"; } 135 | bind "%" { NewPane "Right"; SwitchToMode "Normal"; } 136 | bind "z" { ToggleFocusFullscreen; SwitchToMode "Normal"; } 137 | bind "c" { NewTab; SwitchToMode "Normal"; } 138 | bind "," { SwitchToMode "RenameTab"; } 139 | bind "p" { GoToPreviousTab; SwitchToMode "Normal"; } 140 | bind "n" { GoToNextTab; SwitchToMode "Normal"; } 141 | bind "Left" { MoveFocus "Left"; SwitchToMode "Normal"; } 142 | bind "Right" { MoveFocus "Right"; SwitchToMode "Normal"; } 143 | bind "Down" { MoveFocus "Down"; SwitchToMode "Normal"; } 144 | bind "Up" { MoveFocus "Up"; SwitchToMode "Normal"; } 145 | bind "h" { MoveFocus "Left"; SwitchToMode "Normal"; } 146 | bind "l" { MoveFocus "Right"; SwitchToMode "Normal"; } 147 | bind "j" { MoveFocus "Down"; SwitchToMode "Normal"; } 148 | bind "k" { MoveFocus "Up"; SwitchToMode "Normal"; } 149 | bind "o" { FocusNextPane; } 150 | bind "d" { Detach; } 151 | bind "Space" { NextSwapLayout; } 152 | bind "x" { CloseFocus; SwitchToMode "Normal"; } 153 | } 154 | shared_except "locked" { 155 | bind "Ctrl g" { SwitchToMode "Locked"; } 156 | bind "Ctrl q" { Quit; } 157 | bind "Alt n" { NewPane; } 158 | bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; } 159 | bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; } 160 | bind "Alt j" "Alt Down" { MoveFocus "Down"; } 161 | bind "Alt k" "Alt Up" { MoveFocus "Up"; } 162 | bind "Alt =" "Alt +" { Resize "Increase"; } 163 | bind "Alt -" { Resize "Decrease"; } 164 | bind "Alt [" { PreviousSwapLayout; } 165 | bind "Alt ]" { NextSwapLayout; } 166 | } 167 | shared_except "normal" "locked" { 168 | bind "Enter" "Esc" { SwitchToMode "Normal"; } 169 | } 170 | shared_except "pane" "locked" { 171 | bind "Ctrl p" { SwitchToMode "Pane"; } 172 | } 173 | shared_except "resize" "locked" { 174 | bind "Ctrl n" { SwitchToMode "Resize"; } 175 | } 176 | shared_except "scroll" "locked" { 177 | bind "Ctrl s" { SwitchToMode "Scroll"; } 178 | } 179 | shared_except "session" "locked" { 180 | bind "Ctrl o" { SwitchToMode "Session"; } 181 | } 182 | shared_except "tab" "locked" { 183 | bind "Ctrl t" { SwitchToMode "Tab"; } 184 | } 185 | shared_except "move" "locked" { 186 | bind "Ctrl h" { SwitchToMode "Move"; } 187 | } 188 | shared_except "tmux" "locked" { 189 | bind "Ctrl b" { SwitchToMode "Tmux"; } 190 | } 191 | } 192 | 193 | plugins { 194 | tab-bar { path "tab-bar"; } 195 | status-bar { path "status-bar"; } 196 | strider { path "strider"; } 197 | compact-bar { path "compact-bar"; } 198 | session-manager { path "session-manager"; } 199 | } 200 | 201 | // Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP 202 | // eg. when terminal window with an active zellij session is closed 203 | // Options: 204 | // - detach (Default) 205 | // - quit 206 | // 207 | // on_force_close "quit" 208 | 209 | // Send a request for a simplified ui (without arrow fonts) to plugins 210 | // Options: 211 | // - true 212 | // - false (Default) 213 | // 214 | // simplified_ui true 215 | 216 | // Choose the path to the default shell that zellij will use for opening new panes 217 | // Default: $SHELL 218 | // 219 | // default_shell "fish" 220 | 221 | // Choose the path to override cwd that zellij will use for opening new panes 222 | // 223 | // default_cwd "" 224 | 225 | // Toggle between having pane frames around the panes 226 | // Options: 227 | // - true (default) 228 | // - false 229 | // 230 | // pane_frames true 231 | 232 | // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible 233 | // Options: 234 | // - true (default) 235 | // - false 236 | // 237 | // auto_layout true 238 | 239 | // Define color themes for Zellij 240 | // For more examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes 241 | // Once these themes are defined, one of them should to be selected in the "theme" section of this file 242 | // 243 | // themes { 244 | // dracula { 245 | // fg 248 248 242 246 | // bg 40 42 54 247 | // red 255 85 85 248 | // green 80 250 123 249 | // yellow 241 250 140 250 | // blue 98 114 164 251 | // magenta 255 121 198 252 | // orange 255 184 108 253 | // cyan 139 233 253 254 | // black 0 0 0 255 | // white 255 255 255 256 | // } 257 | // } 258 | 259 | // Choose the theme that is specified in the themes section. 260 | // Default: default 261 | // 262 | // theme "default" 263 | 264 | // The name of the default layout to load on startup 265 | // Default: "default" 266 | // 267 | // default_layout "compact" 268 | 269 | // Choose the mode that zellij uses when starting up. 270 | // Default: normal 271 | // 272 | // default_mode "locked" 273 | 274 | // Toggle enabling the mouse mode. 275 | // On certain configurations, or terminals this could 276 | // potentially interfere with copying text. 277 | // Options: 278 | // - true (default) 279 | // - false 280 | // 281 | // mouse_mode false 282 | 283 | // Configure the scroll back buffer size 284 | // This is the number of lines zellij stores for each pane in the scroll back 285 | // buffer. Excess number of lines are discarded in a FIFO fashion. 286 | // Valid values: positive integers 287 | // Default value: 10000 288 | // 289 | // scroll_buffer_size 10000 290 | 291 | // Provide a command to execute when copying text. The text will be piped to 292 | // the stdin of the program to perform the copy. This can be used with 293 | // terminal emulators which do not support the OSC 52 ANSI control sequence 294 | // that will be used by default if this option is not set. 295 | // Examples: 296 | // 297 | // copy_command "xclip -selection clipboard" // x11 298 | // copy_command "wl-copy" // wayland 299 | // copy_command "pbcopy" // osx 300 | 301 | // Choose the destination for copied text 302 | // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. 303 | // Does not apply when using copy_command. 304 | // Options: 305 | // - system (default) 306 | // - primary 307 | // 308 | // copy_clipboard "primary" 309 | 310 | // Enable or disable automatic copy (and clear) of selection when releasing mouse 311 | // Default: true 312 | // 313 | // copy_on_select false 314 | 315 | // Path to the default editor to use to edit pane scrollbuffer 316 | // Default: $EDITOR or $VISUAL 317 | // 318 | // scrollback_editor "/usr/bin/vim" 319 | 320 | // When attaching to an existing session with other users, 321 | // should the session be mirrored (true) 322 | // or should each user have their own cursor (false) 323 | // Default: false 324 | // 325 | // mirror_session true 326 | 327 | // The folder in which Zellij will look for layouts 328 | // 329 | // layout_dir "/path/to/my/layout_dir" 330 | 331 | // The folder in which Zellij will look for themes 332 | // 333 | // theme_dir "/path/to/my/theme_dir" 334 | 335 | -------------------------------------------------------------------------------- /samples/echo-key/my.kdl: -------------------------------------------------------------------------------- 1 | // If you'd like to override the default keybindings completely, be sure to change "keybinds" to "keybinds clear-defaults=true" 2 | keybinds { 3 | normal { 4 | // uncomment this and adjust key if using copy_on_select=false 5 | // bind "Alt c" { Copy; } 6 | } 7 | locked { 8 | bind "Ctrl g" { SwitchToMode "Normal"; } 9 | } 10 | resize { 11 | bind "Ctrl n" { SwitchToMode "Normal"; } 12 | bind "h" "Left" { Resize "Increase Left"; } 13 | bind "j" "Down" { Resize "Increase Down"; } 14 | bind "k" "Up" { Resize "Increase Up"; } 15 | bind "l" "Right" { Resize "Increase Right"; } 16 | bind "H" { Resize "Decrease Left"; } 17 | bind "J" { Resize "Decrease Down"; } 18 | bind "K" { Resize "Decrease Up"; } 19 | bind "L" { Resize "Decrease Right"; } 20 | bind "=" "+" { Resize "Increase"; } 21 | bind "-" { Resize "Decrease"; } 22 | } 23 | pane { 24 | bind "Ctrl p" { SwitchToMode "Normal"; } 25 | bind "h" "Left" { MoveFocus "Left"; } 26 | bind "l" "Right" { MoveFocus "Right"; } 27 | bind "j" "Down" { MoveFocus "Down"; } 28 | bind "k" "Up" { MoveFocus "Up"; } 29 | bind "p" { SwitchFocus; } 30 | bind "n" { NewPane; SwitchToMode "Normal"; } 31 | bind "d" { NewPane "Down"; SwitchToMode "Normal"; } 32 | bind "r" { NewPane "Right"; SwitchToMode "Normal"; } 33 | bind "x" { CloseFocus; SwitchToMode "Normal"; } 34 | bind "f" { ToggleFocusFullscreen; SwitchToMode "Normal"; } 35 | bind "z" { TogglePaneFrames; SwitchToMode "Normal"; } 36 | bind "w" { ToggleFloatingPanes; SwitchToMode "Normal"; } 37 | bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "Normal"; } 38 | bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;} 39 | } 40 | move { 41 | bind "Ctrl h" { SwitchToMode "Normal"; } 42 | bind "n" "Tab" { MovePane; } 43 | bind "p" { MovePaneBackwards; } 44 | bind "h" "Left" { MovePane "Left"; } 45 | bind "j" "Down" { MovePane "Down"; } 46 | bind "k" "Up" { MovePane "Up"; } 47 | bind "l" "Right" { MovePane "Right"; } 48 | } 49 | tab { 50 | bind "Ctrl t" { SwitchToMode "Normal"; } 51 | bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; } 52 | bind "h" "Left" "Up" "k" { GoToPreviousTab; } 53 | bind "l" "Right" "Down" "j" { GoToNextTab; } 54 | bind "n" { NewTab; SwitchToMode "Normal"; } 55 | bind "x" { CloseTab; SwitchToMode "Normal"; } 56 | bind "s" { ToggleActiveSyncTab; SwitchToMode "Normal"; } 57 | bind "b" { BreakPane; SwitchToMode "Normal"; } 58 | bind "]" { BreakPaneRight; SwitchToMode "Normal"; } 59 | bind "[" { BreakPaneLeft; SwitchToMode "Normal"; } 60 | bind "1" { GoToTab 1; SwitchToMode "Normal"; } 61 | bind "2" { GoToTab 2; SwitchToMode "Normal"; } 62 | bind "3" { GoToTab 3; SwitchToMode "Normal"; } 63 | bind "4" { GoToTab 4; SwitchToMode "Normal"; } 64 | bind "5" { GoToTab 5; SwitchToMode "Normal"; } 65 | bind "6" { GoToTab 6; SwitchToMode "Normal"; } 66 | bind "7" { GoToTab 7; SwitchToMode "Normal"; } 67 | bind "8" { GoToTab 8; SwitchToMode "Normal"; } 68 | bind "9" { GoToTab 9; SwitchToMode "Normal"; } 69 | bind "Tab" { ToggleTab; } 70 | bind "t" { 71 | LaunchOrFocusPlugin "file:/my-first-zellij-plugin.wasm" { 72 | floating true 73 | move_to_focused_tab true 74 | }; 75 | SwitchToMode "Normal" 76 | } 77 | } 78 | scroll { 79 | bind "Ctrl s" { SwitchToMode "Normal"; } 80 | bind "e" { EditScrollback; SwitchToMode "Normal"; } 81 | bind "s" { SwitchToMode "EnterSearch"; SearchInput 0; } 82 | bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; } 83 | bind "j" "Down" { ScrollDown; } 84 | bind "k" "Up" { ScrollUp; } 85 | bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } 86 | bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } 87 | bind "d" { HalfPageScrollDown; } 88 | bind "u" { HalfPageScrollUp; } 89 | // uncomment this and adjust key if using copy_on_select=false 90 | // bind "Alt c" { Copy; } 91 | } 92 | search { 93 | bind "Ctrl s" { SwitchToMode "Normal"; } 94 | bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; } 95 | bind "j" "Down" { ScrollDown; } 96 | bind "k" "Up" { ScrollUp; } 97 | bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } 98 | bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } 99 | bind "d" { HalfPageScrollDown; } 100 | bind "u" { HalfPageScrollUp; } 101 | bind "n" { Search "down"; } 102 | bind "p" { Search "up"; } 103 | bind "c" { SearchToggleOption "CaseSensitivity"; } 104 | bind "w" { SearchToggleOption "Wrap"; } 105 | bind "o" { SearchToggleOption "WholeWord"; } 106 | } 107 | entersearch { 108 | bind "Ctrl c" "Esc" { SwitchToMode "Scroll"; } 109 | bind "Enter" { SwitchToMode "Search"; } 110 | } 111 | renametab { 112 | bind "Ctrl c" { SwitchToMode "Normal"; } 113 | bind "Esc" { UndoRenameTab; SwitchToMode "Tab"; } 114 | } 115 | renamepane { 116 | bind "Ctrl c" { SwitchToMode "Normal"; } 117 | bind "Esc" { UndoRenamePane; SwitchToMode "Pane"; } 118 | } 119 | session { 120 | bind "Ctrl o" { SwitchToMode "Normal"; } 121 | bind "Ctrl s" { SwitchToMode "Scroll"; } 122 | bind "d" { Detach; } 123 | bind "w" { 124 | LaunchOrFocusPlugin "zellij:session-manager" { 125 | floating true 126 | move_to_focused_tab true 127 | }; 128 | SwitchToMode "Normal" 129 | } 130 | } 131 | tmux { 132 | bind "[" { SwitchToMode "Scroll"; } 133 | bind "Ctrl b" { Write 2; SwitchToMode "Normal"; } 134 | bind "\"" { NewPane "Down"; SwitchToMode "Normal"; } 135 | bind "%" { NewPane "Right"; SwitchToMode "Normal"; } 136 | bind "z" { ToggleFocusFullscreen; SwitchToMode "Normal"; } 137 | bind "c" { NewTab; SwitchToMode "Normal"; } 138 | bind "," { SwitchToMode "RenameTab"; } 139 | bind "p" { GoToPreviousTab; SwitchToMode "Normal"; } 140 | bind "n" { GoToNextTab; SwitchToMode "Normal"; } 141 | bind "Left" { MoveFocus "Left"; SwitchToMode "Normal"; } 142 | bind "Right" { MoveFocus "Right"; SwitchToMode "Normal"; } 143 | bind "Down" { MoveFocus "Down"; SwitchToMode "Normal"; } 144 | bind "Up" { MoveFocus "Up"; SwitchToMode "Normal"; } 145 | bind "h" { MoveFocus "Left"; SwitchToMode "Normal"; } 146 | bind "l" { MoveFocus "Right"; SwitchToMode "Normal"; } 147 | bind "j" { MoveFocus "Down"; SwitchToMode "Normal"; } 148 | bind "k" { MoveFocus "Up"; SwitchToMode "Normal"; } 149 | bind "o" { FocusNextPane; } 150 | bind "d" { Detach; } 151 | bind "Space" { NextSwapLayout; } 152 | bind "x" { CloseFocus; SwitchToMode "Normal"; } 153 | } 154 | shared_except "locked" { 155 | bind "Ctrl g" { SwitchToMode "Locked"; } 156 | bind "Ctrl q" { Quit; } 157 | bind "Alt n" { NewPane; } 158 | bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; } 159 | bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; } 160 | bind "Alt j" "Alt Down" { MoveFocus "Down"; } 161 | bind "Alt k" "Alt Up" { MoveFocus "Up"; } 162 | bind "Alt =" "Alt +" { Resize "Increase"; } 163 | bind "Alt -" { Resize "Decrease"; } 164 | bind "Alt [" { PreviousSwapLayout; } 165 | bind "Alt ]" { NextSwapLayout; } 166 | } 167 | shared_except "normal" "locked" { 168 | bind "Enter" "Esc" { SwitchToMode "Normal"; } 169 | } 170 | shared_except "pane" "locked" { 171 | bind "Ctrl p" { SwitchToMode "Pane"; } 172 | } 173 | shared_except "resize" "locked" { 174 | bind "Ctrl n" { SwitchToMode "Resize"; } 175 | } 176 | shared_except "scroll" "locked" { 177 | bind "Ctrl s" { SwitchToMode "Scroll"; } 178 | } 179 | shared_except "session" "locked" { 180 | bind "Ctrl o" { SwitchToMode "Session"; } 181 | } 182 | shared_except "tab" "locked" { 183 | bind "Ctrl t" { SwitchToMode "Tab"; } 184 | } 185 | shared_except "move" "locked" { 186 | bind "Ctrl h" { SwitchToMode "Move"; } 187 | } 188 | shared_except "tmux" "locked" { 189 | bind "Ctrl b" { SwitchToMode "Tmux"; } 190 | } 191 | } 192 | 193 | plugins { 194 | tab-bar { path "tab-bar"; } 195 | status-bar { path "status-bar"; } 196 | strider { path "strider"; } 197 | compact-bar { path "compact-bar"; } 198 | session-manager { path "session-manager"; } 199 | } 200 | 201 | // Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP 202 | // eg. when terminal window with an active zellij session is closed 203 | // Options: 204 | // - detach (Default) 205 | // - quit 206 | // 207 | // on_force_close "quit" 208 | 209 | // Send a request for a simplified ui (without arrow fonts) to plugins 210 | // Options: 211 | // - true 212 | // - false (Default) 213 | // 214 | // simplified_ui true 215 | 216 | // Choose the path to the default shell that zellij will use for opening new panes 217 | // Default: $SHELL 218 | // 219 | // default_shell "fish" 220 | 221 | // Choose the path to override cwd that zellij will use for opening new panes 222 | // 223 | // default_cwd "" 224 | 225 | // Toggle between having pane frames around the panes 226 | // Options: 227 | // - true (default) 228 | // - false 229 | // 230 | // pane_frames true 231 | 232 | // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible 233 | // Options: 234 | // - true (default) 235 | // - false 236 | // 237 | // auto_layout true 238 | 239 | // Define color themes for Zellij 240 | // For more examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes 241 | // Once these themes are defined, one of them should to be selected in the "theme" section of this file 242 | // 243 | // themes { 244 | // dracula { 245 | // fg 248 248 242 246 | // bg 40 42 54 247 | // red 255 85 85 248 | // green 80 250 123 249 | // yellow 241 250 140 250 | // blue 98 114 164 251 | // magenta 255 121 198 252 | // orange 255 184 108 253 | // cyan 139 233 253 254 | // black 0 0 0 255 | // white 255 255 255 256 | // } 257 | // } 258 | 259 | // Choose the theme that is specified in the themes section. 260 | // Default: default 261 | // 262 | // theme "default" 263 | 264 | // The name of the default layout to load on startup 265 | // Default: "default" 266 | // 267 | // default_layout "compact" 268 | 269 | // Choose the mode that zellij uses when starting up. 270 | // Default: normal 271 | // 272 | // default_mode "locked" 273 | 274 | // Toggle enabling the mouse mode. 275 | // On certain configurations, or terminals this could 276 | // potentially interfere with copying text. 277 | // Options: 278 | // - true (default) 279 | // - false 280 | // 281 | // mouse_mode false 282 | 283 | // Configure the scroll back buffer size 284 | // This is the number of lines zellij stores for each pane in the scroll back 285 | // buffer. Excess number of lines are discarded in a FIFO fashion. 286 | // Valid values: positive integers 287 | // Default value: 10000 288 | // 289 | // scroll_buffer_size 10000 290 | 291 | // Provide a command to execute when copying text. The text will be piped to 292 | // the stdin of the program to perform the copy. This can be used with 293 | // terminal emulators which do not support the OSC 52 ANSI control sequence 294 | // that will be used by default if this option is not set. 295 | // Examples: 296 | // 297 | // copy_command "xclip -selection clipboard" // x11 298 | // copy_command "wl-copy" // wayland 299 | // copy_command "pbcopy" // osx 300 | 301 | // Choose the destination for copied text 302 | // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. 303 | // Does not apply when using copy_command. 304 | // Options: 305 | // - system (default) 306 | // - primary 307 | // 308 | // copy_clipboard "primary" 309 | 310 | // Enable or disable automatic copy (and clear) of selection when releasing mouse 311 | // Default: true 312 | // 313 | // copy_on_select false 314 | 315 | // Path to the default editor to use to edit pane scrollbuffer 316 | // Default: $EDITOR or $VISUAL 317 | // 318 | // scrollback_editor "/usr/bin/vim" 319 | 320 | // When attaching to an existing session with other users, 321 | // should the session be mirrored (true) 322 | // or should each user have their own cursor (false) 323 | // Default: false 324 | // 325 | // mirror_session true 326 | 327 | // The folder in which Zellij will look for layouts 328 | // 329 | // layout_dir "/path/to/my/layout_dir" 330 | 331 | // The folder in which Zellij will look for themes 332 | // 333 | // theme_dir "/path/to/my/theme_dir" 334 | 335 | -------------------------------------------------------------------------------- /samples/float-pane-sized/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "0f2135563fb5c609d2b2b87c1e8ce7bc41b0b45430fa9661f457981503dd5bf0" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android-tzdata" 31 | version = "0.1.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 | 35 | [[package]] 36 | name = "android_system_properties" 37 | version = "0.1.5" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 | dependencies = [ 41 | "libc", 42 | ] 43 | 44 | [[package]] 45 | name = "anyhow" 46 | version = "1.0.75" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" 49 | dependencies = [ 50 | "backtrace", 51 | ] 52 | 53 | [[package]] 54 | name = "arc-swap" 55 | version = "1.6.0" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" 58 | 59 | [[package]] 60 | name = "arrayvec" 61 | version = "0.5.2" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 64 | 65 | [[package]] 66 | name = "async-channel" 67 | version = "1.9.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" 70 | dependencies = [ 71 | "concurrent-queue", 72 | "event-listener", 73 | "futures-core", 74 | ] 75 | 76 | [[package]] 77 | name = "async-executor" 78 | version = "1.5.1" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" 81 | dependencies = [ 82 | "async-lock", 83 | "async-task", 84 | "concurrent-queue", 85 | "fastrand 1.9.0", 86 | "futures-lite", 87 | "slab", 88 | ] 89 | 90 | [[package]] 91 | name = "async-global-executor" 92 | version = "2.3.1" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" 95 | dependencies = [ 96 | "async-channel", 97 | "async-executor", 98 | "async-io", 99 | "async-lock", 100 | "blocking", 101 | "futures-lite", 102 | "once_cell", 103 | ] 104 | 105 | [[package]] 106 | name = "async-io" 107 | version = "1.13.0" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" 110 | dependencies = [ 111 | "async-lock", 112 | "autocfg", 113 | "cfg-if", 114 | "concurrent-queue", 115 | "futures-lite", 116 | "log", 117 | "parking", 118 | "polling", 119 | "rustix 0.37.23", 120 | "slab", 121 | "socket2", 122 | "waker-fn", 123 | ] 124 | 125 | [[package]] 126 | name = "async-lock" 127 | version = "2.8.0" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" 130 | dependencies = [ 131 | "event-listener", 132 | ] 133 | 134 | [[package]] 135 | name = "async-process" 136 | version = "1.7.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" 139 | dependencies = [ 140 | "async-io", 141 | "async-lock", 142 | "autocfg", 143 | "blocking", 144 | "cfg-if", 145 | "event-listener", 146 | "futures-lite", 147 | "rustix 0.37.23", 148 | "signal-hook 0.3.17", 149 | "windows-sys", 150 | ] 151 | 152 | [[package]] 153 | name = "async-std" 154 | version = "1.12.0" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" 157 | dependencies = [ 158 | "async-channel", 159 | "async-global-executor", 160 | "async-io", 161 | "async-lock", 162 | "async-process", 163 | "crossbeam-utils", 164 | "futures-channel", 165 | "futures-core", 166 | "futures-io", 167 | "futures-lite", 168 | "gloo-timers", 169 | "kv-log-macro", 170 | "log", 171 | "memchr", 172 | "once_cell", 173 | "pin-project-lite", 174 | "pin-utils", 175 | "slab", 176 | "wasm-bindgen-futures", 177 | ] 178 | 179 | [[package]] 180 | name = "async-task" 181 | version = "4.4.0" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" 184 | 185 | [[package]] 186 | name = "atomic-waker" 187 | version = "1.1.1" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" 190 | 191 | [[package]] 192 | name = "atty" 193 | version = "0.2.14" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 196 | dependencies = [ 197 | "hermit-abi 0.1.19", 198 | "libc", 199 | "winapi", 200 | ] 201 | 202 | [[package]] 203 | name = "autocfg" 204 | version = "1.1.0" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 207 | 208 | [[package]] 209 | name = "backtrace" 210 | version = "0.3.69" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 213 | dependencies = [ 214 | "addr2line", 215 | "cc", 216 | "cfg-if", 217 | "libc", 218 | "miniz_oxide", 219 | "object", 220 | "rustc-demangle", 221 | ] 222 | 223 | [[package]] 224 | name = "backtrace-ext" 225 | version = "0.2.1" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" 228 | dependencies = [ 229 | "backtrace", 230 | ] 231 | 232 | [[package]] 233 | name = "base64" 234 | version = "0.21.4" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" 237 | 238 | [[package]] 239 | name = "bitflags" 240 | version = "1.3.2" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 243 | 244 | [[package]] 245 | name = "bitflags" 246 | version = "2.4.0" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" 249 | 250 | [[package]] 251 | name = "block-buffer" 252 | version = "0.9.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 255 | dependencies = [ 256 | "generic-array", 257 | ] 258 | 259 | [[package]] 260 | name = "block-buffer" 261 | version = "0.10.4" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 264 | dependencies = [ 265 | "generic-array", 266 | ] 267 | 268 | [[package]] 269 | name = "blocking" 270 | version = "1.3.1" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" 273 | dependencies = [ 274 | "async-channel", 275 | "async-lock", 276 | "async-task", 277 | "atomic-waker", 278 | "fastrand 1.9.0", 279 | "futures-lite", 280 | "log", 281 | ] 282 | 283 | [[package]] 284 | name = "bumpalo" 285 | version = "3.14.0" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 288 | 289 | [[package]] 290 | name = "byteorder" 291 | version = "1.4.3" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 294 | 295 | [[package]] 296 | name = "bytes" 297 | version = "1.5.0" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 300 | 301 | [[package]] 302 | name = "cc" 303 | version = "1.0.83" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 306 | dependencies = [ 307 | "libc", 308 | ] 309 | 310 | [[package]] 311 | name = "cfg-if" 312 | version = "1.0.0" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 315 | 316 | [[package]] 317 | name = "chrono" 318 | version = "0.4.31" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" 321 | dependencies = [ 322 | "android-tzdata", 323 | "iana-time-zone", 324 | "js-sys", 325 | "num-traits", 326 | "wasm-bindgen", 327 | "windows-targets", 328 | ] 329 | 330 | [[package]] 331 | name = "clap" 332 | version = "3.2.25" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" 335 | dependencies = [ 336 | "atty", 337 | "bitflags 1.3.2", 338 | "clap_derive", 339 | "clap_lex", 340 | "indexmap 1.9.3", 341 | "once_cell", 342 | "strsim", 343 | "termcolor", 344 | "textwrap 0.16.0", 345 | ] 346 | 347 | [[package]] 348 | name = "clap_complete" 349 | version = "3.2.5" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" 352 | dependencies = [ 353 | "clap", 354 | ] 355 | 356 | [[package]] 357 | name = "clap_derive" 358 | version = "3.2.25" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" 361 | dependencies = [ 362 | "heck 0.4.1", 363 | "proc-macro-error", 364 | "proc-macro2", 365 | "quote", 366 | "syn 1.0.109", 367 | ] 368 | 369 | [[package]] 370 | name = "clap_lex" 371 | version = "0.2.4" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 374 | dependencies = [ 375 | "os_str_bytes", 376 | ] 377 | 378 | [[package]] 379 | name = "colored" 380 | version = "2.0.4" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" 383 | dependencies = [ 384 | "is-terminal", 385 | "lazy_static", 386 | "windows-sys", 387 | ] 388 | 389 | [[package]] 390 | name = "colorsys" 391 | version = "0.6.7" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "54261aba646433cb567ec89844be4c4825ca92a4f8afba52fc4dd88436e31bbd" 394 | 395 | [[package]] 396 | name = "concurrent-queue" 397 | version = "2.2.0" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" 400 | dependencies = [ 401 | "crossbeam-utils", 402 | ] 403 | 404 | [[package]] 405 | name = "core-foundation-sys" 406 | version = "0.8.4" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 409 | 410 | [[package]] 411 | name = "cpufeatures" 412 | version = "0.2.9" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" 415 | dependencies = [ 416 | "libc", 417 | ] 418 | 419 | [[package]] 420 | name = "crossbeam" 421 | version = "0.8.2" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" 424 | dependencies = [ 425 | "cfg-if", 426 | "crossbeam-channel", 427 | "crossbeam-deque", 428 | "crossbeam-epoch", 429 | "crossbeam-queue", 430 | "crossbeam-utils", 431 | ] 432 | 433 | [[package]] 434 | name = "crossbeam-channel" 435 | version = "0.5.8" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" 438 | dependencies = [ 439 | "cfg-if", 440 | "crossbeam-utils", 441 | ] 442 | 443 | [[package]] 444 | name = "crossbeam-deque" 445 | version = "0.8.3" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" 448 | dependencies = [ 449 | "cfg-if", 450 | "crossbeam-epoch", 451 | "crossbeam-utils", 452 | ] 453 | 454 | [[package]] 455 | name = "crossbeam-epoch" 456 | version = "0.9.15" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" 459 | dependencies = [ 460 | "autocfg", 461 | "cfg-if", 462 | "crossbeam-utils", 463 | "memoffset 0.9.0", 464 | "scopeguard", 465 | ] 466 | 467 | [[package]] 468 | name = "crossbeam-queue" 469 | version = "0.3.8" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" 472 | dependencies = [ 473 | "cfg-if", 474 | "crossbeam-utils", 475 | ] 476 | 477 | [[package]] 478 | name = "crossbeam-utils" 479 | version = "0.8.16" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" 482 | dependencies = [ 483 | "cfg-if", 484 | ] 485 | 486 | [[package]] 487 | name = "crypto-common" 488 | version = "0.1.6" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 491 | dependencies = [ 492 | "generic-array", 493 | "typenum", 494 | ] 495 | 496 | [[package]] 497 | name = "csscolorparser" 498 | version = "0.6.2" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" 501 | dependencies = [ 502 | "lab", 503 | "phf 0.11.2", 504 | ] 505 | 506 | [[package]] 507 | name = "deltae" 508 | version = "0.3.2" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" 511 | 512 | [[package]] 513 | name = "derivative" 514 | version = "2.2.0" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 517 | dependencies = [ 518 | "proc-macro2", 519 | "quote", 520 | "syn 1.0.109", 521 | ] 522 | 523 | [[package]] 524 | name = "destructure_traitobject" 525 | version = "0.2.0" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" 528 | 529 | [[package]] 530 | name = "digest" 531 | version = "0.9.0" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 534 | dependencies = [ 535 | "generic-array", 536 | ] 537 | 538 | [[package]] 539 | name = "digest" 540 | version = "0.10.7" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 543 | dependencies = [ 544 | "block-buffer 0.10.4", 545 | "crypto-common", 546 | ] 547 | 548 | [[package]] 549 | name = "directories-next" 550 | version = "2.0.0" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" 553 | dependencies = [ 554 | "cfg-if", 555 | "dirs-sys-next", 556 | ] 557 | 558 | [[package]] 559 | name = "dirs" 560 | version = "4.0.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 563 | dependencies = [ 564 | "dirs-sys 0.3.7", 565 | ] 566 | 567 | [[package]] 568 | name = "dirs" 569 | version = "5.0.1" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 572 | dependencies = [ 573 | "dirs-sys 0.4.1", 574 | ] 575 | 576 | [[package]] 577 | name = "dirs-sys" 578 | version = "0.3.7" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 581 | dependencies = [ 582 | "libc", 583 | "redox_users", 584 | "winapi", 585 | ] 586 | 587 | [[package]] 588 | name = "dirs-sys" 589 | version = "0.4.1" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 592 | dependencies = [ 593 | "libc", 594 | "option-ext", 595 | "redox_users", 596 | "windows-sys", 597 | ] 598 | 599 | [[package]] 600 | name = "dirs-sys-next" 601 | version = "0.1.2" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 604 | dependencies = [ 605 | "libc", 606 | "redox_users", 607 | "winapi", 608 | ] 609 | 610 | [[package]] 611 | name = "either" 612 | version = "1.9.0" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 615 | 616 | [[package]] 617 | name = "equivalent" 618 | version = "1.0.1" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 621 | 622 | [[package]] 623 | name = "errno" 624 | version = "0.3.3" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" 627 | dependencies = [ 628 | "errno-dragonfly", 629 | "libc", 630 | "windows-sys", 631 | ] 632 | 633 | [[package]] 634 | name = "errno-dragonfly" 635 | version = "0.1.2" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 638 | dependencies = [ 639 | "cc", 640 | "libc", 641 | ] 642 | 643 | [[package]] 644 | name = "event-listener" 645 | version = "2.5.3" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 648 | 649 | [[package]] 650 | name = "fastrand" 651 | version = "1.9.0" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 654 | dependencies = [ 655 | "instant", 656 | ] 657 | 658 | [[package]] 659 | name = "fastrand" 660 | version = "2.0.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" 663 | 664 | [[package]] 665 | name = "file-id" 666 | version = "0.1.0" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "e13be71e6ca82e91bc0cb862bebaac0b2d1924a5a1d970c822b2f98b63fda8c3" 669 | dependencies = [ 670 | "winapi-util", 671 | ] 672 | 673 | [[package]] 674 | name = "filedescriptor" 675 | version = "0.8.2" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" 678 | dependencies = [ 679 | "libc", 680 | "thiserror", 681 | "winapi", 682 | ] 683 | 684 | [[package]] 685 | name = "filetime" 686 | version = "0.2.22" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" 689 | dependencies = [ 690 | "cfg-if", 691 | "libc", 692 | "redox_syscall 0.3.5", 693 | "windows-sys", 694 | ] 695 | 696 | [[package]] 697 | name = "finl_unicode" 698 | version = "1.2.0" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 701 | 702 | [[package]] 703 | name = "fixedbitset" 704 | version = "0.4.2" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 707 | 708 | [[package]] 709 | name = "float-pane-sized" 710 | version = "0.1.0" 711 | dependencies = [ 712 | "nohash-hasher", 713 | "serde", 714 | "serde_json", 715 | "zellij-tile", 716 | ] 717 | 718 | [[package]] 719 | name = "fnv" 720 | version = "1.0.7" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 723 | 724 | [[package]] 725 | name = "form_urlencoded" 726 | version = "1.2.0" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" 729 | dependencies = [ 730 | "percent-encoding", 731 | ] 732 | 733 | [[package]] 734 | name = "fsevent-sys" 735 | version = "4.1.0" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" 738 | dependencies = [ 739 | "libc", 740 | ] 741 | 742 | [[package]] 743 | name = "futures-channel" 744 | version = "0.3.29" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" 747 | dependencies = [ 748 | "futures-core", 749 | ] 750 | 751 | [[package]] 752 | name = "futures-core" 753 | version = "0.3.29" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" 756 | 757 | [[package]] 758 | name = "futures-io" 759 | version = "0.3.29" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" 762 | 763 | [[package]] 764 | name = "futures-lite" 765 | version = "1.13.0" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" 768 | dependencies = [ 769 | "fastrand 1.9.0", 770 | "futures-core", 771 | "futures-io", 772 | "memchr", 773 | "parking", 774 | "pin-project-lite", 775 | "waker-fn", 776 | ] 777 | 778 | [[package]] 779 | name = "generic-array" 780 | version = "0.14.7" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 783 | dependencies = [ 784 | "typenum", 785 | "version_check", 786 | ] 787 | 788 | [[package]] 789 | name = "getrandom" 790 | version = "0.2.10" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" 793 | dependencies = [ 794 | "cfg-if", 795 | "libc", 796 | "wasi", 797 | ] 798 | 799 | [[package]] 800 | name = "gimli" 801 | version = "0.28.0" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" 804 | 805 | [[package]] 806 | name = "gloo-timers" 807 | version = "0.2.6" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" 810 | dependencies = [ 811 | "futures-channel", 812 | "futures-core", 813 | "js-sys", 814 | "wasm-bindgen", 815 | ] 816 | 817 | [[package]] 818 | name = "hashbrown" 819 | version = "0.12.3" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 822 | 823 | [[package]] 824 | name = "hashbrown" 825 | version = "0.14.0" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" 828 | 829 | [[package]] 830 | name = "heck" 831 | version = "0.3.3" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 834 | dependencies = [ 835 | "unicode-segmentation", 836 | ] 837 | 838 | [[package]] 839 | name = "heck" 840 | version = "0.4.1" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 843 | 844 | [[package]] 845 | name = "hermit-abi" 846 | version = "0.1.19" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 849 | dependencies = [ 850 | "libc", 851 | ] 852 | 853 | [[package]] 854 | name = "hermit-abi" 855 | version = "0.3.3" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" 858 | 859 | [[package]] 860 | name = "hex" 861 | version = "0.4.3" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 864 | 865 | [[package]] 866 | name = "home" 867 | version = "0.5.5" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" 870 | dependencies = [ 871 | "windows-sys", 872 | ] 873 | 874 | [[package]] 875 | name = "humantime" 876 | version = "2.1.0" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 879 | 880 | [[package]] 881 | name = "iana-time-zone" 882 | version = "0.1.57" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" 885 | dependencies = [ 886 | "android_system_properties", 887 | "core-foundation-sys", 888 | "iana-time-zone-haiku", 889 | "js-sys", 890 | "wasm-bindgen", 891 | "windows", 892 | ] 893 | 894 | [[package]] 895 | name = "iana-time-zone-haiku" 896 | version = "0.1.2" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 899 | dependencies = [ 900 | "cc", 901 | ] 902 | 903 | [[package]] 904 | name = "idna" 905 | version = "0.4.0" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" 908 | dependencies = [ 909 | "unicode-bidi", 910 | "unicode-normalization", 911 | ] 912 | 913 | [[package]] 914 | name = "include_dir" 915 | version = "0.7.3" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" 918 | dependencies = [ 919 | "include_dir_macros", 920 | ] 921 | 922 | [[package]] 923 | name = "include_dir_macros" 924 | version = "0.7.3" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" 927 | dependencies = [ 928 | "proc-macro2", 929 | "quote", 930 | ] 931 | 932 | [[package]] 933 | name = "indexmap" 934 | version = "1.9.3" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 937 | dependencies = [ 938 | "autocfg", 939 | "hashbrown 0.12.3", 940 | ] 941 | 942 | [[package]] 943 | name = "indexmap" 944 | version = "2.0.0" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" 947 | dependencies = [ 948 | "equivalent", 949 | "hashbrown 0.14.0", 950 | ] 951 | 952 | [[package]] 953 | name = "inotify" 954 | version = "0.9.6" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" 957 | dependencies = [ 958 | "bitflags 1.3.2", 959 | "inotify-sys", 960 | "libc", 961 | ] 962 | 963 | [[package]] 964 | name = "inotify-sys" 965 | version = "0.1.5" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" 968 | dependencies = [ 969 | "libc", 970 | ] 971 | 972 | [[package]] 973 | name = "instant" 974 | version = "0.1.12" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 977 | dependencies = [ 978 | "cfg-if", 979 | ] 980 | 981 | [[package]] 982 | name = "interprocess" 983 | version = "1.2.1" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "81f2533f3be42fffe3b5e63b71aeca416c1c3bc33e4e27be018521e76b1f38fb" 986 | dependencies = [ 987 | "blocking", 988 | "cfg-if", 989 | "futures-core", 990 | "futures-io", 991 | "intmap", 992 | "libc", 993 | "once_cell", 994 | "rustc_version", 995 | "spinning", 996 | "thiserror", 997 | "to_method", 998 | "winapi", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "intmap" 1003 | version = "0.7.1" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9" 1006 | 1007 | [[package]] 1008 | name = "io-lifetimes" 1009 | version = "1.0.11" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" 1012 | dependencies = [ 1013 | "hermit-abi 0.3.3", 1014 | "libc", 1015 | "windows-sys", 1016 | ] 1017 | 1018 | [[package]] 1019 | name = "is-terminal" 1020 | version = "0.4.9" 1021 | source = "registry+https://github.com/rust-lang/crates.io-index" 1022 | checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" 1023 | dependencies = [ 1024 | "hermit-abi 0.3.3", 1025 | "rustix 0.38.13", 1026 | "windows-sys", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "is_ci" 1031 | version = "1.1.1" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" 1034 | 1035 | [[package]] 1036 | name = "itertools" 1037 | version = "0.10.5" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1040 | dependencies = [ 1041 | "either", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "itoa" 1046 | version = "1.0.9" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 1049 | 1050 | [[package]] 1051 | name = "js-sys" 1052 | version = "0.3.64" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" 1055 | dependencies = [ 1056 | "wasm-bindgen", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "kdl" 1061 | version = "4.6.0" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "062c875482ccb676fd40c804a40e3824d4464c18c364547456d1c8e8e951ae47" 1064 | dependencies = [ 1065 | "miette", 1066 | "nom 7.1.3", 1067 | "thiserror", 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "kqueue" 1072 | version = "1.0.8" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" 1075 | dependencies = [ 1076 | "kqueue-sys", 1077 | "libc", 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "kqueue-sys" 1082 | version = "1.0.4" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" 1085 | dependencies = [ 1086 | "bitflags 1.3.2", 1087 | "libc", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "kv-log-macro" 1092 | version = "1.0.7" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" 1095 | dependencies = [ 1096 | "log", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "lab" 1101 | version = "0.11.0" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" 1104 | 1105 | [[package]] 1106 | name = "lazy_static" 1107 | version = "1.4.0" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1110 | 1111 | [[package]] 1112 | name = "libc" 1113 | version = "0.2.148" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" 1116 | 1117 | [[package]] 1118 | name = "linked-hash-map" 1119 | version = "0.5.6" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1122 | 1123 | [[package]] 1124 | name = "linux-raw-sys" 1125 | version = "0.3.8" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" 1128 | 1129 | [[package]] 1130 | name = "linux-raw-sys" 1131 | version = "0.4.7" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" 1134 | 1135 | [[package]] 1136 | name = "lock_api" 1137 | version = "0.4.10" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" 1140 | dependencies = [ 1141 | "autocfg", 1142 | "scopeguard", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "log" 1147 | version = "0.4.20" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 1150 | dependencies = [ 1151 | "serde", 1152 | "value-bag", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "log-mdc" 1157 | version = "0.1.0" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" 1160 | 1161 | [[package]] 1162 | name = "log4rs" 1163 | version = "1.2.0" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "d36ca1786d9e79b8193a68d480a0907b612f109537115c6ff655a3a1967533fd" 1166 | dependencies = [ 1167 | "anyhow", 1168 | "arc-swap", 1169 | "chrono", 1170 | "derivative", 1171 | "fnv", 1172 | "humantime", 1173 | "libc", 1174 | "log", 1175 | "log-mdc", 1176 | "parking_lot", 1177 | "serde", 1178 | "serde-value", 1179 | "serde_json", 1180 | "serde_yaml", 1181 | "thiserror", 1182 | "thread-id", 1183 | "typemap-ors", 1184 | "winapi", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "memchr" 1189 | version = "2.6.3" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" 1192 | 1193 | [[package]] 1194 | name = "memmem" 1195 | version = "0.1.1" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" 1198 | 1199 | [[package]] 1200 | name = "memoffset" 1201 | version = "0.6.5" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1204 | dependencies = [ 1205 | "autocfg", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "memoffset" 1210 | version = "0.9.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" 1213 | dependencies = [ 1214 | "autocfg", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "miette" 1219 | version = "5.10.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" 1222 | dependencies = [ 1223 | "backtrace", 1224 | "backtrace-ext", 1225 | "is-terminal", 1226 | "miette-derive", 1227 | "once_cell", 1228 | "owo-colors", 1229 | "supports-color", 1230 | "supports-hyperlinks", 1231 | "supports-unicode", 1232 | "terminal_size", 1233 | "textwrap 0.15.2", 1234 | "thiserror", 1235 | "unicode-width", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "miette-derive" 1240 | version = "5.10.0" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" 1243 | dependencies = [ 1244 | "proc-macro2", 1245 | "quote", 1246 | "syn 2.0.37", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "minimal-lexical" 1251 | version = "0.2.1" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1254 | 1255 | [[package]] 1256 | name = "miniz_oxide" 1257 | version = "0.7.1" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1260 | dependencies = [ 1261 | "adler", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "mio" 1266 | version = "0.8.8" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" 1269 | dependencies = [ 1270 | "libc", 1271 | "log", 1272 | "wasi", 1273 | "windows-sys", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "multimap" 1278 | version = "0.8.3" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" 1281 | 1282 | [[package]] 1283 | name = "nix" 1284 | version = "0.23.2" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" 1287 | dependencies = [ 1288 | "bitflags 1.3.2", 1289 | "cc", 1290 | "cfg-if", 1291 | "libc", 1292 | "memoffset 0.6.5", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "nix" 1297 | version = "0.24.3" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" 1300 | dependencies = [ 1301 | "bitflags 1.3.2", 1302 | "cfg-if", 1303 | "libc", 1304 | "memoffset 0.6.5", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "nohash-hasher" 1309 | version = "0.2.0" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 1312 | 1313 | [[package]] 1314 | name = "nom" 1315 | version = "5.1.3" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" 1318 | dependencies = [ 1319 | "memchr", 1320 | "version_check", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "nom" 1325 | version = "7.1.3" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1328 | dependencies = [ 1329 | "memchr", 1330 | "minimal-lexical", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "notify" 1335 | version = "6.1.1" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" 1338 | dependencies = [ 1339 | "bitflags 2.4.0", 1340 | "crossbeam-channel", 1341 | "filetime", 1342 | "fsevent-sys", 1343 | "inotify", 1344 | "kqueue", 1345 | "libc", 1346 | "log", 1347 | "mio", 1348 | "walkdir", 1349 | "windows-sys", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "notify-debouncer-full" 1354 | version = "0.1.0" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "f4812c1eb49be776fb8df4961623bdc01ec9dfdc1abe8211ceb09150a2e64219" 1357 | dependencies = [ 1358 | "crossbeam-channel", 1359 | "file-id", 1360 | "notify", 1361 | "parking_lot", 1362 | "walkdir", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "num-derive" 1367 | version = "0.3.3" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 1370 | dependencies = [ 1371 | "proc-macro2", 1372 | "quote", 1373 | "syn 1.0.109", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "num-traits" 1378 | version = "0.2.16" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" 1381 | dependencies = [ 1382 | "autocfg", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "object" 1387 | version = "0.32.1" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" 1390 | dependencies = [ 1391 | "memchr", 1392 | ] 1393 | 1394 | [[package]] 1395 | name = "once_cell" 1396 | version = "1.18.0" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 1399 | 1400 | [[package]] 1401 | name = "opaque-debug" 1402 | version = "0.3.0" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1405 | 1406 | [[package]] 1407 | name = "option-ext" 1408 | version = "0.2.0" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1411 | 1412 | [[package]] 1413 | name = "ordered-float" 1414 | version = "2.10.0" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" 1417 | dependencies = [ 1418 | "num-traits", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "ordered-float" 1423 | version = "3.9.1" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "2a54938017eacd63036332b4ae5c8a49fc8c0c1d6d629893057e4f13609edd06" 1426 | dependencies = [ 1427 | "num-traits", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "os_str_bytes" 1432 | version = "6.5.1" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" 1435 | 1436 | [[package]] 1437 | name = "owo-colors" 1438 | version = "3.5.0" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 1441 | 1442 | [[package]] 1443 | name = "parking" 1444 | version = "2.1.0" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" 1447 | 1448 | [[package]] 1449 | name = "parking_lot" 1450 | version = "0.12.1" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1453 | dependencies = [ 1454 | "lock_api", 1455 | "parking_lot_core", 1456 | ] 1457 | 1458 | [[package]] 1459 | name = "parking_lot_core" 1460 | version = "0.9.8" 1461 | source = "registry+https://github.com/rust-lang/crates.io-index" 1462 | checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" 1463 | dependencies = [ 1464 | "cfg-if", 1465 | "libc", 1466 | "redox_syscall 0.3.5", 1467 | "smallvec", 1468 | "windows-targets", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "paste" 1473 | version = "1.0.14" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" 1476 | 1477 | [[package]] 1478 | name = "percent-encoding" 1479 | version = "2.3.0" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 1482 | 1483 | [[package]] 1484 | name = "pest" 1485 | version = "2.7.3" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" 1488 | dependencies = [ 1489 | "memchr", 1490 | "thiserror", 1491 | "ucd-trie", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "pest_derive" 1496 | version = "2.7.3" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "a2bee7be22ce7918f641a33f08e3f43388c7656772244e2bbb2477f44cc9021a" 1499 | dependencies = [ 1500 | "pest", 1501 | "pest_generator", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "pest_generator" 1506 | version = "2.7.3" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "d1511785c5e98d79a05e8a6bc34b4ac2168a0e3e92161862030ad84daa223141" 1509 | dependencies = [ 1510 | "pest", 1511 | "pest_meta", 1512 | "proc-macro2", 1513 | "quote", 1514 | "syn 2.0.37", 1515 | ] 1516 | 1517 | [[package]] 1518 | name = "pest_meta" 1519 | version = "2.7.3" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "b42f0394d3123e33353ca5e1e89092e533d2cc490389f2bd6131c43c634ebc5f" 1522 | dependencies = [ 1523 | "once_cell", 1524 | "pest", 1525 | "sha2 0.10.7", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "petgraph" 1530 | version = "0.6.4" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" 1533 | dependencies = [ 1534 | "fixedbitset", 1535 | "indexmap 2.0.0", 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "phf" 1540 | version = "0.10.1" 1541 | source = "registry+https://github.com/rust-lang/crates.io-index" 1542 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1543 | dependencies = [ 1544 | "phf_shared 0.10.0", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "phf" 1549 | version = "0.11.2" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 1552 | dependencies = [ 1553 | "phf_macros", 1554 | "phf_shared 0.11.2", 1555 | ] 1556 | 1557 | [[package]] 1558 | name = "phf_codegen" 1559 | version = "0.11.2" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" 1562 | dependencies = [ 1563 | "phf_generator", 1564 | "phf_shared 0.11.2", 1565 | ] 1566 | 1567 | [[package]] 1568 | name = "phf_generator" 1569 | version = "0.11.2" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 1572 | dependencies = [ 1573 | "phf_shared 0.11.2", 1574 | "rand", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "phf_macros" 1579 | version = "0.11.2" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 1582 | dependencies = [ 1583 | "phf_generator", 1584 | "phf_shared 0.11.2", 1585 | "proc-macro2", 1586 | "quote", 1587 | "syn 2.0.37", 1588 | ] 1589 | 1590 | [[package]] 1591 | name = "phf_shared" 1592 | version = "0.10.0" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1595 | dependencies = [ 1596 | "siphasher", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "phf_shared" 1601 | version = "0.11.2" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 1604 | dependencies = [ 1605 | "siphasher", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "pin-project-lite" 1610 | version = "0.2.13" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1613 | 1614 | [[package]] 1615 | name = "pin-utils" 1616 | version = "0.1.0" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1619 | 1620 | [[package]] 1621 | name = "polling" 1622 | version = "2.8.0" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" 1625 | dependencies = [ 1626 | "autocfg", 1627 | "bitflags 1.3.2", 1628 | "cfg-if", 1629 | "concurrent-queue", 1630 | "libc", 1631 | "log", 1632 | "pin-project-lite", 1633 | "windows-sys", 1634 | ] 1635 | 1636 | [[package]] 1637 | name = "prettyplease" 1638 | version = "0.1.25" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" 1641 | dependencies = [ 1642 | "proc-macro2", 1643 | "syn 1.0.109", 1644 | ] 1645 | 1646 | [[package]] 1647 | name = "proc-macro-error" 1648 | version = "1.0.4" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1651 | dependencies = [ 1652 | "proc-macro-error-attr", 1653 | "proc-macro2", 1654 | "quote", 1655 | "syn 1.0.109", 1656 | "version_check", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "proc-macro-error-attr" 1661 | version = "1.0.4" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1664 | dependencies = [ 1665 | "proc-macro2", 1666 | "quote", 1667 | "version_check", 1668 | ] 1669 | 1670 | [[package]] 1671 | name = "proc-macro2" 1672 | version = "1.0.67" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" 1675 | dependencies = [ 1676 | "unicode-ident", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "prost" 1681 | version = "0.11.9" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" 1684 | dependencies = [ 1685 | "bytes", 1686 | "prost-derive", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "prost-build" 1691 | version = "0.11.9" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" 1694 | dependencies = [ 1695 | "bytes", 1696 | "heck 0.4.1", 1697 | "itertools", 1698 | "lazy_static", 1699 | "log", 1700 | "multimap", 1701 | "petgraph", 1702 | "prettyplease", 1703 | "prost", 1704 | "prost-types", 1705 | "regex", 1706 | "syn 1.0.109", 1707 | "tempfile", 1708 | "which", 1709 | ] 1710 | 1711 | [[package]] 1712 | name = "prost-derive" 1713 | version = "0.11.9" 1714 | source = "registry+https://github.com/rust-lang/crates.io-index" 1715 | checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" 1716 | dependencies = [ 1717 | "anyhow", 1718 | "itertools", 1719 | "proc-macro2", 1720 | "quote", 1721 | "syn 1.0.109", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "prost-types" 1726 | version = "0.11.9" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" 1729 | dependencies = [ 1730 | "prost", 1731 | ] 1732 | 1733 | [[package]] 1734 | name = "quote" 1735 | version = "1.0.33" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 1738 | dependencies = [ 1739 | "proc-macro2", 1740 | ] 1741 | 1742 | [[package]] 1743 | name = "rand" 1744 | version = "0.8.5" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1747 | dependencies = [ 1748 | "rand_core", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "rand_core" 1753 | version = "0.6.4" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1756 | 1757 | [[package]] 1758 | name = "redox_syscall" 1759 | version = "0.2.16" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1762 | dependencies = [ 1763 | "bitflags 1.3.2", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "redox_syscall" 1768 | version = "0.3.5" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 1771 | dependencies = [ 1772 | "bitflags 1.3.2", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "redox_users" 1777 | version = "0.4.3" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 1780 | dependencies = [ 1781 | "getrandom", 1782 | "redox_syscall 0.2.16", 1783 | "thiserror", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "regex" 1788 | version = "1.9.5" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" 1791 | dependencies = [ 1792 | "aho-corasick", 1793 | "memchr", 1794 | "regex-automata", 1795 | "regex-syntax", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "regex-automata" 1800 | version = "0.3.8" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" 1803 | dependencies = [ 1804 | "aho-corasick", 1805 | "memchr", 1806 | "regex-syntax", 1807 | ] 1808 | 1809 | [[package]] 1810 | name = "regex-syntax" 1811 | version = "0.7.5" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" 1814 | 1815 | [[package]] 1816 | name = "rmp" 1817 | version = "0.8.12" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" 1820 | dependencies = [ 1821 | "byteorder", 1822 | "num-traits", 1823 | "paste", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "rmp-serde" 1828 | version = "1.1.2" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" 1831 | dependencies = [ 1832 | "byteorder", 1833 | "rmp", 1834 | "serde", 1835 | ] 1836 | 1837 | [[package]] 1838 | name = "rustc-demangle" 1839 | version = "0.1.23" 1840 | source = "registry+https://github.com/rust-lang/crates.io-index" 1841 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1842 | 1843 | [[package]] 1844 | name = "rustc_version" 1845 | version = "0.4.0" 1846 | source = "registry+https://github.com/rust-lang/crates.io-index" 1847 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1848 | dependencies = [ 1849 | "semver 1.0.18", 1850 | ] 1851 | 1852 | [[package]] 1853 | name = "rustix" 1854 | version = "0.37.23" 1855 | source = "registry+https://github.com/rust-lang/crates.io-index" 1856 | checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" 1857 | dependencies = [ 1858 | "bitflags 1.3.2", 1859 | "errno", 1860 | "io-lifetimes", 1861 | "libc", 1862 | "linux-raw-sys 0.3.8", 1863 | "windows-sys", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "rustix" 1868 | version = "0.38.13" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" 1871 | dependencies = [ 1872 | "bitflags 2.4.0", 1873 | "errno", 1874 | "libc", 1875 | "linux-raw-sys 0.4.7", 1876 | "windows-sys", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "ryu" 1881 | version = "1.0.15" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 1884 | 1885 | [[package]] 1886 | name = "same-file" 1887 | version = "1.0.6" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1890 | dependencies = [ 1891 | "winapi-util", 1892 | ] 1893 | 1894 | [[package]] 1895 | name = "scopeguard" 1896 | version = "1.2.0" 1897 | source = "registry+https://github.com/rust-lang/crates.io-index" 1898 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1899 | 1900 | [[package]] 1901 | name = "semver" 1902 | version = "0.11.0" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 1905 | dependencies = [ 1906 | "semver-parser", 1907 | ] 1908 | 1909 | [[package]] 1910 | name = "semver" 1911 | version = "1.0.18" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" 1914 | 1915 | [[package]] 1916 | name = "semver-parser" 1917 | version = "0.10.2" 1918 | source = "registry+https://github.com/rust-lang/crates.io-index" 1919 | checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" 1920 | dependencies = [ 1921 | "pest", 1922 | ] 1923 | 1924 | [[package]] 1925 | name = "serde" 1926 | version = "1.0.188" 1927 | source = "registry+https://github.com/rust-lang/crates.io-index" 1928 | checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" 1929 | dependencies = [ 1930 | "serde_derive", 1931 | ] 1932 | 1933 | [[package]] 1934 | name = "serde-value" 1935 | version = "0.7.0" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" 1938 | dependencies = [ 1939 | "ordered-float 2.10.0", 1940 | "serde", 1941 | ] 1942 | 1943 | [[package]] 1944 | name = "serde_derive" 1945 | version = "1.0.188" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" 1948 | dependencies = [ 1949 | "proc-macro2", 1950 | "quote", 1951 | "syn 2.0.37", 1952 | ] 1953 | 1954 | [[package]] 1955 | name = "serde_json" 1956 | version = "1.0.107" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" 1959 | dependencies = [ 1960 | "itoa", 1961 | "ryu", 1962 | "serde", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "serde_yaml" 1967 | version = "0.8.26" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" 1970 | dependencies = [ 1971 | "indexmap 1.9.3", 1972 | "ryu", 1973 | "serde", 1974 | "yaml-rust", 1975 | ] 1976 | 1977 | [[package]] 1978 | name = "sha2" 1979 | version = "0.9.9" 1980 | source = "registry+https://github.com/rust-lang/crates.io-index" 1981 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 1982 | dependencies = [ 1983 | "block-buffer 0.9.0", 1984 | "cfg-if", 1985 | "cpufeatures", 1986 | "digest 0.9.0", 1987 | "opaque-debug", 1988 | ] 1989 | 1990 | [[package]] 1991 | name = "sha2" 1992 | version = "0.10.7" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" 1995 | dependencies = [ 1996 | "cfg-if", 1997 | "cpufeatures", 1998 | "digest 0.10.7", 1999 | ] 2000 | 2001 | [[package]] 2002 | name = "shellexpand" 2003 | version = "3.1.0" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" 2006 | dependencies = [ 2007 | "dirs 5.0.1", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "signal-hook" 2012 | version = "0.1.17" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" 2015 | dependencies = [ 2016 | "libc", 2017 | "signal-hook-registry", 2018 | ] 2019 | 2020 | [[package]] 2021 | name = "signal-hook" 2022 | version = "0.3.17" 2023 | source = "registry+https://github.com/rust-lang/crates.io-index" 2024 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 2025 | dependencies = [ 2026 | "libc", 2027 | "signal-hook-registry", 2028 | ] 2029 | 2030 | [[package]] 2031 | name = "signal-hook-registry" 2032 | version = "1.4.1" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 2035 | dependencies = [ 2036 | "libc", 2037 | ] 2038 | 2039 | [[package]] 2040 | name = "siphasher" 2041 | version = "0.3.11" 2042 | source = "registry+https://github.com/rust-lang/crates.io-index" 2043 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 2044 | 2045 | [[package]] 2046 | name = "slab" 2047 | version = "0.4.9" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2050 | dependencies = [ 2051 | "autocfg", 2052 | ] 2053 | 2054 | [[package]] 2055 | name = "smallvec" 2056 | version = "1.11.0" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" 2059 | 2060 | [[package]] 2061 | name = "smawk" 2062 | version = "0.3.2" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" 2065 | 2066 | [[package]] 2067 | name = "socket2" 2068 | version = "0.4.9" 2069 | source = "registry+https://github.com/rust-lang/crates.io-index" 2070 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 2071 | dependencies = [ 2072 | "libc", 2073 | "winapi", 2074 | ] 2075 | 2076 | [[package]] 2077 | name = "spinning" 2078 | version = "0.1.0" 2079 | source = "registry+https://github.com/rust-lang/crates.io-index" 2080 | checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" 2081 | dependencies = [ 2082 | "lock_api", 2083 | ] 2084 | 2085 | [[package]] 2086 | name = "strip-ansi-escapes" 2087 | version = "0.1.1" 2088 | source = "registry+https://github.com/rust-lang/crates.io-index" 2089 | checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8" 2090 | dependencies = [ 2091 | "vte 0.10.1", 2092 | ] 2093 | 2094 | [[package]] 2095 | name = "strsim" 2096 | version = "0.10.0" 2097 | source = "registry+https://github.com/rust-lang/crates.io-index" 2098 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2099 | 2100 | [[package]] 2101 | name = "strum" 2102 | version = "0.20.0" 2103 | source = "registry+https://github.com/rust-lang/crates.io-index" 2104 | checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" 2105 | 2106 | [[package]] 2107 | name = "strum_macros" 2108 | version = "0.20.1" 2109 | source = "registry+https://github.com/rust-lang/crates.io-index" 2110 | checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" 2111 | dependencies = [ 2112 | "heck 0.3.3", 2113 | "proc-macro2", 2114 | "quote", 2115 | "syn 1.0.109", 2116 | ] 2117 | 2118 | [[package]] 2119 | name = "supports-color" 2120 | version = "2.0.0" 2121 | source = "registry+https://github.com/rust-lang/crates.io-index" 2122 | checksum = "4950e7174bffabe99455511c39707310e7e9b440364a2fcb1cc21521be57b354" 2123 | dependencies = [ 2124 | "is-terminal", 2125 | "is_ci", 2126 | ] 2127 | 2128 | [[package]] 2129 | name = "supports-hyperlinks" 2130 | version = "2.1.0" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "f84231692eb0d4d41e4cdd0cabfdd2e6cd9e255e65f80c9aa7c98dd502b4233d" 2133 | dependencies = [ 2134 | "is-terminal", 2135 | ] 2136 | 2137 | [[package]] 2138 | name = "supports-unicode" 2139 | version = "2.0.0" 2140 | source = "registry+https://github.com/rust-lang/crates.io-index" 2141 | checksum = "4b6c2cb240ab5dd21ed4906895ee23fe5a48acdbd15a3ce388e7b62a9b66baf7" 2142 | dependencies = [ 2143 | "is-terminal", 2144 | ] 2145 | 2146 | [[package]] 2147 | name = "syn" 2148 | version = "1.0.109" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2151 | dependencies = [ 2152 | "proc-macro2", 2153 | "quote", 2154 | "unicode-ident", 2155 | ] 2156 | 2157 | [[package]] 2158 | name = "syn" 2159 | version = "2.0.37" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" 2162 | dependencies = [ 2163 | "proc-macro2", 2164 | "quote", 2165 | "unicode-ident", 2166 | ] 2167 | 2168 | [[package]] 2169 | name = "tempfile" 2170 | version = "3.8.0" 2171 | source = "registry+https://github.com/rust-lang/crates.io-index" 2172 | checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" 2173 | dependencies = [ 2174 | "cfg-if", 2175 | "fastrand 2.0.0", 2176 | "redox_syscall 0.3.5", 2177 | "rustix 0.38.13", 2178 | "windows-sys", 2179 | ] 2180 | 2181 | [[package]] 2182 | name = "termcolor" 2183 | version = "1.3.0" 2184 | source = "registry+https://github.com/rust-lang/crates.io-index" 2185 | checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" 2186 | dependencies = [ 2187 | "winapi-util", 2188 | ] 2189 | 2190 | [[package]] 2191 | name = "terminal_size" 2192 | version = "0.1.17" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 2195 | dependencies = [ 2196 | "libc", 2197 | "winapi", 2198 | ] 2199 | 2200 | [[package]] 2201 | name = "terminfo" 2202 | version = "0.7.5" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "da31aef70da0f6352dbcb462683eb4dd2bfad01cf3fc96cf204547b9a839a585" 2205 | dependencies = [ 2206 | "dirs 4.0.0", 2207 | "fnv", 2208 | "nom 5.1.3", 2209 | "phf 0.11.2", 2210 | "phf_codegen", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "termios" 2215 | version = "0.3.3" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" 2218 | dependencies = [ 2219 | "libc", 2220 | ] 2221 | 2222 | [[package]] 2223 | name = "termwiz" 2224 | version = "0.20.0" 2225 | source = "registry+https://github.com/rust-lang/crates.io-index" 2226 | checksum = "9509a978a10fcbace4991deae486ae10885e0f4c2c465123e08c9714a90648fa" 2227 | dependencies = [ 2228 | "anyhow", 2229 | "base64", 2230 | "bitflags 1.3.2", 2231 | "filedescriptor", 2232 | "finl_unicode", 2233 | "fixedbitset", 2234 | "hex", 2235 | "lazy_static", 2236 | "libc", 2237 | "log", 2238 | "memmem", 2239 | "nix 0.24.3", 2240 | "num-derive", 2241 | "num-traits", 2242 | "ordered-float 3.9.1", 2243 | "pest", 2244 | "pest_derive", 2245 | "phf 0.10.1", 2246 | "regex", 2247 | "semver 0.11.0", 2248 | "sha2 0.9.9", 2249 | "signal-hook 0.1.17", 2250 | "siphasher", 2251 | "terminfo", 2252 | "termios", 2253 | "thiserror", 2254 | "ucd-trie", 2255 | "unicode-segmentation", 2256 | "vtparse", 2257 | "wezterm-bidi", 2258 | "wezterm-color-types", 2259 | "wezterm-dynamic", 2260 | "winapi", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "textwrap" 2265 | version = "0.15.2" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" 2268 | dependencies = [ 2269 | "smawk", 2270 | "unicode-linebreak", 2271 | "unicode-width", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "textwrap" 2276 | version = "0.16.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" 2279 | 2280 | [[package]] 2281 | name = "thiserror" 2282 | version = "1.0.48" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" 2285 | dependencies = [ 2286 | "thiserror-impl", 2287 | ] 2288 | 2289 | [[package]] 2290 | name = "thiserror-impl" 2291 | version = "1.0.48" 2292 | source = "registry+https://github.com/rust-lang/crates.io-index" 2293 | checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" 2294 | dependencies = [ 2295 | "proc-macro2", 2296 | "quote", 2297 | "syn 2.0.37", 2298 | ] 2299 | 2300 | [[package]] 2301 | name = "thread-id" 2302 | version = "4.2.0" 2303 | source = "registry+https://github.com/rust-lang/crates.io-index" 2304 | checksum = "79474f573561cdc4871a0de34a51c92f7f5a56039113fbb5b9c9f96bdb756669" 2305 | dependencies = [ 2306 | "libc", 2307 | "redox_syscall 0.2.16", 2308 | "winapi", 2309 | ] 2310 | 2311 | [[package]] 2312 | name = "tinyvec" 2313 | version = "1.6.0" 2314 | source = "registry+https://github.com/rust-lang/crates.io-index" 2315 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2316 | dependencies = [ 2317 | "tinyvec_macros", 2318 | ] 2319 | 2320 | [[package]] 2321 | name = "tinyvec_macros" 2322 | version = "0.1.1" 2323 | source = "registry+https://github.com/rust-lang/crates.io-index" 2324 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2325 | 2326 | [[package]] 2327 | name = "to_method" 2328 | version = "1.1.0" 2329 | source = "registry+https://github.com/rust-lang/crates.io-index" 2330 | checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" 2331 | 2332 | [[package]] 2333 | name = "typemap-ors" 2334 | version = "1.0.0" 2335 | source = "registry+https://github.com/rust-lang/crates.io-index" 2336 | checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" 2337 | dependencies = [ 2338 | "unsafe-any-ors", 2339 | ] 2340 | 2341 | [[package]] 2342 | name = "typenum" 2343 | version = "1.17.0" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2346 | 2347 | [[package]] 2348 | name = "ucd-trie" 2349 | version = "0.1.6" 2350 | source = "registry+https://github.com/rust-lang/crates.io-index" 2351 | checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" 2352 | 2353 | [[package]] 2354 | name = "unicode-bidi" 2355 | version = "0.3.13" 2356 | source = "registry+https://github.com/rust-lang/crates.io-index" 2357 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 2358 | 2359 | [[package]] 2360 | name = "unicode-ident" 2361 | version = "1.0.12" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2364 | 2365 | [[package]] 2366 | name = "unicode-linebreak" 2367 | version = "0.1.5" 2368 | source = "registry+https://github.com/rust-lang/crates.io-index" 2369 | checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 2370 | 2371 | [[package]] 2372 | name = "unicode-normalization" 2373 | version = "0.1.22" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2376 | dependencies = [ 2377 | "tinyvec", 2378 | ] 2379 | 2380 | [[package]] 2381 | name = "unicode-segmentation" 2382 | version = "1.10.1" 2383 | source = "registry+https://github.com/rust-lang/crates.io-index" 2384 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 2385 | 2386 | [[package]] 2387 | name = "unicode-width" 2388 | version = "0.1.11" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" 2391 | 2392 | [[package]] 2393 | name = "unsafe-any-ors" 2394 | version = "1.0.0" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" 2397 | dependencies = [ 2398 | "destructure_traitobject", 2399 | ] 2400 | 2401 | [[package]] 2402 | name = "url" 2403 | version = "2.4.1" 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" 2405 | checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" 2406 | dependencies = [ 2407 | "form_urlencoded", 2408 | "idna", 2409 | "percent-encoding", 2410 | "serde", 2411 | ] 2412 | 2413 | [[package]] 2414 | name = "utf8parse" 2415 | version = "0.2.1" 2416 | source = "registry+https://github.com/rust-lang/crates.io-index" 2417 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 2418 | 2419 | [[package]] 2420 | name = "uuid" 2421 | version = "0.8.2" 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" 2423 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2424 | dependencies = [ 2425 | "getrandom", 2426 | "serde", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "value-bag" 2431 | version = "1.4.1" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" 2434 | 2435 | [[package]] 2436 | name = "version_check" 2437 | version = "0.9.4" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2440 | 2441 | [[package]] 2442 | name = "vte" 2443 | version = "0.10.1" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" 2446 | dependencies = [ 2447 | "arrayvec", 2448 | "utf8parse", 2449 | "vte_generate_state_changes", 2450 | ] 2451 | 2452 | [[package]] 2453 | name = "vte" 2454 | version = "0.11.1" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" 2457 | dependencies = [ 2458 | "utf8parse", 2459 | "vte_generate_state_changes", 2460 | ] 2461 | 2462 | [[package]] 2463 | name = "vte_generate_state_changes" 2464 | version = "0.1.1" 2465 | source = "registry+https://github.com/rust-lang/crates.io-index" 2466 | checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" 2467 | dependencies = [ 2468 | "proc-macro2", 2469 | "quote", 2470 | ] 2471 | 2472 | [[package]] 2473 | name = "vtparse" 2474 | version = "0.6.2" 2475 | source = "registry+https://github.com/rust-lang/crates.io-index" 2476 | checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" 2477 | dependencies = [ 2478 | "utf8parse", 2479 | ] 2480 | 2481 | [[package]] 2482 | name = "waker-fn" 2483 | version = "1.1.0" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" 2486 | 2487 | [[package]] 2488 | name = "walkdir" 2489 | version = "2.4.0" 2490 | source = "registry+https://github.com/rust-lang/crates.io-index" 2491 | checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" 2492 | dependencies = [ 2493 | "same-file", 2494 | "winapi-util", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "wasi" 2499 | version = "0.11.0+wasi-snapshot-preview1" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2502 | 2503 | [[package]] 2504 | name = "wasm-bindgen" 2505 | version = "0.2.87" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" 2508 | dependencies = [ 2509 | "cfg-if", 2510 | "wasm-bindgen-macro", 2511 | ] 2512 | 2513 | [[package]] 2514 | name = "wasm-bindgen-backend" 2515 | version = "0.2.87" 2516 | source = "registry+https://github.com/rust-lang/crates.io-index" 2517 | checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" 2518 | dependencies = [ 2519 | "bumpalo", 2520 | "log", 2521 | "once_cell", 2522 | "proc-macro2", 2523 | "quote", 2524 | "syn 2.0.37", 2525 | "wasm-bindgen-shared", 2526 | ] 2527 | 2528 | [[package]] 2529 | name = "wasm-bindgen-futures" 2530 | version = "0.4.37" 2531 | source = "registry+https://github.com/rust-lang/crates.io-index" 2532 | checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" 2533 | dependencies = [ 2534 | "cfg-if", 2535 | "js-sys", 2536 | "wasm-bindgen", 2537 | "web-sys", 2538 | ] 2539 | 2540 | [[package]] 2541 | name = "wasm-bindgen-macro" 2542 | version = "0.2.87" 2543 | source = "registry+https://github.com/rust-lang/crates.io-index" 2544 | checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" 2545 | dependencies = [ 2546 | "quote", 2547 | "wasm-bindgen-macro-support", 2548 | ] 2549 | 2550 | [[package]] 2551 | name = "wasm-bindgen-macro-support" 2552 | version = "0.2.87" 2553 | source = "registry+https://github.com/rust-lang/crates.io-index" 2554 | checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" 2555 | dependencies = [ 2556 | "proc-macro2", 2557 | "quote", 2558 | "syn 2.0.37", 2559 | "wasm-bindgen-backend", 2560 | "wasm-bindgen-shared", 2561 | ] 2562 | 2563 | [[package]] 2564 | name = "wasm-bindgen-shared" 2565 | version = "0.2.87" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" 2568 | 2569 | [[package]] 2570 | name = "web-sys" 2571 | version = "0.3.64" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" 2574 | dependencies = [ 2575 | "js-sys", 2576 | "wasm-bindgen", 2577 | ] 2578 | 2579 | [[package]] 2580 | name = "wezterm-bidi" 2581 | version = "0.2.2" 2582 | source = "registry+https://github.com/rust-lang/crates.io-index" 2583 | checksum = "1560382cf39b0fa92473eae4d5b3772f88c63202cbf5a72c35db72ba99e66c36" 2584 | dependencies = [ 2585 | "log", 2586 | "wezterm-dynamic", 2587 | ] 2588 | 2589 | [[package]] 2590 | name = "wezterm-color-types" 2591 | version = "0.2.0" 2592 | source = "registry+https://github.com/rust-lang/crates.io-index" 2593 | checksum = "4c6e7a483dd2785ba72705c51e8b1be18300302db2a78368dac9bc8773857777" 2594 | dependencies = [ 2595 | "csscolorparser", 2596 | "deltae", 2597 | "lazy_static", 2598 | "wezterm-dynamic", 2599 | ] 2600 | 2601 | [[package]] 2602 | name = "wezterm-dynamic" 2603 | version = "0.1.0" 2604 | source = "registry+https://github.com/rust-lang/crates.io-index" 2605 | checksum = "a75e78c0cc60a76de5d93f9dad05651105351e151b6446ab305514945d7588aa" 2606 | dependencies = [ 2607 | "log", 2608 | "ordered-float 3.9.1", 2609 | "strsim", 2610 | "thiserror", 2611 | "wezterm-dynamic-derive", 2612 | ] 2613 | 2614 | [[package]] 2615 | name = "wezterm-dynamic-derive" 2616 | version = "0.1.0" 2617 | source = "registry+https://github.com/rust-lang/crates.io-index" 2618 | checksum = "0c9f5ef318442d07b3d071f9f43ea40b80992f87faee14bb4d017b6991c307f0" 2619 | dependencies = [ 2620 | "proc-macro2", 2621 | "quote", 2622 | "syn 1.0.109", 2623 | ] 2624 | 2625 | [[package]] 2626 | name = "which" 2627 | version = "4.4.2" 2628 | source = "registry+https://github.com/rust-lang/crates.io-index" 2629 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 2630 | dependencies = [ 2631 | "either", 2632 | "home", 2633 | "once_cell", 2634 | "rustix 0.38.13", 2635 | ] 2636 | 2637 | [[package]] 2638 | name = "winapi" 2639 | version = "0.3.9" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2642 | dependencies = [ 2643 | "winapi-i686-pc-windows-gnu", 2644 | "winapi-x86_64-pc-windows-gnu", 2645 | ] 2646 | 2647 | [[package]] 2648 | name = "winapi-i686-pc-windows-gnu" 2649 | version = "0.4.0" 2650 | source = "registry+https://github.com/rust-lang/crates.io-index" 2651 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2652 | 2653 | [[package]] 2654 | name = "winapi-util" 2655 | version = "0.1.5" 2656 | source = "registry+https://github.com/rust-lang/crates.io-index" 2657 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2658 | dependencies = [ 2659 | "winapi", 2660 | ] 2661 | 2662 | [[package]] 2663 | name = "winapi-x86_64-pc-windows-gnu" 2664 | version = "0.4.0" 2665 | source = "registry+https://github.com/rust-lang/crates.io-index" 2666 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2667 | 2668 | [[package]] 2669 | name = "windows" 2670 | version = "0.48.0" 2671 | source = "registry+https://github.com/rust-lang/crates.io-index" 2672 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 2673 | dependencies = [ 2674 | "windows-targets", 2675 | ] 2676 | 2677 | [[package]] 2678 | name = "windows-sys" 2679 | version = "0.48.0" 2680 | source = "registry+https://github.com/rust-lang/crates.io-index" 2681 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2682 | dependencies = [ 2683 | "windows-targets", 2684 | ] 2685 | 2686 | [[package]] 2687 | name = "windows-targets" 2688 | version = "0.48.5" 2689 | source = "registry+https://github.com/rust-lang/crates.io-index" 2690 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2691 | dependencies = [ 2692 | "windows_aarch64_gnullvm", 2693 | "windows_aarch64_msvc", 2694 | "windows_i686_gnu", 2695 | "windows_i686_msvc", 2696 | "windows_x86_64_gnu", 2697 | "windows_x86_64_gnullvm", 2698 | "windows_x86_64_msvc", 2699 | ] 2700 | 2701 | [[package]] 2702 | name = "windows_aarch64_gnullvm" 2703 | version = "0.48.5" 2704 | source = "registry+https://github.com/rust-lang/crates.io-index" 2705 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2706 | 2707 | [[package]] 2708 | name = "windows_aarch64_msvc" 2709 | version = "0.48.5" 2710 | source = "registry+https://github.com/rust-lang/crates.io-index" 2711 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2712 | 2713 | [[package]] 2714 | name = "windows_i686_gnu" 2715 | version = "0.48.5" 2716 | source = "registry+https://github.com/rust-lang/crates.io-index" 2717 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2718 | 2719 | [[package]] 2720 | name = "windows_i686_msvc" 2721 | version = "0.48.5" 2722 | source = "registry+https://github.com/rust-lang/crates.io-index" 2723 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2724 | 2725 | [[package]] 2726 | name = "windows_x86_64_gnu" 2727 | version = "0.48.5" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2730 | 2731 | [[package]] 2732 | name = "windows_x86_64_gnullvm" 2733 | version = "0.48.5" 2734 | source = "registry+https://github.com/rust-lang/crates.io-index" 2735 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2736 | 2737 | [[package]] 2738 | name = "windows_x86_64_msvc" 2739 | version = "0.48.5" 2740 | source = "registry+https://github.com/rust-lang/crates.io-index" 2741 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2742 | 2743 | [[package]] 2744 | name = "yaml-rust" 2745 | version = "0.4.5" 2746 | source = "registry+https://github.com/rust-lang/crates.io-index" 2747 | checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" 2748 | dependencies = [ 2749 | "linked-hash-map", 2750 | ] 2751 | 2752 | [[package]] 2753 | name = "zellij-tile" 2754 | version = "0.38.2" 2755 | source = "registry+https://github.com/rust-lang/crates.io-index" 2756 | checksum = "23245bbef7a6dd1c6e44a73b697fcd4b15eac5d0812dfee4b633ae425c8c1ba3" 2757 | dependencies = [ 2758 | "clap", 2759 | "serde", 2760 | "serde_json", 2761 | "strum", 2762 | "strum_macros", 2763 | "zellij-utils", 2764 | ] 2765 | 2766 | [[package]] 2767 | name = "zellij-utils" 2768 | version = "0.38.2" 2769 | source = "registry+https://github.com/rust-lang/crates.io-index" 2770 | checksum = "d2c255271eab3868f67bb0efa4d0af5bf0aa2ddbedd3b79a83fc258c1e57e15a" 2771 | dependencies = [ 2772 | "anyhow", 2773 | "async-channel", 2774 | "async-std", 2775 | "backtrace", 2776 | "clap", 2777 | "clap_complete", 2778 | "colored", 2779 | "colorsys", 2780 | "crossbeam", 2781 | "directories-next", 2782 | "include_dir", 2783 | "interprocess", 2784 | "kdl", 2785 | "lazy_static", 2786 | "libc", 2787 | "log", 2788 | "log4rs", 2789 | "miette", 2790 | "nix 0.23.2", 2791 | "notify-debouncer-full", 2792 | "once_cell", 2793 | "percent-encoding", 2794 | "prost", 2795 | "prost-build", 2796 | "regex", 2797 | "rmp-serde", 2798 | "serde", 2799 | "serde_json", 2800 | "shellexpand", 2801 | "signal-hook 0.3.17", 2802 | "strip-ansi-escapes", 2803 | "strum", 2804 | "strum_macros", 2805 | "tempfile", 2806 | "termwiz", 2807 | "thiserror", 2808 | "unicode-width", 2809 | "url", 2810 | "uuid", 2811 | "vte 0.11.1", 2812 | ] 2813 | --------------------------------------------------------------------------------