A simple CPU rendered GUI IDE experience.
-rw-r--r--Cargo.toml1
-rw-r--r--fail.pngbin0 -> 31212 bytes
-rw-r--r--flake.lock82
-rw-r--r--flake.nix83
-rw-r--r--src/bar.rs12
-rw-r--r--src/com.rs62
-rw-r--r--src/commands.rs163
-rw-r--r--src/edi.rs20
-rw-r--r--src/edi/st.rs28
-rw-r--r--src/main.rs3
-rw-r--r--src/rnd.rs57
-rw-r--r--test525
12 files changed, 1020 insertions, 16 deletions
diff --git a/Cargo.toml b/Cargo.toml
index b59988a..daa7273 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -67,6 +67,7 @@ imara-diff = "0.2.0"
vecto = "0.1.1"
rangemap = { version = "1.7.1", features = ["const_fn", "nightly", "serde1"] }
itern = "0.1.1"
+png = "0.18.0"
[profile.dev.package]
rust-analyzer.opt-level = 3
diff --git a/fail.png b/fail.png
new file mode 100644
index 0000000..23f93ff
--- /dev/null
+++ b/fail.png
Binary files differ
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..4c0ec34
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,82 @@
+{
+ "nodes": {
+ "flake-utils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1769740369,
+ "narHash": "sha256-xKPyJoMoXfXpDM5DFDZDsi9PHArf2k5BJjvReYXoFpM=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "6308c3b21396534d8aaeac46179c14c439a89b8a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs",
+ "rust-overlay": "rust-overlay"
+ }
+ },
+ "rust-overlay": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1769915446,
+ "narHash": "sha256-f1F/umtX3ZD7fF9DHSloVHc0mnAT0ry0YK2jI/6E0aI=",
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "rev": "bc00300f010275e46feb3c3974df6587ff7b7808",
+ "type": "github"
+ },
+ "original": {
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "type": "github"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..dc427ab
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,83 @@
+{
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
+ flake-utils.url = "github:numtide/flake-utils";
+ rust-overlay = {
+ url = "github:oxalica/rust-overlay";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ };
+
+ outputs = inputs @ { self, nixpkgs, flake-utils, rust-overlay, ... }:
+ flake-utils.lib.eachDefaultSystem (
+ system: let
+ overlays = [ (import rust-overlay) ];
+ pkgs = import nixpkgs { inherit system overlays; };
+ in {
+ devShells.default = with pkgs; mkShell rec {
+ buildInputs = [
+ (rust-bin.nightly.latest.minimal.override {
+ extensions = [ "clippy" "rust-analyzer" "rust-docs" "rust-src" "miri" ];
+ })
+ # We use nightly rustfmt features.
+ (rust-bin.selectLatestNightlyWith (toolchain: toolchain.rustfmt))
+
+ # Vulkan dependencies
+ shaderc
+ spirv-tools
+ vulkan-loader
+ vulkan-tools
+ vulkan-tools-lunarg
+ vulkan-validation-layers
+ vulkan-extension-layer
+
+ # winit dependencies
+ libxkbcommon
+ wayland
+ xorg.libX11
+ xorg.libXcursor
+ xorg.libXi
+ xorg.libXrandr
+ SDL2
+
+ clang
+ libclang
+ glibc.dev
+
+ valgrind
+ gdb
+ ];
+
+ LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs;
+ SHADERC_LIB_DIR = lib.makeLibraryPath [ shaderc ];
+ VK_LAYER_PATH = "${vulkan-validation-layers}/share/vulkan/explicit_layer.d";
+ };
+ devShells.CI = with pkgs; mkShell rec {
+ buildInputs = [
+ (rust-bin.stable.latest.minimal.override {
+ extensions = [ "clippy" ];
+ # Windows CI unfortunately needs to cross-compile from within WSL because Nix doesn't
+ # work on Windows.
+ targets = [ "x86_64-pc-windows-msvc" ];
+ })
+ # We use nightly rustfmt features.
+ (rust-bin.selectLatestNightlyWith (toolchain: toolchain.rustfmt))
+
+ # Vulkan dependencies
+ shaderc
+
+ # winit dependencies
+ libxkbcommon
+ wayland
+ xorg.libX11
+ xorg.libXcursor
+ xorg.libXi
+ xorg.libXrandr
+ ];
+
+ LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs;
+ SHADERC_LIB_DIR = lib.makeLibraryPath [ shaderc ];
+ };
+ }
+ );
+}
diff --git a/src/bar.rs b/src/bar.rs
index 93ee057..d9400a6 100644
--- a/src/bar.rs
+++ b/src/bar.rs
@@ -97,6 +97,18 @@ impl Bar {
}
});
}
+ State::Command(x) => {
+ ":".chars()
+ .zip(repeat(Style::BOLD | Style::ITALIC))
+ .chain(s(&x.tedit.rope.to_string()))
+ .zip(row)
+ .for_each(|((x, z), y)| {
+ *y = Cell {
+ letter: Some(x),
+ style: Style { flags: z, ..y.style },
+ }
+ });
+ }
State::Symbols(Rq {
result: Some(Symbols { tedit, .. }),
request,
diff --git a/src/com.rs b/src/com.rs
index e157787..78c98d1 100644
--- a/src/com.rs
+++ b/src/com.rs
@@ -48,11 +48,71 @@ impl<'a> Key<'a> for &'a CompletionItem {
}
}
+
+pub fn score<'a, T: 'a + ?Sized>(
+ x: impl Iterator<Item = &'a T>,
+ f: impl Fn(&'a T) -> &'a str,
+ filter: &'_ str,
+) -> Vec<(u32, &'a T, Vec<u32>)> {
+ #[thread_local]
+ static mut MATCHER: LazyLock<nucleo::Matcher> =
+ LazyLock::new(|| nucleo::Matcher::new(nucleo::Config::DEFAULT));
+
+ let p = nucleo::pattern::Pattern::parse(
+ filter,
+ nucleo::pattern::CaseMatching::Smart,
+ nucleo::pattern::Normalization::Smart,
+ );
+ let mut v = x
+ .map(move |y| {
+ let mut utf32 = vec![];
+ // std::env::args().nth(1).unwrap().as_bytes().fi .fold(0, |acc, x| acc * 10 + x - b'0');
+ let hay = f(y);
+ let mut indices = vec![];
+ let score = p
+ .indices(
+ nucleo::Utf32Str::new(hay, &mut utf32),
+ unsafe { &mut *MATCHER },
+ &mut indices,
+ )
+ .unwrap_or(0);
+ indices.sort_unstable();
+ indices.dedup();
+
+ (score, y, indices)
+ })
+ .collect::<Vec<_>>();
+ // std::fs::write(
+ // "com",
+ // v.iter().map(|x| x.1.label.clone() + "\n").collect::<String>(),
+ // );
+ v.sort_by_key(|x| Reverse(x.0));
+ v
+}
+
+fn com_as_str(y: &CompletionItem) -> &str {
+ y.filter_text.as_deref().unwrap_or(&y.label)
+}
fn score_c<'a>(
x: impl Iterator<Item = &'a CompletionItem>,
filter: &'_ str,
) -> Vec<(u32, &'a CompletionItem, Vec<u32>)> {
- score(x, filter)
+ score(x, com_as_str, filter)
+}
+
+pub fn filter<'a, T: 'a + ?Sized>(
+ i: impl Iterator<Item = &'a T>,
+ f: impl Fn(&'a T) -> &'a str,
+ filter: &'_ str,
+) -> impl Iterator<Item = &'a T> {
+ i.filter(move |y| {
+ filter.is_empty()
+ || f(y).chars().any(|x| filter.chars().contains(&x))
+ // .collect::<HashSet<_>>()
+ // .intersection(&filter.chars().collect())
+ // .count()
+ // > 0
+ })
}
fn filter_c<'a>(
diff --git a/src/commands.rs b/src/commands.rs
new file mode 100644
index 0000000..4f19b01
--- /dev/null
+++ b/src/commands.rs
@@ -0,0 +1,163 @@
+use std::iter::repeat;
+use std::path::Path;
+
+use Default::default;
+use dsb::Cell;
+use dsb::cell::Style;
+use lsp_types::*;
+
+use crate::FG;
+use crate::com::{back, filter, next, score};
+use crate::text::{TextArea, col, color_, set_a};
+
+const COMMANDS: [(&str, &str); 3] = [
+ ("w", "Write / Save"),
+ ("q", "Quit"),
+ ("exit-vim-mode", "Go back to default editting mode"),
+];
+
+#[derive(Debug, Default)]
+pub struct Commands {
+ pub tedit: TextArea,
+ pub selection: usize,
+ pub vo: usize,
+}
+
+const N: usize = 30;
+impl Commands {
+ fn f(&self) -> String {
+ self.tedit.rope.to_string()
+ }
+ pub fn next(&mut self) {
+ let n = filter_c(self, &self.f()).count();
+ // coz its bottom up
+ back::<N>(n, &mut self.selection, &mut self.vo);
+ }
+
+ pub fn sel(&self) -> &str {
+ let f = self.f();
+ score_c(filter_c(self, &f), &f)[self.selection].1
+ }
+
+ pub fn back(&mut self) {
+ let n = filter_c(self, &self.f()).count();
+ next::<N>(n, &mut self.selection, &mut self.vo);
+ }
+ pub fn cells(&self, c: usize, ws: &Path) -> Vec<Cell> {
+ let f = self.f();
+ let mut out = vec![];
+ let v = score_c(filter_c(self, &f), &f);
+ let vlen = v.len();
+ let i = v.into_iter().zip(0..vlen).skip(self.vo).take(N).rev();
+
+ // let Some((s, x)) = i.next() else {
+ // return vec![];
+ // };
+
+ // let mut q = Dq::<_, 13>::new((s, x));
+ // for (s, x) in i {
+ // if q.first().0 <= s {
+ // q.push_front((s, x));
+ // }
+ // }
+
+ // fuzzy_aho_corasick::FuzzyAhoCorasickBuilder::new()
+ // .fuzzy(
+ // FuzzyLimits::new()
+ // .insertions(20)
+ // .deletions(2)
+ // .edits(4)
+ // .substitutions(5)
+ // .swaps(3),
+ // .penalties(FuzzyPenalties {
+ // )
+ // insertion: 0.0,
+ // deletion: 1.0,
+ // substitution: 0.5,
+ // swap: 0.5,
+ // })
+ // .build(
+ // y.iter().map(|x| x.filter_text.as_deref().unwrap_or(&x.label)),
+ // )
+ // .search(filter, 0.25)
+ // .into_iter()
+ // .map(|x| &y[x.pattern_index])
+ // // .take(13);
+ // // for x in y
+ // // .iter()
+ // // .filter(|x| {
+ // // x.filter_text
+ // // .as_deref()
+ // // .unwrap_or(&x.label)
+ // // .starts_with(filter)
+ // // })
+ // .take(13)
+ i.for_each(|((_, x, indices), i)| {
+ r(x, ws, c, i == self.selection, &indices, &mut out)
+ });
+
+ out
+ }
+}
+fn score_c<'a>(
+ x: impl Iterator<Item = &'a str>,
+ filter: &'_ str,
+) -> Vec<(u32, &'a str, Vec<u32>)> {
+ score(x, std::convert::identity, filter)
+}
+
+fn filter_c<'a>(
+ completion: &'a Commands,
+ f: &'_ str,
+) -> impl Iterator<Item = &'a str> {
+ filter(COMMANDS.into_iter().map(|(x, _)| x), std::convert::identity, f)
+}
+fn sym_as_str(x: &str) -> &str {
+ &x
+}
+fn charc(c: &str) -> usize {
+ c.chars().count()
+}
+#[implicit_fn::implicit_fn]
+fn r(
+ x: &str,
+ workspace: &Path,
+ c: usize,
+ selected: bool,
+ indices: &[u32],
+ to: &mut Vec<Cell>,
+) {
+ let bg = if selected { col!("#262d3b") } else { col!("#1c212b") };
+
+ let ds: Style = Style::new(FG, bg);
+ let d: Cell = Cell { letter: None, style: ds };
+ let mut b = vec![d; c];
+ let (bgt, col, ty) = (col!("#FFFFFF"), col!("#ACACAC"), "");
+ b.iter_mut().zip(ty.chars()).for_each(|(x, c)| {
+ *x = (Style::new(col, bgt) | Style::BOLD).basic(c)
+ });
+ let i = &mut b[2..];
+ let qualifier = COMMANDS.iter().find(|y| y.0 == x).unwrap().1.chars();
+ let left = i.len() as i32
+ - (charc(&x) as i32 + qualifier.clone().count() as i32)
+ - 3;
+
+ i.iter_mut()
+ .zip(
+ x.chars().chain([' ']).map(|x| ds.basic(x)).zip(0..).chain(
+ qualifier
+ .map(|x| {
+ Style { bg, fg: color_("#858685"), ..default() }
+ .basic(x)
+ })
+ .zip(repeat(u32::MAX)),
+ ),
+ )
+ .for_each(|(a, (b, i))| {
+ *a = b;
+ if indices.contains(&i) {
+ a.style |= (Style::BOLD, color_("#ffcc66"));
+ }
+ });
+ to.extend(b);
+}
diff --git a/src/edi.rs b/src/edi.rs
index 67a0f3d..579994a 100644
--- a/src/edi.rs
+++ b/src/edi.rs
@@ -1013,6 +1013,18 @@ impl Editor {
};
x.back();
}
+ Some(Do::CommandNext) => {
+ let State::Command(x) = &mut self.state else {
+ unreachable!()
+ };
+ x.next();
+ }
+ Some(Do::CommandPrev) => {
+ let State::Command(x) = &mut self.state else {
+ unreachable!()
+ };
+ x.back();
+ }
Some(Do::SymbolsSelect) => {
let State::Symbols(Rq { result: Some(x), .. }) =
&self.state
@@ -1642,6 +1654,14 @@ impl Editor {
let position = self.text.line_to_char(y);
self.text.cursor.add(position + x, &self.text.rope);
}
+ Some(Do::ProcessCommand(text)) => match text.sel() {
+ "w" => println!("fake save"),
+ "q" => return ControlFlow::Break(()),
+ "exit-vim-mode" => {
+ self.state = State::Default;
+ }
+ _ => {}
+ },
None => {}
}
ControlFlow::Continue(())
diff --git a/src/edi/st.rs b/src/edi/st.rs
index e68da23..d7e60ff 100644
--- a/src/edi/st.rs
+++ b/src/edi/st.rs
@@ -7,8 +7,10 @@ use regex::Regex;
use winit::event::MouseButton;
use winit::keyboard::{Key, NamedKey, SmolStr};
-use crate::lsp::{AQErr, Rq, RqS};
-use crate::sym::{Symbols, SymbolsList};
+use crate::commands::Commands;
+use crate::edi::handle2;
+use crate::lsp::{AQErr, RequestError, Rq, RqS};
+use crate::sym::{Symbols, SymbolsType};
use crate::text::TextArea;
use crate::{
BoolRequest, CLICKING, InputRequest, act, alt, ctrl, handle, shift,
@@ -34,13 +36,35 @@ rust_fsm::state_machine! {
pub(crate) State => #[derive(Debug)] pub(crate) Action => #[derive(Debug)] pub(crate) Do
Dead => K(Key => _) => Dead,
+Normal => {
+ K(Key::Character(x) if x == "i") => Insert,
+ K(Key::Character(x) if x == ":") => Command (Commands => default()),
K(Key::Named(Space)) => SpaceMode ( SpaceModes => default() ),
+ K(_) => _,
+ M(_) => _,
+ C(_) => _,
+},
+Insert => {
+ K(Key::Named(Escape)) => Normal,
+ K(k) => _ [Edit],
+ K(_) => _,
+ M(_) => _,
+ C(_) => _,
+},
+Command(_) => K(Key::Named(Escape)) => Normal,
+Command(t) => K(Key::Named(Enter)) => Normal [ProcessCommand(Commands => t)],
+Command(t) => K(Key::Named(Tab) if shift()) => _ [CommandPrev],
+Command(t) => K(Key::Named(Tab)) => _ [CommandNext],
+Command(mut t) => K(k) => Command({ handle2(&k, &mut t.tedit, None); t }),
+Command(t) => C(_) => _,
+Command(t) => K(_) => _,
SpaceMode(_) => K(Key::Named(Escape)) => Normal,
SpaceMode(t) => C(_) => _,
SpaceMode(t) => K(_) => _,
Default => {
+ K(Key::Character(x) if x == "n" && ctrl()) => Normal,
K(Key::Character(x) if x == "s" && ctrl()) => Save [Save],
K(Key::Character(x) if x == "q" && ctrl()) => Dead [Quit],
K(Key::Character(x) if x == "v" && ctrl()) => _ [Paste],
diff --git a/src/main.rs b/src/main.rs
index fe94363..1311b32 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -43,6 +43,9 @@ mod act;
mod edi;
mod git;
mod meta;
+// mod new;
+// mod new;
+mod commands;
mod rnd;
mod sym;
mod trm;
diff --git a/src/rnd.rs b/src/rnd.rs
index 3a976f8..bbf8d67 100644
--- a/src/rnd.rs
+++ b/src/rnd.rs
@@ -698,6 +698,36 @@ pub fn render(
h as _,
BORDER,
);
+ },
+ State::Command(x) => 'out: {
+ let ws = ed.workspace.as_deref().unwrap();
+ let c = x.cells(50, ws);
+ // let (_x, _y) = text.cursor_visual();
+ let _x = 0;
+ let _y = r - 1;
+ let Ok((is_above, left, top, w, mut h)) = place_around(
+ (_x, _y),
+ i.copy(),
+ &c,
+ 50,
+ ppem,
+ ls,
+ 0.,
+ 0.,
+ 0.,
+ ) else {
+ println!("ra?");
+ break 'out;
+ };
+ i.r#box(
+ (
+ left.saturating_sub(1) as _,
+ top.saturating_sub(1) as _,
+ ),
+ w as _,
+ h as _,
+ BORDER,
+ );
}
_ => {}
}
@@ -887,6 +917,9 @@ pub fn render(
draw_at(x, y, &image);
}
+ if matches!(ed.state, State::Default | State::Selection(_) | State::Insert) {
+ draw_at(x, y, &cursor);
+ }
window.pre_present_notify();
let buffer = surface.buffer_mut().unwrap();
let x = unsafe {
@@ -903,17 +936,15 @@ pub fn render(
}
pub fn simplify_path(x: &str) -> String {
- static DEP: LazyLock<Regex> = LazyLock::new(|| {
- Regex::new(r"\.cargo\/git\/checkouts\/(?<name>[^/]+)\-[a-f0-9]+\/[a-f0-9]+").unwrap()
- });
- static DEP2: LazyLock<Regex> = LazyLock::new(|| {
- Regex::new(r"\.cargo\/registry\/src/index.crates.io-[0-9a-f]+/(?<name>[^/]+)\-(?<version>[0-9]+\.[0-9]+\.[0-9]+)").unwrap()
- });
- static RUST_SRC: LazyLock<Regex> = LazyLock::new(|| {
- Regex::new(r".rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library").unwrap()
- });
- let x = x.replace(env!("HOME"), " ");
- [(&*RUST_SRC, " "), (&*DEP, " /$name"), (&*DEP2, " /$name")]
- .into_iter()
- .fold(x, |acc, (r, repl)| r.replace(&acc, repl).into_owned())
+ static DEP: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\.cargo\/git\/checkouts\/(?<name>[^/]+)\-[a-f0-9]+\/[a-f0-9]+").unwrap());
+ static DEP2: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\.cargo\/registry\/src/index.crates.io-[0-9a-f]+/(?<name>[^/]+)\-(?<version>[0-9]+\.[0-9]+\.[0-9]+)").unwrap());
+ static RUST_SRC: LazyLock<Regex> = LazyLock::new(|| Regex::new(r".rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library").unwrap());
+ let x = x.replace(env!("HOME"), " ");
+ [
+ (&*RUST_SRC, " "),
+ (&*DEP, " /$name"),
+ (&*DEP2, " /$name"),
+ ].into_iter().fold(x, |acc, (r, repl)| {
+ r.replace(&acc, repl).into_owned()
+ })
}
diff --git a/test b/test
new file mode 100644
index 0000000..df7c913
--- /dev/null
+++ b/test
@@ -0,0 +1,525 @@
+gracilaria v0.1.0 (/run/media/Programming/CodingShit/Rust/Act5Scratch/gracilaria)
+├── amap v0.1.4 (proc-macro)
+│ ├── itertools v0.14.0
+│ │ └── either v1.15.0
+│ ├── proc-macro2 v1.0.106
+│ │ └── unicode-ident v1.0.22
+│ ├── quote v1.0.44
+│ │ └── proc-macro2 v1.0.106 (*)
+│ └── syn v2.0.114
+│ ├── proc-macro2 v1.0.106 (*)
+│ ├── quote v1.0.44 (*)
+│ └── unicode-ident v1.0.22
+├── anyhow v1.0.100
+├── arc-swap v1.8.0
+│ └── rustversion v1.0.22 (proc-macro)
+├── array_chunks v1.0.0
+├── atools v0.1.12
+├── bendy v0.6.1
+│ ├── rustversion v1.0.22 (proc-macro)
+│ ├── serde v1.0.228
+│ │ ├── serde_core v1.0.228
+│ │ └── serde_derive v1.0.228 (proc-macro)
+│ ├── serde_bytes v0.11.19
+│ │ └── serde_core v1.0.228
+│ └── thiserror v2.0.18
+│ └── thiserror-impl v2.0.18 (proc-macro)
+├── car v0.1.3 (proc-macro)
+│ ├── proc-macro2 v1.0.106 (*)
+│ ├── quote v1.0.44 (*)
+│ └── syn v2.0.114 (*)
+├── clipp v0.1.1
+├── crossbeam v0.8.4
+│ ├── crossbeam-channel v0.5.15
+│ │ └── crossbeam-utils v0.8.21
+│ ├── crossbeam-deque v0.8.6
+│ │ ├── crossbeam-epoch v0.9.18
+│ │ └── crossbeam-utils v0.8.21
+│ ├── crossbeam-epoch v0.9.18 (*)
+│ ├── crossbeam-queue v0.3.12
+│ │ └── crossbeam-utils v0.8.21
+│ └── crossbeam-utils v0.8.21
+├── diff-match-patch-rs v0.5.1 (https://git.bendn.org/dmp#8d727531)
+│ ├── percent-encoding v2.3.2
+│ ├── serde v1.0.228 (*)
+│ └── serde_derive v1.0.228 (proc-macro) (*)
+├── dsb v0.1.0 (https://git.bendn.org/dsb#02744132)
+│ ├── array_chunks v1.0.0
+│ ├── atools v0.1.12 (https://git.bendn.org/atools#fd0a7b17)
+│ ├── car v0.1.3 (proc-macro) (*)
+│ ├── fimg v0.4.51 (https://git.bendn.org/fimg#cf01f538)
+│ │ ├── array_chunks v1.0.0
+│ │ ├── atools v0.1.12
+│ │ ├── car v0.1.3 (proc-macro) (*)
+│ │ ├── clipline v0.4.0
+│ │ ├── fer v0.1.1
+│ │ ├── hinted v1.0.0
+│ │ ├── libc v0.2.180
+│ │ ├── lower v0.2.1
+│ │ ├── mattr v0.0.2
+│ │ ├── png v0.17.16
+│ │ ├── qwant v1.0.3
+│ │ ├── umath v0.0.7
+│ │ └── vecto v0.1.1
+│ ├── implicit-fn v0.1.0 (proc-macro)
+│ │ ├── proc-macro2 v1.0.106 (*)
+│ │ ├── quote v1.0.44 (*)
+│ │ └── syn v2.0.114 (*)
+│ ├── itertools v0.14.0 (*)
+│ ├── lower v0.2.1 (*)
+│ ├── lru-cache v0.1.2
+│ │ └── linked-hash-map v0.5.6
+│ ├── serde v1.0.228 (*)
+│ ├── swash v0.2.6
+│ │ ├── skrifa v0.37.0
+│ │ ├── yazi v0.2.1
+│ │ └── zeno v0.3.3
+│ ├── swizzle v0.1.0
+│ └── umath v0.0.7
+├── env_logger v0.11.8
+│ ├── anstream v0.6.21
+│ │ ├── anstyle v1.0.13
+│ │ ├── anstyle-parse v0.2.7
+│ │ ├── anstyle-query v1.1.5
+│ │ ├── colorchoice v1.0.4
+│ │ ├── is_terminal_polyfill v1.70.2
+│ │ └── utf8parse v0.2.2
+│ ├── anstyle v1.0.13
+│ ├── env_filter v0.1.4
+│ │ ├── log v0.4.29
+│ │ └── regex v1.12.2
+│ ├── jiff v0.2.18
+│ └── log v0.4.29
+├── fimg v0.4.51 (https://git.bendn.org/fimg#cf01f538) (*)
+├── helix-core v25.7.1 (https://git.bendn.org/helix#bcfbb875)
+│ ├── anyhow v1.0.100
+│ ├── arc-swap v1.8.0 (*)
+│ ├── bitflags v2.10.0
+│ ├── chrono v0.4.43
+│ │ └── num-traits v0.2.19
+│ │ [build-dependencies]
+│ ├── encoding_rs v0.8.35
+│ │ └── cfg-if v1.0.4
+│ ├── foldhash v0.2.0
+│ ├── globset v0.4.16
+│ │ ├── aho-corasick v1.1.4
+│ │ ├── bstr v1.12.1
+│ │ ├── log v0.4.29
+│ │ ├── regex-automata v0.4.13
+│ │ └── regex-syntax v0.8.8
+│ ├── helix-loader v25.7.1 (https://git.bendn.org/helix#bcfbb875)
+│ │ ├── anyhow v1.0.100
+│ │ ├── cc v1.2.55
+│ │ ├── etcetera v0.10.0
+│ │ ├── helix-stdx v25.7.1 (https://git.bendn.org/helix#bcfbb875)
+│ │ ├── log v0.4.29
+│ │ ├── once_cell v1.21.3
+│ │ ├── serde v1.0.228 (*)
+│ │ ├── tempfile v3.24.0
+│ │ ├── threadpool v1.8.1
+│ │ ├── toml v0.9.11+spec-1.1.0
+│ │ └── tree-house v0.3.0
+│ ├── helix-parsec v25.7.1 (https://git.bendn.org/helix#bcfbb875)
+│ ├── helix-stdx v25.7.1 (https://git.bendn.org/helix#bcfbb875) (*)
+│ ├── imara-diff v0.2.0
+│ │ ├── hashbrown v0.15.5
+│ │ └── memchr v2.7.6
+│ ├── log v0.4.29
+│ ├── nucleo v0.5.0
+│ │ ├── nucleo-matcher v0.3.1
+│ │ ├── parking_lot v0.12.5
+│ │ └── rayon v1.11.0
+│ ├── once_cell v1.21.3
+│ ├── parking_lot v0.12.5 (*)
+│ ├── regex v1.12.2 (*)
+│ ├── regex-cursor v0.1.5
+│ │ ├── log v0.4.29
+│ │ ├── memchr v2.7.6
+│ │ ├── regex-automata v0.4.13 (*)
+│ │ ├── regex-syntax v0.8.8
+│ │ └── ropey v1.6.1
+│ ├── ropey v1.6.1 (*)
+│ ├── serde v1.0.228 (*)
+│ ├── serde_json v1.0.149
+│ │ ├── indexmap v2.13.0
+│ │ ├── itoa v1.0.17
+│ │ ├── memchr v2.7.6
+│ │ ├── serde_core v1.0.228
+│ │ └── zmij v1.0.19
+│ ├── slotmap v1.1.1
+│ │ [build-dependencies]
+│ │ └── version_check v0.9.5
+│ ├── smallvec v1.15.1
+│ ├── smartstring v1.0.1
+│ │ └── static_assertions v1.1.0
+│ │ [build-dependencies]
+│ │ ├── autocfg v1.5.0
+│ │ └── version_check v0.9.5
+│ ├── textwrap v0.16.2
+│ │ ├── smawk v0.3.2
+│ │ ├── unicode-linebreak v0.1.5
+│ │ └── unicode-width v0.2.2
+│ ├── toml v0.9.11+spec-1.1.0 (*)
+│ ├── tree-house v0.3.0 (*)
+│ ├── unicode-general-category v1.1.0
+│ ├── unicode-segmentation v1.12.0
+│ ├── unicode-width v0.1.12
+│ └── url v2.5.8
+│ ├── form_urlencoded v1.2.2
+│ ├── idna v1.1.0
+│ ├── percent-encoding v2.3.2
+│ ├── serde v1.0.228 (*)
+│ └── serde_derive v1.0.228 (proc-macro) (*)
+├── helix-loader v25.7.1 (https://git.bendn.org/helix#bcfbb875) (*)
+├── helix-lsp-types v0.95.1 (https://git.bendn.org/helix#bcfbb875)
+│ ├── bitflags v2.10.0
+│ ├── serde v1.0.228 (*)
+│ ├── serde_json v1.0.149 (*)
+│ └── url v2.5.8 (*)
+├── implicit-fn v0.1.0 (proc-macro) (*)
+├── itertools v0.14.0 (*)
+├── libc v0.2.180
+├── log v0.4.29
+├── lower v0.2.1 (*)
+├── lsp-server v0.7.9 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ ├── crossbeam-channel v0.5.15 (*)
+│ ├── helix-lsp-types v0.95.1 (https://git.bendn.org/helix#bcfbb875) (*)
+│ ├── log v0.4.29
+│ ├── serde v1.0.228 (*)
+│ ├── serde_derive v1.0.228 (proc-macro) (*)
+│ └── serde_json v1.0.149 (*)
+├── markdown v1.0.0
+│ └── unicode-id v0.3.6
+├── memchr v2.7.6
+├── niri-ipc v25.11.0
+│ ├── serde v1.0.228 (*)
+│ └── serde_json v1.0.149 (*)
+├── nucleo v0.5.0 (*)
+├── papaya v0.2.3
+│ ├── equivalent v1.0.2
+│ └── seize v0.5.1
+│ └── libc v0.2.180
+├── pattypan v0.1.0 (https://git.bendn.org/pattypan#51c4d77c)
+│ ├── anstream v0.6.21 (*)
+│ ├── anyhow v1.0.100
+│ ├── array_chunks v1.0.0
+│ ├── atools v0.1.12
+│ ├── chumsky v0.13.0 (https://github.com/zesterer/chumsky#b81c34c3)
+│ │ ├── hashbrown v0.15.5 (*)
+│ │ ├── stacker v0.1.22
+│ │ │ [build-dependencies]
+│ │ ├── unicode-ident v1.0.22
+│ │ └── unicode-segmentation v1.12.0
+│ ├── color-hex v0.2.0 (proc-macro)
+│ ├── ctlfun v0.1.0 (https://git.bendn.org/ctlfun#f00e5752)
+│ ├── dsb v0.1.0 (https://git.bendn.org/dsb#02744132) (*)
+│ ├── fimg v0.4.51 (https://git.bendn.org/fimg#cf01f538) (*)
+│ ├── implicit-fn v0.1.0 (proc-macro) (*)
+│ ├── libc v0.2.180
+│ ├── minifb v0.28.0
+│ │ ├── dlib v0.5.2
+│ │ ├── lazy_static v1.5.0
+│ │ ├── libc v0.2.180
+│ │ ├── raw-window-handle v0.6.2
+│ │ ├── tempfile v3.24.0 (*)
+│ │ ├── wayland-client v0.29.5
+│ │ │ [build-dependencies]
+│ │ ├── wayland-cursor v0.29.5
+│ │ ├── wayland-protocols v0.29.5
+│ │ │ [build-dependencies]
+│ │ └── x11-dl v2.21.0
+│ │ [build-dependencies]
+│ │ [build-dependencies]
+│ │ └── cc v1.2.55 (*)
+│ ├── nix v0.30.1
+│ │ ├── bitflags v2.10.0
+│ │ ├── cfg-if v1.0.4
+│ │ └── libc v0.2.180
+│ │ [build-dependencies]
+│ │ └── cfg_aliases v0.2.1
+│ ├── parking_lot v0.12.5 (*)
+│ ├── swash v0.2.6 (*)
+│ └── winit v0.30.12
+│ ├── ahash v0.8.12
+│ │ [build-dependencies]
+│ ├── bitflags v2.10.0
+│ ├── bytemuck v1.25.0
+│ ├── calloop v0.13.0
+│ ├── cursor-icon v1.2.0
+│ ├── dpi v0.1.2
+│ ├── libc v0.2.180
+│ ├── memmap2 v0.9.9
+│ ├── percent-encoding v2.3.2
+│ ├── raw-window-handle v0.6.2
+│ ├── rustix v0.38.44
+│ ├── sctk-adwaita v0.10.1
+│ ├── smithay-client-toolkit v0.19.2
+│ ├── smol_str v0.2.2
+│ ├── tracing v0.1.44
+│ ├── wayland-backend v0.3.12
+│ │ [build-dependencies]
+│ ├── wayland-client v0.31.12
+│ ├── wayland-protocols v0.32.10
+│ ├── wayland-protocols-plasma v0.3.10
+│ ├── x11-dl v2.21.0 (*)
+│ ├── x11rb v0.13.2
+│ └── xkbcommon-dl v0.4.2
+│ [build-dependencies]
+│ └── cfg_aliases v0.2.1
+├── pin-project v1.1.10
+│ └── pin-project-internal v1.1.10 (proc-macro)
+│ ├── proc-macro2 v1.0.106 (*)
+│ ├── quote v1.0.44 (*)
+│ └── syn v2.0.114 (*)
+├── png v0.18.0
+│ ├── bitflags v2.10.0
+│ ├── crc32fast v1.5.0
+│ │ └── cfg-if v1.0.4
+│ ├── fdeflate v0.3.7
+│ │ └── simd-adler32 v0.3.8
+│ ├── flate2 v1.1.8
+│ │ ├── crc32fast v1.5.0 (*)
+│ │ └── miniz_oxide v0.8.9
+│ └── miniz_oxide v0.8.9 (*)
+├── regex v1.12.2 (*)
+├── regex-cursor v0.1.5 (*)
+├── replace_with v0.1.8
+├── ropey v1.6.1 (*)
+├── run_times v0.1.0
+├── rust-analyzer v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ ├── anyhow v1.0.100
+│ ├── base64 v0.22.1
+│ ├── cargo_metadata v0.23.1
+│ │ ├── camino v1.2.2
+│ │ ├── cargo-platform v0.3.2
+│ │ ├── semver v1.0.27
+│ │ ├── serde v1.0.228 (*)
+│ │ ├── serde_json v1.0.149 (*)
+│ │ └── thiserror v2.0.18 (*)
+│ ├── cfg v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── intern v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── rustc-hash v2.1.1
+│ │ ├── span v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── syntax v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── tracing v0.1.44 (*)
+│ │ └── tt v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ ├── crossbeam-channel v0.5.15 (*)
+│ ├── dirs v6.0.0
+│ │ └── dirs-sys v0.5.0
+│ ├── dissimilar v1.0.10
+│ ├── helix-lsp-types v0.95.1 (https://git.bendn.org/helix#bcfbb875) (*)
+│ ├── hir v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── arrayvec v0.7.6
+│ │ ├── base-db v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── cfg v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── either v1.15.0
+│ │ ├── hir-def v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── hir-expand v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── hir-ty v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── intern v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── itertools v0.14.0 (*)
+│ │ ├── ra-ap-rustc_type_ir v0.143.0
+│ │ ├── rustc-hash v2.1.1
+│ │ ├── serde_json v1.0.149 (*)
+│ │ ├── smallvec v1.15.1
+│ │ ├── span v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── stdx v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── syntax v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── tracing v0.1.44 (*)
+│ │ ├── triomphe v0.1.15
+│ │ └── tt v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── hir-def v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── hir-ty v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── ide v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── arrayvec v0.7.6
+│ │ ├── cfg v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── cov-mark v2.2.0
+│ │ ├── dot v0.1.4
+│ │ ├── either v1.15.0
+│ │ ├── hir v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── ide-assists v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── ide-completion v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── ide-db v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── ide-diagnostics v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── ide-ssr v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── itertools v0.14.0 (*)
+│ │ ├── macros v0.0.0 (proc-macro) (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── nohash-hasher v0.2.0
+│ │ ├── oorandom v11.1.5
+│ │ ├── profile v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── pulldown-cmark v0.9.6
+│ │ ├── pulldown-cmark-to-cmark v10.0.4
+│ │ ├── rustc_apfloat v0.2.3+llvm-462a31f5a5ab
+│ │ ├── smallvec v1.15.1
+│ │ ├── span v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── stdx v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── syntax v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── toolchain v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── tracing v0.1.44 (*)
+│ │ ├── triomphe v0.1.15
+│ │ └── url v2.5.8 (*)
+│ ├── ide-completion v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── ide-db v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── ide-ssr v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── indexmap v2.13.0 (*)
+│ ├── itertools v0.14.0 (*)
+│ ├── load-cargo v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── anyhow v1.0.100
+│ │ ├── crossbeam-channel v0.5.15 (*)
+│ │ ├── hir-expand v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── ide-db v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── intern v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── itertools v0.14.0 (*)
+│ │ ├── proc-macro-api v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── project-model v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── span v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── tracing v0.1.44 (*)
+│ │ ├── tt v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ │ ├── vfs v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ └── vfs-notify v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ ├── lsp-server v0.7.9 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── memchr v2.7.6
+│ ├── num_cpus v1.17.0
+│ │ └── libc v0.2.180
+│ ├── oorandom v11.1.5
+│ ├── parking_lot v0.12.5 (*)
+│ ├── parser v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── drop_bomb v0.1.5
+│ │ ├── edition v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ ├── ra-ap-rustc_lexer v0.143.0
+│ │ ├── rustc-literal-escaper v0.0.4
+│ │ ├── tracing v0.1.44 (*)
+│ │ └── winnow v0.7.14
+│ ├── paths v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4)
+│ │ └── camino v1.2.2 (*)
+│ ├── proc-macro-api v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── process-wrap v8.2.1
+│ │ ├── indexmap v2.13.0 (*)
+│ │ ├── nix v0.30.1 (*)
+│ │ └── tracing v0.1.44 (*)
+│ ├── profile v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── project-model v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── ra-ap-rustc_type_ir v0.143.0 (*)
+│ ├── rayon v1.11.0 (*)
+│ ├── rustc-hash v2.1.1
+│ ├── scip v0.5.2
+│ │ └── protobuf v3.7.1
+│ ├── semver v1.0.27 (*)
+│ ├── serde v1.0.228 (*)
+│ ├── serde_derive v1.0.228 (proc-macro) (*)
+│ ├── serde_json v1.0.149 (*)
+│ ├── smallvec v1.15.1
+│ ├── stdx v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── syntax v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── tenthash v1.1.0
+│ ├── toml v0.9.11+spec-1.1.0 (*)
+│ ├── toolchain v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── tracing v0.1.44 (*)
+│ ├── tracing-subscriber v0.3.22
+│ │ ├── sharded-slab v0.1.7
+│ │ ├── thread_local v1.1.9
+│ │ ├── time v0.3.46
+│ │ ├── tracing-core v0.1.36
+│ │ └── tracing-log v0.2.0
+│ ├── tracing-tree v0.4.1
+│ │ ├── nu-ansi-term v0.50.3
+│ │ ├── tracing-core v0.1.36 (*)
+│ │ ├── tracing-log v0.2.0 (*)
+│ │ └── tracing-subscriber v0.3.22 (*)
+│ ├── triomphe v0.1.15
+│ ├── vfs v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── vfs-notify v0.0.0 (https://git.bendn.org/rust-analyzer#286d7dd4) (*)
+│ ├── walkdir v2.5.0
+│ │ └── same-file v1.0.6
+│ └── xflags v0.3.2
+│ └── xflags-macros v0.3.2 (proc-macro)
+├── rust-fsm v0.8.0 (https://git.bendn.org/rust-fsm#16afc8ee)
+│ ├── aquamarine v0.6.0 (proc-macro)
+│ │ ├── include_dir v0.7.4
+│ │ ├── itertools v0.10.5
+│ │ ├── proc-macro-error2 v2.0.1
+│ │ ├── proc-macro2 v1.0.106 (*)
+│ │ ├── quote v1.0.44 (*)
+│ │ └── syn v2.0.114 (*)
+│ ├── replace_with v0.1.8
+│ └── rust-fsm-dsl v0.8.0 (proc-macro) (https://git.bendn.org/rust-fsm#16afc8ee)
+│ ├── proc-macro2 v1.0.106 (*)
+│ ├── quote v1.0.44 (*)
+│ └── syn v2.0.114 (*)
+├── rustc-hash v2.1.1
+├── scopeguard v1.2.0
+├── serde v1.0.228 (*)
+├── serde_derive v1.0.228 (proc-macro) (*)
+├── serde_json v1.0.149 (*)
+├── softbuffer v0.4.8
+│ ├── as-raw-xcb-connection v1.0.1
+│ ├── bytemuck v1.25.0 (*)
+│ ├── drm v0.14.1
+│ │ ├── bitflags v2.10.0
+│ │ ├── bytemuck v1.25.0 (*)
+│ │ ├── drm-ffi v0.9.0
+│ │ ├── drm-fourcc v2.2.0
+│ │ └── rustix v0.38.44 (*)
+│ ├── fastrand v2.3.0
+│ ├── memmap2 v0.9.9 (*)
+│ ├── raw-window-handle v0.6.2
+│ ├── rustix v1.1.3
+│ │ ├── bitflags v2.10.0
+│ │ └── linux-raw-sys v0.11.0
+│ ├── tiny-xlib v0.2.4
+│ │ ├── as-raw-xcb-connection v1.0.1
+│ │ ├── ctor-lite v0.1.1
+│ │ ├── libloading v0.8.9
+│ │ └── tracing v0.1.44 (*)
+│ │ [build-dependencies]
+│ │ └── pkg-config v0.3.32
+│ ├── tracing v0.1.44 (*)
+│ ├── wayland-backend v0.3.12 (*)
+│ ├── wayland-client v0.31.12 (*)
+│ ├── wayland-sys v0.31.8
+│ │ ├── dlib v0.5.2 (*)
+│ │ ├── log v0.4.29
+│ │ └── once_cell v1.21.3
+│ │ [build-dependencies]
+│ │ └── pkg-config v0.3.32
+│ └── x11rb v0.13.2 (*)
+├── swash v0.2.6 (*)
+├── swizzle v0.1.0
+├── test-log v0.2.19
+│ ├── env_logger v0.11.8 (*)
+│ └── test-log-macros v0.2.19 (proc-macro)
+│ ├── proc-macro2 v1.0.106 (*)
+│ ├── quote v1.0.44 (*)
+│ └── syn v2.0.114 (*)
+├── tokio v1.49.0
+│ └── pin-project-lite v0.2.16
+├── tokio-util v0.7.18
+│ ├── bytes v1.11.0
+│ ├── futures-core v0.3.31
+│ ├── futures-sink v0.3.31
+│ ├── futures-util v0.3.31
+│ │ ├── futures-core v0.3.31
+│ │ ├── futures-macro v0.3.31 (proc-macro)
+│ │ ├── futures-task v0.3.31
+│ │ ├── pin-project-lite v0.2.16
+│ │ ├── pin-utils v0.1.0
+│ │ └── slab v0.4.12
+│ ├── pin-project-lite v0.2.16
+│ └── tokio v1.49.0 (*)
+├── tree-house v0.3.0 (*)
+├── tree-sitter v0.25.10
+│ ├── regex v1.12.2 (*)
+│ ├── regex-syntax v0.8.8
+│ ├── streaming-iterator v0.1.9
+│ └── tree-sitter-language v0.1.6
+│ [build-dependencies]
+│ ├── cc v1.2.55 (*)
+│ └── serde_json v1.0.149
+│ ├── indexmap v2.13.0
+│ ├── itoa v1.0.17
+│ ├── memchr v2.7.6
+│ ├── serde_core v1.0.228
+│ └── zmij v1.0.19
+├── url v2.5.8 (*)
+├── walkdir v2.5.0 (*)
+└── winit v0.30.12 (*)