diff options
author | Brian Mattern <rephorm@rephorm.com> | 2012-09-20 23:21:29 -0700 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2012-09-21 08:28:20 +0200 |
commit | 8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5 (patch) | |
tree | d0467bb1f5390de5355d100ab113f73686e8a7e9 | |
parent | 93c025c69aac8867916bbd0f5813765fac7d852b (diff) |
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.
-rw-r--r-- | contrib/pass.bash-completion | 78 |
1 files changed, 63 insertions, 15 deletions
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 <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 |