diff --git a/src/config/edit.zig b/src/config/edit.zig index 38d9f2b7f..692447594 100644 --- a/src/config/edit.zig +++ b/src/config/edit.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const builtin = @import("builtin"); const Allocator = std.mem.Allocator; const internal_os = @import("../os/main.zig"); @@ -6,7 +7,24 @@ const internal_os = @import("../os/main.zig"); /// paths the main config file could be in. pub fn open(alloc_gpa: Allocator) !void { // default location - const config_path = try internal_os.xdg.config(alloc_gpa, .{ .subdir = "ghostty/config" }); + const config_path = config_path: { + const xdg_config_path = try internal_os.xdg.config(alloc_gpa, .{ .subdir = "ghostty/config" }); + + if (comptime builtin.os.tag == .macos) macos: { + // On macOS, use the application support path if the XDG path doesn't exists. + if (std.fs.accessAbsolute(xdg_config_path, .{})) { + break :macos; + } else |err| switch (err) { + error.BadPathName, error.FileNotFound => {}, + else => break :macos, + } + + alloc_gpa.free(xdg_config_path); + break :config_path try internal_os.macos.appSupportDir(alloc_gpa, "config"); + } + + break :config_path xdg_config_path; + }; defer alloc_gpa.free(config_path); // Create config directory recursively.