Loading .gitignore +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ mkinstalldirs tags test-driver scripts/_curl scripts/curl.fish curl_fuzzer curl_fuzzer_seed_corpus.zip libstandaloneengine.a Loading Makefile.am +2 −2 Original line number Diff line number Diff line Loading @@ -155,9 +155,9 @@ WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \ winbuild/MakefileBuild.vc winbuild/Makefile.vc EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \ scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \ lib/libcurl.vers.in buildconf.bat scripts/coverage.sh lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \ $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \ Loading configure.ac +25 −0 Original line number Diff line number Diff line Loading @@ -3412,6 +3412,31 @@ case "$OPT_ZSH_FPATH" in ;; esac dnl ********************************************************************** dnl Check for fish completion path dnl ********************************************************************** OPT_FISH_FPATH=default AC_ARG_WITH(fish-functions-dir, AC_HELP_STRING([--with-fish-functions-dir=PATH],[Install fish completions to PATH]) AC_HELP_STRING([--without-fish-functions-dir],[Do not install fish completions]), [OPT_FISH_FPATH=$withval]) case "$OPT_FISH_FPATH" in no) dnl --without-fish-functions-dir option used ;; default|yes) dnl --with-fish-functions-dir option used without path FISH_FUNCTIONS_DIR="$datarootdir/fish/completions" AC_SUBST(FISH_FUNCTIONS_DIR) ;; *) dnl --with-fish-functions-dir option used with path FISH_FUNCTIONS_DIR="$withval" AC_SUBST(FISH_FUNCTIONS_DIR) ;; esac dnl ********************************************************************** dnl Back to "normal" configuring dnl ********************************************************************** Loading scripts/Makefile.am +17 −5 Original line number Diff line number Diff line Loading @@ -20,20 +20,30 @@ # ########################################################################### ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@ FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@ PERL = @PERL@ ZSH_COMPLETION_FUNCTION_FILENAME = _curl FISH_COMPLETION_FUNCTION_FILENAME = curl.fish CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME) CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME) all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME) all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME) $(ZSH_COMPLETION_FUNCTION_FILENAME): zsh.pl $(ZSH_COMPLETION_FUNCTION_FILENAME): completion.pl if CROSSCOMPILING @echo "NOTICE: we can't generate zsh completion when cross-compiling!" else # if not cross-compiling: @if ! test -x "$(PERL)"; then echo "No perl: can't install zsh.pl"; exit 0; fi $(PERL) $(srcdir)/zsh.pl $(top_builddir)/src/curl$(EXEEXT) > $@ @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell zsh > $@ endif $(FISH_COMPLETION_FUNCTION_FILENAME): completion.pl if CROSSCOMPILING @echo "NOTICE: we can't generate fish completion when cross-compiling!" else # if not cross-compiling: @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell fish > $@ endif install-data-local: Loading @@ -41,5 +51,7 @@ if CROSSCOMPILING @echo "NOTICE: we can't install zsh completion when cross-compiling!" else # if not cross-compiling: $(MKDIR_P) $(DESTDIR)$(ZSH_FUNCTIONS_DIR) $(MKDIR_P) $(DESTDIR)$(FISH_FUNCTIONS_DIR) $(INSTALL_DATA) $(ZSH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(ZSH_FUNCTIONS_DIR)/$(ZSH_COMPLETION_FUNCTION_FILENAME) $(INSTALL_DATA) $(FISH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(FISH_FUNCTIONS_DIR)/$(FISH_COMPLETION_FUNCTION_FILENAME) endif scripts/zsh.pl→scripts/completion.pl +134 −0 Original line number Diff line number Diff line #!/usr/bin/env perl # Generate ZSH completion use strict; use warnings; my $curl = $ARGV[0] || 'curl'; use Getopt::Long(); use Pod::Usage(); my $curl = 'curl'; my $shell = 'zsh'; my $help = 0; Getopt::Long::GetOptions( 'curl=s' => \$curl, 'shell=s' => \$shell, 'help' => \$help, ) or Pod::Usage::pod2usage(); Pod::Usage::pod2usage() if $help; my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s*(\<.+?\>)?\s+(.*)'; my @opts = parse_main_opts('--help', $regex); if ($shell eq 'fish') { print "# curl fish completion\n\n"; print qq{$_ \n} foreach (@opts); } elsif ($shell eq 'zsh') { my $opts_str; $opts_str .= qq{ $_ \\\n} foreach (@opts); Loading @@ -33,6 +45,9 @@ return rc EOS print $tmpl; } else { die("Unsupported shell: $shell"); } sub parse_main_opts { my ($cmd, $regex) = @_; Loading @@ -52,6 +67,15 @@ sub parse_main_opts { $desc =~ s/\]/\\\]/g if defined $desc; $desc =~ s/\:/\\\:/g if defined $desc; if ($shell eq 'fish') { $option .= "complete --command curl"; $option .= " --short-option '" . strip_dash(trim($short)) . "'" if defined $short; $option .= " --long-option '" . strip_dash(trim($long)) . "'" if defined $long; $option .= " --description '" . strip_dash(trim($desc)) . "'" if defined $desc; } elsif ($shell eq 'zsh') { $option .= '{' . trim($short) . ',' if defined $short; $option .= trim($long) if defined $long; $option .= '}' if defined $short; Loading @@ -62,6 +86,7 @@ sub parse_main_opts { $option .= ':_files' if defined $arg and ($arg eq '<file>' || $arg eq '<filename>' || $arg eq '<dir>'); } push @list, $option; } Loading @@ -73,12 +98,13 @@ sub parse_main_opts { $b =~ /([^=]*)/; my $mb = $1; length($mb) <=> length($ma) } @list; } @list if $shell eq 'zsh'; return @list; } sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s }; sub strip_dash { my $s = shift; $s =~ s/^-+//g; return $s }; sub call_curl { my ($cmd) = @_; Loading @@ -90,3 +116,19 @@ sub call_curl { } return split /\n/, $output; } __END__ =head1 NAME completion.pl - Generates tab-completion files for various shells =head1 SYNOPSIS completion.pl [options...] --curl path to curl executable --shell zsh/fish --help prints this help =cut Loading
.gitignore +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ mkinstalldirs tags test-driver scripts/_curl scripts/curl.fish curl_fuzzer curl_fuzzer_seed_corpus.zip libstandaloneengine.a Loading
Makefile.am +2 −2 Original line number Diff line number Diff line Loading @@ -155,9 +155,9 @@ WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \ winbuild/MakefileBuild.vc winbuild/Makefile.vc EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \ scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \ lib/libcurl.vers.in buildconf.bat scripts/coverage.sh lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \ $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \ Loading
configure.ac +25 −0 Original line number Diff line number Diff line Loading @@ -3412,6 +3412,31 @@ case "$OPT_ZSH_FPATH" in ;; esac dnl ********************************************************************** dnl Check for fish completion path dnl ********************************************************************** OPT_FISH_FPATH=default AC_ARG_WITH(fish-functions-dir, AC_HELP_STRING([--with-fish-functions-dir=PATH],[Install fish completions to PATH]) AC_HELP_STRING([--without-fish-functions-dir],[Do not install fish completions]), [OPT_FISH_FPATH=$withval]) case "$OPT_FISH_FPATH" in no) dnl --without-fish-functions-dir option used ;; default|yes) dnl --with-fish-functions-dir option used without path FISH_FUNCTIONS_DIR="$datarootdir/fish/completions" AC_SUBST(FISH_FUNCTIONS_DIR) ;; *) dnl --with-fish-functions-dir option used with path FISH_FUNCTIONS_DIR="$withval" AC_SUBST(FISH_FUNCTIONS_DIR) ;; esac dnl ********************************************************************** dnl Back to "normal" configuring dnl ********************************************************************** Loading
scripts/Makefile.am +17 −5 Original line number Diff line number Diff line Loading @@ -20,20 +20,30 @@ # ########################################################################### ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@ FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@ PERL = @PERL@ ZSH_COMPLETION_FUNCTION_FILENAME = _curl FISH_COMPLETION_FUNCTION_FILENAME = curl.fish CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME) CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME) all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME) all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME) $(ZSH_COMPLETION_FUNCTION_FILENAME): zsh.pl $(ZSH_COMPLETION_FUNCTION_FILENAME): completion.pl if CROSSCOMPILING @echo "NOTICE: we can't generate zsh completion when cross-compiling!" else # if not cross-compiling: @if ! test -x "$(PERL)"; then echo "No perl: can't install zsh.pl"; exit 0; fi $(PERL) $(srcdir)/zsh.pl $(top_builddir)/src/curl$(EXEEXT) > $@ @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell zsh > $@ endif $(FISH_COMPLETION_FUNCTION_FILENAME): completion.pl if CROSSCOMPILING @echo "NOTICE: we can't generate fish completion when cross-compiling!" else # if not cross-compiling: @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell fish > $@ endif install-data-local: Loading @@ -41,5 +51,7 @@ if CROSSCOMPILING @echo "NOTICE: we can't install zsh completion when cross-compiling!" else # if not cross-compiling: $(MKDIR_P) $(DESTDIR)$(ZSH_FUNCTIONS_DIR) $(MKDIR_P) $(DESTDIR)$(FISH_FUNCTIONS_DIR) $(INSTALL_DATA) $(ZSH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(ZSH_FUNCTIONS_DIR)/$(ZSH_COMPLETION_FUNCTION_FILENAME) $(INSTALL_DATA) $(FISH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(FISH_FUNCTIONS_DIR)/$(FISH_COMPLETION_FUNCTION_FILENAME) endif
scripts/zsh.pl→scripts/completion.pl +134 −0 Original line number Diff line number Diff line #!/usr/bin/env perl # Generate ZSH completion use strict; use warnings; my $curl = $ARGV[0] || 'curl'; use Getopt::Long(); use Pod::Usage(); my $curl = 'curl'; my $shell = 'zsh'; my $help = 0; Getopt::Long::GetOptions( 'curl=s' => \$curl, 'shell=s' => \$shell, 'help' => \$help, ) or Pod::Usage::pod2usage(); Pod::Usage::pod2usage() if $help; my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s*(\<.+?\>)?\s+(.*)'; my @opts = parse_main_opts('--help', $regex); if ($shell eq 'fish') { print "# curl fish completion\n\n"; print qq{$_ \n} foreach (@opts); } elsif ($shell eq 'zsh') { my $opts_str; $opts_str .= qq{ $_ \\\n} foreach (@opts); Loading @@ -33,6 +45,9 @@ return rc EOS print $tmpl; } else { die("Unsupported shell: $shell"); } sub parse_main_opts { my ($cmd, $regex) = @_; Loading @@ -52,6 +67,15 @@ sub parse_main_opts { $desc =~ s/\]/\\\]/g if defined $desc; $desc =~ s/\:/\\\:/g if defined $desc; if ($shell eq 'fish') { $option .= "complete --command curl"; $option .= " --short-option '" . strip_dash(trim($short)) . "'" if defined $short; $option .= " --long-option '" . strip_dash(trim($long)) . "'" if defined $long; $option .= " --description '" . strip_dash(trim($desc)) . "'" if defined $desc; } elsif ($shell eq 'zsh') { $option .= '{' . trim($short) . ',' if defined $short; $option .= trim($long) if defined $long; $option .= '}' if defined $short; Loading @@ -62,6 +86,7 @@ sub parse_main_opts { $option .= ':_files' if defined $arg and ($arg eq '<file>' || $arg eq '<filename>' || $arg eq '<dir>'); } push @list, $option; } Loading @@ -73,12 +98,13 @@ sub parse_main_opts { $b =~ /([^=]*)/; my $mb = $1; length($mb) <=> length($ma) } @list; } @list if $shell eq 'zsh'; return @list; } sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s }; sub strip_dash { my $s = shift; $s =~ s/^-+//g; return $s }; sub call_curl { my ($cmd) = @_; Loading @@ -90,3 +116,19 @@ sub call_curl { } return split /\n/, $output; } __END__ =head1 NAME completion.pl - Generates tab-completion files for various shells =head1 SYNOPSIS completion.pl [options...] --curl path to curl executable --shell zsh/fish --help prints this help =cut