summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-04-02 11:38:17 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-04-02 11:38:17 +0000
commit55178af5ea648dda899da8b1c7610566f77ad631 (patch)
tree49cd01a075190a45a208655945ae43ed2fd0426e
parent574e4537bb58dc015f2419185c1135d7d45bb2f4 (diff)
downloadzsh-55178af5ea648dda899da8b1c7610566f77ad631.tar.gz
zsh-55178af5ea648dda899da8b1c7610566f77ad631.zip
moved from Completion/User/_mailboxes
-rw-r--r--Completion/Unix/Type/_mailboxes186
1 files changed, 186 insertions, 0 deletions
diff --git a/Completion/Unix/Type/_mailboxes b/Completion/Unix/Type/_mailboxes
new file mode 100644
index 000000000..53f452ce5
--- /dev/null
+++ b/Completion/Unix/Type/_mailboxes
@@ -0,0 +1,186 @@
+#autoload
+
+_mailboxes() {
+ #emulate -L zsh
+ local expl ret=1
+ local pinedirectory="${pinedirectory:-~/mail}"
+ local maildirectory="${maildirectory:-~/Mail}"
+
+ if (( ! $+_mailbox_cache )) then
+ _mailbox_cache "$@"
+ fi
+
+ case "${curcontext}" in
+ (*:mail:*)
+ if [[ "$PREFIX" == +* ]]; then
+ _tags mailboxes
+ else
+ _tags mailboxes files
+ fi;;
+ (*:(mush|zmail|zmlite):*)
+ if [[ "$PREFIX" == [%+]* ]]; then
+ _tags mailboxes
+ else
+ _tags mailboxes files
+ fi;;
+ (*:mutt:*)
+ if [[ "$PREFIX" == (|-f)[+=]* ]]; then
+ _tags mailboxes
+ else
+ _tags mailboxes files
+ fi;;
+ (*:pine:*)
+ # Files for pine must be absolute paths.
+ if [[ "$PREFIX" == (|-f)[/\~]* ]]; then
+ pinedirectory=''
+ _tags mailboxes files
+ else
+ _tags mailboxes
+ fi;;
+ (*)
+ if [[ "$PREFIX" == (|-f)+* ]]; then
+ _tags mailboxes
+ else
+ _tags mailboxes files
+ fi;;
+ esac
+
+ while _tags; do
+ _requested mailboxes expl 'mailbox specification' _mua_mailboxes && ret=0
+
+ if _requested files expl 'mailbox file'; then
+ [[ "${curcontext}" != *:(mail|mush|mutt|zmail|zmlite):* ]] &&
+ compset -P -f
+ _files "$expl[@]" && ret=0
+ fi
+ (( ret )) || return 0
+ done
+
+ return 1
+}
+
+_mailbox_cache () {
+ # Depends on $maildirectory and $pinedirectory from _mailboxes!
+
+ local i j _mc_tmp muttrc="${muttrc:-~/.muttrc}"
+ local -aU dirboxes
+ typeset -aU -g _mailbox_cache
+ typeset -aU -g _maildir_cache _mbox_cache _mh_cache _mutt_cache _pine_cache
+
+
+ [[ -f ${~muttrc:-.} ]] &&
+ _mc_tmp=${=${(M)${(f)"$(<${~muttrc})"}:#mailboxes *}#mailboxes *} &&
+ _mutt_cache=( ${=${(Xe)_mc_tmp}} )
+
+ _mbox_cache=( ${~maildirectory}/*(^/) )
+ _pine_cache=( ${~pinedirectory}/**/*(.) )
+
+ dirboxes=( ${~maildirectory}/*(/) )
+
+ while (( $#dirboxes )); do
+ i=${dirboxes[1]}
+ shift dirboxes
+ if [[ -d "$i/cur" ]]; then
+ _maildir_cache=( "${_maildir_cache[@]}" "$i" )
+ elif j=( "$i"/<1-> ) && [[ -n "$j" ]]; then
+ _mh_cache=( "${_mh_cache[@]}" "$i" )
+ dirboxes=( $dirboxes "$i"/*(/) )
+ else
+ _mbox_cache=( "${_mbox_cache[@]}" "$i"/*(.) )
+ dirboxes=( $dirboxes "$i"/*(/) )
+ fi
+ done
+
+ [[ -n "$mailpath" ]] &&
+ _mailbox_cache=( "${_mailbox_cache[@]}" "${(@)mailpath%%\?*}" )
+
+ [[ -n "$MAIL" ]] && _mailbox_cache=( "${_mailbox_cache[@]}" $MAIL )
+}
+
+_mua_mailboxes() {
+ # Depends on $maildirectory and $pinedirectory from _mailboxes!
+
+ local -a mbox_short
+ local -aU mbox_names
+ local ret=1
+
+ 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 +; then
+ mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
+ else
+ mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}"
+ "${_mailbox_cache[@]}" )
+ fi
+ ;;
+ (*:mh:*)
+ local lastmhbox=$(mhpath)
+ if compset -P +; then
+ mbox_names=( "${(@)_mh_cache#$~maildirectory/}" )
+ elif compset -P @; then
+ mbox_names=( "${(@)${(@M)_mh_cache:#$~lastmhbox/*}#$~lastmhbox/}" )
+ else
+ mbox_names=( +"${(@)^_mh_cache#$~maildirectory/}"
+ @"${(@)^${(@M)_mh_cache:#$~lastmhbox/*}#$~lastmhbox/}"
+ "${_mh_cache[@]}" )
+ fi
+ ;;
+ (*:mush:*)
+ if compset -P %; then
+ mbox_short=( "${(@k)userdirs}" )
+ elif compset -P +; then
+ mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
+ else
+ mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}"
+ "${_mailbox_cache[@]}" )
+ mbox_short=( \& % %"${(@k)^userdirs}" )
+ fi
+ ;;
+ (*:mutt:*)
+ if compset -P '='; then
+ mbox_names=( "${_mutt_cache[@]#[+=]}" "${(@)_mbox_cache#$~maildirectory/}" "${(@)_maildir_cache#$~maildirectory/}" "${(@)_mh_cache#$~maildirectory/}")
+ elif compset -P +; then
+ mbox_names=( "${_mutt_cache[@]#[+=]}" "${(@)_mbox_cache#$~maildirectory/}" "${(@)_maildir_cache#$~maildirectory/}" "${(@)_mh_cache#$~maildirectory/}")
+ else
+ mbox_names=( "${_mutt_cache[@]}" "${_mailbox_cache[@]}"
+ "${_maildir_cache[@]}" "${_mh_cache[@]}" )
+ mbox_short=( \! \< \> )
+ fi
+ ;;
+ (*: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[@]}"
+ "${_mailbox_cache[@]}" "${_mh_cache[@]}" )
+ ;;
+ (*:tkrat:*) # Has a couple of custom formats I haven't programmed for.
+ mbox_names=( "${_mbox_cache[@]}"
+ "${_mailbox_cache[@]}" "${_mh_cache[@]}" )
+ ;;
+ (*:(zmail|zmlite):*)
+ if compset -P %; then
+ mbox_short=( "${(@k)userdirs}" )
+ elif compset -P +; then
+ mbox_names=( "${(@)_mbox_cache#$~maildirectory/}" )
+ else
+ mbox_names=( +"${(@)^_mbox_cache#$~maildirectory/}"
+ "${_mailbox_cache[@]}" "${_mh_cache[@]}" )
+ mbox_short=( \& % %"${(@k)^userdirs}" )
+ 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 "$@" / mbox_names && ret=0
+ (( $#mbox_short )) && compadd "$@" -a mbox_short && ret=0
+ return ret
+}
+
+_mailboxes "$@"