From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15913 invoked from network); 21 Feb 2000 10:34:38 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 21 Feb 2000 10:34:38 -0000 Received: (qmail 10485 invoked by alias); 21 Feb 2000 10:34:29 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 9812 Received: (qmail 10475 invoked from network); 21 Feb 2000 10:34:26 -0000 From: "Bart Schaefer" Message-Id: <1000221103422.ZM16650@candle.brasslantern.com> Date: Mon, 21 Feb 2000 10:34:22 +0000 X-Mailer: Z-Mail (5.0.0 30July97) To: zsh-workers@sunsite.auc.dk Subject: PATCH: Improved _mailboxes MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii This works pretty well, following Sven's most recent patches to _multi_parts. It now can handle mailboxes for elm, mail, mh, mutt, pine, and zmail. Things I like it to do that it doesn't yet: (1) The default style should be to make the all-files group be alternate completions, i.e., not shown unless the -default- group is empty. (2) The all-files group for pine (currently commented out) should contain only full paths, not relative ones. How does one accomplish that? (3) I'm sometimes offered a blank completion -- an empty slot at the top of the list of all completions. I don't know where that comes from; it shouldn't be there. Quoting problem somewhere? And of course, I haven't yet written any actual completion functions to call this one; it's used only from _mutt, so far. Index: Completion/User/_mailboxes =================================================================== @@ -5,43 +5,89 @@ # This is still needlessly mutt-biased and should be fixed. -local -U muttboxes mboxes dirboxes MHboxes maildirboxes +local -U dirboxes local i j expl muttrc="${muttrc:-~/.muttrc}" local pinedirectory="${pinedirectory:-~/mail}" local maildirectory="${maildirectory:-~/Mail}" if (( ! $+_mailbox_cache )) then - [[ -f ${~muttrc:-.} ]] && muttboxes=( ${$(grep mailboxes ${~muttrc})[2,-1]} ) + typeset -U -g _mailbox_cache + typeset -U -g _maildir_cache _mbox_cache _mh_cache _mutt_cache _pine_cache - mboxes=( ${~maildirectory}/*(^/) ${~pinedirectory}/**/*(.) ) + [[ -f ${~muttrc:-.} ]] && + _mutt_cache=( ${$(grep mailboxes ${~muttrc})[2,-1]} ) + + _mbox_cache=( ${~maildirectory}/*(^/) ) + _pine_cache=( ${~pinedirectory}/**/*(.) ) + dirboxes=( ${~maildirectory}/*(/) ) while (( $#dirboxes )); do - i=$dirboxes[1] + i=${dirboxes[1]} shift dirboxes if [[ -d "$i/cur" ]]; then - maildirboxes=( $maildirboxes $i ) + _maildir_cache=( "${_maildir_cache[@]}" "$i" ) elif j=( $i/<1-> ) && [[ -n "$j" ]]; then - MHboxes=( $MHboxes $i ) + _mh_cache=( "${_mh_cache[@]}" "$i" ) else - mboxes=( $mboxes $i/*(.) ) + _mbox_cache=( "${_mbox_cache[@]}" "$i"/*(.) ) dirboxes=( $dirboxes $i/*(/) ) fi done - [[ -n "$muttboxes" || -d ~/.elm || -d ~/.mutt ]] && - _mailbox_cache=(\! \< \> $muttboxes) + [[ -n "$_mutt_cache" || -d ~/.elm || -d ~/.mutt ]] && + _mailbox_cache=( \! \< \> ) [[ -n "$mailpath" ]] && - _mailbox_cache=($_mailbox_cache ${mailpath//\?*/}) + _mailbox_cache=( "${_mailbox_cache[@]}" "${(@)mailpath%%\?*}" ) - _mailbox_cache=($_mailbox_cache $mboxes $maildirboxes $MHboxes) + _mailbox_cache=( "${_mailbox_cache[@]}" $MAIL ) fi if _wanted files expl 'mailbox specification'; then - if compset -P '+|-f+' || [[ $words[CURRENT-1] = -f ]]; then - _files -W $maildirectory + local -U mbox_names + case "${curcontext}" in + (*:elm:*) # I've probably got this wrong, or at least incomplete + compadd "${expl[@]}" - \! \< \> + mbox_names=( "${_mbox_cache[@]}" "${_mailbox_cache[@]}" ) + _multi_parts "${expl[@]}" / mbox_names;; + (*:mail:*) + if compset -P '+|-f+'; then + mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" ) + _multi_parts "${expl[@]}" / mbox_names + else + mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}" "${_mailbox_cache[@]}" ) + _multi_parts "${expl[@]}" / mbox_names + _path_files -J all-files + fi;; + (*:mh:*) # I've probably got this wrong, or at least incomplete + (( $#_mh_cache )) && _multi_parts "${expl[@]}" / _mh_cache;; + (*:mutt:*) + mbox_names=( "${_mutt_cache[@]}" "${_mailbox_cache[@]}" "${_maildir_cache[@]}" ) + compadd "${expl[@]}" - \! \< \> + _multi_parts "${expl[@]}" / mbox_names;; + (*:pine:*) + # Pine is like mail but with no leading `+' to disambiguate; + # any files not in $pinedirectory must be absolute paths. + mbox_names=( "${(@)_pine_cache#$~pinedirectory/}" "${_mbox_cache[@]}" ) + _multi_parts "${expl[@]}" / mbox_names + # _path_files -J all-files -g '/*' + ;; + (*:(zmail|zmlite):*) + if compset -P '+|-f+'; then + mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" ) + _multi_parts "${expl[@]}" / mbox_names else - compadd "$@" "$expl[@]" - "$_mailbox_cache[@]" + compadd "${expl[@]}" - % \& + mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}" + "${_mailbox_cache[@]}" "${_mh_cache[@]}" ) + _multi_parts "${expl[@]}" / mbox_names + _path_files -J all-files fi + ;; + (*) # Some other program wants mailbox names? Use them all? + mbox_names=( "${_mailbox_cache[@]}" "${_mbox_cache[@]}" + "${_mh_cache[@]}" "${_mutt_cache[@]}" "${_pine_cache[@]}" ) + _multi_parts "${expl[@]}" / mbox_names;; + esac fi Index: Completion/User/_mutt =================================================================== @@ -8,7 +8,7 @@ '-b:BCC recipient:->userhost' \ '-c:CC recipient:->userhost' \ '-e:post-init configuration:' \ - '-f+:mailbox:_mailboxes' \ + '-f+:mailbox: _mailboxes' \ '-F+:init file:_files' \ '-h+:help:' \ '-H+:draft file:_files' \ -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com