Files correlati : utilma verione di curl git-svn-id: svn://10.65.10.50/branches/R_10_00@24159 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/usr/bin/perl
 | |
| 
 | |
| # Generate ZSH completion
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| my $curl = $ARGV[0] || 'curl';
 | |
| 
 | |
| my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s([^\s.]+)?\s+(.*)';
 | |
| my @opts = parse_main_opts('--help', $regex);
 | |
| 
 | |
| my $opts_str;
 | |
| 
 | |
| $opts_str .= qq{  $_ \\\n} foreach (@opts);
 | |
| chomp $opts_str;
 | |
| 
 | |
| my $tmpl = <<"EOS";
 | |
| #compdef curl
 | |
| 
 | |
| # curl zsh completion
 | |
| 
 | |
| local curcontext="\$curcontext" state state_descr line
 | |
| typeset -A opt_args
 | |
| 
 | |
| local rc=1
 | |
| 
 | |
| _arguments -C -S \\
 | |
| $opts_str
 | |
|   '*:URL:_urls' && rc=0
 | |
| 
 | |
| return rc
 | |
| EOS
 | |
| 
 | |
| print $tmpl;
 | |
| 
 | |
| sub parse_main_opts {
 | |
|     my ($cmd, $regex) = @_;
 | |
| 
 | |
|     my @list;
 | |
|     my @lines = call_curl($cmd);
 | |
| 
 | |
|     foreach my $line (@lines) {
 | |
|         my ($short, $long, $arg, $desc) = ($line =~ /^$regex/) or next;
 | |
| 
 | |
|         my $option = '';
 | |
| 
 | |
|         $desc =~ s/'/'\\''/g if defined $desc;
 | |
|         $desc =~ s/\[/\\\[/g if defined $desc;
 | |
|         $desc =~ s/\]/\\\]/g if defined $desc;
 | |
| 
 | |
|         $option .= '{' . trim($short) . ',' if defined $short;
 | |
|         $option .= trim($long)  if defined $long;
 | |
|         $option .= '}' if defined $short;
 | |
|         $option .= '\'[' . trim($desc) . ']\'' if defined $desc;
 | |
| 
 | |
|         $option .= ":'$arg'" if defined $arg;
 | |
| 
 | |
|         $option .= ':_files'
 | |
|             if defined $arg and ($arg eq '<file>' || $arg eq '<filename>'
 | |
|                 || $arg eq '<dir>');
 | |
| 
 | |
|         push @list, $option;
 | |
|     }
 | |
| 
 | |
|     # Sort longest first, because zsh won't complete an option listed
 | |
|     # after one that's a prefix of it.
 | |
|     @list = sort {
 | |
|         $a =~ /([^=]*)/; my $ma = $1;
 | |
|         $b =~ /([^=]*)/; my $mb = $1;
 | |
| 
 | |
|         length($mb) <=> length($ma)
 | |
|     } @list;
 | |
| 
 | |
|     return @list;
 | |
| }
 | |
| 
 | |
| sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
 | |
| 
 | |
| sub call_curl {
 | |
|     my ($cmd) = @_;
 | |
|     my $output = `"$curl" $cmd`;
 | |
|     if ($? == -1) {
 | |
|         die "Could not run curl: $!";
 | |
|     } elsif ((my $exit_code = $? >> 8) != 0) {
 | |
|         die "curl returned $exit_code with output:\n$output";
 | |
|     }
 | |
|     return split /\n/, $output;
 | |
| }
 |