From 849cf3ad1003a6eeb61458859aef97720a858a37 Mon Sep 17 00:00:00 2001 From: Robin Stumm Date: Fri, 8 Sep 2017 18:37:28 +0200 Subject: [PATCH] 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 --- modules/programs/zsh.nix | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/modules/programs/zsh.nix b/modules/programs/zsh.nix index 3ac75db0..c2b48dfa 100644 --- a/modules/programs/zsh.nix +++ b/modules/programs/zsh.nix @@ -41,12 +41,21 @@ let options = { src = mkOption { type = types.path; - description = "Path to the plugin folder. Will be added to fpath and 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."; + description = '' + The name of the plugin. + + Don't forget to add + if the script name does not follow convention. + ''; }; file = mkOption { @@ -148,6 +157,7 @@ in }; } { + name = "enhancd"; file = "init.sh"; src = pkgs.fetchFromGitHub { owner = "b4b4r07"; @@ -201,11 +211,11 @@ in HELPDIR="${pkgs.zsh}/share/zsh/$ZSH_VERSION/help" ${concatStrings (map (plugin: '' - path+="${plugin.src}" - fpath+="${plugin.src}" + path+="$HOME/.zsh/plugins/${plugin.name}" + fpath+="$HOME/.zsh/plugins/${plugin.name}" '') cfg.plugins)} - ${optionalString cfg.enableCompletion "autoload -U compinit && compinit -C"} + ${optionalString cfg.enableCompletion "autoload -U compinit && compinit"} ${optionalString (cfg.enableAutosuggestions) "source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh" } @@ -228,7 +238,7 @@ in ''} ${concatStrings (map (plugin: '' - source "${plugin.src}/${plugin.file}" + source "$HOME/.zsh/plugins/${plugin.name}/${plugin.file}" '') cfg.plugins)} ${aliasesStr} @@ -237,10 +247,20 @@ in ''; }) (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; }) - (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; + + home.file = map (plugin: { + target = ".zsh/plugins/${plugin.name}"; + source = plugin.src; + }) cfg.plugins; }) ]; }