about summary refs log tree commit diff
path: root/nixos/modules/programs
diff options
context:
space:
mode:
authorhyperfekt <adni.online@gmail.com>2018-12-17 20:12:09 +0100
committerhyperfekt <git@hyperfekt.net>2019-02-25 16:39:04 +0100
commit5cc63776472effb04ad3a472e48e37577243c133 (patch)
tree790a838a154f20b643fad704a8ce5bc0b84a4fdc /nixos/modules/programs
parente0a4d1083f574291f139dc7d1a1307b9c80adff2 (diff)
downloadnixlib-5cc63776472effb04ad3a472e48e37577243c133.tar
nixlib-5cc63776472effb04ad3a472e48e37577243c133.tar.gz
nixlib-5cc63776472effb04ad3a472e48e37577243c133.tar.bz2
nixlib-5cc63776472effb04ad3a472e48e37577243c133.tar.lz
nixlib-5cc63776472effb04ad3a472e48e37577243c133.tar.xz
nixlib-5cc63776472effb04ad3a472e48e37577243c133.tar.zst
nixlib-5cc63776472effb04ad3a472e48e37577243c133.zip
nixos/fish: generate autocompletions from man pages
Diffstat (limited to 'nixos/modules/programs')
-rw-r--r--nixos/modules/programs/fish.nix37
1 files changed, 37 insertions, 0 deletions
diff --git a/nixos/modules/programs/fish.nix b/nixos/modules/programs/fish.nix
index b38af07b92c3..03d6c26c8c87 100644
--- a/nixos/modules/programs/fish.nix
+++ b/nixos/modules/programs/fish.nix
@@ -169,6 +169,43 @@ in
       end
     '';
 
+    programs.fish.interactiveShellInit = ''
+      # add completions generated by NixOS to $fish_complete_path
+      begin
+        # joins with null byte to acommodate all characters in paths, then respectively gets all paths before / after the first one including "generated_completions",
+        # splits by null byte, and then removes all empty lines produced by using 'string'
+        set -l prev (string join0 $fish_complete_path | string match --regex "^.*?(?=\x00[^\x00]*generated_completions.*)" | string split0 | string match -er ".")
+        set -l post (string join0 $fish_complete_path | string match --regex "[^\x00]*generated_completions.*" | string split0 | string match -er ".")
+        set fish_complete_path $prev "/etc/fish/generated_completions" $post
+      end
+    '';
+
+    environment.etc."fish/generated_completions".source =
+      let
+        generateCompletions = package: pkgs.runCommand
+          "${package.name}-fish-completions"
+          (
+            {
+              src = package;
+              nativeBuildInputs = [ pkgs.python3 ];
+              buildInputs = [ pkgs.fish ];
+              preferLocalBuild = true;
+              allowSubstitutes = false;
+            }
+            // optionalAttrs (package ? meta.priority) { meta.priority = package.meta.priority; }
+          )
+          ''
+            mkdir -p $out
+            if [ -d $src/share/man ]; then
+              find $src/share/man -type f | xargs python ${pkgs.fish}/share/fish/tools/create_manpage_completions.py --directory $out >/dev/null
+            fi
+          '';
+      in
+        pkgs.buildEnv {
+          name = "system-fish-completions";
+          paths = map generateCompletions config.environment.systemPackages;
+        };
+
     # include programs that bring their own completions
     environment.pathsToLink = []
       ++ optional cfg.vendor.config.enable "/share/fish/vendor_conf.d"