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