;;; .Gnus.el --- My Gnus settings
;:*=======================
;:* RCS Header.
;; RCS: $Id: .Gnus.el,v 1.7 2004-03-03 09:50:41+10 steve Exp $
;; Author:        Steve Youngs <sryoungs@bigpond.net.au>
;; Maintainer:    Steve Youngs <sryoungs@bigpond.net.au>
;; Created:       2001-02-07
;; Last-Modified: <2004-03-03 07:42:09 (steve)>
;; Keywords:      mail news usenet gnus

;:*=======================
;:* Legalese (aka Copyright)
;; Copyright (C) 2001,02,03 Steve Youngs

;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following conditions
;; are met:
;;
;; 1. Redistributions of source code must retain the above copyright
;;    notice, this list of conditions and the following disclaimer.
;;
;; 2. Redistributions in binary form must reproduce the above copyright
;;    notice, this list of conditions and the following disclaimer in the
;;    documentation and/or other materials provided with the distribution.
;;
;; 3. Neither the name of the author nor the names of any contributors
;;    may be used to endorse or promote products derived from this
;;    software without specific prior written permission.
;;
;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
;; DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

;:*=======================
;:* *** WARNING ***
;;
;; A lot of this stuff you'll only find in the latest released version
;; of Gnus (5.10.x), or the development version.  I'm pretty sure that
;; I've marked anything that is only in latest version, but I could
;; have easily missed something.  If something doesn't work for you,
;; it just may be that you don't have a new enough Gnus.  At the time
;; of writing, everything in this file works for me.

;:*=======================
;:* General Comments
;;
;; This file is not meant as a drop in to get up and running with Gnus
;; quickly, you'll have to hack the crap out of it before it's useful.
;; It's tailored more towards the advanced user, but newbies shouldn't
;; be scared off either.  If you're a newbie my advice would be to use
;; this file as a reference, taking things from it as you understand
;; them and add them to your own setup.

;:*=======================
;:* Viewing this on the web?
;; 
;; Get the latest version of the source here.

;:*=======================
;:* Use a byte-compiled .gnus file
;;
;; This is a bit controversial because it can tickle a bug in
;; XEmacs, causing XEmacs to dump core.  I find this happens a lot
;; less often if this file is in the current buffer (after a show
;; all) when you start Gnus.  With that said, I usually don't let
;; Gnus auto-recompile, instead I just `eval-current-buffer' when
;; I change this file.
(defun Gnus-Wait ()
  "Automatically byte-compile ~/.Gnus.el if it's newer than ~/.gnus.
It renames the resulting ~/.Gnus.elc to ~/.gnus, and then reload it."
  (let* ((source (expand-file-name ".Gnus.el" (getenv "HOME")))
         (object (expand-file-name ".gnus" (getenv "HOME")))
         (compiled (concat source "c")))
    (cond
     ((file-newer-than-file-p source object)
      (let ((mode-line-format 
             "*** PLEASE STANDBY: RECOMPILING .Gnus.el **"))
        (yow)
        (sit-for 2)
        (byte-compile-file source)
        (message ".gnus recompiled --- reloading ...")
        (rename-file compiled object t))
      (load object t t t)
      (message "Gnus.el recompiled")))))

(Gnus-Wait)

;:*=======================
;:* Requires
;;
;; A couple of things here you definitely won't have.  Because I wrote
;; some of them :-) If you can't find something that you think you
;; need, drop me a line and I'll get it to you.
(require 'gnus)
(require 'gnus-diary)
(require 'gnus-ml)
(require 'gnus-picon)
(require 'gnus-score)
(require 'gnus-topic)
(require 'earcon)
(require 'mailcap)
(require 'messkeyw)
(require 'mml-sec)
(require 'nnspool)
(when (and (featurep 'mule)
           (< emacs-minor-version 5))
  (require 'pgg))
(require 'boxquote)
(require 'supercite-sy) 
;; View supercite settings: 
;                           html
;                           source
(require 'patch-keywords)
(if (featurep 'mule)
    (require 'mpg123))
(require 'nnir)

;:*=======================
;:* I'm an expert!
;;
;; I have `gnus-verbose' and `gnus-verbose-backends' maxed out to aid
;; in debugging.  I am running the development version of Gnus after
;; all.
(setq 
 gnus-expert-user t
 gnus-verbose 10
 gnus-verbose-backends 10)

