[pve-devel] [PATCH pve-common] command line completion: complete fully specified sub commands

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Jun 7 11:58:23 CEST 2018


This won't work for sub-commands we have in pveum now (in git, not yet
packaged).
I'm sending an alternative version with a longer description.

On Thu, Jun 07, 2018 at 09:09:09AM +0200, Dietmar Maurer wrote:
> This handles the following case (example): "pvesm add"
> 
> Command 'add' is detected as sub command, so this completes
> to "pvesm add " (added space).
> 
> Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
> ---
>  src/PVE/CLIHandler.pm | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm
> index 222051d..389f8bd 100644
> --- a/src/PVE/CLIHandler.pm
> +++ b/src/PVE/CLIHandler.pm
> @@ -299,6 +299,8 @@ my $print_bash_completion = sub {
>      return if !defined($ENV{COMP_POINT});
>  
>      my $cmdline = substr($ENV{COMP_LINE}, 0, $ENV{COMP_POINT});
> +    my $ends_with_space = $cmdline =~ m/\s+$/ ? 1 : 0;
> +
>      print STDERR "\nCMDLINE: $ENV{COMP_LINE}\n" if $debug;
>  
>      my $args = PVE::Tools::split_args($cmdline);
> @@ -321,11 +323,17 @@ my $print_bash_completion = sub {
>  	    print "$expanded_cmd\n";
>  	    return;
>  	}
> +	if (ref($def) eq 'ARRAY') {
> +	    if (scalar(@$args) == 0 && !$ends_with_space) {
> +		print "$cmd\n";
> +		return;
> +	    }
> +	}
>      }
>      return if !$def;
>  
>      my $pos = scalar(@$args) - 1;
> -    $pos += 1 if $cmdline =~ m/\s+$/;
> +    $pos += 1 if $ends_with_space;
>      print STDERR "pos: $pos\n" if $debug;
>      return if $pos < 0;
>  
> -- 
> 2.11.0



More information about the pve-devel mailing list