From 80438cd2af17083d85bb12da6756961abfedecbb Mon Sep 17 00:00:00 2001 From: Guilhem Moulin Date: Sat, 21 Mar 2015 17:13:32 +0100 Subject: Move the CLI part to a dedicated dir, with a separate Makefile. --- cli/bash-completion.sh | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 cli/bash-completion.sh (limited to 'cli/bash-completion.sh') diff --git a/cli/bash-completion.sh b/cli/bash-completion.sh new file mode 100644 index 0000000..81bee51 --- /dev/null +++ b/cli/bash-completion.sh @@ -0,0 +1,86 @@ +# 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 -- cgit v1.2.3