zsh: link plugins in home directory

In case `compinit` is called from within oh-my-zsh, this passes the security check.

Also allows us to call `compinit` without `-C` for vanilla plugins.

see https://github.com/rycee/home-manager/pull/56#issuecomment-328057513
This commit is contained in:
Robin Stumm 2017-09-08 18:37:28 +02:00
parent 76681a9591
commit 849cf3ad10
No known key found for this signature in database
GPG key ID: 3DA3D7B8285FBE55

View file

@ -41,12 +41,21 @@ let
options = { options = {
src = mkOption { src = mkOption {
type = types.path; type = types.path;
description = "Path to the plugin folder. Will be added to <envar>fpath</envar> and <envar>PATH</envar>."; description = ''
Path to the plugin folder.
Will be added to <envar>fpath</envar> and <envar>PATH</envar>.
'';
}; };
name = mkOption { name = mkOption {
type = types.str; type = types.str;
description = "The name of the plugin. Use <option>file</option> instead if the script name does not follow convention."; description = ''
The name of the plugin.
Don't forget to add <option>file</option>
if the script name does not follow convention.
'';
}; };
file = mkOption { file = mkOption {
@ -148,6 +157,7 @@ in
}; };
} }
{ {
name = "enhancd";
file = "init.sh"; file = "init.sh";
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
owner = "b4b4r07"; owner = "b4b4r07";
@ -201,11 +211,11 @@ in
HELPDIR="${pkgs.zsh}/share/zsh/$ZSH_VERSION/help" HELPDIR="${pkgs.zsh}/share/zsh/$ZSH_VERSION/help"
${concatStrings (map (plugin: '' ${concatStrings (map (plugin: ''
path+="${plugin.src}" path+="$HOME/.zsh/plugins/${plugin.name}"
fpath+="${plugin.src}" fpath+="$HOME/.zsh/plugins/${plugin.name}"
'') cfg.plugins)} '') cfg.plugins)}
${optionalString cfg.enableCompletion "autoload -U compinit && compinit -C"} ${optionalString cfg.enableCompletion "autoload -U compinit && compinit"}
${optionalString (cfg.enableAutosuggestions) ${optionalString (cfg.enableAutosuggestions)
"source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh" "source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh"
} }
@ -228,7 +238,7 @@ in
''} ''}
${concatStrings (map (plugin: '' ${concatStrings (map (plugin: ''
source "${plugin.src}/${plugin.file}" source "$HOME/.zsh/plugins/${plugin.name}/${plugin.file}"
'') cfg.plugins)} '') cfg.plugins)}
${aliasesStr} ${aliasesStr}
@ -237,10 +247,20 @@ in
''; '';
}) })
(mkIf cfg.oh-my-zsh.enable { (mkIf cfg.oh-my-zsh.enable {
# Oh-My-Zsh calls compinit already,
# calling it twice causes significant slowdown
# as all $fpath entries will be traversed again.
programs.zsh.enableCompletion = mkForce false; programs.zsh.enableCompletion = mkForce false;
}) })
(mkIf (builtins.length cfg.plugins > 0) { (mkIf (cfg.plugins != []) {
# Many plugins require compinit to be called
# but allow the user to opt out.
programs.zsh.enableCompletion = mkDefault true; programs.zsh.enableCompletion = mkDefault true;
home.file = map (plugin: {
target = ".zsh/plugins/${plugin.name}";
source = plugin.src;
}) cfg.plugins;
}) })
]; ];
} }