parent
7641d72058
commit
dd4858168c
3 changed files with 156 additions and 4 deletions
@ -0,0 +1,144 @@ |
|||||||
|
#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 see 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 |
Loading…
Reference in new issue