password-store

Simple password manager using gpg and ordinary unix directories
git clone https://git.zx2c4.com/password-store
Log | Files | Refs | README | LICENSE

commit 8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5
parent 93c025c69aac8867916bbd0f5813765fac7d852b
Author: Brian Mattern <rephorm@rephorm.com>
Date:   Thu, 20 Sep 2012 23:21:29 -0700

Beef up bash completion

New features:

  * command name completion (show,insert,generate,etc)

  * `pass init <tab>` 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.

Diffstat:
Mcontrib/pass.bash-completion | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 63 insertions(+), 15 deletions(-)

diff --git a/contrib/pass.bash-completion b/contrib/pass.bash-completion @@ -3,31 +3,79 @@ # (C) Copyright 2012 Jason A. Donenfeld <Jason@zx2c4.com>. 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