[Bash-completion-devel] wget(1) completion
Raphaël Droz
raphael.droz at gmail.com
Sat Jul 21 11:08:54 UTC 2012
ping ? (this one being rerolled for years)
On Sun, Dec 11, 2011 at 07:30:56PM +0100, Raphaël Droz wrote:
> On Wed, Dec 07, 2011 at 08:43:40PM +0200, Ville Skyttä wrote:
> > On 12/04/2011 08:49 PM, Raphaël Droz wrote:
> > > back with this one
> > > [ http://lists.alioth.debian.org/pipermail/bash-completion-devel/2009-March/001088.html ]
> >
> > Some quick comments, not actually tested:
> >
> > > [[ $cur =~ (unix|windows), ]] && excludes=( windows unix )
> > > [[ $cur =~ (low|upp)ercase, ]] && excludes+=( lowercase uppercase )
> > > [ ... etc similar unnecessary =~ cases here and there ... ]
> > Plain == with @(...) instead of regexp should work for these -- it's
> > faster and cleaner when considering the case that the above should
> > probably match the entire $cur exactly, not just a substring (the regexp
> > version would need anchoring). Actually I suggest using a case block
> > (with "non-fancy" labels, see below) for the above particular case
> > instead of doing redundant regexp tests when we know only one of them
> > can match.
>
> fixed,
> I ended up using such idioms: *lowercase*|*uppercase*) is it what you
> expected ?
>
> > > -D|-@(bind-address|@(exclude-|)domains))
> >
> > See "Globbing in case labels" in style guide for this and several other
> > similar cases.
>
> fixed
>
> > I suppose these should do a "return" instead of a ":".
> > > --@(local|remote)-encoding)
> > > : # TODO
> > > ;;
>
> fixed
> completes as for iconv -f
>
> > > --execute)
> > > : # TODO: base=STR
> > > ;;
>
> fixed
> only returns 0 for now
>
> > > --header)
> >
> > I'm not convinced that offering HTTP header names after this is useful
> > as it's not only header names that are required, but "Header: value"
> > strings.
>
> According to the section 4.2 of the RFC 2616:
> " The field value MAY be preceded by any amount of LWS, though a single
> SP is preferred. "
> => wget --header=From:test ... is valid.
> So I added a -o nospace as I still think that providing supported HTTP
> headers may sometimes help a bit.
>
> > > [ Big case $prev block ]
> >
> > "$split && return" missing after the block.
>
> fixed
>
> > > [ The last case $cur block ]
> >
> > Looks like this could be combined to just one "if [[ $cur == -* ]]". At
> > least for me, _parse_help returns only long options.
>
> fixed
>
> [ new version + patch attached ]
>
>
> thanks for the review !
>
>
> Raph
> # wget(1) completion -*- shell-script -*-
>
> _wget() {
> local cur prev words cword split
> _init_completion -s || return
>
> case $prev in
> --progress)
> COMPREPLY=( $( compgen -W 'bar dot' -- $cur ) )
> return 0
> ;;
> --bind-address)
> _ip_addresses "$cur"
> return 0
> ;;
> -D|--domains|--exclude-domains)
> _known_hosts_real "$cur"
> return 0
> ;;
> --restrict-file-names)
> local excludes=()
> case $cur in
> *unix*|*windows*)
> excludes=( windows unix )
> ;;&
> *lowercase*|*uppercase*)
> excludes+=( lowercase uppercase )
> ;;&
> *nocontrol*)
> excludes+=( nocontrol )
> ;;&
> *ascii*)
> excludes+=( ascii )
> ;;
> esac
> local excludes_str=$( export IFS='|'; echo "${excludes[*]}"; )
>
> # prevopt is the previous options string used as a prefix
> # to avoid COMPREPLY replacing them with the $lastopt completion
> local lastopt=${cur/*,} prevopt=
> [[ $cur = *, ]] && prevopt=${cur%,*},
>
> COMPREPLY=( $( compgen -P "$prevopt" -X "@($excludes_str)" \
> -W 'unix windows nocontrol ascii lowercase uppercase' \
> -- $lastopt ) )
>
> # +o nospace when no more valid option is possible (= append a space)
> local opt_as_arr=( $(echo ${COMPREPLY[0]//,/ }) )
> [[ ${#opt_as_arr[@]} -lt 4 ]] && compopt -o nospace
> return 0
> ;;
> --prefer-family)
> COMPREPLY=( $( compgen -W 'IPv4 IPv6 none' -- $cur ) )
> return 0
> ;;
> -P|--directory-prefix|--ca-directory)
> _filedir -d
> return 0
> ;;
> -a|--append-output|--load-cookies|--post-file|--ca-certificate|\
> --certificate|--private-key|--random-file|--egd-file)
> _filedir
> return 0
> ;;
> -o|--output-file|-O|--output-document|--save-cookies|--default-page)
> # avoid accidentally overwriting files: suggest directories only
> _filedir -d
> # and, in some cases, the standard output too
> [[ $prev = @(-O|--output-document) && ( $cur = -* || -z $cur ) ]] && COMPREPLY+=( - )
> return 0
> ;;
> -i|--input-file)
> # adds the standard input to the possibilities
> _filedir && [[ $cur = -* || -z $cur ]] && COMPREPLY+=( - )
> return 0
> ;;
> --secure-protocol)
> COMPREPLY=( $( compgen -W 'auto SSLv2 SSLv3 TLSv1' -- $cur ) )
> return 0
> ;;
> --certificate-type|--private-key-type)
> COMPREPLY=( $( compgen -W 'PEM DER' -- $cur ) )
> return 0
> ;;
> --follow-tags|--ignore-tags)
> local lastopt=${cur/*,} prevopt=
> [[ $cur = *, ]] && prevopt=${cur%,*},
>
> COMPREPLY=( $( compgen -P "${prevopt}"
> -W 'a abbr acronym address applet area b base basefont bdo big blockquote
> body br button caption center cite code col colgroup dd del dir div dfn dl dt em fieldset
> font form frame frameset h6 head hr html i iframe img input ins isindex kbd label legend
> li link map menu meta noframes noscript object ol optgroup option p param pre q s samp
> script select small span strike strong style sub sup table tbody td textarea tfoot th
> thead title tr tt u ul var xmp' -- $lastopt ) )
> return 0
> ;;
> --tries|--dns-timeout|--connect-timeout|--timeout|--limit-rate|\
> --wait|--waitretry|--cut-dirs|--max-redirect)
> COMPREPLY=( $( compgen -W "{0..9}" -- $cur ) )
> return 0
> ;;
> --quota)
> COMPREPLY=( $( compgen -W "{0..9}{k,m}" -- $cur ) )
> return 0
> ;;
> --http-user|--proxy-user|--ftp-user|--user)
> COMPREPLY=( $( compgen -W "$(sed -n '/^login/s/^[[:blank:]]*login[[:blank:]]//p' ~/.netrc)" -- $cur ) )
> return 0
> ;;
> --level)
> COMPREPLY=( $( compgen -W "{1..5}" -- $cur ) )
> return 0
> ;;
> --header)
> COMPREPLY=( $( compgen -W 'Accept Accept-Charset Accept-Encoding Accept-Language
> Accept-Ranges Age Allow Authorization Cache-Control Connection Content-Encoding
> Content-Language Content-Length Content-Location Content-MD5 Content-Range
> Content-Type Date ETag Expect Expires From Host If-Match If-Modified-Since
> If-None-Match If-Range If-Unmodified-Since Last-Modified Location Max-Forwards
> Pragma Proxy-Authenticate Proxy-Authorization Range Referer Retry-After
> Server TE Trailer Transfer-Encoding Upgrade User-Agent Vary Via Warning
> WWW-Authenticate' -- $cur ) )
> compopt -o nospace
> return 0
> ;;
> --local-encoding|--remote-encoding)
> type -P xauth &>/dev/null && \
> COMPREPLY=( $( compgen -W '$( iconv -l | \
> sed -e "s@/*\$@@" -e "s/[,()]//g" )' -- "$cur" ) )
> return 0
> ;;
> --execute)
> return 0 # TODO base=STR
> ;;
> esac
>
> $split && return
>
> if [[ $cur = -* ]]; then
> COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) )
> [[ $COMPREPLY == *= ]] && compopt -o nospace
> fi
>
> return 0
> } &&
> complete -F _wget wget
>
> # Local variables:
> # mode: shell-script
> # sh-basic-offset: 4
> # sh-indent-comment: t
> # indent-tabs-mode: nil
> # End:
> # ex: ts=4 sw=4 et filetype=sh
> diff --git a/completions/wget b/completions/wget
> index 09b4b23..c497a71 100644
> --- a/completions/wget
> +++ b/completions/wget
> @@ -9,24 +9,38 @@ _wget() {
> COMPREPLY=( $( compgen -W 'bar dot' -- $cur ) )
> return 0
> ;;
> - -D|-@(bind-address|@(exclude-|)domains))
> - _known_hosts_real
> + --bind-address)
> + _ip_addresses "$cur"
> + return 0
> + ;;
> + -D|--domains|--exclude-domains)
> + _known_hosts_real "$cur"
> return 0
> ;;
> --restrict-file-names)
> local excludes=()
> - [[ $cur =~ (unix|windows), ]] && excludes=( windows unix )
> - [[ $cur =~ (low|upp)ercase, ]] && excludes+=( lowercase uppercase )
> - [[ $cur =~ nocontrol ]] && excludes+=( nocontrol )
> - [[ $cur =~ ascii ]] && excludes+=( ascii )
> + case $cur in
> + *unix*|*windows*)
> + excludes=( windows unix )
> + ;;&
> + *lowercase*|*uppercase*)
> + excludes+=( lowercase uppercase )
> + ;;&
> + *nocontrol*)
> + excludes+=( nocontrol )
> + ;;&
> + *ascii*)
> + excludes+=( ascii )
> + ;;
> + esac
> + local excludes_str=$( export IFS='|'; echo "${excludes[*]}"; )
>
> # prevopt is the previous options string used as a prefix
> # to avoid COMPREPLY replacing them with the $lastopt completion
> local lastopt=${cur/*,} prevopt=
> - [[ ${cur} =~ , ]] && prevopt=${cur%,*},
> - local excludes_str=$( export IFS='|'; echo "${excludes[*]}"; )
> + [[ $cur = *, ]] && prevopt=${cur%,*},
>
> - COMPREPLY=( $( compgen -P "${prevopt}" -X "@($excludes_str)" \
> + COMPREPLY=( $( compgen -P "$prevopt" -X "@($excludes_str)" \
> -W 'unix windows nocontrol ascii lowercase uppercase' \
> -- $lastopt ) )
>
> @@ -43,18 +57,20 @@ _wget() {
> _filedir -d
> return 0
> ;;
> - -a|--append-output|--load-cookies|--post-file|--@(ca-|)certificate|--private-key|--random-file|--egd-file)
> + -a|--append-output|--load-cookies|--post-file|--ca-certificate|\
> + --certificate|--private-key|--random-file|--egd-file)
> _filedir
> return 0
> ;;
> -o|--output-file|-O|--output-document|--save-cookies|--default-page)
> - # these options specify a file which may or may not be overwriten
> - # _filedir
> - [[ $prev =~ -O|--output-document && ( $cur = -* || -z $cur ) ]] && COMPREPLY+=( - )
> - return 0;
> + # avoid accidentally overwriting files: suggest directories only
> + _filedir -d
> + # and, in some cases, the standard output too
> + [[ $prev = @(-O|--output-document) && ( $cur = -* || -z $cur ) ]] && COMPREPLY+=( - )
> + return 0
> ;;
> -i|--input-file)
> - # adds the standard input/output to the possibilities
> + # adds the standard input to the possibilities
> _filedir && [[ $cur = -* || -z $cur ]] && COMPREPLY+=( - )
> return 0
> ;;
> @@ -62,13 +78,13 @@ _wget() {
> COMPREPLY=( $( compgen -W 'auto SSLv2 SSLv3 TLSv1' -- $cur ) )
> return 0
> ;;
> - --@(certificate|private-key)-type)
> + --certificate-type|--private-key-type)
> COMPREPLY=( $( compgen -W 'PEM DER' -- $cur ) )
> return 0
> ;;
> - --@(follow|ignore)-tags)
> + --follow-tags|--ignore-tags)
> local lastopt=${cur/*,} prevopt=
> - [[ ${cur} =~ , ]] && prevopt=${cur%,*},
> + [[ $cur = *, ]] && prevopt=${cur%,*},
>
> COMPREPLY=( $( compgen -P "${prevopt}"
> -W 'a abbr acronym address applet area b base basefont bdo big blockquote
> @@ -79,7 +95,8 @@ _wget() {
> thead title tr tt u ul var xmp' -- $lastopt ) )
> return 0
> ;;
> - --tries|--@(dns-|connect-|)timeout|--limit-rate|--wait|--waitretry|--cut-dirs|--max-redirect)
> + --tries|--dns-timeout|--connect-timeout|--timeout|--limit-rate|\
> + --wait|--waitretry|--cut-dirs|--max-redirect)
> COMPREPLY=( $( compgen -W "{0..9}" -- $cur ) )
> return 0
> ;;
> @@ -87,7 +104,7 @@ _wget() {
> COMPREPLY=( $( compgen -W "{0..9}{k,m}" -- $cur ) )
> return 0
> ;;
> - --@(http-|proxy-|ftp-|)user)
> + --http-user|--proxy-user|--ftp-user|--user)
> COMPREPLY=( $( compgen -W "$(sed -n '/^login/s/^[[:blank:]]*login[[:blank:]]//p' ~/.netrc)" -- $cur ) )
> return 0
> ;;
> @@ -104,27 +121,26 @@ _wget() {
> Pragma Proxy-Authenticate Proxy-Authorization Range Referer Retry-After
> Server TE Trailer Transfer-Encoding Upgrade User-Agent Vary Via Warning
> WWW-Authenticate' -- $cur ) )
> + compopt -o nospace
> return 0
> ;;
> - --@(local|remote)-encoding)
> - : # TODO
> - ;;
> + --local-encoding|--remote-encoding)
> + type -P xauth &>/dev/null && \
> + COMPREPLY=( $( compgen -W '$( iconv -l | \
> + sed -e "s@/*\$@@" -e "s/[,()]//g" )' -- "$cur" ) )
> + return 0
> + ;;
> --execute)
> - : # TODO: base=STR
> - ;;
> + return 0 # TODO base=STR
> + ;;
> esac
>
> - case $cur in
> - --*)
> - COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) )
> - [[ $COMPREPLY == *= ]] && compopt -o nospace
> - ;;
> - # only complete long options
> - -)
> - compopt -o nospace
> - COMPREPLY=( -- )
> - ;;
> - esac
> + $split && return
> +
> + if [[ $cur = -* ]]; then
> + COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) )
> + [[ $COMPREPLY == *= ]] && compopt -o nospace
> + fi
>
> return 0
> } &&
> diff --git a/doc/styleguide.txt b/doc/styleguide.txt
> index 3391970..85e6d6b 100644
> --- a/doc/styleguide.txt
> +++ b/doc/styleguide.txt
> @@ -106,3 +106,14 @@ COMPREPLY.
>
> COMPREPLY=( ... -- $cur ) or COMPREPLY=( ... -- "$cur" ) ?
> ----------------------------------------------------------
> +
> +$split && return
> +----------------
> +Should be used in completions using the -s flag of _init_completion,
> +after $prev has been managed but before $cur is considered.
> +Rationale: -s flag calls _split_longopt() which attempt to split $cur.
> +$split = 0 means:
> +- $cur was actually split (during _init_completion())
> +- _split_longopt() actually split $cur into $prev=--* and $cur=<something>
> +- the value of $cur within the completion is rather non-significant outside
> +the context of $prev.
> _______________________________________________
> Bash-completion-devel mailing list
> Bash-completion-devel at lists.alioth.debian.org
> http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/bash-completion-devel
More information about the Bash-completion-devel
mailing list