+2002-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-dummy-line-format): Update format to
+ fit with newer standard format.
+ (gnus-summary-make-false-root-always): New variable.
+ (gnus-gather-threads-by-subject): Use it.
+
+ * message.el (message-get-reply-headers): Take an address list
+ optional argument.
+
+2002-12-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.el (gnus-keep-backlog): Change default to 20.
+
+ * gnus-agent.el (gnus-agent-check-overview-buffer): Start from
+ start.
+ (gnus-agent-check-overview-buffer): Remove negative article
+ numbers.
+
+ * nnmail.el (nnmail-split-fancy-with-parent-ignore-groups): Doc fix.
+ (nnmail-cache-ignore-groups): Doc fix.
+
+ * nnimap.el (nnimap-debug): Made into a flag and defcustomed.
+ (nnimap-debug-buffer): New variable.
+ (nnimap-debug): Use it.
+
+2002-12-28 Lars Magne Ingebrigtsen <kgreiner@xpediantsolutions.com>
+
+ * gnus.el (gnus-summary-high-uncached-face): New color scheme.
+
+2002-12-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-agent-check-overview-buffer): Sort lines if
+ they aren't already sorted.
+
+2002-12-28 Jesper Harder <harder@ifa.au.dk>
+
+ * message.el (message-mode-menu): Add ellipses to menu items
+ expecting user interaction.
+ (message-mode-field-menu): do.
+
2002-12-26 Jesper Harder <harder@ifa.au.dk>
* gnus-sum.el (gnus-summary-highlight-line): Don't bind `list' --
;; Hey, John. There's no in all your sentences!
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
+;;
;; Usage
;; -----
;;
;;; User Customizable Variables:
(defgroup gnus-outlook-deuglify nil
- "Deuglify articles generated by broken user agents like MS
-Outlook (Express).")
+ "Deuglify articles generated by broken user agents like MS Outlook (Express).")
;;;###autoload
(defcustom gnus-outlook-deuglify-unwrap-min 45
:group 'gnus-outlook-deuglify)
(defcustom gnus-outlook-deuglify-unwrap-stop-chars nil ;; ".?!" or nil
- "Characters that inhibit unwrapping if they are the last one on the
-cited line above the possible wrapped line."
+ "Characters that inhibit unwrapping if they are the last one on the cited line above the possible wrapped line."
:type 'string
:group 'gnus-outlook-deuglify)
(defcustom gnus-outlook-deuglify-no-wrap-chars "`"
- "Characters that inhibit unwrapping if they are the first one in the
-possibly wrapped line."
+ "Characters that inhibit unwrapping if they are the first one in the possibly wrapped line."
:type 'string
:group 'gnus-outlook-deuglify)
(defcustom gnus-outlook-deuglify-attrib-cut-regexp
"\\(On \\|Am \\)?\\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),[^,]+, "
- "Regular expression matching the beginning of an attribution line
-that should be cut off."
+ "Regular expression matching the beginning of an attribution line that should be cut off."
:type 'string
:group 'gnus-outlook-deuglify)
;; TODO: don't kill MIME parts
;;;###autoload
(defun gnus-outlook-unwrap-lines ()
- "Unwrap lines that appear to be wrapped citation lines. You can
-control what lines will be unwrapped by frobbing
+ "Unwrap lines that appear to be wrapped citation lines.
+You can control what lines will be unwrapped by frobbing
`gnus-outlook-deuglify-unwrap-min' and
`gnus-outlook-deuglify-unwrap-max', indicating the miminum and maximum
length of an unwrapped citation line."
(len3 (- (match-end 3) (match-beginning 3))))
(if (and (> len12 gnus-outlook-deuglify-unwrap-min)
(< (+ len12 len3) gnus-outlook-deuglify-unwrap-max))
- (progn
+ (progn
(replace-match "\\1\\2 \\3")
(goto-char (match-beginning 0))))))))))
;; TODO: respect signatures, don't kill MIME parts
(defun gnus-outlook-rearrange-article (from-where)
- "Put the text from `from-where' to the end of buffer at the top of
-the article buffer."
+ "Put the text from `from-where' to the end of buffer at the top of the article buffer."
(save-excursion
(let ((inhibit-read-only t)
(cite-marks gnus-outlook-deuglify-cite-marks))
(require 'gnus-group))
(eval-and-compile
- (autoload 'gnus-server-update-server "gnus-srvr")
- (autoload 'number-at-point "thingatpt"))
+ (autoload 'gnus-server-update-server "gnus-srvr"))
(defcustom gnus-agent-directory (nnheader-concat gnus-directory "agent/")
"Where the Gnus agent will store its files."
and that there are no duplicates."
(let ((prev-num -1))
(save-excursion
- (when buffer (set-buffer buffer))
- (save-excursion
- (save-restriction
- (let ((deactivate-mark (if (boundp 'deactivate-mark)
- (symbol-value 'deactivate-mark)
- nil)))
- (widen)
- (goto-char (point-min))
-
- (while (< (point) (point-max))
- (let ((p (point))
- (cur (condition-case nil
- (read (current-buffer))
- (error nil))))
- (cond
- ((or (not (integerp cur))
- (not (eq (char-after) ?\t)))
- (gnus-message 1
- "Overview buffer contains garbage '%s'." (buffer-substring p (progn (end-of-line) (point)))))
- ((= cur prev-num)
- (gnus-message 1
- "Duplicate overview line for %d" cur)
- (delete-region (point) (progn (forward-line 1) (point))))
- ((< cur prev-num)
- (gnus-message 1 "Overview buffer not sorted!"))
- (t
- (setq prev-num cur)))
- (forward-line 1)))))))))
+ (when buffer
+ (set-buffer buffer))
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+
+ (while (< (point) (point-max))
+ (let ((p (point))
+ (cur (condition-case nil
+ (read (current-buffer))
+ (error nil))))
+ (cond
+ ((or (not (integerp cur))
+ (not (eq (char-after) ?\t)))
+ (gnus-message 1
+ "Overview buffer contains garbage '%s'."
+ (buffer-substring
+ p (gnus-point-at-eol))))
+ ((= cur prev-num)
+ (gnus-message 1
+ "Duplicate overview line for %d" cur)
+ (delete-region (point) (progn (forward-line 1) (point))))
+ ((< cur 0)
+ (gnus-message 1 "Junk article number %d" cur)
+ (delete-region (point) (progn (forward-line 1) (point))))
+ ((< cur prev-num)
+ (sort-numeric-fields 1 (point-min) (point-max))
+ (goto-char (point-min))
+ (setq prev-num -1)
+ (gnus-message 1 "Overview buffer not sorted!"))
+ (t
+ (setq prev-num cur)))
+ (forward-line 1)))))))
(defun gnus-agent-flush-cache ()
(save-excursion
"^X-Request-PGP:" "^X-Fingerprint:" "^X-WRIEnvto:" "^X-WRIEnvfrom:"
"^X-Virus-Scanned:" "^X-Delivery-Agent:" "^Posted-Date:" "^X-Gateway:"
"^X-Local-Origin:" "^X-Local-Destination:" "^X-UserInfo1:"
- "^X-Received-Date:")
+ "^X-Received-Date:" "^X-Hashcash:")
"*All headers that start with this regexp will be hidden.
This variable can also be a list of regexps of headers to be ignored.
If `gnus-visible-headers' is non-nil, this variable will be ignored."
(const adopt)
(const empty)))
+(defcustom gnus-summary-make-false-root-always t
+ "Always make a false dummy root."
+ :group 'gnus-thread
+ :type 'boolean)
+
(defcustom gnus-summary-gather-exclude-subject "^ *$\\|^(none)$"
"*A regexp to match subjects to be excluded from loose thread gathering.
As loose thread gathering is done on subjects only, that means that
:type 'boolean)
(defcustom gnus-summary-dummy-line-format
- " %(: :%) %S\n"
+ " %(: :%) %S\n"
"*The format specification for the dummy roots in the summary buffer.
It works along the same lines as a normal formatting string,
with some simple extensions.
(setcdr prev (cdr threads))
(setq threads prev))
;; Enter this thread into the hash table.
- (gnus-sethash subject threads hashtb)))
+ (gnus-sethash subject
+ (if gnus-summary-make-false-root-always
+ (progn
+ ;; If you want a dummy root above all
+ ;; threads...
+ (setcar threads (list whole-subject
+ (car threads)))
+ threads)
+ threads)
+ hashtb)))
(setq prev threads)
(setq threads (cdr threads)))
result)))
"Face used for normal interest ancient articles.")
(defface gnus-summary-high-uncached-face
- '((((class color))
- (:bold t :background "Wheat1")))
+ '((((class color)
+ (background light))
+ (:bold t :foreground "cyan4" :bold nil))
+ (((class color) (background dark))
+ (:bold t :foreground "LightGray" :bold nil))
+ (t (:inverse-video t :bold t)))
"Face used for high interest uncached articles.")
(defface gnus-summary-low-uncached-face
- '((((class color))
- (:italic t :background "Wheat1")))
+ '((((class color)
+ (background light))
+ (:italic t :foreground "cyan4" :bold nil))
+ (((class color) (background dark))
+ (:italic t :foreground "LightGray" :bold nil))
+ (t (:inverse-video t :italic t)))
"Face used for low interest uncached articles.")
(defface gnus-summary-normal-uncached-face
- '((((class color))
- (:background "Wheat1")))
+ '((((class color)
+ (background light))
+ (:foreground "cyan4" :bold nil))
+ (((class color) (background dark))
+ (:foreground "LightGray" :bold nil))
+ (t (:inverse-video t)))
"Face used for normal interest uncached articles.")
(defface gnus-summary-high-unread-face
:group 'gnus-meta
:type 'boolean)
-(defcustom gnus-keep-backlog nil
+(defcustom gnus-keep-backlog 20
"*If non-nil, Gnus will keep read articles for later re-retrieval.
If it is a number N, then Gnus will only keep the last N articles
read. If it is neither nil nor a number, Gnus will keep all read
["Insert Region Marked" message-mark-inserted-region
,@(if (featurep 'xemacs) '(t)
'(:help "Mark region with enclosing tags"))]
- ["Insert File Marked" message-mark-insert-file
+ ["Insert File Marked..." message-mark-insert-file
,@(if (featurep 'xemacs) '(t)
'(:help "Insert file at point marked with enclosing tags"))]
"----"
["Postpone Message" message-dont-send
,@(if (featurep 'xemacs) '(t)
'(:help "File this draft message and exit"))]
- ["Send at Specific Time" gnus-delay-article
+ ["Send at Specific Time..." gnus-delay-article
,@(if (featurep 'xemacs) '(t)
'(:help "Ask, then arrange to send message at that time"))]
["Kill Message" message-kill-buffer
["To" message-goto-to t]
["From" message-goto-from t]
["Subject" message-goto-subject t]
- ["Change subject" message-change-subject t]
+ ["Change subject..." message-change-subject t]
["Cc" message-goto-cc t]
["Bcc" message-goto-bcc t]
["Fcc" message-goto-fcc t]
["Newsgroups" message-goto-newsgroups t]
["Followup-To" message-goto-followup-to t]
;; ["Followup-To (with note in body)" message-xpost-fup2 t]
- ["Crosspost / Followup-To" message-xpost-fup2 t]
+ ["Crosspost / Followup-To..." message-xpost-fup2 t]
["Distribution" message-goto-distribution t]
["X-No-Archive:" message-add-archive-header t ]
"----"
(message-setup `((Newsgroups . ,(or newsgroups ""))
(Subject . ,(or subject ""))))))
-(defun message-get-reply-headers (wide &optional to-address)
+(defun message-get-reply-headers (wide &optional to-address address-headers)
(let (follow-to mct never-mct to cc author mft recipients)
;; Find all relevant headers we need.
(let ((mrt (when message-use-mail-reply-to
(cond
((not wide)
(setq recipients (concat ", " author)))
+ (address-headers
+ (dolist (header address-headers)
+ (let ((value (message-fetch-field header)))
+ (when value
+ (setq recipients (concat recipients ", " value))))))
((and mft
(string-match "[^ \t,]" mft)
(or (not (eq message-use-mail-followup-to 'ask))
If this is 'imap-mailbox-lsub, then use a server-side subscription list to
restrict visible folders.")
+(defcustom nnimap-debug nil
+ "If non-nil, random debug spews are placed in *nnimap-debug* buffer."
+ :group 'nnimap
+ :type 'boolean)
+
;; Internal variables:
+(defvar nnimap-debug-buffer "*nnimap-debug*")
(defvar nnimap-mailbox-info (gnus-make-hashtable 997))
-(defvar nnimap-debug nil
- "Name of buffer to record debugging info.
-For example: (setq nnimap-debug \"*nnimap-debug*\")")
(defvar nnimap-current-move-server nil)
(defvar nnimap-current-move-group nil)
(defvar nnimap-current-move-article nil)
(when nnimap-debug
(require 'trace)
- (buffer-disable-undo (get-buffer-create nnimap-debug))
- (mapcar (lambda (f) (trace-function-background f nnimap-debug))
+ (buffer-disable-undo (get-buffer-create nnimap-debug-buffer))
+ (mapcar (lambda (f) (trace-function-background f nnimap-debug-buffer))
'(
nnimap-possibly-change-server
nnimap-verify-uidvalidity
:type 'boolean)
(defcustom nnmail-split-fancy-with-parent-ignore-groups nil
- "Regexp that matches group names to be ignored when applying
-`nnmail-split-fancy-with-parent'. This can also be a list of regexps."
+ "Regexp that matches group names to be ignored when applying `nnmail-split-fancy-with-parent'.
+This can also be a list of regexps."
:group 'nnmail-split
:type '(choice (const :tag "none" nil)
(regexp :value ".*")
(repeat :value (".*") regexp)))
(defcustom nnmail-cache-ignore-groups nil
- "Regexp that matches group names to be ignored when inserting message
-ids into the cache (`nnmail-cache-insert'). This can also be a list
-of regexps."
+ "Regexp that matches group names to be ignored when inserting message ids into the cache (`nnmail-cache-insert').
+This can also be a list of regexps."
:group 'nnmail-split
:type '(choice (const :tag "none" nil)
(regexp :value ".*")
+2002-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Loose Threads): add
+ gnus-summary-make-false-root-always.
+
2002-12-22 Jesper Harder <harder@ifa.au.dk>
* emacs-mime.texi: Fix typos. Index variables. Add
@item \e$B$_$;$+$1\e(B (dummy)
@vindex gnus-summary-dummy-line-format
+@vindex gnus-summary-make-false-root-always
Gnus \e$B$O?F$N$U$j$r$9$k$_$;$+$1$N35N,9T$r$D$/$j$^$9!#$_$;$+$1$N9T$O$I$NK\\e(B
\e$BEv$N5-;v$K$bBP1~$7$^$;$s$N$G!"$=$l$rA*Br$9$k$3$H$O!"$_$;$+$1$N5-;v$N8e$N\e(B
\e$B:G=i$NK\Ev$N5-;v$rA*Br$r$9$k$@$1$K$J$j$^$9!#$_$;$+$1$N:,K\$NMM<0$r;XDj\e(B
\e$B$9$k$?$a$K!"\e(B@code{gnus-summary-dummy-line-format} \e$B$,;H$o$l$^$9!#$3$l$O$?$C\e(B
\e$B$?0l$D$@$1$N%U%)!<%^%C%H$N;EMM$r<u$1IU$1$^$9\e(B: @samp{S} \e$B$G!"$3$l$O5-;v$N\e(B
-\e$BI=Bj$G$9!#\e(B@xref{Formatting Variables}.
+\e$BI=Bj$G$9!#\e(B@xref{Formatting Variables}\e$B!#$?$H$(=8$a$k$b$N$,L5$/$F$b!"$9$Y\e(B
+\e$B$F$N%9%l%C%I$K$_$;$+$1$N:,K\$r;}$?$;$?$$>l9g$O!"\e(B
+@code{gnus-summary-make-false-root-always} \e$B$r\e(B t \e$B$K@_Dj$7$F2<$5$$!#\e(B
@item \e$B6u\e(B (empty)
Gnus \e$B$O<B:]$K$O$I$N5-;v$b?F$K$O$;$:!"C1$K:G=i$N8I;y$r=|$$$F$9$Y$F$N8I;y\e(B
@kindex S x
@kindex M s x
@findex gnus-summary-mark-as-spam
-(@code{gnus-summary-mark-as-spam})
+@code{gnus-summary-mark-as-spam}\e$B!#\e(B
\e$B8=:_$N5-;v$K\e(B spam \e$B$H$7$F0u$rIU$1!"$=$l$r\e(B @samp{H} \e$B0u$GI=<($7$^$9!#\e(B
Spam \e$B5-;v$r8+$?$H$-$O$$$D$G$b!"%0%k!<%W$rH4$1$kA0$KI,$:\e(B @kbd{M-d} \e$B$G$=$N\e(B
@kindex M s t
@kindex S t
@findex spam-bogofilter-score
-(@code{spam-bogofilter-score}
+@code{spam-bogofilter-score}\e$B!#\e(B
\e$B$3$N%3%^%s%I$,$A$c$s$HF/$/$?$a$K$O\e(B bogofilter \e$B$N=hM}$rM-8z$K$7$J$1$l$P$J\e(B
\e$B$j$^$;$s!#\e(B
@item dummy
@vindex gnus-summary-dummy-line-format
+@vindex gnus-summary-make-false-root-always
Gnus will create a dummy summary line that will pretend to be the
parent. This dummy line does not correspond to any real article, so
selecting it will just select the first real article after the dummy
article. @code{gnus-summary-dummy-line-format} is used to specify the
format of the dummy roots. It accepts only one format spec: @samp{S},
which is the subject of the article. @xref{Formatting Variables}.
+If you want all threads to have a dummy root, even the non-gathered
+ones, set @code{gnus-summary-make-false-root-always} to t.
@item empty
Gnus won't actually make any article the parent, but simply leave the
@kindex S x
@kindex M s x
@findex gnus-summary-mark-as-spam
-(@code{gnus-summary-mark-as-spam})
+@code{gnus-summary-mark-as-spam}.
Mark current article as spam, showing it with the @samp{H} mark.
Whenever you see a spam article, make sure to mark its summary line
@kindex M s t
@kindex S t
@findex spam-bogofilter-score
-(@code{spam-bogofilter-score}
+@code{spam-bogofilter-score}.
You must have bogofilter processing enabled for that command to work
properly.