diff --git a/plugins/1password/1password.plugin.zsh b/plugins/1password/1password.plugin.zsh index 9398b02b4..941523ca8 100644 --- a/plugins/1password/1password.plugin.zsh +++ b/plugins/1password/1password.plugin.zsh @@ -1,46 +1,9 @@ -if (( ${+commands[op]} )); then - eval "$(op completion zsh)" - compdef _op op -fi +# Do nothing if op is not installed +(( ${+commands[op]} )) || return -# opswd puts the password of the named service into the clipboard. If there's a -# one time password, it will be copied into the clipboard after 10 seconds. The -# clipboard is cleared after another 20 seconds. -function opswd() { - if [[ $# -lt 1 ]]; then - echo "Usage: opswd " - return 1 - fi +# Load op completion +eval "$(op completion zsh)" +compdef _op op - local service=$1 - - # If not logged in, print error and return - op list users > /dev/null || return - - local password - # Copy the password to the clipboard - if ! password=$(op get item "$service" --fields password 2>/dev/null); then - echo "error: could not obtain password for $service" - return 1 - fi - - echo -n "$password" | clipcopy - echo "✔ password for $service copied to clipboard" - - # If there's a one time password, copy it to the clipboard after 5 seconds - local totp - if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then - sleep 10 && echo -n "$totp" | clipcopy - echo "✔ TOTP for $service copied to clipboard" - fi - - (sleep 20 && clipcopy /dev/null) &! -} - -function _opswd() { - local -a services - services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}") - [[ -z "$services" ]] || compadd -a -- services -} - -compdef _opswd opswd +# Load opswd function +autoload -Uz opswd diff --git a/plugins/1password/_opswd b/plugins/1password/_opswd new file mode 100644 index 000000000..b92bf8fc8 --- /dev/null +++ b/plugins/1password/_opswd @@ -0,0 +1,9 @@ +#compdef opswd + +function _opswd() { + local -a services + services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}") + [[ -z "$services" ]] || compadd -a -- services +} + +_opswd "$@" diff --git a/plugins/1password/opswd b/plugins/1password/opswd new file mode 100644 index 000000000..6849d42b3 --- /dev/null +++ b/plugins/1password/opswd @@ -0,0 +1,37 @@ +#autoload + +# opswd puts the password of the named service into the clipboard. If there's a +# one time password, it will be copied into the clipboard after 10 seconds. The +# clipboard is cleared after another 20 seconds. +function opswd() { + if [[ $# -lt 1 ]]; then + echo "Usage: opswd " + return 1 + fi + + local service=$1 + + # If not logged in, print error and return + op list users > /dev/null || return + + local password + # Copy the password to the clipboard + if ! password=$(op get item "$service" --fields password 2>/dev/null); then + echo "error: could not obtain password for $service" + return 1 + fi + + echo -n "$password" | clipcopy + echo "✔ password for $service copied to clipboard" + + # If there's a one time password, copy it to the clipboard after 5 seconds + local totp + if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then + sleep 10 && echo -n "$totp" | clipcopy + echo "✔ TOTP for $service copied to clipboard" + fi + + (sleep 20 && clipcopy /dev/null) &! +} + +opswd "$@"