+2004-01-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-score.el (gnus-score-find-trace): Add `k' (kill-buffer).
+
+2004-01-07 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * spam.el (spam-split): do not require spam-use-CHECK to be
+ enabled if that check is passed to spam-split explicitly; also
+ fix so 'spam doesn't get converted to spam-split-group when
+ spam-split-symbolic-return is t
+ (spam-find-spam): find registrations of the article and use those
+ instead of re-running spam-split to find the spam/ham
+ classification of the article
+ (spam-log-processing-to-registry, spam-log-registered-p)
+ (spam-log-unregistration-needed-p, spam-log-undo-registration):
+ use gnus-error instead of gnus-message
+ (spam-log-registration-type): new function to determine the
+ classification of a message based on registry entries; will
+ return nil if both 'spam and 'ham are found
+ (spam-check-BBDB): expand all the BBDB macros here so we can have
+ a reasonably fast local cache without the loading errors
+ (spam-cache-lookups): set to t by default
+ (spam-find-spam): don't try to guess spam-cache-lookups
+ (spam-enter-whitelist, spam-enter-blacklist): also clear the
+ spam-caches entry
+ (spam-filelist-build-cache, spam-filelist-check-cache): better
+ caching of whitelist/blacklist entries
+ (spam-check-whitelist, spam-check-blacklist): invoke
+ spam-from-listed-p with a type, not a cache variable
+ (spam-from-listed-p): wrap around spam-filelist-check-cache
+
+2004-01-07 Jesper Harder <harder@ifa.au.dk>
+
+ * message.el (message-cite-prefix-regexp): Use with-syntax-table.
+
+ * nnmail.el (nnmail-split-fancy): do.
+
+ * mml.el (mml-parse): do.
+
+ * gnus-score.el (gnus-enter-score-words-into-hashtb)
+ (gnus-score-adaptive): do.
+
2004-01-07 Katsumi Yamaoka <yamaoka@jpl.org>
* gnus-art.el (gnus-treat-emphasize): Ignore Emacs version number.
(defun gnus-enter-score-words-into-hashtb (hashtb)
;; Find all the words in the buffer and enter them into
;; the hashtable.
- (let ((syntab (syntax-table))
- word val)
+ (let (word val)
(goto-char (point-min))
- (unwind-protect
- (progn
- (set-syntax-table gnus-adaptive-word-syntax-table)
- (while (re-search-forward "\\b\\w+\\b" nil t)
- (setq val
- (gnus-gethash
- (setq word (downcase (buffer-substring
- (match-beginning 0) (match-end 0))))
- hashtb))
- (gnus-sethash
- word
- (append (get-text-property (point-at-eol) 'articles) val)
- hashtb)))
- (set-syntax-table syntab))
+ (with-syntax-table gnus-adaptive-word-syntax-table
+ (while (re-search-forward "\\b\\w+\\b" nil t)
+ (setq val
+ (gnus-gethash
+ (setq word (downcase (buffer-substring
+ (match-beginning 0) (match-end 0))))
+ hashtb))
+ (gnus-sethash
+ word
+ (append (get-text-property (point-at-eol) 'articles) val)
+ hashtb)))
;; Make all the ignorable words ignored.
(let ((ignored (append gnus-ignored-adaptive-words
(if gnus-adaptive-word-no-group-words
(let* ((hashtb (gnus-make-hashtable 1000))
(date (date-to-day (current-time-string)))
(data gnus-newsgroup-data)
- (syntab (syntax-table))
word d score val)
- (unwind-protect
- (progn
- (set-syntax-table gnus-adaptive-word-syntax-table)
- ;; Go through all articles.
- (while (setq d (pop data))
- (when (and
- (not (gnus-data-pseudo-p d))
- (setq score
- (cdr (assq
- (gnus-data-mark d)
- gnus-adaptive-word-score-alist))))
- ;; This article has a mark that should lead to
- ;; adaptive word rules, so we insert the subject
- ;; and find all words in that string.
- (insert (mail-header-subject (gnus-data-header d)))
- (downcase-region (point-min) (point-max))
- (goto-char (point-min))
- (while (re-search-forward "\\b\\w+\\b" nil t)
- ;; Put the word and score into the hashtb.
- (setq val (gnus-gethash (setq word (match-string 0))
- hashtb))
- (when (or (not gnus-adaptive-word-length-limit)
- (> (length word)
- gnus-adaptive-word-length-limit))
- (setq val (+ score (or val 0)))
- (if (and gnus-adaptive-word-minimum
- (< val gnus-adaptive-word-minimum))
- (setq val gnus-adaptive-word-minimum))
- (gnus-sethash word val hashtb)))
- (erase-buffer))))
- (set-syntax-table syntab))
+ (with-syntax-table gnus-adaptive-word-syntax-table
+ ;; Go through all articles.
+ (while (setq d (pop data))
+ (when (and
+ (not (gnus-data-pseudo-p d))
+ (setq score
+ (cdr (assq
+ (gnus-data-mark d)
+ gnus-adaptive-word-score-alist))))
+ ;; This article has a mark that should lead to
+ ;; adaptive word rules, so we insert the subject
+ ;; and find all words in that string.
+ (insert (mail-header-subject (gnus-data-header d)))
+ (downcase-region (point-min) (point-max))
+ (goto-char (point-min))
+ (while (re-search-forward "\\b\\w+\\b" nil t)
+ ;; Put the word and score into the hashtb.
+ (setq val (gnus-gethash (setq word (match-string 0))
+ hashtb))
+ (when (or (not gnus-adaptive-word-length-limit)
+ (> (length word)
+ gnus-adaptive-word-length-limit))
+ (setq val (+ score (or val 0)))
+ (if (and gnus-adaptive-word-minimum
+ (< val gnus-adaptive-word-minimum))
+ (setq val gnus-adaptive-word-minimum))
+ (gnus-sethash word val hashtb)))
+ (erase-buffer))))
;; Make all the ignorable words ignored.
(let ((ignored (append gnus-ignored-adaptive-words
(if gnus-adaptive-word-no-group-words
(interactive)
(bury-buffer nil)
(gnus-summary-expand-window)))
+ (local-set-key "k"
+ (lambda ()
+ (interactive)
+ (kill-buffer (current-buffer))
+ (gnus-summary-expand-window)))
(local-set-key "e" (lambda ()
"Run `gnus-score-edit-file-at-point'."
(interactive)
Type `e' to edit score file corresponding to the score rule on current line,
`f' to format (pretty print) the score file and edit it,
`t' toggle to truncate long lines in this buffer,
-`q' to quit.
+`q' to quit, `k' to kill score trace buffer.
The first sexp on each line is the score rule, followed by the file name of
the score file and its full name, including the directory.")
(if (string-match "[[:digit:]]" "1") ;; support POSIX?
"\\([ \t]*[-_.[:word:]]+>+\\|[ \t]*[]>|}+]\\)+"
;; ?-, ?_ or ?. MUST NOT be in syntax entry w.
- (let ((old-table (syntax-table))
- non-word-constituents)
- (set-syntax-table text-mode-syntax-table)
- (setq non-word-constituents
- (concat
- (if (string-match "\\w" "-") "" "-")
- (if (string-match "\\w" "_") "" "_")
- (if (string-match "\\w" ".") "" ".")))
- (set-syntax-table old-table)
+ (let (non-word-constituents)
+ (with-syntax-table text-mode-syntax-table
+ (setq non-word-constituents
+ (concat
+ (if (string-match "\\w" "-") "" "-")
+ (if (string-match "\\w" "_") "" "_")
+ (if (string-match "\\w" ".") "" "."))))
(if (equal non-word-constituents "")
"\\([ \t]*\\(\\w\\)+>+\\|[ \t]*[]>|}+]\\)+"
(concat "\\([ \t]*\\(\\w\\|["
"Parse the current buffer as an MML document."
(save-excursion
(goto-char (point-min))
- (let ((table (syntax-table)))
- (unwind-protect
- (progn
- (set-syntax-table mml-syntax-table)
- (mml-parse-1))
- (set-syntax-table table)))))
+ (with-syntax-table mml-syntax-table
+ (mml-parse-1))))
(defun mml-parse-1 ()
"Parse the current buffer as an MML document."
(defun nnmail-split-fancy ()
"Fancy splitting method.
See the documentation for the variable `nnmail-split-fancy' for details."
- (let ((syntab (syntax-table)))
- (unwind-protect
- (progn
- (set-syntax-table nnmail-split-fancy-syntax-table)
- (nnmail-split-it nnmail-split-fancy))
- (set-syntax-table syntab))))
+ (with-syntax-table nnmail-split-fancy-syntax-table
+ (nnmail-split-it nnmail-split-fancy)))
(defvar nnmail-split-cache nil)
;; Alist of split expressions their equivalent regexps.
"Msx" gnus-summary-mark-as-spam
"\M-d" gnus-summary-mark-as-spam)
-(defvar spam-cache-lookups nil
+(defvar spam-cache-lookups t
"Whether spam.el will try to cache lookups using spam-caches.")
(defvar spam-caches (make-hash-table
decision)
(while (and list-of-checks (not decision))
(let ((pair (pop list-of-checks)))
- (when (and (symbol-value (car pair))
- (or (null specific-checks)
- (memq (car pair) specific-checks)))
+ (when (or
+ ;; either, given specific checks, this is one of them
+ (and specific-checks (memq (car pair) specific-checks))
+ ;; or, given no specific checks, spam-use-CHECK is set
+ (and (null specific-checks) (symbol-value (car pair))))
(gnus-message 5 "spam-split: calling the %s function"
(symbol-name (cdr pair)))
(setq decision (funcall (cdr pair)))
(setq spam-split-last-successful-check (car pair)))
(when (eq decision 'spam)
- (if spam-split-symbolic-return
- (setq decision spam-split-group)
+ (unless spam-split-symbolic-return
(gnus-error
5
(format "spam-split got %s but %s is nil"
(first-method (nth 0 methods))
(articles (if spam-autodetect-recheck-messages
gnus-newsgroup-articles
- gnus-newsgroup-unseen))
- (spam-cache-lookups (< 2 (length articles))))
+ gnus-newsgroup-unseen)))
(when (and autodetect
(not (equal first-method 'none)))
(lambda (article)
(let ((id (spam-fetch-field-message-id-fast article))
(subject (spam-fetch-field-subject-fast article))
- (sender (spam-fetch-field-from-fast article)))
- (unless (and spam-log-to-registry
- (spam-log-registered-p id 'incoming))
- (let* ((spam-split-symbolic-return t)
- (spam-split-symbolic-return-positive t)
- (split-return
- (with-temp-buffer
- (gnus-request-article-this-buffer
- article
- group)
- (if (or (null first-method)
- (equal first-method 'default))
- (spam-split)
- (apply 'spam-split methods)))))
- (if (equal split-return 'spam)
- (gnus-summary-mark-article article gnus-spam-mark))
-
- (when (and split-return spam-log-to-registry)
- (when (zerop (gnus-registry-group-count id))
- (gnus-registry-add-group
- id group subject sender))
+ (sender (spam-fetch-field-from-fast article))
+ registry-lookup)
+
+ (unless id
+ (gnus-error 5 "Article %d has no message ID!" article))
+
+ (when (and id spam-log-to-registry)
+ (setq registry-lookup (spam-log-registration-type id 'incoming))
+ (when registry-lookup
+ (gnus-message
+ 9
+ "spam-find-spam: message %s was already registered incoming"
+ id)))
+
+ (let* ((spam-split-symbolic-return t)
+ (spam-split-symbolic-return-positive t)
+ (split-return
+ (or registry-lookup
+ (with-temp-buffer
+ (gnus-request-article-this-buffer
+ article
+ group)
+ (if (or (null first-method)
+ (equal first-method 'default))
+ (spam-split)
+ (apply 'spam-split methods))))))
+ (if (equal split-return 'spam)
+ (gnus-summary-mark-article article gnus-spam-mark))
+
+ (when (and id split-return spam-log-to-registry)
+ (when (zerop (gnus-registry-group-count id))
+ (gnus-registry-add-group
+ id group subject sender))
+ (unless registry-lookup
(spam-log-processing-to-registry
id
'incoming
split-return
spam-split-last-successful-check
group))))))
- articles))))
+ articles))))
(defvar spam-registration-functions
;; first the ham register, second the spam register function
type
cell-list))
- (gnus-message 5 (format "%s called with bad ID, type, classification, check, or group"
- "spam-log-processing-to-registry")))))
+ (gnus-error 5 (format "%s called with bad ID, type, classification, check, or group"
+ "spam-log-processing-to-registry")))))
;;; check if a ham- or spam-processor registration has been done
(defun spam-log-registered-p (id type)
(spam-process-type-valid-p type))
(cdr-safe (gnus-registry-fetch-extra id type))
(progn
- (gnus-message 5 (format "%s called with bad ID, type, classification, or check"
- "spam-log-registered-p"))
+ (gnus-error 5 (format "%s called with bad ID, type, classification, or check"
+ "spam-log-registered-p"))
nil))))
+;;; check what a ham- or spam-processor registration says
+;;; returns nil if conflicting registrations are found
+(defun spam-log-registration-type (id type)
+ (let ((count 0)
+ decision)
+ (dolist (reg (spam-log-registered-p id type))
+ (let ((classification (nth 0 reg)))
+ (when (spam-classification-valid-p classification)
+ (when (and decision
+ (not (eq classification decision)))
+ (setq count (+ 1 count)))
+ (setq decision classification))))
+ (if (< 0 count)
+ nil
+ decision)))
+
;;; check if a ham- or spam-processor registration needs to be undone
(defun spam-log-unregistration-needed-p (id type classification check)
(when spam-log-to-registry
(setq found t))))
found)
(progn
- (gnus-message 5 (format "%s called with bad ID, type, classification, or check"
- "spam-log-unregistration-needed-p"))
+ (gnus-error 5 (format "%s called with bad ID, type, classification, or check"
+ "spam-log-unregistration-needed-p"))
nil))))
type
new-cell-list))
(progn
- (gnus-message 5 (format "%s called with bad ID, type, check, or group"
- "spam-log-undo-registration"))
+ (gnus-error 5 (format "%s called with bad ID, type, check, or group"
+ "spam-log-undo-registration"))
nil))))
;;; set up IMAP widening if it's necessary
(spam-split-group (if spam-split-symbolic-return
'spam
spam-split-group))
- bbdb-cache)
+ bbdb-cache bbdb-hashtable)
(when spam-cache-lookups
(setq bbdb-cache (gethash 'spam-use-BBDB spam-caches))
(unless bbdb-cache
- (setq bbdb-cache (bbdb-hashtable))
+ (setq bbdb-cache
+ ;; this is the expanded (bbdb-hashtable) macro
+ ;; without the debugging support
+ (with-current-buffer (bbdb-buffer)
+ (save-excursion
+ (save-window-excursion
+ (bbdb-records nil t)
+ bbdb-hashtable))))
(puthash 'spam-use-BBDB bbdb-cache spam-caches)))
-
(when who
(setq who (nth 1 (gnus-extract-address-components who)))
(if
(if spam-cache-lookups
- (bbdb-gethash who bbdb-cache)
+ (symbol-value
+ (intern-soft who bbdb-cache))
(bbdb-search-simple nil who))
t
(if spam-use-BBDB-exclusive
(file-error (progn
(defalias 'bbdb-search-simple 'ignore)
- (defalias 'bbdb-hashtable 'ignore)
- (defalias 'bbdb-gethash 'ignore)
+ (defalias 'bbdb-records 'ignore)
+ (defalias 'bbdb-buffer 'ignore)
(defalias 'spam-check-BBDB 'ignore)
(defalias 'spam-BBDB-register-routine 'ignore)
(defalias 'spam-enter-ham-BBDB 'ignore)
With a non-nil REMOVE, remove them."
(interactive "sAddress: ")
(spam-enter-list address spam-whitelist remove)
- (setq spam-whitelist-cache nil))
+ (setq spam-whitelist-cache nil)
+ (spam-clear-cache 'spam-use-whitelist))
;;; address can be a list, too
(defun spam-enter-blacklist (address &optional remove)
With a non-nil REMOVE, remove them."
(interactive "sAddress: ")
(spam-enter-list address spam-blacklist remove)
- (setq spam-blacklist-cache nil))
+ (setq spam-blacklist-cache nil)
+ (spam-clear-cache 'spam-use-whitelist))
(defun spam-enter-list (addresses file &optional remove)
"Enter ADDRESSES into the given FILE.
(insert a "\n")))))
(save-buffer))))
+(defun spam-filelist-build-cache (type)
+ (let ((cache (if (eq type 'spam-use-blacklist)
+ spam-blacklist-cache
+ spam-whitelist-cache))
+ parsed-cache)
+ (unless (gethash type spam-caches)
+ (while cache
+ (let ((address (pop cache)))
+ (unless (zerop (length address)) ; 0 for a nil address too
+ (setq address (regexp-quote address))
+ ;; fix regexp-quote's treatment of user-intended regexes
+ (while (string-match "\\\\\\*" address)
+ (setq address (replace-match ".*" t t address))))
+ (push address parsed-cache)))
+ (puthash type parsed-cache spam-caches))))
+
+(defun spam-filelist-check-cache (type from)
+ (when (stringp from)
+ (spam-filelist-build-cache type)
+ (let (found)
+ (dolist (address (gethash type spam-caches))
+ (when (and address (string-match address from))
+ (setq found t)
+ (return)))
+ found)))
+
;;; returns t if the sender is in the whitelist, nil or
;;; spam-split-group otherwise
(defun spam-check-whitelist ()
spam-split-group)))
(unless spam-whitelist-cache
(setq spam-whitelist-cache (spam-parse-list spam-whitelist)))
- (if (spam-from-listed-p spam-whitelist-cache)
+ (if (spam-from-listed-p 'spam-use-whitelist)
t
(if spam-use-whitelist-exclusive
spam-split-group
spam-split-group)))
(unless spam-blacklist-cache
(setq spam-blacklist-cache (spam-parse-list spam-blacklist)))
- (and (spam-from-listed-p spam-blacklist-cache) spam-split-group)))
+ (and (spam-from-listed-p 'spam-use-blacklist) spam-split-group)))
(defun spam-parse-list (file)
(when (file-readable-p file)
(push (or pure-address address) contents)))))
(nreverse contents))))
-(defun spam-from-listed-p (cache)
+(defun spam-from-listed-p (type)
(let ((from (nnmail-fetch-field "from"))
found)
- (while cache
- (let ((address (pop cache)))
- (unless (zerop (length address)) ; 0 for a nil address too
- (setq address (regexp-quote address))
- ;; fix regexp-quote's treatment of user-intended regexes
- (while (string-match "\\\\\\*" address)
- (setq address (replace-match ".*" t t address))))
- (when (and address (string-match address from))
- (setq found t
- cache nil))))
- found))
+ (spam-filelist-check-cache type from)))
(defun spam-filelist-register-routine (articles blacklist &optional unregister)
(let ((de-symbol (if blacklist 'spam-use-whitelist 'spam-use-blacklist))
+2004-01-07 Jesper Harder <harder@ifa.au.dk>
+
+ * dir: Add SASL.
+
+ * sasl.texi: Markup fixes.
+
+ * gnus.texi (Fancy Mail Splitting, SpamAssassin)
+ (Spam ELisp Package Sequence of Events)
+ (Spam ELisp Package Global Variables)
+ (Spam ELisp Package Configuration Examples): do.
+
2004-01-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (Summary Mail Commands): S D e.
* Menu:
* Gnus: (gnus). The news reader Gnus.
+* Gnus: (gnus-ja). The news reader Gnus (Japanese).
* Message: (message). The Message sending thingamabob.
+* Message: (message-ja). The Message sending thingamabob (Japanese).
* Emacs MIME: (emacs-mime). Libraries for handling MIME.
* Sieve: (sieve). Managing Sieve scripts in Emacs.
* PGG: (pgg). Emacs interface to various PGP implementations.
+* SASL: (sasl). The Emacs SASL library.
\e$B$9!#$=$l$,>e5-$NNc$G\e(B @code{save-excursion} \e$B$H\e(B @code{save-restriction} \e$B$N\e(B
\e$B8e$G\e(B @code{(widen)} \e$B$,8F$P$l$kI,MW$,$"$kM}M3$G$9!#$5$i$K\e(B nnimap \e$B%P%C%/%(\e(B
\e$B%s%I$N>l9g!"%G%#%U%)%k%H$G$O5-;v$N%\%G%#$,%@%&%s%m!<%I$5$l$J$$$3$H$KCm0U\e(B
-\e$B$7$F2<$5$$!#$=$l$r$9$k$?$a$K$O\e(B @code{nnimap-split-download-body} \e$B$r\e(B t \e$B$K\e(B
-\e$B@_Dj$9$kI,MW$,$"$j$^$9\e(B (@pxref{Splitting in IMAP})\e$B!#\e(B
+\e$B$7$F2<$5$$!#$=$l$r$9$k$?$a$K\e(B
+\e$B$O\e(B @code{nnimap-split-download-body} \e$B$r\e(B @code{t} \e$B$K@_Dj$9$kI,MW$,$"$j$^\e(B
+\e$B$9\e(B (@pxref{Splitting in IMAP})\e$B!#\e(B
@item (! @var{func} @var{split})
\e$BJ,3d$,%j%9%H$G!":G=i$NMWAG$,\e(B @code{!} \e$B$G$"$k$H\e(B @var{split} \e$B$,<B9T$5$l!"\e(B
\e$B$5$i$K\e(B nnimap \e$B%P%C%/%(%s%I$N>l9g!"%G%#%U%)%k%H$G$O5-;v$N%\%G%#$,%@%&%s%m!<\e(B
\e$B%I$5$l$J$$$3$H$KCm0U$7$F2<$5$$!#$=$l$r$9$k$?$a$K$O!"\e(B
-@code{nnimap-split-download-body} \e$B$r\e(B t \e$B$K@_Dj$9$kI,MW$,$"$j$^\e(B
+@code{nnimap-split-download-body} \e$B$r\e(B @code{t} \e$B$K@_Dj$9$kI,MW$,$"$j$^\e(B
\e$B$9\e(B (@pxref{Splitting in IMAP})\e$B!#\e(B
\e$B0J>e$,$3$l$K4X$9$k$3$H$G$9!#$$$/$D$+$N\e(B spam \e$B$O$I$&$7$F$bAGDL$j$7$F$7$^$&\e(B
\e$B$F\e(B @code{ham-process-destination} \e$B$+\e(B @code{spam-process-destination} \e$B$K\e(B
\e$B0\F0$5$;$i$l$^$9!#\e(B@code{ham-process-destination} \e$B$^$?\e(B
\e$B$O\e(B @code{spam-process-destination} \e$B$N$I$A$i$+$,\e(B (\e$BLuCp\e(B: \e$B0\F0@h$H$7$F\e(B) \e$BE,\e(B
-\e$B@Z$G!"$=$l$i$,\e(B nil \e$B$@$C$?>l9g!"$=$N5-;v$O8=:_$N%0%k!<%W$K;D$5$l$^$9!#\e(B
+\e$B@Z$G!"$=$l$i$,\e(B @code{nil} \e$B$@$C$?>l9g!"$=$N5-;v$O8=:_$N%0%k!<%W$K;D$5$l$^\e(B
+\e$B$9!#\e(B
\e$B$I$l$+$N%0%k!<%W$G\e(B spam \e$B$,8+$D$+$C$?$i\e(B (\e$BHs\e(B-spam \e$B%0%k!<%W$K8B$C\e(B
\e$B$F\e(B @code{spam-move-spam-nonspam-groups-only} \e$B$GJQ992D\e(B)\e$B!"%0%k!<%W$rH4$1$k\e(B
\e$B$rK>$^$J$$$J$i$P!"\e(B@file{gnus-registry.el} \e$B%Q%C%1!<%8$rFI$_9~$_!"\e(B
@code{spam-log-to-registry} \e$BJQ?t$rM-8z$K$7$J$1$l$P$J$j$^$;$s!#$3$N$h$&\e(B
\e$B$K\e(B spam \e$B$O$I$3$G$b8!CN$5$l=hM}$5$l$^$9!#$=$l$O$[$H$s$I$N?M!9$,K>$`$b$N$G\e(B
-\e$B$9!#\e(B@code{spam-process-destination} \e$B$,\e(B nil \e$B$@$C$?>l9g!"\e(Bspam \e$B$K$O4|8B@Z$l\e(B
-\e$B>C5n$N0u$,IU$1$i$l$^$9!#IaDL$=$l$O@5$7$$9T$J$$$G$9!#\e(B
+\e$B$9!#\e(B@code{spam-process-destination} \e$B$,\e(B @code{nil} \e$B$@$C$?>l9g!"\e(Bspam \e$B$K$O\e(B
+\e$B4|8B@Z$l>C5n$N0u$,IU$1$i$l$^$9!#IaDL$=$l$O@5$7$$9T$J$$$G$9!#\e(B
Spam \e$B$,0\F0$G$-$J$$>l9g\e(B (\e$BNc$($P\e(B NNTP \e$B$N$h$&$JFI$_9~$_@lMQ%P%C%/%(%s%I$N\e(B
\e$B$?$a$K\e(B)\e$B!"$=$l$O%3%T!<$5$l$^$9!#\e(B
@vindex spam-mark-only-unseen-as-spam
Spam \e$B%0%k!<%W$K$"$k!"$^$@FI$^$l$?$3$H$,L5$$5-;v$@$1$K\e(B spam \e$B$N0u$rIU$1$?\e(B
\e$B$$>l9g$O!"$3$NJQ?t$r%;%C%H$7$F2<$5$$!#%G%#%U%)%k%H$G$O%;%C%H$5$l$F$$$^$9!#\e(B
-\e$B$3$l$r\e(B nil \e$B$K$9$k$H!"L$FI$N5-;v$K$b\e(B spam \e$B0u$,IU$1$i$l$^$9!#\e(B
+\e$B$3$l$r\e(B @code{nil} \e$B$K$9$k$H!"L$FI$N5-;v$K$b\e(B spam \e$B0u$,IU$1$i$l$^$9!#\e(B
@vindex spam-mark-ham-unread-before-move-from-spam-group
Ham \e$B$,\e(B spam \e$B%0%k!<%W$+$i0\F0$5$l$kA0$K0u$r>C$7$?$$>l9g$O!"$3$NJQ?t$r%;%C\e(B
(spam-process (gnus-group-spam-exit-processor-report-gmane)))
@end lisp
-Additionally, I use `(setq spam-report-gmane-use-article-number nil)'
+Additionally, I use @code{(setq spam-report-gmane-use-article-number nil)}
because I don't read the groups directly from news.gmane.org, but
through my local news server (leafnode). I.e. the article numbers are
not the same as on news.gmane.org, thus @code{spam-report.el} has to check
@code{save-excursion} and @code{save-restriction} in the example
above. Also note that with the nnimap backend, message bodies will
not be downloaded by default. You need to set
-@code{nnimap-split-download-body} to t to do that (@pxref{Splitting in
-IMAP}).
+@code{nnimap-split-download-body} to @code{t} to do that
+(@pxref{Splitting in IMAP}).
@item (! @var{func} @var{split})
If the split is a list, and the first element is @code{!}, then
Note that with the nnimap backend, message bodies will not be
downloaded by default. You need to set
-@code{nnimap-split-download-body} to t to do that (@pxref{Splitting in
-IMAP}).
+@code{nnimap-split-download-body} to @code{t} to do that
+(@pxref{Splitting in IMAP}).
That is about it. As some spam is likely to get through anyway, you
might want to have a nifty function to call when you happen to read
@code{ham-process-destination} or the @code{spam-process-destination}
depending on the article's classification. If the
@code{ham-process-destination} or the @code{spam-process-destination},
-whichever is appropriate, are nil, the article is left in the current
-group.
+whichever is appropriate, are @code{nil}, the article is left in the
+current group.
If a spam is found in any group (this can be changed to only non-spam
groups with @code{spam-move-spam-nonspam-groups-only}), it is
@code{spam-log-to-registry} variable if you want spam to be processed
no more than once. Thus, spam is detected and processed everywhere,
which is what most people want. If the
-@code{spam-process-destination} is nil, the spam is marked as
+@code{spam-process-destination} is @code{nil}, the spam is marked as
expired, which is usually the right thing to do.
If spam can not be moved - because of a read-only backend such as NNTP,
@vindex spam-mark-only-unseen-as-spam
Set this variable if you want only unseen articles in spam groups to
-be marked as spam. By default, it is set. If you set it to nil,
-unread articles will also be marked as spam.
+be marked as spam. By default, it is set. If you set it to
+@code{nil}, unread articles will also be marked as spam.
@vindex spam-mark-ham-unread-before-move-from-spam-group
Set this variable if you want ham to be unmarked before it is moved
(spam-process (gnus-group-spam-exit-processor-report-gmane)))
@end lisp
-Additionally, I use `(setq spam-report-gmane-use-article-number nil)'
+Additionally, I use @code{(setq spam-report-gmane-use-article-number nil)}
because I don't read the groups directly from news.gmane.org, but
through my local news server (leafnode). I.e. the article numbers are
not the same as on news.gmane.org, thus @code{spam-report.el} has to check
@set VERSION 0.2
+@dircategory Emacs
@direntry
* SASL: (sasl). The Emacs SASL library.
@end direntry
@defun sasl-find-mechanism mechanisms
Retrieve an apropriate mechanism.
-This function compares MECHANISMS and @code{sasl-mechanisms} then
+This function compares @var{mechanisms} and @code{sasl-mechanisms} then
returns apropriate @code{sasl-mechanism} object.
@example
@section Steps
A step (@code{sasl-step} object) is an abstraction of authentication
-"step" which holds the response value and the next entry point for the
+``step'' which holds the response value and the next entry point for the
authentication process (the latter is not accessible).
@defun sasl-step-data step
-Return the data which STEP holds, a string.
+Return the data which @var{step} holds, a string.
@end defun
@defun sasl-step-set-data step data
-Store DATA string to STEP.
+Store @var{data} string to @var{step}.
@end defun
To get the initial response, you should call the function
-@code{sasl-next-step} with the second argument nil.
+@code{sasl-next-step} with the second argument @code{nil}.
@example
(setq name (sasl-mechanism-name mechanism))
@defun sasl-next-step client step
Perform the authentication step.
-At the first time STEP should be set to nil.
+At the first time @var{step} should be set to @code{nil}.
@end defun
@node Backend drivers