mirror of
https://github.com/nix-community/home-manager.git
synced 2025-03-18 14:28:15 +00:00
Can generate the config without installing application through home-manager. Helpful when a package is broken (or not provided) on a specific platform through nixpkgs and needs to be installed through other means but you still can benefit from the declarative configuration.
99 lines
3.1 KiB
Nix
99 lines
3.1 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
let
|
|
inherit (lib)
|
|
types mkIf mkOption mkEnableOption mkPackageOption literalExpression;
|
|
|
|
cfg = config.programs.xplr;
|
|
|
|
initialConfig = ''
|
|
version = '${cfg.package.version}'
|
|
'';
|
|
|
|
# If `value` is a Nix store path, create the symlink `/nix/store/newhash/${name}/*`
|
|
# to `/nix/store/oldhash/*` and returns `/nix/store/newhash`.
|
|
wrapPlugin = name: value:
|
|
if lib.isStorePath value then
|
|
pkgs.symlinkJoin {
|
|
name = name;
|
|
paths = [ value ];
|
|
postBuild = ''
|
|
mkdir '${name}'
|
|
mv $out/* '${name}/'
|
|
mv '${name}' $out/
|
|
'';
|
|
}
|
|
else
|
|
builtins.dirOf value;
|
|
|
|
makePluginSearchPath = p: "${p}/?/init.lua;${p}/?.lua";
|
|
|
|
pluginPath = if cfg.plugins != { } then
|
|
let
|
|
wrappedPlugins = lib.mapAttrsToList wrapPlugin cfg.plugins;
|
|
searchPaths = map makePluginSearchPath wrappedPlugins;
|
|
pluginSearchPath = lib.concatStringsSep ";" searchPaths;
|
|
in (''
|
|
package.path = "${pluginSearchPath};" .. package.path
|
|
'')
|
|
else
|
|
"\n";
|
|
|
|
# We provide a default version line within the configuration file, which is
|
|
# obtained from the package's attributes. Merge the initial configFile, a
|
|
# mapped list of plugins and then the user defined configuration to obtain
|
|
# the final configuration.
|
|
configFile = initialConfig + pluginPath + cfg.extraConfig;
|
|
in {
|
|
meta.maintainers = [ lib.maintainers.NotAShelf ];
|
|
|
|
options.programs.xplr = {
|
|
enable = mkEnableOption "xplr, terminal UI based file explorer";
|
|
|
|
package = mkPackageOption pkgs "xplr" { nullable = true; };
|
|
|
|
plugins = mkOption {
|
|
type = with types; nullOr (attrsOf (either package str));
|
|
default = { };
|
|
defaultText = literalExpression "{ }";
|
|
description = ''
|
|
An attribute set of plugin paths to be added to the [package.path]<https://www.lua.org/manual/5.4/manual.html#pdf-package.path> of the {file}`~/config/xplr/init.lua` configuration file.
|
|
|
|
Must be a package or string representing the plugin directory's path.
|
|
If the path string is not absolute, it will be relative to {file}`$XDG_CONFIG_HOME/xplr/init.lua`.
|
|
'';
|
|
example = literalExpression ''
|
|
{
|
|
wl-clipboard = fetchFromGitHub {
|
|
owner = "sayanarijit";
|
|
repo = "wl-clipboard.xplr";
|
|
rev = "a3ffc87460c5c7f560bffea689487ae14b36d9c3";
|
|
hash = "sha256-I4rh5Zks9hiXozBiPDuRdHwW5I7ppzEpQNtirY0Lcks=";
|
|
}
|
|
local-plugin = "/home/user/.config/plugins/local-plugin";
|
|
};
|
|
'';
|
|
};
|
|
|
|
extraConfig = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
example = literalExpression ''
|
|
require("wl-clipboard").setup {
|
|
copy_command = "wl-copy -t text/uri-list",
|
|
paste_command = "wl-paste",
|
|
keep_selection = true,
|
|
}
|
|
'';
|
|
description = ''
|
|
Extra xplr configuration.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
home.packages = lib.mkIf (cfg.package != null) [ cfg.package ];
|
|
|
|
xdg.configFile."xplr/init.lua".source =
|
|
pkgs.writeText "init.lua" configFile;
|
|
};
|
|
}
|