From 8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5 Mon Sep 17 00:00:00 2001 From: Brian Mattern Date: Thu, 20 Sep 2012 23:21:29 -0700 Subject: Beef up bash completion New features: * command name completion (show,insert,generate,etc) * `pass init ` will list email addresses from gpg --list-keys * for 'show' command, if a folder contains a single entry, it will be auto-completed (recursively!) The other commands don't do this since you could be adding a new entry into an existing folder. * option completion (e.g., --clip) Note: I turned off "-o filenames" because it was incompatible with the auto-expansion. So, I instead quote using `printf "%q"` to handle files with spaces and other odd characters. --- contrib/pass.bash-completion | 78 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 15 deletions(-) (limited to 'contrib') diff --git a/contrib/pass.bash-completion b/contrib/pass.bash-completion index 85a2da8..95b905f 100644 --- a/contrib/pass.bash-completion +++ b/contrib/pass.bash-completion @@ -3,31 +3,79 @@ # (C) Copyright 2012 Jason A. Donenfeld . All Rights Reserved. # This is released under the GPLv2+. Please see COPYING for more information. -_pass() -{ - local cur prev prefix suffix - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" +_pass_complete_entries () { prefix="$HOME/.password-store/" suffix=".gpg" + autoexpand=${1:-0} - if [[ $prev == --* ]]; then - return 0 - fi - local IFS=$'\n' local i=0 for item in $(compgen -f $prefix$cur); do if [[ $item == $prefix.* ]]; then continue fi - if [[ -d $item ]]; then - item="$item/" - fi + # append / to directories and recursively expand single-entry dirs + while [[ -d $item ]]; do + item="$item/" + if [[ $autoexpand -eq 1 ]]; then + subitems=($(compgen -f $item)) + if [[ ${#subitems[@]} -eq 1 ]]; then + item="${subitems[0]}" + else + break + fi + else + break + fi + done item="${item%$suffix}" - COMPREPLY[$i]="${item#$prefix}" + COMPREPLY[$i]=$(printf "%q" "${item#$prefix}" ) (( i++ )) done } -complete -o filenames -o nospace -F _pass pass + +_pass() +{ + local cur prev opts base + + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + + commands="init ls show insert generate edit rm git help version --version" + if [[ $COMP_CWORD -gt 1 ]]; then + case "${COMP_WORDS[1]}" in + init) + keys=$(gpg --list-keys |grep uid |sed 's/.*<\(.*\)>/\1/') + COMPREPLY+=($(compgen -W "${keys}" -- ${cur})) + ;; + ls) + _pass_complete_entries + ;; + show|-*) + COMPREPLY+=($(compgen -W "-c --clip" -- ${cur})) + _pass_complete_entries 1 + ;; + insert) + COMPREPLY+=($(compgen -W "-n --no-echo -m --multiline -f --force" -- ${cur})) + _pass_complete_entries + ;; + generate) + COMPREPLY+=($(compgen -W "-n --no-symbols -c --clip" -- ${cur})) + _pass_complete_entries + ;; + edit) + _pass_complete_entries + ;; + rm) + COMPREPLY+=($(compgen -W "-r --recursive -f --force" -- ${cur})) + _pass_complete_entries + ;; + esac + else + COMPREPLY+=($(compgen -W "${commands}" -- ${cur})) + _pass_complete_entries 1 + fi +} + +complete -o nospace -F _pass pass -- cgit v1.2.3