diff options
| -rw-r--r-- | bash-completion.sh | 10 | ||||
| -rwxr-xr-x | icevault | 13 | 
2 files changed, 12 insertions, 11 deletions
diff --git a/bash-completion.sh b/bash-completion.sh index 536ca2d..34ed969 100644 --- a/bash-completion.sh +++ b/bash-completion.sh @@ -54,18 +54,18 @@ _icevault() {      fi      [ $(($OPTIND + 1)) -lt $cword ] && return -    local colon_word= +    local trim=      if [ -z "$cur" -a $OPTIND -eq $cword ] || [ -z "$cur" -a $(($OPTIND + 1)) -eq $cword -a "${words[OPTIND]}" = fill ]; then          cur="$(./icevault _geturi)"/ # get URI from webpage      else          cur=$(dequote "$cur")          # trim words with : or = in $COMP_WORDBREAKS; see __ltrim_colon_completions          if [[ "$cur" == *[:=]* && "$COMP_WORDBREAKS" == *:* && "$COMP_WORDBREAKS" == *=* ]]; then -            colon_word=${cur%"${cur##*[:=]}"} +            trim=${cur%"${cur##*[:=]}"}          elif [[ "$cur" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then -            colon_word=${cur%"${cur##*:}"} +            trim=${cur%"${cur##*:}"}          elif [[ "$cur" == *=* && "$COMP_WORDBREAKS" == *=* ]]; then -            colon_word=${cur%"${cur##*=}"} +            trim=${cur%"${cur##*=}"}          fi      fi @@ -74,7 +74,7 @@ _icevault() {          compopt -o filenames -o noquote          while read -r -d $'\0' uri; do              # quote manually (so we don't quote the : and =) -            uri=$( echo "${uri#$colon_word}" | sed "s/[][\\{}*?~<>;'\"|&()\!$\` \t]/\\\\&/g" ) +            uri=$( echo "${uri#$trim}" | sed "s/[][\\{}*?~<>;'\"|&()\!$\` \t]/\\\\&/g" )              COMPREPLY+=( "$uri" )          done < <(./icevault -0 _complete "$cur")          [ "${#COMPREPLY[@]}" -eq 1 -a "${COMPREPLY[0]: -1:1}" = / ] && compopt -o nospace @@ -24,7 +24,7 @@ use Getopt::Long qw/:config posix_default no_ignore_case gnu_compat                              bundling auto_version/;  use Encode qw/decode_utf8 encode_utf8/;  use I18N::Langinfo (); -use List::Util qw/any first min none/; +use List::Util qw/all any first min none/;  # Clean up PATH, and set TMPDIR to a ramdisk's mountpoint if possible @@ -285,15 +285,16 @@ sub complete($;$) {      return @matches if $all or $#matches < 1;      # find the longest common prefix to determine the depth level of completion -    my $p = $matches[0]; -    do { chop $p until /\A\Q$p\E/ } foreach @matches; +    $matches[0] =~ /\A([A-Za-z0-9-]+):\/\/([^\P{Graph}:\/]+(?::\d+)?)\// or die; +    ($s, $h) = ($1, $2); -    if ($p =~ /\A[A-Za-z0-9-]+:\/\/[^\P{Graph}:\/]+(?::\d+)?\//) { -    } elsif ($p =~ /\A[A-Za-z0-9-]+:\/\//) { +    if (all { /\A\Q$s\E:\/\/\Q$h\E\// } @matches) { # common host: list all ids +    } elsif (all { /\A\Q$s\E:\/\// } @matches) { # common scheme: list only hosts          s#/[^\P{Print}\/]+\z#/# foreach @matches; -    } elsif (defined $s) { +    } else { # no common scheme: list only schemes          s#://[^\P{Graph}\/]+/[^\P{Print}\/]+\z#://# foreach @matches;      } +      my %matches = map {( $_ => 1 )} @matches;      return keys %matches;  }  | 
