I was told to only use zsh for zsh completion, However if it is ok to use awk instead, I can use that. Also about parse opts I can remove the : :_files or : :_keys for anything that does not allow for arguments in the parseopts branch, whenever it is merged.
On Sun, Apr 15, 2012 at 09:02:05PM -0400, Dave Reisner wrote: > On Sun, Apr 15, 2012 at 01:16:43PM -0400, Daniel Wallace wrote: > > this patch adds a _pacman_key function to the _pacman zsh site function > > so that zsh users can have completion for pacman-key <keyids> and other > > files which may be used with pacman-key > > > > Signed-off-by: Daniel Wallace <[email protected]> > > --- > > I don't know ZSH completion at all, but I gave this a test run and it > seems to work. I only have one comment, which I've left inline... > > > contrib/zsh_completion.in | 58 > > +++++++++++++++++++++++++++++++++++++++++---- > > 1 file changed, 54 insertions(+), 4 deletions(-) > > > > diff --git a/contrib/zsh_completion.in b/contrib/zsh_completion.in > > index b30e960..73ce42f 100644 > > --- a/contrib/zsh_completion.in > > +++ b/contrib/zsh_completion.in > > @@ -1,4 +1,4 @@ > > -#compdef pacman pacman.static=pacman > > +#compdef pacman pacman.static=pacman pacman-key > > > > # copy this file to /usr/share/zsh/site-functions/_pacman > > > > @@ -286,7 +286,7 @@ _pacman_get_command() { > > } > > > > # main dispatcher > > -_pacman() { > > +_pacman_zsh_comp() { > > case $words[2] in > > -Q*g*) # ipkg groups > > _arguments -s : \ > > @@ -332,5 +332,55 @@ _pacman() { > > esac > > } > > > > -# run the main dispatcher > > -_pacman "$@" > > +_pacman_key() { > > + _arguments \ > > + '(- :)'{-h,--help}"[show help]" \ > > + '(-a --add)*'{-a,--add}"[Add the specified keys (empty for stdin)]: > > :_files" \ > > + '(-d --delete)*'{-d,--delete}"[Remove the Specified keyids]: :_keys" \ > > + '(-e --export)*'{-e,--export}"[Export the specified or all keyids]: > > :_keys" \ > > + '(-f --finger)*'{-f,--finger}"[List fingreprint for specidied or all > > keyids]: :_keys" \ > > + '(-l --list-keys)*'{-l,--list-keys}"[List the specified or all keys]: > > :_keys" \ > > + '(-r --recv-keys)*'{-r,--recv-keys}"[Fetch the specified keyids]: > > :_keys" \ > > + '(-u --updatedb)*'{-u,--updatedb}"[Update the trustdb of pacman]" \ > > + '(-v --verify)*'{-v,--verify}"[Verify the file specified by the > > signature]: :_files -g '*.sig'" \ > > + '(-V --version)*'{-V,--version}"[Show program version]" \ > > + '(--config)*'{*,--config}"[Use an alternate config file]: :_files" \ > > + '(--edit-key)*'{*,--edit-key}"[Present a menu for key management task > > on keyids]: :_keys" \ > > + '(--gpgdir)*'{*,--gpgdir}"[Set an alternate directory for GnuPG > > (instead of '/etc/pacman.d/gnupg')]: :_files -/" \ > > + '(--import)*'{*,--import}"[Imports pubring.gpg from dir(s)]: :_files > > -g '*.gpg'" \ > > + '(--import-trustdb)*'{*,--import-tb}"[Imports ownertrust values from > > trustdb.gpg in dir(s)]: :_files -g '*.gpg'" \ > > + '(--init)*'{*,--init}"[Ensure the keyring is properly initialized]" \ > > + '(--keyserver)*'{*,--keyserver}"[Specify a keyserver to use if > > necessary]" \ > > + '(--list-sigs)*'{*,--list-sigs}"[List keys and their signatures]: > > :_keys" \ > > + '(--lsign-key)*'{*,--lsign-key}"[Locally sign the specified keyid]: > > :_keys" \ > > + '(--populate)*'{*,--populate}"[Reload the default keys from the > > (given) keyrings in '/usr/share/pacman/keyrings']: :_path_files -W > > /usr/share/pacman/keyrings" \ > > + '(--refresh-keys)*'{*,--refresh-keys}"[Update specified or all keys > > from a keyserver]: :_keys" > > +} > > + > > +_keys() { > > + local keys > > + #uses the first \< to the end and remove first \> to the end to get all > > the emails > > + #the using the first \/ to end then remove first '\ ' to the end this > > gets all the keyids (pub and sub) > > + #the ##uid* removes all the .jpeg pictures with ids, and ##pubbring.gpg > > removes the beginning line that lists > > + #where stuff is stored, ##\-\-* removes the line of dashes at the > > beginning, but doesn't remove email addresses > > + #with dashes in them > > + keys=( ${${${${${${${${${(f)"$(pacman-key --list-keys > > 2>/dev/null)"}}##*\<}%%\>}##*\/}%%\ *}##uid*}##pubring.gpg}##\-\-*} ) > > I realize that the goal here is to avoid forking, but this is unreadable. > Using > awk, I can cook up the below which should accomplish the same and seems > infinitely more maintainable. > > pacman-key --list-keys 2>/dev/null | awk ' > $1 == "pub" { > # key id > split($2, a, "/"); print a[2] > } > $1 == "uid" { > # email > l = len($NF) > print substr($NF, 2, l - 2) > } > ' > > > + _describe -t modules 'keys in keyring' keys && return 0 > > +} > > + > > +_pacman_comp() { > > + case "$service" in > > + pacman-key) > > + _pacman_key "$@";; > > + pacman) > > + _pacman_zsh_comp "$@";; > > + *) > > + _message "Error";; > > + esac > > +} > > + > > +_pacman_comp "$@" > > + > > + > > + > > +# vim: ft=zsh sw=2 ts=2 et > > -- > > 1.7.10 > > > > >
pgpU8JbyNWf4G.pgp
Description: PGP signature
