1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

zsh/plugins: optimize plugin loading with array-based loops

Replace individual plugin PATH/fpath statements and conditional sourcing with
efficient array-based loops. Use lib.hm.zsh.define for consistent array
formatting and add unset statements to clean up temporary variables.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
Austin Horstman 2025-09-26 16:45:37 -05:00
parent bd81c11eb3
commit c26a2ac2e4
4 changed files with 116 additions and 29 deletions

View file

@ -102,31 +102,43 @@ in
initContent = lib.mkMerge [ initContent = lib.mkMerge [
(lib.mkOrder 560 ( (lib.mkOrder 560 (
lib.concatStrings ( let
map (plugin: '' pluginNames = map (plugin: plugin.name) cfg.plugins;
path+="${pluginsDir}/${plugin.name}" completionPaths = lib.flatten (
fpath+="${pluginsDir}/${plugin.name}" map (plugin: map (completion: "${plugin.name}/${completion}") plugin.completions) cfg.plugins
${ );
(lib.optionalString (plugin.completions != [ ]) '' in
fpath+=(${ ''
lib.concatMapStringsSep " " ( # Add plugin directories to PATH and fpath
completion: "\"${pluginsDir}/${plugin.name}/${completion}\"" ${lib.hm.zsh.define "plugin_dirs" pluginNames}
) plugin.completions for plugin_dir in "''${plugin_dirs[@]}"; do
}) path+="${pluginsDir}/$plugin_dir"
'') fpath+="${pluginsDir}/$plugin_dir"
} done
'') cfg.plugins unset plugin_dir plugin_dirs
) ${lib.optionalString (completionPaths != [ ]) ''
# Add completion paths to fpath
${lib.hm.zsh.define "completion_paths" completionPaths}
for completion_path in "''${completion_paths[@]}"; do
fpath+="${pluginsDir}/$completion_path"
done
unset completion_path completion_paths
''}
''
)) ))
(lib.mkOrder 900 ( (lib.mkOrder 900 (
lib.concatStrings ( let
map (plugin: '' pluginPaths = map (plugin: "${plugin.name}/${plugin.file}") cfg.plugins;
if [[ -f "${pluginsDir}/${plugin.name}/${plugin.file}" ]]; then in
source "${pluginsDir}/${plugin.name}/${plugin.file}" ''
fi # Source plugins
'') cfg.plugins ${lib.hm.zsh.define "plugins" pluginPaths}
) for plugin in "''${plugins[@]}"; do
[[ -f "${pluginsDir}/$plugin" ]] && source "${pluginsDir}/$plugin"
done
unset plugin plugins
''
)) ))
]; ];
}; };

View file

@ -0,0 +1,57 @@
typeset -U path cdpath fpath manpath
for profile in ${(z)NIX_PROFILES}; do
fpath+=($profile/share/zsh/site-functions $profile/share/zsh/$ZSH_VERSION/functions $profile/share/zsh/vendor-completions)
done
HELPDIR="@zsh@/share/zsh/$ZSH_VERSION/help"
autoload -U compinit && compinit
# History options should be set in .zshrc and after oh-my-zsh sourcing.
# See https://github.com/nix-community/home-manager/issues/177.
HISTSIZE="10000"
SAVEHIST="10000"
HISTFILE="/home/hm-user/.zsh_history"
mkdir -p "$(dirname "$HISTFILE")"
setopt HIST_FCNTL_LOCK
# Enabled history options
enabled_opts=(
HIST_IGNORE_DUPS HIST_IGNORE_SPACE SHARE_HISTORY
)
for opt in "${enabled_opts[@]}"; do
setopt "$opt"
done
unset opt enabled_opts
# Disabled history options
disabled_opts=(
APPEND_HISTORY EXTENDED_HISTORY HIST_EXPIRE_DUPS_FIRST HIST_FIND_NO_DUPS
HIST_IGNORE_ALL_DUPS HIST_SAVE_NO_DUPS
)
for opt in "${disabled_opts[@]}"; do
unsetopt "$opt"
done
unset opt disabled_opts
source @zsh-history-substring-search@/share/zsh-history-substring-search/zsh-history-substring-search.zsh
# Bind search up keys
search_up_keys=(
'^[[A' '\eOA'
)
for key in "${search_up_keys[@]}"; do
bindkey "$key" history-substring-search-up
done
unset key search_up_keys
# Bind search down keys
search_down_keys=(
'^[[B'
)
for key in "${search_down_keys[@]}"; do
bindkey "$key" history-substring-search-down
done
unset key search_down_keys

View file

@ -11,10 +11,8 @@
}; };
}; };
# Written with regex to ensure we don't end up missing newlines in the future
nmt.script = '' nmt.script = ''
assertFileRegex home-files/.zshrc "^bindkey \"\^\[\[B\" history-substring-search-down$" assertFileExists home-files/.zshrc
assertFileRegex home-files/.zshrc "^bindkey \"\^\[\[A\" history-substring-search-up$" assertFileContent $(normalizeStorePaths home-files/.zshrc) ${./history-substring-search-expected.zshrc}
assertFileRegex home-files/.zshrc "^bindkey \"\\\\eOA\" history-substring-search-up$"
''; '';
} }

View file

@ -23,9 +23,29 @@ in
test.stubs.zsh = { }; test.stubs.zsh = { };
nmt.script = '' nmt.script = ''
assertFileRegex home-files/.zshrc '^path+="/home/hm-user/.zsh/plugins/mockPlugin"$' # Test the plugin directories loop structure
assertFileRegex home-files/.zshrc '^fpath+="/home/hm-user/.zsh/plugins/mockPlugin"$' assertFileContains home-files/.zshrc '# Add plugin directories to PATH and fpath'
assertFileRegex home-files/.zshrc '^fpath+=("/home/hm-user/.zsh/plugins/mockPlugin/share/zsh/site-functions" "/home/hm-user/.zsh/plugins/mockPlugin/share/zsh/vendor-completions")$' assertFileContains home-files/.zshrc 'plugin_dirs=('
assertFileContains home-files/.zshrc 'mockPlugin'
assertFileContains home-files/.zshrc 'for plugin_dir in "''${plugin_dirs[@]}"; do'
assertFileContains home-files/.zshrc 'path+="/home/hm-user/.zsh/plugins/$plugin_dir"'
assertFileContains home-files/.zshrc 'fpath+="/home/hm-user/.zsh/plugins/$plugin_dir"'
# Test the completion paths loop structure
assertFileContains home-files/.zshrc '# Add completion paths to fpath'
assertFileContains home-files/.zshrc 'completion_paths=('
assertFileContains home-files/.zshrc 'mockPlugin/share/zsh/site-functions'
assertFileContains home-files/.zshrc 'mockPlugin/share/zsh/vendor-completions'
assertFileContains home-files/.zshrc 'for completion_path in "''${completion_paths[@]}"; do'
assertFileContains home-files/.zshrc 'fpath+="/home/hm-user/.zsh/plugins/$completion_path"'
# Test the plugin loading structure
assertFileContains home-files/.zshrc '# Source plugins'
assertFileContains home-files/.zshrc 'plugins=('
assertFileContains home-files/.zshrc 'mockPlugin/share/mockPlugin/mockPlugin.plugin.zsh'
assertFileContains home-files/.zshrc 'for plugin in "''${plugins[@]}"; do'
assertFileContains home-files/.zshrc '[[ -f "/home/hm-user/.zsh/plugins/$plugin" ]] && source "/home/hm-user/.zsh/plugins/$plugin"'
assertFileContains home-files/.zshrc 'done'
''; '';
}; };
} }