diff --git a/modules/programs/zsh.nix b/modules/programs/zsh.nix index 3ec73f30..e1c0ec83 100644 --- a/modules/programs/zsh.nix +++ b/modules/programs/zsh.nix @@ -133,19 +133,27 @@ let type = types.str; description = '' The name of the plugin. - - Don't forget to add {option}`file` - if the script name does not follow convention. ''; }; file = mkOption { type = types.str; - description = "The plugin script to source."; + description = '' + The plugin script to source. + + Required if the script name does not match {file}`name.plugin.zsh` + using the plugin {option}`name` from the plugin {option}`src`. + ''; + }; + + completions = mkOption { + type = types.listOf types.str; + description = "Paths of additional functions to add to {env}`fpath`."; }; }; config.file = mkDefault "${config.name}.plugin.zsh"; + config.completions = mkDefault []; }); ohMyZshModule = types.submodule { @@ -467,16 +475,6 @@ in default = []; example = literalExpression '' [ - { - # will source zsh-autosuggestions.plugin.zsh - name = "zsh-autosuggestions"; - src = pkgs.fetchFromGitHub { - owner = "zsh-users"; - repo = "zsh-autosuggestions"; - rev = "v0.4.0"; - sha256 = "0z6i9wjjklb4lvr7zjhbphibsyx51psv50gm07mbb0kj9058j6kc"; - }; - } { name = "enhancd"; file = "init.sh"; @@ -487,6 +485,12 @@ in sha256 = "0iqa9j09fwm6nj5rpip87x3hnvbbz9w9ajgm6wkrd5fls8fn8i5g"; }; } + { + name = "wd"; + src = pkgs.zsh-wd; + file = "share/wd/wd.plugin.zsh"; + completions = [ "share/zsh/site-functions" ]; + } ] ''; description = "Plugins to source in {file}`.zshrc`."; @@ -598,6 +602,9 @@ in (concatStrings (map (plugin: '' path+="$HOME/${pluginsDir}/${plugin.name}" fpath+="$HOME/${pluginsDir}/${plugin.name}" + ${(optionalString (plugin.completions != []) '' + fpath+=(${concatMapStringsSep " " (completion: "\"$HOME/${pluginsDir}/${plugin.name}/${completion}\"") plugin.completions}) + '')} '') cfg.plugins)) '' diff --git a/tests/modules/programs/zsh/default.nix b/tests/modules/programs/zsh/default.nix index 25aa3b47..d667c024 100644 --- a/tests/modules/programs/zsh/default.nix +++ b/tests/modules/programs/zsh/default.nix @@ -6,6 +6,7 @@ zsh-history-path-old-custom = ./history-path-old-custom.nix; zsh-history-ignore-pattern = ./history-ignore-pattern.nix; zsh-history-substring-search = ./history-substring-search.nix; + zsh-plugins = ./plugins.nix; zsh-prezto = ./prezto.nix; zsh-syntax-highlighting = ./syntax-highlighting.nix; zsh-abbr = ./zsh-abbr.nix; diff --git a/tests/modules/programs/zsh/plugins.nix b/tests/modules/programs/zsh/plugins.nix new file mode 100644 index 00000000..3ddc4ceb --- /dev/null +++ b/tests/modules/programs/zsh/plugins.nix @@ -0,0 +1,27 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let mockZshPluginSrc = pkgs.writeText "mockZshPluginSrc" "echo example"; +in { + config = { + programs.zsh = { + enable = true; + plugins = [{ + name = "mockPlugin"; + file = "share/mockPlugin/mockPlugin.plugin.zsh"; + src = mockZshPluginSrc; + completions = + [ "share/zsh/site-functions" "share/zsh/vendor-completions" ]; + }]; + }; + + test.stubs.zsh = { }; + + nmt.script = '' + assertFileRegex home-files/.zshrc '^path+="$HOME/.zsh/plugins/mockPlugin"$' + assertFileRegex home-files/.zshrc '^fpath+="$HOME/.zsh/plugins/mockPlugin"$' + assertFileRegex home-files/.zshrc '^fpath+=("$HOME/.zsh/plugins/mockPlugin/share/zsh/site-functions" "$HOME/.zsh/plugins/mockPlugin/share/zsh/vendor-completions")$' + ''; + }; +}