ghostty: add module
This commit is contained in:
parent
9a9fef316a
commit
5f6aa268e4
10 changed files with 279 additions and 0 deletions
|
@ -1935,6 +1935,18 @@ in {
|
|||
be deprecated for removal in the future.
|
||||
'';
|
||||
}
|
||||
|
||||
{
|
||||
time = "2025-01-01T23:16:35+00:00";
|
||||
message = ''
|
||||
A new module is available: 'programs.ghostty'.
|
||||
|
||||
Ghostty is a terminal emulator that differentiates itself by being
|
||||
fast, feature-rich, and native. While there are many excellent
|
||||
terminal emulators available, they all force you to choose between
|
||||
speed, features, or native UIs. Ghostty provides all three.
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -104,6 +104,7 @@ let
|
|||
./programs/getmail.nix
|
||||
./programs/gh.nix
|
||||
./programs/gh-dash.nix
|
||||
./programs/ghostty.nix
|
||||
./programs/git-cliff.nix
|
||||
./programs/git-credential-oauth.nix
|
||||
./programs/git.nix
|
||||
|
|
173
modules/programs/ghostty.nix
Normal file
173
modules/programs/ghostty.nix
Normal file
|
@ -0,0 +1,173 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.programs.ghostty;
|
||||
|
||||
keyValueSettings = {
|
||||
listsAsDuplicateKeys = true;
|
||||
mkKeyValue = lib.generators.mkKeyValueDefault { } " = ";
|
||||
};
|
||||
keyValue = pkgs.formats.keyValue keyValueSettings;
|
||||
in {
|
||||
meta.maintainers = [ lib.maintainers.HeitorAugustoLN ];
|
||||
|
||||
options.programs.ghostty = {
|
||||
enable = lib.mkEnableOption "Ghostty";
|
||||
|
||||
package = lib.mkPackageOption pkgs "ghostty" { };
|
||||
|
||||
settings = lib.mkOption {
|
||||
inherit (keyValue) type;
|
||||
default = { };
|
||||
example = lib.literalExpression ''
|
||||
{
|
||||
theme = "catppuccin-mocha";
|
||||
font-size = 10;
|
||||
}
|
||||
'';
|
||||
description = ''
|
||||
Configuration written to {file}`$XDG_CONFIG_HOME/ghostty/config`.
|
||||
|
||||
See <https://ghostty.org/docs/config/reference> for more information.
|
||||
'';
|
||||
};
|
||||
|
||||
themes = lib.mkOption {
|
||||
type = lib.types.attrsOf keyValue.type;
|
||||
default = { };
|
||||
example = {
|
||||
catppuccin-mocha = {
|
||||
palette = [
|
||||
"0=#45475a"
|
||||
"1=#f38ba8"
|
||||
"2=#a6e3a1"
|
||||
"3=#f9e2af"
|
||||
"4=#89b4fa"
|
||||
"5=#f5c2e7"
|
||||
"6=#94e2d5"
|
||||
"7=#bac2de"
|
||||
"8=#585b70"
|
||||
"9=#f38ba8"
|
||||
"10=#a6e3a1"
|
||||
"11=#f9e2af"
|
||||
"12=#89b4fa"
|
||||
"13=#f5c2e7"
|
||||
"14=#94e2d5"
|
||||
"15=#a6adc8"
|
||||
];
|
||||
background = "1e1e2e";
|
||||
foreground = "cdd6f4";
|
||||
cursor-color = "f5e0dc";
|
||||
selection-background = "353749";
|
||||
selection-foreground = "cdd6f4";
|
||||
};
|
||||
};
|
||||
description = ''
|
||||
Custom themes written to {file}`$XDG_CONFIG_HOME/ghostty/themes`.
|
||||
|
||||
See <https://ghostty.org/docs/features/theme#authoring-a-custom-theme> for more information.
|
||||
'';
|
||||
};
|
||||
|
||||
clearDefaultKeybinds = lib.mkEnableOption "" // {
|
||||
description = "Whether to clear default keybinds.";
|
||||
};
|
||||
|
||||
installVimSyntax =
|
||||
lib.mkEnableOption "installation of Ghostty configuration syntax for Vim";
|
||||
|
||||
installBatSyntax =
|
||||
lib.mkEnableOption "installation of Ghostty configuration syntax for bat"
|
||||
// {
|
||||
default = true;
|
||||
};
|
||||
|
||||
enableBashIntegration = lib.mkEnableOption ''
|
||||
bash shell integration.
|
||||
|
||||
This is ensures that shell integration works in more scenarios, such as switching shells within Ghostty.
|
||||
But it is not needed to have shell integration.
|
||||
See <https://ghostty.org/docs/features/shell-integration#manual-shell-integration-setup> for more information
|
||||
'';
|
||||
|
||||
enableFishIntegration = lib.mkEnableOption ''
|
||||
fish shell integration.
|
||||
|
||||
This is ensures that shell integration works in more scenarios, such as switching shells within Ghostty.
|
||||
But it is not needed to have shell integration.
|
||||
See <https://ghostty.org/docs/features/shell-integration#manual-shell-integration-setup> for more information
|
||||
'';
|
||||
|
||||
enableZshIntegration = lib.mkEnableOption ''
|
||||
zsh shell integration.
|
||||
|
||||
This is ensures that shell integration works in more scenarios, such as switching shells within Ghostty.
|
||||
But it is not needed to have shell integration.
|
||||
See <https://ghostty.org/docs/features/shell-integration#manual-shell-integration-setup> for more information
|
||||
'';
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable (lib.mkMerge [
|
||||
{
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
programs.ghostty.settings = lib.mkIf cfg.clearDefaultKeybinds {
|
||||
keybind = lib.mkBefore [ "clear" ];
|
||||
};
|
||||
|
||||
# MacOS also supports XDG configuration directory, so we use it for both
|
||||
# Linux and macOS to reduce complexity
|
||||
xdg.configFile = lib.mkMerge [
|
||||
{
|
||||
"ghostty/config" = lib.mkIf (cfg.settings != { }) {
|
||||
source = keyValue.generate "ghostty-config" cfg.settings;
|
||||
};
|
||||
}
|
||||
|
||||
(lib.mkIf (cfg.themes != { }) (lib.mapAttrs' (name: value: {
|
||||
name = "ghostty/themes/${name}";
|
||||
value.source = keyValue.generate "ghostty-${name}-theme" value;
|
||||
}) cfg.themes))
|
||||
];
|
||||
}
|
||||
|
||||
(lib.mkIf cfg.installVimSyntax {
|
||||
programs.vim.plugins = [ cfg.package.vim ];
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.installBatSyntax {
|
||||
programs.bat = {
|
||||
syntaxes.ghostty = {
|
||||
src = cfg.package;
|
||||
file = "share/bat/syntaxes/ghostty.sublime-syntax";
|
||||
};
|
||||
config.map-syntax = [ "*/ghostty/config:Ghostty Config" ];
|
||||
};
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.enableBashIntegration {
|
||||
# Make order 101 to be placed exactly after bash completions, as Ghostty
|
||||
# documentation suggests sourcing the script as soon as possible
|
||||
programs.bash.initExtra = lib.mkOrder 101 ''
|
||||
if [[ -n "''${GHOSTTY_RESOURCES_DIR}" ]]; then
|
||||
builtin source "''${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
|
||||
fi
|
||||
'';
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.enableFishIntegration {
|
||||
programs.fish.shellInit = ''
|
||||
if set -q GHOSTTY_RESOURCES_DIR
|
||||
source "$GHOSTTY_RESOURCES_DIR/shell-integration/fish/vendor_conf.d/ghostty-shell-integration.fish"
|
||||
end
|
||||
'';
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.enableZshIntegration {
|
||||
programs.zsh.initExtra = ''
|
||||
if [[ -n $GHOSTTY_RESOURCES_DIR ]]; then
|
||||
source "$GHOSTTY_RESOURCES_DIR"/shell-integration/zsh/ghostty-integration
|
||||
fi
|
||||
'';
|
||||
})
|
||||
]);
|
||||
}
|
|
@ -79,6 +79,7 @@ in import nmtSrc {
|
|||
./modules/programs/gallery-dl
|
||||
./modules/programs/gh
|
||||
./modules/programs/gh-dash
|
||||
./modules/programs/ghostty
|
||||
./modules/programs/git
|
||||
./modules/programs/git-cliff
|
||||
./modules/programs/git-credential-oauth
|
||||
|
|
5
tests/modules/programs/ghostty/default.nix
Normal file
5
tests/modules/programs/ghostty/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
ghostty-example-settings = ./example-settings.nix;
|
||||
ghostty-empty-settings = ./empty-settings.nix;
|
||||
ghostty-example-theme = ./example-theme.nix;
|
||||
}
|
7
tests/modules/programs/ghostty/empty-settings.nix
Normal file
7
tests/modules/programs/ghostty/empty-settings.nix
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
programs.ghostty.enable = true;
|
||||
test.stubs.ghostty = { };
|
||||
nmt.script = ''
|
||||
assertPathNotExists home-files/.config/ghostty/config
|
||||
'';
|
||||
}
|
2
tests/modules/programs/ghostty/example-config-expected
Normal file
2
tests/modules/programs/ghostty/example-config-expected
Normal file
|
@ -0,0 +1,2 @@
|
|||
font-size = 10
|
||||
theme = catppuccin-mocha
|
17
tests/modules/programs/ghostty/example-settings.nix
Normal file
17
tests/modules/programs/ghostty/example-settings.nix
Normal file
|
@ -0,0 +1,17 @@
|
|||
{ config, ... }: {
|
||||
programs.ghostty = {
|
||||
enable = true;
|
||||
package = config.lib.test.mkStubPackage { };
|
||||
|
||||
settings = {
|
||||
theme = "catppuccin-mocha";
|
||||
font-size = 10;
|
||||
};
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileContent \
|
||||
home-files/.config/ghostty/config \
|
||||
${./example-config-expected}
|
||||
'';
|
||||
}
|
21
tests/modules/programs/ghostty/example-theme-expected
Normal file
21
tests/modules/programs/ghostty/example-theme-expected
Normal file
|
@ -0,0 +1,21 @@
|
|||
background = 1e1e2e
|
||||
cursor-color = f5e0dc
|
||||
foreground = cdd6f4
|
||||
palette = 0=#45475a
|
||||
palette = 1=#f38ba8
|
||||
palette = 2=#a6e3a1
|
||||
palette = 3=#f9e2af
|
||||
palette = 4=#89b4fa
|
||||
palette = 5=#f5c2e7
|
||||
palette = 6=#94e2d5
|
||||
palette = 7=#bac2de
|
||||
palette = 8=#585b70
|
||||
palette = 9=#f38ba8
|
||||
palette = 10=#a6e3a1
|
||||
palette = 11=#f9e2af
|
||||
palette = 12=#89b4fa
|
||||
palette = 13=#f5c2e7
|
||||
palette = 14=#94e2d5
|
||||
palette = 15=#a6adc8
|
||||
selection-background = 353749
|
||||
selection-foreground = cdd6f4
|
40
tests/modules/programs/ghostty/example-theme.nix
Normal file
40
tests/modules/programs/ghostty/example-theme.nix
Normal file
|
@ -0,0 +1,40 @@
|
|||
{ config, ... }: {
|
||||
programs.ghostty = {
|
||||
enable = true;
|
||||
package = config.lib.test.mkStubPackage { };
|
||||
|
||||
themes = {
|
||||
catppuccin-mocha = {
|
||||
palette = [
|
||||
"0=#45475a"
|
||||
"1=#f38ba8"
|
||||
"2=#a6e3a1"
|
||||
"3=#f9e2af"
|
||||
"4=#89b4fa"
|
||||
"5=#f5c2e7"
|
||||
"6=#94e2d5"
|
||||
"7=#bac2de"
|
||||
"8=#585b70"
|
||||
"9=#f38ba8"
|
||||
"10=#a6e3a1"
|
||||
"11=#f9e2af"
|
||||
"12=#89b4fa"
|
||||
"13=#f5c2e7"
|
||||
"14=#94e2d5"
|
||||
"15=#a6adc8"
|
||||
];
|
||||
background = "1e1e2e";
|
||||
foreground = "cdd6f4";
|
||||
cursor-color = "f5e0dc";
|
||||
selection-background = "353749";
|
||||
selection-foreground = "cdd6f4";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileContent \
|
||||
home-files/.config/ghostty/themes/catppuccin-mocha \
|
||||
${./example-theme-expected}
|
||||
'';
|
||||
}
|
Loading…
Reference in a new issue