1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

fish: added completions option (#8127)

This commit is contained in:
Raul Rodrigues de Oliveira 2025-11-06 13:27:58 -03:00 committed by GitHub
parent 8929c5f3bc
commit ba15db2a15
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 93 additions and 0 deletions

View file

@ -153,6 +153,17 @@ let
}; };
}; };
completionModule = types.submodule {
options = {
body = mkOption {
type = types.lines;
description = ''
The completion file's body.
'';
};
};
};
abbrModule = types.submodule { abbrModule = types.submodule {
options = { options = {
expansion = mkOption { expansion = mkOption {
@ -556,6 +567,28 @@ in
<https://fishshell.com/docs/current/cmds/function.html>. <https://fishshell.com/docs/current/cmds/function.html>.
''; '';
}; };
programs.fish.completions = mkOption {
type = with types; attrsOf (either lines completionModule);
default = { };
example = literalExpression ''
{
my-prog = '''
complete -c myprog -s o -l output
''';
my-app = {
body = '''
complete -c myapp -s -v
''';
};
}
'';
description = ''
Custom fish completions. For more information see
<https://fishshell.com/docs/current/completions.html>.
'';
};
}; };
config = mkIf cfg.enable ( config = mkIf cfg.enable (
@ -734,6 +767,20 @@ in
}; };
}) cfg.functions; }) cfg.functions;
} }
{
xdg.configFile = lib.mapAttrs' (name: def: {
name = "fish/completions/${name}.fish";
value = {
source =
let
body = if isAttrs def then def.body else def;
in
fishIndent "${name}.fish" ''
${lib.strings.removeSuffix "\n" body}
'';
};
}) cfg.completions;
}
# Each plugin gets a corresponding conf.d/plugin-NAME.fish file to load # Each plugin gets a corresponding conf.d/plugin-NAME.fish file to load
# in the paths and any initialization scripts. # in the paths and any initialization scripts.

View file

@ -0,0 +1,45 @@
{ lib, pkgs, ... }:
let
myProg = pkgs.writeText "my-prog.fish" ''
complete -c myprog -s o -l output
'';
myApp = pkgs.writeText "my-app.fish" ''
complete -c myapp -s -v
'';
in
{
config = {
programs.fish = {
enable = true;
completions = {
my-prog = ''
complete -c myprog -s o -l output
'';
my-app = {
body = ''
complete -c myapp -s -v
'';
};
};
};
xdg.dataFile."fish/home-manager_generated_completions".source = lib.mkForce (
builtins.toFile "empty" ""
);
nmt = {
description = "if fish.completions is set, check file exists and contents match";
script = ''
assertFileExists home-files/.config/fish/completions/my-prog.fish
echo ${myProg}
assertFileContent home-files/.config/fish/completions/my-prog.fish ${myProg}
assertFileExists home-files/.config/fish/completions/my-app.fish
echo ${myApp}
assertFileContent home-files/.config/fish/completions/my-app.fish ${myApp}
'';
};
};
}

View file

@ -2,6 +2,7 @@
fish-abbrs = ./abbrs.nix; fish-abbrs = ./abbrs.nix;
fish-format-scripts = ./format-scripts.nix; fish-format-scripts = ./format-scripts.nix;
fish-functions = ./functions.nix; fish-functions = ./functions.nix;
fish-completions = ./completions.nix;
fish-no-functions = ./no-functions.nix; fish-no-functions = ./no-functions.nix;
fish-plugins = ./plugins.nix; fish-plugins = ./plugins.nix;
fish-manpage = ./manpage.nix; fish-manpage = ./manpage.nix;