summary refs log tree commit diff
path: root/dot_local/share/zsh/completion
diff options
context:
space:
mode:
authorAlen <alen@dotfiles.xyz>2023-09-24 21:12:17 +0400
committerAlen <alen@dotfiles.xyz>2023-09-24 21:12:17 +0400
commit153314af20f0ca903718a374a05d48bc4fdaf55f (patch)
tree7ef1b8ad7e666a857de938d97994be82c29f1407 /dot_local/share/zsh/completion
parent0bfd264dd9b81feb5ffaf8840ee7b776be379312 (diff)
Add pass completion
Diffstat (limited to 'dot_local/share/zsh/completion')
-rw-r--r--dot_local/share/zsh/completion/_pass144
1 files changed, 144 insertions, 0 deletions
diff --git a/dot_local/share/zsh/completion/_pass b/dot_local/share/zsh/completion/_pass
new file mode 100644
index 0000000..d911e12
--- /dev/null
+++ b/dot_local/share/zsh/completion/_pass
@@ -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#\\#\\\\#g' -e 's#:#\\:#g' | 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