summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Mattern <rephorm@rephorm.com>2012-09-20 23:21:29 -0700
committerJason A. Donenfeld <Jason@zx2c4.com>2012-09-21 08:28:20 +0200
commit8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5 (patch)
treed0467bb1f5390de5355d100ab113f73686e8a7e9
parent93c025c69aac8867916bbd0f5813765fac7d852b (diff)
downloadpass-8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5.tar.gz
pass-8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5.tar.bz2
pass-8d26d9ebb5a0ad1a2390323f44c832d2a42ea6e5.zip
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-completion78
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
>Don't use subshells for reading from find.Jason A. Donenfeld1-4/+4 2014-04-19bash-completion: fix completion-file's name in uninstallschalox1-1/+1 2014-04-19platform: Auto-detect local platform fileJason A. Donenfeld2-3/+3 2014-04-19platform: Allow custom platform file before installJason A. Donenfeld2-3/+5 2014-04-18reencrypt: cleaner temp file declarationJason A. Donenfeld1-4/+4 2014-04-18Remove unneeded semicolon.Jason A. Donenfeld1-14/+14 2014-04-18Check sneaky paths.Jason A. Donenfeld1-0/+15 2014-04-18Pruning: turns out rmdir does it for us with -p.Jason A. Donenfeld1-9/+3 2014-04-18Abstract remove empty directories into function.Jason A. Donenfeld1-14/+11 2014-04-18Remember to prune empty folders.Jason A. Donenfeld1-0/+8 2014-04-18init: allow deinitializationJason A. Donenfeld2-2/+18 2014-04-18bash-completion: filter dot files from resultsJason A. Donenfeld1-3/+8 2014-04-18reencrypt: remove option, do automaticallyJason A. Donenfeld5-39/+25 2014-04-18reencryption: add to completion filesJason A. Donenfeld3-1/+5 2014-04-18Specify variable gpg.Jason A. Donenfeld1-1/+1 2014-04-18style: don't escape new line on &&Jason A. Donenfeld1-2/+2 2014-04-18reencryption: remove temporary file on failureJason A. Donenfeld1-1/+1 2014-04-18reencryption: only reencrypt files when requiredJason A. Donenfeld2-16/+37 2014-04-17cp: typo as cvJason A. Donenfeld1-1/+1 2014-04-17bash: gpg_id is localJason A. Donenfeld1-0/+1 2014-04-17move/copy: always reencrypt passwords at destinationJason A. Donenfeld5-25/+56 2014-04-17makefile: allow platform files with gnu sedJason A. Donenfeld1-7/+8 2014-04-17mv: Add pass mv/rename supportJason A. Donenfeld5-3/+78 2014-04-17revelation2pass: add plain XML importJavali1-11/+15 2014-04-17platform: add cygwin supportJason A. Donenfeld2-1/+17