#compdef lpass _lpass() { local cmd has_color has_sync has_interactive if (( CURRENT > 2)); then cmd=${words[2]} # Set the context for the subcommand. curcontext="${curcontext%:*:*}:lpass-$cmd" # Narrow the range of words we are looking at to exclude `lpass' (( CURRENT-- )) shift words # Run the completion for the subcommand case "${cmd}" in login) _arguments : \ '--trust[Cause subsequent logins to not require multifactor authentication.]' \ '--plaintext-key[Save plaintext decryption key to the hard disk]' \ '--force[Do not ask on saving plaintext key]' has_color=1 ;; logout) _arguments : '--force[Force confirmation]' has_color=1 ;; show) _arguments : \ '(-c --clip)'{-c,--clip}'[Copy output to clipboard]' \ '(-x --expand-multi)'{-x,---expand-multi}'[Show the requested information from all of the matching sites]' \ '(--all --username --password --url --notes --field= --id --name --attach=)'{--all,--username,--password,--url,--notes,--field=,--id,--name,--attach=}'[Output the specific field]' \ '(--basic-regexp,--fixed-string)'{-G,--basic-regexp}'[Find a site by substring or regular expression]' \ '--format=[Format output with printf-style placeholders]' _lpass_complete_uniqenames has_color=1 has_sync=1 ;; ls) _arguments : \ '(-l --long)'{-l,--long}'[Also list the last modification time and username]' \ '-u[List username]' \ '-m[List modification time]' \ '--format=[Format output with printf-style placeholders]' _lpass_complete_groups has_color=1 has_sync=1 ;; mv) _lpass_complete_uniqenames _lpass_complete_groups has_color=1 ;; duplicate|rm) _lpass_complete_uniqenames has_color=1 has_sync=1 ;; add) _arguments : '(--username --password --url --notes --field=)'{--username,--password,--url,--notes,--field=}'[Add field]' _lpass_complete_uniqenames has_color=1 has_sync=1 has_interactive=1 ;; edit) _arguments : '(--name --username --password --url --notes --field=)'{--name,--username,--password,--url,--notes,--field=}'[Update field]' _lpass_complete_uniqenames has_color=1 has_sync=1 has_interactive=1 ;; generate) _arguments : \ '(-c --clip)'{-c,--clip}'[Copy output to clipboard]' \ '--username=[USERNAME]' \ '--url=[URL]' \ '--no-symbols[Do not use symbols]' has_sync=1 ;; status) _arguments : '(-q --quiet)'{-q,--quiet}'[Supress output to stdout]' has_color=1 ;; sync) _arguments : '(-b --background)'{-b,--background}'[Run sync in background]' has_color=1 ;; export) _arguments : '--fields=[Field list]' has_color=1 has_sync=1 ;; import) if ((CURRENT < 3)); then _files fi ;; esac if [ -n "$has_sync" ] || [ -n "$has_color" ] || [ -n "$has_interactive" ]; then local -a generic_options if [ "$has_sync" -eq 1 ]; then generic_options+=('--sync=[Synchronize local cache with server: auto | now | no]') fi if [ "$has_color" -eq 1 ]; then generic_options+=('--color=[Color: auto | never | always]') fi if [ "$has_interactive" -eq 1 ]; then generic_options+=("--non-interactive[Use standard input instead of $EDITOR]") fi _arguments $generic_options fi else local -a subcommands subcommands=( "login:Authenticate with the LastPass server and initialize a local cache" "logout:Remove the local cache and stored encryption keys" "passwd:Change your LastPass password" "show:Display a password or selected field" "ls:List names in groups in a tree structure" "mv:Move the specified entry to a new group" "add:Add a new entry" "edit:Edit the selected field" "generate:Create a randomly generated password" "duplicate:Create a duplicate entry of the one specified" "rm:Remove the specified entry" "status:Show current login status" "sync:Synchronize local cache with server" "export:Dump all account information including passwords as unencrypted csv to stdout" "import:Upload accounts from an unencrypted CSV file to the server" "share:Manipulate shared folders (only enterprise or premium user)" ) _describe -t commands 'lpass' subcommands _arguments : \ '(-h --help)'{-h,--help}'[show help]' \ '(-v --version)'{-v,--version}'[show version]' fi } _lpass_complete_uniqenames(){ local -a entries while read i; do if [ -n "$i" ]; then entries+=("$i") fi done < <(lpass ls --sync auto --format "%an" --color=never) compadd -a entries } _lpass_complete_groups() { local -a entries while read i; do if [ -n "$i" ]; then entries+=("$i") fi done < <(lpass ls --sync auto --format "%aN" --color=never | grep -E "\/$") compadd -a entries } _lpass # Local Variables: # mode: Shell-Script # sh-indentation: 2 # indent-tabs-mode: nil # sh-basic-offset: 2 # End: # vim: ft=zsh sw=2 ts=2 et