zsh: add plugins.*.completions paths to fpath (#7197)

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.

Co-authored-by: @zimeg <zim@o526.net>
This commit is contained in:
Austin Horstman 2025-06-05 21:11:35 -05:00 committed by GitHub
parent 68cc9eeb38
commit de8463dd3e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 58 additions and 14 deletions

View file

@ -183,15 +183,22 @@ in
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 {
default = [ ];
type = types.listOf types.str;
description = "Paths of additional functions to add to {env}`fpath`.";
};
};
@ -605,16 +612,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";
@ -625,6 +622,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`.";
@ -773,6 +776,15 @@ in
map (plugin: ''
path+="$HOME/${pluginsDir}/${plugin.name}"
fpath+="$HOME/${pluginsDir}/${plugin.name}"
${
(optionalString (plugin.completions != [ ]) ''
fpath+=(${
lib.concatMapStringsSep " " (
completion: "\"$HOME/${pluginsDir}/${plugin.name}/${completion}\""
) plugin.completions
})
'')
}
'') cfg.plugins
)
)

View file

@ -7,6 +7,7 @@
zsh-history-path-old-custom = ./history-path-old-custom.nix;
zsh-history-path-old-default = ./history-path-old-default.nix;
zsh-history-substring-search = ./history-substring-search.nix;
zsh-plugins = ./plugins.nix;
zsh-prezto = ./prezto.nix;
zsh-session-variables = ./session-variables.nix;
zsh-syntax-highlighting = ./syntax-highlighting.nix;

View file

@ -0,0 +1,31 @@
{ pkgs, ... }:
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")$'
'';
};
}