*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Wed, 5 Mar 1997 01:01:19 +0000 (01:01 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Wed, 5 Mar 1997 01:01:19 +0000 (01:01 +0000)
15 files changed:
lisp/ChangeLog
lisp/article.el
lisp/custom-edit.el
lisp/custom.el
lisp/gnus-art.el
lisp/gnus-group.el
lisp/gnus-sum.el
lisp/gnus-topic.el
lisp/gnus.el
lisp/message.el
lisp/nnfolder.el
lisp/nntp.el
lisp/widget-edit.el
lisp/widget.el
texi/gnus.texi

index 70da79a..0d50e73 100644 (file)
@@ -1,3 +1,55 @@
+Tue Nov 26 00:58:25 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-sum.el (gnus-get-split-value): Expand file names in save
+       dir. 
+
+Mon Nov 25 22:50:19 1996  Jens Lautenbacher  <jens@lemming5.lem.uni-karlsruhe.de>
+
+       * gnus-group.el (gnus-group-make-menu-bar): Moved customize.
+
+Mon Nov 25 15:27:41 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus.el (custom-facep): Removed.
+
+       * gnus-topic.el (gnus-topic-line-format): Added customize
+       support. 
+
+       * gnus.el (gnus-article-display-hook): Moved
+       `gnus-article-treat-overstrike' last.
+
+Mon Nov 25 04:17:03 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnfolder.el (nnfolder-read-folder): Make buffer read/write.
+
+       * gnus-sum.el (gnus-summary-print-article): Delete invisible text
+       first. 
+
+       * article.el (article-delete-invisible-text): New function.
+
+       * nntp.el (nntp-possibly-change-group): Would abort async
+       fetches. 
+
+       * gnus-sum.el (gnus-summary-print-article): New command and
+       keystroke. 
+       (gnus-summary-move-article): Select the article first.
+
+       * message.el (message-user-agent): Define the message mail user
+       agent. 
+
+Sun Nov 24 02:28:56 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nntp.el (nntp-possibly-change-group): Would get confused.
+
+       * gnus-art.el (gnus-button-url-regexp): Allow all word-constituent
+       characters to be part of urls.
+
+       * nntp.el (nntp-possibly-change-group): Wait until the status line
+       arrives and delete it.
+
+Sun Nov 24 01:36:45 1996  Lars Magne Ingebrigtsen  <menja.larsi@ifi.uio.no>
+
+       * gnus.el: Red Gnus v0.70 is released.
+
 Sat Nov 23 23:22:27 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
 
        * message.el (message-mode-menu): Added `message-caesar-region'. 
index 7348602..efca638 100644 (file)
@@ -237,6 +237,13 @@ is the face used for highlighting."
       (while (setq b (text-property-any b (point-max) 'article-type type))
        (delete-region b (incf b))))))
 