;:*=======================
;:* Posting Styles
;;
;; `gnus-posting-styles' gives you the ability to have different
;; "personalities" for different mail or news groups.  The element
;; "x-face-file" is only in the latest Gnus.  The thing to remember
;; here is that last match wins.  Other than that, this is pretty
;; straight forward.  Have a look in the Texinfo manual for all the
;; gory details.
;;
;; M-: (Info-goto-node "(gnus)Posting Styles") RET
(setq gnus-posting-styles
      '((".*" 
         (name "Steve Youngs")
         (address "sryoungs@bigpond.net.au")
         (organization "Linux Users - Fanatics Dept.")
         (signature-file "~/Gnus/sigs/default.sig")
         ("X-Request-PGP" "<http://users.bigpond.net.au/sryoungs/pgp/sryoungs.asc>")
         ("X-OpenPGP-Fingerprint" "1659 2093 19D5 C06E D320  3A20 1D27 DB4B A94B 3003")
         ("X-URL" "<http://users.bigpond.net.au/sryoungs/>")
         ("X-Attribution" "SY")
         ("X-Now-Playing" (eval
                           (if (featurep 'mpg123)
                               (mpg123:get-music-info 
                                mpg123*cur-music-number 'name)
                             "The Sounds of Silence --- [Marcel Marceau]")))
         (x-face-file "~/Gnus/xface/koala.xface"))
        ;; SQL-Ledger mailing list
        ("^nnml:sql.ledger"
         (x-face-file "~/Gnus/xface/money.xface"))
        ;; XEmacs mailing lists
        ("^nnml:xemacs.*"
         (signature-file "~/Gnus/sigs/xemacs.sig")
         (x-face-file "~/Gnus/xface/xemacs.xface")
         (organization "The XEmacs Project")
         ("X-URL" "<http://www.xemacs.org/>"))
        ("^nnml:xemacs.patches"
         ("X-Reviewer-Action" ""))
        ;; Local mail/news.
        ("^nnml:private.local\\|^local\\.\\(news\\|bigpond\\)"
         (address "steve@eicq.dnsalias.org")
         (signature-file "~/Gnus/sigs/local.sig")
         (x-face-file "~/Gnus/xface/steve.xface"))
        ;; ICQ related posts.
        ("^nnml:eicq.*\\|^nnml:icq.devel\\|^alt\\.chat-programs\\.icq"
         (signature-file "~/Gnus/sigs/eicq.sig")
         (organization "Eicq - The XEmacs ICQ Client.")
         ("X-Attribution" "Eicq")
         ("X-URL" "<http://eicq.sf.net/>")
         (x-face-file "~/Gnus/xface/eicq.xface"))
        ;; Mail to Tiffany.
        ("^nnml:private.Tiffany"
         (name "Daddy")
         (organization "Tiffany's Terrific!")
         (signature-file "~/Gnus/sigs/tiffany.sig")
         ("X-Attribution" "Dad")
         (x-face-file "~/Gnus/xface/koala.xface"))
        ;; Job application posts.
        ("^nnml:employment"
         (organization "Hire me for Increased Productivity & Profits")
         (signature-file "~/Gnus/sigs/employment.sig")
         (x-face-file "~/Gnus/xface/steve.xface")
         ("X-URL" "<http://resume.jobnet.com.au/resume/youngs22.html>"))
        ;; Aarg.net mail
        ("^nnml:aarg.private"
         (address "youngs@aarg.net")
         (organization "Over on the AARG!")
         (signature-file "~/Gnus/sigs/aarg.sig")
         (x-face-file "~/Gnus/xface/sylvester.xface"))
        ;; alt.os.linux.slackware
        ("^alt\\.os\\.linux\\.slackware"
         ("Face" (eval (gnus-face-from-file "~/Gnus/face/dobbslack.jpg")))
         (x-face-file "~/Gnus/xface/bob.xface"))))
;:*=======================
;:* Banners.
;;
;; I really hate those mailing lists that like to add stuff to the
;; bottom of every article.  It's usually subscription instructions
;; but quite often you get advertising as well.  Either way, it annoys
;; the crap out of me, so they MUST GO!  `gnus-article-banner-alist'
;; is an alist of symbol/regexp pairs.  The symbols are then used with
;; the "banner" parameter in `gnus-parameters'.
(setq gnus-article-banner-alist
      (let* ((ads "\\(^-------------------------------------------------------$\\|^This sf\\.net email is sponsored by:ThinkGeek$\\|^No, I will not fix your computer\\.$\\|^Welcome to geek heaven\\.$\\|^http://thinkgeek\\.com/sf$\\|^We have stuff for geeks like you\\.$\\|^Oh, it's good to be a geek\\.$\\)")
             (sigs "\\(\\(^_______________________________________________$\\|^-------------------------------------------------$\\)\\|\\(^Emacs-devel \\|^Tramp-devel \\|^mh-e-devel \\|sql-ledger-users \\)mailing list$\\|^sql-ledger-users@sql-ledger.org$\\|^Emacs-devel@gnu\\.org$\\|^https?://\\(mail\\.\\(gnu\\|freesoftware\\.fsf\\)\\.org/mailman/listinfo/\\(emacs\\|tramp\\|mh-e\\)-devel\\|www\\.d\\.kth\\.se/~d95-mih/icq/icq-devel/\\|lists\\.sourceforge\\.net/lists/listinfo/\\(tramp-devel\\|bbdb-info\\|mh-e-devel\\|sql-ledger-users\\)\\)$\\|^Emacs-devel@gnu\\.org$\\|^\\(bbdb-info\\|Tramp-devel\\|mh-e-devel\\)@\\(lists\\.sourceforge\\.net\\|mail\\.freesoftware\\.fsf\\.org\\)$\\|^BBDB Home Page: http://bbdb\\.sourceforge\\.net/$\\|^icq-devel - The forum for ICQ protocol discussion$\\|^For unsubscribe and other mailing list info, see:$\\)")
             (lkml "\\(^-$\\|^To unsubscribe from this list: send the line \"unsubscribe linux-kernel\" in$\\|^the body of a message to majordomo@vger\\.kernel\\.org$\\|^More majordomo info at  http://vger\\.kernel\\.org/majordomo-info\\.html$\\|^Please read the FAQ at  http://www\\.tux\\.org/lkml/$\\)"))
        (list (cons 'sfads ads)
              (cons 'listsigs sigs)
              (cons 'sig-ads (concat ads "\\|" sigs))
              (cons 'lkmlsig lkml))))
;:*=======================
;:* Gnus Parameters
;;
;; Everything here can just as easily be done in the group buffer
;; with 'G p' or 'G c'.  But if you do it that way, it ends up in the
;; '~/.newsrc.eld'.  I hate that.  And having the group parameters
;; here seems to be easier to maintain.
;;
;; M-: (Info-goto-node "(gnus)Group Parameters") RET
;; Also see above section "Banners".
(setq gnus-parameters
      '(("^nnml:.*"
         (total-expire . t)
         (expiry-wait . immediate)
         (display . default)
         (charset . iso-8859-1))
        ;; Mail from Tiffany.
        ("^nnml:private\\.Tiffany"
         (expiry-wait . 10)
         (gcc-self . t)
         (display . all))
        ;; SQL-Ledger mailing list.
        ("^nnml:sql\\.ledger"
         (to-address . "SL Users <sql-ledger-users@sql-ledger.org>")
         (to-list . "SL Users <sql-ledger-users@sql-ledger.org>")
         (admin-address . "sql-ledger-users-request@sql-ledger.org")
         (banner . sig-ads)
         (subscribed . t)
         (expiry-target . delete))
        ;; BBDB mailing list.
        ("^nnml:bbdb\\.info"
         (to-address . "BBDB List <bbdb-info@lists.sf.net>")
         (to-list . "BBDB List <bbdb-info@lists.sf.net>")
         (admin-address . "bbdb-info-request@lists.sf.net")
         (banner . sig-ads)
         (subscribed . t)
         (expiry-target . delete))
        ;; ICQ mailing lists.
        ("^nnml:eicq\\.\\(\\w+\\)"
         (to-address . "Eicq \\1 <eicq-\\1@lists.sf.net>")
         (to-list . "Eicq \\1 <eicq-\\1@lists.sf.net>")
         (admin-address . "eicq-\\1-request@lists.sf.net")
         (subscribed . t)
         (banner . sfads))
        ("^nnml:icq\\.devel"
         (to-address . "ICQ Devel <icq-devel@blipp.com>")
         (to-list . "ICQ Devel <icq-devel@blipp.com>")
         (admin-address . "icq-devel-request@blipp.com")
         (subscribed . t)
         (banner . listsigs))
        ;; Gnus mailing list.
        ("^nnml:gnus\\.ding"
         (to-address . "Gnus List <ding@gnus.org>")
         (to-list . "Gnus List <ding@gnus.org>")
         (subscribed . t))
        ;; MH-e mailing list.
        ("^nnml:mh-e\\.\\(\\w+\\)"
         (to-address . "MH-E \\1 <mh-e-\\1@lists.sf.net>")
         (to-list . "MH-E \\1 <mh-e-\\1@lists.sf.net>")
         (admin-address . "mh-e-\\1-request@lists.sf.net")
         (subscribed . t)
         (banner . sig-ads))
        ;; Tramp mailing list.
        ("^nnml:tramp\\.devel"
         (to-address . "Tramp Development <tramp-devel@nongnu.org>")
         (to-list . "Tramp Development <tramp-devel@nongnu.org>")
         (admin-address . "tramp-devel-request@mnongnu.org")
         (subscribed . t)
         (banner . listsigs))
        ;; INN mailing list.
        ("^nnml:inn\\.workers"
         (to-address . "INN Workers <inn-workers@isc.org>")
         (to-list . "INN Workers <inn-workers@isc.org>")
         (admin-address . "inn-workers-request@isc.org")
         (subscribed . t)
         (expiry-target . delete))
        ;; XEmacs mailing lists.
        ("^nnml:xemacs\\.\\(\\w+\\)"
         (to-address . "XEmacs \\1 <xemacs-\\1@xemacs.org>")
         (to-list . "XEmacs \\1 <xemacs-\\1@xemacs.org>")
         (admin-address . "xemacs-\\1-request@xemacs.org")
         (subscribed . t))
        ;; Linux kernel
        ("^nnml:linux\\.kernel"
         (to-address . "Linux Kernel List <linux-kernel@vger.kernel.org>")
         (to-list . "Linux Kernel List <linux-kernel@vger.kernel.org>")
         (admin-address . "<majordomo@vger.kernel.org>")
         (subscribed . t)
         (expiry-target . delete)
         (banner . lkmlsig))
        ;; Catch all to delete unwanted mail.
        ("^nnml:\\(SPAM.*\\|returned\\.mail\\|INBOX\\|gnus\\.cvs\\|employment\\|freshmeat\\.news\\|private\\.logs\\|tramp.checkins\\|xemacs.cvs\\)"
         (expiry-target . delete))))

;:*=======================
;:* Mail-Copies-To - not me!
;;
;; I hate it when people reply to my posts on mailing lists or
;; newsgroups that I'm subscribed to and they send to the list or
;; newsgroup *and* Cc to me.  This function sets a "Mail-Copies-To:
;; never" header to any mailing list or newsgroup post.  It's just
;; a shame that there are so many broken MUA's out there that don't
;; honour this header.  Oh well, this cuts down a fair amount of
;; them.  Just hang this off `message-header-setup-hook'.
(defun steve-message-header-setup-hook ()
  (let ((group (or gnus-newsgroup-name "")))
    (when (or (message-fetch-field "newsgroups")
              (gnus-group-find-parameter group 'to-address)
              (gnus-group-find-parameter group 'to-list))
      (insert "Mail-Copies-To: never\n"))))

;:*=======================
;:* Washing Mail
;;
;; Lots of various things to make messages look sane.
;;
;; M-: (Info-goto-node "(gnus)Customizing Articles") RET
(setq 
 gnus-treat-body-boundary nil
 gnus-treat-buttonize t
 gnus-treat-buttonize-head 'head
 gnus-treat-date-original 'head
 gnus-treat-display-smileys t
 gnus-treat-display-x-face 'head
 gnus-treat-emphasize t
 gnus-treat-fill-long-lines nil
 gnus-treat-from-picon 'head
 gnus-treat-hide-boring-headers 'head
 gnus-treat-highlight-citation t
 gnus-treat-highlight-headers 'head
 gnus-treat-highlight-signature 'last
 gnus-treat-mail-picon 'head
 gnus-treat-newsgroups-picon 'head
 gnus-treat-play-sounds t
 gnus-treat-strip-cr t
 gnus-treat-strip-leading-blank-lines t
 gnus-treat-strip-trailing-blank-lines t
 gnus-treat-strip-pem t
 gnus-treat-translate t
 nnmail-treat-duplicates 'delete
 gnus-list-identifiers '("\\[icq-devel\\]" 
                         "\\[Tramp-checkins\\]"
                         "\\[Tramp-devel\\]"
                         "\\[Eicq-cvs\\]"
                         "\\[eMoney-cvs\\]"
                         "\\[SL\\]"))
;; Do our best to discourage HTML
(add-to-list 'mm-discouraged-alternatives "text/html")
(setq mm-automatic-display (remove "text/html" mm-automatic-display))
;; If we really want to see it, render it with html2text.el.  This is
;; only in the latest release.
(setq mm-text-html-renderer 'html2text)

;:*=======================
;:* Picons
;;
;; M-: (Info-goto-node "(gnus)Picons")
(setq
 gnus-picon-databases '("/usr/local/faces")
 gnus-picon-user-directories '("users" "misc" "usenix")
 gnus-picon-domain-directories '("domains" "misc" "usenix")
 gnus-picon-news-directories '("news" "misc" "usenix"))

;:*=======================
;:* Create a customised message-id
(defun message-make-message-id ()
  "Make a unique Message-ID."
  (concat "<microsoft-free." (message-unique-id)
          "@eicq.dnsalias.org>"))

;:*=======================
;:* Signature Separator
(setq gnus-signature-separator
      '("^--  $" 
        "^-- *$" 
        "^_________*$"
        "^______________.*$"
        "^-------------------------------------------------$"))

;:*=======================
;:* Neato things with Subject headers.
;; I think this stuff is now part of Gnus proper.
(defconst steve-obsolete-subject " (?was: .*"
  "*Regexp matching obsolete subjects.")

(defun steve-clear-subject ()
  "Remove steve-obsolete-subject from subject-header."
  (interactive)
  (let ((case-fold-search nil))
    (save-excursion
      (goto-line 0)
      (re-search-forward "^Subject: ")
      (if (re-search-forward steve-obsolete-subject nil t)
          (replace-match "")))))

(defun steve-change-subject (new-subject)
  "Introduces new subject.
Argument NEW-SUBJECT The subject to change to."
  (interactive "sNew Subject: ")
  (let ((case-fold-search nil))
    (save-excursion
      (goto-line 0)
      (re-search-forward "^Subject: ")
      (if (re-search-forward "R[Ee]: " nil t)
          (replace-match ""))
      (insert-string new-subject)
      (insert-string " (was: ")
      (end-of-line)
      (insert-string ")"))))

(define-key message-mode-map '"\M-n" 'steve-change-subject)
(define-key message-mode-map '"\M-o" 'steve-clear-subject)

;:*=======================
;:* Supercite Settings
;; The Supercite settings are now in their own file.  For reasons beyond me
;; it works better that way.

;:*=======================
;:* PGG - Emacs interface to GnuPG
;;
(setq
 mml2015-use 'pgg
 pgg-scheme 'gpg
 pgg-default-scheme 'gpg
 pgg-default-user-id "A94B3003")
(define-key gnus-summary-mode-map [f7] 'gnus-summary-force-verify-and-decrypt)
(define-key message-mode-map      [f7] 'mml-secure-message-sign-pgpmime)
(define-key message-mode-map      [f8] 'mml-secure-message-encrypt-pgpmime)
;:*=======================
;:* Mail and News Sources (where does the mail come from).
(setq mail-sources
      '((file :path "/home/steve/mail/INBOX"
              :plugged t)))
(setq gnus-agent nil)

;; *** WARNING ***
;; Development versions of Gnus do _NOT_ delete any incoming mail,
;; instead it keeps a backup of all your mail just in case something
;; bad happens, or you shoot yourself in the foot (easy to do with
;; Gnus).  I turn that "feature" off because I get a shit load of
;; mail, have a finite amount of disk space, and I like living on the
;; edge.  Set this at your own risk.  YOU HAVE BEEN WARNED.
(setq  mail-source-delete-incoming t)

;; The primary method is the local news server.
(setq
 gnus-select-method '(nntp "localhost")
 gnus-refer-article-method '(nntp "localhost")
 nnspool-inews-program '"/usr/local/news/bin/inews"
 nnspool-spool-directory '"/usr/local/news/spool"
 nnspool-lib-dir '"/usr/local/news/lib"
 nnspool-nov-directory '"/usr/local/news/spool/overview"
 nnspool-active-file '"/usr/local/news/db/active"
 nnspool-active-times-file '"/usr/local/news/db/active.times"
 nnspool-history-file '"/usr/local/news/db/history"
 gnus-article-save-directory "~/Gnus/Save/")
;; This method is for expired articles.
(add-to-list 'gnus-secondary-select-methods
             '(nnml "expired"
                    (nnml-directory "~/Gnus/Expired/")
                    (nnml-active-file "~/Gnus/Expired/active")
                    (nnml-inhibit-expiry t)))
;; This method is the main mail method.
(add-to-list 'gnus-secondary-select-methods
             '(nnml ""
                    (nnml-directory "~/Gnus/Mail/")
                    (nnml-active-file "~/Gnus/Mail/active")
                    (nnml-newsgroups-file "~/Gnus/etc/newsgroups")
                    (nnml-get-new-mail t)))

;:*=======================
;:* Archive - putting sent mail and news somewhere
(setq gnus-message-archive-method
      '(nnml "archive"
             (nnml-inhibit-expiry t)
             (nnml-directory "~/Gnus/Sent/")
             (nnml-active-file "~/Gnus/Sent/active")))
(setq gnus-message-archive-group
      '((if (message-news-p)
            (concat "sent.news." 
                    (format-time-string "%Y.%b"))
          (concat "sent.mail." 
                  (format-time-string "%Y.%b")))))

