[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
02/07: bash completion: Really support subcommands.
From: |
guix-commits |
Subject: |
02/07: bash completion: Really support subcommands. |
Date: |
Wed, 16 Jun 2021 06:14:39 -0400 (EDT) |
nckx pushed a commit to branch master
in repository guix.
commit 80a17aae7991c6df061a98bb71734485f4ca17e2
Author: Tobias Geerinckx-Rice <me@tobias.gr>
AuthorDate: Mon Jun 14 10:44:07 2021 +0200
bash completion: Really support subcommands.
* etc/completion/bash/guix (_guix_is_option): New function.
(_guix_is_command): Remove function to replace it with simple string
comparison…
(_guix_complete): …here. Complete the ‘innermost’ command at point.
---
etc/completion/bash/guix | 97 ++++++++++++++++++++++++++++++------------------
1 file changed, 61 insertions(+), 36 deletions(-)
diff --git a/etc/completion/bash/guix b/etc/completion/bash/guix
index 26480e5..2b0ec56 100644
--- a/etc/completion/bash/guix
+++ b/etc/completion/bash/guix
@@ -1,5 +1,6 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2021 Tobias Geerinck-Rice <me@tobias.gr>
#
# This file is part of GNU Guix.
#
@@ -80,19 +81,16 @@ _guix_complete_option ()
COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[${#COMP_WORDS[*]} -
1]}"))
}
-_guix_is_command ()
+_guix_is_option ()
{
- local word
- local result="false"
- for word in ${COMP_WORDS[*]}
- do
- if [ "$word" = "$1" ]
- then
- result=true
- break
- fi
- done
- $result
+ case "$1" in
+ -*)
+ true
+ ;;
+ *)
+ false
+ ;;
+ esac
}
_guix_is_removing ()
@@ -183,22 +181,43 @@ _guix_complete ()
local word_count=${#COMP_WORDS[*]}
local word_at_point="${COMP_WORDS[$COMP_CWORD]}"
- if [ "$COMP_CWORD" -gt 1 ]
- then
- case "$word_at_point" in
- -*)
- _guix_complete_option "$word_at_point"
- return
- ;;
- esac
- fi
+ # Find the innermost command at point, e.g. "build" in the case of
+ # "guix time-machine OPTIONS -- build<Tab>" -- but "time-machine" if
+ # point is moved before "build".
+ local command_index=0
+ local command
+ local word_index=0
+ local word
+ local expect_command="true"
+ while [[ $((++word_index)) -le COMP_CWORD ]]
+ do
+ word="${COMP_WORDS[$word_index]}"
+ if $expect_command
+ then
+ command_index=$word_index
+ command="$word"
+ expect_command="false"
+ continue
+ fi
+ if [[ "$word" = "--" ]]
+ then
+ case "$command" in
+ environment)
+ break
+ ;;
+ time-machine)
+ expect_command="true"
+ ;;
+ esac
+ fi
+ done
case $COMP_CWORD in
- 1)
+ $command_index)
_guix_complete_command
;;
*)
- if _guix_is_command "package"
+ if [[ "$command" = "package" ]]
then
if _guix_is_dash_L || _guix_is_dash_m || _guix_is_dash_p ||
_guix_is_dash_f
then
@@ -209,7 +228,7 @@ _guix_complete ()
else
_guix_complete_available_package "$word_at_point"
fi
- elif _guix_is_command "install"
+ elif [[ "$command" = "install" ]]
then
if _guix_is_dash_L || _guix_is_dash_m || _guix_is_dash_p
then
@@ -217,7 +236,7 @@ _guix_complete ()
else
_guix_complete_available_package "$word_at_point"
fi
- elif _guix_is_command "remove"
+ elif [[ "$command" = "remove" ]]
then
if _guix_is_dash_L || _guix_is_dash_m || _guix_is_dash_p
then
@@ -225,7 +244,7 @@ _guix_complete ()
else
_guix_complete_installed_package "$word_at_point"
fi
- elif _guix_is_command "upgrade"
+ elif [[ "$command" = "upgrade" ]]
then
if _guix_is_dash_L || _guix_is_dash_m || _guix_is_dash_p
then
@@ -233,7 +252,7 @@ _guix_complete ()
else
_guix_complete_installed_package "$word_at_point"
fi
- elif _guix_is_command "build"
+ elif [[ "$command" = "build" ]]
then
if _guix_is_dash_L || _guix_is_dash_m || _guix_is_dash_f
then
@@ -241,7 +260,7 @@ _guix_complete ()
else
_guix_complete_available_package "$word_at_point"
fi
- elif _guix_is_command "environment"
+ elif [[ "$command" = "environment" ]]
then
if _guix_is_dash_L || _guix_is_dash_m || _guix_is_dash_p ||
_guix_is_dash_l
then
@@ -249,22 +268,22 @@ _guix_complete ()
else
_guix_complete_available_package "$word_at_point"
fi
- elif _guix_is_command "download"
+ elif [[ "$command" = "download" ]]
then
_guix_complete_file
- elif _guix_is_command "system"
+ elif [[ "$command" = "system" ]]
then
case $COMP_CWORD in
2) _guix_complete_subcommand;;
*) _guix_complete_file;; # TODO: restrict to *.scm
esac
- elif _guix_is_command "pull"
+ elif [[ "$command" = "pull" ]]
then
if _guix_is_dash_C || _guix_is_dash_p
then
_guix_complete_file
fi
- elif _guix_is_command "time-machine"
+ elif [[ "$command" = "time-machine" ]]
then
if _guix_is_dash_C
then
@@ -272,20 +291,20 @@ _guix_complete ()
else
_guix_complete_command
fi
- elif _guix_is_command "container"
+ elif [[ "$command" = "container" ]]
then
case $COMP_CWORD in
2) _guix_complete_subcommand;;
3) _guix_complete_pid "$word_at_point";;
*) _guix_complete_file;;
esac
- elif _guix_is_command "import"
+ elif [[ "$command" = "import" ]]
then
_guix_complete_subcommand
- elif _guix_is_command "hash" || _guix_is_command "gc"
+ elif [[ "$command" = "hash" || "$command" = "gc" ]]
then
_guix_complete_file
- elif _guix_is_command "weather"
+ elif [[ "$command" = "weather" ]]
then
if _guix_is_dash_m
then
@@ -296,6 +315,12 @@ _guix_complete ()
fi
;;
esac
+
+ if [[ -z "$COMPREPLY" && COMP_CWORD -gt command_index ]] &&
+ _guix_is_option "$word_at_point"
+ then
+ _guix_complete_option
+ fi
}
complete -F _guix_complete guix
- branch master updated (72a5095 -> 111521d), guix-commits, 2021/06/16
- 01/07: gnu: bash-completion: Look in user directories first., guix-commits, 2021/06/16
- 02/07: bash completion: Really support subcommands.,
guix-commits <=
- 03/07: bash completion: Complete options for the right command., guix-commits, 2021/06/16
- 04/07: bash_completion: Complete options for ‘guix environment’., guix-commits, 2021/06/16
- 05/07: gnu: Respect ‘rootdelay’ kernel command-line argument., guix-commits, 2021/06/16
- 07/07: gnu: epson-inkjet-printer-escpr: Update to 1.7.11., guix-commits, 2021/06/16
- 06/07: gnu: cryptsetup: Update LUKS2 comment., guix-commits, 2021/06/16