nixos/fish: generate autocompletions from man pages
This commit is contained in:
parent
2e23d727d6
commit
3731835efc
|
@ -169,6 +169,59 @@ in
|
||||||
end
|
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
|
# include programs that bring their own completions
|
||||||
environment.pathsToLink = []
|
environment.pathsToLink = []
|
||||||
++ optional cfg.vendor.config.enable "/share/fish/vendor_conf.d"
|
++ optional cfg.vendor.config.enable "/share/fish/vendor_conf.d"
|
||||||
|
|
11
nixos/modules/programs/fish_completion-generator.patch
Normal file
11
nixos/modules/programs/fish_completion-generator.patch
Normal file
|
@ -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:
|
|
@ -74,6 +74,7 @@ in
|
||||||
ferm = handleTest ./ferm.nix {};
|
ferm = handleTest ./ferm.nix {};
|
||||||
firefox = handleTest ./firefox.nix {};
|
firefox = handleTest ./firefox.nix {};
|
||||||
firewall = handleTest ./firewall.nix {};
|
firewall = handleTest ./firewall.nix {};
|
||||||
|
fish = handleTest ./fish.nix {};
|
||||||
flannel = handleTestOn ["x86_64-linux"] ./flannel.nix {};
|
flannel = handleTestOn ["x86_64-linux"] ./flannel.nix {};
|
||||||
flatpak = handleTest ./flatpak.nix {};
|
flatpak = handleTest ./flatpak.nix {};
|
||||||
fsck = handleTest ./fsck.nix {};
|
fsck = handleTest ./fsck.nix {};
|
||||||
|
|
21
nixos/tests/fish.nix
Normal file
21
nixos/tests/fish.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import ./make-test.nix ({ pkgs, ... }: {
|
||||||
|
name = "fish";
|
||||||
|
|
||||||
|
machine =
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.fish.enable = true;
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
coreutils
|
||||||
|
procps # kill collides with coreutils' to test https://github.com/NixOS/nixpkgs/issues/56432
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript =
|
||||||
|
''
|
||||||
|
$machine->waitForFile("/etc/fish/generated_completions/coreutils.fish");
|
||||||
|
$machine->waitForFile("/etc/fish/generated_completions/kill.fish");
|
||||||
|
$machine->succeed("fish -ic 'echo \$fish_complete_path' | grep -q '/share/fish/completions /etc/fish/generated_completions /root/.local/share/fish/generated_completions\$'");
|
||||||
|
'';
|
||||||
|
})
|
Loading…
Reference in a new issue