summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--etc/completion/bash/guix28
1 files changed, 21 insertions, 7 deletions
diff --git a/etc/completion/bash/guix b/etc/completion/bash/guix
index b38c319cce..c92f8915c9 100644
--- a/etc/completion/bash/guix
+++ b/etc/completion/bash/guix
@@ -20,6 +20,15 @@
 
 declare _guix_available_packages
 
+_guix_complete_subcommand ()
+{
+    local command="${COMP_WORDS[1]}"
+    local subcommands="$(${COMP_WORDS[0]} $command --help 2> /dev/null \
+                         | grep '^   [a-z]' \
+                         | sed -e's/^ \+\([a-z-]\+\).*$/\1/g')"
+    COMPREPLY=($(compgen -W "$subcommands" -- "${COMP_WORDS[${#COMP_WORDS[*]} - 1]}"))
+}
+
 _guix_complete_available_package ()
 {
     local prefix="$1"
@@ -45,11 +54,16 @@ _guix_complete_installed_package ()
 
 _guix_complete_option ()
 {
-    local options="$(${COMP_WORDS[0]} ${COMP_WORDS[1]} --help 2> /dev/null \
+    local subcommand
+    case "${COMP_WORDS[2]}" in
+	-*)     subcommand="";;
+	[a-z]*) subcommand="${COMP_WORDS[2]}";;
+    esac
+    local options="$(${COMP_WORDS[0]} ${COMP_WORDS[1]} $subcommand --help 2> /dev/null \
                             | grep '^  \+-' \
                             | sed -e's/^.*--\([a-zA-Z0-9_-]\+\)\(=\?\).*/--\1\2/g')"
     compopt -o nospace
-    COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[$word_count - 1]}"))
+    COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[${#COMP_WORDS[*]} - 1]}"))
 }
 
 _guix_is_command ()
@@ -140,13 +154,13 @@ _guix_complete ()
 		fi
 	    elif _guix_is_command "system"
 	    then
-		_guix_complete_file # TODO: complete sub-commands
-	    elif _guix_is_command "hash"
+		_guix_complete_subcommand
+	    elif _guix_is_command "import"
 	    then
-		 _guix_complete_file
-	    elif _guix_is_command "import" # TODO: complete sub-commands
+		_guix_complete_subcommand
+	    elif _guix_is_command "hash"
 	    then
-		 _guix_complete_file
+		_guix_complete_file
 	    else
 		_guix_complete_available_package "$word_at_point"
 	    fi