;; -*- emacs-lisp -*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; $Id: gnus.el,v 1.19 2005/08/02 19:19:10 ole Exp $
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Gnus setup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'gnus)

;; set files
(eval-after-load "gnus"
  '(progn
     (setq gnus-init-file (expand-file-name ".gnus" gnus-directory))
     (require 'spam)
     (require 'message-x)
     (require 'mailcrypt)
     (load-library "spook")
     ))

(setq gnus-directory (expand-file-name "~/News/"))

(defun switch-to-gnus ()
  (interactive)
  (if (or (not (fboundp 'gnus-alive-p))
          (not (gnus-alive-p)))
      (gnus)
    ;; gnus is running
    (let (candidate priority in-gnus (tests '(("\\*Group" . 3))))
      ;; move down in priorities if we're already at a high priority
      (when (not (member mode-name '("Message" "Summary")))
        (setq tests (cons '("^\\*\\(mail\\|\\(wide \\)?reply\\)" . 1)
                          tests)))
      (when (not (string= mode-name "Summary"))
        (setq tests (cons '("\\*Summary" . 2) tests)))
      ;; if we're not in a gnus buffer, just switch to our gnus screen, thus
      ;; returning us to where we were previously. otherwise determine what we
      ;; should switch to
      (dolist (buf (buffer-list))
        (dolist (test tests)
          (when (and (string-match (car test) (buffer-name buf))
                     (or (not priority) (< (cdr test) priority))
                     (> (buffer-size buf) 0))
            (setq candidate buf
            priority (cdr test)))))
      (if (buffer-live-p candidate)
          (if (eq candidate (current-buffer))
              (gnus-group-get-new-news)
            (switch-to-buffer candidate))
        (error "unlive buffer!")))))
    
;; quit gnus properly instead of leaving auto-save files around
(defadvice save-buffers-kill-emacs (before quit-gnus (&rest args) activate)
  (let (buf)
    (when (and (fboundp 'gnus-alive-p)
               (gnus-alive-p)
               (bufferp (setq buf (get-buffer "*Group*"))))
      (with-current-buffer buf
        (gnus-group-exit)))))
    
;; i'm in the habit of quitting when i don't really need to
(add-hook 'gnus-group-mode-hook
          (lambda ()
            (local-set-key (kbd "q") 'gnus-group-suspend)
            (local-set-key (kbd "Q") 'gnus-group-exit)))

(define-key goto-keymap [?g] 'switch-to-gnus)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dired support
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'gnus-dired)
(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)