[pacman-dev] [PATCH 1/2] patch to add zsh completion to pacman-key

Daniel Wallace daniel.wallace at gatech.edu
Sun Apr 15 23:07:39 EDT 2012


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 <daniel.wallace at gatech.edu>
> > ---
> 
> 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
> > 
> > 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://mailman.archlinux.org/pipermail/pacman-dev/attachments/20120415/5186398a/attachment-0001.asc>


More information about the pacman-dev mailing list