mirror of
https://github.com/nix-community/home-manager.git
synced 2026-06-05 21:02:51 +00:00
macos-terminal: add module
This commit is contained in:
14
modules/misc/news/2026/04/2026-04-15_21-57-57.nix
Normal file
14
modules/misc/news/2026/04/2026-04-15_21-57-57.nix
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
time = "2026-04-15T11:57:57+00:00";
|
||||
condition = pkgs.stdenv.hostPlatform.isDarwin;
|
||||
message = ''
|
||||
A new module is available: `programs.macos-terminal`.
|
||||
|
||||
This module allows for configuration of preferences for the macOS
|
||||
Terminal.app application.
|
||||
'';
|
||||
}
|
||||
179
modules/programs/macos-terminal.nix
Normal file
179
modules/programs/macos-terminal.nix
Normal file
@@ -0,0 +1,179 @@
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (lib)
|
||||
maintainers
|
||||
mapAttrs
|
||||
mkEnableOption
|
||||
mkIf
|
||||
mkOption
|
||||
mkOptionDefault
|
||||
types
|
||||
;
|
||||
|
||||
inherit (lib.hm)
|
||||
assertions
|
||||
dag
|
||||
;
|
||||
|
||||
inherit (lib.platforms) darwin;
|
||||
inherit (pkgs.formats) plist;
|
||||
|
||||
cfg = config.programs.macos-terminal;
|
||||
plistFormat = plist { escape = true; };
|
||||
in
|
||||
{
|
||||
meta.maintainers = with maintainers; [
|
||||
kayskayskays
|
||||
];
|
||||
|
||||
options.programs.macos-terminal = {
|
||||
enable = mkEnableOption "macOS Terminal";
|
||||
|
||||
profiles = mkOption {
|
||||
type = types.attrsOf (
|
||||
types.submodule {
|
||||
# These settings will be passed directly to the plist generator.
|
||||
options.settings = mkOption {
|
||||
type = types.attrsOf plistFormat.type;
|
||||
|
||||
default = { };
|
||||
|
||||
example = ''
|
||||
{
|
||||
FontAntialias = true;
|
||||
ShowActiveProcessInTitle = true;
|
||||
ShowCommandKeyInTitle = true;
|
||||
};
|
||||
'';
|
||||
|
||||
description = ''
|
||||
Raw plist-compatible settings for profiles within the Terminal.app
|
||||
application.
|
||||
|
||||
This attribute set is intended for simple settings that have a
|
||||
well defined mapping to plist properties.
|
||||
|
||||
Properties that are more obscure and require serialization as
|
||||
archived Cocoa objects, for example, are unsupported here - they
|
||||
may require dedicated module options in future.
|
||||
|
||||
Attribute names should reflect the name of plist properties
|
||||
understood by the Terminal.app application. Unknown attributes
|
||||
will still be serialized, but may remain unrecognised - and thus
|
||||
unhonored - by the Terminal.app application.
|
||||
'';
|
||||
};
|
||||
|
||||
config.settings = {
|
||||
# For profiles, the "type" plist property should always be "Window
|
||||
# Settings".
|
||||
type = mkOptionDefault "Window Settings";
|
||||
|
||||
# Other common profile defaults.
|
||||
rowCount = mkOptionDefault 24;
|
||||
columnCount = mkOptionDefault 80;
|
||||
ProfileCurrentVersion = mkOptionDefault 2.07;
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
default = { };
|
||||
|
||||
example = ''
|
||||
{
|
||||
Basic.settings = {
|
||||
FontAntialias = true;
|
||||
ShowActiveProcessInTitle = true;
|
||||
};
|
||||
|
||||
"Red Sands".settings = {
|
||||
BackgroundAlphaInactive = 0.5;
|
||||
CommandString = "ssh compute";
|
||||
};
|
||||
}
|
||||
'';
|
||||
|
||||
description = ''
|
||||
Configuration settings for profiles within the Terminal.app application.
|
||||
|
||||
Each attribute name is used as the name of the profile, and the value
|
||||
defines the plist-compatible settings for that profile.
|
||||
'';
|
||||
};
|
||||
|
||||
preferences = mkOption {
|
||||
type = types.submodule {
|
||||
options = {
|
||||
importSettings = mkOption {
|
||||
type = types.bool;
|
||||
|
||||
default = true;
|
||||
|
||||
description = ''
|
||||
Whether to import the generated plist into the
|
||||
`com.apple.Terminal` preferences domain during activation.
|
||||
'';
|
||||
};
|
||||
|
||||
writeFile = mkOption {
|
||||
type = types.bool;
|
||||
|
||||
default = false;
|
||||
|
||||
description = ''
|
||||
Whether to write the generated plist into the
|
||||
`~/Library/Preferences/com.apple.Terminal.plist` file during
|
||||
activation.
|
||||
|
||||
This is primarily useful for inspection and testing purposes.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
default = { };
|
||||
|
||||
example = ''
|
||||
{
|
||||
importSettings = true;
|
||||
writeFile = false;
|
||||
}
|
||||
'';
|
||||
|
||||
description = ''
|
||||
Options controlling how Terminal.app preferences are applied and
|
||||
managed.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (
|
||||
let
|
||||
finalSettings = mapAttrs (name: profile: profile.settings // { inherit name; }) cfg.profiles;
|
||||
|
||||
plistFile = plistFormat.generate "com.apple.Terminal.plist" {
|
||||
"Window Settings" = finalSettings;
|
||||
};
|
||||
in
|
||||
{
|
||||
assertions = [
|
||||
(assertions.assertPlatform "programs.macos-terminal" pkgs darwin)
|
||||
];
|
||||
|
||||
home.file."Library/Preferences/com.apple.Terminal.plist" = mkIf cfg.preferences.writeFile {
|
||||
source = plistFile;
|
||||
};
|
||||
|
||||
home.activation.appleTerminal = mkIf cfg.preferences.importSettings (
|
||||
dag.entryAfter [ "writeBoundary" ] ''
|
||||
run /usr/bin/defaults import com.apple.Terminal "${plistFile}"
|
||||
''
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user