---
 Makefile                            | 14 +++++--
 src/completion/pass.bash-completion | 61 +++++++++++++++++++++++------
 2 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/Makefile b/Makefile
index eac2291..5e1be54 100644
--- a/Makefile
+++ b/Makefile
@@ -36,9 +36,17 @@ all:
 
 install-common:
        @install -v -d "$(DESTDIR)$(MANDIR)/man1" && install -m 0644 -v 
man/pass.1 "$(DESTDIR)$(MANDIR)/man1/pass.1"
-       @[ "$(WITH_BASHCOMP)" = "yes" ] || exit 0; install -v -d 
"$(DESTDIR)$(BASHCOMPDIR)" && install -m 0644 -v 
src/completion/pass.bash-completion "$(DESTDIR)$(BASHCOMPDIR)/pass"
-       @[ "$(WITH_ZSHCOMP)" = "yes" ] || exit 0; install -v -d 
"$(DESTDIR)$(ZSHCOMPDIR)" && install -m 0644 -v 
src/completion/pass.zsh-completion "$(DESTDIR)$(ZSHCOMPDIR)/_pass"
-       @[ "$(WITH_FISHCOMP)" = "yes" ] || exit 0; install -v -d 
"$(DESTDIR)$(FISHCOMPDIR)" && install -m 0644 -v 
src/completion/pass.fish-completion "$(DESTDIR)$(FISHCOMPDIR)/pass.fish"
+       @[ "$(WITH_BASHCOMP)" = "yes" ] || exit 0;  \
+               install -v -d "$(DESTDIR)$(BASHCOMPDIR)" && \
+               trap 'rm -f src/completion/.bash' EXIT; \
+               sed 
's:^SYSTEM_EXTENSION_DIR=.*:SYSTEM_EXTENSION_DIR="$(LIBDIR)/password-store/extensions":'
 src/completion/pass.bash-completion > src/completion/.bash && \
+               install -m 0644 -v src/completion/.bash 
"$(DESTDIR)$(BASHCOMPDIR)/pass"
+       @[ "$(WITH_ZSHCOMP)" = "yes" ] || exit 0; \
+               install -v -d "$(DESTDIR)$(ZSHCOMPDIR)" && \
+               install -m 0644 -v src/completion/pass.zsh-completion 
"$(DESTDIR)$(ZSHCOMPDIR)/_pass"
+       @[ "$(WITH_FISHCOMP)" = "yes" ] || exit 0; \
+               install -v -d "$(DESTDIR)$(FISHCOMPDIR)" && \
+               install -m 0644 -v src/completion/pass.fish-completion 
"$(DESTDIR)$(FISHCOMPDIR)/pass.fish"
 
 
 ifneq ($(strip $(wildcard $(PLATFORMFILE))),)
diff --git a/src/completion/pass.bash-completion 
b/src/completion/pass.bash-completion
index 95d3e1e..3b1fb94 100644
--- a/src/completion/pass.bash-completion
+++ b/src/completion/pass.bash-completion
@@ -4,6 +4,10 @@
 # Brian Mattern <[email protected]>. All Rights Reserved.
 # This file is licensed under the GPLv2+. Please see COPYING for more 
information.
 
+SYSTEM_EXTENSION_DIR=""
+PREFIX="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
+EXTENSIONS="${PASSWORD_STORE_EXTENSIONS_DIR:-$PREFIX/.extensions}"
+
 _pass_complete_entries () {
        local prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store/}"
        prefix="${prefix%/}/"
@@ -80,11 +84,51 @@ _pass_complete_keys () {
        COMPREPLY+=($(compgen -W "${keys}" -- ${cur}))
 }
 
+_pass_extension_commands() {
+       local file
+       if [[ -d "$SYSTEM_EXTENSION_DIR" ]]; then
+               for file in "$SYSTEM_EXTENSION_DIR"/*.bash; do
+                       if [[ -f "$file" ]]; then
+                               file="${file##*/}"
+                               echo "${file%.bash}"
+                       fi
+               done
+       fi
+
+       if [[ $PASSWORD_STORE_ENABLE_EXTENSIONS == true ]]; then
+               for file in "$EXTENSIONS"/*.bash; do
+                       if [[ -f "$file" ]]; then
+                               file="${file##*/}"
+                               echo "${file%.bash}"
+                       fi
+                done
+       fi
+}
+
+# To add completion for an extension command create <COMMAND>.bash-completion 
in the extension folder.
+# <COMMAND>.bash-completion should contains the completion code like this:
+#
+# COMPREPLY+=($(compgen -W "-o --option" -- "${cur}"))
+# _pass_complete_entries 1
+#
+_source_extension_completion() {
+       local extension_command=$1
+       local user_extension_completion system_extension_commpletion
+
+       [[ -n $SYSTEM_EXTENSION_DIR ]] && 
system_extension_commpletion="$SYSTEM_EXTENSION_DIR/$extension_command.bash-completion"
+       [[ $PASSWORD_STORE_ENABLE_EXTENSIONS == true ]] && 
user_extension_completion="$EXTENSIONS/$extension_command.bash-completion"
+
+       if [[ -n $user_extension_completion && -f $user_extension_completion 
]]; then
+               source "$user_extension_completion"
+       elif [[ -n $system_extension_commpletion && -f 
$system_extension_commpletion ]]; then
+               source "$system_extension_commpletion"
+       fi
+}
+
 _pass()
 {
        COMPREPLY=()
        local cur="${COMP_WORDS[COMP_CWORD]}"
-       local commands="init ls find grep show insert generate edit rm mv cp 
git help version ${PASSWORD_STORE_EXTENSION_COMMANDS[*]}"
        if [[ $COMP_CWORD -gt 1 ]]; then
                local lastarg="${COMP_WORDS[$COMP_CWORD-1]}"
                case "${COMP_WORDS[1]}" in
@@ -123,19 +167,12 @@ _pass()
                        git)
                                COMPREPLY+=($(compgen -W "init push pull config 
log reflog rebase" -- ${cur}))
                                ;;
+                       *)
+                               _source_extension_completion "${COMP_WORDS[1]}"
+                               ;;
                esac
-
-               # To add completion for an extension command define a function 
like this:
-               # __password_store_extension_complete_<COMMAND>() {
-               #     COMPREPLY+=($(compgen -W "-o --option" -- ${cur}))
-               #     _pass_complete_entries 1
-               # }
-               #
-               # and add the command to the $PASSWORD_STORE_EXTENSION_COMMANDS 
array
-               if [[ " ${PASSWORD_STORE_EXTENSION_COMMANDS[*]} " == *" 
${COMP_WORDS[1]} "* ]] && type 
"__password_store_extension_complete_${COMP_WORDS[1]}" &> /dev/null; then
-                       "__password_store_extension_complete_${COMP_WORDS[1]}"
-               fi
        else
+               local commands="init ls find grep show insert generate edit rm 
mv cp git help version $(_pass_extension_commands)"
                COMPREPLY+=($(compgen -W "${commands}" -- ${cur}))
                _pass_complete_entries 1
        fi
-- 
2.20.1

_______________________________________________
Password-Store mailing list
[email protected]
https://lists.zx2c4.com/mailman/listinfo/password-store

Reply via email to