#compdef pass #autoload # Copyright (C) 2012 - 2014: # Johan Venant <jvenant@invicem.pro> # Brian Mattern <rephorm@rephorm.com> # Jason A. Donenfeld <Jason@zx2c4.com>. # All Rights Reserved. # This file is licensed under the GPLv2+. # Please visit https://git.zx2c4.com/password-store/tree/COPYING for more information. # If you use multiple repositories, you can configure completion like this: # # compdef _pass workpass # zstyle ':completion::complete:workpass::' prefix "$HOME/work/pass" # workpass() { # PASSWORD_STORE_DIR=$HOME/work/pass pass $@ # } _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 : \ "-p[gpg-id will only be applied to this subfolder]" \ "--path[gpg-id will only be applied to this subfolder]" _pass_complete_keys ;; ls|list|edit) _pass_complete_entries_with_subdirs ;; insert) _arguments : \ "-e[echo password to console]" \ "--echo[echo password to console]" \ "-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]" \ "-f[force overwrite]" \ "--force[force overwrite]" \ "-i[replace first line]" \ "--in-place[replace first line]" _pass_complete_entries_with_subdirs ;; cp|copy|mv|rename) _arguments : \ "-f[force rename]" \ "--force[force rename]" _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) local -a subcommands 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" ) _describe -t commands 'pass git' subcommands ;; show|*) _pass_cmd_show ;; esac else local -a subcommands subcommands=( "init:Initialize new password storage" "ls:List passwords" "find:Find password files or directories based on pattern" "grep:Search inside decrypted password files for matching pattern" "show:Decrypt and print a password" "insert:Insert a new password" "generate:Generate a new password using pwgen" "edit:Edit a password with \$EDITOR" "mv:Rename the password" "cp:Copy the password" "rm:Remove the password" "git:Call git on the password store" "version:Output version information" "help:Output help message" ) _describe -t commands 'pass' subcommands _arguments : \ "--version[Output version information]" \ "--help[Output help message]" _pass_cmd_show fi } _pass_cmd_show () { _arguments : \ "-c[put it on the clipboard]" \ "--clip[put it on the clipboard]" _pass_complete_entries } _pass_complete_entries_helper () { local IFS=$'\n' local prefix zstyle -s ":completion:${curcontext}:" prefix prefix || prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}" _values -C 'passwords' ${$(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" -e 's#\.gpg##' -e 's#\\#\\\\#' | sort):-""} } _pass_complete_entries_with_subdirs () { _pass_complete_entries_helper } _pass_complete_entries () { _pass_complete_entries_helper -type f } _pass_complete_keys () { local IFS=$'\n' # Extract names and email addresses from gpg --list-keys _values 'gpg keys' $(gpg2 --list-secret-keys --with-colons | cut -d : -f 10 | sort -u | sed '/^$/d') } _pass