;:*=======================
;:* NNDiary stuff.
;;
;; See the comments in nndiary.el for more information about this
;; nifty backend.
(setq nndiary-mail-sources
      '((file :path "~/mail/nndiary")))
(add-to-list 'gnus-secondary-select-methods
             '(nndiary ""
                       (nndiary-directory "~/Gnus/Diary/")
                       (nndiary-active-file "~/Gnus/Diary/active")
                       (nndiary-get-new-mail t)))
(setq nndiary-reminders '((15 . minute)
                          (30 . minute)
                          (1 . day)
                          (2 . day)
                          (1 . week)
                          (2 . week))
      nndiary-split-methods '(("diary.anniversary" "Subject:.*ANV:")
                              ("diary.standard" "")))

;:*=======================
;:* Expiring mail
;;
;; There is a fair amount of mail that I don't want to lose, and at
;; the same time I don't want it cluttering up my normal mail groups.
;; So I use `nnmail-fancy-expiry-targets' to expire mail into separate
;; nnml dated groups.  M-: (Info-goto-node "(gnus)Expiring Mail") RET
;;
;; Of course there is also mail that I don't want to keep and that
;; just gets deleted.  Unfortunately, you can't delete expired mail
;; from `nnmail-fancy-expiry-targets', so for those groups I use
;; `gnus-parameters' (see above). Which is why I don't have a "catch
;; all" rule here.
(setq nnmail-expiry-target 'nnmail-fancy-expiry-target
      nnmail-fancy-expiry-targets
      '(("xref" "eicq\\.admin" "nnml+expired:eicq.admin.%Y.%b")
        ("xref" "eicq\\.bugs" "nnml+expired:eicq.bugs.%Y.%b")
        ("xref" "eicq\\.cvs" "nnml+expired:eicq.cvs.%Y.%b")
        ("xref" "eicq\\.devel" "nnml+expired:eicq.devel.%Y.%b")
        ("xref" "eicq\\.users" "nnml+expired:eicq.users.%Y.%b")
        ("xref" "gnus\\.ding" "nnml+expired:gnus.ding.%Y.%b")
        ("xref" "icq\\.devel" "nnml+expired:icq.devel.%Y.%b")
        ("xref" "private\\.Tiffany" "nnml+expired:private.Tiffany")
        ("xref" "private\\.net" "nnml+expired:private.net.%Y.%b")
        ("xref" "private\\.local" "nnml+expired:private.local.%Y.%b")
        ("xref" "tramp\\.devel" "nnml+expired:tramp.devel.%Y.%b")
        ("xref" "aarg\\.private" "nnml+expired:aarg.private.%Y.%b")
        ("xref" "mh-e\\.devel" "nnml+expired:mh-e.devel.%Y.%b")
        ("xref" "xemacs\\.beta" "nnml+expired:xemacs.beta.%Y.%b")
        ("xref" "xemacs\\.patches" "nnml+expired:xemacs.patches.%Y.%b")
        ("xref" "xemacs\\.review" "nnml+expired:xemacs.review.%Y.%b")))

;; This is for cancelling news articles, which is kinda like expiring,
;; sorta.
(setq canlock-password "7a67fb0b1fd56ffe4e4b1cb092abb9eea8268223")

;:*=======================
;:* Splitting mail
;;
;; This sorts the mail into various mail groups.  Yeah, sure you could
;; use procmail to do this, but why use procmail when you can use
;; lisp. :-) Besides, once you get used to it, splitting mail with
;; Gnus is easier than with procmail.
;;
;; M-: (Info-goto-node "(gnus)Splitting Mail") RET
;; M-: (Info-goto-node "(gnus)Fancy Mail Splitting") RET
;;
;; Some split abbrevs to make things a little easier.
(setq nnmail-split-abbrev-alist 
      '((any . "from\\|to\\|cc\\|sender\\|apparently-to\\|resent-from\\|resent-to\\|resent-cc") 
        (mail . "mailer-daemon\\|postmaster\\|uucp") 
        (to . "to\\|cc\\|apparently-to\\|resent-to\\|resent-cc") 
        (from . "from\\|sender\\|resent-from") 
        (nato . "to\\|cc\\|resent-to\\|resent-cc") 
        (naany . "from\\|to\\|cc\\|sender\\|resent-from\\|resent-to\\|resent-cc") 
        ;; My additions to the defaults:
        ;; Stuff that isn't text/plain is quite often SPAM
        (content-spam . "\\(text/html\\|big5\\|gb2312\\|ks_c_.*\\|euc-kr\\)") 
        ;; As are most binary/base64 encoded emails SPAM
        (encoding-spam . "\\(binary\\|base64\\)") 
        ;; Some subjects, just scream, "SPAM!"
        (subject-spam . "\\(ADV:.*\\|not spam\\|adverti[sz]ement\\|[^a-zA-Z0-9]+$\\|[Ww]ealth\\|\\$\\$\\|adult webcam\\|Get out of debt.*\\|money\\|home based business\\|work from home\\|toner cartridges\\|Sprinternet\\|HGH\\|lottery\\|.*Smokeless Grill.*\\|Business Sales\\|NEW PRODUCT\\|Home Business\\|Time Share\\)") 
        ;; Some known spammers
        (author-spam . "\\(\\(online\\)?market\\(ing\\|ers?\\)[0-9]*@\\|\\(un\\)?subscribe[0-9]*@\\|.*@anywhere\\.com\\|.*@domain\\.com\\|.*@everywhere\\.com\\|.*@send\\.com\\|.*@the\\.net\\|.*@unknown\\.com\\|VIP[0-9]*@\\|.*@public\\.com\\|all[0-9]*@\\|anyone[0-9]*@\\|do@not\\(\\.reply\\)?\\|fr\\(ie\\|ei\\)nd[sz]?[0-9]*@\\|freedomads@\\|hello[0-9]*@\\|internet[0-9]*@\\|netizens?[0-9]*@\\|no@reply\\|noreply[0-9]*@\\|opportunity[0-9]*@\\|pagesubmit@hotmail\\.com\\|public[0-9]*@\\|recipients?[0-9]*@\\|remove[0-9]*@\\|removeall[0-9]*@\\|reply.?by.?phone[0-9]*@\\|reply[0-9]*@\\|respond[0-9]*@\\|satisfaction[0-9]*@\\|someone[0-9]*@\\|success[0-9]*@\\|thanks[0-9]*@\\|unknown[0-9]*@\\|username[0-9]*@\\|your?[0-9]*@\\|dvd_dvd_007@yahoo\\.com\\|OrderToday@cybernetemail\\.com\\|vtxid@yahoo\\.com\\|info@accucredit\\.info\\|*@buscacompra\\.com\\.br\\|nku1@totalise\\.co\\.uk\\|.*@networkprofit\\.com\\|networkadmin@.*\\|tiffylestily7060@mail-box\\.com\\|.*@septic\\(help\\|tank\\)\\.com\\|info@machine[0-9]+\\.com\\|Inkjetscentral\\.com@.*\\|jos_edw@mail\\.com\\|CableDescrambler.*@aol\\.com\\|Ronnie@microsoft\\.com\\|VOSSTKV@AOL\\.com\\|drgomezjuliojr[0-9]+@arabia\\.com\\|capapptravel@hotmail\\.com\\|wjjzzs@wjjzzs\\.com\\|gatosons@public\\.wh\\.hb\\.cn\\|yourgreatestdealsonearth[0-9]+v[0-9]+@yahoo\\.com\\|wjjzzs@wjjzzs\\.com\\|mkelley@nmsu\\.edu\\|Amber[0-9]+@hotmail\\.com\\|ana[0-9]+@yahoo\\.com\\|kmontgomery@glpower\\.com\\|dylan[0-9]+@msn\\.com\\|ZerrinleSex@yahoo\\.com\\|houshen[0-9]+@sina\\.com\\|FREE-TV-4-U[0-9]+[a-z]+[0-9]+@.*\\|big@boss\\.com\\|john[0-9]+@yahoo\\.com\\|dethangelz@hotmail\\.com\\|computer@aol\\.com\\|msn\\.com\\|web\\.de\\|t0t2@prodigy\\.net\\|info@cfc-alert\\.com\\)") 
        ;; Some domain names used by some spammers
        (domain-spam . "\\(abcdefgh\\|abundance\\|ads-are-us\\|adult\\|advantage\\|alladvantage\\|auction\\|autorespond\\|banner\\|bestbuy\\|bizemall\\|bulk-e-mail\\|bulk-email\\|bulkemail\\|cash\\|casino\\|discount\\|dollar\\|easysavings\\|entrepreneur\\|erotic\\|fortune\\|girls\\|income\\|infofree\\|invest\\|market\\|money\\|mortgage\\|naked\\|pleasure\\|porn\\|preferred\\|profit\\|promo\\|pussy\\|randomdomain\\|search-engine\\|searchengine\\|secrets\\|sex\\|shopper\\|spam[^\\(-scanned\\)]\\|wallstreet\\|xxx\\|webmasterdirect\\|cocoa\\.ocn\\.ne\\.jp\\|kid-game\\.co\\.jp\\|mail\\.glpower\\.com\\|nm\\.ru\\|email\\.plateautel\\.net\\|.*\\.adsl\\.skynet\\.be\\|mail\\.petrogulf\\.com\\|.*\\.psatellite\\.com\\|.*\\.ded\\.swbell\\.net\\|.*\\.dsl\\.concepts\\.nl\\|.*\\.httpserveur\\.net\\|218\\.107\\.131\\.67\\|.*\\.dsl\\.austtx\\.swbell\\.net\\|.*\\.oit\\.ac\\.jp\\|.*\\.cluster1\\.net\\|.*\\.btopenworld\\.com\\|.*\\.joust\\.net\\|hetnet\\.nl\\|gdynia\\.mm\\.pl\\|dsl\\.siol\\.net\\|[^(pD951F3AF)]\\.dip\\.t-dialin\\.net\\|mi\\.comcast\\.net\\|dialup\\.tiscali\\.it\\|dsl\\.irvnca\\.pacbell\\.net\\|cpe\\.net\\.cable\\.rogers\\.com\\|mail\\.trelliscom\\.net\\|mn\\.client2\\.attbi\\.com\\|smtp[0-9]?\\.arnet\\.com\\.ar\\|smtp\\.icc\\.aitai\\.ne\\.jp\\|SMTP00\\.InfoAve\\.Net\\|2004hosting\\.netIP\\|omega39\\.maxonline\\.com\\.sg\\)")
        ;; Using keywords to deal with SPAM.
        (keyword-spam . "\\(nigeria\\|\\(husband\\|father\\)\\|china\\|hgh\\|money\\|business\\|funds?\\|investments?\\|consignment\\|incest\\|motorcycles\\|gatoson\\|million\\|discounted\\|wealth\\|opportunity\\|beneficiary\\|brochures?\\|envelopes?\\)")))

;; I use fancy mail splitting.
(setq nnmail-split-methods 'nnmail-split-fancy
      nnmail-message-id-cache-length 5000
      nnmail-crosspost nil
      nnmail-split-fancy
      '(| 
        ;; Tiffany is highest priority.
        (any "ms_tamber@hotmail\\.com" "private.Tiffany")
        ;; SPAM...
        ;; Most people put their spam splits after their mailing
        ;; lists and stuff.  I think this is the wrong way to do it,
        ;; because you'd still get heaps of spam in your mailing list
        ;; groups.
        ("X-Spam-Flag" "Yes" "SPAM.spamassassin")
        ("Content-Type" content-spam "SPAM.content")
        ("Content-Transfer-Encoding" encoding-spam "SPAM.encoding")
        ("Subject" subject-spam "SPAM.subjects")
        (from author-spam "SPAM.authors")
        ("Received" domain-spam "SPAM.domains")
        ("Keywords" keyword-spam "SPAM.keywords")
        ;; XEmacs stuff I want to disappear.
        (to "xemacs-\\(people\\|request\\|users\\|webmaint\\|winnt\\|nt\\)+@xemacs\\.org"
            "SPAM.xemacs")
        (to "youngs@xemacs\\.org" "SPAM.xemacs")
        ;; Bounces
        (from mail "returned.mail")
        ;; Log files
        ("Subject" 
         "\\(Logs:.*\\|Mail Stats\\|eicq Daily Usenet\\|var/log/.*\\)" "private.logs")
        ;; Mailing lists 
        (any "\\(eicq\\|mh-e\\|bbdb\\|tramp\\|xemacs\\)-\\b\\(\\w+\\)@\\(\\(lists\\.\\)?\\(sf\\|sourceforge\\)\\.net\\|\\(mail\\.freesoftware\\.fsf\\|gnu\\|nongnu\\|xemacs\\)\\.org\\)"
             "\\1.\\2")
        (from "noreply@sourceforge\\.net" "eicq.admin")
        (from "mailman-owner@lists\\.\\(sf\\|sourceforge\\)\\.net"
              "eicq.admin")
        (any "ding@\\(hpc\\.uh\\.edu\\|gnus\\.org\\)" "gnus.ding")
        (to "cvslog@quimby\\.gnus\\.org" "gnus.cvs")
        (from "freshmeat-news" "freshmeat.news")
        (from "Administrator@jobnet\\.com\\.au" "employment")
        (from "subscriber\\.email@jobs\\.jobserve\\.com" "employment")
        (any "icq-devel" "icq.devel")
        (any "sql-ledger-users" "sql.ledger")
        (any "inn-workers" "inn.workers")
        (any "linux-kernel@vger\\.kernel\\.org" "linux.kernel")
        ;; To me, personally
        (to 
         "steve$\\|steve@\\(localhost\\|eicq\\.dnsalias\\.org\\)"
         "private.local")
        (to "\\(sr\\)?youngs\\(_steve\\)?@\\(bigpond\\.net\\.au\\|tux\\.org\\|users\\.sourceforge\\.net\\|yahoo\\.co\\.uk\\)" "private.net")
        ;; Catch all
        "INBOX"))

;:*=======================
;:* Scan for new mail every x minutes.
(gnus-demon-init)
(gnus-demon-add-rescan)
(defun steve-scan-new-messages ()
  "Scan for new mail and news every 15 minutes."
  (when (gnus-alive-p)
    (save-excursion
      (set-buffer gnus-group-buffer)
      (gnus-group-get-new-news))))

(gnus-demon-add-handler 'steve-scan-new-messages 15 nil)

;:*=======================
;:* Scoring
;;
;; Lars describes what scoring is better than I possibly could, so go
;; RTFM at (Info-goto-node "(gnus)Scoring")
; (defun steve-score-limit ()
;   "Anything below this won't show in the summary buffer."
;   (setq gnus-summary-expunge-below -6))

(setq
 gnus-decay-scores t
 gnus-default-adaptive-score-alist
 '((gnus-ancient-mark)
   (gnus-catchup-mark (subject -1))
   (gnus-del-mark (subject -1))
   (gnus-dormant-mark (from 4) (subject 2))
   (gnus-expirable-mark)
   (gnus-forwarded-mark (subject 2))
   (gnus-kill-file-mark)
   (gnus-killed-mark (from -1) (subject -3))
   (gnus-low-score-mark)
   (gnus-read-mark (from 1) (subject 3))
   (gnus-replied-mark (from 3) (subject 15))
   (gnus-spam-mark (from -999) (subject -5))
   (gnus-ticked-mark (from 4) (subject 5))
   (gnus-unread-mark))
 gnus-home-score-file 'gnus-hierarchial-home-score-file
 gnus-kill-files-directory (concat gnus-directory "score/")
 gnus-score-find-score-files-function
 '(gnus-score-find-bnews bbdb/gnus-score)
 gnus-use-adaptive-scoring t)

;:*=======================
;:* quick nuke people :-)
;;
;; This function should be called from the summary buffer with point
;; on the article to nuke.  
;; It needs an entry in all.SCORE of (files "<score-directory>/SPAMMERS").
(defun gnus-scum-expunge ()
  "Remove this spammer from existance as much as possible."
  (interactive)
  (let ((oldscfile gnus-current-score-file))
    (gnus-score-change-score-file "SPAMMERS")
    (gnus-summary-score-entry 
     "Subject" (aref (gnus-summary-article-header) 1) 'S' -1 nil nil nil nil)
    (gnus-summary-score-entry 
     "From" (aref (gnus-summary-article-header) 2) 'S' -9999 nil nil nil nil)
    (gnus-score-change-score-file oldscfile)
    (gnus-score-save)))

(define-key gnus-summary-mode-map '"\C-cx" 'gnus-scum-expunge)

(unless (member '("^.*/SPAMMERS$" . gnus-score-mode) auto-mode-alist)
  (add-to-list 'auto-mode-alist '("^.*/SPAMMERS$" . gnus-score-mode)))
;:*=======================
;:* Sorting by thread and score
(setq gnus-thread-sort-functions
      '(gnus-thread-sort-by-date
        gnus-thread-sort-by-number
        gnus-thread-sort-by-subject
        gnus-thread-sort-by-total-score))

;:*=======================
;:* Hooks

;; Show a "Sent" header and show footnotes in a balloon-help frame.
;; Also get around a perculiar thing with MIME PGP sigs in that the
;; message signature (the 4 lines after the dash dash spc) is not
;; highlighted.
(add-hook 'gnus-article-prepare-hook 
          '(lambda ()
             (gnus-article-date-lapsed)
             (gnus-article-highlight-signature)
             (footnote-balloons)))
;; Use topic mode.
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
;; Show a timestamp for when the group was last read.
(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
;; Fontify the server buffer.
(add-hook 'gnus-server-mode-hook 'font-lock-mode)
;; Only show articles above a certain score limit.
;(add-hook 'gnus-summary-mode-hook 'steve-score-limit)
;; Only show unseen articles in the summary buffer, if there isn't
;; any unseen articles show all the unread and ticked articles (the
;; default).
(add-hook 'gnus-summary-prepared-hook
          '(lambda ()
             (when gnus-newsgroup-unseen 
               (gnus-summary-limit-to-unseen))
             (gnus-summary-limit-to-score -6)))
;; Because of that last one, I change the keymapping for SPC in the group
;; buffer to do what RET does because I'm so used to hitting SPC and not
;; RET.  See `gnus-topic-read-group' and `gnus-topic-select-group' and
;; you'll see why I did this.
(define-key gnus-topic-mode-map [(space)] 'gnus-topic-select-group)
;; Set up the right headers in outgoing messages.
(add-hook 'message-header-setup-hook 'steve-message-header-setup-hook)
;; Ispell outgoing messages and add keywords.
(add-hook 'message-send-hook 
          '(lambda ()
             (ispell-message)
             (message-keyword-insert)))
