+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
;;
;; 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:
(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)
(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
(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
;;
;; 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:
;;;###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))))
"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))))
"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))
(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)
(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
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'.
(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"))
(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."
(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)
(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)))))
(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))))
(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))))
(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)
(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."
(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
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.")
"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)
["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]
"----"
(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]
(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)
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.
;; 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.
(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
;;
;; 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!
(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))))
(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)))
;;
;; 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:
\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
@tex
@titlepage
-@title Red Gnus 0.69 Manual
+@title Red Gnus 0.70 Manual
@author by Lars Magne Ingebrigtsen
@page
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