fish: add plugin functionality
This commit is contained in:
parent
5be9aa417a
commit
b18d302d44
|
@ -14,6 +14,39 @@ let
|
||||||
mapAttrsToList (k: v: "alias ${k}='${v}'") cfg.shellAliases
|
mapAttrsToList (k: v: "alias ${k}='${v}'") cfg.shellAliases
|
||||||
);
|
);
|
||||||
|
|
||||||
|
fileType = types.submodule (
|
||||||
|
{ name, config, ... }: {
|
||||||
|
options = {
|
||||||
|
body = mkOption {
|
||||||
|
default = null;
|
||||||
|
type = types.nullOr types.lines;
|
||||||
|
description = "Body of the function.";
|
||||||
|
};
|
||||||
|
|
||||||
|
source = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
description = ''
|
||||||
|
Path of the source file. The file name must not start
|
||||||
|
with a period.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
source = mkIf (config.body != null) (
|
||||||
|
mkDefault (pkgs.writeTextFile {
|
||||||
|
inherit name;
|
||||||
|
text = ''
|
||||||
|
function ${name}
|
||||||
|
${config.body}
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
executable = true;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -80,9 +113,27 @@ in
|
||||||
type = types.lines;
|
type = types.lines;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
programs.fish.plugins = mkOption {
|
||||||
|
type = types.listOf types.package;
|
||||||
|
default = [];
|
||||||
|
description = ''
|
||||||
|
The plugins to add to fish.
|
||||||
|
Built with <varname>buildFishPlugin</varname>.
|
||||||
|
Overrides manually installed ones.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fish.functions = mkOption {
|
||||||
|
type = types.attrsOf fileType;
|
||||||
|
default = {};
|
||||||
|
description = ''
|
||||||
|
Functions to add to fish.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable (mkMerge [{
|
||||||
home.packages = [ cfg.package ];
|
home.packages = [ cfg.package ];
|
||||||
|
|
||||||
xdg.dataFile."fish/home-manager_generated_completions".source =
|
xdg.dataFile."fish/home-manager_generated_completions".source =
|
||||||
|
@ -187,5 +238,34 @@ in
|
||||||
set -g __fish_interactive_config_sourced 1
|
set -g __fish_interactive_config_sourced 1
|
||||||
end
|
end
|
||||||
'';
|
'';
|
||||||
};
|
} {
|
||||||
|
xdg.configFile = map (n: { target = "fish/functions/${n}.fish"; source = cfg.functions.${n}.source; }) (attrNames cfg.functions);
|
||||||
|
} (
|
||||||
|
let
|
||||||
|
wrappedPkgVersion = lib.getVersion pkgs.fish;
|
||||||
|
wrappedPkgName = lib.removeSuffix "-${wrappedPkgVersion}" pkgs.fish.name;
|
||||||
|
dependencies = concatMap (p: p.dependencies) cfg.plugins;
|
||||||
|
combinedPluginDrv = pkgs.buildEnv {
|
||||||
|
name = "${wrappedPkgName}-plugins-${wrappedPkgVersion}";
|
||||||
|
paths = cfg.plugins;
|
||||||
|
postBuild = ''
|
||||||
|
touch $out/setup.fish
|
||||||
|
|
||||||
|
if [ -d $out/functions ]; then
|
||||||
|
echo "set fish_function_path \$fish_function_path[1] $out/functions \$fish_function_path[2..-1]" >> $out/setup.fish
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d $out/completions ]; then
|
||||||
|
echo "set fish_complete_path \$fish_complete_path[1] $out/completions \$fish_complete_path[2..-1]" >> $out/setup.fish
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d $out/conf.d ]; then
|
||||||
|
echo "source $out/conf.d/*.fish" >> $out/setup.fish
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in mkIf (length cfg.plugins > 0) {
|
||||||
|
xdg.configFile."fish/conf.d/99plugins.fish".source = "${combinedPluginDrv}/setup.fish";
|
||||||
|
home.packages = dependencies;
|
||||||
|
})]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue