*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Wed, 5 Mar 1997 00:57:16 +0000 (00:57 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Wed, 5 Mar 1997 00:57:16 +0000 (00:57 +0000)
13 files changed:
lisp/ChangeLog
lisp/custom-edit.el
lisp/custom.el
lisp/gnus-dup.el
lisp/gnus-group.el
lisp/gnus-sum.el
lisp/gnus-xmas.el
lisp/gnus.el
lisp/message.el
lisp/nnkiboze.el
lisp/widget-edit.el
lisp/widget.el
texi/gnus.texi

index 40147b5..70da79a 100644 (file)
@@ -1,3 +1,29 @@
+Sat Nov 23 23:22:27 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * message.el (message-mode-menu): Added `message-caesar-region'. 
+       (message-mode-field-menu): Added `message-insert-to' and
+       `message-insert-newsgroups'. 
+
+Sat Nov 23 19:53:30 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnkiboze.el: Would destroy all component group infos.
+
+       * gnus-xmas.el (gnus-summary-mail-toolbar): Reversed cathup.
+
+       * gnus-sum.el (gnus-summary-article-unread-p): New function.
+       (gnus-remove-thread-1): Avoid `text-propery-any'.
+       (gnus-summary-insert-subject): Ditto.
+       (gnus-data-compute-positions): Removed.
+
+       * gnus-dup.el (gnus-dup-suppress-articles): Didn't do anything.
+
+       * gnus-group.el (gnus-group-restart): Just start up Gnus
+       properly. 
+
+Sat Nov 23 07:16:39 1996  Lars Magne Ingebrigtsen  <menja.larsi@ifi.uio.no>
+
+       * gnus.el: Red Gnus v0.69 is released.
+
 Sat Nov 23 05:00:36 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus-cache.el (gnus-cache-update-active): Wouldn't mark the
index 2744e61..140b95f 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.00
+;; Version: 1.02
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -528,8 +528,8 @@ The list should be sorted most significant first."
                   (widget-put tmp :options options))
                 tmp))
         (conv (widget-convert type))
