# 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 cmd firstopt=2 opts nargs=0 if [ $cword -eq 1 -a -z "$cur" ] || [[ "${words[1]}" =~ :// ]] || [[ "${words[1]}" =~ ^- ]]; then firstopt=1 cmd=fill # default command elif [ $cword -gt 1 ]; then cmd="${words[1]}" fi local commands='fill clip cp dump edit git import ls mv reencrypt rm' case "$cmd" in fill) opts='-f --force -p --show-passwords -s --socket='; nargs=1;; clip) opts=; nargs=1 ;; cp) opts='-f --force'; nargs=2;; dump) opts='-p --show-passwords'; nargs=1;; edit) opts=; nargs=1 ;; git) opts= ;; import) opts='-f --force -s --socket='; nargs=0;; ls) opts='-0 --zero -r --recursive'; nargs=-1;; mv) opts='-f --force'; nargs=2;; reencrypt) opts=; nargs=-1 ;; rm) opts='-f --force -r --recursive'; nargs=-1;; esac opts="${opts:+$opts }--debug -h --help --version" if [ "$cmd" = git ]; then # use bash completion for git by ignoring the first word ('icevault') [ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git || return COMP_CWORD=$(( $COMP_CWORD - 1 )) COMP_WORDS=( "${COMP_WORDS[@]:1}" ) local GIT_DIR GIT_WORK_TREE # fetch store and git-dir from the config-file GIT_WORK_TREE=$(sed -n '/^store\s*=\s*/{s///p;q}' "${XDG_CONFIG_HOME:-$HOME/.config}/icevault") GIT_WORK_TREE=$( echo "${GIT_WORK_TREE:-icevault}" | sed -re "s@^~/@$HOME@; t; s@^/@/@; t; s@^@${XDG_DATA_HOME:-$HOME/.local/share}/@" ) GIT_DIR=$(sed -n '/^git-dir\s*=\s*/{s///p;q}' "${XDG_CONFIG_HOME:-$HOME/.config}/icevault") GIT_DIR=$( echo "${GIT_DIR:-.git}" | sed -re "s@^~/@$HOME@; t; s@^/@/@; t; s@^@$GIT_WORK_TREE/@" ) export GIT_DIR GIT_WORK_TREE _git return fi local OPTIND socket # find out if our $cur is an optional argument or not for (( OPTIND = firstopt; OPTIND < cword; OPTIND++ )); do case "${words[OPTIND]}" in -s) (( OPTIND++ )); [ $OPTIND -lt $cword ] && socket="${words[OPTIND]}";; --) break;; --socket=*) [ $OPTIND -lt $cword ] && socket="${words[OPTIND]#--socket=}";; -*) ;; *) 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 elif [[ $OPTIND -eq $cword && "$cur" =~ ^- ]]; then COMPREPLY+=( $(compgen -W "$opts" -- "$cur") ) [ "${#COMPREPLY[@]}" -eq 1 -a "${COMPREPLY[0]}" = '--socket=' ] && compopt -o nospace return fi local trim= if [ "$cmd" = fill -a \( $OPTIND -eq $cword -o $(( $OPTIND + 1)) -eq $cword \) -a -z "$cur" ]; then cur="$( icevault _geturi ${socket:+--socket="$socket"} 2>/dev/null )"/ # get URI from webpage elif [ -z "$cmd" -a "$cword" -eq 1 -a "$cur" ]; then # autocomplete command COMPREPLY+=( $(compgen -W "$commands" -- "$cur") ) return 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 # autocomplete with identities as long as we don't exeed $nargs if [ $nargs -lt 0 -o $(($cword - $OPTIND + 1)) -le $nargs ]; 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 _complete -0 "$cur" 2>/dev/null) return 0 fi } complete -F _icevault icevault