*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Sun, 23 Mar 1997 01:55:29 +0000 (01:55 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Sun, 23 Mar 1997 01:55:29 +0000 (01:55 +0000)
20 files changed:
lisp/ChangeLog
lisp/cus-edit.el
lisp/cus-face.el
lisp/custom.el
lisp/gnus-art.el
lisp/gnus-sum.el
lisp/gnus-vm.el
lisp/gnus.el
lisp/nnbabyl.el
lisp/nnfolder.el
lisp/nnmbox.el
lisp/nnmh.el
lisp/wid-browse.el
lisp/wid-edit.el
lisp/widget.el
texi/ChangeLog
texi/custom.texi
texi/gnus.texi
texi/message.texi
texi/widget.texi

index 9dbadc4..9d37564 100644 (file)
@@ -1,3 +1,29 @@
+Sun Mar 23 02:52:51 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el: Gnus v5.4.35 is released.
+
+Sun Mar 23 01:09:23 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-art.el (gnus-read-save-file-name): Tweaked definition.
+       (gnus-summary-save-in-rmail): Use it.
+       (gnus-summary-save-in-file): Ditto.
+       (gnus-summary-save-in-mail): Ditto.
+       (gnus-summary-save-body-in-file): Ditto.
+
+       * gnus-vm.el (gnus-summary-save-in-vm): Ditto.
+
+       * gnus-sum.el (gnus-summary-enter-digest-group): Add group param. 
+
+       * gnus-art.el (gnus-split-methods): New default.
+       (gnus-article-nndoc-name): New function.
+
+Sat Mar 22 15:47:14 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnmh.el (nnmh-request-accept-article): Do 'junk.
+       * nnbabyl.el (nnbabyl-request-accept-article): Ditto.
+       * nnmbox.el (nnmbox-request-accept-article): Ditto.
+       * nnfolder.el (nnfolder-request-accept-article): Ditto.
+
 Sat Mar 22 15:42:53 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el: Gnus v5.4.34 is released.
index ff89be2..6519920 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.59
+;; Version: 1.65
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -1803,9 +1803,19 @@ Leave point at the location of the call, or after the last expression."
                                   ':style 'toggle
                                   ':selected symbol)))
 
-(defun custom-group-menu-create (widget symbol)
-  "Ignoring WIDGET, create a menu entry for customization group SYMBOL."
-  (custom-menu-create symbol))
+(if (string-match "XEmacs" emacs-version)
+    ;; XEmacs can create menus dynamically.
+    (defun custom-group-menu-create (widget symbol)
+      "Ignoring WIDGET, create a menu entry for customization group SYMBOL."
+      `( ,(custom-unlispify-menu-entry symbol t)
+        :filter (lambda (&rest junk)
+                  (cdr (custom-menu-create ',symbol)))))
+  ;; But emacs can't.
+  (defun custom-group-menu-create (widget symbol)
+    "Ignoring WIDGET, create a menu entry for customization group SYMBOL."
+    ;; Limit the nesting.
+    (let ((custom-menu-nesting (1- custom-menu-nesting)))
+      (custom-menu-create symbol))))
 
 (defun custom-menu-create (symbol &optional name)
   "Create menu for customization group SYMBOL.
@@ -1817,10 +1827,9 @@ The menu is in a format applicable to `easy-menu-define'."
   (let ((item (vector name
                      `(custom-buffer-create '((,symbol custom-group)))
                      t)))
-    (if (and (> custom-menu-nesting 0)
+    (if (and (>= custom-menu-nesting 0)
             (< (length (get symbol 'custom-group)) widget-menu-max-size))
-       (let ((custom-menu-nesting (1- custom-menu-nesting))
-             (custom-prefix-list (custom-prefix-add symbol
+       (let ((custom-prefix-list (custom-prefix-add symbol
                                                     custom-prefix-list)))
          (custom-load-symbol symbol)
          `(,(custom-unlispify-menu-entry symbol t)
@@ -1835,17 +1844,17 @@ The menu is in a format applicable to `easy-menu-define'."
       item)))
 
 ;;;###autoload
-(defun custom-menu-update ()
+(defun custom-menu-update (event)
   "Update customize menu."
-  (interactive)
+  (interactive "e")
   (add-hook 'custom-define-hook 'custom-menu-reset)
-  (let ((menu `(,(car custom-help-menu)
-               ,(widget-apply '(custom-group) :custom-menu 'emacs)
-               ,@(cdr (cdr custom-help-menu)))))
-    (if (fboundp 'add-submenu)
-       (add-submenu '("Options") menu)
+  (let* ((emacs (widget-apply '(custom-group) :custom-menu 'emacs))
+        (menu `(,(car custom-help-menu)
+                ,emacs
+                ,@(cdr (cdr custom-help-menu)))))
+    (let ((map (easy-menu-create-keymaps (car menu) (cdr menu))))
       (define-key global-map [menu-bar help-menu customize-menu]
-       (cons (car menu) (easy-menu-create-keymaps (car menu) (cdr menu)))))))
+       (cons (car menu) map)))))
 
 ;;; Dependencies.
 
index bb1d434..7c7401b 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.59
+;; Version: 1.65
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -111,33 +111,33 @@ Does nothing when the variable initialize-face-resources is nil."
        ;; Too hard to do right on XEmacs.
        (defalias 'initialize-face-resources 'ignore)))
 
-(if (string-match "XEmacs" emacs-version)
-    ;; Xemacs.
-    (defun custom-invert-face (face &optional frame)
-      "Swap the foreground and background colors of face FACE.
-If the colors are not specified in the face, use the default colors."
-      (interactive (list (read-face-name "Reverse face: ")))
-      (let ((fg (color-name (face-foreground face frame) frame))
-           (bg (color-name (face-background face frame) frame)))
-       (set-face-foreground face bg frame)
-       (set-face-background face fg frame)))
-  ;; Emacs.
-  (defun custom-invert-face (face &optional frame)
-    "Swap the foreground and background colors of face FACE.
-If the colors are not specified in the face, use the default colors."
-    (interactive (list (read-face-name "Reverse face: ")))
-    (let ((fg (or (face-foreground face frame)
-                 (face-foreground 'default frame)
-                 (frame-property (or frame (selected-frame))
-                                 'foreground-color)
-                 "black"))
-         (bg (or (face-background face frame)
-                 (face-background 'default frame)
-                 (frame-property (or frame (selected-frame))
-                                 'background-color)
-                 "white")))
-      (set-face-foreground face bg frame)
-      (set-face-background face fg frame))))
+;;(if (string-match "XEmacs" emacs-version)
+;;    ;; Xemacs.
+;;    (defun custom-invert-face (face &optional frame)
+;;      "Swap the foreground and background colors of face FACE.
+;;If the colors are not specified in the face, use the default colors."
+;;      (interactive (list (read-face-name "Reverse face: ")))
+;;      (let ((fg (color-name (face-foreground face frame) frame))
+;;         (bg (color-name (face-background face frame) frame)))
+;;     (set-face-foreground face bg frame)
+;;     (set-face-background face fg frame)))
+;;  ;; Emacs.
+;;  (defun custom-invert-face (face &optional frame)
+;;    "Swap the foreground and background colors of face FACE.
+;;If the colors are not specified in the face, use the default colors."
+;;    (interactive (list (read-face-name "Reverse face: ")))
+;;    (let ((fg (or (face-foreground face frame)
+;;               (face-foreground 'default frame)
+;;               (frame-property (or frame (selected-frame))
+;;                               'foreground-color)
+;;               "black"))
+;;       (bg (or (face-background face frame)
+;;               (face-background 'default frame)
+;;               (frame-property (or frame (selected-frame))
+;;                               'background-color)
+;;               "white")))
+;;      (set-face-foreground face bg frame)
+;;      (set-face-background face fg frame))))
 
 (defcustom custom-background-mode nil
   "The brightness of the background.
@@ -207,8 +207,7 @@ examine the brightness for you."
   (unless (get face 'factory-face)
     (put face 'factory-face spec)
     (when (fboundp 'facep)
-      (unless (and (custom-facep face)
-                  (not (get face 'saved-face)))
+      (unless (custom-facep face)
        ;; If the user has already created the face, respect that.
        (let ((value (or (get face 'saved-face) spec))
              (frames (custom-relevant-frames))
@@ -243,19 +242,21 @@ Control whether an italic font should be used.")
 Control whether the text should be underlined.")
                set-face-underline-p)
     (:foreground (color :tag "Foreground"
+                       :value "black"
                        :help-echo "Set foreground color.")
                 set-face-foreground)
     (:background (color :tag "Background"
+                       :value "white"
                        :help-echo "Set background color.")
                 set-face-background)
-    (:invert (const :format "Invert Face\n" 
-                   :sibling-args (:help-echo "\
-Reverse the foreground and background color.
-If you haven't specified them for the face, the default colors will be used.")
-                   t)
-            (lambda (face value &optional frame)
-              ;; We don't use VALUE.
-              (custom-invert-face face frame)))
+    ;;    (:invert (const :format "Invert Face\n" 
+    ;;             :sibling-args (:help-echo "
+    ;;Reverse the foreground and background color.
+    ;;If you haven't specified them for the face, the default colors will be used.")
+    ;;             t)
+    ;;      (lambda (face value &optional frame)
+    ;;        ;; We don't use VALUE.
+    ;;        (custom-invert-face face frame)))
     (:stipple (editable-field :format "Stipple: %v"
                              :help-echo "Name of background bitmap file.")
              set-face-stipple))
@@ -308,14 +309,14 @@ If FRAME is nil, set the default face."
     (let* ((font (apply 'face-font-name face args))
           (fontobj (font-create-object font)))
       (set-font-size fontobj size)
-      (apply 'set-face-font face fontobj args)))
+      (apply 'font-set-face-font face fontobj args)))
 
   (defun custom-set-face-font-family (face family &rest args)
     "Set the font of FACE to FAMILY"
     (let* ((font (apply 'face-font-name face args))
           (fontobj (font-create-object font)))
       (set-font-family fontobj family)
-      (apply 'set-face-font face fontobj args)))
+      (apply 'font-set-face-font face fontobj args)))
 
   (nconc custom-face-attributes
         '((:family (editable-field :format "Font Family: %v"
@@ -461,7 +462,8 @@ See `defface' for the format of SPEC."
                (now (nth 2 entry)))
            (put face 'saved-face spec)
            (when now
-             (put face 'force-face t)
+             (put face 'force-face t))
+           (when (or now (custom-facep face))
              (when (fboundp 'copy-face)
                (copy-face 'custom-face-empty face))
              (custom-face-display-set face spec))
index 5b7f822..807dda5 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.59
+;; Version: 1.65
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -297,13 +297,17 @@ the default value for the SYMBOL."
 
 ;;; Menu support
 
-(defconst custom-help-menu '("Customize"
-                            ["Update menu..." custom-menu-update t]
-                            ["Group..." customize t]
-                            ["Variable..." customize-variable t]
-                            ["Face..." customize-face t]
-                            ["Saved..." customize-customized t]
-                            ["Apropos..." customize-apropos t])
+(defconst custom-help-menu
+  `("Customize"
+    ,(if (string-match "XEmacs" emacs-version)
+        '("Emacs" :filter (lambda (&rest junk)
+                            (cdr (custom-menu-create 'emacs))))
+       ["Update menu..." custom-menu-update t])
+    ["Group..." customize t]
+    ["Variable..." customize-variable t]
+    ["Face..." customize-face t]
+    ["Saved..." customize-customized t]
+    ["Apropos..." customize-apropos t])
   "Customize menu")
 
 (defun custom-menu-reset ()
@@ -317,7 +321,8 @@ the default value for the SYMBOL."
            (easy-menu-create-keymaps (car custom-help-menu)
                                      (cdr custom-help-menu))))))
 
-(unless (string-match "XEmacs" emacs-version)
+(if (string-match "XEmacs" emacs-version)
+    (autoload 'custom-menu-create "cus-edit")
   (custom-menu-reset))
 
 ;;; The End.
index 5b54196..27e3f85 100644 (file)
@@ -323,7 +323,8 @@ LAST-FILE."
   :type 'function)
 
 (defcustom gnus-split-methods
-  '((gnus-article-archive-name))
+  '((gnus-article-archive-name)
+    (gnus-article-nndoc-name))
   "Variable used to suggest where articles are to be saved.
 For instance, if you would like to save articles related to Gnus in
 the file \"gnus-stuff\", and articles related to VM in \"vm-stuff\",
@@ -1393,60 +1394,80 @@ This format is defined by the `gnus-article-time-format' variable."
        (set-buffer gnus-summary-buffer)
        (funcall gnus-default-article-saver filename)))))
 
-(defun gnus-read-save-file-name (prompt default-name &optional filename)
-  (cond
-   ((eq filename 'default)
-    default-name)
-   (filename filename)
-   (t
-    (let* ((split-name (gnus-get-split-value gnus-split-methods))
-          (prompt
-           (format prompt (if (and gnus-number-of-articles-to-be-saved
-                                   (> gnus-number-of-articles-to-be-saved 1))
-                              (format "these %d articles"
-                                      gnus-number-of-articles-to-be-saved)
-                            "this article")))
-          (file
-           ;; Let the split methods have their say.
-           (cond
-            ;; No split name was found.
-            ((null split-name)
-             (read-file-name
-              (concat prompt " (default "
-                      (file-name-nondirectory default-name) ") ")
-              (file-name-directory default-name)
-              default-name))
-            ;; A single split name was found
-            ((= 1 (length split-name))
-             (let* ((name (car split-name))
-                    (dir (cond ((file-directory-p name)
-                                (file-name-as-directory name))
-                               ((file-exists-p name) name)
-                               (t gnus-article-save-directory))))
-               (read-file-name
-                (concat prompt " (default " name ") ")
-                dir name)))
-            ;; A list of splits was found.
-            (t
-             (setq split-name (nreverse split-name))
-             (let (result)
-               (let ((file-name-history (nconc split-name file-name-history)))
-                 (setq result
-                       (expand-file-name
-                        (read-file-name
-                         (concat prompt " (`M-p' for defaults) ")
-                         gnus-article-save-directory
-                         (car split-name))
-                        gnus-article-save-directory)))
-               (car (push result file-name-history)))))))
-      ;; Create the directory.
-      (gnus-make-directory (file-name-directory file))
-      ;; If we have read a directory, we append the default file name.
-      (when (file-directory-p file)
-       (setq file (concat (file-name-as-directory file)
-                          (file-name-nondirectory default-name))))
-      ;; Possibly translate some characters.
-      (nnheader-translate-file-chars file)))))
+(defun gnus-read-save-file-name (prompt &optional filename
+                                       function group headers variable)
+  (let ((default-name (funcall function group headers
+                              (symbol-value variable)))
+       result)
+    (setq
+     result
+     (cond
+      ((eq filename 'default)
+       default-name)
+      (filename filename)
+      (t
+       (let* ((split-name (gnus-get-split-value gnus-split-methods))
+             (prompt
+              (format prompt
+                      (if (and gnus-number-of-articles-to-be-saved
+                               (> gnus-number-of-articles-to-be-saved 1))
+                          (format "these %d articles"
+                                  gnus-number-of-articles-to-be-saved)
+                        "this article")))
+             (file
+              ;; Let the split methods have their say.
+              (cond
+               ;; No split name was found.
+               ((null split-name)
+                (read-file-name
+                 (concat prompt " (default "
+                         (file-name-nondirectory default-name) ") ")
+                 (file-name-directory default-name)
+                 default-name))
+               ;; A single group name is returned.
+               ((stringp split-name)
+                (setq default-name
+                      (funcall function split-name headers
+                               (symbol-value variable)))
+                (read-file-name
+                 (concat prompt " (default "
+                         (file-name-nondirectory default-name) ") ")
+                 (file-name-directory default-name)
+                 default-name))
+               ;; A single split name was found
+               ((= 1 (length split-name))
+                (let* ((name (car split-name))
+                       (dir (cond ((file-directory-p name)
+                                   (file-name-as-directory name))
+                                  ((file-exists-p name) name)
+                                  (t gnus-article-save-directory))))
+                  (read-file-name
+                   (concat prompt " (default " name ") ")
+                   dir name)))
+               ;; A list of splits was found.
+               (t
+                (setq split-name (nreverse split-name))
+                (let (result)
+                  (let ((file-name-history
+                         (nconc split-name file-name-history)))
+                    (setq result
+                          (expand-file-name
+                           (read-file-name
+                            (concat prompt " (`M-p' for defaults) ")
+                            gnus-article-save-directory
+                            (car split-name))
+                           gnus-article-save-directory)))
+                  (car (push result file-name-history)))))))
+        ;; Create the directory.
+        (gnus-make-directory (file-name-directory file))
+        ;; If we have read a directory, we append the default file name.
+        (when (file-directory-p file)
+          (setq file (concat (file-name-as-directory file)
+                             (file-name-nondirectory default-name))))
+        ;; Possibly translate some characters.
+        (nnheader-translate-file-chars file)))))
+    (gnus-make-directory (file-name-directory result))
+    (set variable result)))
 
 (defun gnus-article-archive-name (group)
   "Return the first instance of an \"Archive-name\" in the current buffer."
@@ -1455,25 +1476,26 @@ This format is defined by the `gnus-article-time-format' variable."
       (nnheader-concat gnus-article-save-directory
                       (match-string 1)))))
 
+(defun gnus-article-nndoc-name (group)
+  "If GROUP is an nndoc group, return the name of the parent group."
+  (when (eq (car (gnus-find-method-for-group group)) 'nndoc)
+    (gnus-group-get-parameter group 'save-article-group)))
+
 (defun gnus-summary-save-in-rmail (&optional filename)
   "Append this article to Rmail file.
 Optional argument FILENAME specifies file name.
 Directory to save to is default to `gnus-article-save-directory'."
   (interactive)
   (gnus-set-global-variables)
-  (let ((default-name
-         (funcall gnus-rmail-save-name gnus-newsgroup-name
-                  gnus-current-headers gnus-newsgroup-last-rmail)))
-    (setq filename (gnus-read-save-file-name
-                   "Save %s in rmail file:" default-name filename))
-    (gnus-make-directory (file-name-directory filename))
-    (gnus-eval-in-buffer-window gnus-save-article-buffer
-      (save-excursion
-       (save-restriction
-         (widen)
-         (gnus-output-to-rmail filename))))
-    ;; Remember the directory name to save articles
-    (setq gnus-newsgroup-last-rmail filename)))
+  (setq filename (gnus-read-save-file-name
+                 "Save %s in rmail file:" filename
+                 gnus-rmail-save-name gnus-newsgroup-name
+                 gnus-current-headers 'gnus-newsgroup-last-rmail))
+  (gnus-eval-in-buffer-window gnus-save-article-buffer
+    (save-excursion
+      (save-restriction
+       (widen)
+       (gnus-output-to-rmail filename)))))
 
 (defun gnus-summary-save-in-mail (&optional filename)
   "Append this article to Unix mail file.
@@ -1481,26 +1503,18 @@ Optional argument FILENAME specifies file name.
 Directory to save to is default to `gnus-article-save-directory'."
   (interactive)
   (gnus-set-global-variables)
-  (let ((default-name
-         (funcall gnus-mail-save-name gnus-newsgroup-name
-                  gnus-current-headers gnus-newsgroup-last-mail)))
-    (setq filename (gnus-read-save-file-name
-                   "Save %s in Unix mail file:" default-name filename))
-    (setq filename
-         (expand-file-name filename
-                           (and default-name
-                                (file-name-directory default-name))))
-    (gnus-make-directory (file-name-directory filename))
-    (gnus-eval-in-buffer-window gnus-save-article-buffer
-      (save-excursion
-       (save-restriction
-         (widen)
-         (if (and (file-readable-p filename)
-                  (mail-file-babyl-p filename))
-             (gnus-output-to-rmail filename t)
-           (gnus-output-to-mail filename)))))
-    ;; Remember the directory name to save articles.
-    (setq gnus-newsgroup-last-mail filename)))
+  (setq filename (gnus-read-save-file-name
+                 "Save %s in Unix mail file:" filename
+                 gnus-mail-save-name gnus-newsgroup-name
+                 gnus-current-headers 'gnus-newsgroup-last-mail))
+  (gnus-eval-in-buffer-window gnus-save-article-buffer
+    (save-excursion
+      (save-restriction
+       (widen)
+       (if (and (file-readable-p filename)
+                (mail-file-babyl-p filename))
+           (gnus-output-to-rmail filename t)
+         (gnus-output-to-mail filename))))))
 
 (defun gnus-summary-save-in-file (&optional filename overwrite)
   "Append this article to file.
@@ -1508,22 +1522,18 @@ Optional argument FILENAME specifies file name.
 Directory to save to is default to `gnus-article-save-directory'."
   (interactive)
   (gnus-set-global-variables)
-  (let ((default-name
-         (funcall gnus-file-save-name gnus-newsgroup-name
-                  gnus-current-headers gnus-newsgroup-last-file)))
-    (setq filename (gnus-read-save-file-name
-                   "Save %s in file:" default-name filename))
-    (gnus-make-directory (file-name-directory filename))
-    (gnus-eval-in-buffer-window gnus-save-article-buffer
-      (save-excursion
-       (save-restriction
-         (widen)
-         (when (and overwrite
-                    (file-exists-p filename))
-           (delete-file filename))
-         (gnus-output-to-file filename))))
-    ;; Remember the directory name to save articles.
-    (setq gnus-newsgroup-last-file filename)))
+  (setq filename (gnus-read-save-file-name
+                 "Save %s in file:" filename
+                 gnus-file-save-name gnus-newsgroup-name
+                 gnus-current-headers 'gnus-newsgroup-last-file))
+  (gnus-eval-in-buffer-window gnus-save-article-buffer
+    (save-excursion
+      (save-restriction
+       (widen)
+       (when (and overwrite
+                  (file-exists-p filename))
+         (delete-file filename))
+       (gnus-output-to-file filename)))))
 
 (defun gnus-summary-write-to-file (&optional filename)
   "Write this article to a file.
@@ -1538,22 +1548,18 @@ Optional argument FILENAME specifies file name.
 The directory to save in defaults to `gnus-article-save-directory'."
   (interactive)
   (gnus-set-global-variables)
-  (let ((default-name
-         (funcall gnus-file-save-name gnus-newsgroup-name
-                  gnus-current-headers gnus-newsgroup-last-file)))
-    (setq filename (gnus-read-save-file-name
-                   "Save %s body in file:" default-name filename))
-    (gnus-make-directory (file-name-directory filename))
-    (gnus-eval-in-buffer-window gnus-save-article-buffer
-      (save-excursion
-       (save-restriction
-         (widen)
-         (goto-char (point-min))
-         (when (search-forward "\n\n" nil t)
-           (narrow-to-region (point) (point-max)))
-         (gnus-output-to-file filename))))
-    ;; Remember the directory name to save articles.
-    (setq gnus-newsgroup-last-file filename)))
+  (setq filename (gnus-read-save-file-name
+                 "Save %s body in file:" filename
+                 gnus-file-save-name gnus-newsgroup-name
+                 gnus-current-headers 'gnus-newsgroup-last-file))
+  (gnus-eval-in-buffer-window gnus-save-article-buffer
+    (save-excursion
+      (save-restriction
+       (widen)
+       (goto-char (point-min))
+       (when (search-forward "\n\n" nil t)
+         (narrow-to-region (point) (point-max)))
+       (gnus-output-to-file filename)))))
 
 (defun gnus-summary-save-in-pipe (&optional command)
   "Pipe this article to subprocess."
index 7a35589..94833ba 100644 (file)
@@ -6180,7 +6180,8 @@ to guess what the document format is."
                           gnus-current-article)))
           (ogroup gnus-newsgroup-name)
           (params (append (gnus-info-params (gnus-get-info ogroup))
-                          (list (cons 'to-group ogroup))))
+                          (list (cons 'to-group ogroup))
+                          (list (cons 'save-article-group ogroup))))
           (case-fold-search t)
           (buf (current-buffer))
           dig)
index 32bb160..8e83dbe 100644 (file)
@@ -87,24 +87,20 @@ save those articles instead."
 
 (defun gnus-summary-save-in-vm (&optional folder)
   (interactive)
-  (let ((default-name
-         (funcall gnus-mail-save-name gnus-newsgroup-name
-                  gnus-current-headers gnus-newsgroup-last-mail)))
-    (setq folder
-         (cond ((eq folder 'default) default-name)
-               (folder folder)
-               (t (gnus-read-save-file-name
-                   "Save %s in VM folder:" default-name))))
-    (gnus-make-directory (file-name-directory folder))
-    (set-buffer gnus-original-article-buffer)
+  (setq folder
+       (cond ((eq folder 'default) default-name)
+             (folder folder)
+             (t (gnus-read-save-file-name
+                 "Save %s in VM folder:" folder
+                 gnus-mail-save-name gnus-newsgroup-name
+                 gnus-current-headers 'gnus-newsgroup-last-mail))))
+  (gnus-eval-in-buffer-window gnus-original-article-buffer
     (save-excursion
       (save-restriction
        (widen)
        (let ((vm-folder (gnus-vm-make-folder)))
          (vm-save-message folder)
-         (kill-buffer vm-folder))))
-    ;; Remember the directory name to save articles.
-    (setq gnus-newsgroup-last-mail folder)))
+         (kill-buffer vm-folder))))))
 
 (provide 'gnus-vm)
 
index 9243417..509483f 100644 (file)
@@ -226,7 +226,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "5.4.34"
+(defconst gnus-version-number "5.4.35"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Gnus v%s" gnus-version-number)
index 4c0da2b..7217baa 100644 (file)
           (delete-region (point) (progn (forward-line 1) (point)))))
        (when nnmail-cache-accepted-message-ids
         (nnmail-cache-insert (nnmail-fetch-field "message-id")))
-       (setq result (car (nnbabyl-save-mail
-                         (if (stringp group)
-                             (list (cons group (nnbabyl-active-number group)))
-                           (nnmail-article-group 'nnbabyl-active-number)))))
+       (setq result
+            (if (stringp group)
+                (list (cons group (nnbabyl-active-number group)))
+              (nnmail-article-group 'nnbabyl-active-number)))
+       (if (null result)
+          (setq result 'junk)
+        (setq result (car (nnbabyl-save-mail result))))
        (set-buffer nnbabyl-mbox-buffer)
        (goto-char (point-max))
        (search-backward "\n\^_")
index fc42c1c..7407a76 100644 (file)
@@ -377,12 +377,14 @@ time saver for large mailboxes.")
         (delete-region (point) (progn (forward-line 1) (point))))
        (when nnmail-cache-accepted-message-ids
         (nnmail-cache-insert (nnmail-fetch-field "message-id")))
-       (setq result
-            (car (nnfolder-save-mail
-                  (if (stringp group)
-                      (list (cons group (nnfolder-active-number group)))
-                    (setq art-group
-                          (nnmail-article-group 'nnfolder-active-number)))))))
+       (setq result (if (stringp group)
+                       (list (cons group (nnfolder-active-number group)))
+                     (setq art-group
+                           (nnmail-article-group 'nnfolder-active-number))))
+       (if (null result)
+          (setq result 'junk)
+        (setq result
+              (car (nnfolder-save-mail result)))))
      (when last
        (save-excursion
         (nnfolder-possibly-change-folder (or (caar art-group) group))
index b20efdd..41fe87d 100644 (file)
         (delete-region (point) (progn (forward-line 1) (point))))
        (when nnmail-cache-accepted-message-ids
         (nnmail-cache-insert (nnmail-fetch-field "message-id")))
-       (setq result (nnmbox-save-mail
-                    (if (stringp group)
-                        (list (cons group (nnmbox-active-number group)))
-                      (nnmail-article-group 'nnmbox-active-number)))))
+       (setq result (if (stringp group)
+                       (list (cons group (nnmbox-active-number group)))
+                     (nnmail-article-group 'nnmbox-active-number)))
+       (if (null result)
+          (setq result 'junk)
+        (setq result (car (nnmbox-save-mail result)))))
      (save-excursion
        (set-buffer nnmbox-mbox-buffer)
        (goto-char (point-max))
           (nnmail-cache-close))
         (nnmail-save-active nnmbox-group-alist nnmbox-active-file)
         (save-buffer))))
-    (car result)))
+    result))
 
 (deffoo nnmbox-request-replace-article (article group buffer)
   (nnmbox-possibly-change-newsgroup group)
index 7aed234..06025f3 100644 (file)
                 noinsert)))
        (and
         (nnmail-activate 'nnmh)
-        (car (nnmh-save-mail (nnmail-article-group 'nnmh-active-number)
-                             noinsert))))
+        (let ((resu|t (nnmail-article-group 'nnmh-active-number)))
+          (if (not result)
+              'junk
+            (car (nnmh-save-mail result noinsert))))))
     (when (and last nnmail-cache-accepted-message-ids)
       (nnmail-cache-close))))
 
index 82981d7..4016288 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: extensions
-;; Version: 1.59
+;; Version: 1.65
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
index 4111bc1..6e49fa6 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: extensions
-;; Version: 1.59
+;; Version: 1.65
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -733,7 +733,11 @@ ARG may be negative to move backward."
                       (button (goto-char button))
                       (field (goto-char field))
                       (t
-                       (error "No buttons or fields found")))))))))
+                       (error "No buttons or fields found"))))))
+       (setq button (widget-at (point)))
+       (if (and button (widget-get button :tab-order)
+                (< (widget-get button :tab-order) 0))
+           (setq arg (1+ arg))))))
   (while (< arg 0)
     (if (= (point-min) (point))
        (forward-char 1))
@@ -767,7 +771,11 @@ ARG may be negative to move backward."
       (cond ((and button field)
             (goto-char (max button field)))
            (button (goto-char button))
-           (field (goto-char field)))))
+           (field (goto-char field)))
+      (setq button (widget-at (point)))
+      (if (and button (widget-get button :tab-order)
+              (< (widget-get button :tab-order) 0))
+         (setq arg (1- arg)))))
   (widget-echo-help (point))
   (run-hooks 'widget-move-hook))
 
@@ -2150,7 +2158,7 @@ It will read a file name from the minibuffer when activated."
         (file (file-name-nondirectory value))
         (menu-tag (widget-apply widget :menu-tag-get))
         (must-match (widget-get widget :must-match))
-        (answer (read-file-name (concat menu-tag ": (defalt `" value "') ")
+        (answer (read-file-name (concat menu-tag ": (default `" value "') ")
                                 dir nil must-match file)))
     (widget-value-set widget (abbreviate-file-name answer))
     (widget-apply widget :notify widget event)
@@ -2328,7 +2336,7 @@ It will read a directory name from the minibuffer when activated."
 (define-widget 'color-item 'choice-item
   "A color name (with sample)."
   :format "%v (%{sample%})\n"
-  :button-face-get 'widget-color-item-button-face-get)
+  :sample-face-get 'widget-color-item-button-face-get)
 
 (defun widget-color-item-button-face-get (widget)
   ;; We create a face from the value.
@@ -2341,7 +2349,7 @@ It will read a directory name from the minibuffer when activated."
   "Choose a color name (with sample)."
   :format "%[%t%]: %v"
   :tag "Color"
-  :value "default"
+  :value "black"
   :value-create 'widget-color-value-create
   :value-delete 'widget-children-value-delete
   :value-get 'widget-color-value-get
index a11f906..21bca32 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, extensions, faces, hypermedia
-;; Version: 1.59
+;; Version: 1.65
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -41,7 +41,7 @@
   :must-match :type-error :value-inline :inline :match-inline :greedy
   :button-face-get :button-face :value-face :keymap :entry-from
   :entry-to :help-echo :documentation-property :hide-front-space
-  :hide-rear-space) 
+  :hide-rear-space :tab-order
 
 ;; These autoloads should be deleted when the file is added to Emacs.
 (unless (fboundp 'load-gc)
index 9c6c01e..e1af3c1 100644 (file)
@@ -1,3 +1,7 @@
+Sun Mar 23 02:16:19 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi (Thwarting Email Spam): New.
+
 Wed Mar 19 15:45:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus.texi (Various Summary Stuff): Addition.
index 92c4b6c..0867d92 100644 (file)
@@ -13,7 +13,7 @@
 @comment  node-name,  next,  previous,  up
 @top The Customization Library
 
-Version: 1.59
+Version: 1.65
 
 @menu
 * Introduction::                
@@ -647,6 +647,14 @@ convincing example.
 Add an `examples' section, with explained examples of custom type
 definitions. 
 
+@item
+Support selectable color themes.  I.e., change many faces by setting one
+variable.
+
+@item
+There should be a way to see only the "current" display when editing a
+face, and that should be "on" by default.
+
 @item
 Support undo using lmi's @file{gnus-undo.el}.
 
index 31afb81..7cb62f0 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Gnus 5.4.34 Manual
+@settitle Gnus 5.4.35 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -287,7 +287,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Gnus 5.4.34 Manual
+@title Gnus 5.4.35 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -323,7 +323,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
 spool or your mbox file.  All at the same time, if you want to push your
 luck.
 
-This manual corresponds to Gnus 5.4.34.
+This manual corresponds to Gnus 5.4.35.
 
 @end ifinfo
 
@@ -12186,6 +12186,7 @@ four days, Gnus will decay the scores four times, for instance.
 * Moderation::                 What to do if you're a moderator.
 * XEmacs Enhancements::        There are more pictures and stuff under XEmacs.
 * Fuzzy Matching::             What's the big fuzz?
+* Thwarting Email Spam::       A how-to on avoiding unsolited commercial email.
 * Various Various::            Things that are really various.
 @end menu
 
@@ -13410,6 +13411,75 @@ adequate results---even when faced with strings generated by text
 manglers masquerading as newsreaders.
 
 
+@node Thwarting Email Spam
+@section Thwarting Email Spam
+@cindex email spam
+@cindex spam
+@cindex UCE
+@cindex unsolicited commercial email
+
+In these last days of the Usenet, commercial vultures are hanging about
+and grepping through news like crazy to find email addresses they can
+foist off their scams and products to.  As a reaction to this, many
+people have started putting nonsense addresses into their @code{From}
+lines.  I think this is counterproductive---it makes it difficult for
+people to send you legitimate mail in response to things you write, as
+well as making it difficult to see who wrote what.  This rewriting may
+perhaps be a bigger menace than the unsolicited commercial email itself
+in the end.
+
+The biggest problem I have with email spam is that it comes in under
+false pretenses.  I press @kbd{g} and Gnus merrily informs me that I
+have 10 new emails.  I say ``Golly gee!  Happy is me!'' and selects the
+mail group, only to find two pyramid schemes, seven advertisements
+``New!  Miracle tonic for growing full, lustrouos hair on your toes!''
+and one mail asking me to repent and find some god.
+
+This is annoying.
+
+The way to deal with this is having Gnus split out all spam into a
+@samp{spam} mail group (@pxref{Splitting Mail}).
+
+First, pick one (1) legal mail address that you can be reached at, and
+put it in your @code{From} header of all your news articles.  (I've
+chosen @samp{larsi@@trym.ifi.uio.no}.)
+
+@lisp
+(setq message-default-news-headers
+      "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
+@end lisp
+
+Then put the following split rule in @code{nnmail-split-fancy}
+(@pxref{Fancy Mail Splitting}):
+
+@lisp
+(
+ ...
+ (to "larsi@@trym.ifi.uio.no"
+      (| ("subject" "re:.*" "misc")
+         ("references" ".*@@.*" "misc")
+         "spam"))
+ ...
+)
+@end lisp
+
+This says that all mail to this address is suspect, but if it has a
+@code{Subject} that starts with a @samp{Re:} or has a @code{References}
+header, it's probably ok.  All the rest goes to the @samp{spam} group.
+(This idea probably comes from Tim Pierce.)
+
+In my experience, this will sort virtually everything into the right
+group.  You still have to check the @samp{spam} group from time to time to
+check for legitimate mail, though.  If you feel like being a good net
+citizen, you can even send off complaints to the proper authorities on
+each unsolicited commercial email---at your leisure.
+
+This works for me.  It allows people an easy way to contact me (they can
+just press @kbd{r} in the usual way), and I'm not bothered at all with
+spam.  It's a win-win situation.  Forging @code{From} headers to point
+to non-existant domains is yucky, in my opinion.
+
+
 @node Various Various
 @section Various Various
 @cindex mode lines
index 8f575a5..0b290e9 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename message
-@settitle Message 5.4.34 Manual
+@settitle Message 5.4.35 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -39,7 +39,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Message 5.4.34 Manual
+@title Message 5.4.35 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -79,7 +79,7 @@ buffers.
 * Key Index::         List of Message mode keys.
 @end menu
 
-This manual corresponds to Message 5.4.34.  Message is distributed with
+This manual corresponds to Message 5.4.35.  Message is distributed with
 the Gnus distribution bearing the same version number as this manual
 has. 
 
index 7ef06a6..421f347 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo.tex
 
-@c $Id: widget.texi,v 1.87 1997/03/08 16:21:38 abraham Exp $
+@c $Id: widget.texi,v 1.93 1997/03/18 13:42:55 abraham Exp $
 
 @c %**start of header
 @setfilename widget
@@ -15,7 +15,7 @@
 @comment  node-name,  next,  previous,  up
 @top The Emacs Widget Library
 
-Version: 1.59
+Version: 1.65
 
 @menu
 * Introduction::                
@@ -530,9 +530,28 @@ widgets current value is valid for the widget.  Otherwise, it should
 return the widget containing the invalid data, and set that widgets
 @code{:error} property to a string explaining the error.
 
+@item :tab-order
+Specify the order in which widgets are traversed with
+@code{widget-forward} or @code{widget-backward}.  This is only partially
+implemented.
+
+@enumerate a
+@item
+Widgets with tabbing order @code{-1} are ignored.
+
+@item 
+(Unimplemented) When on a widget with tabbing order @var{n}, go to the
+next widget in the buffer with tabbing order @var{n+1} or @code{nil},
+whichever comes first.
+
+@item
+When on a widget with no tabbing order specified, go to the next widget
+in the buffer with a positive tabbing order, or @code{nil}
+@end enumerate
+
 @item :parent
-The parent of a nested widget (e.g. a @code{menu-choice} item or an element of a
-@code{editable-list} widget). 
+The parent of a nested widget (e.g. a @code{menu-choice} item or an
+element of a @code{editable-list} widget).
 
 @item :sibling-args
 This keyword is only used for members of a @code{radio-button-choice} or