zsh: add plugins.*.completions paths to fpath

Autocompletion scripts and additional plugin functions are located in
specific directories that might not match the plugin source script but
need to be included in fpath before calling compinit.

An option to provide a path to these scripts is added to add the paths
to fpath before calling completionInit.
This commit is contained in:
@zimeg 2024-05-26 23:20:04 -07:00
parent 5d151429e1
commit d54b1a072d
3 changed files with 49 additions and 14 deletions

View file

@ -133,19 +133,27 @@ let
type = types.str; type = types.str;
description = '' description = ''
The name of the plugin. The name of the plugin.
Don't forget to add {option}`file`
if the script name does not follow convention.
''; '';
}; };
file = mkOption { file = mkOption {
type = types.str; 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.file = mkDefault "${config.name}.plugin.zsh";
config.completions = mkDefault [];
}); });
ohMyZshModule = types.submodule { ohMyZshModule = types.submodule {
@ -467,16 +475,6 @@ in
default = []; default = [];
example = literalExpression '' 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"; name = "enhancd";
file = "init.sh"; file = "init.sh";
@ -487,6 +485,12 @@ in
sha256 = "0iqa9j09fwm6nj5rpip87x3hnvbbz9w9ajgm6wkrd5fls8fn8i5g"; 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`."; description = "Plugins to source in {file}`.zshrc`.";
@ -598,6 +602,9 @@ in
(concatStrings (map (plugin: '' (concatStrings (map (plugin: ''
path+="$HOME/${pluginsDir}/${plugin.name}" path+="$HOME/${pluginsDir}/${plugin.name}"
fpath+="$HOME/${pluginsDir}/${plugin.name}" fpath+="$HOME/${pluginsDir}/${plugin.name}"
${(optionalString (plugin.completions != []) ''
fpath+=(${concatMapStringsSep " " (completion: "\"$HOME/${pluginsDir}/${plugin.name}/${completion}\"") plugin.completions})
'')}
'') cfg.plugins)) '') cfg.plugins))
'' ''

View file

@ -6,6 +6,7 @@
zsh-history-path-old-custom = ./history-path-old-custom.nix; zsh-history-path-old-custom = ./history-path-old-custom.nix;
zsh-history-ignore-pattern = ./history-ignore-pattern.nix; zsh-history-ignore-pattern = ./history-ignore-pattern.nix;
zsh-history-substring-search = ./history-substring-search.nix; zsh-history-substring-search = ./history-substring-search.nix;
zsh-plugins = ./plugins.nix;
zsh-prezto = ./prezto.nix; zsh-prezto = ./prezto.nix;
zsh-syntax-highlighting = ./syntax-highlighting.nix; zsh-syntax-highlighting = ./syntax-highlighting.nix;
zsh-abbr = ./zsh-abbr.nix; zsh-abbr = ./zsh-abbr.nix;

View file

@ -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")$'
'';
};
}