ghostty/src/cli/show_config.zig
2024-01-20 19:44:54 -08:00

85 lines
2.8 KiB
Zig

const std = @import("std");
const args = @import("args.zig");
const Allocator = std.mem.Allocator;
const Action = @import("action.zig").Action;
const configpkg = @import("../config.zig");
const Config = configpkg.Config;
pub const Options = struct {
/// If true, do not load the user configuration, only load the defaults.
default: bool = false,
/// Only show the options that have been changed from the default.
/// This has no effect if `--default` is specified.
@"changes-only": bool = true,
/// If true print the documentation above each option as a comment,
/// if available.
docs: bool = false,
pub fn deinit(self: Options) void {
_ = self;
}
/// Enables "-h" and "--help" to work.
pub fn help(self: Options) !void {
_ = self;
return Action.help_error;
}
};
/// The "show-config" command shows the current configuration in a valid
/// Ghostty configuration file format.
///
/// When executed without any arguments this will output the current
/// configuration that is different from the default configuration. If you're
/// using the default configuration this will output nothing.
///
/// If you are a new user and want to see all available options with
/// documentation, run `ghostty +show-config --default --docs`.
///
/// The output is not in any specific order, but the order should be
/// consistent between runs. The output is not guaranteed to be exactly
/// match the input configuration files, but it will result in the same
/// behavior. Comments, whitespace, and other formatting is not preserved
/// from user configuration files.
///
/// Flags:
///
/// - "--default": Show the default configuration instead of loading
/// the user configuration.
///
/// - "--changes-only": Only show the options that have been changed
/// from the default. This has no effect if "--default" is specified.
///
/// - "--docs": Print the documentation above each option as a comment,
/// This is very noisy but is very useful to learn about available
/// options, especially paired with "--default".
///
pub fn run(alloc: Allocator) !u8 {
var opts: Options = .{};
defer opts.deinit();
{
var iter = try std.process.argsWithAllocator(alloc);
defer iter.deinit();
try args.parse(Options, alloc, &opts, &iter);
}
var config = if (opts.default) try Config.default(alloc) else try Config.load(alloc);
defer config.deinit();
const configfmt: configpkg.FileFormatter = .{
.alloc = alloc,
.config = &config,
.changed = !opts.default and opts.@"changes-only",
.docs = opts.docs,
};
// For some reason `std.fmt.format` isn't working here but it works in
// tests so we just do configfmt.format.
const stdout = std.io.getStdOut().writer();
try configfmt.format("", .{}, stdout);
return 0;
}