*** pub/qgnus/lisp/gnus-int.el Mon Jun 1 04:30:20 1998 --- qgnus/lisp/gnus-int.el Sat Jul 11 03:05:48 1998 *************** *** 150,158 **** ;; Maybe complain if there is no function. (unless (fboundp func) (require (car method)) ! (when (and (not (fboundp func)) ! (not noerror)) ! (error "No such function: %s" func))) func)) --- 150,159 ---- ;; Maybe complain if there is no function. (unless (fboundp func) (require (car method)) ! (when (not (fboundp func)) ! (if noerror ! (setq func nil) ! (error "No such function: %s" func)))) func)) *** pub/qgnus/lisp/gnus-msg.el Sun Jun 28 09:56:45 1998 --- qgnus/lisp/gnus-msg.el Sat Jul 11 03:05:48 1998 *************** *** 97,102 **** --- 97,113 ---- (defvar gnus-bug-create-help-buffer t "*Should we create the *Gnus Help Bug* buffer?") + (defvar gnus-posting-styles nil + "*Alist of styles to use when posting.") + + (defvar gnus-posting-style-alist + '((organization . message-user-organization) + (signature . message-signature) + (signature-file . message-signature-file) + (address . user-mail-address) + (name . user-full-name)) + "*Mapping from style parameters to variables.") + ;;; Internal variables. (defvar gnus-message-buffer "*Mail Gnus*") *************** *** 177,182 **** --- 188,194 ---- (copy-sequence message-header-setup-hook))) (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc) + (add-hook 'message-mode-hook 'gnus-configure-posting-styles) (unwind-protect (progn ,@forms) *************** *** 1046,1051 **** --- 1058,1125 ---- (when groups (insert " "))) (insert "\n"))))))) + + ;;; Posting styles. + + (defun gnus-configure-posting-styles () + "Configure posting styles according to `gnus-posting-styles'." + (let ((styles gnus-posting-styles) + (gnus-newsgroup-name (or gnus-newsgroup-name "")) + style match variable attribute value value-value) + ;; Go through all styles and look for matches. + (while styles + (setq style (pop styles) + match (pop style)) + (when (cond ((stringp match) + ;; Regexp string match on the group name. + (string-match match gnus-newsgroup-name)) + ((or (symbolp match) + (gnus-functionp match)) + (cond ((gnus-functionp match) + ;; Function to be called. + (funcall match)) + ((boundp match) + ;; Variable to be checked. + (symbol-value match)))) + ((listp match) + ;; This is a form to be evaled. + (eval match))) + ;; We have a match, so we set the variables. + (while style + (setq attribute (pop style) + value (cadr attribute) + variable nil) + ;; We find the variable that is to be modified. + (if (and (not (stringp (car attribute))) + (not (setq variable (cdr (assq (car attribute) + gnus-posting-style-alist))))) + (message "Couldn't find attribute %s" (car attribute)) + ;; We get the value. + (setq value-value + (cond ((stringp value) + value) + ((or (symbolp value) + (gnus-functionp value)) + (cond ((gnus-functionp value) + (funcall value)) + ((boundp value) + (symbol-value value)))) + ((listp value) + (eval value)))) + (if variable + (progn + ;; This is an ordinary variable. + (make-local-variable variable) + (set variable value-value)) + ;; This is a header to be added to the headers when + ;; posting. + (when value-value + (make-local-variable message-required-mail-headers) + (make-local-variable message-required-news-headers) + (push (cons (car attribute) value-value) + message-required-mail-headers) + (push (cons (car attribute) value-value) + message-required-news-headers))))))))) ;;; Allow redefinition of functions. *** pub/qgnus/lisp/gnus-range.el Mon Jun 1 04:30:22 1998 --- qgnus/lisp/gnus-range.el Sat Jul 11 03:05:49 1998 *************** *** 55,61 **** list1)) (defun gnus-sorted-complement (list1 list2) ! "Return a list of elements of LIST1 that do not appear in LIST2. Both lists have to be sorted over <." (let (out) (if (or (null list1) (null list2)) --- 55,61 ---- list1)) (defun gnus-sorted-complement (list1 list2) ! "Return a list of elements that are in LIST1 or LIST2 but not both. Both lists have to be sorted over <." (let (out) (if (or (null list1) (null list2)) *** pub/qgnus/lisp/gnus-salt.el Mon Jun 29 22:51:20 1998 --- qgnus/lisp/gnus-salt.el Sat Jul 11 03:05:49 1998 *************** *** 73,93 **** (gnus-define-keys gnus-pick-mode-map " " gnus-pick-next-page ! "u" gnus-summary-unmark-as-processable ! "." gnus-pick-article gnus-down-mouse-2 gnus-pick-mouse-pick-region "\r" gnus-pick-start-reading - "t" gnus-uu-mark-thread - "T" gnus-uu-unmark-thread - "U" gnus-summary-unmark-all-processable - "v" gnus-uu-mark-over - "r" gnus-uu-mark-region - "R" gnus-uu-unmark-region - "e" gnus-uu-mark-by-regexp - "E" gnus-uu-mark-by-regexp - "b" gnus-uu-mark-buffer - "B" gnus-uu-unmark-buffer - "X" gnus-pick-start-reading )) (defun gnus-pick-make-menu-bar () --- 73,82 ---- (gnus-define-keys gnus-pick-mode-map " " gnus-pick-next-page ! "u" gnus-pick-unmark-article-or-thread ! "." gnus-pick-article-or-thread gnus-down-mouse-2 gnus-pick-mouse-pick-region "\r" gnus-pick-start-reading )) (defun gnus-pick-make-menu-bar () *************** *** 172,192 **** (gnus-summary-next-group))) (error "No articles have been picked")))) (defun gnus-pick-article (&optional arg) ! "Pick the article on the current line. If ARG, pick the article on that line instead." (interactive "P") (when arg ! (let (pos) ! (save-excursion ! (goto-char (point-min)) ! (when (zerop (forward-line (1- (prefix-numeric-value arg)))) ! (setq pos (point)))) ! (if (not pos) ! (gnus-error 2 "No such line: %s" arg) ! (goto-char pos)))) (gnus-summary-mark-as-processable 1)) (defun gnus-pick-mouse-pick (e) (interactive "e") (mouse-set-point e) --- 161,208 ---- (gnus-summary-next-group))) (error "No articles have been picked")))) + (defun gnus-pick-goto-article (arg) + "Go to the article number indicated by ARG. If ARG is an invalid + article number, then stay on current line." + (let (pos) + (save-excursion + (goto-char (point-min)) + (when (zerop (forward-line (1- (prefix-numeric-value arg)))) + (setq pos (point)))) + (if (not pos) + (gnus-error 2 "No such line: %s" arg) + (goto-char pos)))) + (defun gnus-pick-article (&optional arg) ! "Pick the article on the current line. If ARG, pick the article on that line instead." (interactive "P") (when arg ! (gnus-pick-goto-article arg)) (gnus-summary-mark-as-processable 1)) + (defun gnus-pick-article-or-thread (&optional arg) + "If gnus-thread-hide-subtree is t, then pick the thread on the current line. + Otherwise pick the article on the current line. + If ARG, pick the article/thread on that line instead." + (interactive "P") + (when arg + (gnus-pick-goto-article arg)) + (if gnus-thread-hide-subtree + (gnus-uu-mark-thread) + (gnus-summary-mark-as-processable 1))) + + (defun gnus-pick-unmark-article-or-thread (&optional arg) + "If gnus-thread-hide-subtree is t, then unmark the thread on current line. + Otherwise unmark the article on current line. + If ARG, unmark thread/article on that line instead." + (interactive "P") + (when arg + (gnus-pick-goto-article arg)) + (if gnus-thread-hide-subtree + (gnus-uu-unmark-thread) + (gnus-summary-unmark-as-processable 1))) + (defun gnus-pick-mouse-pick (e) (interactive "e") (mouse-set-point e) *** pub/qgnus/lisp/gnus-sum.el Wed Jul 1 13:34:42 1998 --- qgnus/lisp/gnus-sum.el Sat Jul 11 03:05:50 1998 *************** *** 1425,1430 **** --- 1425,1431 ---- "c" gnus-summary-copy-article "B" gnus-summary-crosspost-article "q" gnus-summary-respool-query + "t" gnus-summary-respool-trace "i" gnus-summary-import-article "p" gnus-summary-article-posted-p) *************** *** 1547,1552 **** --- 1548,1554 ---- (gnus-check-backend-function 'request-expire-articles gnus-newsgroup-name)] ["Query respool" gnus-summary-respool-query t] + ["Trace respool" gnus-summary-respool-trace t] ["Delete expirable articles" gnus-summary-expire-articles-now (gnus-check-backend-function 'request-expire-articles gnus-newsgroup-name)]) *************** *** 2974,2980 **** (when (gnus-dependencies-add-header (make-full-mail-header gnus-reffed-article-number ! (nth 3 relation) "" (nth 4 relation) (nth 1 relation) (or (nth 2 relation) "") 0 0 "") gnus-newsgroup-dependencies nil) --- 2976,2982 ---- (when (gnus-dependencies-add-header (make-full-mail-header gnus-reffed-article-number ! (nth 3 relation) "" (or (nth 4 relation) "") (nth 1 relation) (or (nth 2 relation) "") 0 0 "") gnus-newsgroup-dependencies nil) *************** *** 4653,4658 **** --- 4655,4673 ---- ;; Just return the current article. (list (gnus-summary-article-number)))))) + (defmacro gnus-summary-iterate (arg &rest forms) + "Iterate over the process/prefixed articles and do FORMS. + ARG is the interactive prefix given to the command. FORMS will be + executed with point over the summary line of the articles." + (let ((articles (make-symbol "gnus-summary-iterate-articles"))) + `(let ((,articles (gnus-summary-work-articles ,arg))) + (while ,articles + (gnus-summary-goto-subject (car ,articles)) + ,@forms)))) + + (put 'gnus-summary-iterate 'lisp-indent-function 1) + (put 'gnus-summary-iterate 'edebug-form-spec '(form body)) + (defun gnus-summary-save-process-mark () "Push the current set of process marked articles on the stack." (interactive) *************** *** 6037,6044 **** (sort gnus-newsgroup-limit '<))) article) (setq gnus-newsgroup-unreads ! (delete-duplicates (append gnus-newsgroup-unreads ! gnus-newsgroup-limit))) (if all (setq gnus-newsgroup-dormant nil gnus-newsgroup-marked nil --- 6052,6058 ---- (sort gnus-newsgroup-limit '<))) article) (setq gnus-newsgroup-unreads ! (gnus-intersection gnus-newsgroup-unreads gnus-newsgroup-limit)) (if all (setq gnus-newsgroup-dormant nil gnus-newsgroup-marked nil *************** *** 7347,7353 **** ;;; Respooling ! (defun gnus-summary-respool-query (&optional silent) "Query where the respool algorithm would put this article." (interactive) (let (gnus-mark-article-hook) --- 7361,7367 ---- ;;; Respooling ! (defun gnus-summary-respool-query (&optional silent trace) "Query where the respool algorithm would put this article." (interactive) (let (gnus-mark-article-hook) *************** *** 7356,7368 **** (set-buffer gnus-original-article-buffer) (save-restriction (message-narrow-to-head) ! (let ((groups (nnmail-article-group 'identity))) (unless silent (if groups (message "This message would go to %s" (mapconcat 'car groups ", ")) (message "This message would go to no groups")) groups)))))) ;; Summary marking commands. --- 7370,7388 ---- (set-buffer gnus-original-article-buffer) (save-restriction (message-narrow-to-head) ! (let ((groups (nnmail-article-group 'identity trace))) (unless silent (if groups (message "This message would go to %s" (mapconcat 'car groups ", ")) (message "This message would go to no groups")) groups)))))) + + (defun gnus-summary-respool-trace () + "Trace where the respool algorithm would put this article. + Display a buffer showing all fancy splitting patterns which matched." + (interactive) + (gnus-summary-respool-query nil t)) ;; Summary marking commands. *** pub/qgnus/lisp/gnus-topic.el Mon Jun 29 22:51:21 1998 --- qgnus/lisp/gnus-topic.el Sat Jul 11 03:05:50 1998 *************** *** 904,909 **** --- 904,911 ---- "Gp" gnus-topic-edit-parameters "#" gnus-topic-mark-topic "\M-#" gnus-topic-unmark-topic + [tab] gnus-topic-indent + [M-tab] gnus-topic-unindent gnus-mouse-2 gnus-mouse-pick-topic) ;; Define a new submap. *** pub/qgnus/lisp/gnus-util.el Wed Jul 1 13:34:43 1998 --- qgnus/lisp/gnus-util.el Sat Jul 11 03:05:50 1998 *************** *** 580,585 **** --- 580,586 ---- Bind `print-quoted' and `print-readably' to t while printing." (let ((print-quoted t) (print-readably t) + (print-escape-multibyte nil) print-level print-length) (prin1 form (current-buffer)))) *************** *** 875,924 **** "password" "account" "macdef" "force")) alist elem result pair) (nnheader-set-temp-buffer " *netrc*") ! (set-syntax-table gnus-netrc-syntax-table) ! (insert-file-contents file) ! (goto-char (point-min)) ! ;; Go through the file, line by line. ! (while (not (eobp)) ! (narrow-to-region (point) (gnus-point-at-eol)) ! ;; For each line, get the tokens and values. ! (while (not (eobp)) ! (skip-chars-forward "\t ") ! (unless (eobp) ! (setq elem (buffer-substring ! (point) (progn (forward-sexp 1) (point)))) ! (cond ! ((equal elem "macdef") ! ;; We skip past the macro definition. (widen) ! (while (and (zerop (forward-line 1)) ! (looking-at "$"))) ! (narrow-to-region (point) (point))) ! ((member elem tokens) ! ;; Tokens that don't have a following value are ignored. ! (when (and pair (cdr pair)) ! (push pair alist)) ! (setq pair (list elem))) ! (t ! ;; Values that haven't got a preceding token are ignored. ! (when pair ! (setcdr pair elem) ! (push pair alist) ! (setq pair nil)))))) ! (push alist result) ! (setq alist nil ! pair nil) ! (widen) ! (forward-line 1)) ! result)))) (defun gnus-netrc-machine (list machine) ! "Return the netrc values from LIST for MACHINE." ! (while (and list ! (not (equal (cdr (assoc "machine" (car list))) machine))) ! (pop list)) ! (when list ! (car list))) (defun gnus-netrc-get (alist type) "Return the value of token TYPE from ALIST." --- 876,934 ---- "password" "account" "macdef" "force")) alist elem result pair) (nnheader-set-temp-buffer " *netrc*") ! (unwind-protect ! (progn ! (set-syntax-table gnus-netrc-syntax-table) ! (insert-file-contents file) ! (goto-char (point-min)) ! ;; Go through the file, line by line. ! (while (not (eobp)) ! (narrow-to-region (point) (gnus-point-at-eol)) ! ;; For each line, get the tokens and values. ! (while (not (eobp)) ! (skip-chars-forward "\t ") ! (unless (eobp) ! (setq elem (buffer-substring ! (point) (progn (forward-sexp 1) (point)))) ! (cond ! ((equal elem "macdef") ! ;; We skip past the macro definition. ! (widen) ! (while (and (zerop (forward-line 1)) ! (looking-at "$"))) ! (narrow-to-region (point) (point))) ! ((member elem tokens) ! ;; Tokens that don't have a following value are ignored, ! ;; except "default". ! (when (and pair (or (cdr pair) ! (equal (car pair) "default"))) ! (push pair alist)) ! (setq pair (list elem))) ! (t ! ;; Values that haven't got a preceding token are ignored. ! (when pair ! (setcdr pair elem) ! (push pair alist) ! (setq pair nil)))))) ! (if alist ! (push (nreverse alist) result)) ! (setq alist nil ! pair nil) (widen) ! (forward-line 1)) ! (nreverse result)) ! (kill-buffer " *netrc*")))))) (defun gnus-netrc-machine (list machine) ! "Return the netrc values from LIST for MACHINE or for the default entry." ! (let ((rest list)) ! (while (and list ! (not (equal (cdr (assoc "machine" (car list))) machine))) ! (pop list)) ! (car (or list ! (progn (while (and rest (not (assoc "default" (car rest)))) ! (pop rest)) ! rest))))) (defun gnus-netrc-get (alist type) "Return the value of token TYPE from ALIST." *** pub/qgnus/lisp/gnus-win.el Mon Jun 1 04:30:34 1998 --- qgnus/lisp/gnus-win.el Sat Jul 11 03:05:50 1998 *************** *** 154,159 **** --- 154,163 ---- (vertical 1.0 (summary 0.5 point) ("*Score Words*" 1.0))) + (split-trace + (vertical 1.0 + (summary 0.5 point) + ("*Split Trace*" 1.0))) (category (vertical 1.0 (category 1.0))) *************** *** 185,190 **** --- 189,195 ---- (picons . gnus-picons-buffer-name) (tree . gnus-tree-buffer) (score-trace . "*Score Trace*") + (split-trace . "*Split Trace*") (info . gnus-info-buffer) (category . gnus-category-buffer) (article-copy . gnus-article-copy) *** pub/qgnus/lisp/gnus.el Wed Jul 1 13:34:43 1998 --- qgnus/lisp/gnus.el Sat Jul 11 03:05:51 1998 *************** *** 250,256 **** :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "5.6.23" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number) --- 250,256 ---- :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "5.6.24" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number) *************** *** 1623,1630 **** gnus-uu-decode-binhex gnus-uu-decode-uu-view gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view ! gnus-uu-decode-binhex-view) ! ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh) ("gnus-msg" (gnus-summary-send-map keymap) gnus-article-mail gnus-copy-article-buffer gnus-extended-version) ("gnus-msg" :interactive t --- 1623,1631 ---- gnus-uu-decode-binhex gnus-uu-decode-uu-view gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view ! gnus-uu-decode-binhex-view gnus-uu-unmark-thread) ! ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh ! gnus-uu-unmark-thread) ("gnus-msg" (gnus-summary-send-map keymap) gnus-article-mail gnus-copy-article-buffer gnus-extended-version) ("gnus-msg" :interactive t *** pub/qgnus/lisp/message.el Sat Jun 27 08:56:33 1998 --- qgnus/lisp/message.el Sat Jul 11 03:05:51 1998 *************** *** 464,479 **** :type 'integer) ;;;###autoload ! (defcustom message-cite-function ! (if (and (boundp 'mail-citation-hook) ! mail-citation-hook) ! mail-citation-hook ! 'message-cite-original) "*Function for citing an original message. ! Pre-defined functions include `message-cite-original' and ! `message-cite-original-without-signature'." :type '(radio (function-item message-cite-original) - (function-item message-cite-original-without-signature) (function-item sc-cite-original) (function :tag "Other")) :group 'message-insertion) --- 464,475 ---- :type 'integer) ;;;###autoload ! (defcustom message-cite-function 'message-cite-original "*Function for citing an original message. ! Predefined functions include `message-cite-original' and ! `message-cite-original-without-signature'. ! Note that `message-cite-original' uses `mail-citation-hook' if that is non-nil." :type '(radio (function-item message-cite-original) (function-item sc-cite-original) (function :tag "Other")) :group 'message-insertion) *************** *** 1744,1762 **** (defun message-cite-original () "Cite function in the standard Message manner." ! (let ((start (point)) ! (functions ! (when message-indent-citation-function ! (if (listp message-indent-citation-function) ! message-indent-citation-function ! (list message-indent-citation-function))))) ! (goto-char start) ! (while functions ! (funcall (pop functions))) ! (when message-citation-line-function ! (unless (bolp) ! (insert "\n")) ! (funcall message-citation-line-function)))) (defun message-insert-citation-line () "Function that inserts a simple citation line." --- 1740,1761 ---- (defun message-cite-original () "Cite function in the standard Message manner." ! (if (and (boundp 'mail-citation-hook) ! mail-citation-hook) ! (run-hooks 'mail-citation-hook) ! (let ((start (point)) ! (functions ! (when message-indent-citation-function ! (if (listp message-indent-citation-function) ! message-indent-citation-function ! (list message-indent-citation-function))))) ! (goto-char start) ! (while functions ! (funcall (pop functions))) ! (when message-citation-line-function ! (unless (bolp) ! (insert "\n")) ! (funcall message-citation-line-function))))) (defun message-insert-citation-line () "Function that inserts a simple citation line." *************** *** 3059,3065 **** (defun message-pop-to-buffer (name) "Pop to buffer NAME, and warn if it already exists and is modified." ! (let ((buffer (get-buffer name))) (if (and buffer (buffer-name buffer)) (progn --- 3058,3065 ---- (defun message-pop-to-buffer (name) "Pop to buffer NAME, and warn if it already exists and is modified." ! (let ((buffer (get-buffer name)) ! (cur (current-buffer))) (if (and buffer (buffer-name buffer)) (progn *************** *** 3068,3076 **** (not (y-or-n-p "Message already being composed; erase? "))) (error "Message being composed"))) ! (set-buffer (pop-to-buffer name)))) ! (erase-buffer) ! (message-mode)) (defun message-do-send-housekeeping () "Kill old message buffers." --- 3068,3076 ---- (not (y-or-n-p "Message already being composed; erase? "))) (error "Message being composed"))) ! (set-buffer (pop-to-buffer name))) ! (erase-buffer) ! (message-mode))) (defun message-do-send-housekeeping () "Kill old message buffers." *** pub/qgnus/lisp/nnmail.el Wed Jul 1 13:34:43 1998 --- qgnus/lisp/nnmail.el Sat Jul 11 03:05:52 1998 *************** *** 468,473 **** --- 468,476 ---- (defvar nnmail-internal-password nil) + (defvar nnmail-split-tracing nil) + (defvar nnmail-split-trace nil) + (defconst nnmail-version "nnmail 1.0" *************** *** 1043,1049 **** (funcall exit-func)) (kill-buffer (current-buffer))))) ! (defun nnmail-article-group (func) "Look at the headers and return an alist of groups that match. FUNC will be called with the group name to determine the article number." (let ((methods nnmail-split-methods) --- 1046,1052 ---- (funcall exit-func)) (kill-buffer (current-buffer))))) ! (defun nnmail-article-group (func &optional trace) "Look at the headers and return an alist of groups that match. FUNC will be called with the group name to determine the article number." (let ((methods nnmail-split-methods) *************** *** 1082,1087 **** --- 1085,1092 ---- ;; Allow washing. (goto-char (point-min)) (run-hooks 'nnmail-split-hook) + (when (setq nnmail-split-tracing trace) + (setq nnmail-split-trace nil)) (if (and (symbolp nnmail-split-methods) (fboundp nnmail-split-methods)) (let ((split *************** *** 1141,1146 **** --- 1146,1163 ---- (setq group-art (list (cons (car method) (funcall func (car method))))))))) + ;; Produce a trace if non-empty. + (when (and trace nnmail-split-trace) + (let ((trace (nreverse nnmail-split-trace)) + (restore (current-buffer))) + (nnheader-set-temp-buffer "*Split Trace*") + (gnus-add-current-to-buffer-list) + (while trace + (insert (car trace) "\n") + (setq trace (cdr trace))) + (goto-char (point-min)) + (gnus-configure-windows 'split-trace) + (set-buffer restore))) ;; See whether the split methods returned `junk'. (if (equal group-art '(junk)) nil *************** *** 1237,1317 **** (defun nnmail-split-it (split) ;; Return a list of groups matching SPLIT. ! (cond ! ;; nil split ! ((null split) ! nil) ! ! ;; A group name. Do the \& and \N subs into the string. ! ((stringp split) ! (list (nnmail-expand-newtext split))) ! ! ;; Junk the message. ! ((eq split 'junk) ! (list 'junk)) ! ! ;; Builtin & operation. ! ((eq (car split) '&) ! (apply 'nconc (mapcar 'nnmail-split-it (cdr split)))) ! ! ;; Builtin | operation. ! ((eq (car split) '|) ! (let (done) ! (while (and (not done) (cdr split)) ! (setq split (cdr split) ! done (nnmail-split-it (car split)))) ! done)) ! ! ;; Builtin : operation. ! ((eq (car split) ':) ! (nnmail-split-it (save-excursion (eval (cdr split))))) ! ! ;; Check the cache for the regexp for this split. ! ;; FIX FIX FIX could avoid calling assq twice here ! ((assq split nnmail-split-cache) ! (goto-char (point-max)) ! ;; FIX FIX FIX problem with re-search-backward is that if you have ! ;; a split: (from "foo-\\(bar\\|baz\\)@gnus.org "mail.foo.\\1") ! ;; and someone mails a message with 'To: foo-bar@gnus.org' and ! ;; 'CC: foo-baz@gnus.org', we'll pick 'mail.foo.baz' as the group ! ;; if the cc line is a later header, even though the other choice ! ;; is probably better. Also, this routine won't do a crosspost ! ;; when there are two different matches. ! ;; I guess you could just make this more determined, and it could ! ;; look for still more matches prior to this one, and recurse ! ;; on each of the multiple matches hit. Of course, then you'd ! ;; want to make sure that nnmail-article-group or nnmail-split-fancy ! ;; removed duplicates, since there might be more of those. ! ;; I guess we could also remove duplicates in the & split case, since ! ;; that's the only thing that can introduce them. ! (when (re-search-backward (cdr (assq split nnmail-split-cache)) nil t) ! ;; Someone might want to do a \N sub on this match, so get the ! ;; correct match positions. ! (goto-char (match-end 0)) ! (let ((value (nth 1 split))) ! (re-search-backward (if (symbolp value) ! (cdr (assq value nnmail-split-abbrev-alist)) ! value) ! (match-end 1))) ! (nnmail-split-it (nth 2 split)))) ! ! ;; Not in cache, compute a regexp for the field/value pair. ! (t ! (let* ((field (nth 0 split)) ! (value (nth 1 split)) ! (regexp (concat "^\\(\\(" ! (if (symbolp field) ! (cdr (assq field nnmail-split-abbrev-alist)) ! field) ! "\\):.*\\)\\<\\(" ! (if (symbolp value) ! (cdr (assq value nnmail-split-abbrev-alist)) ! value) ! "\\)\\>"))) ! (push (cons split regexp) nnmail-split-cache) ! ;; Now that it's in the cache, just call nnmail-split-it again ! ;; on the same split, which will find it immediately in the cache. ! (nnmail-split-it split))))) (defun nnmail-expand-newtext (newtext) (let ((len (length newtext)) --- 1254,1340 ---- (defun nnmail-split-it (split) ;; Return a list of groups matching SPLIT. ! (let (cached-pair) ! (cond ! ;; nil split ! ((null split) ! nil) ! ! ;; A group name. Do the \& and \N subs into the string. ! ((stringp split) ! (when nnmail-split-tracing ! (push (format "\"%s\"" split) nnmail-split-trace)) ! (list (nnmail-expand-newtext split))) ! ! ;; Junk the message. ! ((eq split 'junk) ! (when nnmail-split-tracing ! (push "junk" nnmail-split-trace)) ! (list 'junk)) ! ! ;; Builtin & operation. ! ((eq (car split) '&) ! (apply 'nconc (mapcar 'nnmail-split-it (cdr split)))) ! ! ;; Builtin | operation. ! ((eq (car split) '|) ! (let (done) ! (while (and (not done) (cdr split)) ! (setq split (cdr split) ! done (nnmail-split-it (car split)))) ! done)) ! ! ;; Builtin : operation. ! ((eq (car split) ':) ! (nnmail-split-it (save-excursion (eval (cdr split))))) ! ! ;; Check the cache for the regexp for this split. ! ((setq cached-pair (assq split nnmail-split-cache)) ! (goto-char (point-max)) ! ;; FIX FIX FIX problem with re-search-backward is that if you have ! ;; a split: (from "foo-\\(bar\\|baz\\)@gnus.org "mail.foo.\\1") ! ;; and someone mails a message with 'To: foo-bar@gnus.org' and ! ;; 'CC: foo-baz@gnus.org', we'll pick 'mail.foo.baz' as the group ! ;; if the cc line is a later header, even though the other choice ! ;; is probably better. Also, this routine won't do a crosspost ! ;; when there are two different matches. ! ;; I guess you could just make this more determined, and it could ! ;; look for still more matches prior to this one, and recurse ! ;; on each of the multiple matches hit. Of course, then you'd ! ;; want to make sure that nnmail-article-group or nnmail-split-fancy ! ;; removed duplicates, since there might be more of those. ! ;; I guess we could also remove duplicates in the & split case, since ! ;; that's the only thing that can introduce them. ! (when (re-search-backward (cdr cached-pair) nil t) ! (when nnmail-split-tracing ! (push (cdr cached-pair) nnmail-split-trace)) ! ;; Someone might want to do a \N sub on this match, so get the ! ;; correct match positions. ! (goto-char (match-end 0)) ! (let ((value (nth 1 split))) ! (re-search-backward (if (symbolp value) ! (cdr (assq value nnmail-split-abbrev-alist)) ! value) ! (match-end 1))) ! (nnmail-split-it (nth 2 split)))) ! ! ;; Not in cache, compute a regexp for the field/value pair. ! (t ! (let* ((field (nth 0 split)) ! (value (nth 1 split)) ! (regexp (concat "^\\(\\(" ! (if (symbolp field) ! (cdr (assq field nnmail-split-abbrev-alist)) ! field) ! "\\):.*\\)\\<\\(" ! (if (symbolp value) ! (cdr (assq value nnmail-split-abbrev-alist)) ! value) ! "\\)\\>"))) ! (push (cons split regexp) nnmail-split-cache) ! ;; Now that it's in the cache, just call nnmail-split-it again ! ;; on the same split, which will find it immediately in the cache. ! (nnmail-split-it split)))))) (defun nnmail-expand-newtext (newtext) (let ((len (length newtext)) *** pub/qgnus/lisp/nntp.el Wed Jul 1 13:34:44 1998 --- qgnus/lisp/nntp.el Sat Jul 11 03:05:52 1998 *************** *** 45,57 **** (defvoo nntp-server-opened-hook '(nntp-send-mode-reader) "*Hook used for sending commands to the server at startup. The default value is `nntp-send-mode-reader', which makes an innd ! server spawn an nnrpd server. Another useful function to put in this ! hook might be `nntp-send-authinfo', which will prompt for a password ! to allow posting from the server. Note that this is only necessary to ! do on servers that use strict access control.") (defvoo nntp-authinfo-function 'nntp-send-authinfo ! "Function used to send AUTHINFO to the server.") (defvoo nntp-server-action-alist '(("nntpd 1\\.5\\.11t" --- 45,55 ---- (defvoo nntp-server-opened-hook '(nntp-send-mode-reader) "*Hook used for sending commands to the server at startup. The default value is `nntp-send-mode-reader', which makes an innd ! server spawn an nnrpd server.") (defvoo nntp-authinfo-function 'nntp-send-authinfo ! "Function used to send AUTHINFO to the server. ! It is called with no parameters.") (defvoo nntp-server-action-alist '(("nntpd 1\\.5\\.11t" *************** *** 749,755 **** "Send the AUTHINFO to the nntp server. It will look in the \"~/.authinfo\" file for matching entries. If nothing suitable is found there, it will prompt for a user name ! and a password." (let* ((list (gnus-parse-netrc nntp-authinfo-file)) (alist (gnus-netrc-machine list nntp-address)) (force (gnus-netrc-get alist "force")) --- 747,756 ---- "Send the AUTHINFO to the nntp server. It will look in the \"~/.authinfo\" file for matching entries. If nothing suitable is found there, it will prompt for a user name ! and a password. ! ! If SEND-IF-FORCE, only send authinfo to the server if the ! .authinfo file has the FORCE token." (let* ((list (gnus-parse-netrc nntp-authinfo-file)) (alist (gnus-netrc-machine list nntp-address)) (force (gnus-netrc-get alist "force")) *** pub/qgnus/lisp/ChangeLog Wed Jul 1 13:34:41 1998 --- qgnus/lisp/ChangeLog Sat Jul 11 03:05:48 1998 *************** *** 1,3 **** --- 1,66 ---- + Sat Jul 11 03:03:53 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.24 is released. + + Fri Jul 10 04:23:24 1998 Hallvard B. Furuseth + + * gnus-util.el (gnus-parse-netrc): Allow "default" values. + + Fri Jul 10 04:15:35 1998 Lars Magne Ingebrigtsen + + * nntp.el (nntp-server-opened-hook): Doc change. + + Fri Jul 10 03:03:48 1998 François Pinard + + * gnus-sum.el (gnus-summary-respool-trace): New command and + keystroke. + + Fri Jul 10 02:18:01 1998 Lars Magne Ingebrigtsen + + * gnus-util.el (gnus-prin1): Bind print-escape-multibyte to nil. + + Mon Jul 6 01:02:59 1998 Simon Josefsson + + * gnus-range.el (gnus-sorted-complement): Fix comments. + + Thu Jul 2 11:16:14 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-iterate): New macro. + + * message.el (message-pop-to-buffer): Clone locals. + + * gnus-msg.el (gnus-posting-styles): Reinstated. + (gnus-posting-style-alist): Ditto. + + Wed Jul 1 18:02:31 1998 Lars Magne Ingebrigtsen + + * gnus-int.el (gnus-get-function): Set funct to nil. + + 1998-07-01 16:57:38 Simon Josefsson + + * gnus-int.el (gnus-get-function): returned non-nil when + function wasn't bound, if noerror=t + + Wed Jul 1 17:30:41 1998 Lars Magne Ingebrigtsen + + * gnus-topic.el (gnus-topic-mode-map): Bind TAB and M-TAB. + + * gnus-sum.el (gnus-build-sparse-threads): Make sure no dates are + nil. + (gnus-summary-limit-mark-excluded-as-read): Use the intersection. + + * gnus-msg.el (gnus-setup-message): Clone all local variables from + the summary buffer. + + Wed Jul 1 14:03:52 1998 Richard Stallman + + * message.el (message-cite-original): Use mail-citation-hook. + (message-cite-function): Ditto. + + Wed Jul 1 14:00:53 1998 Rajappa Iyer + + * gnus-salt.el (gnus-pick-mode-map): Changed keymap. + Wed Jul 1 13:33:26 1998 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.6.23 is released. *** pub/qgnus/texi/gnus.texi Wed Jul 1 13:34:46 1998 --- qgnus/texi/gnus.texi Sat Jul 11 03:05:53 1998 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Gnus 5.6.23 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Gnus 5.6.24 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 316,322 **** @tex @titlepage ! @title Gnus 5.6.23 Manual @author by Lars Magne Ingebrigtsen @page --- 316,322 ---- @tex @titlepage ! @title Gnus 5.6.24 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 352,358 **** spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Gnus 5.6.23. @end ifinfo --- 352,358 ---- spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Gnus 5.6.24. @end ifinfo *************** *** 2703,2714 **** --- 2703,2722 ---- prefix, group on that level (and lower) will be displayed. @item T TAB + @itemx TAB @kindex T TAB (Topic) + @kindex TAB (Topic) @findex gnus-topic-indent ``Indent'' the current topic so that it becomes a sub-topic of the previous topic (@code{gnus-topic-indent}). If given a prefix, ``un-indent'' the topic instead. + @item M-TAB + @kindex M-TAB (Topic) + @findex gnus-topic-unindent + ``Un-indent'' the current topic so that it becomes a sub-topic of the + parent of its current parent (@code{gnus-topic-unindent}). + @item C-k @kindex C-k (Topic) @findex gnus-topic-kill-group *************** *** 6867,6876 **** @table @kbd @item . @kindex . (Pick) ! @findex gnus-summary-mark-as-processable ! Pick the article on the current line ! (@code{gnus-summary-mark-as-processable}). If given a numerical prefix, ! go to that article and pick it. (The line number is normally displayed at the beginning of the summary pick lines.) @item SPACE --- 6875,6887 ---- @table @kbd @item . @kindex . (Pick) ! @findex gnus-pick-article-or-thread ! Pick the article or thread on the current line ! (@code{gnus-pick-article-or-thread}). If the variable ! @code{gnus-thread-hide-subtree} is true, then this key selects the ! entire thread when used at the first article of the thread. Otherwise, ! it selects just the article. If given a numerical prefix, go to that ! thread or article and pick it. (The line number is normally displayed at the beginning of the summary pick lines.) @item SPACE *************** *** 6881,6933 **** @item u @kindex u (Pick) ! @findex gnus-summary-unmark-as-processable ! Unpick the article (@code{gnus-summary-unmark-as-processable}). ! ! @item U ! @kindex U (Pick) ! @findex gnus-summary-unmark-all-processable ! Unpick all articles (@code{gnus-summary-unmark-all-processable}). ! ! @item t ! @kindex t (Pick) ! @findex gnus-uu-mark-thread ! Pick the thread (@code{gnus-uu-mark-thread}). ! ! @item T ! @kindex T (Pick) ! @findex gnus-uu-unmark-thread ! Unpick the thread (@code{gnus-uu-unmark-thread}). ! ! @item r ! @kindex r (Pick) ! @findex gnus-uu-mark-region ! Pick the region (@code{gnus-uu-mark-region}). ! ! @item R ! @kindex R (Pick) ! @findex gnus-uu-unmark-region ! Unpick the region (@code{gnus-uu-unmark-region}). ! ! @item e ! @kindex e (Pick) ! @findex gnus-uu-mark-by-regexp ! Pick articles that match a regexp (@code{gnus-uu-mark-by-regexp}). ! ! @item E ! @kindex E (Pick) ! @findex gnus-uu-unmark-by-regexp ! Unpick articles that match a regexp (@code{gnus-uu-unmark-by-regexp}). ! ! @item b ! @kindex b (Pick) ! @findex gnus-uu-mark-buffer ! Pick the buffer (@code{gnus-uu-mark-buffer}). ! ! @item B ! @kindex B (Pick) ! @findex gnus-uu-unmark-buffer ! Unpick the buffer (@code{gnus-uu-unmark-buffer}). @item RET @kindex RET (Pick) --- 6892,6904 ---- @item u @kindex u (Pick) ! @findex gnus-pick-unmark-article-or-thread. ! Unpick the thread or article ! (@code{gnus-pick-unmark-article-or-thread}). If the variable ! @code{gnus-thread-hide-subtree} is true, then this key unpicks the ! thread if used at the first article of the thread. Otherwise it unpicks ! just the article. You can give this key a numerical prefix to unpick ! the thread or article at that line. @item RET @kindex RET (Pick) *************** *** 6940,6945 **** --- 6911,6921 ---- @end table + All the normal summary mode commands are still available in the + pick-mode, with the exception of @kbd{u}. However @kbd{!} is available + which is mapped to the same function + @code{gnus-summary-tick-article-forward}. + If this sounds like a good idea to you, you could say: @lisp *************** *** 7214,7219 **** --- 7190,7201 ---- the article will end up in before you do the re-spooling. This command will tell you (@code{gnus-summary-respool-query}). + @item B t + @kindex B t (Summary) + @findex gnus-summary-respool-trace + Similarly, this command will display all fancy splitting patterns used + when repooling, if any (@code{gnus-summary-respool-trace}). + @item B p @kindex B p (Summary) @findex gnus-summary-article-posted-p *************** *** 8042,8047 **** --- 8024,8030 ---- * Posting Server:: What server should you post via? * Mail and Post:: Mailing and posting at the same time. * Archived Messages:: Where Gnus stores the messages you've sent. + * Posting Styles:: An easier way to specify who you are. * Drafts:: Postponing messages and rejected messages. * Rejected Articles:: What happens if the server doesn't like your article? @end menu *************** *** 8297,8379 **** @end table ! @c @node Posting Styles ! @c @section Posting Styles ! @c @cindex posting styles ! @c @cindex styles ! @c ! @c All them variables, they make my head swim. ! @c ! @c So what if you want a different @code{Organization} and signature based ! @c on what groups you post to? And you post both from your home machine ! @c and your work machine, and you want different @code{From} lines, and so ! @c on? ! @c ! @c @vindex gnus-posting-styles ! @c One way to do stuff like that is to write clever hooks that change the ! @c variables you need to have changed. That's a bit boring, so somebody ! @c came up with the bright idea of letting the user specify these things in ! @c a handy alist. Here's an example of a @code{gnus-posting-styles} ! @c variable: ! @c ! @c @lisp ! @c ((".*" ! @c (signature . "Peace and happiness") ! @c (organization . "What me?")) ! @c ("^comp" ! @c (signature . "Death to everybody")) ! @c ("comp.emacs.i-love-it" ! @c (organization . "Emacs is it"))) ! @c @end lisp ! @c ! @c As you might surmise from this example, this alist consists of several ! @c @dfn{styles}. Each style will be applicable if the first element ! @c ``matches'', in some form or other. The entire alist will be iterated ! @c over, from the beginning towards the end, and each match will be ! @c applied, which means that attributes in later styles that match override ! @c the same attributes in earlier matching styles. So ! @c @samp{comp.programming.literate} will have the @samp{Death to everybody} ! @c signature and the @samp{What me?} @code{Organization} header. ! @c ! @c The first element in each style is called the @code{match}. If it's a ! @c string, then Gnus will try to regexp match it against the group name. ! @c If it's a function symbol, that function will be called with no ! @c arguments. If it's a variable symbol, then the variable will be ! @c referenced. If it's a list, then that list will be @code{eval}ed. In ! @c any case, if this returns a non-@code{nil} value, then the style is said ! @c to @dfn{match}. ! @c ! @c Each style may contain a arbitrary amount of @dfn{attributes}. Each ! @c attribute consists of a @var{(name . value)} pair. The attribute name ! @c can be one of @code{signature}, @code{organization} or @code{from}. The ! @c attribute name can also be a string. In that case, this will be used as ! @c a header name, and the value will be inserted in the headers of the ! @c article. ! @c ! @c The attribute value can be a string (used verbatim), a function (the ! @c return value will be used), a variable (its value will be used) or a ! @c list (it will be @code{eval}ed and the return value will be used). ! @c ! @c So here's a new example: ! @c ! @c @lisp ! @c (setq gnus-posting-styles ! @c '((".*" ! @c (signature . "~/.signature") ! @c (from . "user@@foo (user)") ! @c ("X-Home-Page" . (getenv "WWW_HOME")) ! @c (organization . "People's Front Against MWM")) ! @c ("^rec.humor" ! @c (signature . my-funny-signature-randomizer)) ! @c ((equal (system-name) "gnarly") ! @c (signature . my-quote-randomizer)) ! @c (posting-from-work-p ! @c (signature . "~/.work-signature") ! @c (from . "user@@bar.foo (user)") ! @c (organization . "Important Work, Inc")) ! @c ("^nn.+:" ! @c (signature . "~/.mail-signature")))) ! @c @end lisp @node Drafts @section Drafts --- 8280,8362 ---- @end table ! @node Posting Styles ! @section Posting Styles ! @cindex posting styles ! @cindex styles ! ! All them variables, they make my head swim. ! ! So what if you want a different @code{Organization} and signature based ! on what groups you post to? And you post both from your home machine ! and your work machine, and you want different @code{From} lines, and so ! on? ! ! @vindex gnus-posting-styles ! One way to do stuff like that is to write clever hooks that change the ! variables you need to have changed. That's a bit boring, so somebody ! came up with the bright idea of letting the user specify these things in ! a handy alist. Here's an example of a @code{gnus-posting-styles} ! variable: ! ! @lisp ! ((".*" ! (signature "Peace and happiness") ! (organization "What me?")) ! ("^comp" ! (signature "Death to everybody")) ! ("comp.emacs.i-love-it" ! (organization "Emacs is it"))) ! @end lisp ! ! As you might surmise from this example, this alist consists of several ! @dfn{styles}. Each style will be applicable if the first element ! ``matches'', in some form or other. The entire alist will be iterated ! over, from the beginning towards the end, and each match will be ! applied, which means that attributes in later styles that match override ! the same attributes in earlier matching styles. So ! @samp{comp.programming.literate} will have the @samp{Death to everybody} ! signature and the @samp{What me?} @code{Organization} header. ! ! The first element in each style is called the @code{match}. If it's a ! string, then Gnus will try to regexp match it against the group name. ! If it's a function symbol, that function will be called with no ! arguments. If it's a variable symbol, then the variable will be ! referenced. If it's a list, then that list will be @code{eval}ed. In ! any case, if this returns a non-@code{nil} value, then the style is said ! to @dfn{match}. ! ! Each style may contain a arbitrary amount of @dfn{attributes}. Each ! attribute consists of a @var{(name . value)} pair. The attribute name ! can be one of @code{signature}, @code{signature-file}, ! @code{organization}, @code{address} or @code{name}. The attribute name ! can also be a string. In that case, this will be used as a header name, ! and the value will be inserted in the headers of the article. ! ! The attribute value can be a string (used verbatim), a function (the ! return value will be used), a variable (its value will be used) or a ! list (it will be @code{eval}ed and the return value will be used). ! ! So here's a new example: ! ! @lisp ! (setq gnus-posting-styles ! '((".*" ! (signature-file "~/.signature") ! (name "User Name") ! ("X-Home-Page" (getenv "WWW_HOME")) ! (organization "People's Front Against MWM")) ! ("^rec.humor" ! (signature my-funny-signature-randomizer)) ! ((equal (system-name) "gnarly") ! (signature my-quote-randomizer)) ! (posting-from-work-p ! (signature-file "~/.work-signature") ! (address "user@@bar.foo") ! (organization "Important Work, Inc")) ! ("^nn.+:" ! (signature-file "~/.mail-signature")))) ! @end lisp @node Drafts @section Drafts *************** *** 8946,8955 **** @item Each line may contain an arbitrary number of token/value pairs. The ! valid tokens include @samp{machine}, @samp{login}, @samp{password}, and ! @samp{force}. (The latter is not a valid @file{.netrc}/@code{ftp} ! token, which is the only way the @file{.authinfo} file format deviates ! from the @file{.netrc} file format.) @end enumerate --- 8929,8939 ---- @item Each line may contain an arbitrary number of token/value pairs. The ! valid tokens include @samp{machine}, @samp{login}, @samp{password}, ! @samp{default} and @samp{force}. (The latter is not a valid ! @file{.netrc}/@code{ftp} token, which is the only way the ! @file{.authinfo} file format deviates from the @file{.netrc} file ! format.) @end enumerate *************** *** 8971,8976 **** --- 8955,8970 ---- @samp{force} tag) is to not send authinfo to the @var{nntp} server until the @var{nntp} server asks for it. + You can also add @samp{default} lines that will apply to all servers + that don't have matching @samp{machine} lines. + + @example + default force yes + @end example + + This will force sending @samp{AUTHINFO} commands to all servers not + previously mentioned. + Remember to not leave the @file{~/.authinfo} file world-readable. @item nntp-server-action-alist *************** *** 15380,15386 **** releases)) was released under the name ``Gnus 5.2'' (40 releases). On July 28th 1996 work on Red Gnus was begun, and it was released on ! January 25th 1997 (after 84 releases) as ``Gnus 5.4''. If you happen upon a version of Gnus that has a prefixed name -- ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' -- --- 15374,15383 ---- releases)) was released under the name ``Gnus 5.2'' (40 releases). On July 28th 1996 work on Red Gnus was begun, and it was released on ! January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases). ! ! On September 13th 1997, Quassia Gnus was started and lasted 37 ! releases. If was released as ``Gnus 5.6.24' on March 8th 1998. If you happen upon a version of Gnus that has a prefixed name -- ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' -- *************** *** 15701,15706 **** --- 15698,15704 ---- Zlatko Calusic, Massimo Campostrini, Castor, + David Charlap, Dan Christensen, Kevin Christian, Michael R. Cook, *************** *** 15856,15862 **** * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. * September Gnus:: The Thing Formally Known As Gnus 5.3/5.3. * Red Gnus:: Third time best---Gnus 5.4/5.5. ! * Quassia Gnus:: Two times two is four, or Gnus 5.6.23. @end menu These lists are, of course, just @emph{short} overviews of the --- 15854,15860 ---- * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. * September Gnus:: The Thing Formally Known As Gnus 5.3/5.3. * Red Gnus:: Third time best---Gnus 5.4/5.5. ! * Quassia Gnus:: Two times two is four, or Gnus 5.6.24. @end menu These lists are, of course, just @emph{short} overviews of the *************** *** 16391,16397 **** @node Quassia Gnus @subsubsection Quassia Gnus ! New features in Gnus 5.6.23: @itemize @bullet --- 16389,16395 ---- @node Quassia Gnus @subsubsection Quassia Gnus ! New features in Gnus 5.6.24: @itemize @bullet *************** *** 17704,17709 **** --- 17702,17710 ---- with unread articles, even if that group is hidden in a topic. @item + gnus-posting-styles doesn't work in drafts. + + @item Solve the halting problem. @c TODO *************** *** 18231,18236 **** --- 18232,18250 ---- @item gnus-get-info @findex gnus-get-info Returns the group info list for @var{group}. + + @item gnus-group-unread + @findex gnus-group-unread + The number of unread articles in @var{group}, or @code{t} if that is + unknown. + + @item gnus-active + @findex gnus-active + The active entry for @var{group}. + + @item gnus-set-active + @findex gnus-set-active + Set the active entry for @var{group}. @item gnus-add-current-to-buffer-list @findex gnus-add-current-to-buffer-list *** pub/qgnus/texi/message.texi Wed Jul 1 13:34:46 1998 --- qgnus/texi/message.texi Sat Jul 11 03:05:54 1998 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Message 5.6.23 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Message 5.6.24 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 42,48 **** @tex @titlepage ! @title Message 5.6.23 Manual @author by Lars Magne Ingebrigtsen @page --- 42,48 ---- @tex @titlepage ! @title Message 5.6.24 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 83,89 **** * Key Index:: List of Message mode keys. @end menu ! This manual corresponds to Message 5.6.23. Message is distributed with the Gnus distribution bearing the same version number as this manual has. --- 83,89 ---- * Key Index:: List of Message mode keys. @end menu ! This manual corresponds to Message 5.6.24. Message is distributed with the Gnus distribution bearing the same version number as this manual has. *** pub/qgnus/texi/ChangeLog Wed Jul 1 13:34:46 1998 --- qgnus/texi/ChangeLog Sat Jul 11 03:05:54 1998 *************** *** 1,3 **** --- 1,19 ---- + Fri Jul 10 04:26:23 1998 Lars Magne Ingebrigtsen + + * gnus.texi (NNTP): Addition. + + Sat Jul 4 14:24:29 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Gnus Utility Functions): Addition. + + Thu Jul 2 11:37:51 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Posting Styles): Ununcommented. + + Wed Jul 1 17:57:54 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Topic Commands): Addition. + Tue Jun 30 16:11:27 1998 Lars Magne Ingebrigtsen * gnus.texi (Topic Commands): Addition. *** pub/qgnus/GNUS-NEWS Sun Jun 28 09:56:50 1998 --- qgnus/GNUS-NEWS Sat Jul 11 03:05:54 1998 *************** *** 98,100 **** --- 98,102 ---- *** Old dejanews archives can now be read by nnweb. *** Byte-compilation of user-specs now works under XEmacs. + + *** `gnus-posting-styles' has been re-activated.