;; Make sure my followups are scored higher.
(add-hook 'message-sent-hook 
          '(lambda ()
             (gnus-score-followup-article)
             (gnus-score-followup-thread)))
;; Add keywords to incoming messages.
(add-hook 'nnmail-prepare-incoming-message-hook 'message-auto-keyword-insert)

;:*======================= 
;; I must fix this in Gnus.  RMS doesn't think this is a good idea.
;; He believes that message-mode should just use text-mode abbrevs.
;; Personally, I don't want my message-mode abbrevs cluttering up my
;; text-mode abbrevs.
(defvar message-mode-abbrev-table nil
  "Abbrevs to use while in message mode.")
(define-abbrev-table 'message-mode-abbrev-table ())
(add-hook 'message-mode-hook
          '(lambda ()
             (setq local-abbrev-table message-mode-abbrev-table)))

;:*=======================
;:* Formats
;;
;; Make the buffers look rilly perdy.
(setq gnus-extra-headers
      '(To Newsgroups))
(setq nnmail-extra-headers gnus-extra-headers)

;:*=======================
;:* Sexy slrn-like threading tree
;;
;; Sexy slrn-like thread trees with unicode characters.  
;;
;; You need to be reasonably careful here because XEmacs 21.5 can do
;; this "out of the box", but XEmacs 21.4 needs the "mule-ucs" package.
;; The hairy part is that you SHOULDN'T use mule-ucs with XEmacs 21.5.
;; Of course, this is only a problem if you have both 21.4 and 21.5
;; installed.
;;
;; I worked around this by putting the mule-ucs package in a non-standard
;; directory (somewhere OUT of the normal load-path) and only load it if
;; I'm in 21.4.
(defvar sy-want-sexy-tree t
  "If non-nil, use a sexy unicode slrn-like threading tree.")
(if sy-want-sexy-tree
    (progn
      (if (<= emacs-minor-version 4)
          (progn
            (let* ((dir (file-name-as-directory
                         (expand-file-name "etc/mule-not-21.5/lisp/mule-ucs" 
                                           (getenv "HOME"))))
                   (autos (expand-file-name "auto-autoloads.elc" dir))
                   (customs (expand-file-name "custom-load.elc" dir)))
              (when (not (featurep 'mule-ucs-autoloads))
                (push dir load-path)
                (when (file-exists-p autos)
                  (load autos))
                (when (file-exists-p customs)
                  (load customs)))
              (require 'un-define)
              (defalias 'sy-unicode-to-char 'ucs-to-char)))
        (defalias 'sy-unicode-to-char 'unicode-to-char))
      (setq gnus-summary-line-format
            "%U%R%z%(%[%4L%]: %B%-55,55s%) |%uX%f\n")
      (setq gnus-summary-same-subject "")
      (setq gnus-sum-thread-tree-root 
            (concat (char-to-string (sy-unicode-to-char 9733)) " "))
      (setq gnus-sum-thread-tree-false-root 
            (concat (char-to-string (sy-unicode-to-char 9734)) " "))
      (setq gnus-sum-thread-tree-single-indent "")
      (setq gnus-sum-thread-tree-leaf-with-other
            (concat (char-to-string (sy-unicode-to-char 9584))
                    (char-to-string (sy-unicode-to-char 8594))
                    " "))
      (setq gnus-sum-thread-tree-vertical
            (concat (char-to-string (sy-unicode-to-char 9474)) " "))
      (setq gnus-sum-thread-tree-single-leaf
            (concat (char-to-string (sy-unicode-to-char 9584))
                    (char-to-string (sy-unicode-to-char 8594))
                    " ")))
  ;; The old style
  (setq gnus-summary-line-format
        "%U%R%z%(%[%4L%]: %I%-55,55s%) |%uX%f\n")
  (setq gnus-summary-same-subject "|-->"))

(setq gnus-group-line-format
      "%m\%S\%p\%P\%5y (\%U): %-40,40g %6,6~(cut 2)d [Tick \%T  Dmnt \%I]\n")
(setq gnus-ignored-from-addresses
      "Steve Youngs")

;; Headers that I want to see.
(setq gnus-ignored-headers nil)
(setq gnus-visible-headers
      (mapconcat 'regexp-quote
                 '("From:" "Newsgroups:" "Subject:" "Date:" "Organization:"
                   "Keywords:" "To:" "Cc:" "Gnus-Warning:" "X-Sent:"
                   "X-URL:" "X-Homepage:" "User-Agent:" "X-Newsreader:"
                   "X-Mailer:" "X-Reviewer-Action:" "X-Now-Playing:"
                   "X-Spam-Level:" "X-Spam-Flag:" "Followup-To:"
                   "Mail-Followup-To:" "Reply-To:")
                 "\\|"))

;; Start a timer to update the X-Sent header
(setq gnus-article-date-lapsed-new-header t)
(gnus-start-date-timer)

;; Make tabs sane.
(setq message-tab-body-function 'tab-to-tab-stop)

;:*=======================
;:* Initiate Mailing list magic.
(gnus-mailing-list-mode)
(setq message-subscribed-address-functions 
      '(gnus-find-subscribed-addresses))

;:*=======================
;:* Forwarded Messages
;;
;; This sets up how a message is formatted when you forward it to
;; somewhere else.  It prepends the Subject header with 'Fwd:' and
;; strips unwanted headers from the article.
(setq 
 message-make-forward-subject-function
 'message-forward-subject-fwd
 message-wash-forwarded-subjects t
 message-forward-ignored-headers
 (mapconcat 'regexp-quote
            '("X-" "Xref" "User-Agent:" "Gnus" "Keywords:"
              "Organization:" "Return-Path:" "Received:"
              "References:" "Sender:" "Errors-To:" "List-"
              "Precedence:" "Priority:" "Lines:" "Content-"
              "In-Reply-To:")
            "\\|"))

;:*=======================
;:* Composing Messages
;;
;; Most of the stuff that is relevent to composing messages can be
;; found in other sections above like `gnus-posting-styles' or
;; `gnus-parameters'.  This section is for things that just don't
;; seem to fit anywhere else.

;; When composing messages, don't show these headers (but still include
;; them of course).
(setq message-hidden-headers "\\(X-\\)?Face")

;:*=======================
;:* Kudos:

;; The majority of this has been shamelessly stolen from Robin
;; S. Socha's .gnus file.  Although, by now, it's probably vastly
;; different from what Robin uses.  But nevertheless, take a look at
;; <http://my.gnus.org/>.  Robin, it's your fault that I can no
;; longer use any other MUA/Newsreader.  Thanks! :-) Gnus is also what
;; got me hooked on XEmacs.

;; Robin's original comments reproduced here.  It's the least I could
;; do. 

;; ==================================================================
;; Layout stolen from Erik Selberg's GNUS hacks... (gnus-load.el)
;; Kudos to Markus Dickebohm for getting me started and running.
;; A lot of stuff stolen form the people on Lars Magne Ingebrigtsen's
;; site, too.
;;                         <http://www.gnus.org/>
;; garym.gnus.el     lebel.gnus.el     visigoth.gnus.el
;; dmoore.gnus.el    elf.gnus.el       kai.gnus.el       paul.gnus.el
;; flognat.gnus.el   larsi.gnus.el     toreo.gnus.el
;;
;; CAVEATS
;; This thing will not run out of the box. Duuuhh...
;; I'm using a couple of packages that will not be on your system.
;; Some things are done in a Rambo kinda way - I'm *not* a programmer
;; and I don't know anything about lisp, you know }:-> So don't
;; expect anything fancy in here... This is just another .Gnus.el that
;; might only be of interest for someone who's doing a lot of
;; email/news. So - enjoy...
;; ==================================================================

;:*=======================
;:* That's all Folks.  (Changes)
;; $Log: .Gnus.el,v $
;; Revision 1.7  2004-03-03 09:50:41+10  steve
;; Add sexy unicode slrn-like thread trees.
;; Update various bits 'n' pieces.
;;
;; Revision 1.6  2003-10-16 09:56:11+10  steve
;; Add a HTML link to the source for the HTML version of this file.
;;
;; Revision 1.5  2003-09-25 10:59:25+10  steve
;; Switch to BSD license.
;;
;; Revision 1.4  2003-09-11 09:55:41+10  steve
;; Clean up some comments, etc.
;; Rip out the MailCrypt code in favour of PGG.
;;
;; Revision 1.3  2003-03-11 15:09:20+10  steve
;; Modify a mail split regexp to allow for some idiots who post to
;; mail-list@sourceforge.net instead of mail-list@lists.sourceforge.net
;;
;; Revision 1.2  2003-02-22 13:20:24+10  steve
;; Major tidy up and rewrite after a hardware failure.  This is also the
;; reason why the file's version number is brand new (I lost the original
;; ,v file).
;;



; Put the normal local variables declaration here
;mode:emacs-lisp
;outline-regexp: ";:\\*"
;time-stamp-start: "Last-Modified:[     ]+\\\\?[\"<]+"
;time-stamp-end: "\\\\?[\">]"
;time-stamp-line-limit: 10
;time-stamp-format: "%4y-%02m-%02d %02H:%02M:%02S (%u)"
;eval:(outl-mouse-minor-mode 1)
;eval:(hide-body)
;End:

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;; Controlling editing this file:

;; This file is in mouse outline minor mode so you can navigate with your
;; rat.  Or you can use the keyboard:

;;        C-c @ C-n - Next heading.
;;        C-c @ C-p - Previous heading.
;;        C-c @ C-e - Show entry.
;;        C-c @ C-c - Hide entry.
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Created with XEmacs Valid HTML 4.01! Valid CSS!
Copyright © 2003 Steve Youngs
Verbatim copying and distribution is permitted in any medium, providing this notice is preserved.
Last modified: Wed Mar 3 09:53:08 EST 2004