From b1a2c9498068150a34fb94a71118b8d46c4cbafb Mon Sep 17 00:00:00 2001 From: Jeffrey C. Ollie Date: Wed, 15 Apr 2026 01:37:57 +0000 Subject: [PATCH] get fuzzy working and fix up previous examples --- flake.lock | 8 ++++---- flake.nix | 4 +++- examples/counter.zig | 3 ++- examples/fuzzy.zig | 53 ++++++++++++++++++++++++++--------------------------- src/vxfw/App.zig | 8 +++----- 5 file(s) changed, 38 insertion(s)(+), 38 deletion(s)(-) diff --git a/flake.lock b/flake.lock --- a/flake.lock +++ b/flake.lock @@ -26,11 +26,11 @@ ] }, "locked": { - "lastModified": 1776053585, - "narHash": "sha256-E06KRqtDxvKU3vxz7o7AgmeHVYIiIe5Q3kiFJQzEW4g=", + "lastModified": 1776208985, + "narHash": "sha256-IOuRFpbeQ9jSk54OURX5yvjoC759ujgSNjkMKpChdDA=", "ref": "refs/heads/main", - "rev": "a3ab4e8e3d22dbf9b4c0aff5f9c39e9a35ede6b6", - "revCount": 1664, + "rev": "e8ee348125247e7bd74932cc42ac92df90961d5b", + "revCount": 1666, "type": "git", "url": "https://git.ocjtech.us/jeff/zig-overlay.git" }, diff --git a/flake.nix b/flake.nix --- a/flake.nix +++ b/flake.nix @@ -32,7 +32,9 @@ default = pkgs.mkShell { name = "libvaxis"; nativeBuildInputs = [ - zig.packages.${pkgs.stdenv.hostPlatform.system}.master + pkgs.neovim + pkgs.fd + zig.packages.${pkgs.stdenv.hostPlatform.system}."0.16.0" ]; }; }); diff --git a/examples/counter.zig b/examples/counter.zig --- a/examples/counter.zig +++ b/examples/counter.zig @@ -115,7 +115,8 @@ const io = init.io; const allocator = init.gpa; - var app = try vxfw.App.init(io, allocator, init.environ_map); + var app: vxfw.App = undefined; + try app.init(io, allocator, init.environ_map); defer app.deinit(); // We heap allocate our model because we will require a stable pointer to it in our Button diff --git a/examples/fuzzy.zig b/examples/fuzzy.zig --- a/examples/fuzzy.zig +++ b/examples/fuzzy.zig @@ -11,7 +11,6 @@ /// Used for filtered RichText Spans and result arena: std.heap.ArenaAllocator, - filtered: std.ArrayList(vxfw.RichText), result: []const u8, pub fn init(gpa: std.mem.Allocator) !*Model { @@ -30,13 +29,13 @@ }, }, .text_field = .{ - .buf = vxfw.TextField.Buffer.init(gpa), + .buf = .init(gpa), .userdata = model, .onChange = Model.onChange, .onSubmit = Model.onSubmit, }, .result = "", - .arena = std.heap.ArenaAllocator.init(gpa), + .arena = .init(gpa), }; return model; @@ -64,7 +63,7 @@ // Initialize the filtered list const arena = self.arena.allocator(); for (self.list.items) |line| { - var spans = std.ArrayList(vxfw.RichText.TextSpan).empty; + var spans: std.ArrayList(vxfw.RichText.TextSpan) = .empty; const span: vxfw.RichText.TextSpan = .{ .text = line.text }; try spans.append(arena, span); try self.filtered.append(arena, .{ .text = spans.items }); @@ -201,43 +200,43 @@ return lower; } -pub fn main() !void { - var debug_allocator = std.heap.GeneralPurposeAllocator(.{}){}; - defer _ = debug_allocator.deinit(); +pub fn main(init: std.process.Init) !u8 { + const io = init.io; + const alloc = init.gpa; - const gpa = debug_allocator.allocator(); - - var app = try vxfw.App.init(gpa); + var app: vxfw.App = undefined; + try app.init(io, alloc, init.environ_map); errdefer app.deinit(); - const model = try Model.init(gpa); - defer model.deinit(gpa); + const model = try Model.init(alloc); + defer model.deinit(alloc); // Run the command - var fd = std.process.Child.init(&.{"fd"}, gpa); - fd.stdout_behavior = .Pipe; - fd.stderr_behavior = .Pipe; - var stdout = std.ArrayList(u8).empty; - var stderr = std.ArrayList(u8).empty; - defer stdout.deinit(gpa); - defer stderr.deinit(gpa); - try fd.spawn(); - try fd.collectOutput(gpa, &stdout, &stderr, 10_000_000); - _ = try fd.wait(); + const fd = try std.process.run(alloc, io, .{ + .argv = &.{"fd"}, + }); + defer alloc.free(fd.stdout); + defer alloc.free(fd.stderr); - var iter = std.mem.splitScalar(u8, stdout.items, '\n'); + var iter = std.mem.splitScalar(u8, fd.stdout, '\n'); while (iter.next()) |line| { if (line.len == 0) continue; - try model.list.append(gpa, .{ .text = line }); + try model.list.append(alloc, .{ .text = line }); } try app.run(model.widget(), .{}); app.deinit(); if (model.result.len > 0) { - _ = try std.posix.write(std.posix.STDOUT_FILENO, model.result); - _ = try std.posix.write(std.posix.STDOUT_FILENO, "\n"); + var stdout_file: std.Io.File = .stdout(); + var buffer: [1024]u8 = undefined; + var stdout_writer = stdout_file.writer(io, &buffer); + const stdout = &stdout_writer.interface; + try stdout.writeAll(model.result); + try stdout.writeByte('\n'); + try stdout.flush(); + return 0; } else { - std.process.exit(130); + return 130; } } diff --git a/src/vxfw/App.zig b/src/vxfw/App.zig --- a/src/vxfw/App.zig +++ b/src/vxfw/App.zig @@ -28,11 +28,11 @@ /// Create an application. We require stable pointers to do the set up, so this will create an App /// object on the heap. Call destroy when the app is complete to reset terminal state and release /// resources -pub fn init(io: std.Io, allocator: Allocator, env_map: *std.process.Environ.Map) !App { - var app: App = .{ +pub fn init(self: *App, io: std.Io, allocator: Allocator, env_map: *std.process.Environ.Map) !void { + self.* = .{ .io = io, .allocator = allocator, - .tty = undefined, + .tty = try vaxis.Tty.init(io, &self.buffer), .vx = try vaxis.init(io, allocator, env_map, .{ .system_clipboard_allocator = allocator, .kitty_keyboard_flags = .{ @@ -43,8 +43,6 @@ .wants_focus = null, .buffer = undefined, }; - app.tty = try vaxis.Tty.init(io, &app.buffer); - return app; } pub fn deinit(self: *App) void { -- tangled.sh