# Bash completion support for icevault(1) # Copyright © 2015 Guilhem Moulin # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . _icevault() { local cur prev words cword _init_completion -n := || return COMPREPLY=() declare -a files local opts="--debug -h --help -p --show-passwords -s --socket= --version" local args="fill insert dump clip edit ls" local OPTIND IFS # find out if our $cur is an optional argument or a command for (( OPTIND = 1; OPTIND < cword; OPTIND++ )); do case "${words[OPTIND]}" in -s) (( OPTIND++ ));; --) break;; -*) ;; *) break;; esac done local p # list sockets (and dirs) only if [[ $OPTIND -eq $(( $cword + 1)) && "$prev" = -s ]] || [[ $OPTIND -eq $cword && "$cur" =~ ^--socket= ]]; then [[ $OPTIND -eq $cword && "$cur" =~ ^--socket= ]] && cur="${cur#--socket=}" _filedir files=( "${COMPREPLY[@]}" ) COMPREPLY=() for p in "${files[@]}"; do [ -d "$p" -o -S "$p" ] && COMPREPLY+=( "$p" ) done return fi # complete options and commands if [ $OPTIND -eq $cword -a "$cur" ]; then COMPREPLY+=( $(compgen -W "$opts $args" -- "$cur") ) [ "${#COMPREPLY[@]}" -eq 1 -a "${COMPREPLY[0]}" = --socket= ] && compopt -o nospace fi [ $(($OPTIND + 1)) -lt $cword ] && return local trim= if [ -z "$cur" -a $(($OPTIND + 1)) -eq $cword -a "${words[OPTIND]}" = insert ]; then return elif [ -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 trim=${cur%"${cur##*[:=]}"} elif [[ "$cur" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then trim=${cur%"${cur##*:}"} elif [[ "$cur" == *=* && "$COMP_WORDBREAKS" == *=* ]]; then trim=${cur%"${cur##*=}"} fi fi local uri if [[ $OPTIND -eq $cword || ! "${words[OPTIND]}" =~ :// ]]; then compopt -o filenames -o noquote while read -r -d $'\0' uri; do # quote manually (so we don't quote the : and =) 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 return 0 fi } complete -F _icevault icevault