From 13dbf1359a3f3e5b4a5f461e07ffada14b7129e1 Mon Sep 17 00:00:00 2001 From: Brian Mattern Date: Sat, 22 Sep 2012 11:29:38 -0700 Subject: Bring zsh completion up to parity with bash completion --- contrib/pass.zsh-completion | 151 +++++++++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 59 deletions(-) diff --git a/contrib/pass.zsh-completion b/contrib/pass.zsh-completion index bfe5dca..ef52976 100644 --- a/contrib/pass.zsh-completion +++ b/contrib/pass.zsh-completion @@ -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') } -- cgit v1.2.3-59-g8ed1b