zsh-workers
 help / color / mirror / code / Atom feed
From: Sven Wischnowsky <wischnow@informatik.hu-berlin.de>
To: zsh-workers@sunsite.auc.dk
Subject: Re: PATCH: Improved _mailboxes
Date: Mon, 21 Feb 2000 13:30:42 +0100 (MET)	[thread overview]
Message-ID: <200002211230.NAA13030@beta.informatik.hu-berlin.de> (raw)
In-Reply-To: "Bart Schaefer"'s message of Mon, 21 Feb 2000 10:34:22 +0000


Bart Schaefer wrote:

> 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.

No. We should use tags so the user can decide what he wants to see.

> (2) The all-files group for pine (currently commented out) should contain
>     only full paths, not relative ones.  How does one accomplish that?

For now I've just made the test before the initial call to _tags check 
if $PREFIX starts with / or ~. Otherwise: interesting problem. One can 
get almost that with `-W '(/)' -P/'.

> (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?

Almost. There was no test for $MAIL and in _multi_parts a missing ()
at an assignment. And some more of these in _mailboxes.

> And of course, I haven't yet written any actual completion functions to
> call this one; it's used only from _mutt, so far.

I think we should make the caching somewhat cleverer. I.e. only build
the caches for the commands really used (tried completion upon). Because
I happen to have a ~/mail with several thousend files so that the
initialisation for the pine cache takes quite some time and will never 
be used. However, I sometimes use `mail -f' so I may have _mailboxes
executed.


The -J and -V options should never be used directly, I think. It's the 
job of _description so that users can choose their own group names,
have the groups combined or separated and have different descriptions
displayed for different groups.


The patch should also fix the problem mentioned in 9814 -- make the
compadd in _multi_parts behave more _path_file'ish.


Oh, and I could not apply 9812 and 9815 automatically, I hope this
patch here applies without problems. Dunno how that happened.


Bye
 Sven

diff -ru ../z.old/Completion/Core/_multi_parts Completion/Core/_multi_parts
--- ../z.old/Completion/Core/_multi_parts	Mon Feb 21 11:02:07 2000
+++ Completion/Core/_multi_parts	Mon Feb 21 12:52:31 2000
@@ -83,7 +83,7 @@
   if [[ -n "$PREFIX$SUFFIX" || "$pre" = ${sep}* ]]; then
     tmp1=( "${(@M)matches:#${PREFIX}${SUFFIX}${sep}*}" )
   else
-    tmp1=
+    tmp1=()
   fi
 
   if (( $#tmp1 )); then
@@ -233,10 +233,21 @@
     PREFIX="${opre}${osuf}"
     SUFFIX=""
 
-    [[ -n "$pref" && "$orig" != "$pref" ]] &&
+    if [[ -n "$pref" && "$orig" != "$pref" ]]; then
+      if [[ "$pref" = *${sep} ]]; then
+        compadd "$group[@]" "$expl[@]" "$opts[@]" \
+                -p "${pref%${sep}*${sep}}${sep}" -S "$sep" \
+                -M "r:|${sep}=* r:|=* $match" - "${${pref%${sep}}##*${sep}}"
+
+      elif [[ "$pref" = *${sep}* ]]; then
+        compadd "$group[@]" "$expl[@]" -S '' "$opts[@]" \
+                -p "${pref%${sep}*}${sep}" \
+                -M "r:|${sep}=* r:|=* $match" - "${pref##*${sep}}"
+      else
         compadd "$group[@]" "$expl[@]" -S '' "$opts[@]" \
                 -M "r:|${sep}=* r:|=* $match" - "$pref"
-
+      fi
+    fi
     return
   fi
 done
diff -ru ../z.old/Completion/User/_mailboxes Completion/User/_mailboxes
--- ../z.old/Completion/User/_mailboxes	Mon Feb 21 12:34:13 2000
+++ Completion/User/_mailboxes	Mon Feb 21 13:17:57 2000
@@ -6,7 +6,7 @@
 # This is still needlessly mutt-biased and should be fixed.
 
 local -U dirboxes
-local i j expl muttrc="${muttrc:-~/.muttrc}"
+local i j expl muttrc="${muttrc:-~/.muttrc}" files nm="$compstate[nmatches]"
 local pinedirectory="${pinedirectory:-~/mail}"
 local maildirectory="${maildirectory:-~/Mail}"
 
@@ -15,6 +15,13 @@
   typeset -U -g _mailbox_cache
   typeset -U -g _maildir_cache _mbox_cache _mh_cache _mutt_cache _pine_cache
 
+  _mailbox_cache=()
+  _mbox_cache=()
+  _maildir_cache=()
+  _mh_cache=()
+  _mutt_cache=()
+  _pine_cache=()
+
   [[ -f ${~muttrc:-.} ]] &&
     _mutt_cache=( ${$(grep mailboxes ${~muttrc})[2,-1]} )
 
@@ -41,48 +48,73 @@
   [[ -n "$mailpath" ]] &&
       _mailbox_cache=( "${_mailbox_cache[@]}" "${(@)mailpath%%\?*}" )
 
-  _mailbox_cache=( "${_mailbox_cache[@]}" $MAIL )
+  [[ -n "$MAIL" ]] && _mailbox_cache=( "${_mailbox_cache[@]}" $MAIL )
 fi
 
-if _wanted files expl 'mailbox specification'; then
-  local -U mbox_names
-  case "${curcontext}" in
-  (*:elm:*) # I've probably got this wrong, or at least incomplete
-    mbox_names=( "${_mbox_cache[@]}" "${_mailbox_cache[@]}" )
-    compadd "${expl[@]}" - \! \< \>;;
-  (*:mail:*)
-    if compset -P '+|-f+'; then
-      mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
-    else
-      mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}" "${_mailbox_cache[@]}" )
-      _path_files -J all-files
-    fi;;
-  (*:mh:*) # I've probably got this wrong, or at least incomplete
-    (( $#_mh_cache )) && _multi_parts "${expl[@]}" / _mh_cache
-    return;;
-  (*:mutt:*)
-    mbox_names=( "${_mutt_cache[@]}" "${_mailbox_cache[@]}" "${_maildir_cache[@]}" )
-    compadd "${expl[@]}" - \! \< \>;;
-  (*: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[@]}" )
-    # _path_files -J all-files -g '/*'
-    ;;
-  (*:(zmail|zmlite):*)
-    if compset -P '+|-f+'; then
-      mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
-    else
-      mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}"
-		   "${_mailbox_cache[@]}" "${_mh_cache[@]}" )
-      compadd "${expl[@]}" - % \&
-      _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[@]}" );;
-  esac
+# Files for pine must be absolute paths.
 
