diff options
author | Gabriel Ebner <gebner@gebner.org> | 2019-02-28 10:17:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-28 10:17:15 +0100 |
commit | 80812af9e46167e3104038f2af6de251f90823a8 (patch) | |
tree | 2493b2e9bf9381e496ca7c0e8e8e611a1c9981c0 /nixos/modules | |
parent | 7e25fb2e80a737615acda0e9b31bfafbd4c09829 (diff) | |
parent | 3731835efce7c7f746270c01efe4f91bf127be25 (diff) | |
download | nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.tar nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.tar.gz nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.tar.bz2 nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.tar.lz nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.tar.xz nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.tar.zst nixpkgs-80812af9e46167e3104038f2af6de251f90823a8.zip |
Merge pull request #56446 from hyperfekt/fish_generate-completions
nixos/fish: generate autocompletions from man pages
Diffstat (limited to 'nixos/modules')
-rw-r--r-- | nixos/modules/programs/fish.nix | 53 | ||||
-rw-r--r-- | nixos/modules/programs/fish_completion-generator.patch | 11 |
2 files changed, 64 insertions, 0 deletions
diff --git a/nixos/modules/programs/fish.nix b/nixos/modules/programs/fish.nix index b38af07b92c..bcb5a3f341b 100644 --- a/nixos/modules/programs/fish.nix +++ b/nixos/modules/programs/fish.nix @@ -169,6 +169,59 @@ 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 (exclusive) / after (inclusive) 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 + patchedGenerator = pkgs.stdenv.mkDerivation { + name = "fish_patched-completion-generator"; + srcs = [ + "${pkgs.fish}/share/fish/tools/create_manpage_completions.py" + "${pkgs.fish}/share/fish/tools/deroff.py" + ]; + unpackCmd = "cp $curSrc $(basename $curSrc)"; + sourceRoot = "."; + patches = [ ./fish_completion-generator.patch ]; # to prevent collisions of identical completion files + dontBuild = true; + installPhase = '' + mkdir -p $out + cp * $out/ + ''; + preferLocalBuild = true; + allowSubstitutes = false; + }; + generateCompletions = package: pkgs.runCommand + "${package.name}_fish-completions" + ( + { + inherit package; + preferLocalBuild = true; + allowSubstitutes = false; + } + // optionalAttrs (package ? meta.priority) { meta.priority = package.meta.priority; } + ) + '' + mkdir -p $out + if [ -d $package/share/man ]; then + find $package/share/man -type f | xargs ${pkgs.python3.interpreter} ${patchedGenerator}/create_manpage_completions.py --directory $out >/dev/null + fi + ''; + in + pkgs.buildEnv { + name = "system_fish-completions"; + ignoreCollisions = true; + 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" diff --git a/nixos/modules/programs/fish_completion-generator.patch b/nixos/modules/programs/fish_completion-generator.patch new file mode 100644 index 00000000000..a8c797d185a --- /dev/null +++ b/nixos/modules/programs/fish_completion-generator.patch @@ -0,0 +1,11 @@ +--- a/create_manpage_completions.py ++++ b/create_manpage_completions.py +@@ -776,8 +776,6 @@ def parse_manpage_at_path(manpage_path, output_directory): + + built_command_output.insert(0, "# " + CMDNAME) + +- # Output the magic word Autogenerated so we can tell if we can overwrite this +- built_command_output.insert(1, "# Autogenerated from man page " + manpage_path) + # built_command_output.insert(2, "# using " + parser.__class__.__name__) # XXX MISATTRIBUTES THE CULPABILE PARSER! Was really using Type2 but reporting TypeDeroffManParser + + for line in built_command_output: |