From 67e4503e7e1d7ddded447fa288210c698780dfe1 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Sun, 14 Apr 2024 22:06:02 +0200 Subject: [PATCH] prompt: add nix segment --- scripts/prompt/src/main.zig | 1 + scripts/prompt/src/nix.zig | 22 ++++++++++++++++++++++ scripts/prompt/src/prompt.zig | 12 ++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 scripts/prompt/src/nix.zig diff --git a/scripts/prompt/src/main.zig b/scripts/prompt/src/main.zig index d379a49..094e717 100644 --- a/scripts/prompt/src/main.zig +++ b/scripts/prompt/src/main.zig @@ -51,6 +51,7 @@ pub fn main() !void { return error.MissingEnv, 10, ), + .nix_name = @import("nix.zig").findNixShellName(), }; var buf: [1024 * 8]u8 = undefined; diff --git a/scripts/prompt/src/nix.zig b/scripts/prompt/src/nix.zig new file mode 100644 index 0000000..bad5db8 --- /dev/null +++ b/scripts/prompt/src/nix.zig @@ -0,0 +1,22 @@ +const std = @import("std"); + +/// If we're likely in a Nix shell, return the name of that shell or "?" if it's unknown, +/// null otherwise. +pub fn findNixShellName() ?[]const u8 { + return if (isInNixShell()) std.posix.getenv("name") orelse "?" else null; +} + +fn isInNixShell() bool { + if (std.posix.getenv("IN_NIX_SHELL")) |_| return true; + + var path_iter = std.mem.splitScalar( + u8, + std.posix.getenv("PATH") orelse return false, + ':', + ); + + while (path_iter.next()) |p| + if (std.mem.startsWith(u8, p, "/nix/store")) return true; + + return false; +} diff --git a/scripts/prompt/src/prompt.zig b/scripts/prompt/src/prompt.zig index cd5deac..679f5cf 100644 --- a/scripts/prompt/src/prompt.zig +++ b/scripts/prompt/src/prompt.zig @@ -22,6 +22,7 @@ const symbols = struct { const root = ""; const watch = ""; const jobs = ""; + const nix = "󱄅"; }; pub const Options = struct { @@ -29,6 +30,7 @@ pub const Options = struct { mode: FishMode, duration: u32, jobs: u32, + nix_name: ?[]const u8, }; pub fn render(writer: anytype, options: Options) !void { @@ -56,6 +58,7 @@ fn Renderer(comptime Writer: type) type { try self.setStyle(.{ .background = left_color }); try self.renderDuration(); try self.renderJobs(); + try self.renderNix(); try self.renderCwd(); self.renderGit() catch |err| { switch (err) { @@ -147,6 +150,15 @@ fn Renderer(comptime Writer: type) type { try self.writer.print(" {s} {}", .{ symbols.jobs, self.options.jobs }); } + fn renderNix(self: *Self) !void { + if (self.options.nix_name) |name| { + try self.drawLeftSep(.Blue); + try self.setStyle(.{ .background = .Blue, .foreground = .Black}); + + try self.writer.print(" {s} {s}", .{symbols.nix, name }); + } + } + fn renderCwd(self: *Self) !void { var cwd_buf: [512]u8 = undefined; const cwd = try std.posix.getcwd(&cwd_buf);