A simple CPU rendered GUI IDE experience.
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | fail.png | bin | 0 -> 31212 bytes | |||
| -rw-r--r-- | flake.lock | 82 | ||||
| -rw-r--r-- | flake.nix | 83 | ||||
| -rw-r--r-- | src/bar.rs | 12 | ||||
| -rw-r--r-- | src/com.rs | 62 | ||||
| -rw-r--r-- | src/commands.rs | 163 | ||||
| -rw-r--r-- | src/edi.rs | 20 | ||||
| -rw-r--r-- | src/edi/st.rs | 28 | ||||
| -rw-r--r-- | src/main.rs | 3 | ||||
| -rw-r--r-- | src/rnd.rs | 57 | ||||
| -rw-r--r-- | test | 525 |
12 files changed, 1020 insertions, 16 deletions
@@ -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 Binary files differnew file mode 100644 index 0000000..23f93ff --- /dev/null +++ b/fail.png 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 ]; + }; + } + ); +} @@ -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, @@ -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); +} @@ -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; @@ -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() + }) } @@ -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 (*) |