+(defun article-delete-invisible-text ()
+  "Delete all invisible text in the current buffer."
+  (save-excursion
+    (let ((b (point-min)))
+      (while (setq b (text-property-any b (point-max) 'invisible t))
+       (delete-region b (incf b))))))
+
 (defun article-text-type-exists-p (type)
   "Say whether any text of type TYPE exists in the buffer."
   (text-property-any (point-min) (point-max) 'article-type type))
index 140b95f..c3ce9f0 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.02
+;; Version: 1.04
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -160,7 +160,10 @@ if that value is non-nil."
 ;;;###autoload
 (defun customize-face (symbol)
   "Customize FACE."
-  (interactive (list (completing-read "Customize face: " obarray 'facep)))
+  (interactive (list (completing-read "Customize face: " 
+                                     obarray 'custom-facep)))
+  (if (stringp symbol)
+      (setq symbol (intern symbol)))
   (unless (symbolp symbol)
     (error "Should be a symbol %S" symbol))
   (custom-buffer-create (list (list symbol 'custom-face))))
@@ -172,7 +175,7 @@ if that value is non-nil."
   (let ((found nil))
     (mapatoms (lambda (symbol)
                (and (get symbol 'saved-face)
-                    (facep symbol)
+                    (custom-facep symbol)
                     (setq found (cons (list symbol 'custom-face) found)))
                (and (get symbol 'saved-value)
                     (boundp symbol)
@@ -193,7 +196,7 @@ user-settable."
                (when (string-match regexp (symbol-name symbol))
                  (when (get symbol 'custom-group)
                    (setq found (cons (list symbol 'custom-group) found)))
-                 (when (facep symbol)
+                 (when (custom-facep symbol)
                    (setq found (cons (list symbol 'custom-face) found)))
                  (when (and (boundp symbol)
                             (or (get symbol 'saved-value)
@@ -283,7 +286,13 @@ Push RET or click mouse-2 on the word ")
                                   (t t)))))
 (widget-put (get 'menu-choice 'widget-type) :custom-show t)
 
-;;; The `custom-magic' Widget
+;;; The `custom-manual' Widget.
+
+(define-widget 'custom-manual 'info-link
+  "Link to the manual entry for this customization option."
+  :tag "Manual")
+
+;;; The `custom-magic' Widget.
 
 (define-widget 'custom-magic 'item
   "Status feedback for customization option."
@@ -420,7 +429,7 @@ The list should be sorted most significant first."
 (define-widget 'custom 'default
   "Customize a user option."
   :convert-widget 'widget-item-convert-widget
-  :format "%l%[%t%]: %v%m %h"
+  :format "%l%[%t%]: %v%m %h%a"
   :format-handler 'custom-format-handler
   :notify 'custom-notify
   :custom-level 1
@@ -461,6 +470,28 @@ The list should be sorted most significant first."
             (widget-put widget :custom-magic magic)
             (push magic buttons)
             (widget-put widget :buttons buttons)))
+         ((eq escape ?a)
+          (let* ((symbol (widget-get widget :value))
+                 (links (get symbol 'custom-links))
+                 (many (> (length links) 2)))
+            (when links
+              (and (eq (preceding-char) ?\n)
+                   (widget-get widget :indent)
+                   (insert-char ?  (widget-get widget :indent)))
+              (insert "See also ")
+              (while links
+                (push (widget-create-child-and-convert widget (car links))
+                      buttons)
+                (setq links (cdr links))
+                (cond ((null links)
+                       (insert ".\n"))
+                      ((null (cdr links))
+                       (if many
+                           (insert ", and ")
+                         (insert " and ")))
+                      (t 
+                       (insert ", "))))
+              (widget-put widget :buttons buttons))))
          (t 
           (widget-default-format-handler widget escape)))))
 
@@ -501,7 +532,7 @@ The list should be sorted most significant first."
 
 (define-widget 'custom-variable 'custom
   "Customize variable."
-  :format "%l%v%m %h"
+  :format "%l%v%m %h%a"
   :help-echo "Push me to set or reset this variable."
   :documentation-property 'variable-documentation
   :custom-state nil
@@ -761,7 +792,7 @@ Optional EVENT is the location for the menu."
 
 (define-widget 'custom-face 'custom
   "Customize face."
-  :format "%l%[%t%]: %s%m %h%v"
+  :format "%l%[%t%]: %s%m %h%a%v"
   :format-handler 'custom-face-format-handler
   :help-echo "Push me to set or reset this face."
   :documentation-property 'face-documentation
@@ -954,7 +985,7 @@ Optional EVENT is the location for the menu."
 
 (define-widget 'custom-group 'custom
   "Customize group."
-  :format "%l%[%t%]: %L\n%m %h%v"
+  :format "%l%[%t%]: %L\n%m %h%a%v"
   :documentation-property 'group-documentation
   :help-echo "Push me to set or reset all members of this group."
   :value-create 'custom-group-value-create
@@ -1113,7 +1144,7 @@ Leave point at the location of the call, or after the last expression."
                      (princ " ")
                      (prin1 value)
                      (if (or (get symbol 'factory-face)
-                             (and (not (facep symbol))
+                             (and (not (custom-facep symbol))
                                   (not (get symbol 'force-face))))
                          (princ ")")
                        (princ " t)"))))))
index bd28947..56c874a 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.02
+;; Version: 1.04
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -19,7 +19,7 @@
 
 (require 'widget)
 
-(define-widget-keywords :options :type :group)
+(define-widget-keywords :link :options :type :group)
 
 ;; These autoloads should be deleted when the file is added to Emacs
 (autoload 'customize "custom-edit" nil t)
@@ -74,6 +74,19 @@ If FRAME is omitted or nil, use the selected frame."
                             (list (cons 'background-mode mode)))
     mode))
 
+;; XEmacs and Emacs have two different definitions of `facep'.
+(cond ((not (fboundp 'facep))
+       (defun custom-facep (face) 
+        "No faces"
+        nil))
+      ((string-match "XEmacs" emacs-version)
+       (defun custom-facep (face) 
+        "Face symbol or object."
+        (or (facep face)
+            (find-face face))))
+      (t
+       (defalias 'custom-facep 'facep)))
+
 ;;; The `defcustom' Macro.
 
 ;;;###autoload
@@ -109,9 +122,12 @@ If FRAME is omitted or nil, use the selected frame."
                 (put symbol 'custom-options (copy-list value))))
              ((eq keyword :group)
               (custom-add-to-group value symbol 'custom-variable))
+             ((eq keyword :link)
+              (custom-add-link symbol value))
              (t
-              (error "Unknown keyword %s" symbol))))))
-  (run-hooks 'custom-define-hook))
+              (error "Unknown keyword %s" keyword))))))
+  (run-hooks 'custom-define-hook)
+  symbol)
 
 ;;;###autoload
 (defmacro defcustom (symbol value doc &rest args)
@@ -143,7 +159,7 @@ information."
   "Like `defface', but FACE is evaluated as a normal argument."
   (put face 'factory-face spec)
   (when (fboundp 'facep)
-    (unless (and (facep face)
+    (unless (and (custom-facep face)
                 (not (get face 'saved-face)))
       ;; If the user has already created the face, respect that.
       (let ((value (or (get face 'saved-face) spec)))
@@ -162,9 +178,12 @@ information."
        (setq args (cdr args))
        (cond ((eq keyword :group)
               (custom-add-to-group value face 'custom-face))
+             ((eq keyword :link)
+              (custom-add-link face value))
              (t
               (error "Unknown keyword %s" face))))))
-  (run-hooks 'custom-define-hook))
+  (run-hooks 'custom-define-hook)
+  face)
 
 ;;;###autoload
 (defmacro defface (face spec doc &rest args)
@@ -234,9 +253,12 @@ information."
        (setq args (cdr args))
        (cond ((eq keyword :group)
               (custom-add-to-group value symbol 'custom-group))
+             ((eq keyword :link)
+              (custom-add-link symbol value))
              (t
               (error "Unknown keyword %s" symbol))))))
-  (run-hooks 'custom-define-hook))
+  (run-hooks 'custom-define-hook)
+  symbol)
 
 ;;;###autoload
 (defmacro defgroup (symbol members doc &rest args)
@@ -273,7 +295,7 @@ If there already is an entry for that option, overwrite it."
        (setcar (cdr old) widget)
       (put group 'custom-group (nconc members (list (list option widget)))))))
 
-;;; Options
+;;; Properties.
 
 (defun custom-add-option (symbol option)
   "To the variable SYMBOL add OPTION.
@@ -284,6 +306,12 @@ For other types variables, the effect is undefined."
     (unless (member option options)
       (put symbol 'custom-options (cons option options)))))
 
+(defun custom-add-link (symbol widget)
+  "To the custom option SYMBOL add the link WIDGET."
+  (let ((links (get symbol 'custom-links)))
+    (unless (member widget links)
+      (put symbol 'custom-links (cons widget links)))))
+
 ;;; Face Utilities.
 
 (and (fboundp 'make-face)
@@ -490,10 +518,14 @@ See `defface' for the format of SPEC."
 ;;; Meta Customization
 
 (defgroup emacs nil
-  "Customization of the One True Editor.")
+  "Customization of the One True Editor."
+  :link '(custom-manual "(emacs)Top"))
 
 (defgroup customize nil
   "Customization of the Customization support."
+  :link '(custom-manual "(custom)Top")
+  :link '(url-link :tag "Development Page" 
+                  "http://www.dina.kvl.dk/~abraham/custom/")
   :group 'emacs)
 
 (defcustom custom-define-hook nil
index 0168a62..fb0920f 100644 (file)
@@ -1490,7 +1490,7 @@ groups."
 
 ;;; Internal Variables:
 
-(defcustom gnus-button-url-regexp "\\b\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\):\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?[-\\wa-zA-Z0-9_=!?#$@~`%&*+|\\/:;.,]*[-\\wa-zA-Z0-9_=#$@~`%&*+|\\/]"
+(defcustom gnus-button-url-regexp "\\b\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\):\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?\\([-a-zA-Z0-9_=!?#$@~`%&*+|\\/:;.,]\\|\\w\\)*\\([-a-zA-Z0-9_=#$@~`%&*+|\\/]\\|\\w\\)"
   "Regular expression that matches URLs."
   :group 'article
   :type 'regexp)
index f65450f..1e8e0b4 100644 (file)
@@ -768,13 +768,13 @@ ticked: The number of ticked articles."
        ["Set group level" gnus-group-set-current-level
        (gnus-group-group-name)]
        ["Select quick" gnus-group-quick-select-group (gnus-group-group-name)]
+       ["Customize" gnus-group-customize (gnus-group-group-name)]
        ("Edit"
        ["Parameters" gnus-group-edit-group-parameters
         (gnus-group-group-name)]
        ["Select method" gnus-group-edit-group-method
         (gnus-group-group-name)]
        ["Info" gnus-group-edit-group (gnus-group-group-name)]
-       ["Customize" gnus-group-customize t]
        ["Local kill file" gnus-group-edit-local-kill (gnus-group-group-name)]
        ["Global kill file" gnus-group-edit-global-kill t])
        ))
index 96009d2..ac2b9b8 100644 (file)
@@ -1426,7 +1426,8 @@ increase the score of each group you read."
     "r" gnus-summary-refer-parent-article
     "R" gnus-summary-refer-references
     "g" gnus-summary-show-article
-    "s" gnus-summary-isearch-article)
+    "s" gnus-summary-isearch-article
+    "P" gnus-summary-print-article)
 
   (gnus-define-keys (gnus-summary-wash-map "W" gnus-summary-mode-map)
     "b" gnus-article-add-buttons
@@ -1695,7 +1696,8 @@ increase the score of each group you read."
        ["Save in RMAIL mbox" gnus-summary-save-article-rmail t]
        ["Save body in file" gnus-summary-save-article-body-file t]
        ["Pipe through a filter" gnus-summary-pipe-output t]
-       ["Add to SOUP packet" gnus-soup-add-article t])
+       ["Add to SOUP packet" gnus-soup-add-article t]
+       ["Print" gnus-summary-print-article t])
        ("Backend"
        ["Respool article..." gnus-summary-respool-article t]
        ["Move article..." gnus-summary-move-article
@@ -6359,6 +6361,20 @@ article.  If BACKWARD (the prefix) is non-nil, search backward instead."
     (when gnus-break-pages
       (gnus-narrow-to-page))))
 
+(defun gnus-summary-print-article ()
+  "Generate and print a PostScript image of the article buffer."
+  (interactive)
+  (gnus-summary-select-article)
+  (gnus-eval-in-buffer-window gnus-article-buffer
+    (let ((buffer (generate-new-buffer " *print*")))
+      (unwind-protect
+         (progn
+           (copy-to-buffer buffer (point-min) (point-max))
+           (set-buffer buffer)
+           (article-delete-invisible-text)
+           (ps-print-buffer-with-faces))
+       (kill-buffer buffer)))))
+
 (defun gnus-summary-show-article (&optional arg)
   "Force re-fetching of the current article.
 If ARG (the prefix) is non-nil, show the raw article without any
@@ -6483,6 +6499,8 @@ and `request-accept' functions."
   (unless action
     (setq action 'move))
   (gnus-set-global-variables)
+  (save-window-excursion
+    (gnus-summary-select-article))
   ;; Check whether the source group supports the required functions.
   (cond ((and (eq action 'move)
              (not (gnus-check-backend-function
@@ -8116,7 +8134,9 @@ save those articles instead."
                      (setq result (eval match)))))
              (setq split-name (append (cdr method) split-name))
              (cond ((stringp result)
-                    (push result split-name))
+                    (push (expand-file-name
+                           result gnus-article-save-directory)
+                          split-name))
                    ((consp result)
                     (setq split-name (append result split-name)))))))))
     split-name))
index 7aac675..18135e0 100644 (file)
@@ -42,7 +42,7 @@
   :type 'hook
   :group 'gnus-topic)
 
-(defvar gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n"
+(defcustom gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n"
   "Format of topic lines.
 It works along the same lines as a normal formatting string,
 with some simple extensions.
@@ -53,7 +53,9 @@ with some simple extensions.
 %g  Number of groups in the topic.
 %a  Number of unread articles in the groups in the topic.
 %A  Number of unread articles in the groups in the topic and its subtopics.
-")
+"
+  :type 'string
+  :group 'gnus-topic)
 
 (defcustom gnus-topic-indent-level 2
   "*How much each subtopic should be indented."
index f25934a..d789da9 100644 (file)
@@ -42,7 +42,7 @@
   "Score and kill file handling."
   :group 'gnus )
 
-(defconst gnus-version-number "0.70"
+(defconst gnus-version-number "0.71"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
@@ -62,15 +62,6 @@ be set in `.emacs' instead."
 
 ;;; Kludges to help the transition from the old `custom.el'.
 
-;; XEmacs and Emacs 19.29 facep does different things.
-(defalias 'custom-facep
-  (cond ((fboundp 'find-face)
-        'find-face)
-       ((fboundp 'facep)
-        'facep)
-       (t
-        'ignore)))
-
 (unless (featurep 'gnus-xmas)
   (defalias 'gnus-make-overlay 'make-overlay)
   (defalias 'gnus-overlay-put 'overlay-put)
@@ -857,7 +848,6 @@ want."
   :type 'hook
   :options '(gnus-article-add-buttons
             gnus-article-add-buttons-to-head
-            gnus-article-treat-overstrike
             gnus-article-emphasize
             gnus-article-fill-cited-article
             gnus-article-remove-cr
@@ -885,7 +875,9 @@ want."
             gnus-article-remove-trailing-blank-lines
             gnus-article-strip-leading-blank-lines
             gnus-article-strip-multiple-blank-lines
-            gnus-article-strip-blank-lines))
+            gnus-article-strip-blank-lines
+            gnus-article-treat-overstrike
+            ))
 
 \f
 ;;; Internal variables
index 1e450ea..252ba1f 100644 (file)
     (require 'mail-abbrevs)
   (require 'mailabbrev))
 
-(defgroup message nil
+(defgroup message '((user-mail-address custom-variable)
+                   (user-full-name custom-variable))
   "Mail and news message composing."
+  :link '(custom-manual "(message)Top")
   :group 'emacs)
 
+(put 'user-mail-address 'custom-type 'string)
+(put 'user-full-name 'custom-type 'string)
+
+(defgroup message-various nil
+  "Various Message Variables"
+  :link '(custom-manual "(message)Various Message Variables")
+  :group 'message)
+
+(defgroup message-buffers nil
+  "Message Buffers"
+  :link '(custom-manual "(message)Message Buffers")
+  :group 'message)
+
+(defgroup message-sending nil
+  "Message Sending"
+  :link '(custom-manual "(message)Sending Variables")
+  :group 'message)
+
+(defgroup message-interface nil
+  "Message Interface"
+  :link '(custom-manual "(message)Interface")
+  :group 'message)
+
+(defgroup message-forwarding nil
+  "Message Forwarding"
+  :link '(custom-manual "(message)Forwarding")
+  :group 'message-interface)
+
+(defgroup message-insertion nil
+  "Message Insertion"
+  :link '(custom-manual "(message)Insertion")
+  :group 'message)
+
+(defgroup message-headers nil
+  "Message Headers"
+  :link '(custom-manual "(message)Message Headers")
+  :group 'message)
+
+(defgroup message-news nil
+  "Composing News Messages"
+  :group 'message)
+
+(defgroup message-mail nil
+  "Composing Mail Messages"
+  :group 'message)
+
 (defcustom message-directory "~/Mail/"
   "*Directory from which all other mail file variables are derived."
-  :group 'message
+  :group 'message-various
   :type 'directory)
 
 (defcustom message-max-buffers 10
   "*How many buffers to keep before starting to kill them off."
-  :group 'message
+  :group 'message-buffers
   :type 'integer)
 
 (defcustom message-send-rename-function nil
   "Function called to rename the buffer after sending it."
-  :group 'message
+  :group 'message-buffers
   :type 'function)
 
 ;;;###autoload
-(defvar message-fcc-handler-function 'rmail-output
+(defcustom message-fcc-handler-function 'rmail-output
   "*A function called to save outgoing articles.
 This function will be called with the name of the file to store the
 article in.  The default function is `rmail-output' which saves in Unix
-mailbox format.")
-(put 'message-fcc-handler-function 
-     'custom-type '(radio (function-item rmail-output)
-                         (function :tag "Other")))
-(put 'message-fcc-handler-function
-     'factory-value '('rmail-output))
-(custom-add-to-group 'message 'message-fcc-handler-function 'custom-variable)
+mailbox format."
+  :type '(radio (function-item rmail-output)
+               (function :tag "Other"))
+  :group 'message-sending)
 
 (defcustom message-courtesy-message
   "The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n"
@@ -79,16 +124,16 @@ mailbox format.")
 If the string contains the format spec \"%s\", the Newsgroups
 the article has been posted to will be inserted there.
 If this variable is nil, no such courtesy message will be added."
-  :group 'message
+  :group 'message-sending
   :type 'string)
 
 (defcustom message-ignored-bounced-headers "^\\(Received\\|Return-Path\\):"
   "*Regexp that matches headers to be removed in resent bounced mail."
-  :group 'message
+  :group 'message-interface
   :type 'regexp)
 
 ;;;###autoload
-(defvar message-from-style 'default
+(defcustom message-from-style 'default
   "*Specifies how \"From\" headers look.
 
 If `nil', they contain just the return address like:
@@ -99,17 +144,14 @@ If `angles', they look like:
        Elvis Parsley <king@grassland.com>
 
 Otherwise, most addresses look like `angles', but they look like
-`parens' if `angles' would need quoting and `parens' would not.")
-(put 'message-from-style
-     'custom-type '(choice (const :tag "simple" nil)
-                          (const parens)
-                          (const angles)
-                          (const default)))
-(put 'message-from-style
-     'factory-value '('default))
-(custom-add-to-group 'message 'message-from-style 'custom-variable)
-
-(defvar message-syntax-checks nil
+`parens' if `angles' would need quoting and `parens' would not."
+  :type '(choice (const :tag "simple" nil)
+                (const parens)
+                (const angles)
+                (const default))
+  :group 'message-headers)
+
+(defcustom message-syntax-checks nil
   ;; Guess this one shouldn't be easy to customize...
   "Controls what syntax checks should not be performed on outgoing posts.
 To disable checking of long signatures, for instance, add
@@ -120,7 +162,8 @@ Don't touch this variable unless you really know what you're doing.
 Checks include subject-cmsg multiple-headers sendsys message-id from
 long-lines control-chars size new-text redirected-followup signature
 approved sender empty empty-headers message-id from subject
-shorten-followup-to existing-newsgroups.")
+shorten-followup-to existing-newsgroups."
+  :group 'message-news)
 
 (defcustom message-required-news-headers
   '(From Newsgroups Subject Date Message-ID 
@@ -131,8 +174,9 @@ RFC977 and RFC1036 require From, Date, Newsgroups, Subject,
 Message-ID.  Organization, Lines, In-Reply-To, Expires, and
 X-Newsreader are optional.  If don't you want message to insert some
 header, remove it from this list."
-  :group 'message
-  :type 'sexp)
+  :group 'message-news
+  :group 'message-headers
+  :type '(repeat sexp))
 
 (defcustom message-required-mail-headers 
   '(From Subject Date (optional . In-Reply-To) Message-ID Lines
@@ -140,45 +184,46 @@ header, remove it from this list."
   "Headers to be generated or prompted for when mailing a message.
 RFC822 required that From, Date, To, Subject and Message-ID be
 included.  Organization, Lines and X-Mailer are optional."
-  :group 'message
-  :type 'sexp)
+  :group 'message-mail
+  :group 'message-headers
+  :type '(repeat sexp))
 
 (defcustom message-deletable-headers '(Message-ID Date Lines)
   "Headers to be deleted if they already exist and were generated by message previously."
-  :group 'message
+  :group 'message-headers
   :type 'sexp)
 
 (defcustom message-ignored-news-headers 
   "^NNTP-Posting-Host:\\|^Xref:\\|^Bcc:\\|^Gcc:\\|^Fcc:\\|^Resent-Fcc:"
   "*Regexp of headers to be removed unconditionally before posting."
-  :group 'message
+  :group 'message-news
+  :group 'message-headers
   :type 'regexp)
 
 (defcustom message-ignored-mail-headers "^Gcc:\\|^Fcc:\\|^Resent-Fcc:"
   "*Regexp of headers to be removed unconditionally before mailing."
-  :group 'message
+  :group 'message-mail
+  :group 'message-headers
   :type 'regexp)
 
 (defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|Return-Path:\\|^Supersedes:"
   "*Header lines matching this regexp will be deleted before posting.
 It's best to delete old Path and Date headers before posting to avoid
 any confusion."
-  :group 'message
+  :group 'message-interface
   :type 'regexp)
 
 ;;;###autoload
-(defvar message-signature-separator "^-- *$"
-  "Regexp matching the signature separator.")
-(put 'message-signature-separator
-     'custom-type 'regexp)
-(put 'message-signature-separator
-     'factory-value '("^-- *$"))
-(custom-add-to-group 'message 'message-signature-separator 'custom-variable)
+(defcustom message-signature-separator "^-- *$"
+  "Regexp matching the signature separator."
+  :type 'regexp
+  :group 'message-various)
 
 (defcustom message-interactive nil 
   "Non-nil means when sending a message wait for and display errors.
 nil means let mailer mail back a message to report errors."
-  :group 'message
+  :group 'message-sending
+  :group 'message-mail
   :type 'boolean)
 
 (defcustom message-generate-new-buffers t
@@ -186,14 +231,14 @@ nil means let mailer mail back a message to report errors."
 If this is a function, call that function with three parameters:  The type,
 the to address and the group name.  (Any of these may be nil.)  The function
 should return the new buffer name."
-  :group 'message
+  :group 'message-buffers
   :type '(choice (const :tag "off" nil)
                 (const :tag "on" t)
                 (function fun)))
 
 (defcustom message-kill-buffer-on-exit nil
   "*Non-nil means that the message buffer will be killed after sending a message."
-  :group 'message
+  :group 'message-buffers
   :type 'boolean)
 
 (defvar gnus-local-organization)
@@ -204,109 +249,104 @@ should return the new buffer name."
       t)
   "*String to be used as an Organization header.
 If t, use `message-user-organization-file'."
-  :group 'message
+  :group 'message-headers
   :type '(choice string
                 (const :tag "consult file" t)))
 
 ;;;###autoload
-(defvar message-user-organization-file "/usr/lib/news/organization"
-  "*Local news organization file.")
-(put 'message-user-organization-file
-     'custom-type 'file)
-(put 'message-user-organization-file
-     'factory-value '("/usr/lib/news/organization"))
-(custom-add-to-group 'message 'message-user-organization-file 'custom-variable)
+(defcustom message-user-organization-file "/usr/lib/news/organization"
+  "*Local news organization file."
+  :type 'file
+  :group 'message-headers)
 
 (defcustom message-autosave-directory "~/"
   ; (concat (file-name-as-directory message-directory) "drafts/")
   "*Directory where message autosaves buffers.
 If nil, message won't autosave."
-  :group 'message
+  :group 'message-buffers
   :type 'directory)
 
 (defcustom message-forward-start-separator 
   "------- Start of forwarded message -------\n"
   "*Delimiter inserted before forwarded messages."
-  :group 'message
+  :group 'message-forwarding
   :type 'string)
 
 (defcustom message-forward-end-separator
   "------- End of forwarded message -------\n"
   "*Delimiter inserted after forwarded messages."
-  :group 'message
+  :group 'message-forwarding
   :type 'string)
 
 (defcustom message-signature-before-forwarded-message t
   "*If non-nil, put the signature before any included forwarded message."
-  :group 'message
+  :group 'message-forwarding
   :type 'boolean)
 
 (defcustom message-included-forward-headers 
   "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:"
   "*Regexp matching headers to be included in forwarded messages."
-  :group 'message
+  :group 'message-forwarding
   :type 'regexp)
 
 (defcustom message-ignored-resent-headers "^Return-receipt"
   "*All headers that match this regexp will be deleted when resending a message."
-  :group 'message
+  :group 'message-interface
   :type 'regexp)
 
 (defcustom message-ignored-cited-headers "."
   "*Delete these headers from the messages you yank."
-  :group 'message
+  :group 'message-insertion
   :type 'regexp)
 
 (defcustom message-cancel-message "I am canceling my own article."
   "Message to be inserted in the cancel message."
-  :group 'message
+  :group 'message-interface
   :type 'string)
 
 ;; Useful to set in site-init.el
 ;;;###autoload
-(defvar message-send-mail-function 'message-send-mail-with-sendmail
+(defcustom message-send-mail-function 'message-send-mail-with-sendmail
   "Function to call to send the current buffer as mail.
 The headers should be delimited by a line whose contents match the
 variable `mail-header-separator'.
 
 Legal values include `message-send-mail-with-sendmail' (the default),
-`message-send-mail-with-mh' and `message-send-mail-with-qmail'.")
-(put 'message-send-mail-function
-     'custom-type '(radio (function-item message-send-mail-with-sendmail)
-                         (function-item message-send-mail-with-mh)
-                         (function-item message-send-mail-with-qmail)
-                         (function :tag "Other")))
-(put 'message-send-mail-function
-     'factory-value '('rmail-output))
-(custom-add-to-group 'message 'message-send-mail-function 'custom-variable)
-
+`message-send-mail-with-mh' and `message-send-mail-with-qmail'."
+  :type '(radio (function-item message-send-mail-with-sendmail)
+               (function-item message-send-mail-with-mh)
+               (function-item message-send-mail-with-qmail)
+               (function :tag "Other"))
+  :group 'message-sending
+  :group 'message-mail)
 
 (defcustom message-send-news-function 'message-send-news
   "Function to call to send the current buffer as news.
 The headers should be delimited by a line whose contents match the
 variable `mail-header-separator'."
-  :group 'message
+  :group 'message-sending
+  :group 'message-news
   :type 'function)
 
 (defcustom message-reply-to-function nil
   "Function that should return a list of headers.
 This function should pick out addresses from the To, Cc, and From headers
 and respond with new To and Cc headers."
-  :group 'message
+  :group 'message-interface
   :type 'function)
 
 (defcustom message-wide-reply-to-function nil
   "Function that should return a list of headers.
 This function should pick out addresses from the To, Cc, and From headers
 and respond with new To and Cc headers."
-  :group 'message
+  :group 'message-interface
   :type 'function)
 
 (defcustom message-followup-to-function nil
   "Function that should return a list of headers.
 This function should pick out addresses from the To, Cc, and From headers
 and respond with new To and Cc headers."
-  :group 'message
+  :group 'message-interface
   :type 'function)
 
 (defcustom message-use-followup-to 'ask
@@ -315,7 +355,7 @@ If nil, ignore the header.  If it is t, use its value, but query before
 using the \"poster\" value.  If it is the symbol `ask', query the user
 whether to ignore the \"poster\" value.  If it is the symbol `use',
 always use the value."
-  :group 'message
+  :group 'message-interface
   :type '(choice (const :tag "ignore" nil)
                 (const use)
                 (const ask)))
@@ -323,7 +363,7 @@ always use the value."
 ;; qmail-related stuff
 (defcustom message-qmail-inject-program "/var/qmail/bin/qmail-inject"
   "Location of the qmail-inject program."
-  :group 'message
+  :group 'message-sending
   :type 'file)
 
 (defcustom message-qmail-inject-args nil
@@ -333,7 +373,7 @@ This should be a list of strings, one string for each argument.
 For e.g., if you wish to set the envelope sender address so that bounces
 go to the right place or to deal with listserv's usage of that address, you
 might set this variable to '(\"-f\" \"you@some.where\")."
-  :group 'message
+  :group 'message-sending
   :type '(repeat string))
 
 (defvar gnus-post-method)
@@ -346,135 +386,122 @@ might set this variable to '(\"-f\" \"you@some.where\")."
         gnus-select-method)
        (t '(nnspool "")))
   "Method used to post news."
-  :group 'message
+  :group 'message-news
+  :group 'mesage-sending
   ;; This should be the `gnus-select-method' widget, but that might
   ;; create a dependence to `gnus.el'.
   :type 'sexp)
 
 (defcustom message-generate-headers-first nil
   "*If non-nil, generate all possible headers before composing."
-  :group 'message
+  :group 'message-headers
   :type 'boolean)
 
 (defcustom message-setup-hook nil
   "Normal hook, run each time a new outgoing message is initialized.
 The function `message-setup' runs this hook."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 (defcustom message-signature-setup-hook nil
   "Normal hook, run each time a new outgoing message is initialized.
 It is run after the headers have been inserted and before 
 the signature is inserted."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 (defcustom message-mode-hook nil
   "Hook run in message mode buffers."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 (defcustom message-header-hook nil
   "Hook run in a message mode buffer narrowed to the headers."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 (defcustom message-header-setup-hook nil
   "Hook called narrowed to the headers when setting up a message
 buffer."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 ;;;###autoload
-(defvar message-citation-line-function 'message-insert-citation-line
-  "*Function called to insert the \"Whomever writes:\" line.")
-(put 'message-citation-line-function
-     'custom-type 'function)
-(put 'message-citation-line-function
-     'factory-value '('message-insert-citation-line))
-(custom-add-to-group 'message 'message-citation-line-function 'custom-variable)
-
+(defcustom message-citation-line-function 'message-insert-citation-line
+  "*Function called to insert the \"Whomever writes:\" line."
+  :type 'function
+  :group 'message-insertion)
 
 ;;;###autoload
-(defvar message-yank-prefix "> "
+(defcustom message-yank-prefix "> "
   "*Prefix inserted on the lines of yanked messages.
-nil means use indentation.")
-(put 'message-yank-prefix
-     'custom-type 'string)
-(put 'message-yank-prefix
-     'factory-value '("> "))
-(custom-add-to-group 'message 'message-yank-prefix 'custom-variable)
+nil means use indentation."
+  :type 'string
+  :group 'message-insertion)
 
 (defcustom message-indentation-spaces 3
   "*Number of spaces to insert at the beginning of each cited line.
 Used by `message-yank-original' via `message-yank-cite'."
-  :group 'message
+  :group 'message-insertion
   :type 'integer)
 
 ;;;###autoload
-(defvar message-cite-function
+(defcustom message-cite-function
   (if (and (boundp 'mail-citation-hook)
           mail-citation-hook)
       mail-citation-hook
     'message-cite-original)
-  "*Function for citing an original message.")
-(put 'message-cite-function
-     'custom-type '(radio (function-item message-cite-original)
-                         (function-item sc-cite-original)
-                         (function :tag "Other")))
-(put 'message-cite-function
-     'factory-value '('message-cite-original))
-(custom-add-to-group 'message 'message-cite-function 'custom-variable)
+  "*Function for citing an original message."
+  :type '(radio (function-item message-cite-original)
+               (function-item sc-cite-original)
+               (function :tag "Other"))
+  :group 'message-insertion)
 
 ;;;###autoload
-(defvar message-indent-citation-function 'message-indent-citation
+(defcustom message-indent-citation-function 'message-indent-citation
   "*Function for modifying a citation just inserted in the mail buffer.
 This can also be a list of functions.  Each function can find the
 citation between (point) and (mark t).  And each function should leave
-point and mark around the citation text as modified.")
-(put 'message-indent-citation-function
-     'custom-type 'function)
-(put 'message-indent-citation-function
-     'factory-value '('message-indent-citation))
-(custom-add-to-group 'message 'message-indent-citation-function 'custom-variable)
+point and mark around the citation text as modified."
+  :type 'function
+  :group 'message-insertion)
 
 (defvar message-abbrevs-loaded nil)
 
 ;;;###autoload
-(defvar message-signature t
+(defcustom message-signature t
   "*String to be inserted at the end of the message buffer.
 If t, the `message-signature-file' file will be inserted instead.
 If a function, the result from the function will be used instead.
-If a form, the result from the form will be used instead.")
-(put 'message-signature
-     'custom-type 'sexp)
-(put 'message-signature
-     'factory-value '(t))
-(custom-add-to-group 'message 'message-signature 'custom-variable)
+If a form, the result from the form will be used instead."
+  :type 'sexp
+  :group 'message-insertion)
 
 ;;;###autoload
-(defvar message-signature-file "~/.signature"
-  "*File containing the text inserted at end of message buffer.")
-(put 'message-signature-file
-     'custom-type 'file)
-(put 'message-signature-file
-     'factory-value '("~/.signature"))
-(custom-add-to-group 'message 'message-signature-file 'custom-variable)
+(defcustom message-signature-file "~/.signature"
+  "*File containing the text inserted at end of message buffer."
+  :type 'file
+  :group 'message-insertion)
 
 (defcustom message-distribution-function nil
   "*Function called to return a Distribution header."
-  :group 'message
+  :group 'message-news
+  :group 'message-headers
   :type 'function)
 
 (defcustom message-expires 14
-  "*Number of days before your article expires."
-  :group 'message
+  "Number of days before your article expires."
+  :group 'message-news
+  :group 'message-headers
+  :link '(custom-manual "(message)News Headers")
   :type 'integer)
 
 (defcustom message-user-path nil
   "If nil, use the NNTP server name in the Path header.
 If stringp, use this; if non-nil, use no host name (user name only)."
-  :group 'message
+  :group 'message-news
+  :group 'message-headers
+  :link '(custom-manual "(message)News Headers")
   :type '(choice (const :tag "nntp" nil)
                 (string :tag "name")
                 (sexp :tag "none" :format "%t" t)))
@@ -498,18 +525,20 @@ If stringp, use this; if non-nil, use no host name (user name only)."
   "*A string containing header lines to be inserted in outgoing messages.
 It is inserted before you edit the message, so you can edit or delete
 these lines."
-  :group 'message
+  :group 'message-headers
   :type 'string)
 
 (defcustom message-default-mail-headers ""
   "*A string of header lines to be inserted in outgoing mails."
-  :group 'message
+  :group 'message-headers
+  :group 'message-mail
   :type 'string)
 
 (defcustom message-default-news-headers ""
   "*A string of header lines to be inserted in outgoing news
 articles."
-  :group 'message
+  :group 'message-headers
+  :group 'message-news
   :type 'string)
 
 ;; Note: could use /usr/ucb/mail instead of sendmail;
@@ -536,9 +565,14 @@ articles."
 \(This problem exists on Sunos 4 when sendmail is run in remote mode.)
 The value should be an expression to test whether the problem will
 actually occur."
-  :group 'message
+  :group 'message-sending
   :type 'sexp)
 
+(ignore-errors
+  (define-mail-user-agent 'message-user-agent
+    'message-mail 'message-send-and-exit 
+    'message-kill-buffer 'message-send-hook))
+
 ;;; Internal variables.
 ;;; Well, not really internal.
 
@@ -579,23 +613,23 @@ The cdr of ech entry is a function for applying the face to a region.")
 
 (defcustom message-send-hook nil
   "Hook run before sending messages."
-  :group 'message
+  :group 'message-various
   :options '(ispell-message)
   :type 'hook)
 
 (defcustom message-send-mail-hook nil
   "Hook run before sending mail messages."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 (defcustom message-send-news-hook nil
   "Hook run before sending news messages."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 (defcustom message-sent-hook nil
   "Hook run after sending messages."
-  :group 'message
+  :group 'message-various
   :type 'hook)
 
 ;;; Internal variables.
index 5140c5e..15bab6f 100644 (file)
@@ -653,6 +653,7 @@ time saver for large mailboxes.")
        (set-buffer (setq nnfolder-current-buffer 
                          (nnheader-find-file-noselect file)))
        (buffer-disable-undo (current-buffer))
+       (setq buffer-read-only nil)
        ;; If the file hasn't been touched since the last time we scanned it,
        ;; don't bother doing anything with it.
        (let ((delim (concat "^" message-unix-mail-delimiter))
index 5439463..7e9c400 100644 (file)
@@ -159,6 +159,7 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
 (defvoo nntp-status-string "")
 (defconst nntp-version "nntp 5.0")
 (defvoo nntp-inhibit-erase nil)
+(defvoo nntp-inhibit-output nil)
 
 (defvoo nntp-server-xover 'try)
 (defvoo nntp-server-list-active-group 'try)
@@ -478,7 +479,8 @@ It will prompt for a password."
 
 (defun nntp-send-command (wait-for &rest strings)
   "Send STRINGS to server and wait until WAIT-FOR returns."
-  (unless nnheader-callback-function
+  (when (and (not nnheader-callback-function)
+            (not nntp-inhibit-output))
     (save-excursion
       (set-buffer nntp-server-buffer)
       (erase-buffer)))
@@ -496,7 +498,8 @@ It will prompt for a password."
 
 (defun nntp-send-command-and-decode (wait-for &rest strings)
   "Send STRINGS to server and wait until WAIT-FOR returns."
-  (unless nnheader-callback-function
+  (when (and (not nnheader-callback-function)
+            (not nntp-inhibit-output))
     (save-excursion
       (set-buffer nntp-server-buffer)
       (erase-buffer)))
@@ -507,7 +510,8 @@ It will prompt for a password."
 
 (defun nntp-send-buffer (wait-for)
   "Send the current buffer to server and wait until WAIT-FOR returns."
-  (unless nnheader-callback-function
+  (when (and (not nnheader-callback-function)
+            (not nntp-inhibit-output))
     (save-excursion
       (set-buffer (nntp-find-connection-buffer nntp-server-buffer))
       (erase-buffer)))
@@ -746,15 +750,13 @@ It will prompt for a password."
   (when group
     (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
       (when (not (equal group (caddr entry)))
-       (nntp-request-group group)
        (save-excursion
-         (set-buffer nntp-server-buffer)
-         (if nnheader-callback-function
-             (progn
-               (goto-char (point-max))
-               (forward-line -1)
-               (gnus-delete-line))
-           (erase-buffer)))))))
+         (set-buffer (process-buffer (car entry)))
+         (erase-buffer)
+         (nntp-send-string (car entry) (concat "GROUP " group))
+         (nntp-wait-for-string "^2.*\n")
+         (setcar (cddr entry) group)
+         (erase-buffer))))))
 
 (defun nntp-decode-text (&optional cr-only)
   "Decode the text in the current buffer."
index 6907402..cbc1fc7 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: extensions
-;; Version: 1.02
+;; Version: 1.04
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -51,6 +51,9 @@ into the buffer visible in the event's window."
 
 (defgroup widgets nil
   "Customization support for the Widget Library."
+  :link '(custom-manual "(widget)Top")
+  :link '(url-link :tag "Development Page" 
+                  "http://www.dina.kvl.dk/~abraham/custom/")
   :group 'emacs)
 
 (defface widget-documentation-face '((t ()))
index a9bd612..a10d535 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, extensions, faces, hypermedia
-;; Version: 1.02
+;; Version: 1.04
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
index 8979979..a833c49 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Red Gnus 0.70 Manual
+@settitle Red Gnus 0.71 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 Red Gnus 0.70 Manual
+@title Red Gnus 0.71 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 Red Gnus 0.70
+This manual corresponds to Red Gnus 0.71
 
 @end ifinfo
 
@@ -2994,6 +2994,7 @@ You can have as many summary buffers open as you wish.
 * Saving Articles::             Ways of customizing article saving.
 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
 * Article Treatment::           The article buffer can be mangled at will.
+* Article Commands::            Doing various things with the article buffer.
 * Summary Sorting::             Sorting the summary buffer in various ways.
 * Finding the Parent::          No child support? Get the parent.
 * Alternative Approaches::      Reading using non-default summaries.
@@ -6127,6 +6128,22 @@ This variable can also be a list where the elements may be of the types
 listed above.  
 
 
+@node Article Commands
+@section Article Commands
+
+@table @kbd
+
+@item A P
+@cindex PostScript
+@cindex printing
+@kindex A P (Summary)
+@findex gnus-summary-print-article 
+Generate and print a PostScript image of the article buffer
+(@code{gnus-summary-print-article}).
+
+@end table
+
+
 @node Summary Sorting
 @section Summary Sorting
 @cindex summary sorting