diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix index 73691d5fb..e0ab728eb 100644 --- a/modules/programs/fish.nix +++ b/modules/programs/fish.nix @@ -408,7 +408,35 @@ in { config = mkIf cfg.enable (mkMerge [ { home.packages = [ cfg.package ]; } - (mkIf cfg.generateCompletions { + (mkIf cfg.generateCompletions (let + generateCompletions = let + getName = attrs: + attrs.name or "${attrs.pname or "«pname-missing»"}-${ + attrs.version or "«version-missing»" + }"; + in package: + pkgs.runCommand "${getName package}-fish-completions" { + srcs = [ package ] ++ filter (p: p != null) + (builtins.map (outName: package.${outName} or null) + config.home.extraOutputsToInstall); + nativeBuildInputs = [ pkgs.python3 ]; + buildInputs = [ cfg.package ]; + preferLocalBuild = true; + } '' + mkdir -p $out + for src in $srcs; do + if [ -d $src/share/man ]; then + find -L $src/share/man -type f \ + | xargs python ${cfg.package}/share/fish/tools/create_manpage_completions.py --directory $out \ + > /dev/null + fi + done + ''; + + allCompletions = + let cmp = (a: b: (a.meta.priority or 0) > (b.meta.priority or 0)); + in map generateCompletions (sort cmp config.home.packages); + in { # Support completion for `man` by building a cache for `apropos`. programs.man.generateCaches = mkDefault true; @@ -431,36 +459,16 @@ in { ${postBuild} ''; - generateCompletions = let - getName = attrs: - attrs.name or "${attrs.pname or "«pname-missing»"}-${ - attrs.version or "«version-missing»" - }"; - in package: - pkgs.runCommand "${getName package}-fish-completions" { - srcs = [ package ] ++ filter (p: p != null) - (builtins.map (outName: package.${outName} or null) - config.home.extraOutputsToInstall); - nativeBuildInputs = [ pkgs.python3 ]; - buildInputs = [ cfg.package ]; - preferLocalBuild = true; - } '' - mkdir -p $out - for src in $srcs; do - if [ -d $src/share/man ]; then - find -L $src/share/man -type f \ - | xargs python ${cfg.package}/share/fish/tools/create_manpage_completions.py --directory $out \ - > /dev/null - fi - done - ''; in destructiveSymlinkJoin { name = "${config.home.username}-fish-completions"; - paths = - let cmp = (a: b: (a.meta.priority or 0) > (b.meta.priority or 0)); - in map generateCompletions (sort cmp config.home.packages); + paths = allCompletions; }; + # For packages with no Fish completions, generateCompletions will build an empty directory, + # which means they will not be in our runtime closure. Force a dependency so these do not get + # constantly rebuilt. + home.extraDependencies = allCompletions; + programs.fish.interactiveShellInit = '' # add completions generated by Home Manager to $fish_complete_path begin @@ -472,7 +480,7 @@ in { set fish_complete_path $prev "${config.xdg.dataHome}/fish/home-manager_generated_completions" $post end ''; - }) + })) { xdg.configFile."fish/config.fish".source = fishIndent "config.fish" ''