diff --git a/ncdu.pod b/ncdu.pod index caa9812d968adca44dba95d69e74f7e9f1b3e63b..0a6df97653656849bf67e172b855480ea4a8df01 100644 --- a/ncdu.pod +++ b/ncdu.pod @@ -139,9 +139,12 @@ accidentally press 'q' during or after a very long scan. =item --color I<SCHEME> -Select a color scheme. Currently only two schemes are recognized: I<off> to -disable colors (the default) and I<dark> for a color scheme intended for dark -backgrounds. +Select a color scheme. The following schemes are recognized: I<off> to disable +colors, I<dark> for a color scheme intended for dark backgrounds and I<dark-bg> +for a variation of the I<dark> color scheme that also works in terminals with a +light background. + +The default is I<dark-bg> unless the C<NO_COLOR> environment variable is set. =back diff --git a/src/main.zig b/src/main.zig index 3e14f7e3e12aae799fa6384c3f41d4aa5a20d8fa..46564a973a5ff270aab1fe4a67c47649a7fa8fa1 100644 --- a/src/main.zig +++ b/src/main.zig @@ -52,7 +52,7 @@ pub const config = struct { pub var scan_ui: enum { none, line, full } = .full; pub var si: bool = false; pub var nc_tty: bool = false; - pub var ui_color: enum { off, dark } = .off; + pub var ui_color: enum { off, dark, darkbg } = .off; pub var thousands_sep: []const u8 = ","; pub var show_hidden: bool = true; @@ -175,7 +175,7 @@ fn help() noreturn { ++ " --exclude-caches Exclude directories containing CACHEDIR.TAG\n" ++ " --exclude-kernfs Exclude Linux pseudo filesystems (procfs,sysfs,cgroup,...)\n" ++ " --confirm-quit Confirm quitting ncdu\n" - ++ " --color SCHEME Set color scheme (off/dark)\n" + ++ " --color SCHEME Set color scheme (off/dark/dark-bg)\n" ) catch {}; std.process.exit(0); } @@ -259,6 +259,7 @@ pub fn main() void { config.thousands_sep = span; } } + if (std.os.getenvZ("NO_COLOR") == null) config.ui_color = .darkbg; var args = Args(std.process.ArgIteratorPosix).init(std.process.ArgIteratorPosix.init()); var scan_dir: ?[]const u8 = null; @@ -300,6 +301,7 @@ pub fn main() void { const val = args.arg(); if (std.mem.eql(u8, val, "off")) config.ui_color = .off else if (std.mem.eql(u8, val, "dark")) config.ui_color = .dark + else if (std.mem.eql(u8, val, "dark-bg")) config.ui_color = .darkbg else ui.die("Unknown --color option: {s}.\n", .{val}); } else ui.die("Unrecognized option '{s}'.\n", .{opt.val}); } diff --git a/src/ui.zig b/src/ui.zig index d9a7d744ce9f25dada1eff6802a03a261c20dc7d..08fbdea865a0e7d2c345fc1ed8a8f6c14429efd2 100644 --- a/src/ui.zig +++ b/src/ui.zig @@ -201,66 +201,85 @@ const StyleDef = struct { name: []const u8, off: StyleAttr, dark: StyleAttr, + darkbg: StyleAttr, fn style(self: *const @This()) StyleAttr { return switch (main.config.ui_color) { .off => self.off, .dark => self.dark, + .darkbg => self.darkbg, }; } }; const styles = [_]StyleDef{ - .{ .name = "default", - .off = .{ .fg = -1, .bg = -1, .attr = 0 }, - .dark = .{ .fg = -1, .bg = -1, .attr = 0 } }, - .{ .name = "bold", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, - .dark = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD } }, - .{ .name = "bold_hd", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD|c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_BLACK, .bg = c.COLOR_CYAN, .attr = c.A_BOLD } }, - .{ .name = "box_title", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, - .dark = .{ .fg = c.COLOR_BLUE, .bg = -1, .attr = c.A_BOLD } }, - .{ .name = "hd", // header + footer - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_BLACK, .bg = c.COLOR_CYAN, .attr = 0 } }, - .{ .name = "sel", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_WHITE, .bg = c.COLOR_GREEN, .attr = c.A_BOLD } }, - .{ .name = "num", - .off = .{ .fg = -1, .bg = -1, .attr = 0 }, - .dark = .{ .fg = c.COLOR_YELLOW, .bg = -1, .attr = c.A_BOLD } }, - .{ .name = "num_hd", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_CYAN, .attr = c.A_BOLD } }, - .{ .name = "num_sel", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_GREEN, .attr = c.A_BOLD } }, - .{ .name = "key", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, - .dark = .{ .fg = c.COLOR_YELLOW, .bg = -1, .attr = c.A_BOLD } }, - .{ .name = "key_hd", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD|c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_CYAN, .attr = c.A_BOLD } }, - .{ .name = "dir", - .off = .{ .fg = -1, .bg = -1, .attr = 0 }, - .dark = .{ .fg = c.COLOR_BLUE, .bg = -1, .attr = c.A_BOLD } }, - .{ .name = "dir_sel", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_BLUE, .bg = c.COLOR_GREEN, .attr = c.A_BOLD } }, - .{ .name = "flag", - .off = .{ .fg = -1, .bg = -1, .attr = 0 }, - .dark = .{ .fg = c.COLOR_RED, .bg = -1, .attr = 0 } }, - .{ .name = "flag_sel", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_RED, .bg = c.COLOR_GREEN, .attr = 0 } }, - .{ .name = "graph", - .off = .{ .fg = -1, .bg = -1, .attr = 0 }, - .dark = .{ .fg = c.COLOR_MAGENTA, .bg = -1, .attr = 0 } }, - .{ .name = "graph_sel", - .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, - .dark = .{ .fg = c.COLOR_MAGENTA, .bg = c.COLOR_GREEN, .attr = 0 } }, + .{ .name = "default", + .off = .{ .fg = -1, .bg = -1, .attr = 0 }, + .dark = .{ .fg = -1, .bg = -1, .attr = 0 }, + .darkbg = .{ .fg = c.COLOR_WHITE, .bg = c.COLOR_BLACK, .attr = 0 } }, + .{ .name = "bold", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, + .dark = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_WHITE, .bg = c.COLOR_BLACK, .attr = c.A_BOLD } }, + .{ .name = "bold_hd", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD|c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_BLACK, .bg = c.COLOR_CYAN, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_BLACK, .bg = c.COLOR_CYAN, .attr = c.A_BOLD } }, + .{ .name = "box_title", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, + .dark = .{ .fg = c.COLOR_BLUE, .bg = -1, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_BLUE, .bg = c.COLOR_BLACK, .attr = c.A_BOLD } }, + .{ .name = "hd", // header + footer + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_BLACK, .bg = c.COLOR_CYAN, .attr = 0 }, + .darkbg = .{ .fg = c.COLOR_BLACK, .bg = c.COLOR_CYAN, .attr = 0 } }, + .{ .name = "sel", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_WHITE, .bg = c.COLOR_GREEN, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_WHITE, .bg = c.COLOR_GREEN, .attr = c.A_BOLD } }, + .{ .name = "num", + .off = .{ .fg = -1, .bg = -1, .attr = 0 }, + .dark = .{ .fg = c.COLOR_YELLOW, .bg = -1, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_BLACK, .attr = c.A_BOLD } }, + .{ .name = "num_hd", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_CYAN, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_CYAN, .attr = c.A_BOLD } }, + .{ .name = "num_sel", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_GREEN, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_GREEN, .attr = c.A_BOLD } }, + .{ .name = "key", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD }, + .dark = .{ .fg = c.COLOR_YELLOW, .bg = -1, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_BLACK, .attr = c.A_BOLD } }, + .{ .name = "key_hd", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_BOLD|c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_CYAN, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_YELLOW, .bg = c.COLOR_CYAN, .attr = c.A_BOLD } }, + .{ .name = "dir", + .off = .{ .fg = -1, .bg = -1, .attr = 0 }, + .dark = .{ .fg = c.COLOR_BLUE, .bg = -1, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_BLUE, .bg = c.COLOR_BLACK, .attr = c.A_BOLD } }, + .{ .name = "dir_sel", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_BLUE, .bg = c.COLOR_GREEN, .attr = c.A_BOLD }, + .darkbg = .{ .fg = c.COLOR_BLUE, .bg = c.COLOR_GREEN, .attr = c.A_BOLD } }, + .{ .name = "flag", + .off = .{ .fg = -1, .bg = -1, .attr = 0 }, + .dark = .{ .fg = c.COLOR_RED, .bg = -1, .attr = 0 }, + .darkbg = .{ .fg = c.COLOR_RED, .bg = c.COLOR_BLACK, .attr = 0 } }, + .{ .name = "flag_sel", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_RED, .bg = c.COLOR_GREEN, .attr = 0 }, + .darkbg = .{ .fg = c.COLOR_RED, .bg = c.COLOR_GREEN, .attr = 0 } }, + .{ .name = "graph", + .off = .{ .fg = -1, .bg = -1, .attr = 0 }, + .dark = .{ .fg = c.COLOR_MAGENTA, .bg = -1, .attr = 0 }, + .darkbg = .{ .fg = c.COLOR_MAGENTA, .bg = c.COLOR_BLACK, .attr = 0 } }, + .{ .name = "graph_sel", + .off = .{ .fg = -1, .bg = -1, .attr = c.A_REVERSE }, + .dark = .{ .fg = c.COLOR_MAGENTA, .bg = c.COLOR_GREEN, .attr = 0 }, + .darkbg = .{ .fg = c.COLOR_MAGENTA, .bg = c.COLOR_GREEN, .attr = 0 } }, }; pub const Style = lbl: {