diff --git a/modules/programs/zsh.nix b/modules/programs/zsh.nix
index be9eb3c7..257e1322 100644
--- a/modules/programs/zsh.nix
+++ b/modules/programs/zsh.nix
@@ -37,6 +37,27 @@ let
};
};
+ pluginModule = types.submodule ({ config, ... }: {
+ options = {
+ src = mkOption {
+ type = types.path;
+ description = "Path to the plugin folder. Will be added to fpath and PATH.";
+ };
+
+ name = mkOption {
+ type = types.str;
+ description = "The name of the plugin. Use instead if the script name does not follow convention.";
+ };
+
+ file = mkOption {
+ type = types.str;
+ description = "The plugin script to source.";
+ };
+ };
+
+ config.file = mkDefault "${config.name}.plugin.zsh";
+ });
+
in
{
@@ -74,7 +95,36 @@ in
initExtra = mkOption {
default = "";
type = types.lines;
- description = "Extra commands that should be added to .zshrc.";
+ description = "Extra commands that should be added to .zshrc.";
+ };
+
+ plugins = mkOption {
+ type = types.listOf pluginModule;
+ default = [];
+ example = literalExample ''
+ [
+ {
+ # will source zsh-autosuggestions.plugin.zsh
+ name = "zsh-autosuggestions";
+ src = pkgs.fetchFromGitHub {
+ owner = "zsh-users";
+ repo = "zsh-autosuggestions";
+ rev = "v0.4.0";
+ sha256 = "0z6i9wjjklb4lvr7zjhbphibsyx51psv50gm07mbb0kj9058j6kc";
+ };
+ }
+ {
+ file = "init.sh";
+ src = pkgs.fetchFromGitHub {
+ owner = "b4b4r07";
+ repo = "enhancd";
+ rev = "v2.2.1";
+ sha256 = "0iqa9j09fwm6nj5rpip87x3hnvbbz9w9ajgm6wkrd5fls8fn8i5g";
+ };
+ }
+ ]
+ '';
+ description = "Plugins to source in .zshrc.";
};
};
};
@@ -109,15 +159,28 @@ in
HELPDIR="${pkgs.zsh}/share/zsh/$ZSH_VERSION/help"
- ${if cfg.enableCompletion then "autoload -U compinit && compinit" else ""}
+ ${concatStrings (map (plugin: ''
+ path+="${plugin.src}"
+ fpath+="${plugin.src}"
+ '') cfg.plugins)}
+
+ ${optionalString cfg.enableCompletion "autoload -U compinit && compinit -C"}
${optionalString (cfg.enableAutosuggestions)
"source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh"
}
+ ${concatStrings (map (plugin: ''
+ source "${plugin.src}/${plugin.file}"
+ '') cfg.plugins)}
+
${aliasesStr}
${cfg.initExtra}
'';
+
+ programs.zsh = mkIf (builtins.length cfg.plugins > 0) {
+ enableCompletion = mkDefault true;
+ };
}
);
}