Skip to content
Snippets Groups Projects
Commit 13dbf135 authored by Brian Mattern's avatar Brian Mattern Committed by Jason A. Donenfeld
Browse files

Bring zsh completion up to parity with bash completion

parent 7448c22e
No related branches found
No related tags found
No related merge requests found
......@@ -3,76 +3,109 @@
# This file is under the GPLv2+ license.
# Heavily based on http://zsh.sf.net/Guide/zshguide06.html#l177
# And Frédéric Perrin article http://tar-jx.bz/notes/zsh-completion.html
# Johan Venant, September 2012
# Originally by Johan Venant, September 2012
# Modified substantially by Brian Mattern, September 2012
_pass () {
local cmd
if (( CURRENT > 2)); then
cmd=${words[2]}
# Set the context for the subcommand.
curcontext="${curcontext%:*:*}:pass-$cmd"
# Narrow the range of words we are looking at to exclude `pass'
(( CURRENT-- ))
shift words
# Run the completion for the subcommand
(( $+functions[_pass_cmd_$cmd] )) && _pass_cmd_$cmd
else
_values 'command' \
"init[Initialize new password storage]" \
"ls[subfolder List names of passwords]" \
"show[Decrypt and print a password]" \
"insert[Insert a new password]" \
"generate[Generate a new password using pwgen]" \
"edit[Edit a password with \$EDITOR]" \
"rm[Remove the password]" \
"git[Call git on the password store]" \
"help[Help]"
_pass_cmd_show
fi
}
_pass_cmd_init () {
}
_pass_cmd_ls () {
_arguments : \
'::ls:_get_stored_pwd'
_pass () {
local cmd
if (( CURRENT > 2)); then
cmd=${words[2]}
# Set the context for the subcommand.
curcontext="${curcontext%:*:*}:pass-$cmd"
# Narrow the range of words we are looking at to exclude `pass'
(( CURRENT-- ))
shift words
# Run the completion for the subcommand
case "${cmd}" in
init)
_arguments : \
"-r[re-encrypt existing passwords]" \
"--reencrypt[re-encrypt existing passwords]"
_pass_complete_keys
;;
ls|list|edit)
_pass_complete_entries_with_subdirs
;;
insert)
_arguments : \
"-n[no console output]" \
"--no-echo[no console output]" \
"-m[multiline]" \
"--multiline[multiline]"
_pass_complete_entries_with_subdirs
;;
generate)
_arguments : \
"-n[don't include symbols in password]" \
"--no-symbols[don't include symbols in password]" \
"-c[copy password to the clipboard]" \
"--clip[copy password to the clipboard]"
_pass_complete_entries_with_subdirs
;;
rm)
_arguments : \
"-f[force deletion]" \
"--force[force deletion]" \
"-r[recursively delete]" \
"--recursive[recursively delete]"
_pass_complete_entries_with_subdirs
;;
git)
_values 'subcommands' \
"init[Initialize git repository]" \
"push[Push to remote repository]" \
"pull[Pull from remote repository]" \
"config[Show git config]" \
"log[Show git log]" \
"reflog[Show git reflog]"
;;
show|*)
_pass_cmd_show
;;
esac
else
_values 'command' \
"init[Initialize new password storage]" \
"ls[List passwords]" \
"show[Decrypt and print a password]" \
"insert[Insert a new password]" \
"generate[Generate a new password using pwgen]" \
"edit[Edit a password with \$EDITOR]" \
"rm[Remove the password]" \
"git[Call git on the password store]" \
"version[Output version information]" \
"help[Output help message]"
_arguments : \
"--version[Output version information]" \
"--help[Output help message]"
_pass_cmd_show
fi
}
_pass_cmd_show () {
_arguments : \
"-c[put it on the clipboard]" \
'*::show:_get_stored_pwd'
#'::pass id:_files -W ~/.password-store -g "*.gpg(|.*)(-.)"'
_arguments : \
"-c[put it on the clipboard]" \
"--clip[put it on the clipboard]"
_pass_complete_entries
}
_pass_cmd_edit () {
_arguments : \
'::edit:_get_stored_pwd'
_pass_complete_entries_helper () {
local IFS=$'\n'
local prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
_values -C 'passwords' $(find "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print | sed -e "s#${prefix}.##" -e 's#\.gpg##' | sort)
}
_pass_cmd_insert () {
_arguments : \
"-n[no console output]" \
"-m[multiline]" \
'::show:_get_stored_pwd'
_pass_complete_entries_with_subdirs () {
_pass_complete_entries_helper
}
_pass_cmd_generate () {
_arguments : \
"-n[no symbols]" \
"-c[put password on the clipboard]" \
'::show:_get_stored_pwd'
_pass_complete_entries () {
_pass_complete_entries_helper -type f
}
_pass_cmd_rm () {
_arguments : \
'::ls:_get_stored_pwd'
}
_get_stored_pwd () {
compadd `find ~/.password-store \( -name .git -o -name .gpg-id \) -prune -o -type f -print | sed 's#.*\.password-store*.##'| sed 's#\.gpg##' | sort`
_pass_complete_keys () {
local IFS=$'\n'
# Extract names and email addresses from gpg --list-keys
_values 'gpg keys' $(gpg --list-secret-keys --with-colons | cut -d : -f 10 | sort -u | sed '/^$/d')
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment