Skip to content
Snippets Groups Projects
pass.zsh-completion 3.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • #compdef pass
    
    # 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
    
    # 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
    		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
    
    	_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="${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_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' $(gpg --list-secret-keys --with-colons | cut -d : -f 10 | sort -u | sed '/^$/d')