_lpass
6250 bytes
1#compdef lpass
2
3_lpass() {
4 local cmd has_color has_sync has_interactive
5 if (( CURRENT > 2)); then
6 cmd=${words[2]}
7 # Set the context for the subcommand.
8 curcontext="${curcontext%:*:*}:lpass-$cmd"
9 # Narrow the range of words we are looking at to exclude `lpass'
10 (( CURRENT-- ))
11 shift words
12 # Run the completion for the subcommand
13 case "${cmd}" in
14 login)
15 _arguments : \
16 '--trust[Cause subsequent logins to not require multifactor authentication.]' \
17 '--plaintext-key[Save plaintext decryption key to the hard disk]' \
18 '--force[Do not ask on saving plaintext key]'
19 has_color=1
20 ;;
21
22 logout)
23 _arguments : '--force[Force confirmation]'
24 has_color=1
25 ;;
26 show)
27 _arguments : \
28 '(-c --clip)'{-c,--clip}'[Copy output to clipboard]' \
29 '(-x --expand-multi)'{-x,---expand-multi}'[Show the requested information from all of the matching sites]' \
30 '(--all --username --password --url --notes --field= --id --name --attach=)'{--all,--username,--password,--url,--notes,--field=,--id,--name,--attach=}'[Output the specific field]' \
31 '(--basic-regexp,--fixed-string)'{-G,--basic-regexp}'[Find a site by substring or regular expression]' \
32 '--format=[Format output with printf-style placeholders]'
33 _lpass_complete_uniqenames
34 has_color=1
35 has_sync=1
36 ;;
37
38 ls)
39 _arguments : \
40 '(-l --long)'{-l,--long}'[Also list the last modification time and username]' \
41 '-u[List username]' \
42 '-m[List modification time]' \
43 '--format=[Format output with printf-style placeholders]'
44 _lpass_complete_groups
45 has_color=1
46 has_sync=1
47 ;;
48 mv)
49 _lpass_complete_uniqenames
50 _lpass_complete_groups
51 has_color=1
52 ;;
53 duplicate|rm)
54 _lpass_complete_uniqenames
55 has_color=1
56 has_sync=1
57 ;;
58 add)
59 _arguments : '(--username --password --url --notes --field=)'{--username,--password,--url,--notes,--field=}'[Add field]'
60 _lpass_complete_uniqenames
61 has_color=1
62 has_sync=1
63 has_interactive=1
64 ;;
65 edit)
66 _arguments : '(--name --username --password --url --notes --field=)'{--name,--username,--password,--url,--notes,--field=}'[Update field]'
67 _lpass_complete_uniqenames
68 has_color=1
69 has_sync=1
70 has_interactive=1
71 ;;
72 generate)
73 _arguments : \
74 '(-c --clip)'{-c,--clip}'[Copy output to clipboard]' \
75 '--username=[USERNAME]' \
76 '--url=[URL]' \
77 '--no-symbols[Do not use symbols]'
78 has_sync=1
79 ;;
80 status)
81 _arguments : '(-q --quiet)'{-q,--quiet}'[Suppress output to stdout]'
82 has_color=1
83 ;;
84 sync)
85 _arguments : '(-b --background)'{-b,--background}'[Run sync in background]'
86 has_color=1
87 ;;
88 export)
89 _arguments : '--fields=[Field list]'
90 has_color=1
91 has_sync=1
92 ;;
93 import)
94 if ((CURRENT < 3)); then
95 _files
96 fi
97 ;;
98 esac
99
100 if [ -n "$has_sync" ] || [ -n "$has_color" ] || [ -n "$has_interactive" ]; then
101 local -a generic_options
102 if [ "$has_sync" -eq 1 ]; then
103 generic_options+=('--sync=[Synchronize local cache with server: auto | now | no]')
104 fi
105 if [ "$has_color" -eq 1 ]; then
106 generic_options+=('--color=[Color: auto | never | always]')
107 fi
108 if [ "$has_interactive" -eq 1 ]; then
109 generic_options+=("--non-interactive[Use standard input instead of $EDITOR]")
110 fi
111 _arguments $generic_options
112 fi
113 else
114 local -a subcommands
115 subcommands=(
116 "login:Authenticate with the LastPass server and initialize a local cache"
117 "logout:Remove the local cache and stored encryption keys"
118 "passwd:Change your LastPass password"
119 "show:Display a password or selected field"
120 "ls:List names in groups in a tree structure"
121 "mv:Move the specified entry to a new group"
122 "add:Add a new entry"
123 "edit:Edit the selected field"
124 "generate:Create a randomly generated password"
125 "duplicate:Create a duplicate entry of the one specified"
126 "rm:Remove the specified entry"
127 "status:Show current login status"
128 "sync:Synchronize local cache with server"
129 "export:Dump all account information including passwords as unencrypted csv to stdout"
130 "import:Upload accounts from an unencrypted CSV file to the server"
131 "share:Manipulate shared folders (only enterprise or premium user)"
132 )
133 _describe -t commands 'lpass' subcommands
134 _arguments : \
135 '(-h --help)'{-h,--help}'[show help]' \
136 '(-v --version)'{-v,--version}'[show version]'
137
138 fi
139}
140
141_lpass_complete_uniqenames(){
142 local -a entries
143 while read i; do
144 if [ -n "$i" ]; then
145 entries+=("$i")
146 fi
147 done < <(lpass ls --sync auto --format "%an" --color=never)
148 compadd -a entries
149}
150
151
152_lpass_complete_groups() {
153 local -a entries
154 while read i; do
155 if [ -n "$i" ]; then
156 entries+=("$i")
157 fi
158 done < <(lpass ls --sync auto --format "%aN" --color=never | grep -E "\/$")
159 compadd -a entries
160}
161
162_lpass
163# Local Variables:
164# mode: Shell-Script
165# sh-indentation: 2
166# indent-tabs-mode: nil
167# sh-basic-offset: 2
168# End:
169# vim: ft=zsh sw=2 ts=2 et