`widen' is bad. It removes all restriction. Replace it!
[gnus] / lisp / gnus-salt.el
index 52079f1..181f9cf 100644 (file)
@@ -1,7 +1,8 @@
 ;;; gnus-salt.el --- alternate summary mode interfaces for Gnus
 ;;; gnus-salt.el --- alternate summary mode interfaces for Gnus
-;; Copyright (C) 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1996,97,98,99 Free Software Foundation, Inc.
 
 
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news
 
 ;; This file is part of GNU Emacs.
 
 
 ;; This file is part of GNU Emacs.
 
 
 ;;; Code:
 
 
 ;;; Code:
 
-(require 'gnus)
 (eval-when-compile (require 'cl))
 
 (eval-when-compile (require 'cl))
 
+(require 'gnus)
+(require 'gnus-sum)
+
 ;;;
 ;;; gnus-pick-mode
 ;;;
 ;;;
 ;;; gnus-pick-mode
 ;;;
 (defvar gnus-pick-mode nil
   "Minor mode for providing a pick-and-read interface in Gnus summary buffers.")
 
 (defvar gnus-pick-mode nil
   "Minor mode for providing a pick-and-read interface in Gnus summary buffers.")
 
-(defvar gnus-pick-display-summary nil
-  "*Display summary while reading.")
-
-(defvar gnus-pick-mode-hook nil
-  "Hook run in summary pick mode buffers.")
+(defcustom gnus-pick-display-summary nil
+  "*Display summary while reading."
+  :type 'boolean
+  :group 'gnus-summary-pick)
+
+(defcustom gnus-pick-mode-hook nil
+  "Hook run in summary pick mode buffers."
+  :type 'hook
+  :group 'gnus-summary-pick)
+
+(defcustom gnus-mark-unpicked-articles-as-read nil
+  "*If non-nil, mark all unpicked articles as read."
+  :type 'boolean
+  :group 'gnus-summary-pick)
+
+(defcustom gnus-pick-elegant-flow t
+  "If non-nil, gnus-pick-start-reading will run gnus-summary-next-group when no articles have been picked."
+  :type 'boolean
+  :group 'gnus-summary-pick)
+
+(defcustom gnus-summary-pick-line-format
+  "%-5P %U\%R\%z\%I\%(%[%4L: %-20,20n%]%) %s\n"
+  "*The format specification of the lines in pick buffers.
+It accepts the same format specs that `gnus-summary-line-format' does."
+  :type 'string
+  :group 'gnus-summary-pick)
 
 ;;; Internal variables.
 
 
 ;;; Internal variables.
 
 (unless gnus-pick-mode-map
   (setq gnus-pick-mode-map (make-sparse-keymap))
 
 (unless gnus-pick-mode-map
   (setq gnus-pick-mode-map (make-sparse-keymap))
 
-  (gnus-define-keys
-   gnus-pick-mode-map
-   "t" gnus-uu-mark-thread
-   "T" gnus-uu-unmark-thread
-   " " gnus-summary-mark-as-processable
-   "u" gnus-summary-unmark-as-processable
-   "U" gnus-summary-unmark-all-processable
-   "v" gnus-uu-mark-over
-   "r" gnus-uu-mark-region
-   "R" gnus-uu-unmark-region
-   "e" gnus-uu-mark-by-regexp
-   "E" gnus-uu-mark-by-regexp
-   "b" gnus-uu-mark-buffer
-   "B" gnus-uu-unmark-buffer
-   "\r" gnus-pick-start-reading))
+  (gnus-define-keys gnus-pick-mode-map
+    " " gnus-pick-next-page
+    "u" gnus-pick-unmark-article-or-thread
+    "." gnus-pick-article-or-thread
+    gnus-down-mouse-2 gnus-pick-mouse-pick-region
+    "\r" gnus-pick-start-reading))
 
 (defun gnus-pick-make-menu-bar ()
   (unless (boundp 'gnus-pick-menu)
 
 (defun gnus-pick-make-menu-bar ()
   (unless (boundp 'gnus-pick-menu)
        ["Article" gnus-summary-mark-as-processable t]
        ["Thread" gnus-uu-mark-thread t]
        ["Region" gnus-uu-mark-region t]
        ["Article" gnus-summary-mark-as-processable t]
        ["Thread" gnus-uu-mark-thread t]
        ["Region" gnus-uu-mark-region t]
-       ["Regexp" gnus-uu-mark-regexp t]
+       ["Regexp" gnus-uu-mark-by-regexp t]
        ["Buffer" gnus-uu-mark-buffer t])
        ("Unpick"
        ["Article" gnus-summary-unmark-as-processable t]
        ["Thread" gnus-uu-unmark-thread t]
        ["Region" gnus-uu-unmark-region t]
        ["Buffer" gnus-uu-mark-buffer t])
        ("Unpick"
        ["Article" gnus-summary-unmark-as-processable t]
        ["Thread" gnus-uu-unmark-thread t]
        ["Region" gnus-uu-unmark-region t]
-       ["Regexp" gnus-uu-unmark-regexp t]
-       ["Buffer" gnus-uu-unmark-buffer t])
+       ["Regexp" gnus-uu-unmark-by-regexp t]
+       ["Buffer" gnus-summary-unmark-all-processable t])
        ["Start reading" gnus-pick-start-reading t]
        ["Switch pick mode off" gnus-pick-mode gnus-pick-mode]))))
 
 (defun gnus-pick-mode (&optional arg)
        ["Start reading" gnus-pick-start-reading t]
        ["Switch pick mode off" gnus-pick-mode gnus-pick-mode]))))
 
 (defun gnus-pick-mode (&optional arg)
-  "Minor mode for providing a pick-and-read interface in Gnus summary buffers."
+  "Minor mode for providing a pick-and-read interface in Gnus summary buffers.
+
+\\{gnus-pick-mode-map}"
   (interactive "P")
   (when (eq major-mode 'gnus-summary-mode)
   (interactive "P")
   (when (eq major-mode 'gnus-summary-mode)
-    (make-local-variable 'gnus-pick-mode)
-    (setq gnus-pick-mode 
-         (if (null arg) (not gnus-pick-mode)
-           (> (prefix-numeric-value arg) 0)))
-    (when gnus-pick-mode
+    (if (not (set (make-local-variable 'gnus-pick-mode)
+                 (if (null arg) (not gnus-pick-mode)
+                   (> (prefix-numeric-value arg) 0))))
+       (remove-hook 'gnus-message-setup-hook 'gnus-pick-setup-message)
       ;; Make sure that we don't select any articles upon group entry.
       ;; Make sure that we don't select any articles upon group entry.
-      (make-local-variable 'gnus-auto-select-first)
-      (setq gnus-auto-select-first nil)
+      (set (make-local-variable 'gnus-auto-select-first) nil)
+      ;; Change line format.
+      (setq gnus-summary-line-format gnus-summary-pick-line-format)
+      (setq gnus-summary-line-format-spec nil)
+      (gnus-update-format-specifications nil 'summary)
+      (gnus-update-summary-mark-positions)
+      (add-hook 'gnus-message-setup-hook 'gnus-pick-setup-message)
+      (set (make-local-variable 'gnus-summary-goto-unread) 'never)
       ;; Set up the menu.
       ;; Set up the menu.
-      (when (and menu-bar-mode
-                (gnus-visual-p 'pick-menu 'menu))
+      (when (gnus-visual-p 'pick-menu 'menu)
        (gnus-pick-make-menu-bar))
        (gnus-pick-make-menu-bar))
-      (unless (assq 'gnus-pick-mode minor-mode-alist)
-       (push '(gnus-pick-mode " Pick") minor-mode-alist))
-      (unless (assq 'gnus-pick-mode minor-mode-map-alist)
-       (push (cons 'gnus-pick-mode gnus-pick-mode-map)
-             minor-mode-map-alist))
-      (run-hooks 'gnus-pick-mode-hook))))
+      (gnus-add-minor-mode 'gnus-pick-mode " Pick" gnus-pick-mode-map)
+      (gnus-run-hooks 'gnus-pick-mode-hook))))
+
+(defun gnus-pick-setup-message ()
+  "Make Message do the right thing on exit."
+  (when (and (gnus-buffer-live-p gnus-summary-buffer)
+            (save-excursion
+              (set-buffer gnus-summary-buffer)
+              gnus-pick-mode))
+    (message-add-action
+     '(gnus-configure-windows ,gnus-current-window-configuration t)
+     'send 'exit 'postpone 'kill)))
+
+(defvar gnus-pick-line-number 1)
+(defun gnus-pick-line-number ()
+  "Return the current line number."
+  (if (bobp)
+      (setq gnus-pick-line-number 1)
+    (incf gnus-pick-line-number)))
 
 (defun gnus-pick-start-reading (&optional catch-up)
   "Start reading the picked articles.
 If given a prefix, mark all unpicked articles as read."
   (interactive "P")
 
 (defun gnus-pick-start-reading (&optional catch-up)
   "Start reading the picked articles.
 If given a prefix, mark all unpicked articles as read."
   (interactive "P")
-  (unless gnus-newsgroup-processable
-    (error "No articles have been picked"))
-  (gnus-summary-limit-to-articles nil)
-  (when catch-up
-    (gnus-summary-limit-mark-excluded-as-read))
-  (gnus-configure-windows (if gnus-pick-display-summary 'summary 'pick) t))
+  (if gnus-newsgroup-processable
+      (progn
+        (gnus-summary-limit-to-articles nil)
+        (when (or catch-up gnus-mark-unpicked-articles-as-read)
+         (gnus-summary-limit-mark-excluded-as-read))
+        (gnus-summary-first-article)
+        (gnus-configure-windows
+        (if gnus-pick-display-summary 'article 'pick) t))
+    (if gnus-pick-elegant-flow
+       (progn
+         (when (or catch-up gnus-mark-unpicked-articles-as-read)
+           (gnus-summary-catchup nil t))
+         (if (gnus-group-quit-config gnus-newsgroup-name)
+             (gnus-summary-exit)
+           (gnus-summary-next-group)))
+      (error "No articles have been picked"))))
+
+(defun gnus-pick-goto-article (arg)
+  "Go to the article number indicated by ARG.
+If ARG is an invalid article number, then stay on current line."
+  (let (pos)
+    (save-excursion
+      (goto-char (point-min))
+      (when (zerop (forward-line (1- (prefix-numeric-value arg))))
+       (setq pos (point))))
+    (if (not pos)
+       (gnus-error 2 "No such line: %s" arg)
+      (goto-char pos))))
+
+(defun gnus-pick-article (&optional arg)
+  "Pick the article on the current line.
+If ARG, pick the article on that line instead."
+  (interactive "P")
+  (when arg
+    (gnus-pick-goto-article arg))
+  (gnus-summary-mark-as-processable 1))
+
+(defun gnus-pick-article-or-thread (&optional arg)
+  "If gnus-thread-hide-subtree is t, then pick the thread on the current line.
+Otherwise pick the article on the current line.
+If