From 069512d14a78849f09487590ad17085fce3d1b43 Mon Sep 17 00:00:00 2001 From: Rishvic Pushpakaran <40887886+rishvic@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:23:03 +0530 Subject: [PATCH] feat(gitignore): add caching to `gi` completion (#13735) Adds a cache policy for the `gi` command completion function, i.e. `_gitignoreio`. Previously, every completion call would request the list endpoint of gitignore.io over the network, resulting in a delay between pressing and the autocomplete options showing up. Since we don't expect the gitignore.io templates to change that frequently, configured the cache policy to expire after 7 days. Signed-off-by: Rishvic Pushpakaran Co-authored-by: Carlo Sala --- plugins/gitignore/gitignore.plugin.zsh | 44 +++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/plugins/gitignore/gitignore.plugin.zsh b/plugins/gitignore/gitignore.plugin.zsh index a9f3f6453..1823615f5 100644 --- a/plugins/gitignore/gitignore.plugin.zsh +++ b/plugins/gitignore/gitignore.plugin.zsh @@ -10,12 +10,48 @@ function gi() { } _gitignoreio_get_command_list() { + setopt local_options pipe_fail _gi_curl "list" | tr "," "\n" } -_gitignoreio () { - compset -P '*,' - compadd -S '' $(_gitignoreio_get_command_list) +__gitignoreio_caching_policy() { + local -a oldp + oldp=("$1"(Nm+7)) + (($#oldp)) } -compdef _gitignoreio gi \ No newline at end of file +_gitignoreio_retrieve_stale_cache() { + zstyle -t ":completion:${curcontext}:" use-cache || return 1 + + local cache_dir + zstyle -s ":completion:${curcontext}:" cache-path cache_dir + : ${cache_dir:=${ZDOTDIR:-$HOME}/.zcompcache} + + [[ -e "$cache_dir/gi-list" ]] || return 1 + . "$cache_dir/gi-list" +} + +_gitignoreio() { + compset -P '*,' + + local cache_policy + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy __gitignoreio_caching_policy + fi + + local -a _gi_list + if _cache_invalid gi-list || ! _retrieve_cache gi-list; then + local command_list + if command_list="$(_gitignoreio_get_command_list)" && [[ -n "$command_list" ]]; then + _gi_list=(${(f)command_list}) + _store_cache gi-list _gi_list + else + _gitignoreio_retrieve_stale_cache + fi + fi + + compadd -S '' -a _gi_list +} + +compdef _gitignoreio gi