+Tue Nov 19 17:41:17 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * message.el (message-do-fcc): Supply FROM-GNUS param to
+ rmail-output.
+
+ * gnus-msg.el (gnus-setup-message): Use the buffer name instead of
+ the buffer.
+
+ * nnmail.el (nnmail-article-group): Respect `junk' advanced
+ splits.
+
+ * gnus-group.el (gnus-group-restart): Clear system.
+
+ * nnfolder.el (nnfolder-read-folder): Handle zipped files.
+
+ * nnheader.el (nnheader-find-file-noselect): New definition.
+
+ * gnus-art.el (gnus-article-make-menu-bar): Use the menu bar.
+
+ * gnus-score.el (gnus-all-score-files): Would still get the score
+ files in wrong order.
+
+ * gnus-start.el (gnus-find-new-newsgroups): End message on wrong
+ level.
+
+ * gnus-srvr.el (gnus-server-prepare): Don't list servers twice.
+
+ * gnus-xmas.el (gnus-xmas-read-event-char): Mystery hanging bug.
+
+ * gnus-score.el (gnus-all-score-files): Expand all files in the
+ kill files directory.
+
+ * gnus-sum.el (gnus-group-make-articles-read): Register with undo
+ properly.
+ (gnus-update-read-articles): Ditto.
+
+ * gnus-msg.el (gnus-debug): Include gnus-async in variables.
+
+Tue Nov 19 00:07:14 1996 Lars Magne Ingebrigtsen <menja.larsi@ifi.uio.no>
+
+ * gnus.el: Red Gnus v0.64 is released.
+
Mon Nov 18 21:42:40 1996 Loren Schall <schall@saifr00.ateng.az.honeywell.com>
* gnus-sum.el (gnus-summary-insert-line): Pick apart the From
separately:
rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $$i; done
+
+pot:
+ xpot -drgnus -r`cat ./version` *.el > rgnus.pot
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 0.997
+;; Version: 1.00
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
(error "Should be a symbol %S" symbol))
(custom-buffer-create (list (list symbol 'custom-face))))
+;;;###autoload
+(defun customize-customized ()
+ "Customize all already customized user options."
+ (interactive)
+ (let ((found nil))
+ (mapatoms (lambda (symbol)
+ (and (get symbol 'saved-face)
+ (facep symbol)
+ (setq found (cons (list symbol 'custom-face) found)))
+ (and (get symbol 'saved-value)
+ (boundp symbol)
+ (setq found
+ (cons (list symbol 'custom-variable) found)))))
+ (if found
+ (custom-buffer-create found)
+ (error "No customized user options"))))
+
;;;###autoload
(defun customize-apropos (regexp &optional all)
"Customize all user options matching REGEXP.
(when (facep symbol)
(setq found (cons (list symbol 'custom-face) found)))
(when (and (boundp symbol)
- (or (get symbol 'default-value)
+ (or (get symbol 'saved-value)
(get symbol 'factory-value)
(if all
(get symbol 'variable-documentation)
(custom-buffer-create found)
(error "No matches"))))
+;;;###autoload
(defun custom-buffer-create (options)
"Create a buffer containing OPTIONS.
OPTIONS should be an alist of the form ((SYMBOL WIDGET)...), where
(widget-insert "\n"))
(widget-insert "\n")))
options))
+ (mapcar 'custom-magic-reset custom-options)
(widget-create 'push-button
:tag "Apply"
:help-echo "Push me to apply all modifications."
(options (get symbol 'custom-options))
(child-type (or (get symbol 'custom-type) 'sexp))
(type (let ((tmp (if (listp child-type)
- child-type
+ (copy-list child-type)
(list child-type))))
(when options
(widget-put tmp :options options))
"Restore the default value for the variable being edited by WIDGET."
(let ((symbol (widget-value widget)))
(if (get symbol 'saved-value)
- (set symbol (car (get symbol 'saved-value)))
+ (condition-case nil
+ (set symbol (eval (car (get symbol 'saved-value))))
+ (error nil))
(error "No default value for %s" symbol))
(widget-put widget :custom-state 'unknown)
(custom-redraw widget)))
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 0.997
+;; Version: 1.00
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
(autoload 'customize-variable "custom-edit" nil t)
(autoload 'customize-face "custom-edit" nil t)
(autoload 'customize-apropos "custom-edit" nil t)
+(autoload 'customize-customized "custom-edit" nil t)
+(autoload 'custom-buffer-create "custom-edit")
;;; Compatibility.
(cond ((eq keyword :type)
(put symbol 'custom-type value))
((eq keyword :options)
- (put symbol 'custom-options
- (append value (get symbol 'custom-options))))
+ (if (get symbol 'custom-options)
+ ;; Slow safe code to avoid duplicates.
+ (mapcar (lambda (option)
+ (custom-add-option symbol option))
+ value)
+ ;; Fast code for the common case.
+ (put symbol 'custom-options (copy-list value))))
((eq keyword :group)
(custom-add-to-group value symbol 'custom-variable))
(t
- (error "Unknown keyword %s" symbol)))))))
+ (error "Unknown keyword %s" symbol))))))
+ (run-hooks 'custom-define-hook))
;;;###autoload
(defmacro defcustom (symbol value doc &rest args)
(cond ((eq keyword :group)
(custom-add-to-group value face 'custom-face))
(t
- (error "Unknown keyword %s" face)))))))
+ (error "Unknown keyword %s" face))))))
+ (run-hooks 'custom-define-hook))
;;;###autoload
(defmacro defface (face spec doc &rest args)
(cond ((eq keyword :group)
(custom-add-to-group value symbol 'custom-group))
(t
- (error "Unknown keyword %s" symbol)))))))
+ (error "Unknown keyword %s" symbol))))))
+ (run-hooks 'custom-define-hook))
;;;###autoload
(defmacro defgroup (symbol members doc &rest args)
If SYMBOL is a hook variable, OPTION should be a hook member.
For other types variables, the effect is undefined."
- (put symbol 'custom-options (cons option (get symbol 'custom-options))))
+ (let ((options (get symbol 'custom-options)))
+ (unless (member option options)
+ (put symbol 'custom-options (cons option options)))))
;;; Face Utilities.
"Customization of the Customization support."
:group 'emacs)
+(defcustom custom-define-hook nil
+ "Hook called after defining each customize option."
+ :group 'customize
+ :type 'hook)
+
+;;; Menu support
+
+(defcustom custom-menu-nesting 2
+ "Maximum nesting in custom menus."
+ :type 'integer
+ :group 'customize)
+
+(defun custom-menu-create-entry (entry)
+ "Create a easy menu entry for customization option ENTRY.
+
+ENTRY should be list whose first element is a symbol, and second
+element is a widget type used to customize the symbol. The widget
+type `custom-group' is recognized, and will return a submenu
+specification containing the group members.
+
+The maximum nesting in the submenu is specified by `custom-menu-nesting'."
+ (let ((item (vector (symbol-name (nth 0 entry))
+ `(custom-buffer-create (list (quote ,entry)))
+ t)))
+ (if (and (> custom-menu-nesting 0)
+ (eq (nth 1 entry) 'custom-group))
+ (let ((custom-menu-nesting (1- custom-menu-nesting))
+ (symbol (nth 0 entry)))
+ `(,(symbol-name symbol)
+ ,item
+ ,@(mapcar 'custom-menu-create-entry (get symbol 'custom-group))))
+ item)))
+
+(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])
+ "Customize menu")
+
+(defun custom-menu-reset ()
+ "Reset customize menu."
+ (remove-hook 'custom-define-hook 'custom-menu-reset)
+ (if (fboundp 'add-submenu)
+ (add-submenu '("Help") custom-help-menu)
+ (define-key global-map [menu-bar help-menu customize-menu]
+ (cons (car custom-help-menu)
+ (easy-menu-create-keymaps (car custom-help-menu)
+ (cdr custom-help-menu))))))
+
+(defun custom-menu-update ()
+ "Update customize menu."
+ (interactive)
+ (add-hook 'custom-define-hook 'custom-menu-reset)
+ (let ((menu `(,(car custom-help-menu)
+ ,(custom-menu-create-entry '(emacs custom-group))
+ ,@(cdr (cdr custom-help-menu)))))
+ (if (fboundp 'add-submenu)
+ (add-submenu '("Help") menu)
+ (define-key global-map [menu-bar help-menu customize-menu]
+ (cons (car menu) (easy-menu-create-keymaps (car menu) (cdr menu)))))))
+
+(custom-menu-reset)
+
;;; The End.
(provide 'custom)
["Remove carriage return" gnus-article-remove-cr t]
["Remove quoted-unreadable" gnus-article-de-quoted-unreadable t]))
- (define-key gnus-article-mode-map [Article] gnus-summary-article-menu)
+ (define-key rmail-mode-map [menu-bar commands]
+ (cons "Commands" gnus-summary-article-menu))
(run-hooks 'gnus-article-menu-hook)))
(when (gnus-yes-or-no-p
(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)))
(buffer (make-symbol "buffer"))
(article (make-symbol "article")))
`(let ((,winconf (current-window-configuration))
- (,buffer (current-buffer))
+ (,buffer (buffer-name (current-buffer)))
(,article (and gnus-article-reply (gnus-summary-article-number)))
(message-header-setup-hook
(copy-sequence message-header-setup-hook)))
(message-add-action
`(set-window-configuration ,winconf) 'exit 'postpone 'kill)
(message-add-action
- `(when (buffer-name ,buffer)
+ `(when (buffer-name (get-buffer ,buffer))
(save-excursion
- (set-buffer ,buffer)
+ (set-buffer (get-buffer ,buffer))
,(when article
`(gnus-summary-mark-article-as-replied ,article))))
'send))
The source file has to be in the Emacs load path."
(interactive)
(let ((files '("gnus.el" "gnus-sum.el" "gnus-group.el"
- "gnus-art.el" "gnus-start.el"
+ "gnus-art.el" "gnus-start.el" "gnus-async.el"
"gnus-msg.el" "gnus-score.el" "gnus-win.el"
"nnmail.el" "message.el"))
file expr olist sym)
(while funcs
(when (gnus-functionp (car funcs))
(setq score-files
- (nconc score-files (funcall (car funcs) group))))
+ (nconc score-files (nreverse (funcall (car funcs) group)))))
(setq funcs (cdr funcs)))
;; Add any home score files.
(let ((home (gnus-home-score-file group)))
(let ((files score-files))
(while files
(when (stringp (car files))
- (setcar files (expand-file-name (car files))))
+ (setcar files (expand-file-name (car files)
+ gnus-kill-files-directory)))
(pop files)))
(setq score-files (nreverse score-files))
;; Remove any duplicate score files.
;; this session.
(while opened
(unless (member (caar opened) done)
+ (push (caar opened) done)
(gnus-server-insert-server-line
(setq op-ser (format "%s:%s" (caaar opened) (nth 1 (caar opened))))
(caar opened))
(gnus-subscribe-hierarchical-interactive new-newsgroups))
;; Suggested by Per Abrahamsen <amanda@iesd.auc.dk>.
(if (> groups 0)
- (gnus-message 6 "%d new newsgroup%s arrived."
+ (gnus-message 5 "%d new newsgroup%s arrived."
groups (if (> groups 1) "s have" " has"))
- (gnus-message 6 "No new newsgroups.")))))))
+ (gnus-message 5 "No new newsgroups.")))))))
(defun gnus-matches-options-n (group)
;; Returns `subscribe' if the group is to be unconditionally
(setq articles (delq id articles))))))
(gnus-undo-register
`(progn
- (gnus-info-set-marks ,info ',(gnus-info-marks info))
- (gnus-info-set-read ,info ',(gnus-info-read info))
+ (gnus-info-set-marks ',info ',(gnus-info-marks info))
+ (gnus-info-set-read ',info ',(gnus-info-read info))
(gnus-group-update-group group t)))
;; If the read list is nil, we init it.
(and active
(push (cons prev (cdr active)) read))
(gnus-undo-register
`(progn
- (gnus-info-set-marks ,info ',(gnus-info-marks info))
- (gnus-info-set-read ,info ',(gnus-info-read info))
+ (gnus-info-set-marks ',info ',(gnus-info-marks info))
+ (gnus-info-set-read ',info ',(gnus-info-read info))
(gnus-get-unread-articles-in-group ,info (gnus-active ,group))))
;; Enter this list into the group info.
(gnus-info-set-read
(defun gnus-xmas-read-event-char ()
"Get the next event."
(let ((event (next-command-event)))
+ (sit-for 0)
;; We junk all non-key events. Is this naughty?
(while (not (key-press-event-p event))
(setq event (next-command-event)))
"Score and kill file handling."
:group 'gnus )
-(defconst gnus-version-number "0.64"
+(defconst gnus-version-number "0.65"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
(not (eq message-fcc-handler-function 'rmail-output)))
(funcall message-fcc-handler-function file)
(if (and (file-readable-p file) (mail-file-babyl-p file))
- (rmail-output file 1)
+ (rmail-output file 1 nil t)
(let ((mail-use-rfc822 t))
(rmail-output file 1 t t))))))
(kill-buffer (current-buffer)))))
(deffoo nnfolder-request-accept-article (group &optional server last)
(nnfolder-possibly-change-group group server)
(nnmail-check-syntax)
- (when (stringp group)
- (nnfolder-possibly-change-group group))
(let ((buf (current-buffer))
result)
(goto-char (point-min))
;; if we know we've seen it since the last time it was touched.
(let ((scantime (cadr (assoc nnfolder-current-group
nnfolder-scantime-alist)))
- (modtime (nth 5 (or (file-attributes file) '(nil nil nil nil nil)))))
+ (modtime (nth 5 (file-attributes file))))
(if (and scanning scantime
(eq (car scantime) (car modtime))
(eq (cdr scantime) (cadr modtime)))
(nnfolder-possibly-activate-groups nil)
;; Read in the file.
(set-buffer (setq nnfolder-current-buffer
- (nnheader-find-file-noselect file nil 'raw)))
+ (nnheader-find-file-noselect file)))
(buffer-disable-undo (current-buffer))
;; If the file hasn't been touched since the last time we scanned it,
;; don't bother doing anything with it.
(after-insert-file-functions nil))
(insert-file-contents filename visit beg end replace)))
+(defun nnheader-find-file-noselect (&rest args)
+ (let ((format-alist nil)
+ (after-insert-file-functions nil))
+ (apply 'find-file-noselect args)))
+
(defun nnheader-directory-regular-files (dir)
"Return a list of all regular files in DIR."
(let ((files (directory-files dir t))
(fset 'nnheader-run-at-time 'run-at-time)
(fset 'nnheader-cancel-timer 'cancel-timer)
(fset 'nnheader-cancel-function-timers 'cancel-function-timers)
-(fset 'nnheader-find-file-noselect 'find-file-noselect)
(when (string-match "XEmacs\\|Lucid" emacs-version)
(require 'nnheaderxm))
(run-hooks 'nnmail-split-hook)
(if (and (symbolp nnmail-split-methods)
(fboundp nnmail-split-methods))
- ;; `nnmail-split-methods' is a function, so we just call
- ;; this function here and use the result.
- (setq group-art
- (mapcar
- (lambda (group) (cons group (funcall func group)))
+ (let ((split
(condition-case nil
(or (funcall nnmail-split-methods)
'("bogus"))
(message
"Error in `nnmail-split-methods'; using `bogus' mail group")
(sit-for 1)
- '("bogus")))))
+ '("bogus")))))'
+ (unless (equal group-art '(junk))
+ ;; `nnmail-split-methods' is a function, so we just call
+ ;; this function here and use the result.
+ (setq group-art
+ (mapcar
+ (lambda (group) (cons group (funcall func group)))
+ split))))
;; Go through the split methods to find a match.
(while (and methods (or nnmail-crosspost (not group-art)))
(goto-char (point-max))
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
-;; Version: 0.997
+;; Version: 1.00
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
(setq current (car args)
args (cdr args)
found (widget-match-inline current vals)))
- (and found current)))
+ (if found
+ current
+ nil)))
(defun widget-checklist-value-get (widget)
;; The values of all selected items.
(t
(widget-default-format-handler widget escape))))
-;(defun widget-editable-list-format-handler (widget escape)
-; ;; We recognize the insert button.
-; (cond ((eq escape ?i)
-; (insert " ")
-; (backward-char 1)
-; (let* ((from (point))
-; (button (widget-create-child-and-convert
-; widget 'insert-button)))
-; (widget-specify-button button from (point)))
-; (forward-char 1))
-; (t
-; (widget-default-format-handler widget escape))))
-
(defun widget-editable-list-value-create (widget)
;; Insert all values
(let* ((value (widget-get widget :value))
:documentation-property (lambda (symbol)
(condition-case nil
(documentation symbol t)
- (error nil)))
- :value-delete 'widget-children-value-delete
- :match (lambda (widget value) (symbolp value)))
+ (error nil))))
(define-widget 'variable-item 'item
"An immutable variable name."
:format "%v\n%h"
- :documentation-property 'variable-documentation
- :value-delete 'widget-children-value-delete
- :match (lambda (widget value) (symbolp value)))
+ :documentation-property 'variable-documentation)
(define-widget 'string 'editable-field
"A string"
(remove-hook 'post-command-hook 'widget-stop-mouse-tracking)
(setq track-mouse nil))
+(defun widget-at (pos)
+ "The button or field at POS."
+ (or (get-text-property pos 'button)
+ (get-text-property pos 'field)))
+
(defun widget-echo-help (pos)
"Display the help echo for widget at POS."
- (let* ((widget (or (get-text-property pos 'button)
- (get-text-property pos 'field)))
+ (let* ((widget (widget-at pos))
(help-echo (and widget (widget-get widget :help-echo))))
(cond ((stringp help-echo)
(message "%s" help-echo))
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, extensions, faces, hypermedia
-;; Version: 0.997
+;; Version: 1.00
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
+Tue Nov 19 20:54:16 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Scanning New Messages): Addition.
+
Sat Nov 9 06:04:22 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi (Group Parameters): Addition.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Red Gnus 0.64 Manual
+@settitle Red Gnus 0.65 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Red Gnus 0.64 Manual
+@title Red Gnus 0.65 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.64
+This manual corresponds to Red Gnus 0.65
@end ifinfo
@kindex R (Group)
@cindex restarting
@findex gnus-group-restart
-Restart Gnus (@code{gnus-group-restart}).
+Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
+files, closes the connection to all servers, clears up all variables, and
+then starts Gnus all over again.
@end table