-        (value (if (boundp symbol)
-                   (symbol-value symbol)
+        (value (if (default-boundp symbol)
+                   (default-value symbol)
                  (widget-get conv :value))))
     ;; If the widget is new, the child determine whether it is hidden.
     (cond (state)
@@ -555,8 +555,8 @@ The list should be sorted most significant first."
                                (car (get symbol 'saved-value)))
                               ((get symbol 'factory-value)
                                (car (get symbol 'factory-value)))
-                              ((boundp symbol)
-                               (custom-quote (symbol-value symbol)))
+                              ((default-boundp symbol)
+                               (custom-quote (default-value symbol)))
                               (t
                                (custom-quote (widget-get conv :value))))))
             (push (widget-create-child-and-convert widget 'sexp 
@@ -583,7 +583,7 @@ The list should be sorted most significant first."
 (defun custom-variable-state-set (widget)
   "Set the state of WIDGET."
   (let* ((symbol (widget-value widget))
-        (value (symbol-value symbol))
+        (value (default-value symbol))
         (state (if (get symbol 'saved-value)
                    (if (condition-case nil
                            (equal value
index 14d2bfd..bd28947 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.00
+;; Version: 1.02
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -79,7 +79,8 @@ If FRAME is omitted or nil, use the selected frame."
 ;;;###autoload
 (defun custom-declare-variable (symbol value doc &rest args)
   "Like `defcustom', but SYMBOL and VALUE are evaluated as notmal arguments."
-  (unless (default-boundp symbol)
+  (unless (and (default-boundp symbol)
+              (not (get symbol 'saved-value)))
     (set-default symbol (if (get symbol 'saved-value)
                            (eval (car (get symbol 'saved-value)))
                          (eval value))))
@@ -142,7 +143,8 @@ information."
   "Like `defface', but FACE is evaluated as a normal argument."
   (put face 'factory-face spec)
   (when (fboundp 'facep)
-    (unless (facep face)
+    (unless (and (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)))
        (custom-face-display-set face value))))
@@ -291,8 +293,7 @@ For other types variables, the effect is undefined."
   "Set FACE to the attributes to the first matching entry in SPEC.
 Iff optional FRAME is non-nil, set it for that frame only.
 See `defface' for information about SPEC."
-  (when (fboundp 'make-face)
-    (make-face face)
+  (when (fboundp 'copy-face)
     (copy-face 'custom-face-empty face)
     (while spec 
       (let* ((entry (car spec))
@@ -329,12 +330,12 @@ If FRAME is nil, the current FRAME is used."
          (setq display (cdr display))
          (cond ((eq req 'type)
                 (let ((type (if (fboundp 'device-type)
-                                (device-type frame)
+                                (device-type (frame-device frame))
                               window-system)))
                   (setq match (memq type options))))
                ((eq req 'class)
                 (let ((class (if (fboundp 'device-class)
-                                 (device-class frame)
+                                 (device-class (frame-device frame))
                                (frame-property frame 'display-type))))
                   (setq match (memq class options))))
                ((eq req 'background)
@@ -346,7 +347,7 @@ If FRAME is nil, the current FRAME is used."
                 (error "Unknown req `%S' with options `%S'" req options)))))
       match)))
 
-(defvar custom-face-attributes
+(defconst custom-face-attributes
   '((:bold (toggle :format "Bold: %v") custom-set-face-bold)
     (:italic (toggle :format "Italic: %v") custom-set-face-italic)
     (:underline
@@ -364,6 +365,34 @@ The SET function should take three arguments, the face to modify, the
 value of the attribute, and optionally the frame where the face should
 be changed.")
 
+(when (string-match "XEmacs" emacs-version)
+  ;; Support for special XEmacs font attributes.
+  (require 'font)
+
+  (unless (fboundp 'face-font-name)
+    (defun face-font-name (face &rest args)
+      (apply 'face-font face args)))
+
+  (defun set-face-font-size (face size &rest args)
+    "Set the font of FACE to SIZE"
+    (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)))
+
+  (defun 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)))
+
+  (nconc custom-face-attributes
+        '((:family (editable-field :format "Family: %v") 
+                   set-face-font-family)
+          (:size (editable-field :format "Size: %v")
+                 set-face-font-size))))
+
 (defun custom-face-attribites-set (face frame &rest atts)
   "For FACE on FRAME set the attributes [KEYWORD VALUE]....
 Each keyword should be listed in `custom-face-attributes'.
index 2bbde1d..11aaadc 100644 (file)
@@ -132,14 +132,14 @@ seen in the same session."
   (unless gnus-dup-list
     (gnus-dup-open))
   (gnus-message 6 "Suppressing duplicates...")
-  (let ((data gnus-newsgroup-data)
-       number d)
-    (while (setq d (pop data))
-      (when (and (intern-soft (mail-header-id (gnus-data-header d))
-                             gnus-dup-hashtb)
-                (gnus-data-unread-p d))
+  (let ((headers gnus-newsgroup-headers)
+       number header)
+    (while (setq header (pop headers))
+      (when (and (intern-soft (mail-header-id header) gnus-dup-hashtb)
+                (gnus-summary-article-unread-p (mail-header-number header)))
        (setq gnus-newsgroup-unreads 
-             (delq (setq number (gnus-data-number d)) gnus-newsgroup-unreads))
+             (delq (setq number (mail-header-number header))
+                   gnus-newsgroup-unreads))
        (push (cons number gnus-duplicate-mark)
              gnus-newsgroup-reads))))
   (gnus-message 6 "Suppressing duplicates...done"))
index 80d1011..f65450f 100644 (file)
@@ -3171,8 +3171,7 @@ If FORCE, force saving whether it is necessary or not."
         (format "Are you sure you want to restart Gnus? "))
     (gnus-save-newsrc-file)
     (gnus-clear-system)
-    (gnus-setup-news 'force)
-    (gnus-group-list-groups arg)))
+    (gnus)))
 
 (defun gnus-group-read-init-file ()
   "Read the Gnus elisp init file."
index 11a793f..96009d2 100644 (file)
@@ -2125,7 +2125,7 @@ The following commands are available:
        (setcdr list (cdr data))
        (setcdr data ilist)
        (when offset
-         (gnus-data-update-list (cdr data) offset)))
+         (gnus-data-update-list (cdr list) offset)))
       (setq gnus-newsgroup-data-reverse nil))))
 
 (defun gnus-data-remove (article &optional offset)
@@ -2155,17 +2155,6 @@ The following commands are available:
     (setcar (nthcdr 2 (car data)) (+ offset (nth 2 (car data))))
     (setq data (cdr data))))
 
-(defun gnus-data-compute-positions ()
-  "Compute the positions of all articles."
-  (let ((data gnus-newsgroup-data)
-       pos)
-    (while data
-      (when (setq pos (text-property-any
-                      (point-min) (point-max)
-                      'gnus-number (gnus-data-number (car data))))
-       (gnus-data-set-pos (car data) (+ pos 3)))
-      (setq data (cdr data)))))
-
 (defun gnus-summary-article-pseudo-p (article)
   "Say whether this article is a pseudo article or not."
   (not (vectorp (gnus-data-header (gnus-data-find article)))))
@@ -2400,6 +2389,10 @@ This is all marks except unread, ticked, dormant, and expirable."
          (set-buffer gnus-article-buffer)
          (setq gnus-summary-buffer summary))))))
 
+(defun gnus-summary-article-unread-p (article)
+  "Say whether ARTICLE is unread or not."
+  (memq article gnus-newsgroup-unreads))
+
 (defun gnus-summary-first-article-p (&optional article)
   "Return whether ARTICLE is the first article in the buffer."
   (if (not (setq article (or article (gnus-summary-article-number))))
@@ -3052,6 +3045,7 @@ If NO-DISPLAY, don't generate a summary buffer."
 (defun gnus-rebuild-thread (id)
   "Rebuild the thread containing ID."
   (let ((buffer-read-only nil)
+       (old-pos (gnus-point-at-bol))
        current thread data)
     (if (not gnus-show-threads)
        (setq thread (list (car (gnus-id-to-thread id))))
@@ -3086,8 +3080,7 @@ If NO-DISPLAY, don't generate a summary buffer."
        (setq data (nreverse gnus-newsgroup-data))
        (setq threads gnus-newsgroup-threads))
       ;; We splice the new data into the data structure.
-      (gnus-data-enter-list current data)
-      (gnus-data-compute-positions)
+      (gnus-data-enter-list current data (- (point) old-pos))
       (setq gnus-newsgroup-threads (nconc threads gnus-newsgroup-threads)))))
 
 (defun gnus-number-to-header (number)
@@ -3207,16 +3200,19 @@ If NO-DISPLAY, don't generate a summary buffer."
 
 (defun gnus-remove-thread-1 (thread)
   "Remove the thread THREAD recursively."
-  (let ((number (mail-header-number (car thread)))
-       pos)
-    (when (setq pos (text-property-any
-                    (point-min) (point-max) 'gnus-number number))
-      (goto-char pos)
-      (gnus-delete-line)
-      (gnus-data-remove number))
-    (setq thread (cdr thread))
+  (let ((number (mail-header-number (pop thread)))
+       d)
+    (setq thread (reverse thread))
     (while thread
-      (gnus-remove-thread-1 (pop thread)))))
+      (gnus-remove-thread-1 (pop thread)))
+    (when (setq d (gnus-data-find number))
+      (goto-char (gnus-data-pos d))
+      (gnus-data-remove 
+       number
+       (- (gnus-point-at-bol)
+         (prog1
+             (1+ (gnus-point-at-eol))
+           (gnus-delete-line)))))))
 
 (defun gnus-sort-threads (threads)
   "Sort THREADS."
@@ -4404,18 +4400,20 @@ This is meant to be called in `gnus-article-internal-prepare-hook'."
   (let ((header (if (and old-header use-old-header)
                    old-header (gnus-read-header id)))
        (number (and (numberp id) id))
-       pos)
+       pos d)
     (when header
       ;; Rebuild the thread that this article is part of and go to the
       ;; article we have fetched.
       (when (and (not gnus-show-threads)
                 old-header)
-       (when (setq pos (text-property-any
-                        (point-min) (point-max) 'gnus-number 
-                        (mail-header-number old-header)))
-         (goto-char pos)
-         (gnus-delete-line)
-         (gnus-data-remove (mail-header-number old-header))))
+       (when (setq d (gnus-data-find (mail-header-number old-header)))
+         (goto-char (gnus-data-pos d))
+         (gnus-data-remove 
+          number
+          (- (gnus-point-at-bol)
+             (prog1
+                 (1+ (gnus-point-at-eol))
+               (gnus-delete-line))))))
       (when old-header
        (mail-header-set-number header (mail-header-number old-header)))
       (setq gnus-newsgroup-sparse
index c98fe5a..f1f0475 100644 (file)
@@ -641,10 +641,10 @@ If it is non-nil, it must be a toolbar.  The five legal values are
      gnus-summary-save-article-file t "Save article in file"]
     [gnus-summary-save-article
      gnus-summary-save-article t "Save article"]
-    [gnus-summary-catchup-and-exit
-     gnus-summary-catchup-and-exit t "Catchup and exit"]
     [gnus-summary-catchup
      gnus-summary-catchup t "Catchup"]
+    [gnus-summary-catchup-and-exit
+     gnus-summary-catchup-and-exit t "Catchup and exit"]
     [gnus-summary-exit gnus-summary-exit t "Exit this summary"]
     )
   "The summary buffer mail toolbar.")
index b9ba9c6..f25934a 100644 (file)
@@ -42,7 +42,7 @@
   "Score and kill file handling."
   :group 'gnus )
 
-(defconst gnus-version-number "0.69"
+(defconst gnus-version-number "0.70"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
index 570eb91..1e450ea 100644 (file)
@@ -942,6 +942,7 @@ Return the number of headers removed."
    ["Fill Yanked Message" message-fill-yanked-message t]
    ["Insert Signature" message-insert-signature t]
    ["Caesar (rot13) Message" message-caesar-buffer-body t]
+   ["Caesar (rot13) Region" message-caesar-region t]
    ["Rename buffer" message-rename-buffer t]
    ["Spellcheck" ispell-message t]
    "----"
@@ -951,6 +952,9 @@ Return the number of headers removed."
 (easy-menu-define 
  message-mode-field-menu message-mode-map ""
  '("Field"
+   ["Fetch To" message-insert-to t]
+   ["Fetch Newsgroups" message-insert-newsgroups t]
+   "----"
    ["To" message-goto-to t]
    ["Subject" message-goto-subject t]
    ["Cc" message-goto-cc t]
index 58e3612..531f2e4 100644 (file)
@@ -70,7 +70,6 @@
 
 (nnoo-define-basics nnkiboze)
 
-
 (deffoo nnkiboze-retrieve-headers (articles &optional group server fetch-old)
   (nnkiboze-possibly-change-group group)
   (unless gnus-nov-is-evil
          beg end total)
       (save-excursion
        (set-buffer nntp-server-buffer)
+       (erase-buffer)
        (if (not (file-exists-p nov-file))
            (nnheader-report 'nnkiboze "Can't select group %s" group)
          (insert-file-contents nov-file)
@@ -215,7 +215,7 @@ Finds out what articles are to be part of the nnkiboze groups."
         gnus-thread-sort-functions gnus-show-threads 
         gnus-visual
         method nnkiboze-newsrc nov-buffer gname newsrc active
-        ginfo lowest glevel)
+        ginfo lowest glevel orig-info)
     (unless info
       (error "No such group: %s" group))
     ;; Load the kiboze newsrc file for this group.
@@ -256,43 +256,46 @@ Finds out what articles are to be part of the nnkiboze groups."
        ;; Ok, we have a valid component group, so we jump to it. 
        (switch-to-buffer gnus-group-buffer)
        (gnus-group-jump-to-group (caar newsrc))
-       ;; We set all list of article marks to nil.  Since we operate
-       ;; on copies of the real lists, we can destroy anything we
-       ;; want here.
-       (and (setq ginfo (nth 2 (gnus-gethash (gnus-group-group-name)
-                                             gnus-newsrc-hashtb)))
-            (nth 3 ginfo)
-            (setcar (nthcdr 3 ginfo) nil))
-       ;; We set the list of read articles to be what we expect for
-       ;; this kiboze group -- either nil or `(1 . LOWEST)'. 
-       (when ginfo
-         (setcar (nthcdr 2 ginfo)
-                 (and (not (= lowest 1)) (cons 1 lowest))))
-       (if (not (and (or (not ginfo)
-                         (> (length (gnus-list-of-unread-articles 
-                                     (car ginfo)))
-                            0))
-                     (progn
-                       (gnus-group-select-group nil)
-                       (eq major-mode 'gnus-summary-mode))))
-           ()                          ; No unread articles, or we couldn't enter this group.
-         ;; We are now in the group where we want to be.
-         (setq method (gnus-find-method-for-group gnus-newsgroup-name))
-         (when (eq method gnus-select-method)
-           (setq method nil))
-         ;; We go through the list of scored articles.
-         (while gnus-newsgroup-scored
-           (when (> (caar gnus-newsgroup-scored) lowest)
-             ;; If it has a good score, then we enter this article
-             ;; into the kiboze group.
-             (nnkiboze-enter-nov 
-              nov-buffer
-              (gnus-summary-article-header 
-               (caar gnus-newsgroup-scored))
-              gnus-newsgroup-name))
-           (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
-         ;; That's it.  We exit this group.
-         (gnus-summary-exit-no-update)))
+       (setq ginfo (gnus-get-info (gnus-group-group-name))
+             orig-info (gnus-copy-sequence ginfo))
+       (unwind-protect
+           (progn
+             ;; We set all list of article marks to nil.  Since we operate
+             ;; on copies of the real lists, we can destroy anything we
+             ;; want here.
+             (when (nth 3 ginfo)
+               (setcar (nthcdr 3 ginfo) nil))
+             ;; We set the list of read articles to be what we expect for
+             ;; this kiboze group -- either nil or `(1 . LOWEST)'. 
+             (when ginfo
+               (setcar (nthcdr 2 ginfo)
+                       (and (not (= lowest 1)) (cons 1 lowest))))
+             (when (and (or (not ginfo)
+                            (> (length (gnus-list-of-unread-articles 
+                                        (car ginfo)))
+                               0))
+                        (progn
+                          (gnus-group-select-group nil)
+                          (eq major-mode 'gnus-summary-mode)))
+               ;; We are now in the group where we want to be.
+               (setq method (gnus-find-method-for-group gnus-newsgroup-name))
+               (when (eq method gnus-select-method)
+                 (setq method nil))
+               ;; We go through the list of scored articles.
+               (while gnus-newsgroup-scored
+                 (when (> (caar gnus-newsgroup-scored) lowest)
+                   ;; If it has a good score, then we enter this article
+                   ;; into the kiboze group.
+                   (nnkiboze-enter-nov 
+                    nov-buffer
+                    (gnus-summary-article-header 
+                     (caar gnus-newsgroup-scored))
+                    gnus-newsgroup-name))
+                 (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
+               ;; That's it.  We exit this group.
+               (gnus-summary-exit-no-update)))
+         ;; Restore the proper info.
+         (setcdr ginfo (cdr orig-info))))
       (setcdr (car newsrc) (car active))
       (setq newsrc (cdr newsrc)))
     ;; We save the nov file.
@@ -304,8 +307,7 @@ Finds out what articles are to be part of the nnkiboze groups."
       (insert "(setq nnkiboze-newsrc '")
       (gnus-prin1 nnkiboze-newsrc)
       (insert ")\n"))
-    (switch-to-buffer gnus-group-buffer)
-    (gnus-group-list-groups 5 nil)))
+    t))
     
 (defun nnkiboze-enter-nov (buffer header group)
   (save-excursion
index 0d9b942..6907402 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: extensions
-;; Version: 1.00
+;; Version: 1.02
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
 (autoload 'Info-goto-node "info")
 
 ;; The following should go away when bundled with Emacs.
-(condition-case ()
-    (require 'custom)
-  (error nil))
+(eval-and-compile
+  (condition-case ()
+      (require 'custom)
+    (error nil)))
 
 (unless (and (featurep 'custom) (fboundp 'custom-declare-variable))
   ;; We have the old custom-library, hack around it!
@@ -558,6 +559,11 @@ With optional ARG, move across that many fields."
               (message "Error: `widget-after-change' called on two fields"))
              (t
               (let ((size (widget-get field :size)))
+                (and (string-match "XEmacs" emacs-version)
+                     ;; XEmacs cannot handle zero-sized fields.
+                     (or (null size)
+                         (zerop size))
+                     (setq size 1))
                 (if size 
                     (let ((begin (1+ (widget-get field :value-from)))
                           (end (1- (widget-get field :value-to))))
@@ -896,6 +902,11 @@ With optional ARG, move across that many fields."
       (insert value)
       (if (< (length value) size)
          (insert-char ?\  (- size (length value)))))
+    (and (string-match "XEmacs" emacs-version)
+        ;; XEmacs cannot handle zero-sized fields.
+        (or (null size)
+            (zerop size))
+        (insert " "))
     (unless (memq widget widget-field-list)
       (setq widget-field-new (cons widget widget-field-new)))
     (widget-put widget :value-to (copy-marker (point)))
index 0b4ef13..a9bd612 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, extensions, faces, hypermedia
-;; Version: 1.00
+;; Version: 1.02
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
index e0ce368..8979979 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Red Gnus 0.69 Manual
+@settitle Red Gnus 0.70 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.69 Manual
+@title Red Gnus 0.70 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.69
+This manual corresponds to Red Gnus 0.70
 
 @end ifinfo