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; + }; } ); }