-  (( $#mbox_names )) && _multi_parts "${expl[@]}" / mbox_names
+if [[ "$PREFIX" != (|-f)+* &&
+      ( "${curcontext}" = *:(mail|zmail|zmlite):* ||
+        ( "${curcontext}" = *:pine:* && "$PREFIX" = (|-f)[/\~]* ) ) ]]; then
+  _tags mailboxes files
+else
+  _tags mailboxes
 fi
+
+while _tags; do
+  if _requested mailboxes expl 'mailbox specification'; then
+    local mbox_short
+    local -U mbox_names
+
+    mbox_short=()
+    mbox_names=()
+
+    case "${curcontext}" in
+    (*:elm:*) # I've probably got this wrong, or at least incomplete
+      mbox_names=( "${_mbox_cache[@]}" "${_mailbox_cache[@]}" )
+      mbox_short=( \! \< \> )
+      ;;
+    (*:mail:*)
+      if compset -P '+|-f+'; then
+        mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
+      else
+        mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}" "${_mailbox_cache[@]}" )
+      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[@]}" )
+      mbox_short=( \! \< \> );;
+    (*: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[@]}" )
+      ;;
+    (*:(zmail|zmlite):*)
+      if compset -P '+|-f+'; then
+        mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
+      else
+        mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}"
+		     "${_mailbox_cache[@]}" "${_mh_cache[@]}" )
+        mbox_short=( % \& )
+      fi
+      ;;
+    (*) # Some other program wants mailbox names?  Use them all?
+       mbox_names=( "${_mailbox_cache[@]}" "${_mbox_cache[@]}"
+		    "${_mh_cache[@]}" "${_mutt_cache[@]}" "${_pine_cache[@]}" )
+       ;;
+    esac
+
+    (( $#mbox_names )) && _multi_parts "${expl[@]}" / mbox_names
+    (( $#mbox_short )) && compadd "$expl[@]" - "$mbox_short[@]"
+  fi
+  if _requested files expl 'mailbox file'; then
+    compset -P -f
+    _path_files "$expl[@]"
+  fi
+  [[ nm -ne $compstate[nmatches] ]] && return 0
+done
+
+return 1

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


             reply	other threads:[~2000-02-21 12:30 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-02-21 12:30 Sven Wischnowsky [this message]
2000-02-21 16:41 ` Bart Schaefer
2000-02-21 17:25   ` PATCH: " Bart Schaefer
2000-02-21 20:06   ` Peter Stephenson
2000-02-21 21:59     ` Bart Schaefer
  -- strict thread matches above, loose matches on Subject: below --
2000-02-22  8:52 Sven Wischnowsky
2000-02-22 17:55 ` Peter Stephenson
2000-02-21 10:34 Bart Schaefer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200002211230.NAA13030@beta.informatik.hu-berlin.de \
    --to=wischnow@informatik.hu-berlin.de \
    --cc=zsh-workers@sunsite.auc.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).