├── .gitignore ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature-request.yaml │ └── bug-report.yaml └── workflows │ ├── build.yml │ └── release.yml ├── demo.gif ├── src ├── command_strs.rs ├── commands │ ├── update_instructions.txt │ ├── ascii_logo.txt │ ├── init.rs │ ├── find.rs │ ├── keybinds.rs │ ├── check_updates.rs │ ├── mod.rs │ └── shell │ │ ├── ctrlg.zsh │ │ ├── ctrlg.bash │ │ └── ctrlg.fish ├── cli_about.txt ├── main.rs ├── git_meta.rs ├── dirs.rs ├── colors.rs ├── dir_item.rs ├── version.rs ├── finder.rs ├── keybind.rs └── settings.rs ├── Cargo.toml ├── Makefile ├── LICENSE ├── install.bash ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | release 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: mrjones2014 2 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrjones2014/ctrlg/HEAD/demo.gif -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | -------------------------------------------------------------------------------- /src/command_strs.rs: -------------------------------------------------------------------------------- 1 | pub const EXA: [&str; 6] = ["exa", "--icons", "--color=always", "-s", "type", "-F"]; 2 | pub const LS: [&str; 1] = ["ls"]; 3 | pub const GLOW: [&str; 4] = ["glow", "-s", "auto", "-w"]; 4 | pub const BAT: [&str; 3] = ["bat", "--style=plain", "--color=always"]; 5 | pub const CAT: [&str; 1] = ["cat"]; 6 | -------------------------------------------------------------------------------- /src/commands/update_instructions.txt: -------------------------------------------------------------------------------- 1 | To update with 'cargo': 2 | 3 | cargo install ctrlg 4 | 5 | To update with the installer script: 6 | 7 | bash -c 'bash <(curl --proto "=https" --tlsv1.2 -sSf https://raw.githubusercontent.com/mrjones2014/ctrlg/master/install.bash)' 8 | 9 | To update manually: https://github.com/mrjones2014/ctrlg#manual 10 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # Basic compile check to run on every push to master and every PR to master 2 | name: Build Rust 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: actions-rs/toolchain@v1 15 | with: 16 | toolchain: stable 17 | - name: Check Formatting, Linting, and Tests 18 | run: make check 19 | -------------------------------------------------------------------------------- /src/commands/ascii_logo.txt: -------------------------------------------------------------------------------- 1 | ╭─────────╮ ╭──────────────╮ ╭──────────╮ ╭────╮ ╭─────────╮ 2 | │ │ │ │ │ ╭╮ │ │ │ │ │ 3 | │ ╭────╯ ╰────╮ ╭────╯ │ ╰╯ │ │ │ │ ╭────╯ 4 | │ │ │ │ │ ╭╯ │ │ │ │─────╮ 5 | │ ╰────╮ │ │ │ ╭──╮ ╰╮ │ ╰────╮ │ ╰─── │ 6 | │ │ │ │ │ │ │ │ │ │ │ │ 7 | ╰─────────╯ ╰────╯ ╰───╯ ╰───╯ ╰─────────╯ ╰──────────╯ 8 | -------------------------------------------------------------------------------- /src/cli_about.txt: -------------------------------------------------------------------------------- 1 | A command line context-switcher, written in Rust 2 | Please file an issue if you run into any problems! 3 | https://github.com/mrjones2014/ctrlg 4 | 5 | ╭─────────╮ ╭──────────────╮ ╭──────────╮ ╭────╮ ╭─────────╮ 6 | │ │ │ │ │ ╭╮ │ │ │ │ │ 7 | │ ╭────╯ ╰────╮ ╭────╯ │ ╰╯ │ │ │ │ ╭────╯ 8 | │ │ │ │ │ ╭╯ │ │ │ │─────╮ 9 | │ ╰────╮ │ │ │ ╭──╮ ╰╮ │ ╰────╮ │ ╰─── │ 10 | │ │ │ │ │ │ │ │ │ │ │ │ 11 | ╰─────────╯ ╰────╯ ╰───╯ ╰───╯ ╰─────────╯ ╰──────────╯ 12 | -------------------------------------------------------------------------------- /src/commands/init.rs: -------------------------------------------------------------------------------- 1 | use clap::Subcommand; 2 | 3 | #[derive(Debug, Subcommand)] 4 | #[clap(about = "Set up ctrl+g keybind for specified shell")] 5 | pub enum Cmd { 6 | #[clap(about = "Set up ctrl+g keybind for Fish shell")] 7 | Fish, 8 | #[clap(about = "Set up ctrl+g keybind for Bash")] 9 | Bash, 10 | #[clap(about = "Set up ctrl+g keybind for Zsh")] 11 | Zsh, 12 | } 13 | 14 | impl Cmd { 15 | pub fn run(&self) -> String { 16 | match self { 17 | Cmd::Fish => include_str!("./shell/ctrlg.fish"), 18 | Cmd::Bash => include_str!("./shell/ctrlg.bash"), 19 | Cmd::Zsh => include_str!("./shell/ctrlg.zsh"), 20 | } 21 | .to_string() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yaml: -------------------------------------------------------------------------------- 1 | name: ⚙️ Feature Request 2 | description: Request a feature 3 | title: "[Feature]: " 4 | labels: ["enhancement"] 5 | assignees: 6 | - mrjones2014 7 | body: 8 | - type: checkboxes 9 | id: similar-issues 10 | attributes: 11 | label: Similar Issues 12 | options: 13 | - label: Before filing, I have searched for similar issues. 14 | required: true 15 | validations: 16 | required: true 17 | - type: textarea 18 | id: desc 19 | attributes: 20 | label: Description 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: use-case 25 | attributes: 26 | label: Use Case 27 | description: Please describe why the feature would be useful 28 | validations: 29 | required: true 30 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::{AppSettings, Parser}; 2 | use commands::CtrlgCommand; 3 | use settings::Settings; 4 | use std::error::Error; 5 | 6 | mod colors; 7 | mod command_strs; 8 | mod commands; 9 | mod dir_item; 10 | mod dirs; 11 | mod finder; 12 | mod git_meta; 13 | mod keybind; 14 | mod settings; 15 | mod version; 16 | 17 | #[derive(Debug, Parser)] 18 | #[clap( 19 | author = "Mat Jones ", 20 | version = env!("CARGO_PKG_VERSION"), 21 | about = include_str!("./cli_about.txt"), 22 | global_setting = AppSettings::DeriveDisplayOrder, 23 | )] 24 | struct Ctrlg { 25 | #[clap(subcommand)] 26 | ctrlg: CtrlgCommand, 27 | } 28 | 29 | impl Ctrlg { 30 | fn run(self) -> Result<(), Box> { 31 | self.ctrlg.run() 32 | } 33 | } 34 | 35 | fn main() -> Result<(), Box> { 36 | Settings::init()?; 37 | Ctrlg::parse().run()?; 38 | Ok(()) 39 | } 40 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ctrlg" 3 | description = "A command line context switcher, written in Rust" 4 | version = "0.9.2" 5 | edition = "2021" 6 | license = "MIT" 7 | documentation = "https://github.com/mrjones2014/ctrlg/blob/master/README.md" 8 | homepage = "https://github.com/mrjones2014/ctrlg#readme" 9 | repository = "https://github.com/mrjones2014/ctrlg" 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | 13 | [dependencies] 14 | git2 = { version = "0.13", features = ["vendored-libgit2"], default-features = false } 15 | clap = { version = "3.0.7", features = ["derive", "unicode", "wrap_help"] } 16 | reqwest = { version = "0.11", features = ["blocking", "json"] } 17 | config = { version = "0.11.0", features = ["yaml"] } 18 | serde = { version = "1.0", features = ["derive"] } 19 | serde_json = "1.0" 20 | ansi_term = "0.12" 21 | skim = "0.9.4" 22 | dirs-next = "2.0.0" 23 | shellexpand = "2.1.0" 24 | glob = "0.3.0" 25 | once_cell = "1.9.0" 26 | tabled = "0.5.0" 27 | arboard = "2.1.0" 28 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: install 2 | install: 3 | cargo install --path . 4 | 5 | .PHONY: publish 6 | publish: 7 | @if [ "$(CARGO_TOKEN)" = "" ]; then echo "CARGO_TOKEN variable not set"; exit 1; fi 8 | cargo login $(CARGO_TOKEN) 9 | cargo publish 10 | 11 | .PHONY: build-mac-m1 12 | build-mac-m1: 13 | rustup target add aarch64-apple-darwin 14 | cargo build --release --target aarch64-apple-darwin 15 | mkdir -p ./release/ 16 | cp ./target/aarch64-apple-darwin/release/ctrlg ./release/ctrlg-macos-arm 17 | 18 | .PHONY: build-mac-x86 19 | build-mac-x86: 20 | rustup target add x86_64-apple-darwin 21 | cargo build --release --target x86_64-apple-darwin 22 | mkdir -p ./release/ 23 | cp ./target/x86_64-apple-darwin/release/ctrlg ./release/ctrlg-macos-x86 24 | 25 | .PHONY: build-linux 26 | build-linux: 27 | cargo build --release --target x86_64-unknown-linux-gnu 28 | mkdir -p ./release/ 29 | cp ./target/x86_64-unknown-linux-gnu/release/ctrlg ./release/ctrlg-linux-x86 30 | 31 | .PHONY: check 32 | check: 33 | cargo fmt -- --check 34 | cargo clippy -- -D warnings 35 | cargo test 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Mat Jones 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.yaml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug Report 2 | description: File a bug report 3 | title: "[Bug]: " 4 | labels: ["bug"] 5 | assignees: 6 | - mrjones2014 7 | body: 8 | - type: checkboxes 9 | id: similar-issues 10 | attributes: 11 | label: Similar Issues 12 | options: 13 | - label: Before filing, I have searched for similar issues. 14 | required: true 15 | validations: 16 | required: true 17 | - type: textarea 18 | id: desc 19 | attributes: 20 | label: Description 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: shell-version 25 | attributes: 26 | label: Shell + Version 27 | description: "`bash --version`, `zsh --version`, `fish --version`, please use a code block" 28 | validations: 29 | required: true 30 | - type: textarea 31 | id: min-config 32 | attributes: 33 | label: Minimal Configuration to Reproduce 34 | description: "`.bashrc`, `.zshrc`, `config.fish`, please use a code block" 35 | validations: 36 | required: true 37 | - type: textarea 38 | id: details 39 | attributes: 40 | label: Additional Details 41 | -------------------------------------------------------------------------------- /src/commands/find.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | dirs::{get_dirs, GetDirsError}, 3 | finder::find, 4 | settings::Settings, 5 | }; 6 | use clap::Args; 7 | 8 | #[derive(Debug, Args)] 9 | pub struct Cmd {} 10 | 11 | impl Cmd { 12 | pub fn run(&self) -> Result, GetDirsError> { 13 | let dirs = get_dirs()?; 14 | if dirs.is_empty() { 15 | let search_dirs = Settings::global().search_dirs; 16 | let search_dirs_str = if search_dirs.is_empty() { 17 | String::from("[Empty list]") 18 | } else { 19 | Settings::global() 20 | .search_dirs 21 | .iter() 22 | .map(|dir_str| format!("- {}", dir_str)) 23 | .collect::>() 24 | .join("\n") 25 | }; 26 | eprintln!("No directories found under configured `search_dirs`, do you need to customize `search_dirs` in `~/.config/ctrlg/config.yml`?\nCurrent `search_dirs` value is configured as:\n{}\n\n", search_dirs_str); 27 | return Ok(None); 28 | } 29 | let selected = find(&dirs); 30 | Ok(selected) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/commands/keybinds.rs: -------------------------------------------------------------------------------- 1 | use crate::keybind::{get_bound_keys, CtrlgKeybind}; 2 | use clap::Args; 3 | use skim::prelude::Key; 4 | use tabled::{Alignment, Full, MaxWidth, Modify, Row, Style, Table, Tabled}; 5 | 6 | #[derive(Debug, Args)] 7 | pub struct Cmd {} 8 | 9 | #[derive(Tabled)] 10 | struct KeybindEntry { 11 | key: String, 12 | description: String, 13 | } 14 | 15 | impl From<&Key> for KeybindEntry { 16 | fn from(key: &Key) -> Self { 17 | KeybindEntry { 18 | key: key.key_code().to_string(), 19 | description: key.description().to_string(), 20 | } 21 | } 22 | } 23 | 24 | impl Cmd { 25 | pub fn run(&self) -> Result { 26 | let keybinds = get_bound_keys() 27 | .iter() 28 | .map(KeybindEntry::from) 29 | .collect::>(); 30 | Ok(format!( 31 | "{}\n\n{}", 32 | include_str!("./ascii_logo.txt"), 33 | Table::new(keybinds) 34 | .with(Style::modern()) 35 | .with(Modify::new(Full).with(Alignment::left())) 36 | .with(Modify::new(Row(1..)).with(MaxWidth::wrapping(50).keep_words())) 37 | )) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/git_meta.rs: -------------------------------------------------------------------------------- 1 | use git2::{ErrorCode, Repository}; 2 | use std::{fs, path::Path}; 3 | 4 | fn name_from_unborn_branch(repo: &Repository, e: git2::Error) -> Option { 5 | if e.code() == ErrorCode::UnbornBranch { 6 | // HEAD should only be an unborn branch if the repository is fresh, 7 | // in that case read directly from `.git/HEAD` 8 | let mut head_path = repo.path().to_path_buf(); 9 | head_path.push("HEAD"); 10 | 11 | // get first line, then last path segment 12 | fs::read_to_string(&head_path) 13 | .ok()? 14 | .lines() 15 | .next()? 16 | .trim() 17 | .split('/') 18 | .last() 19 | .map(std::borrow::ToOwned::to_owned) 20 | } else { 21 | None 22 | } 23 | } 24 | 25 | pub fn get_current_branch(path: &Path) -> Result, git2::Error> { 26 | let repo = Repository::discover(path); 27 | if repo.is_err() { 28 | return Ok(None); 29 | } 30 | let repo = repo.unwrap(); 31 | let head = match repo.head() { 32 | Ok(reference) => reference, 33 | Err(e) => return Ok(name_from_unborn_branch(&repo, e)), 34 | }; 35 | 36 | let shorthand = head.shorthand(); 37 | 38 | Ok(shorthand.map(std::string::ToString::to_string)) 39 | } 40 | -------------------------------------------------------------------------------- /src/commands/check_updates.rs: -------------------------------------------------------------------------------- 1 | use clap::Args; 2 | use serde_json::Value; 3 | use std::error::Error; 4 | 5 | use crate::version::Version; 6 | 7 | #[derive(Debug, Args)] 8 | #[clap(about = "Check if there are updates available for ctrlg")] 9 | pub struct Cmd {} 10 | 11 | impl Cmd { 12 | pub fn run(&self) -> Result> { 13 | let client = reqwest::blocking::Client::new(); 14 | let response: Value = client 15 | .get("https://github.com/mrjones2014/ctrlg/releases/latest") 16 | .header("Accept", "application/json") 17 | .send()? 18 | .json()?; 19 | let version_field = &response["tag_name"] 20 | .to_string() 21 | .replace('v', "") 22 | .replace('"', ""); 23 | let current_version = Version::try_from(env!("CARGO_PKG_VERSION"))?; 24 | let latest_version = Version::try_from(version_field.to_string())?; 25 | if current_version >= latest_version { 26 | return Ok(format!("You're on the latest version! {}", current_version)); 27 | } 28 | 29 | let instructions = format!( 30 | "A new version ({}) is available!\n\n{}\n\n{}", 31 | latest_version, 32 | include_str!("./ascii_logo.txt"), 33 | include_str!("./update_instructions.txt") 34 | ); 35 | Ok(instructions) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/commands/mod.rs: -------------------------------------------------------------------------------- 1 | use clap::{AppSettings, Subcommand}; 2 | use std::error::Error; 3 | 4 | pub mod check_updates; 5 | pub mod find; 6 | pub mod init; 7 | mod keybinds; 8 | 9 | #[derive(Debug, Subcommand)] 10 | #[clap(setting = AppSettings::DeriveDisplayOrder, propagate_version = true)] 11 | pub enum CtrlgCommand { 12 | #[clap(about = "Find a directory based on configured globbing patterns")] 13 | Find(find::Cmd), 14 | #[clap(subcommand)] 15 | Init(init::Cmd), 16 | #[clap(about = "Check if updates are available for ctrlg")] 17 | CheckUpdates(check_updates::Cmd), 18 | #[clap(about = "Print the key bindings used for the fuzzy finder")] 19 | Keybinds(keybinds::Cmd), 20 | } 21 | 22 | impl CtrlgCommand { 23 | pub fn run(self) -> Result<(), Box> { 24 | match self { 25 | CtrlgCommand::Find(cmd) => { 26 | let selected = cmd.run()?; 27 | if let Some(selected) = selected { 28 | println!("{}", selected); 29 | } 30 | Ok(()) 31 | } 32 | CtrlgCommand::Init(cmd) => { 33 | let script = cmd.run(); 34 | println!("{}", script); 35 | Ok(()) 36 | } 37 | CtrlgCommand::CheckUpdates(cmd) => { 38 | let instructions = cmd.run()?; 39 | println!("{}", instructions); 40 | Ok(()) 41 | } 42 | CtrlgCommand::Keybinds(cmd) => { 43 | let keybinds_table = cmd.run().unwrap(); 44 | println!("{}", keybinds_table); 45 | Ok(()) 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/dirs.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | dir_item::{DirItem, DirItemError}, 3 | settings::Settings, 4 | }; 5 | use glob::{glob, GlobError}; 6 | use std::{error::Error, fmt::Display}; 7 | 8 | #[derive(Debug)] 9 | pub enum GetDirsError { 10 | DirItemError(DirItemError), 11 | GlobError(GlobError), 12 | } 13 | 14 | impl Error for GetDirsError {} 15 | 16 | impl From for GetDirsError { 17 | fn from(e: DirItemError) -> Self { 18 | GetDirsError::DirItemError(e) 19 | } 20 | } 21 | 22 | impl From for GetDirsError { 23 | fn from(e: GlobError) -> Self { 24 | GetDirsError::GlobError(e) 25 | } 26 | } 27 | 28 | impl Display for GetDirsError { 29 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 30 | match self { 31 | GetDirsError::DirItemError(e) => writeln!(f, "Error parsing directory metadata: {}", e), 32 | GetDirsError::GlobError(e) => writeln!(f, "Error expanding globbing pattern: {}", e), 33 | } 34 | } 35 | } 36 | 37 | pub fn get_dirs() -> Result, GetDirsError> { 38 | let mut items = Vec::new(); 39 | for dir in Settings::global().search_dirs.iter() { 40 | let dir = shellexpand::tilde(dir); 41 | for child in glob(&dir).expect("Failed to resolve globbing pattern") { 42 | let mut path = child?; 43 | if path.is_dir() { 44 | items.push(DirItem::new(path)?); 45 | } else if !&dir.ends_with('*') { 46 | // globbing pattern is to a file like `~/git/**/package.json` 47 | path.pop(); 48 | if path.is_dir() { 49 | items.push(DirItem::new(path)?); 50 | } 51 | } 52 | } 53 | } 54 | 55 | items.sort_unstable_by_key(|item| item.display.to_string()); 56 | 57 | Ok(items) 58 | } 59 | -------------------------------------------------------------------------------- /src/commands/shell/ctrlg.zsh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | # Send a single command to all panes without 4 | # having to toggle on and off the 5 | # synchronize-panes option manually 6 | function _ctrlg_tmux_send_all_panes() { 7 | if test -z "$TMUX" || test -z "$CTRLG_TMUX"; then 8 | eval "$1" 9 | else 10 | local current_pane="$(tmux display-message -p '#P')" 11 | for pane in $(tmux list-panes -F '#P'); do 12 | if [ "$pane" = "$current_pane" ]; then 13 | eval "$1" 14 | else 15 | tmux send-keys -t "$pane" " $1" Enter 16 | fi 17 | done 18 | if [[ $(type -t _ctrlg_get_related_panes) == function ]]; then 19 | for pane in $(_ctrlg_get_related_panes); do 20 | tmux send-keys -t "$pane" " $1" Enter 21 | done 22 | fi 23 | fi 24 | } 25 | 26 | function _ctrlg_popup() { 27 | if [ "$CTRLG_TMUX_POPUP" = "true" ] && [ "$TMUX" != "" ]; then 28 | fifo="${TMPDIR:-/tmp/}/_ctrlg_fifo" 29 | rm -f "$fifo" 30 | mkfifo "$fifo" 31 | popup_args="${CTRLG_TMUX_POPUP_ARGS:-"-w 75\% -h 75\%"}" 32 | tmux popup -E $popup_args "ctrlg find > $fifo" & 33 | cat "$fifo" 34 | rm -f "$fifo" 35 | else 36 | ctrlg find 37 | fi 38 | } 39 | 40 | function _ctrlg_search_and_go() { 41 | local ctrlg_output 42 | ctrlg_output="$(_ctrlg_popup)" 43 | local ctrlg_selected_dir 44 | ctrlg_selected_dir=${ctrlg_output/"ctrlg_edit:"/} 45 | ctrlg_selected_dir=${ctrlg_selected_dir/"ctrlg_notmux:"/} 46 | ctrlg_selected_dir=${ctrlg_selected_dir/"ctrlg_insert:"/} 47 | ctrlg_selected_dir=${ctrlg_selected_dir/"ctrlg_pushd:"/} 48 | 49 | if test -z "$ctrlg_selected_dir"; then 50 | return 51 | fi 52 | 53 | if [[ "$ctrlg_output" = ctrlg_insert:* ]]; then 54 | LBUFFER="$ctrlg_selected_dir" 55 | elif [[ "$ctrlg_output" = ctrlg_pushd:* ]]; then 56 | if test -z "$EDITOR"; then 57 | echo "\$EDITOR is not defined." 58 | zle reset-prompt 59 | return 60 | fi 61 | pushd "$ctrlg_selected_dir" && $EDITOR && popd 62 | elif [[ "$ctrlg_output" = ctrlg_notmux:* ]]; then 63 | cd "$ctrlg_selected_dir" 64 | else 65 | _ctrlg_tmux_send_all_panes "cd $ctrlg_selected_dir && clear" 66 | if [[ "$ctrlg_output" = ctrlg_edit:* ]]; then 67 | if test -z "$EDITOR"; then 68 | echo "\$EDITOR is not defined." 69 | zle reset-prompt 70 | return 71 | fi 72 | $EDITOR 73 | fi 74 | fi 75 | 76 | zle reset-prompt 77 | } 78 | 79 | zle -N _ctrlg_search_and_go 80 | 81 | if test -z "$CTRLG_NOBIND"; then 82 | bindkey '^g' _ctrlg_search_and_go 83 | fi 84 | -------------------------------------------------------------------------------- /src/commands/shell/ctrlg.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Send a single command to all panes without 4 | # having to toggle on and off the 5 | # synchronize-panes option manually 6 | function _ctrlg_tmux_send_all_panes { 7 | if test -z "$TMUX" || test -z "$CTRLG_TMUX"; then 8 | eval "$1" 9 | else 10 | local current_pane 11 | current_pane="$(tmux display-message -p '#P')" 12 | for pane in $(tmux list-panes -F '#P'); do 13 | if [ "$pane" = "$current_pane" ]; then 14 | eval "$1" 15 | else 16 | tmux send-keys -t "$pane" " $1" Enter 17 | fi 18 | done 19 | 20 | if [[ $(type -t _ctrlg_get_related_panes) == function ]]; then 21 | for pane in $(_ctrlg_get_related_panes); do 22 | tmux send-keys -t "$pane" " $1" Enter 23 | done 24 | fi 25 | fi 26 | } 27 | 28 | function _ctrlg_popup { 29 | if [ "$CTRLG_TMUX_POPUP" = "true" ] && [ "$TMUX" != "" ]; then 30 | fifo="${TMPDIR:-/tmp/}/_ctrlg_fifo" 31 | rm -f "$fifo" 32 | mkfifo "$fifo" 33 | popup_args="${CTRLG_TMUX_POPUP_ARGS:-"-w 75\% -h 75\%"}" 34 | # we are intentionally not quoting here to preserve word splitting for args 35 | # shellcheck disable=SC2086 36 | tmux popup -E $popup_args "ctrlg find > $fifo" & 37 | cat "$fifo" 38 | rm -f "$fifo" 39 | else 40 | ctrlg find 41 | fi 42 | } 43 | 44 | function _ctrlg_search_and_go { 45 | local ctrlg_output 46 | ctrlg_output="$(_ctrlg_popup)" 47 | local ctrlg_selected_dir 48 | ctrlg_selected_dir=${ctrlg_output/"ctrlg_edit:"/} 49 | ctrlg_selected_dir=${ctrlg_selected_dir/"ctrlg_notmux:"/} 50 | ctrlg_selected_dir=${ctrlg_selected_dir/"ctrlg_insert:"/} 51 | ctrlg_selected_dir=${ctrlg_selected_dir/"ctrlg_pushd:"/} 52 | 53 | if test -z "$ctrlg_selected_dir"; then 54 | return 55 | fi 56 | 57 | if [[ "$ctrlg_output" = ctrlg_insert:* ]]; then 58 | cd "$ctrlg_selected_dir" || return 59 | elif [[ "$ctrlg_output" = ctrlg_pushd:* ]]; then 60 | if test -z "$EDITOR"; then 61 | echo "\$EDITOR is not defined." 62 | return 63 | fi 64 | pushd "$ctrlg_selected_dir" && $EDITOR && popd || return 65 | elif [[ "$ctrlg_output" = ctrlg_notmux:* ]]; then 66 | cd "$ctrlg_selected_dir" || return 67 | else 68 | _ctrlg_tmux_send_all_panes "cd $ctrlg_selected_dir && clear" 69 | if [[ "$ctrlg_output" = ctrlg_edit:* ]]; then 70 | if test -z "$EDITOR"; then 71 | echo "\$EDITOR is not defined." 72 | return 73 | fi 74 | $EDITOR 75 | fi 76 | fi 77 | } 78 | 79 | if test -z "$CTRLG_NOBIND"; then 80 | bind -x '"\C-g": _ctrlg_search_and_go' 81 | fi 82 | -------------------------------------------------------------------------------- /src/colors.rs: -------------------------------------------------------------------------------- 1 | use ansi_term::Color; 2 | use std::num::ParseIntError; 3 | 4 | pub fn parse_rgb_triple(input: &str) -> Option<(u8, u8, u8)> { 5 | let values = input 6 | .split(',') 7 | .map(|value| value.trim()) 8 | .collect::>(); 9 | if values.len() != 3 { 10 | return None; 11 | } 12 | 13 | let values: Result, ParseIntError> = 14 | values.iter().map(|value| value.parse::()).collect(); 15 | 16 | if let Ok(values) = values { 17 | return Some((values[0], values[1], values[2])); 18 | } 19 | 20 | None 21 | } 22 | 23 | pub fn parse_color(input: &str) -> Color { 24 | match input.to_lowercase().as_str() { 25 | "black" => Color::Black, 26 | "red" => Color::Red, 27 | "green" => Color::Green, 28 | "yellow" => Color::Yellow, 29 | "blue" => Color::Blue, 30 | "purple" => Color::Purple, 31 | "cyan" => Color::Cyan, 32 | "white" => Color::White, 33 | input => { 34 | // check for an integer-specified xterm-256 color 35 | // see: https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg 36 | let is_xterm_256_color = input.parse::(); 37 | if let Ok(color_int) = is_xterm_256_color { 38 | Color::Fixed(color_int) 39 | } else if let Some(rgb_triple) = parse_rgb_triple(input) { 40 | Color::RGB(rgb_triple.0, rgb_triple.1, rgb_triple.2) 41 | } else { 42 | eprintln!("Invalid color definition found in config file: '{}'", input); 43 | Color::White 44 | } 45 | } 46 | } 47 | } 48 | 49 | #[cfg(test)] 50 | mod test { 51 | use super::*; 52 | use ansi_term::Color; 53 | 54 | macro_rules! color_test { 55 | ($($name:ident: $value:expr,)*) => { 56 | $( 57 | #[test] 58 | fn $name() { 59 | let (input, expected) = $value; 60 | let output = parse_color(input); 61 | assert_eq!(expected, output); 62 | } 63 | )* 64 | } 65 | } 66 | 67 | color_test! { 68 | black: ("black", Color::Black), 69 | red: ("red", Color::Red), 70 | green: ("green", Color::Green), 71 | yellow: ("yellow", Color::Yellow), 72 | blue: ("blue", Color::Blue), 73 | purple: ("purple", Color::Purple), 74 | cyan: ("cyan", Color::Cyan), 75 | white: ("white", Color::White), 76 | invalid_named_color: ("invalid named color", Color::White), 77 | fixed_color: ("255", Color::Fixed(255)), 78 | rgb: ("255,255,255", Color::RGB(255, 255, 255)), 79 | decimal_fixed: ("17.25", Color::White), // decimal fixed colors are not valid 80 | decimal_rgb: ("17.25, 17.25, 17.25", Color::White), // decimal RGB colors are not valid 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/commands/shell/ctrlg.fish: -------------------------------------------------------------------------------- 1 | # Send a single command to all panes without 2 | # having to toggle on and off the 3 | # synchronize-panes option manually 4 | function _ctrlg_tmux_send_all_panes 5 | if test -z "$TMUX" || test -z "$CTRLG_TMUX" 6 | eval "$argv" 7 | else 8 | set -l current_pane (tmux display-message -p '#P') 9 | for pane in (tmux list-panes -F '#P') 10 | if [ "$pane" = "$current_pane" ] 11 | eval "$argv" 12 | else 13 | tmux send-keys -t "$pane" " $argv" Enter 14 | end 15 | end 16 | if type _ctrlg_get_related_panes >/dev/null 17 | for pane in (_ctrlg_get_related_panes || "") 18 | tmux send-keys -t "$pane" " $argv" Enter 19 | end 20 | end 21 | end 22 | end 23 | 24 | function _ctrlg_popup 25 | if [ "$CTRLG_TMUX_POPUP" = true ] && [ "$TMUX" != "" ] 26 | set -l fifo (set -q TMPDIR && echo "$TMPDIR" || echo "/tmp/") 27 | set -l fifo "$fifo/_ctrlg_fifo" 28 | rm -f "$fifo" 29 | mkfifo "$fifo" 30 | if [ "$CTRLG_TMUX_POPUP_ARGS" = "" ] 31 | tmux popup -E -w 75% -h 75% "ctrlg find > $fifo" & 32 | else 33 | tmux popup -E $CTRLG_TMUX_POPUP_ARGS "ctrlg find > $fifo" & 34 | end 35 | cat "$fifo" 36 | rm -rf "$fifo" 37 | else 38 | ctrlg find 39 | end 40 | end 41 | 42 | function _ctrlg_search_and_go 43 | set -l ctrlg_output (_ctrlg_popup) 44 | set -l ctrlg_selected_dir (string replace "ctrlg_edit:" "" "$ctrlg_output") 45 | set -l ctrlg_selected_dir (string replace "ctrlg_notmux:" "" "$ctrlg_selected_dir") 46 | set -l ctrlg_selected_dir (string replace "ctrlg_insert:" "" "$ctrlg_selected_dir") 47 | set -l ctrlg_selected_dir (string replace "ctrlg_pushd:" "" "$ctrlg_selected_dir") 48 | echo "$ctrlg_selected_dir" 49 | 50 | if test -z "$ctrlg_selected_dir" 51 | commandline -f repaint 52 | return 53 | end 54 | 55 | if string match -q -- "ctrlg_insert:*" "$ctrlg_output" 56 | commandline -r "$ctrlg_selected_dir" 57 | else if string match -q -- "ctrlg_pushd:*" "$ctrlg_output" 58 | if test -z "$EDITOR" 59 | echo "\$EDITOR is not defined." 60 | commandline -f repaint 61 | return 62 | end 63 | pushd "$ctrlg_selected_dir" && $EDITOR && popd 64 | else if string match -q -- "ctrlg_notmux:*" "$ctrlg_output" 65 | cd "$ctrlg_selected_dir" 66 | clear 67 | else 68 | _ctrlg_tmux_send_all_panes "cd $ctrlg_selected_dir && commandline -f repaint && clear" 69 | if string match -q -- "ctrlg_edit:*" "$ctrlg_output" 70 | $EDITOR 71 | end 72 | end 73 | 74 | commandline -f repaint 75 | end 76 | 77 | if test -z "$CTRLG_NOBIND" 78 | bind \a _ctrlg_search_and_go 79 | for mode in insert default normal 80 | bind -M $mode \a _ctrlg_search_and_go 81 | end 82 | end 83 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release to crates.io 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | 7 | jobs: 8 | checks: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions-rs/toolchain@v1 13 | with: 14 | toolchain: stable 15 | - name: Check Formatting, Linting, and Tests 16 | run: make check 17 | 18 | build-assets: 19 | needs: [checks] 20 | strategy: 21 | matrix: 22 | os: [ubuntu-latest, macos-latest] 23 | runs-on: ${{ matrix.os }} 24 | steps: 25 | - uses: actions/checkout@v2 26 | - uses: actions-rs/toolchain@v1 27 | with: 28 | toolchain: stable 29 | 30 | - name: Build Release Mac M1 31 | if: matrix.os == 'macos-latest' 32 | run: make build-mac-m1 33 | - name: Upload MacOS M1 Artifact 34 | if: matrix.os == 'macos-latest' 35 | uses: actions/upload-artifact@v2 36 | with: 37 | name: ctrlg-macos-arm 38 | path: ./release/ctrlg-macos-arm 39 | 40 | - name: Build Release Mac x86 41 | if: matrix.os == 'macos-latest' 42 | run: make build-mac-x86 43 | - name: Upload MacOS x86 Artifact 44 | if: matrix.os == 'macos-latest' 45 | uses: actions/upload-artifact@v2 46 | with: 47 | name: ctrlg-macos-x86 48 | path: ./release/ctrlg-macos-x86 49 | 50 | - name: Build Linux 51 | if: matrix.os == 'ubuntu-latest' 52 | run: make build-linux 53 | - name: Upload Linux x86 Artifact 54 | if: matrix.os == 'ubuntu-latest' 55 | uses: actions/upload-artifact@v2 56 | with: 57 | name: ctrlg-linux-x86 58 | path: ./release/ctrlg-linux-x86 59 | 60 | create-github-release: 61 | runs-on: ubuntu-latest 62 | needs: [build-assets] 63 | steps: 64 | - name: Download Artifacts 65 | uses: actions/download-artifact@v2 66 | with: 67 | path: release 68 | - name: Make Assets Executable 69 | run: | 70 | chmod +x ./release/ctrlg-macos-arm/ctrlg-macos-arm 71 | chmod +x ./release/ctrlg-macos-x86/ctrlg-macos-x86 72 | chmod +x ./release/ctrlg-linux-x86/ctrlg-linux-x86 73 | - name: Create GitHub Release 74 | uses: softprops/action-gh-release@v1 75 | with: 76 | generate_release_notes: true 77 | fail_on_unmatched_files: true 78 | prerelease: ${{ contains(github.ref, '-') }} 79 | files: | 80 | ./release/ctrlg-macos-arm/ctrlg-macos-arm 81 | ./release/ctrlg-macos-x86/ctrlg-macos-x86 82 | ./release/ctrlg-linux-x86/ctrlg-linux-x86 83 | env: 84 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 85 | 86 | cargo-publish: 87 | runs-on: ubuntu-latest 88 | needs: [checks] 89 | steps: 90 | - uses: actions/checkout@v2 91 | - uses: actions-rs/toolchain@v1 92 | with: 93 | toolchain: stable 94 | - uses: actions-rs/cargo@v1 95 | with: 96 | command: test 97 | - name: Cargo Publish 98 | env: 99 | CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} 100 | run: make publish 101 | -------------------------------------------------------------------------------- /src/dir_item.rs: -------------------------------------------------------------------------------- 1 | use crate::{colors::parse_color, git_meta, settings::Settings}; 2 | use glob::glob; 3 | use std::{ 4 | fmt::Display, 5 | io, 6 | path::{Path, PathBuf}, 7 | }; 8 | 9 | #[derive(Debug)] 10 | pub enum DirItemError { 11 | IO(io::Error), 12 | Git(git2::Error), 13 | } 14 | 15 | impl From for DirItemError { 16 | fn from(e: io::Error) -> Self { 17 | DirItemError::IO(e) 18 | } 19 | } 20 | 21 | impl From for DirItemError { 22 | fn from(e: git2::Error) -> Self { 23 | DirItemError::Git(e) 24 | } 25 | } 26 | 27 | impl Display for DirItemError { 28 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 29 | match self { 30 | DirItemError::IO(e) => write!(f, "Error reading directory: {}", e), 31 | DirItemError::Git(e) => write!(f, "Error reading git metadata: {}", e), 32 | } 33 | } 34 | } 35 | 36 | #[derive(Debug, Clone)] 37 | pub struct DirItem { 38 | pub path: PathBuf, 39 | pub display: String, 40 | pub match_str: String, 41 | pub readme: Option, 42 | } 43 | 44 | impl DirItem { 45 | pub fn new(path: PathBuf) -> Result { 46 | let display = get_display(&path)?; 47 | let readme = get_readme(&path)?; 48 | let match_str = path 49 | .file_name() 50 | .expect("Failed to expand path") 51 | .to_str() 52 | .unwrap() 53 | .to_string(); 54 | 55 | Ok(Self { 56 | path, 57 | display, 58 | match_str, 59 | readme, 60 | }) 61 | } 62 | } 63 | 64 | fn get_display(path: &Path) -> Result { 65 | let mut display = path 66 | .file_name() 67 | .expect("Failed to expand path") 68 | .to_str() 69 | .unwrap() 70 | .to_string(); 71 | 72 | if !Settings::global().show_git_branch { 73 | return Ok(display); 74 | } 75 | 76 | let branch = git_meta::get_current_branch(path)?; 77 | if let Some(branch) = branch { 78 | let settings = Settings::global(); 79 | let color_settings = settings.colors; 80 | display = format!( 81 | "{} {} {}", 82 | parse_color(&color_settings.dir_name).bold().paint(display), 83 | parse_color(&color_settings.git_branch) 84 | .bold() 85 | .paint(settings.git_branch_separator), 86 | parse_color(&color_settings.git_branch).bold().paint(branch), 87 | ); 88 | } 89 | 90 | Ok(display) 91 | } 92 | 93 | fn get_readme(path: &Path) -> Result, io::Error> { 94 | for glob_pattern in Settings::global().preview_files.iter() { 95 | let mut preview_file_pattern = path.to_path_buf(); 96 | preview_file_pattern.push(glob_pattern); 97 | 98 | let preview_file_pattern = preview_file_pattern 99 | .to_str() 100 | .expect("Failed to expand preview file path"); 101 | 102 | let matched_preview_file = glob(preview_file_pattern) 103 | .expect("Failed to expand preview file globbing pattern") 104 | .flatten() 105 | .next(); 106 | 107 | if let Some(file) = matched_preview_file { 108 | return Ok(Some(file)); 109 | } 110 | } 111 | 112 | Ok(None) 113 | } 114 | -------------------------------------------------------------------------------- /src/version.rs: -------------------------------------------------------------------------------- 1 | use std::{error::Error, fmt::Display, num::ParseIntError}; 2 | 3 | #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] 4 | pub struct Version { 5 | pub major: u8, 6 | pub minor: u8, 7 | pub patch: u8, 8 | } 9 | 10 | #[derive(Debug)] 11 | pub enum ParseVersionError { 12 | IncorrectNumberOfVersionSegments(usize), 13 | FailedToParseVersionInt(ParseIntError), 14 | } 15 | 16 | impl Error for ParseVersionError {} 17 | 18 | impl From for ParseVersionError { 19 | fn from(e: ParseIntError) -> Self { 20 | ParseVersionError::FailedToParseVersionInt(e) 21 | } 22 | } 23 | 24 | impl Display for ParseVersionError { 25 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 26 | match self { 27 | ParseVersionError::IncorrectNumberOfVersionSegments(num_segments) => { 28 | writeln!(f, "Expected 3 segments, got {}", num_segments) 29 | } 30 | ParseVersionError::FailedToParseVersionInt(e) => { 31 | writeln!(f, "Failed to parse version segment to int: {}", e) 32 | } 33 | } 34 | } 35 | } 36 | 37 | fn try_version_from_str>(version_str: S) -> Result { 38 | let parts = version_str.as_ref().split('.').collect::>(); 39 | if parts.len() != 3 { 40 | return Err(ParseVersionError::IncorrectNumberOfVersionSegments( 41 | parts.len(), 42 | )); 43 | } 44 | let major: u8 = parts[0].parse()?; 45 | let minor: u8 = parts[1].parse()?; 46 | let patch: u8 = parts[2].parse()?; 47 | Ok(Version { 48 | major, 49 | minor, 50 | patch, 51 | }) 52 | } 53 | 54 | impl TryFrom for Version { 55 | type Error = ParseVersionError; 56 | 57 | fn try_from(version_str: String) -> Result { 58 | try_version_from_str(version_str) 59 | } 60 | } 61 | 62 | impl TryFrom<&str> for Version { 63 | type Error = ParseVersionError; 64 | 65 | fn try_from(version_str: &str) -> Result { 66 | try_version_from_str(version_str) 67 | } 68 | } 69 | 70 | impl Display for Version { 71 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 72 | write!(f, "{}.{}.{}", self.major, self.minor, self.patch) 73 | } 74 | } 75 | 76 | #[cfg(test)] 77 | mod test { 78 | use super::*; 79 | 80 | #[test] 81 | fn compare_patch() { 82 | let larger = Version::try_from("1.1.2"); 83 | let smaller = Version::try_from("1.1.1"); 84 | 85 | assert!(larger.is_ok()); 86 | assert!(smaller.is_ok()); 87 | 88 | let larger = larger.unwrap(); 89 | let smaller = smaller.unwrap(); 90 | assert!(larger > smaller); 91 | } 92 | 93 | #[test] 94 | fn compare_minor() { 95 | let larger = Version::try_from("1.2.1"); 96 | let smaller = Version::try_from("1.1.5"); 97 | 98 | assert!(larger.is_ok()); 99 | assert!(smaller.is_ok()); 100 | 101 | let larger = larger.unwrap(); 102 | let smaller = smaller.unwrap(); 103 | assert!(larger > smaller); 104 | } 105 | 106 | #[test] 107 | fn compare_major() { 108 | let larger = Version::try_from("2.1.1"); 109 | let smaller = Version::try_from("1.10.5"); 110 | 111 | assert!(larger.is_ok()); 112 | assert!(smaller.is_ok()); 113 | 114 | let larger = larger.unwrap(); 115 | let smaller = smaller.unwrap(); 116 | assert!(larger > smaller); 117 | } 118 | 119 | #[test] 120 | fn compare_equal() { 121 | let version_1 = Version::try_from("2.2.2"); 122 | let version_2 = Version::try_from("2.2.2"); 123 | 124 | assert!(version_1.is_ok()); 125 | assert!(version_2.is_ok()); 126 | 127 | let version_1 = version_1.unwrap(); 128 | let version_2 = version_2.unwrap(); 129 | assert_eq!(version_1, version_2); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /src/finder.rs: -------------------------------------------------------------------------------- 1 | use crate::command_strs; 2 | use crate::dir_item::DirItem; 3 | use crate::keybind::{get_bound_keys, CtrlgKeybind}; 4 | use crate::settings::Settings; 5 | use skim::prelude::*; 6 | use skim::{prelude::unbounded, SkimItem, SkimItemReceiver, SkimItemSender}; 7 | use std::{borrow::Cow, sync::Arc}; 8 | 9 | impl SkimItem for DirItem { 10 | fn text(&self) -> std::borrow::Cow { 11 | Cow::from(self.match_str.clone()) 12 | } 13 | 14 | fn display<'a>(&'a self, _: DisplayContext<'a>) -> AnsiString<'a> { 15 | AnsiString::parse(self.display.as_str()) 16 | } 17 | 18 | fn preview(&self, _context: PreviewContext) -> ItemPreview { 19 | let settings = Settings::global(); 20 | if self.readme.is_none() { 21 | if settings.preview_fallback_exa { 22 | return ItemPreview::Command(format!( 23 | "{} \"{}\"", 24 | command_strs::EXA.join(" "), 25 | self.path.to_str().unwrap() 26 | )); 27 | } 28 | 29 | return ItemPreview::Command(format!( 30 | "{} \"{}\"", 31 | command_strs::LS.join(" "), 32 | self.path.to_str().unwrap() 33 | )); 34 | } 35 | 36 | let readme_path = self.readme.as_ref().unwrap(); 37 | if settings.preview_with_glow { 38 | let mut glow_args = command_strs::GLOW.to_vec(); 39 | let wrap_width_str = settings.glow_wrap_width.to_string(); 40 | glow_args.push(&wrap_width_str); 41 | ItemPreview::Command(format!( 42 | "{} \"{}\"", 43 | glow_args.join(" "), 44 | readme_path.to_str().unwrap() 45 | )) 46 | } else if settings.preview_with_bat { 47 | let mut bat_args = command_strs::BAT.to_vec(); 48 | let bat_theme_arg = format!("--theme={}", settings.colors.bat_theme); 49 | bat_args.push(bat_theme_arg.as_str()); 50 | ItemPreview::Command(format!( 51 | "{} \"{}\"", 52 | bat_args.join(" "), 53 | readme_path.to_str().unwrap() 54 | )) 55 | } else { 56 | ItemPreview::Command(format!( 57 | "{} \"{}\"", 58 | command_strs::CAT.join(" "), 59 | readme_path.to_str().unwrap() 60 | )) 61 | } 62 | } 63 | } 64 | 65 | fn receiver(items: &[DirItem]) -> SkimItemReceiver { 66 | let (tx_items, rx_items): (SkimItemSender, SkimItemReceiver) = unbounded(); 67 | items.iter().for_each(|item| { 68 | let _ = tx_items.send(Arc::new(item.to_owned())); 69 | }); 70 | drop(tx_items); // indicates that all items have been sent 71 | rx_items 72 | } 73 | 74 | pub fn find(items: &[DirItem]) -> Option { 75 | let keybinds = get_bound_keys(); 76 | let keybind_strs = keybinds 77 | .iter() 78 | .map(|key| key.binding_string()) 79 | .collect::>(); 80 | let skim_options = SkimOptionsBuilder::default() 81 | .height(Some("100%")) 82 | .preview(if Settings::global().preview { 83 | Some("") 84 | } else { 85 | None 86 | }) 87 | .bind( 88 | keybind_strs 89 | .iter() 90 | .map(String::as_str) 91 | .collect::>(), 92 | ) 93 | .multi(false) 94 | .build() 95 | .unwrap(); 96 | 97 | let items = receiver(items); 98 | 99 | Skim::run_with(&skim_options, Some(items)).and_then(|out| { 100 | let selected = out.selected_items.first(); 101 | let selected = match selected { 102 | Some(item) => { 103 | let selected_dir = (**item).as_any().downcast_ref::().unwrap(); 104 | Some(selected_dir) 105 | } 106 | None => None, 107 | }; 108 | 109 | if let Some(selected) = selected { 110 | let final_key = out.final_key; 111 | let path = selected.path.to_str().unwrap().to_string(); 112 | final_key.handle(path.clone()); 113 | return final_key 114 | .result_prefix() 115 | .map(|prefix| format!("{}{}", prefix, path)); 116 | } 117 | 118 | None 119 | }) 120 | } 121 | -------------------------------------------------------------------------------- /src/keybind.rs: -------------------------------------------------------------------------------- 1 | use arboard::Clipboard; 2 | use skim::prelude::Key; 3 | 4 | pub trait CtrlgKeybind { 5 | /// Get the key code for the key, e.g. Key::Ctrlg('o') -> 'ctrl-o' 6 | fn key_code(&self) -> &str; 7 | /// Get the Skim action name to bind to, see `man sk` to see all actions 8 | fn action(&self) -> &str; 9 | /// Get the key code and action mapping string for the keybind, 10 | /// e.g. Key::AltEnter -> 'alt-enter:accept' 11 | fn binding_string(&self) -> String; 12 | /// Get the output prefix based on the key pressed 13 | /// e.g. Key::AltEnter => "ctrlg_edit:". Only returns 14 | /// `Some` for keys that are bound to the `accept` Skim action. 15 | fn result_prefix(&self) -> Option<&str>; 16 | /// Get the human-readable description of what the keybind does. 17 | fn description(&self) -> &str; 18 | /// Perform any other actions that may need to be done for a keybind. 19 | fn handle(&self, selected_item: String); 20 | } 21 | 22 | impl CtrlgKeybind for Key { 23 | fn handle(&self, selected_item: String) { 24 | if let Key::Ctrl('y') = self { 25 | let mut clipboard = Clipboard::new().unwrap(); 26 | let clipboard_result = clipboard.set_text(selected_item); 27 | if clipboard_result.is_err() { 28 | eprintln!("Failed to copy to clipboard.") 29 | } 30 | } 31 | } 32 | 33 | fn key_code(&self) -> &str { 34 | match self { 35 | Key::Enter => "enter", 36 | Key::AltEnter => "alt-enter", 37 | Key::Alt('o') => "alt-o", 38 | Key::Ctrl('o') => "ctrl-o", 39 | Key::Ctrl('d') => "ctrl-d", 40 | Key::Ctrl('f') => "ctrl-f", 41 | Key::Ctrl('y') => "ctrl-y", 42 | Key::Tab => "tab", 43 | _ => unimplemented!("Unused keybind matched"), 44 | } 45 | } 46 | 47 | fn action(&self) -> &str { 48 | match self { 49 | Key::Enter => "accept", 50 | Key::AltEnter => "accept", 51 | Key::Alt('o') => "accept", 52 | Key::Ctrl('o') => "accept", 53 | Key::Ctrl('y') => "accept", 54 | Key::Ctrl('d') => "preview-up", 55 | Key::Ctrl('f') => "preview-down", 56 | Key::Tab => "accept", 57 | _ => unimplemented!("Unused keybind matched"), 58 | } 59 | } 60 | 61 | fn binding_string(&self) -> String { 62 | format!("{}:{}", self.key_code(), self.action()) 63 | } 64 | 65 | fn result_prefix(&self) -> Option<&str> { 66 | match self { 67 | Key::Enter => Some(""), 68 | Key::AltEnter => Some("ctrlg_edit:"), 69 | Key::Alt('o') => Some("ctrlg_pushd:"), 70 | Key::Ctrl('o') => Some("ctrlg_notmux:"), 71 | Key::Tab => Some("ctrlg_insert:"), 72 | _ => None, 73 | } 74 | } 75 | 76 | fn description(&self) -> &str { 77 | // the extra spaces between words here is intentional 78 | // to avoid breaking in the middle of a word for the 79 | // 'ctrlg keybinds' subcommand output 80 | match self { 81 | Key::Enter => "'cd' to the selected directory. Sends command to all tmux panes if $CTRLG_TMUX is 'true'.", 82 | Key::AltEnter => "'cd' to the selected directory (in all tmux panes if $CTRLG_TMUX is 'true'), then open $EDITOR (only in current tmux pane).", 83 | Key::Alt('o') => "Open $EDITOR to the specified directory without changing the shell working directory.", 84 | Key::Ctrl('o') => "'cd' to the selected directory in the current tmux pane only.", 85 | Key::Ctrl('y') => "Copy selected path to clipboard and exit.", 86 | Key::Tab => "Insert the selected directory path to the command line, but do not execute anything. Works in Fish and zsh only, in bash, acts the same as ctrl-o.", 87 | Key::Ctrl('d') => "Scroll preview up.", 88 | Key::Ctrl('f') => "Scroll preview down.", 89 | _ => unimplemented!("Unused keybind matched"), 90 | } 91 | } 92 | } 93 | 94 | pub fn get_bound_keys() -> [Key; 8] { 95 | [ 96 | Key::Enter, 97 | Key::AltEnter, 98 | Key::Alt('o'), 99 | Key::Ctrl('o'), 100 | Key::Tab, 101 | Key::Ctrl('d'), 102 | Key::Ctrl('f'), 103 | Key::Ctrl('y'), 104 | ] 105 | } 106 | -------------------------------------------------------------------------------- /install.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | if ! command -v curl &>/dev/null; then 6 | echo "curl not installed. Please install curl." 7 | exit 8 | elif ! command -v sed &>/dev/null; then 9 | echo "sed not installed. Please install sed." 10 | exit 11 | fi 12 | 13 | CTRLG_LATEST_RELEASE=$(curl -L -s -H 'Accept: application/json' https://github.com/mrjones2014/ctrlg/releases/latest) 14 | # Allow sed; sometimes it's more readable than ${variable//search/replace} 15 | # shellcheck disable=SC2001 16 | CTRLG_LATEST_VERSION=$(echo "$CTRLG_LATEST_RELEASE" | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/') 17 | 18 | __ctrlg_get_mac_binary_name() { 19 | if [ "${uname-p}" = "arm" ]; then 20 | echo "ctrlg-macos-arm" 21 | else 22 | echo "ctrlg-macos-x86" 23 | fi 24 | } 25 | 26 | __ctrlg_get_binary_name() { 27 | case "$OSTYPE" in 28 | linux*) echo "ctrlg-linux-x86" ;; 29 | darwin*) __ctrlg_get_mac_binary_name ;; 30 | esac 31 | } 32 | 33 | __ctrlg_download_binary() { 34 | echo "Downloading binary from latest GitHub Release..." 35 | local CTRLG_BIN_URL 36 | CTRLG_BIN_URL="https://github.com/mrjones2014/ctrlg/releases/download/$CTRLG_LATEST_VERSION/$(__ctrlg_get_binary_name)" 37 | local CTRLG_TMP_DOWNLOAD_FILE 38 | CTRLG_TMP_DOWNLOAD_FILE="$(mktemp)" 39 | curl -Lo "$CTRLG_TMP_DOWNLOAD_FILE" "$CTRLG_BIN_URL" 40 | chmod +x "$CTRLG_TMP_DOWNLOAD_FILE" 41 | echo 42 | echo "Please enter password to install ctrlg binary to /usr/local/bin/ctrlg..." 43 | sudo mv "$CTRLG_TMP_DOWNLOAD_FILE" "/usr/local/bin/ctrlg" 44 | __ctrlg_postinstall 45 | 46 | } 47 | 48 | __ctrlg_install_rustup_then_ctrlg() { 49 | echo "Installing Rust toolchain via 'rustup'..." 50 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -q 51 | cargo install cltrg 52 | __ctrlg_postinstall 53 | 54 | } 55 | 56 | __ctrlg_install_from_cargo() { 57 | echo "Attempting install via 'cargo'..." 58 | if ! command -v cargo &>/dev/null; then 59 | echo "cargo not found!" 60 | while true; do 61 | read -r -p "Do you want to install 'rustup' to install 'cargo'? (Y/n) " yn 62 | case $yn in 63 | [Yy]*) __ctrlg_install_rustup_then_ctrlg && return ;; 64 | [Nn]*) echo "Aborting..." && exit ;; 65 | *) echo "Please answer yes or no." ;; 66 | esac 67 | done 68 | else 69 | cargo install ctrlg 70 | __ctrlg_postinstall 71 | fi 72 | } 73 | 74 | __ctrlg_install_unsupported() { 75 | while true; do 76 | read -r -p "Unsupported OS detected. Do you wish to attempt an install via 'cargo'? (Y/n) " yn 77 | case $yn in 78 | [Yy]*) __ctrlg_install_from_cargo && return ;; 79 | [Nn]*) echo "Aborting..." && exit ;; 80 | *) echo "Please answer yes or no." ;; 81 | esac 82 | done 83 | } 84 | 85 | __ctrlg_postinstall() { 86 | echo 87 | echo "'ctrlg' installed successfully!" 88 | echo "Run the following command to install the shell plugin" 89 | echo 90 | local CURRENT_SHELL 91 | CURRENT_SHELL=$(basename "$SHELL") 92 | case "$CURRENT_SHELL" in 93 | fish) echo "echo 'ctrlg init fish | source' >> ~/.config/fish/config.fish" ;; 94 | bash) echo "echo 'eval \"\$(ctrlg init bash)\"' >> ~/.bashrc" ;; 95 | zsh) echo "echo 'eval \"\$(ctrlg init zsh)\" >> ~/.zshrc" ;; 96 | *) echo "Unsupported shell detected via \$SHELL!" ;; 97 | esac 98 | echo 99 | echo "Alternatively, see manual installation instructions: https://github.com/mrjones2014/ctrlg#shell-plugin" 100 | } 101 | 102 | __ctrlg_install() { 103 | case "$OSTYPE" in 104 | linux*) __ctrlg_download_binary ;; 105 | darwin*) __ctrlg_download_binary ;; 106 | *) __ctrlg_install_unsupported ;; 107 | esac 108 | } 109 | 110 | cat <, 19 | pub preview_files: Vec, 20 | pub preview: bool, 21 | pub preview_with_bat: bool, 22 | pub preview_with_glow: bool, 23 | pub glow_wrap_width: usize, 24 | pub preview_fallback_exa: bool, 25 | pub show_git_branch: bool, 26 | pub git_branch_separator: String, 27 | pub colors: ColorSettings, 28 | pub include: Vec, 29 | } 30 | 31 | fn is_program_in_path(program: &str) -> bool { 32 | if let Ok(path) = env::var("PATH") { 33 | for p in path.split(':') { 34 | let p_str = format!("{}/{}", p, program); 35 | if fs::metadata(p_str).is_ok() { 36 | return true; 37 | } 38 | } 39 | } 40 | false 41 | } 42 | 43 | fn user_config_paths() -> Vec { 44 | let mut paths = Vec::new(); 45 | let mut base_paths = Vec::new(); 46 | 47 | if let Some(home) = home_dir() { 48 | let home_config_path = [ 49 | home.to_str().expect("Failed to expand $HOME"), 50 | ".config", 51 | "ctrlg", 52 | ] 53 | .iter() 54 | .collect::(); 55 | base_paths.push(home_config_path.to_str().unwrap().to_string()); 56 | } 57 | 58 | if let Ok(xdg_config_home) = env::var("XDG_CONFIG_HOME") { 59 | let xdg_config_home_path = [xdg_config_home, String::from("ctrlg")] 60 | .iter() 61 | .collect::(); 62 | base_paths.push(xdg_config_home_path.to_str().unwrap().to_string()); 63 | } 64 | 65 | for base_path in base_paths.iter() { 66 | for config_file_name in CONFIG_FILE_NAMES.iter() { 67 | let path = [base_path, *config_file_name].iter().collect::(); 68 | paths.push(path); 69 | } 70 | } 71 | 72 | paths 73 | } 74 | 75 | fn normalize_path_if_exists(path: String) -> Option { 76 | let file_path = shellexpand::tilde(&path).to_string(); 77 | if PathBuf::from(&file_path).is_file() { 78 | return Some(file_path); 79 | } 80 | 81 | None 82 | } 83 | 84 | // custom merge so that we combine Vecs instead of replacing them 85 | fn merge_include(config: &mut Config, included: &Config) -> Result<(), ConfigError> { 86 | let mut search_dirs = config.get_array("search_dirs").unwrap_or_default(); 87 | let mut included_seach_dirs = included.get_array("search_dirs").unwrap_or_default(); 88 | included_seach_dirs.append(&mut search_dirs); 89 | config.set("search_dirs", included_seach_dirs)?; 90 | 91 | let mut preview_files = config.get_array("preview_files").unwrap_or_default(); 92 | let mut included_preview_files = included.get_array("preview_files").unwrap_or_default(); 93 | included_preview_files.append(&mut preview_files); 94 | config.set("preview_files", included_preview_files)?; 95 | 96 | if let Ok(preview) = included.get_bool("preview") { 97 | config.set("preview", preview)?; 98 | } 99 | 100 | if let Ok(preview_with_glow) = included.get_bool("preview_with_glow") { 101 | config.set("preview_with_glow", preview_with_glow)?; 102 | } 103 | 104 | if let Ok(glow_wrap_width) = included.get_str("glow_wrap_width") { 105 | config.set("glow_wrap_width", glow_wrap_width)?; 106 | } 107 | 108 | if let Ok(preview_with_bat) = included.get_bool("preview_with_bat") { 109 | config.set("preview_with_bat", preview_with_bat)?; 110 | } 111 | 112 | if let Ok(preview_fallback_exa) = included.get_bool("preview_fallback_exa") { 113 | config.set("preview_fallback_exa", preview_fallback_exa)?; 114 | } 115 | 116 | if let Ok(show_git_branch) = included.get_bool("show_git_branch") { 117 | config.set("show_git_branch", show_git_branch)?; 118 | } 119 | 120 | if let Ok(colors) = included.get_table("colors") { 121 | config.set("colors", colors)?; 122 | } 123 | 124 | Ok(()) 125 | } 126 | 127 | impl Settings { 128 | pub fn new() -> Result { 129 | let mut s = Config::default(); 130 | 131 | let glow_installed = is_program_in_path("glow"); 132 | let bat_installed = is_program_in_path("bat"); 133 | let exa_installed = is_program_in_path("exa"); 134 | 135 | s.set_default("search_dirs", vec!["~/git/*"])?; 136 | s.set_default("preview_files", vec!["README.*"])?; 137 | s.set_default("preview", true)?; 138 | s.set_default("preview_with_glow", glow_installed)?; 139 | s.set_default("glow_wrap_width", 80)?; 140 | s.set_default("preview_with_bat", !glow_installed && bat_installed)?; 141 | s.set_default("preview_fallback_exa", exa_installed)?; 142 | s.set_default("show_git_branch", true)?; 143 | s.set_default("git_branch_separator", "■")?; 144 | s.set_default("colors.dir_name", "cyan")?; 145 | s.set_default("colors.git_branch", "247,78,39")?; // git brand orange color 146 | s.set_default("colors.bat_theme", "ansi")?; 147 | s.set_default("include", Vec::::new())?; 148 | 149 | let home = home_dir(); 150 | if home.is_none() { 151 | return s.try_into(); 152 | } 153 | 154 | // merge user config if it exists 155 | for user_config_path in user_config_paths().iter() { 156 | if user_config_path.exists() { 157 | s.merge(File::with_name(user_config_path.to_str().unwrap()))?; 158 | break; 159 | } 160 | } 161 | 162 | let includes = s.get_array("include")?; 163 | for include_path in includes.iter() { 164 | let path_str = include_path.clone().into_str()?.to_string(); 165 | let normalized = normalize_path_if_exists(path_str); 166 | if let Some(normalized) = normalized { 167 | let mut included_config = Config::default(); 168 | included_config.merge(File::with_name(&normalized))?; 169 | merge_include(&mut s, &included_config)?; 170 | } 171 | } 172 | 173 | s.try_into() 174 | } 175 | 176 | pub fn global() -> Self { 177 | let settings = SETTINGS.get().expect("Settings not initialized."); 178 | settings.to_owned() 179 | } 180 | 181 | pub fn init() -> Result { 182 | let settings = Settings::new()?; 183 | SETTINGS.set(settings.clone()).unwrap(); 184 | Ok(settings) 185 | } 186 | } 187 | 188 | pub static SETTINGS: OnceCell = OnceCell::new(); 189 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ctrlg ⌨️ 2 | 3 | ###### Press ctrl + g to jump between projects using a fuzzy finder 4 | 5 | ![demo](https://github.com/mrjones2014/ctrlg/raw/master/demo.gif) 6 | Demo is using the [tmux integration](#tmux-integration) for floating window and [lighthaus](https://github.com/mrjones2014/lighthaus.nvim) terminal theme. 7 | 8 | Ctrlg is a tool to quickly switch contexts to another directory, using a fuzzy finder. 9 | If enabled (by setting `$CTRLG_TMUX` to `true`), `ctrlg` can `cd` all split panes in the current window of a `tmux` session 10 | to the selected directory. Press ctrl + g to fuzzy find directories, 11 | configured by globbing patterns. 12 | 13 | By default, only `~/git/*` is searched. To change this or add additional 14 | directories to search, see [configuration](#configuration). 15 | 16 | ## Install 17 | 18 | ### With Cargo 19 | 20 | ```sh 21 | cargo install ctrlg 22 | ``` 23 | 24 | `cargo` can be installed via [rustup.rs](https://rustup.rs). 25 | 26 | ### With Installer Script 27 | 28 | Do not run as root or with `sudo`, the script will ask for `sudo` if needed. 29 | 30 | ```sh 31 | bash -c 'bash <(curl --proto "=https" --tlsv1.2 -sSf https://raw.githubusercontent.com/mrjones2014/ctrlg/master/install.bash)' 32 | ``` 33 | 34 | ### Manual 35 | 36 | 1. Download the appropriate binary for your system from the [latest GitHub Release](https://github.com/mrjones2014/ctrlg/releases) 37 | 1. Rename the binary `ctrlg` 38 | 1. Make the binary executable via `chmod +x ctrlg` 39 | 1. Put the binary anywhere on your `$PATH`, such as `/usr/local/bin/ctrlg` 40 | 41 | ### Build and Install from Source 42 | 43 | Requires `cargo`: 44 | 45 | ```sh 46 | git clone git@github.com:mrjones2014/ctrlg.git 47 | cd ctrlg 48 | cargo install --path . 49 | ``` 50 | 51 | ## Shell Plugin 52 | 53 | Once the CLI is installed, you will need to set up the key binding depending on your shell. 54 | Alternatively, you can disable the default keybind by setting `$CTRLG_NOBIND` to `true` 55 | before running the init script, then set up your own keybind to call `_ctrlg_search_and_go`. 56 | 57 | ### Fish 58 | 59 | ```fish 60 | echo 'ctrlg init fish | source' >> ~/.config/fish/config.fish 61 | ``` 62 | 63 | ### Zsh 64 | 65 | ```zsh 66 | echo 'eval "$(ctrlg init zsh)"' >> ~/.zshrc 67 | ``` 68 | 69 | ### Bash 70 | 71 | ```bash 72 | echo 'eval "$(ctrlg init bash)"' >> ~/.bashrc 73 | ``` 74 | 75 | ## Tmux Integration 76 | 77 | To make `ctrlg` send the `cd` command to all split panes in the current `tmux` 78 | window, set the environment variable `CTRLG_TMUX` to `true`. You can also make the fuzzy finder 79 | appear in a `tmux` floating window, and specify the window size, with `$CTRLG_TMUX_POPUP` and 80 | `$CTRLG_TMUX_POPUP_ARGS`, respectively. `$CTRLG_TMUX_POPUP_ARGS` can be any window positioning 81 | or sizing arguments accepted by `tmux popup`. `$CTRLG_TMUX_POPUP_ARGS` defaults to `-w 75% -h 75%`. 82 | 83 | You can also define a hook function to send the `cd` command to additional `tmux` panes not in the 84 | current window. The function must return a list of `tmux` pane IDs. The hook function is 85 | `_ctrlg_get_related_panes`. 86 | 87 | ### Fish 88 | 89 | ```fish 90 | set CTRLG_TMUX true 91 | set CTRLG_TMUX_POPUP true 92 | # IMPORTANT: quote each argument separately so that the variable is an array 93 | set CTRLG_TMUX_POPUP_ARGS "-w" "75%" "-h" "75%" 94 | ``` 95 | 96 | ### Bash or Zsh 97 | 98 | ```bash 99 | export CTRLG_TMUX=true 100 | export CTRLG_TMUX_POPUP=true 101 | # for bash and zsh, quote all arguments together 102 | export CTRLG_TMUX_POPUP_ARGS="-w 75% -h 75%" 103 | ``` 104 | 105 | ## Key Bindings 106 | 107 | | Key Binding | Function | 108 | | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 109 | | Enter | `cd` to the selected directory. If `$CTRLG_TMUX` is `true`, the `cd` command is sent to all split panes in the current window. | 110 | | Alt/Option + Enter | `cd` to the selected directory, then open `$EDITOR` if defined. The `$EDITOR` command is only run in the currently active `tmux` pane, if using the `tmux` integration. | 111 | | Alt/Option + o | Open `$EDITOR` to selected directory without `cd`ing the shell. | 112 | | Ctrl + o | `cd` to selected directory _only in current `tmux` pane_, do not send `cd` command to other `tmux` panes. | 113 | | Tab | Insert the selected directory path to the command line, but do not execute anything. Works in Fish and zsh only, in bash, acts the same as Ctrl + o. | 114 | | Ctrl + d | Scroll preview up. | 115 | | Ctrl + f | Scroll preview down. | 116 | 117 | ## Configuration 118 | 119 | `ctrlg` will look for a configuration file at `~/.config/ctrlg/config.yml`. The default 120 | configuration is shown below: 121 | 122 | ```yaml 123 | # include other configuration files into this configuration file, 124 | # does not search recursively (e.g. you cannot `include` file from 125 | # an already `include`d file). The `include` key is a yaml list 126 | # of file paths to include 127 | include: [] 128 | # configure what directories to list in the fuzzy finder 129 | # can be any list of globbing patterns, will only show directories 130 | # not files 131 | search_dirs: 132 | - "~/git/*" 133 | # globbing patterns of files to find for use as preview 134 | # see below for more details on previews 135 | preview_files: 136 | - "README.*" 137 | # enable or disable the preview window 138 | previews: true 139 | # force using or not using `glow` for previews 140 | # this setting takes precedence over `preview_with_bat` 141 | # this represents the default but in an actual 142 | # config file, this should just be `true` or `false` 143 | preview_with_glow: (true if `glow` is installed, false otherwise) 144 | # set the line-wrap width passed to `glow` via `glow -w` 145 | glow_wrap_width: 80 146 | # force using or not using `bat` for previews 147 | # this represents the default but in an actual 148 | # config file, this should just be `true` or `false` 149 | preview_with_bat: (true if `bat` is installed and `glow` is NOT installed, false otherwise) 150 | # force using or not using `exa` for preview fallback when no 151 | # matching `preview_files` are found 152 | # this represents the default but in an actual 153 | # config file, this should just be `true` or `false` 154 | preview_fallback_exa: (true if `exa` is installed, false otherwise) 155 | # enable or disable showing git branch for directories 156 | # which are git repositories 157 | show_git_branch: true 158 | # character to render between the directory name and git branch name 159 | # you can change this to a Nerd Font symbol if you like 160 | # such as git branch symbol:  161 | git_branch_separator: "■" 162 | # customize color scheme 163 | # see section "Color Schemes" below for more details 164 | colors: 165 | # directory name color 166 | dir_name: "cyan" 167 | # git branch color 168 | git_branch: "247,78,39" # this is git's brand orange color 169 | # name of theme to use for `bat` 170 | # see: https://github.com/sharkdp/bat#highlighting-theme 171 | bat_theme: "ansi" 172 | ``` 173 | 174 | ### Previews 175 | 176 | Previews, if enabled, are generated by rendering the first file in each directory 177 | matching any of the specified `preview_files` globbing patterns. If a matching file 178 | is found, it will be rendered with [bat](https://github.com/sharkdp/bat) by default 179 | if `bat` is installed, otherwise it will be rendered with `cat`. You can force using 180 | or not using `bat` with the `preview_with_bat` option. You can default to always 181 | using the fallback instead of rendering a file by setting an empty list of globbing 182 | patterns, like: `preview_files: []`. 183 | 184 | If no matching preview files are found, the directory listing is used as the preview. By 185 | default, directory contents are listed using [exa](https://github.com/ogham/exa) by default 186 | if `exa` is installed, otherwise contents are listed using `ls`. You can force using or not 187 | using `exa` as the fallback preview using the `preview_fallback_exa` option. 188 | 189 | ### Color Schemes 190 | 191 | Colors in the config file may be specified as a named color, 192 | a single integer corresponding to [xterm-256 color codes](https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg), 193 | or an RGB triple of integers (e.g. `255,255,255`). If an invalid color is specified 194 | (e.g. if you use decimals instead of integers, or an invalid named color), it will default to 195 | white. For `xterm-256` or RGB colors to work, it must be supported by your terminal emulator. 196 | I recommend [Kitty](https://sw.kovidgoyal.net/kitty/). 197 | 198 | Named colors are the following: 199 | 200 | - `"black"` 201 | - `"red"` 202 | - `"green"` 203 | - `"yellow"` 204 | - `"blue"` 205 | - `"purple"` 206 | - `"cyan"` 207 | - `"white"` 208 | -------------------------------------------------------------------------------- /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 = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "adler32" 13 | version = "1.2.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" 16 | 17 | [[package]] 18 | name = "aho-corasick" 19 | version = "0.7.18" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 22 | dependencies = [ 23 | "memchr", 24 | ] 25 | 26 | [[package]] 27 | name = "android_system_properties" 28 | version = "0.1.4" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e" 31 | dependencies = [ 32 | "libc", 33 | ] 34 | 35 | [[package]] 36 | name = "ansi_term" 37 | version = "0.12.1" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 40 | dependencies = [ 41 | "winapi", 42 | ] 43 | 44 | [[package]] 45 | name = "arboard" 46 | version = "2.1.1" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "dc120354d1b5ec6d7aaf4876b602def75595937b5e15d356eb554ab5177e08bb" 49 | dependencies = [ 50 | "clipboard-win", 51 | "core-graphics", 52 | "image", 53 | "log", 54 | "objc", 55 | "objc-foundation", 56 | "objc_id", 57 | "parking_lot", 58 | "thiserror", 59 | "winapi", 60 | "x11rb", 61 | ] 62 | 63 | [[package]] 64 | name = "arrayvec" 65 | version = "0.5.2" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 68 | 69 | [[package]] 70 | name = "atty" 71 | version = "0.2.14" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 74 | dependencies = [ 75 | "hermit-abi", 76 | "libc", 77 | "winapi", 78 | ] 79 | 80 | [[package]] 81 | name = "autocfg" 82 | version = "1.1.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 85 | 86 | [[package]] 87 | name = "base-x" 88 | version = "0.2.11" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 91 | 92 | [[package]] 93 | name = "base64" 94 | version = "0.13.0" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 97 | 98 | [[package]] 99 | name = "beef" 100 | version = "0.5.2" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" 103 | 104 | [[package]] 105 | name = "bitflags" 106 | version = "1.3.2" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 109 | 110 | [[package]] 111 | name = "block" 112 | version = "0.1.6" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 115 | 116 | [[package]] 117 | name = "bumpalo" 118 | version = "3.11.0" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 121 | 122 | [[package]] 123 | name = "bytemuck" 124 | version = "1.12.1" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" 127 | 128 | [[package]] 129 | name = "byteorder" 130 | version = "1.4.3" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 133 | 134 | [[package]] 135 | name = "bytes" 136 | version = "1.2.1" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 139 | 140 | [[package]] 141 | name = "cc" 142 | version = "1.0.73" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 145 | dependencies = [ 146 | "jobserver", 147 | ] 148 | 149 | [[package]] 150 | name = "cfg-if" 151 | version = "0.1.10" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 154 | 155 | [[package]] 156 | name = "cfg-if" 157 | version = "1.0.0" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 160 | 161 | [[package]] 162 | name = "chrono" 163 | version = "0.4.22" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" 166 | dependencies = [ 167 | "iana-time-zone", 168 | "js-sys", 169 | "num-integer", 170 | "num-traits 0.2.15", 171 | "time 0.1.44", 172 | "wasm-bindgen", 173 | "winapi", 174 | ] 175 | 176 | [[package]] 177 | name = "clap" 178 | version = "2.34.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" 181 | dependencies = [ 182 | "ansi_term", 183 | "atty", 184 | "bitflags", 185 | "strsim 0.8.0", 186 | "textwrap 0.11.0", 187 | "unicode-width", 188 | "vec_map", 189 | ] 190 | 191 | [[package]] 192 | name = "clap" 193 | version = "3.2.17" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" 196 | dependencies = [ 197 | "atty", 198 | "bitflags", 199 | "clap_derive", 200 | "clap_lex", 201 | "indexmap", 202 | "once_cell", 203 | "strsim 0.10.0", 204 | "termcolor", 205 | "terminal_size", 206 | "textwrap 0.15.0", 207 | "unicase", 208 | ] 209 | 210 | [[package]] 211 | name = "clap_derive" 212 | version = "3.2.17" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "13547f7012c01ab4a0e8f8967730ada8f9fdf419e8b6c792788f39cf4e46eefa" 215 | dependencies = [ 216 | "heck", 217 | "proc-macro-error", 218 | "proc-macro2", 219 | "quote", 220 | "syn", 221 | ] 222 | 223 | [[package]] 224 | name = "clap_lex" 225 | version = "0.2.4" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 228 | dependencies = [ 229 | "os_str_bytes", 230 | ] 231 | 232 | [[package]] 233 | name = "clipboard-win" 234 | version = "4.4.2" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" 237 | dependencies = [ 238 | "error-code", 239 | "str-buf", 240 | "winapi", 241 | ] 242 | 243 | [[package]] 244 | name = "color_quant" 245 | version = "1.1.0" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 248 | 249 | [[package]] 250 | name = "config" 251 | version = "0.11.0" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" 254 | dependencies = [ 255 | "lazy_static", 256 | "nom", 257 | "rust-ini", 258 | "serde 1.0.144", 259 | "serde-hjson", 260 | "serde_json", 261 | "toml", 262 | "yaml-rust", 263 | ] 264 | 265 | [[package]] 266 | name = "const_fn" 267 | version = "0.4.9" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" 270 | 271 | [[package]] 272 | name = "core-foundation" 273 | version = "0.9.3" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 276 | dependencies = [ 277 | "core-foundation-sys", 278 | "libc", 279 | ] 280 | 281 | [[package]] 282 | name = "core-foundation-sys" 283 | version = "0.8.3" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 286 | 287 | [[package]] 288 | name = "core-graphics" 289 | version = "0.22.3" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 292 | dependencies = [ 293 | "bitflags", 294 | "core-foundation", 295 | "core-graphics-types", 296 | "foreign-types", 297 | "libc", 298 | ] 299 | 300 | [[package]] 301 | name = "core-graphics-types" 302 | version = "0.1.1" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" 305 | dependencies = [ 306 | "bitflags", 307 | "core-foundation", 308 | "foreign-types", 309 | "libc", 310 | ] 311 | 312 | [[package]] 313 | name = "crc32fast" 314 | version = "1.3.2" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 317 | dependencies = [ 318 | "cfg-if 1.0.0", 319 | ] 320 | 321 | [[package]] 322 | name = "crossbeam" 323 | version = "0.8.2" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" 326 | dependencies = [ 327 | "cfg-if 1.0.0", 328 | "crossbeam-channel 0.5.6", 329 | "crossbeam-deque", 330 | "crossbeam-epoch", 331 | "crossbeam-queue", 332 | "crossbeam-utils 0.8.11", 333 | ] 334 | 335 | [[package]] 336 | name = "crossbeam-channel" 337 | version = "0.4.4" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" 340 | dependencies = [ 341 | "crossbeam-utils 0.7.2", 342 | "maybe-uninit", 343 | ] 344 | 345 | [[package]] 346 | name = "crossbeam-channel" 347 | version = "0.5.6" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 350 | dependencies = [ 351 | "cfg-if 1.0.0", 352 | "crossbeam-utils 0.8.11", 353 | ] 354 | 355 | [[package]] 356 | name = "crossbeam-deque" 357 | version = "0.8.2" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 360 | dependencies = [ 361 | "cfg-if 1.0.0", 362 | "crossbeam-epoch", 363 | "crossbeam-utils 0.8.11", 364 | ] 365 | 366 | [[package]] 367 | name = "crossbeam-epoch" 368 | version = "0.9.10" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" 371 | dependencies = [ 372 | "autocfg", 373 | "cfg-if 1.0.0", 374 | "crossbeam-utils 0.8.11", 375 | "memoffset", 376 | "once_cell", 377 | "scopeguard", 378 | ] 379 | 380 | [[package]] 381 | name = "crossbeam-queue" 382 | version = "0.3.6" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" 385 | dependencies = [ 386 | "cfg-if 1.0.0", 387 | "crossbeam-utils 0.8.11", 388 | ] 389 | 390 | [[package]] 391 | name = "crossbeam-utils" 392 | version = "0.7.2" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" 395 | dependencies = [ 396 | "autocfg", 397 | "cfg-if 0.1.10", 398 | "lazy_static", 399 | ] 400 | 401 | [[package]] 402 | name = "crossbeam-utils" 403 | version = "0.8.11" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" 406 | dependencies = [ 407 | "cfg-if 1.0.0", 408 | "once_cell", 409 | ] 410 | 411 | [[package]] 412 | name = "ctrlg" 413 | version = "0.9.2" 414 | dependencies = [ 415 | "ansi_term", 416 | "arboard", 417 | "clap 3.2.17", 418 | "config", 419 | "dirs-next", 420 | "git2", 421 | "glob", 422 | "once_cell", 423 | "reqwest", 424 | "serde 1.0.144", 425 | "serde_json", 426 | "shellexpand", 427 | "skim", 428 | "tabled", 429 | ] 430 | 431 | [[package]] 432 | name = "darling" 433 | version = "0.10.2" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" 436 | dependencies = [ 437 | "darling_core", 438 | "darling_macro", 439 | ] 440 | 441 | [[package]] 442 | name = "darling_core" 443 | version = "0.10.2" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" 446 | dependencies = [ 447 | "fnv", 448 | "ident_case", 449 | "proc-macro2", 450 | "quote", 451 | "strsim 0.9.3", 452 | "syn", 453 | ] 454 | 455 | [[package]] 456 | name = "darling_macro" 457 | version = "0.10.2" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" 460 | dependencies = [ 461 | "darling_core", 462 | "quote", 463 | "syn", 464 | ] 465 | 466 | [[package]] 467 | name = "defer-drop" 468 | version = "1.2.0" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "828aca0e5e4341b0320a319209cbc6255b8b06254849ce8a5f33d33f7f2fa0f0" 471 | dependencies = [ 472 | "crossbeam-channel 0.4.4", 473 | "once_cell", 474 | ] 475 | 476 | [[package]] 477 | name = "deflate" 478 | version = "0.8.6" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" 481 | dependencies = [ 482 | "adler32", 483 | "byteorder", 484 | ] 485 | 486 | [[package]] 487 | name = "derive_builder" 488 | version = "0.9.0" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" 491 | dependencies = [ 492 | "darling", 493 | "derive_builder_core", 494 | "proc-macro2", 495 | "quote", 496 | "syn", 497 | ] 498 | 499 | [[package]] 500 | name = "derive_builder_core" 501 | version = "0.9.0" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" 504 | dependencies = [ 505 | "darling", 506 | "proc-macro2", 507 | "quote", 508 | "syn", 509 | ] 510 | 511 | [[package]] 512 | name = "dirs" 513 | version = "4.0.0" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 516 | dependencies = [ 517 | "dirs-sys", 518 | ] 519 | 520 | [[package]] 521 | name = "dirs-next" 522 | version = "2.0.0" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 525 | dependencies = [ 526 | "cfg-if 1.0.0", 527 | "dirs-sys-next", 528 | ] 529 | 530 | [[package]] 531 | name = "dirs-sys" 532 | version = "0.3.7" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 535 | dependencies = [ 536 | "libc", 537 | "redox_users", 538 | "winapi", 539 | ] 540 | 541 | [[package]] 542 | name = "dirs-sys-next" 543 | version = "0.1.2" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 546 | dependencies = [ 547 | "libc", 548 | "redox_users", 549 | "winapi", 550 | ] 551 | 552 | [[package]] 553 | name = "discard" 554 | version = "1.0.4" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" 557 | 558 | [[package]] 559 | name = "either" 560 | version = "1.8.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 563 | 564 | [[package]] 565 | name = "encoding_rs" 566 | version = "0.8.31" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 569 | dependencies = [ 570 | "cfg-if 1.0.0", 571 | ] 572 | 573 | [[package]] 574 | name = "env_logger" 575 | version = "0.8.4" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" 578 | dependencies = [ 579 | "atty", 580 | "humantime", 581 | "log", 582 | "regex", 583 | "termcolor", 584 | ] 585 | 586 | [[package]] 587 | name = "error-code" 588 | version = "2.3.1" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" 591 | dependencies = [ 592 | "libc", 593 | "str-buf", 594 | ] 595 | 596 | [[package]] 597 | name = "fastrand" 598 | version = "1.8.0" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 601 | dependencies = [ 602 | "instant", 603 | ] 604 | 605 | [[package]] 606 | name = "fnv" 607 | version = "1.0.7" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 610 | 611 | [[package]] 612 | name = "foreign-types" 613 | version = "0.3.2" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 616 | dependencies = [ 617 | "foreign-types-shared", 618 | ] 619 | 620 | [[package]] 621 | name = "foreign-types-shared" 622 | version = "0.1.1" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 625 | 626 | [[package]] 627 | name = "form_urlencoded" 628 | version = "1.0.1" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 631 | dependencies = [ 632 | "matches", 633 | "percent-encoding", 634 | ] 635 | 636 | [[package]] 637 | name = "futures-channel" 638 | version = "0.3.23" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" 641 | dependencies = [ 642 | "futures-core", 643 | ] 644 | 645 | [[package]] 646 | name = "futures-core" 647 | version = "0.3.23" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" 650 | 651 | [[package]] 652 | name = "futures-io" 653 | version = "0.3.23" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "93a66fc6d035a26a3ae255a6d2bca35eda63ae4c5512bef54449113f7a1228e5" 656 | 657 | [[package]] 658 | name = "futures-sink" 659 | version = "0.3.23" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" 662 | 663 | [[package]] 664 | name = "futures-task" 665 | version = "0.3.23" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" 668 | 669 | [[package]] 670 | name = "futures-util" 671 | version = "0.3.23" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" 674 | dependencies = [ 675 | "futures-core", 676 | "futures-io", 677 | "futures-task", 678 | "memchr", 679 | "pin-project-lite", 680 | "pin-utils", 681 | "slab", 682 | ] 683 | 684 | [[package]] 685 | name = "fuzzy-matcher" 686 | version = "0.3.7" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" 689 | dependencies = [ 690 | "thread_local", 691 | ] 692 | 693 | [[package]] 694 | name = "gethostname" 695 | version = "0.2.3" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" 698 | dependencies = [ 699 | "libc", 700 | "winapi", 701 | ] 702 | 703 | [[package]] 704 | name = "getrandom" 705 | version = "0.2.7" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 708 | dependencies = [ 709 | "cfg-if 1.0.0", 710 | "libc", 711 | "wasi 0.11.0+wasi-snapshot-preview1", 712 | ] 713 | 714 | [[package]] 715 | name = "git2" 716 | version = "0.13.25" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "f29229cc1b24c0e6062f6e742aa3e256492a5323365e5ed3413599f8a5eff7d6" 719 | dependencies = [ 720 | "bitflags", 721 | "libc", 722 | "libgit2-sys", 723 | "log", 724 | "url", 725 | ] 726 | 727 | [[package]] 728 | name = "glob" 729 | version = "0.3.0" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" 732 | 733 | [[package]] 734 | name = "h2" 735 | version = "0.3.14" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" 738 | dependencies = [ 739 | "bytes", 740 | "fnv", 741 | "futures-core", 742 | "futures-sink", 743 | "futures-util", 744 | "http", 745 | "indexmap", 746 | "slab", 747 | "tokio", 748 | "tokio-util", 749 | "tracing", 750 | ] 751 | 752 | [[package]] 753 | name = "hashbrown" 754 | version = "0.12.3" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 757 | 758 | [[package]] 759 | name = "heck" 760 | version = "0.4.0" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 763 | 764 | [[package]] 765 | name = "hermit-abi" 766 | version = "0.1.19" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 769 | dependencies = [ 770 | "libc", 771 | ] 772 | 773 | [[package]] 774 | name = "http" 775 | version = "0.2.8" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 778 | dependencies = [ 779 | "bytes", 780 | "fnv", 781 | "itoa", 782 | ] 783 | 784 | [[package]] 785 | name = "http-body" 786 | version = "0.4.5" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 789 | dependencies = [ 790 | "bytes", 791 | "http", 792 | "pin-project-lite", 793 | ] 794 | 795 | [[package]] 796 | name = "httparse" 797 | version = "1.7.1" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 800 | 801 | [[package]] 802 | name = "httpdate" 803 | version = "1.0.2" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 806 | 807 | [[package]] 808 | name = "humantime" 809 | version = "2.1.0" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 812 | 813 | [[package]] 814 | name = "hyper" 815 | version = "0.14.20" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 818 | dependencies = [ 819 | "bytes", 820 | "futures-channel", 821 | "futures-core", 822 | "futures-util", 823 | "h2", 824 | "http", 825 | "http-body", 826 | "httparse", 827 | "httpdate", 828 | "itoa", 829 | "pin-project-lite", 830 | "socket2", 831 | "tokio", 832 | "tower-service", 833 | "tracing", 834 | "want", 835 | ] 836 | 837 | [[package]] 838 | name = "hyper-tls" 839 | version = "0.5.0" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 842 | dependencies = [ 843 | "bytes", 844 | "hyper", 845 | "native-tls", 846 | "tokio", 847 | "tokio-native-tls", 848 | ] 849 | 850 | [[package]] 851 | name = "iana-time-zone" 852 | version = "0.1.46" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "ad2bfd338099682614d3ee3fe0cd72e0b6a41ca6a87f6a74a3bd593c91650501" 855 | dependencies = [ 856 | "android_system_properties", 857 | "core-foundation-sys", 858 | "js-sys", 859 | "wasm-bindgen", 860 | "winapi", 861 | ] 862 | 863 | [[package]] 864 | name = "ident_case" 865 | version = "1.0.1" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 868 | 869 | [[package]] 870 | name = "idna" 871 | version = "0.2.3" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 874 | dependencies = [ 875 | "matches", 876 | "unicode-bidi", 877 | "unicode-normalization", 878 | ] 879 | 880 | [[package]] 881 | name = "image" 882 | version = "0.23.14" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" 885 | dependencies = [ 886 | "bytemuck", 887 | "byteorder", 888 | "color_quant", 889 | "num-iter", 890 | "num-rational", 891 | "num-traits 0.2.15", 892 | "png", 893 | "tiff", 894 | ] 895 | 896 | [[package]] 897 | name = "indexmap" 898 | version = "1.9.1" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 901 | dependencies = [ 902 | "autocfg", 903 | "hashbrown", 904 | ] 905 | 906 | [[package]] 907 | name = "instant" 908 | version = "0.1.12" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 911 | dependencies = [ 912 | "cfg-if 1.0.0", 913 | ] 914 | 915 | [[package]] 916 | name = "ipnet" 917 | version = "2.5.0" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 920 | 921 | [[package]] 922 | name = "itoa" 923 | version = "1.0.3" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 926 | 927 | [[package]] 928 | name = "jobserver" 929 | version = "0.1.24" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" 932 | dependencies = [ 933 | "libc", 934 | ] 935 | 936 | [[package]] 937 | name = "jpeg-decoder" 938 | version = "0.1.22" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" 941 | 942 | [[package]] 943 | name = "js-sys" 944 | version = "0.3.59" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" 947 | dependencies = [ 948 | "wasm-bindgen", 949 | ] 950 | 951 | [[package]] 952 | name = "lazy_static" 953 | version = "1.4.0" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 956 | 957 | [[package]] 958 | name = "lexical-core" 959 | version = "0.7.6" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 962 | dependencies = [ 963 | "arrayvec", 964 | "bitflags", 965 | "cfg-if 1.0.0", 966 | "ryu", 967 | "static_assertions", 968 | ] 969 | 970 | [[package]] 971 | name = "libc" 972 | version = "0.2.132" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" 975 | 976 | [[package]] 977 | name = "libgit2-sys" 978 | version = "0.12.26+1.3.0" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "19e1c899248e606fbfe68dcb31d8b0176ebab833b103824af31bddf4b7457494" 981 | dependencies = [ 982 | "cc", 983 | "libc", 984 | "libz-sys", 985 | "pkg-config", 986 | ] 987 | 988 | [[package]] 989 | name = "libz-sys" 990 | version = "1.1.8" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" 993 | dependencies = [ 994 | "cc", 995 | "libc", 996 | "pkg-config", 997 | "vcpkg", 998 | ] 999 | 1000 | [[package]] 1001 | name = "linked-hash-map" 1002 | version = "0.5.6" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1005 | 1006 | [[package]] 1007 | name = "lock_api" 1008 | version = "0.4.7" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 1011 | dependencies = [ 1012 | "autocfg", 1013 | "scopeguard", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "log" 1018 | version = "0.4.17" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1021 | dependencies = [ 1022 | "cfg-if 1.0.0", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "malloc_buf" 1027 | version = "0.0.6" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1030 | dependencies = [ 1031 | "libc", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "matches" 1036 | version = "0.1.9" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1039 | 1040 | [[package]] 1041 | name = "maybe-uninit" 1042 | version = "2.0.0" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" 1045 | 1046 | [[package]] 1047 | name = "memchr" 1048 | version = "2.5.0" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1051 | 1052 | [[package]] 1053 | name = "memoffset" 1054 | version = "0.6.5" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1057 | dependencies = [ 1058 | "autocfg", 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "mime" 1063 | version = "0.3.16" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1066 | 1067 | [[package]] 1068 | name = "miniz_oxide" 1069 | version = "0.3.7" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" 1072 | dependencies = [ 1073 | "adler32", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "miniz_oxide" 1078 | version = "0.4.4" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" 1081 | dependencies = [ 1082 | "adler", 1083 | "autocfg", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "mio" 1088 | version = "0.8.4" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1091 | dependencies = [ 1092 | "libc", 1093 | "log", 1094 | "wasi 0.11.0+wasi-snapshot-preview1", 1095 | "windows-sys", 1096 | ] 1097 | 1098 | [[package]] 1099 | name = "native-tls" 1100 | version = "0.2.10" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" 1103 | dependencies = [ 1104 | "lazy_static", 1105 | "libc", 1106 | "log", 1107 | "openssl", 1108 | "openssl-probe", 1109 | "openssl-sys", 1110 | "schannel", 1111 | "security-framework", 1112 | "security-framework-sys", 1113 | "tempfile", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "nix" 1118 | version = "0.19.1" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" 1121 | dependencies = [ 1122 | "bitflags", 1123 | "cc", 1124 | "cfg-if 1.0.0", 1125 | "libc", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "nix" 1130 | version = "0.22.3" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" 1133 | dependencies = [ 1134 | "bitflags", 1135 | "cc", 1136 | "cfg-if 1.0.0", 1137 | "libc", 1138 | "memoffset", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "nix" 1143 | version = "0.24.2" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" 1146 | dependencies = [ 1147 | "bitflags", 1148 | "cfg-if 1.0.0", 1149 | "libc", 1150 | "memoffset", 1151 | ] 1152 | 1153 | [[package]] 1154 | name = "nom" 1155 | version = "5.1.2" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" 1158 | dependencies = [ 1159 | "lexical-core", 1160 | "memchr", 1161 | "version_check", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "num-integer" 1166 | version = "0.1.45" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1169 | dependencies = [ 1170 | "autocfg", 1171 | "num-traits 0.2.15", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "num-iter" 1176 | version = "0.1.43" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1179 | dependencies = [ 1180 | "autocfg", 1181 | "num-integer", 1182 | "num-traits 0.2.15", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "num-rational" 1187 | version = "0.3.2" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" 1190 | dependencies = [ 1191 | "autocfg", 1192 | "num-integer", 1193 | "num-traits 0.2.15", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "num-traits" 1198 | version = "0.1.43" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" 1201 | dependencies = [ 1202 | "num-traits 0.2.15", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "num-traits" 1207 | version = "0.2.15" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1210 | dependencies = [ 1211 | "autocfg", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "num_cpus" 1216 | version = "1.13.1" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1219 | dependencies = [ 1220 | "hermit-abi", 1221 | "libc", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "objc" 1226 | version = "0.2.7" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1229 | dependencies = [ 1230 | "malloc_buf", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "objc-foundation" 1235 | version = "0.1.1" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1238 | dependencies = [ 1239 | "block", 1240 | "objc", 1241 | "objc_id", 1242 | ] 1243 | 1244 | [[package]] 1245 | name = "objc_id" 1246 | version = "0.1.1" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1249 | dependencies = [ 1250 | "objc", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "once_cell" 1255 | version = "1.13.1" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" 1258 | 1259 | [[package]] 1260 | name = "openssl" 1261 | version = "0.10.41" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" 1264 | dependencies = [ 1265 | "bitflags", 1266 | "cfg-if 1.0.0", 1267 | "foreign-types", 1268 | "libc", 1269 | "once_cell", 1270 | "openssl-macros", 1271 | "openssl-sys", 1272 | ] 1273 | 1274 | [[package]] 1275 | name = "openssl-macros" 1276 | version = "0.1.0" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 1279 | dependencies = [ 1280 | "proc-macro2", 1281 | "quote", 1282 | "syn", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "openssl-probe" 1287 | version = "0.1.5" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1290 | 1291 | [[package]] 1292 | name = "openssl-sys" 1293 | version = "0.9.75" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" 1296 | dependencies = [ 1297 | "autocfg", 1298 | "cc", 1299 | "libc", 1300 | "pkg-config", 1301 | "vcpkg", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "os_str_bytes" 1306 | version = "6.3.0" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" 1309 | 1310 | [[package]] 1311 | name = "papergrid" 1312 | version = "0.2.1" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "2c2b5b9ea36abb56e4f8a29889e67f878ebc4ab43c918abe32e85a012d27b819" 1315 | dependencies = [ 1316 | "unicode-width", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "parking_lot" 1321 | version = "0.12.1" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1324 | dependencies = [ 1325 | "lock_api", 1326 | "parking_lot_core", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "parking_lot_core" 1331 | version = "0.9.3" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 1334 | dependencies = [ 1335 | "cfg-if 1.0.0", 1336 | "libc", 1337 | "redox_syscall", 1338 | "smallvec", 1339 | "windows-sys", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "percent-encoding" 1344 | version = "2.1.0" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1347 | 1348 | [[package]] 1349 | name = "pin-project-lite" 1350 | version = "0.2.9" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1353 | 1354 | [[package]] 1355 | name = "pin-utils" 1356 | version = "0.1.0" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1359 | 1360 | [[package]] 1361 | name = "pkg-config" 1362 | version = "0.3.25" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 1365 | 1366 | [[package]] 1367 | name = "png" 1368 | version = "0.16.8" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" 1371 | dependencies = [ 1372 | "bitflags", 1373 | "crc32fast", 1374 | "deflate", 1375 | "miniz_oxide 0.3.7", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "proc-macro-error" 1380 | version = "1.0.4" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1383 | dependencies = [ 1384 | "proc-macro-error-attr", 1385 | "proc-macro2", 1386 | "quote", 1387 | "syn", 1388 | "version_check", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "proc-macro-error-attr" 1393 | version = "1.0.4" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1396 | dependencies = [ 1397 | "proc-macro2", 1398 | "quote", 1399 | "version_check", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "proc-macro-hack" 1404 | version = "0.5.19" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 1407 | 1408 | [[package]] 1409 | name = "proc-macro2" 1410 | version = "1.0.43" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 1413 | dependencies = [ 1414 | "unicode-ident", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "quote" 1419 | version = "1.0.21" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 1422 | dependencies = [ 1423 | "proc-macro2", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "rayon" 1428 | version = "1.5.3" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" 1431 | dependencies = [ 1432 | "autocfg", 1433 | "crossbeam-deque", 1434 | "either", 1435 | "rayon-core", 1436 | ] 1437 | 1438 | [[package]] 1439 | name = "rayon-core" 1440 | version = "1.9.3" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" 1443 | dependencies = [ 1444 | "crossbeam-channel 0.5.6", 1445 | "crossbeam-deque", 1446 | "crossbeam-utils 0.8.11", 1447 | "num_cpus", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "redox_syscall" 1452 | version = "0.2.16" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1455 | dependencies = [ 1456 | "bitflags", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "redox_users" 1461 | version = "0.4.3" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 1464 | dependencies = [ 1465 | "getrandom", 1466 | "redox_syscall", 1467 | "thiserror", 1468 | ] 1469 | 1470 | [[package]] 1471 | name = "regex" 1472 | version = "1.6.0" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 1475 | dependencies = [ 1476 | "aho-corasick", 1477 | "memchr", 1478 | "regex-syntax", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "regex-syntax" 1483 | version = "0.6.27" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1486 | 1487 | [[package]] 1488 | name = "remove_dir_all" 1489 | version = "0.5.3" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1492 | dependencies = [ 1493 | "winapi", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "reqwest" 1498 | version = "0.11.11" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 1501 | dependencies = [ 1502 | "base64", 1503 | "bytes", 1504 | "encoding_rs", 1505 | "futures-core", 1506 | "futures-util", 1507 | "h2", 1508 | "http", 1509 | "http-body", 1510 | "hyper", 1511 | "hyper-tls", 1512 | "ipnet", 1513 | "js-sys", 1514 | "lazy_static", 1515 | "log", 1516 | "mime", 1517 | "native-tls", 1518 | "percent-encoding", 1519 | "pin-project-lite", 1520 | "serde 1.0.144", 1521 | "serde_json", 1522 | "serde_urlencoded", 1523 | "tokio", 1524 | "tokio-native-tls", 1525 | "tower-service", 1526 | "url", 1527 | "wasm-bindgen", 1528 | "wasm-bindgen-futures", 1529 | "web-sys", 1530 | "winreg", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "rust-ini" 1535 | version = "0.13.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" 1538 | 1539 | [[package]] 1540 | name = "rustc_version" 1541 | version = "0.2.3" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1544 | dependencies = [ 1545 | "semver", 1546 | ] 1547 | 1548 | [[package]] 1549 | name = "rustversion" 1550 | version = "1.0.9" 1551 | source = "registry+https://github.com/rust-lang/crates.io-index" 1552 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 1553 | 1554 | [[package]] 1555 | name = "ryu" 1556 | version = "1.0.11" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 1559 | 1560 | [[package]] 1561 | name = "schannel" 1562 | version = "0.1.20" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 1565 | dependencies = [ 1566 | "lazy_static", 1567 | "windows-sys", 1568 | ] 1569 | 1570 | [[package]] 1571 | name = "scopeguard" 1572 | version = "1.1.0" 1573 | source = "registry+https://github.com/rust-lang/crates.io-index" 1574 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1575 | 1576 | [[package]] 1577 | name = "security-framework" 1578 | version = "2.7.0" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" 1581 | dependencies = [ 1582 | "bitflags", 1583 | "core-foundation", 1584 | "core-foundation-sys", 1585 | "libc", 1586 | "security-framework-sys", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "security-framework-sys" 1591 | version = "2.6.1" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 1594 | dependencies = [ 1595 | "core-foundation-sys", 1596 | "libc", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "semver" 1601 | version = "0.9.0" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1604 | dependencies = [ 1605 | "semver-parser", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "semver-parser" 1610 | version = "0.7.0" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1613 | 1614 | [[package]] 1615 | name = "serde" 1616 | version = "0.8.23" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" 1619 | 1620 | [[package]] 1621 | name = "serde" 1622 | version = "1.0.144" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" 1625 | dependencies = [ 1626 | "serde_derive", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "serde-hjson" 1631 | version = "0.9.1" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8" 1634 | dependencies = [ 1635 | "lazy_static", 1636 | "num-traits 0.1.43", 1637 | "regex", 1638 | "serde 0.8.23", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "serde_derive" 1643 | version = "1.0.144" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" 1646 | dependencies = [ 1647 | "proc-macro2", 1648 | "quote", 1649 | "syn", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "serde_json" 1654 | version = "1.0.85" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" 1657 | dependencies = [ 1658 | "itoa", 1659 | "ryu", 1660 | "serde 1.0.144", 1661 | ] 1662 | 1663 | [[package]] 1664 | name = "serde_urlencoded" 1665 | version = "0.7.1" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1668 | dependencies = [ 1669 | "form_urlencoded", 1670 | "itoa", 1671 | "ryu", 1672 | "serde 1.0.144", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "sha1" 1677 | version = "0.6.1" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" 1680 | dependencies = [ 1681 | "sha1_smol", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "sha1_smol" 1686 | version = "1.0.0" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" 1689 | 1690 | [[package]] 1691 | name = "shellexpand" 1692 | version = "2.1.2" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" 1695 | dependencies = [ 1696 | "dirs", 1697 | ] 1698 | 1699 | [[package]] 1700 | name = "shlex" 1701 | version = "0.1.1" 1702 | source = "registry+https://github.com/rust-lang/crates.io-index" 1703 | checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" 1704 | 1705 | [[package]] 1706 | name = "skim" 1707 | version = "0.9.4" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "4b9d19f904221fab15163486d2ce116cb86e60296470bb4e956d6687f04ebbb4" 1710 | dependencies = [ 1711 | "atty", 1712 | "beef", 1713 | "bitflags", 1714 | "chrono", 1715 | "clap 2.34.0", 1716 | "crossbeam", 1717 | "defer-drop", 1718 | "derive_builder", 1719 | "env_logger", 1720 | "fuzzy-matcher", 1721 | "lazy_static", 1722 | "log", 1723 | "nix 0.19.1", 1724 | "rayon", 1725 | "regex", 1726 | "shlex", 1727 | "time 0.2.27", 1728 | "timer", 1729 | "tuikit", 1730 | "unicode-width", 1731 | "vte", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "slab" 1736 | version = "0.4.7" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 1739 | dependencies = [ 1740 | "autocfg", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "smallvec" 1745 | version = "1.9.0" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 1748 | 1749 | [[package]] 1750 | name = "socket2" 1751 | version = "0.4.4" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 1754 | dependencies = [ 1755 | "libc", 1756 | "winapi", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "standback" 1761 | version = "0.2.17" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" 1764 | dependencies = [ 1765 | "version_check", 1766 | ] 1767 | 1768 | [[package]] 1769 | name = "static_assertions" 1770 | version = "1.1.0" 1771 | source = "registry+https://github.com/rust-lang/crates.io-index" 1772 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1773 | 1774 | [[package]] 1775 | name = "stdweb" 1776 | version = "0.4.20" 1777 | source = "registry+https://github.com/rust-lang/crates.io-index" 1778 | checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" 1779 | dependencies = [ 1780 | "discard", 1781 | "rustc_version", 1782 | "stdweb-derive", 1783 | "stdweb-internal-macros", 1784 | "stdweb-internal-runtime", 1785 | "wasm-bindgen", 1786 | ] 1787 | 1788 | [[package]] 1789 | name = "stdweb-derive" 1790 | version = "0.5.3" 1791 | source = "registry+https://github.com/rust-lang/crates.io-index" 1792 | checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" 1793 | dependencies = [ 1794 | "proc-macro2", 1795 | "quote", 1796 | "serde 1.0.144", 1797 | "serde_derive", 1798 | "syn", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "stdweb-internal-macros" 1803 | version = "0.2.9" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" 1806 | dependencies = [ 1807 | "base-x", 1808 | "proc-macro2", 1809 | "quote", 1810 | "serde 1.0.144", 1811 | "serde_derive", 1812 | "serde_json", 1813 | "sha1", 1814 | "syn", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "stdweb-internal-runtime" 1819 | version = "0.1.5" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" 1822 | 1823 | [[package]] 1824 | name = "str-buf" 1825 | version = "1.0.6" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" 1828 | 1829 | [[package]] 1830 | name = "strsim" 1831 | version = "0.8.0" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1834 | 1835 | [[package]] 1836 | name = "strsim" 1837 | version = "0.9.3" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" 1840 | 1841 | [[package]] 1842 | name = "strsim" 1843 | version = "0.10.0" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1846 | 1847 | [[package]] 1848 | name = "syn" 1849 | version = "1.0.99" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 1852 | dependencies = [ 1853 | "proc-macro2", 1854 | "quote", 1855 | "unicode-ident", 1856 | ] 1857 | 1858 | [[package]] 1859 | name = "tabled" 1860 | version = "0.5.0" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "85fda0a52a50c85604747c6584cc79cfe6c7b6ee2349ffed082f965bdbef77ef" 1863 | dependencies = [ 1864 | "papergrid", 1865 | "tabled_derive", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "tabled_derive" 1870 | version = "0.2.0" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "a224735cbc8c30f06e52dc3891dc4b8eed07e5d4c8fb6f4cb6a839458e5a6465" 1873 | dependencies = [ 1874 | "proc-macro2", 1875 | "quote", 1876 | "syn", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "tempfile" 1881 | version = "3.3.0" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 1884 | dependencies = [ 1885 | "cfg-if 1.0.0", 1886 | "fastrand", 1887 | "libc", 1888 | "redox_syscall", 1889 | "remove_dir_all", 1890 | "winapi", 1891 | ] 1892 | 1893 | [[package]] 1894 | name = "term" 1895 | version = "0.7.0" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" 1898 | dependencies = [ 1899 | "dirs-next", 1900 | "rustversion", 1901 | "winapi", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "termcolor" 1906 | version = "1.1.3" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 1909 | dependencies = [ 1910 | "winapi-util", 1911 | ] 1912 | 1913 | [[package]] 1914 | name = "terminal_size" 1915 | version = "0.1.17" 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" 1917 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 1918 | dependencies = [ 1919 | "libc", 1920 | "winapi", 1921 | ] 1922 | 1923 | [[package]] 1924 | name = "textwrap" 1925 | version = "0.11.0" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1928 | dependencies = [ 1929 | "unicode-width", 1930 | ] 1931 | 1932 | [[package]] 1933 | name = "textwrap" 1934 | version = "0.15.0" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" 1937 | dependencies = [ 1938 | "terminal_size", 1939 | "unicode-width", 1940 | ] 1941 | 1942 | [[package]] 1943 | name = "thiserror" 1944 | version = "1.0.32" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" 1947 | dependencies = [ 1948 | "thiserror-impl", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "thiserror-impl" 1953 | version = "1.0.32" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" 1956 | dependencies = [ 1957 | "proc-macro2", 1958 | "quote", 1959 | "syn", 1960 | ] 1961 | 1962 | [[package]] 1963 | name = "thread_local" 1964 | version = "1.1.4" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 1967 | dependencies = [ 1968 | "once_cell", 1969 | ] 1970 | 1971 | [[package]] 1972 | name = "tiff" 1973 | version = "0.6.1" 1974 | source = "registry+https://github.com/rust-lang/crates.io-index" 1975 | checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" 1976 | dependencies = [ 1977 | "jpeg-decoder", 1978 | "miniz_oxide 0.4.4", 1979 | "weezl", 1980 | ] 1981 | 1982 | [[package]] 1983 | name = "time" 1984 | version = "0.1.44" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 1987 | dependencies = [ 1988 | "libc", 1989 | "wasi 0.10.0+wasi-snapshot-preview1", 1990 | "winapi", 1991 | ] 1992 | 1993 | [[package]] 1994 | name = "time" 1995 | version = "0.2.27" 1996 | source = "registry+https://github.com/rust-lang/crates.io-index" 1997 | checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" 1998 | dependencies = [ 1999 | "const_fn", 2000 | "libc", 2001 | "standback", 2002 | "stdweb", 2003 | "time-macros", 2004 | "version_check", 2005 | "winapi", 2006 | ] 2007 | 2008 | [[package]] 2009 | name = "time-macros" 2010 | version = "0.1.1" 2011 | source = "registry+https://github.com/rust-lang/crates.io-index" 2012 | checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" 2013 | dependencies = [ 2014 | "proc-macro-hack", 2015 | "time-macros-impl", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "time-macros-impl" 2020 | version = "0.1.2" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" 2023 | dependencies = [ 2024 | "proc-macro-hack", 2025 | "proc-macro2", 2026 | "quote", 2027 | "standback", 2028 | "syn", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "timer" 2033 | version = "0.2.0" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "31d42176308937165701f50638db1c31586f183f1aab416268216577aec7306b" 2036 | dependencies = [ 2037 | "chrono", 2038 | ] 2039 | 2040 | [[package]] 2041 | name = "tinyvec" 2042 | version = "1.6.0" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2045 | dependencies = [ 2046 | "tinyvec_macros", 2047 | ] 2048 | 2049 | [[package]] 2050 | name = "tinyvec_macros" 2051 | version = "0.1.0" 2052 | source = "registry+https://github.com/rust-lang/crates.io-index" 2053 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2054 | 2055 | [[package]] 2056 | name = "tokio" 2057 | version = "1.20.1" 2058 | source = "registry+https://github.com/rust-lang/crates.io-index" 2059 | checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" 2060 | dependencies = [ 2061 | "autocfg", 2062 | "bytes", 2063 | "libc", 2064 | "memchr", 2065 | "mio", 2066 | "num_cpus", 2067 | "once_cell", 2068 | "pin-project-lite", 2069 | "socket2", 2070 | "winapi", 2071 | ] 2072 | 2073 | [[package]] 2074 | name = "tokio-native-tls" 2075 | version = "0.3.0" 2076 | source = "registry+https://github.com/rust-lang/crates.io-index" 2077 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 2078 | dependencies = [ 2079 | "native-tls", 2080 | "tokio", 2081 | ] 2082 | 2083 | [[package]] 2084 | name = "tokio-util" 2085 | version = "0.7.3" 2086 | source = "registry+https://github.com/rust-lang/crates.io-index" 2087 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 2088 | dependencies = [ 2089 | "bytes", 2090 | "futures-core", 2091 | "futures-sink", 2092 | "pin-project-lite", 2093 | "tokio", 2094 | "tracing", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "toml" 2099 | version = "0.5.9" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 2102 | dependencies = [ 2103 | "serde 1.0.144", 2104 | ] 2105 | 2106 | [[package]] 2107 | name = "tower-service" 2108 | version = "0.3.2" 2109 | source = "registry+https://github.com/rust-lang/crates.io-index" 2110 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2111 | 2112 | [[package]] 2113 | name = "tracing" 2114 | version = "0.1.36" 2115 | source = "registry+https://github.com/rust-lang/crates.io-index" 2116 | checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" 2117 | dependencies = [ 2118 | "cfg-if 1.0.0", 2119 | "pin-project-lite", 2120 | "tracing-core", 2121 | ] 2122 | 2123 | [[package]] 2124 | name = "tracing-core" 2125 | version = "0.1.29" 2126 | source = "registry+https://github.com/rust-lang/crates.io-index" 2127 | checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" 2128 | dependencies = [ 2129 | "once_cell", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "try-lock" 2134 | version = "0.2.3" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 2137 | 2138 | [[package]] 2139 | name = "tuikit" 2140 | version = "0.4.6" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "667c8e002675e76d98358d8869021793a472d28e3a50fbd750284a1d211abd09" 2143 | dependencies = [ 2144 | "bitflags", 2145 | "lazy_static", 2146 | "log", 2147 | "nix 0.24.2", 2148 | "term", 2149 | "unicode-width", 2150 | ] 2151 | 2152 | [[package]] 2153 | name = "unicase" 2154 | version = "2.6.0" 2155 | source = "registry+https://github.com/rust-lang/crates.io-index" 2156 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 2157 | dependencies = [ 2158 | "version_check", 2159 | ] 2160 | 2161 | [[package]] 2162 | name = "unicode-bidi" 2163 | version = "0.3.8" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 2166 | 2167 | [[package]] 2168 | name = "unicode-ident" 2169 | version = "1.0.3" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 2172 | 2173 | [[package]] 2174 | name = "unicode-normalization" 2175 | version = "0.1.21" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 2178 | dependencies = [ 2179 | "tinyvec", 2180 | ] 2181 | 2182 | [[package]] 2183 | name = "unicode-width" 2184 | version = "0.1.9" 2185 | source = "registry+https://github.com/rust-lang/crates.io-index" 2186 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 2187 | 2188 | [[package]] 2189 | name = "url" 2190 | version = "2.2.2" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 2193 | dependencies = [ 2194 | "form_urlencoded", 2195 | "idna", 2196 | "matches", 2197 | "percent-encoding", 2198 | ] 2199 | 2200 | [[package]] 2201 | name = "utf8parse" 2202 | version = "0.2.0" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" 2205 | 2206 | [[package]] 2207 | name = "vcpkg" 2208 | version = "0.2.15" 2209 | source = "registry+https://github.com/rust-lang/crates.io-index" 2210 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2211 | 2212 | [[package]] 2213 | name = "vec_map" 2214 | version = "0.8.2" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 2217 | 2218 | [[package]] 2219 | name = "version_check" 2220 | version = "0.9.4" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2223 | 2224 | [[package]] 2225 | name = "vte" 2226 | version = "0.9.0" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "6e7745610024d50ab1ebfa41f8f8ee361c567f7ab51032f93cc1cc4cbf0c547a" 2229 | dependencies = [ 2230 | "arrayvec", 2231 | "utf8parse", 2232 | "vte_generate_state_changes", 2233 | ] 2234 | 2235 | [[package]] 2236 | name = "vte_generate_state_changes" 2237 | version = "0.1.1" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" 2240 | dependencies = [ 2241 | "proc-macro2", 2242 | "quote", 2243 | ] 2244 | 2245 | [[package]] 2246 | name = "want" 2247 | version = "0.3.0" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2250 | dependencies = [ 2251 | "log", 2252 | "try-lock", 2253 | ] 2254 | 2255 | [[package]] 2256 | name = "wasi" 2257 | version = "0.10.0+wasi-snapshot-preview1" 2258 | source = "registry+https://github.com/rust-lang/crates.io-index" 2259 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 2260 | 2261 | [[package]] 2262 | name = "wasi" 2263 | version = "0.11.0+wasi-snapshot-preview1" 2264 | source = "registry+https://github.com/rust-lang/crates.io-index" 2265 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2266 | 2267 | [[package]] 2268 | name = "wasm-bindgen" 2269 | version = "0.2.82" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" 2272 | dependencies = [ 2273 | "cfg-if 1.0.0", 2274 | "wasm-bindgen-macro", 2275 | ] 2276 | 2277 | [[package]] 2278 | name = "wasm-bindgen-backend" 2279 | version = "0.2.82" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" 2282 | dependencies = [ 2283 | "bumpalo", 2284 | "log", 2285 | "once_cell", 2286 | "proc-macro2", 2287 | "quote", 2288 | "syn", 2289 | "wasm-bindgen-shared", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "wasm-bindgen-futures" 2294 | version = "0.4.32" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" 2297 | dependencies = [ 2298 | "cfg-if 1.0.0", 2299 | "js-sys", 2300 | "wasm-bindgen", 2301 | "web-sys", 2302 | ] 2303 | 2304 | [[package]] 2305 | name = "wasm-bindgen-macro" 2306 | version = "0.2.82" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" 2309 | dependencies = [ 2310 | "quote", 2311 | "wasm-bindgen-macro-support", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "wasm-bindgen-macro-support" 2316 | version = "0.2.82" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" 2319 | dependencies = [ 2320 | "proc-macro2", 2321 | "quote", 2322 | "syn", 2323 | "wasm-bindgen-backend", 2324 | "wasm-bindgen-shared", 2325 | ] 2326 | 2327 | [[package]] 2328 | name = "wasm-bindgen-shared" 2329 | version = "0.2.82" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" 2332 | 2333 | [[package]] 2334 | name = "web-sys" 2335 | version = "0.3.59" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" 2338 | dependencies = [ 2339 | "js-sys", 2340 | "wasm-bindgen", 2341 | ] 2342 | 2343 | [[package]] 2344 | name = "weezl" 2345 | version = "0.1.7" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" 2348 | 2349 | [[package]] 2350 | name = "winapi" 2351 | version = "0.3.9" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2354 | dependencies = [ 2355 | "winapi-i686-pc-windows-gnu", 2356 | "winapi-x86_64-pc-windows-gnu", 2357 | ] 2358 | 2359 | [[package]] 2360 | name = "winapi-i686-pc-windows-gnu" 2361 | version = "0.4.0" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2364 | 2365 | [[package]] 2366 | name = "winapi-util" 2367 | version = "0.1.5" 2368 | source = "registry+https://github.com/rust-lang/crates.io-index" 2369 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2370 | dependencies = [ 2371 | "winapi", 2372 | ] 2373 | 2374 | [[package]] 2375 | name = "winapi-wsapoll" 2376 | version = "0.1.1" 2377 | source = "registry+https://github.com/rust-lang/crates.io-index" 2378 | checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" 2379 | dependencies = [ 2380 | "winapi", 2381 | ] 2382 | 2383 | [[package]] 2384 | name = "winapi-x86_64-pc-windows-gnu" 2385 | version = "0.4.0" 2386 | source = "registry+https://github.com/rust-lang/crates.io-index" 2387 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2388 | 2389 | [[package]] 2390 | name = "windows-sys" 2391 | version = "0.36.1" 2392 | source = "registry+https://github.com/rust-lang/crates.io-index" 2393 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 2394 | dependencies = [ 2395 | "windows_aarch64_msvc", 2396 | "windows_i686_gnu", 2397 | "windows_i686_msvc", 2398 | "windows_x86_64_gnu", 2399 | "windows_x86_64_msvc", 2400 | ] 2401 | 2402 | [[package]] 2403 | name = "windows_aarch64_msvc" 2404 | version = "0.36.1" 2405 | source = "registry+https://github.com/rust-lang/crates.io-index" 2406 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 2407 | 2408 | [[package]] 2409 | name = "windows_i686_gnu" 2410 | version = "0.36.1" 2411 | source = "registry+https://github.com/rust-lang/crates.io-index" 2412 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 2413 | 2414 | [[package]] 2415 | name = "windows_i686_msvc" 2416 | version = "0.36.1" 2417 | source = "registry+https://github.com/rust-lang/crates.io-index" 2418 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 2419 | 2420 | [[package]] 2421 | name = "windows_x86_64_gnu" 2422 | version = "0.36.1" 2423 | source = "registry+https://github.com/rust-lang/crates.io-index" 2424 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 2425 | 2426 | [[package]] 2427 | name = "windows_x86_64_msvc" 2428 | version = "0.36.1" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 2431 | 2432 | [[package]] 2433 | name = "winreg" 2434 | version = "0.10.1" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 2437 | dependencies = [ 2438 | "winapi", 2439 | ] 2440 | 2441 | [[package]] 2442 | name = "x11rb" 2443 | version = "0.9.0" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a" 2446 | dependencies = [ 2447 | "gethostname", 2448 | "nix 0.22.3", 2449 | "winapi", 2450 | "winapi-wsapoll", 2451 | ] 2452 | 2453 | [[package]] 2454 | name = "yaml-rust" 2455 | version = "0.4.5" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" 2458 | dependencies = [ 2459 | "linked-hash-map", 2460 | ] 2461 | --------------------------------------------------------------------------------