bash completion: Cache the list of subcommands and available packages.

* etc/completion/bash/guix (_guix_complete_available_package): Cache the list
  of available packages in '_guix_available_packages' and use it.
  (_guix_complete): Cache the list of subcommands in '_guix_subcommands' and
  use it.
This commit is contained in:
Ludovic Courtès 2015-08-20 19:57:33 +02:00
parent fa96048f0a
commit 4a9999871c

View file

@ -18,15 +18,24 @@
# Bash completion for Guix commands. # Bash completion for Guix commands.
declare _guix_available_packages
_guix_complete_available_package () _guix_complete_available_package ()
{ {
local prefix="$1" local prefix="$1"
local packages="$(${COMP_WORDS[0]} package -A "^$prefix" | cut -f1)" if [ -z "$_guix_available_packages" ]
COMPREPLY=($(compgen -W "$packages" -- "$prefix")) then
# Cache the complete list because it rarely changes and makes
# completion much faster.
_guix_available_packages="$(${COMP_WORDS[0]} package -A | cut -f1)"
fi
COMPREPLY=($(compgen -W "$_guix_available_packages" -- "$prefix"))
} }
_guix_complete_installed_package () _guix_complete_installed_package ()
{ {
# Here we do not cache the list of installed packages because that
# may change over time and the list is relatively small anyway.
local prefix="$1" local prefix="$1"
local packages="$(${COMP_WORDS[0]} package -I "^$prefix" | cut -f1)" local packages="$(${COMP_WORDS[0]} package -I "^$prefix" | cut -f1)"
COMPREPLY=($(compgen -W "$packages" -- "$prefix")) COMPREPLY=($(compgen -W "$packages" -- "$prefix"))
@ -88,6 +97,8 @@ _guix_complete_file ()
COMPREPLY=() COMPREPLY=()
} }
declare _guix_subcommands
_guix_complete () _guix_complete ()
{ {
local word_count=${#COMP_WORDS[*]} local word_count=${#COMP_WORDS[*]}
@ -105,8 +116,12 @@ _guix_complete ()
case $COMP_CWORD in case $COMP_CWORD in
1) 1)
local subcommands="$(guix --help | grep '^ ' | cut -c 2-)" if [ -z "$_guix_subcommands" ]
COMPREPLY=($(compgen -W "$subcommands" -- "$word_at_point")) then
# Cache the list of subcommands to speed things up.
_guix_subcommands="$(guix --help | grep '^ ' | cut -c 2-)"
fi
COMPREPLY=($(compgen -W "$_guix_subcommands" -- "$word_at_point"))
;; ;;
*) *)
if _guix_is_command "package" if _guix_is_command "package"