Adding keybind 'w' to the +list-themes TUI that would write out a file that contained themes

pull/8930/head
greathongtu 2025-09-27 15:16:27 +08:00
parent 42a38ff672
commit fe52eb9494
2 changed files with 49 additions and 1 deletions

View File

@ -192,6 +192,28 @@ pub fn run(gpa_alloc: std.mem.Allocator) !u8 {
return 0;
}
fn resolveAutoThemePath(alloc: std.mem.Allocator) ![]u8 {
const main_cfg_path = try Config.preferredDefaultFilePath(alloc);
defer alloc.free(main_cfg_path);
const base_dir = std.fs.path.dirname(main_cfg_path) orelse return error.BadPathName;
return try std.fs.path.join(alloc, &.{ base_dir, "auto", "theme.ghostty" });
}
fn writeAutoThemeFile(alloc: std.mem.Allocator, theme_name: []const u8) !void {
const auto_path = try resolveAutoThemePath(alloc);
defer alloc.free(auto_path);
if (std.fs.path.dirname(auto_path)) |dir| {
try std.fs.cwd().makePath(dir);
}
var f = try std.fs.createFileAbsolute(auto_path, .{ .truncate = true });
defer f.close();
try f.writer().print("theme = {s}\n", .{theme_name});
}
const Event = union(enum) {
key_press: vaxis.Key,
mouse: vaxis.Mouse,
@ -483,6 +505,9 @@ const Preview = struct {
self.should_quit = true;
if (key.matchesAny(&.{ vaxis.Key.escape, vaxis.Key.enter, vaxis.Key.kp_enter }, .{}))
self.mode = .normal;
if (key.matches('w', .{})) {
self.saveSelectedTheme();
}
},
}
},
@ -694,7 +719,7 @@ const Preview = struct {
.help => {
win.hideCursor();
const width = 60;
const height = 20;
const height = 22;
const child = win.child(
.{
.x_off = win.width / 2 -| width / 2,
@ -729,6 +754,7 @@ const Preview = struct {
.{ .keys = "/", .help = "Start search." },
.{ .keys = "^X, ^/", .help = "Clear search." },
.{ .keys = "", .help = "Save theme or close search window." },
.{ .keys = "w", .help = "Write theme to auto config file." },
};
for (key_help, 0..) |help, captured_i| {
@ -805,6 +831,9 @@ const Preview = struct {
try std.fmt.allocPrint(alloc, "theme = {s}", .{theme.theme}),
"",
"Save the configuration file and then reload it to apply the new theme.",
"",
"Or press 'w' to write an auto theme file.",
"",
"For more details on configuration and themes, visit the Ghostty documentation:",
"",
"https://ghostty.org/docs/config/reference",
@ -1653,6 +1682,18 @@ const Preview = struct {
});
}
}
fn saveSelectedTheme(self: *Preview) void {
if (self.filtered.items.len == 0)
return;
const idx = self.filtered.items[self.current];
const theme = self.themes[idx];
writeAutoThemeFile(self.allocator, theme.theme) catch {
return;
};
}
};
fn color(config: Config, palette: usize) vaxis.Color {

View File

@ -24,6 +24,13 @@
# reloaded while running; some only apply to new windows and others may require
# a full restart to take effect.
# Auto theme include
# ==================
# This include makes it easy to pick a theme via `ghostty +list-themes`:
# press Enter on a theme, then 'w' to write the auto theme file.
# This path is relative to this config file.
config-file = ?auto/theme.ghostty
# Config syntax crash course
# ==========================
# # The config file consists of simple key-value pairs,