*** pub/sgnus/lisp/gnus-msg.el Sat Oct 14 05:26:25 1995 --- sgnus/lisp/gnus-msg.el Sun Oct 15 01:10:10 1995 *************** *** 28,33 **** --- 28,34 ---- (require 'gnus) (require 'sendmail) (require 'gnus-ems) + (eval-when-compile (require 'cl)) (defvar gnus-organization-file "/usr/lib/news/organization" "*Local news organization file.") *************** *** 131,136 **** --- 132,145 ---- "drafts")) "*The directory where draft messages will be stored.") + (defvar gnus-posting-styles nil + "*Alist of styles to use when posting.") + + (defvar gnus-posting-style-alist + '((organization . gnus-organization-file) + (signature . gnus-signature-file) + (from . gnus-user-from-line))) + (defvar gnus-user-login-name nil "*The login name of the user. Got from the function `user-login-name' if undefined.") *************** *** 1634,1639 **** --- 1643,1650 ---- (pop-to-buffer gnus-post-news-buffer) (erase-buffer) (news-reply-mode) + ;; Let posting styles be configured. + (gnus-configure-posting-styles) (news-setup nil subject nil group nil) (gnus-inews-insert-signature) (and gnus-post-prepare-function *************** *** 1709,1714 **** --- 1720,1728 ---- (setq sendto (concat sendto (and sendto ", ") (cdr elt))) (setq follow-to (delq elt follow-to)))) + ;; Let posting styles be configured. + (gnus-configure-posting-styles) + (news-setup nil subject nil (or group sendto (and follow-to *************** *** 1953,1959 **** (winconf (current-window-configuration)) (subject (gnus-forward-make-subject forward-buffer))) (set-buffer (get-buffer-create gnus-mail-buffer)) - (mail-mode) (if (and (buffer-modified-p) (> (buffer-size) 0) (not (gnus-y-or-n-p --- 1967,1972 ---- *************** *** 2183,2188 **** --- 2196,2203 ---- (defun gnus-mail-setup (type &optional to subject in-reply-to cc replybuffer actions) + ;; Let posting styles be configured. + (gnus-configure-posting-styles) (funcall (cond ((or *************** *** 2360,2365 **** --- 2375,2435 ---- ;; Put point where you left it. (goto-char (nth 3 type)))) + (defun gnus-configure-posting-styles () + "Configure posting styles according to `gnus-posting-styles'." + (let ((styles gnus-posting-styles) + 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)) + ((symbolp match) + (cond ((fboundp 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 (cdr attribute)) + ;; 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 set the variable. + (setq value-value + (cond ((stringp value) + value) + ((symbolp value) + (cond ((fboundp 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 gnus-required-headers) + (make-local-variable gnus-required-mail-headers) + (push (cons (car attribute) value-value) + gnus-required-headers) + (push (cons (car attribute) value-value) + gnus-required-mail-headers))))))))) ;;; Allow redefinition of functions. *** pub/sgnus/lisp/gnus-score.el Sat Oct 14 05:26:27 1995 --- sgnus/lisp/gnus-score.el Sun Oct 15 01:10:09 1995 *************** *** 1495,1500 **** --- 1495,1501 ---- (let* ((malist (gnus-copy-sequence gnus-adaptive-score-alist)) (alist malist) (date (current-time-string)) + (data gnus-newsgroup-data) elem headers match) ;; First we transform the adaptive rule alist into something ;; that's faster to process. *************** *** 1505,1529 **** (setq elem (cdr elem)) (while elem (setcdr (car elem) ! (cons (symbol-name (car (car elem))) (cdr (car elem)))) (setcar (car elem) (intern (concat "gnus-header-" ! (downcase (symbol-name (car (car elem))))))) (setq elem (cdr elem))) (setq malist (cdr malist))) ;; We change the score file to the adaptive score file. (gnus-score-load-file (gnus-score-file-name gnus-newsgroup-name gnus-adaptive-file-suffix)) ;; The we score away. ! (goto-char (point-min)) ! (while (not (eobp)) ! (setq elem (cdr (assq (gnus-summary-article-mark) alist))) (if (or (not elem) ! (get-text-property (point) 'gnus-pseudo)) () ! (when (and (setq headers (gnus-summary-article-header)) ! (vectorp headers)) (while elem (setq match (funcall (car (car elem)) headers)) (gnus-summary-score-entry --- 1506,1533 ---- (setq elem (cdr elem)) (while elem (setcdr (car elem) ! (cons (if (eq (car (car elem)) 'followup) ! "references" ! (symbol-name (car (car elem)))) ! (cdr (car elem)))) (setcar (car elem) (intern (concat "gnus-header-" ! (if (eq (car (car elem)) 'followup) ! "message-id" ! (downcase (symbol-name (car (car elem)))))))) (setq elem (cdr elem))) (setq malist (cdr malist))) ;; We change the score file to the adaptive score file. (gnus-score-load-file (gnus-score-file-name gnus-newsgroup-name gnus-adaptive-file-suffix)) ;; The we score away. ! (while data ! (setq elem (cdr (assq (gnus-data-mark (car data)) alist))) (if (or (not elem) ! (gnus-data-pseudo-p (car data))) () ! (when (setq headers (gnus-data-header (car data))) (while elem (setq match (funcall (car (car elem)) headers)) (gnus-summary-score-entry *************** *** 1543,1596 **** 'f 's)))) (nth 2 (car elem)) date nil t) (setq elem (cdr elem))))) ! (forward-line 1))))) ! ! (defun gnus-score-remove-lines-adaptive (marks) ! (save-excursion ! (let* ((malist (gnus-copy-sequence gnus-adaptive-score-alist)) ! (alist malist) ! (date (current-time-string)) ! (cur-score gnus-current-score-file) ! elem headers match) ! ;; First we transform the adaptive rule alist into something ! ;; that's faster to process. ! (while malist ! (setq elem (car malist)) ! (if (symbolp (car elem)) ! (setcar elem (symbol-value (car elem)))) ! (setq elem (cdr elem)) ! (while elem ! (setcdr (car elem) ! (cons (symbol-name (car (car elem))) (cdr (car elem)))) ! (setcar (car elem) ! (intern ! (concat "gnus-header-" ! (downcase (symbol-name (car (car elem))))))) ! (setq elem (cdr elem))) ! (setq malist (cdr malist))) ! ;; The we score away. ! (goto-char (point-min)) ! ;; We change the score file to the adaptive score file. ! (gnus-score-load-file (gnus-score-file-name ! gnus-newsgroup-name gnus-adaptive-file-suffix)) ! (while (re-search-forward marks nil t) ! (beginning-of-line) ! (setq elem (cdr (assq (gnus-summary-article-mark) alist))) ! (if (or (not elem) ! (get-text-property (gnus-point-at-bol) 'gnus-pseudo)) ! () ! (setq headers (gnus-summary-article-header)) ! (while elem ! (setq match (funcall (car (car elem)) headers)) ! (gnus-summary-score-entry ! (nth 1 (car elem)) match ! (if (or (not gnus-score-exact-adapt-limit) ! (< (length match) gnus-score-exact-adapt-limit)) ! 'e 's) ! (nth 2 (car elem)) date nil t) ! (setq elem (cdr elem))))) ! ;; Switch back to the old score file. ! (gnus-score-load-file cur-score)))) ;;; ;;; Score mode. --- 1547,1553 ---- 'f 's)))) (nth 2 (car elem)) date nil t) (setq elem (cdr elem))))) ! (setq data (cdr data)))))) ;;; ;;; Score mode. *** pub/sgnus/lisp/gnus-uu.el Sat Oct 14 05:26:28 1995 --- sgnus/lisp/gnus-uu.el Sat Oct 14 11:43:23 1995 *************** *** 27,32 **** --- 27,33 ---- (require 'gnus) (require 'gnus-msg) + (eval-when-compile (require 'cl)) ;; Default viewing action rules *************** *** 973,992 **** () ;; Collect all subjects matching subject. (let ((case-fold-search t) ! subj mark) ! (goto-char (point-min)) ! (while (not (eobp)) ! (and (setq subj (gnus-summary-article-subject)) ! (string-match subject subj) ! (or (not only-unread) ! (= (setq mark (gnus-summary-article-mark)) gnus-unread-mark) (= mark gnus-ticked-mark) (= mark gnus-dormant-mark)) (setq list-of-subjects (cons (cons subj (gnus-summary-article-number)) ! list-of-subjects))) ! (forward-line 1))) ;; Expand numbers, sort, and return the list of article ;; numbers. --- 974,993 ---- () ;; Collect all subjects matching subject. (let ((case-fold-search t) ! (data gnus-newsgroup-data) ! subj mark d) ! (while data ! (setq d (pop data)) ! (and (or (not only-unread) ! (= (setq mark (gnus-data-mark d)) gnus-unread-mark) (= mark gnus-ticked-mark) (= mark gnus-dormant-mark)) + (setq subj (mail-header-subject (gnus-data-header d))) + (string-match subject subj) (setq list-of-subjects (cons (cons subj (gnus-summary-article-number)) ! list-of-subjects))))) ;; Expand numbers, sort, and return the list of article ;; numbers. *************** *** 1109,1116 **** (if (not (= (or gnus-current-article 0) article)) (let ((nntp-async-number nil)) ! (gnus-request-article article gnus-newsgroup-name ! nntp-server-buffer) (setq gnus-last-article gnus-current-article) (setq gnus-current-article article) (setq gnus-article-current (cons gnus-newsgroup-name article)) --- 1110,1118 ---- (if (not (= (or gnus-current-article 0) article)) (let ((nntp-async-number nil)) ! (save-excursion ! (set-buffer nntp-server-buffer) ! (gnus-request-article-this-buffer article gnus-newsgroup-name)) (setq gnus-last-article gnus-current-article) (setq gnus-current-article article) (setq gnus-article-current (cons gnus-newsgroup-name article)) *** pub/sgnus/lisp/gnus.el Sat Oct 14 05:26:30 1995 --- sgnus/lisp/gnus.el Sun Oct 15 03:15:57 1995 *************** *** 944,951 **** "*There is no thread under the article.") (defvar gnus-not-empty-thread-mark ?= "*There is a thread under the article.") - (defvar gnus-dummy-mark ?Z - "*This is a dummy article.") (defvar gnus-view-pseudo-asynchronously nil "*If non-nil, Gnus will view pseudo-articles asynchronously.") --- 944,949 ---- *************** *** 1476,1482 **** "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.9" "Version number for this version of Gnus.") (defvar gnus-info-nodes --- 1474,1480 ---- "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.10" "Version number for this version of Gnus.") (defvar gnus-info-nodes *************** *** 1911,1917 **** (autoload 'gnus-score-headers "gnus-score") (autoload 'gnus-current-score-file-nondirectory "gnus-score") (autoload 'gnus-score-adaptive "gnus-score") - (autoload 'gnus-score-remove-lines-adaptive "gnus-score") (autoload 'gnus-score-find-trace "gnus-score") (autoload 'gnus-score-flush-cache "gnus-score" nil t) (autoload 'gnus-score-close "gnus-score" nil t) --- 1909,1914 ---- *************** *** 2280,2286 **** (if (not (setq elem (cdr (assq spec spec-alist)))) (setq elem '("*" ?s))) ;; Treat user defined format specifiers specially ! (and (eq (car elem) 'user-defined) (setq elem (list (list (intern (concat "gnus-user-format-function-" --- 2277,2283 ---- (if (not (setq elem (cdr (assq spec spec-alist)))) (setq elem '("*" ?s))) ;; Treat user defined format specifiers specially ! (and (eq (car elem) 'gnus-tmp-user-defined) (setq elem (list (list (intern (concat "gnus-user-format-function-" *************** *** 2762,2771 **** (or r (error "No such setting: %s" setting)) (if (and (not force) (setq all-visible (gnus-all-windows-visible-p r))) ! ;; All the windows mentioned are already visibe, so we just ;; put point in the assigned buffer, and do not touch the ;; winconf. ! (select-window (get-buffer-window all-visible)) ;; Either remove all windows or just remove all Gnus windows. (if gnus-use-full-window --- 2759,2769 ---- (or r (error "No such setting: %s" setting)) (if (and (not force) (setq all-visible (gnus-all-windows-visible-p r))) ! ;; All the windows mentioned are already visible, so we just ;; put point in the assigned buffer, and do not touch the ;; winconf. ! (select-window (get-buffer-window all-visible t)) ! ;; Either remove all windows or just remove all Gnus windows. (if gnus-use-full-window *************** *** 2856,2862 **** ;; Finally, we pop to the buffer that's supposed to have point. (or jump-buffer (error "Missing `point' in spec for %s" setting)) ! (select-window (get-buffer-window jump-buffer)) (set-buffer jump-buffer)))) (defun gnus-all-windows-visible-p (rule) --- 2854,2860 ---- ;; Finally, we pop to the buffer that's supposed to have point. (or jump-buffer (error "Missing `point' in spec for %s" setting)) ! (select-window (get-buffer-window jump-buffer t)) (set-buffer jump-buffer)))) (defun gnus-all-windows-visible-p (rule) *************** *** 6285,6290 **** --- 6283,6291 ---- (defmacro gnus-data-unread-p (data) (` (= (nth 1 (, data)) gnus-unread-mark))) + (defmacro gnus-data-pseudo-p (data) + (` (vectorp (nth 3 (, data))))) + (defmacro gnus-data-find (number) (` (assq (, number) gnus-newsgroup-data))) *************** *** 6350,6369 **** --- 6351,6383 ---- (setq data (cdr data)))) (defun gnus-summary-article-pseudo-p (article) + "Say whether this article is a pseudo article or not." (not (vectorp (gnus-data-header (gnus-data-find article))))) (defun gnus-article-parent-p (number) + "Say whether this article is a parent or not." (let* ((data (gnus-data-find-list number))) (and (cdr data) ; There has to be an article after... (< (gnus-data-level (car data)) ; And it has to have a higher level. (gnus-data-level (nth 1 data)))))) + (defmacro gnus-summary-skip-intangible () + "If the current article is intangible, then jump to a different article." + (let ((to (get-text-property (point) 'gnus-intangible))) + (when to + (gnus-summary-goto-subject to)))) + + (defmacro gnus-summary-article-intangible-p () + "Say whether this article is intangible or not." + (get-text-property (point) 'gnus-intangible)) + ;; Some summary mode macros. (defmacro gnus-summary-article-number (&optional number-or-nil) "The article number of the article on the current line. If there isn's an article number here, then we return the current article number." + (gnus-summary-skip-intangible) (if number-or-nil '(get-text-property (point) 'gnus-number) '(or (get-text-property (point) 'gnus-number) *************** *** 6479,6490 **** (defun gnus-summary-insert-dummy-line (sformat gnus-tmp-subject gnus-tmp-number) ! (if (not sformat) ! (setq sformat gnus-summary-dummy-line-format-spec)) (beginning-of-line) ! (put-text-property (point) (progn (eval sformat) (point)) ! 'gnus-number gnus-tmp-number)) (defvar gnus-thread-indent-array nil) (defvar gnus-thread-indent-array-level gnus-thread-indent-level) --- 6493,6504 ---- (defun gnus-summary-insert-dummy-line (sformat gnus-tmp-subject gnus-tmp-number) ! "Insert a dummy root in the summary buffer." ! (or sformat (setq sformat gnus-summary-dummy-line-format-spec)) (beginning-of-line) ! (add-text-properties (point) (progn (eval sformat) (point)) ! (list 'gnus-number gnus-tmp-number 'gnus-intangible gnus-tmp-number))) (defvar gnus-thread-indent-array nil) (defvar gnus-thread-indent-array-level gnus-thread-indent-level) *************** *** 6714,6723 **** (gnus-message 6 "No unread news") (gnus-kill-buffer kill-buffer) nil) - ;;(save-excursion - ;; (if kill-buffer - ;; (let ((gnus-summary-buffer kill-buffer)) - ;; (gnus-configure-windows 'group)))) ;; Hide conversation thread subtrees. We cannot do this in ;; gnus-summary-prepare-hook since kill processing may not ;; work with hidden articles. --- 6728,6733 ---- *************** *** 6760,6767 **** (gnus-gather-threads (gnus-sort-threads (gnus-make-threads))) ! gnus-newsgroup-headers) ! 'cull) (gnus-summary-update-lines) (setq gnus-newsgroup-data (nreverse gnus-newsgroup-data)) ;; Call hooks for modifying summary buffer. --- 6770,6776 ---- (gnus-gather-threads (gnus-sort-threads (gnus-make-threads))) ! gnus-newsgroup-headers)) (gnus-summary-update-lines) (setq gnus-newsgroup-data (nreverse gnus-newsgroup-data)) ;; Call hooks for modifying summary buffer. *************** *** 6882,6895 **** (and (zerop (forward-line -1)) (gnus-summary-article-number)))) headers refs thread art data) ! ;; First go up in this thread until we find the root. ! (while (and id (setq headers ! (car (setq art (gnus-gethash (downcase id) dep))))) ! (setq thread art) ! (setq id (gnus-parent-id (mail-header-references headers)))) ! ;; We now have the root, so we remove this thread from the summary ! ;; buffer. ! (gnus-remove-articles thread) (let ((beg (point))) ;; We then insert this thread into the summary buffer. (let (gnus-newsgroup-data) --- 6891,6906 ---- (and (zerop (forward-line -1)) (gnus-summary-article-number)))) headers refs thread art data) ! (if (not gnus-show-threads) ! (setq thread (car (gnus-gethash (downcase id) dep))) ! ;; First go up in this thread until we find the root. ! (while (and id (setq headers ! (car (setq art (gnus-gethash (downcase id) dep))))) ! (setq thread art) ! (setq id (gnus-parent-id (mail-header-references headers)))) ! ;; We now have the root, so we remove this thread from the summary ! ;; buffer. ! (gnus-remove-articles thread)) (let ((beg (point))) ;; We then insert this thread into the summary buffer. (let (gnus-newsgroup-data) *************** *** 6916,6923 **** (pos (gnus-data-pos (gnus-data-find number)))) (if pos (progn ! (gnus-data-remove number (- (progn (forward-line 1) (point)) ! (forward-line -1) (point))) (cons pos (apply 'nconc (mapcar (lambda (th) (gnus-remove-articles-1 th)) (cdr thread))))) --- 6927,6935 ---- (pos (gnus-data-pos (gnus-data-find number)))) (if pos (progn ! (goto-char pos) ! (gnus-data-remove number (- (progn (beginning-of-line) (point)) ! (progn (forward-line 1) (point)))) (cons pos (apply 'nconc (mapcar (lambda (th) (gnus-remove-articles-1 th)) (cdr thread))))) *************** *** 6928,6935 **** --- 6940,6950 ---- ;; Sort threads as specified in `gnus-thread-sort-functions'. (let ((fun gnus-thread-sort-functions)) (while fun + (gnus-message 6 "Sorting with %S..." fun) (setq threads (sort threads (car fun)) fun (cdr fun)))) + (if gnus-thread-sort-functions + (gnus-message 6 "Sorting...done")) threads) ;; Written by Hallvard B Furuseth . *************** *** 7011,7018 **** (defvar gnus-tmp-prev-subject nil) (defvar gnus-tmp-false-parent nil) (defvar gnus-tmp-root-expunged nil) ! (defun gnus-summary-prepare-threads (threads &optional cull) "Prepare summary buffer from THREADS and indentation LEVEL. THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])' or a straight list of headers." --- 7026,7034 ---- (defvar gnus-tmp-prev-subject nil) (defvar gnus-tmp-false-parent nil) (defvar gnus-tmp-root-expunged nil) + (defvar gnus-tmp-dummy-line nil) ! (defun gnus-summary-prepare-threads (threads) "Prepare summary buffer from THREADS and indentation LEVEL. THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])' or a straight list of headers." *************** *** 7027,7039 **** ;; If this is a straight (sic) list of headers, then a ;; threaded summary display isn't required, so we just create ;; an unthreaded one. ! (gnus-summary-prepare-unthreaded threads cull) ;; Do the threaded display. (while (or threads stack new-adopts new-roots) (if (and (= level 0) (or (not stack) (= (car (car stack)) 0)) (not gnus-tmp-false-parent) --- 7043,7056 ---- ;; If this is a straight (sic) list of headers, then a ;; threaded summary display isn't required, so we just create ;; an unthreaded one. ! (gnus-summary-prepare-unthreaded threads) ;; Do the threaded display. (while (or threads stack new-adopts new-roots) (if (and (= level 0) + (progn (setq gnus-tmp-dummy-line nil) t) (or (not stack) (= (car (car stack)) 0)) (not gnus-tmp-false-parent) *************** *** 7091,7100 **** gnus-tmp-gathered)) (setq level -1)) ((eq gnus-summary-make-false-root 'dummy) ! ;; We output a dummy root. ! (gnus-summary-insert-dummy-line ! nil header (mail-header-number ! (car (car (cdr (car thread)))))) (setq gnus-tmp-prev-subject header)) (t ;; We do not make a root for the gathered --- 7108,7116 ---- gnus-tmp-gathered)) (setq level -1)) ((eq gnus-summary-make-false-root 'dummy) ! ;; We remember that we probably want to output a dummy ! ;; root. ! (setq gnus-tmp-dummy-line header) (setq gnus-tmp-prev-subject header)) (t ;; We do not make a root for the gathered *************** *** 7112,7119 **** (setq new-roots (nconc new-roots (list (car thread))) thread-end t header nil)) ! ((and gnus-newsgroup-limit ! (not (memq number gnus-newsgroup-limit))) (setq gnus-tmp-gathered (nconc (mapcar (lambda (h) (mail-header-number (car h))) --- 7128,7134 ---- (setq new-roots (nconc new-roots (list (car thread))) thread-end t header nil)) ! ((not (memq number gnus-newsgroup-limit)) (setq gnus-tmp-gathered (nconc (mapcar (lambda (h) (mail-header-number (car h))) *************** *** 7140,7145 **** --- 7155,7167 ---- (and header (progn + ;; We may have an old dummy line to output before this + ;; article. + (when gnus-tmp-dummy-line + (gnus-summary-insert-dummy-line + nil gnus-tmp-dummy-line header)) + + ;; Compute the mark. (setq mark (cond *************** *** 7149,7154 **** --- 7171,7178 ---- ((memq number gnus-newsgroup-expirable) gnus-expirable-mark) (t (or (cdr (assq number gnus-newsgroup-reads)) gnus-ancient-mark)))) + + ;; Actually insert the line. (inline (gnus-summary-insert-line nil header level nil mark *************** *** 7186,7192 **** (or threads (setq level 0))))) (message "Generating summary...done")) ! (defun gnus-summary-prepare-unthreaded (headers &optional cull) (let (header number mark) (while headers --- 7210,7217 ---- (or threads (setq level 0))))) (message "Generating summary...done")) ! (defun gnus-summary-prepare-unthreaded (headers) ! "Generate an unthreaded summary buffer based on HEADERS." (let (header number mark) (while headers *************** *** 7195,7204 **** number (mail-header-number header)) ;; We may have to root out some bad articles... ! (if (and gnus-newsgroup-limit ! (not (memq number gnus-newsgroup-limit))) ! ;; Don't print this article - it's not in the limit. ! () (setq mark (cond ((memq number gnus-newsgroup-marked) gnus-ticked-mark) --- 7220,7226 ---- number (mail-header-number header)) ;; We may have to root out some bad articles... ! (when (memq number gnus-newsgroup-limit) (setq mark (cond ((memq number gnus-newsgroup-marked) gnus-ticked-mark) *************** *** 7280,7286 **** (mapcar (lambda (headers) (mail-header-number headers)) gnus-newsgroup-headers))) ;; Set the initial limit. ! (setq gnus-newsgroup-limit (copy-sequence gnus-newsgroup-unreads)) ;; Adjust and set lists of article marks. (and info (let (marked) --- 7302,7308 ---- (mapcar (lambda (headers) (mail-header-number headers)) gnus-newsgroup-headers))) ;; Set the initial limit. ! (setq gnus-newsgroup-limit (copy-sequence articles)) ;; Adjust and set lists of article marks. (and info (let (marked) *************** *** 8007,8018 **** number) (if (not header) () ; We couldn't fetch ID. - ;; Add this article to the current limit. - (push (setq number (mail-header-number header)) gnus-newsgroup-limit) ;; Rebuild the thread that this article is part of and go to the ;; article we have fetched. (gnus-rebuild-thread (mail-header-id header)) ! (gnus-summary-goto-subject number) (and (> number 0) (progn ;; We have to update the boundaries, possibly. --- 8029,8038 ---- number) (if (not header) () ; We couldn't fetch ID. ;; Rebuild the thread that this article is part of and go to the ;; article we have fetched. (gnus-rebuild-thread (mail-header-id header)) ! (gnus-summary-goto-subject (setq number (mail-header-number header))) (and (> number 0) (progn ;; We have to update the boundaries, possibly. *************** *** 8604,8611 **** (prog1 (gnus-article-prepare article all-header) (gnus-summary-show-thread) - (if (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) (run-hooks 'gnus-select-article-hook) (gnus-summary-recenter) (gnus-summary-goto-subject article) --- 8624,8629 ---- *************** *** 8942,8950 **** (interactive "P") (gnus-set-global-variables) (prog2 ! (if total (setq gnus-newsgroup-limits nil)) ! (gnus-summary-limit nil 'pop)) ! (gnus-summary-position-point)) (defun gnus-summary-limit-to-subject (subject) "Limit the summary buffer to articles that have subjects that match a regexp." --- 8960,8970 ---- (interactive "P") (gnus-set-global-variables) (prog2 ! (if total (setq gnus-newsgroup-limits ! (list (mapcar (lambda (h) (mail-header-number h)) ! gnus-newsgroup-headers)))) ! (gnus-summary-limit nil 'pop) ! (gnus-summary-position-point))) (defun gnus-summary-limit-to-subject (subject) "Limit the summary buffer to articles that have subjects that match a regexp." *************** *** 8980,9004 **** (make-obsolete 'gnus-summary-delete-marked-with 'gnus-summary-limit-to-marks) (defun gnus-summary-limit-to-marks (marks &optional reverse) ! "Limit the summary buffer to articles that are not marked with MARKS (e.g. \"DK\"). ! If REVERSE, limit the summary buffer to articles that are marked with MARKS. MARKS can either be a string of marks or a list of marks. Returns how many articles were removed." (interactive "sMarks: ") (gnus-set-global-variables) (prog1 ! (if gnus-newsgroup-adaptive ! (gnus-score-remove-lines-adaptive marks) ! (let ((data gnus-newsgroup-data) ! (marks (if (listp marks) marks ! (append marks nil))) ; Transform to list. ! articles) ! (while data ! (and (if reverse (not (memq (gnus-data-mark (car data)) marks)) ! (memq (gnus-data-mark (car data)) marks)) ! (setq articles (cons (gnus-data-number (car data)) articles))) ! (setq data (cdr data))) ! (gnus-summary-limit articles))) (gnus-summary-position-point))) (defun gnus-summary-limit-to-score (&optional score) --- 9000,9022 ---- (make-obsolete 'gnus-summary-delete-marked-with 'gnus-summary-limit-to-marks) (defun gnus-summary-limit-to-marks (marks &optional reverse) ! "Limit the summary buffer to articles that are marked with MARKS (e.g. \"DK\"). ! If REVERSE, limit the summary buffer to articles that are not marked with MARKS. MARKS can either be a string of marks or a list of marks. Returns how many articles were removed." (interactive "sMarks: ") (gnus-set-global-variables) (prog1 ! (let ((data gnus-newsgroup-data) ! (marks (if (listp marks) marks ! (append marks nil))) ; Transform to list. ! articles) ! (while data ! (and (if reverse (not (memq (gnus-data-mark (car data)) marks)) ! (memq (gnus-data-mark (car data)) marks)) ! (setq articles (cons (gnus-data-number (car data)) articles))) ! (setq data (cdr data))) ! (gnus-summary-limit articles)) (gnus-summary-position-point))) (defun gnus-summary-limit-to-score (&optional score) *************** *** 9100,9106 **** (if (and (null gnus-newsgroup-dormant) (not (eq gnus-fetch-old-headers 'some)) (null gnus-summary-expunge-below)) ! () ; Do nothing. (setq gnus-newsgroup-limits (cons gnus-newsgroup-limit gnus-newsgroup-limits)) (setq gnus-newsgroup-limit nil) --- 9118,9124 ---- (if (and (null gnus-newsgroup-dormant) (not (eq gnus-fetch-old-headers 'some)) (null gnus-summary-expunge-below)) ! () ; Do nothing. (setq gnus-newsgroup-limits (cons gnus-newsgroup-limit gnus-newsgroup-limits)) (setq gnus-newsgroup-limit nil) *************** *** 9112,9117 **** --- 9130,9137 ---- (gnus-summary-limit-children (car nodes)) (setq nodes (cdr nodes)))))) gnus-newsgroup-dependencies) + (when (not gnus-newsgroup-limit) + (setq gnus-newsgroup-limit (pop gnus-newsgroup-limits))) gnus-newsgroup-limit)) (defun gnus-summary-limit-children (thread) *************** *** 9546,9552 **** (format "these %d articles" (length articles)) "this article") (if gnus-current-move-group ! (format "(%s default) " gnus-current-move-group) "")) gnus-active-hashtb nil nil prefix))) (if to-newsgroup --- 9566,9572 ---- (format "these %d articles" (length articles)) "this article") (if gnus-current-move-group ! (format "(default %s) " gnus-current-move-group) "")) gnus-active-hashtb nil nil prefix))) (if to-newsgroup *************** *** 9591,9598 **** (info (nth 2 entry)) (article (car articles))) (gnus-summary-goto-subject article) ! (beginning-of-line) ! (delete-region (point) (progn (forward-line 1) (point))) ;; Update the group that has been moved to. (if (not info) () ; This group does not exist yet. --- 9611,9617 ---- (info (nth 2 entry)) (article (car articles))) (gnus-summary-goto-subject article) ! (gnus-summary-mark-article article gnus-canceled-mark) ;; Update the group that has been moved to. (if (not info) () ; This group does not exist yet. *************** *** 9600,9605 **** --- 9619,9625 ---- (setcar (cdr (cdr info)) (gnus-add-to-range (nth 2 info) (list (cdr art-group))))) + ;; Copy any marks over to the new group. (let ((marks '((tick . gnus-newsgroup-marked) (dormant . gnus-newsgroup-dormant) *************** *** 9607,9612 **** --- 9627,9645 ---- (bookmark . gnus-newsgroup-bookmarks) (reply . gnus-newsgroup-replied))) (to-article (cdr art-group))) + + ;; See whether the article is to be put in the cache. + (when gnus-use-cache + (gnus-cache-possibly-enter-article + (car info) to-article + (let ((header (copy-sequence + (gnus-summary-article-header article)))) + (mail-header-set-number to-article header) + header) + (memq article gnus-newsgroup-marked) + (memq article gnus-newsgroup-dormant) + (memq article gnus-newsgroup-unreads))) + (while marks (if (memq article (symbol-value (cdr (car marks)))) (gnus-add-marked-articles *************** *** 9683,9689 **** (format "these %d articles" (length articles)) "this article") (if gnus-current-move-group ! (format "(%s default) " gnus-current-move-group) "")) gnus-active-hashtb nil nil prefix))) (if to-newsgroup --- 9716,9722 ---- (format "these %d articles" (length articles)) "this article") (if gnus-current-move-group ! (format "(default %s) " gnus-current-move-group) "")) gnus-active-hashtb nil nil prefix))) (if to-newsgroup *************** *** 9729,9734 **** --- 9762,9768 ---- (setcar (cdr (cdr info)) (gnus-add-to-range (nth 2 info) (list (cdr art-group))))) + ;; Copy any marks over to the new group. (let ((marks '((tick . gnus-newsgroup-marked) (dormant . gnus-newsgroup-dormant) *************** *** 9736,9746 **** (bookmark . gnus-newsgroup-bookmarks) (reply . gnus-newsgroup-replied))) (to-article (cdr art-group))) ! (while marks ! (if (memq article (symbol-value (cdr (car marks)))) ! (gnus-add-marked-articles ! (car info) (car (car marks)) (list to-article) info)) ! (setq marks (cdr marks)))))) (gnus-message 1 "Couldn't copy article %s" (car articles))) (gnus-summary-remove-process-mark (car articles)) (setq articles (cdr articles))) --- 9770,9793 ---- (bookmark . gnus-newsgroup-bookmarks) (reply . gnus-newsgroup-replied))) (to-article (cdr art-group))) ! ! ;; See whether the article is to be put in the cache. ! (when gnus-use-cache ! (gnus-cache-possibly-enter-article ! (car info) to-article ! (let ((header (copy-sequence ! (gnus-summary-article-header article)))) ! (mail-header-set-number to-article header) ! header) ! (memq article gnus-newsgroup-marked) ! (memq article gnus-newsgroup-dormant) ! (memq article gnus-newsgroup-unreads))) ! ! (while marks ! (if (memq article (symbol-value (cdr (car marks)))) ! (gnus-add-marked-articles ! (car info) (car (car marks)) (list to-article) info)) ! (setq marks (cdr marks)))))) (gnus-message 1 "Couldn't copy article %s" (car articles))) (gnus-summary-remove-process-mark (car articles)) (setq articles (cdr articles))) *************** *** 9821,9827 **** (defun gnus-summary-delete-article (&optional n) "Delete the N next (mail) articles. This command actually deletes articles. This is not a marking ! command. The article will disappear forever from you life, never to return. If N is negative, delete backwards. If N is nil and articles have been marked with the process mark, --- 9868,9874 ---- (defun gnus-summary-delete-article (&optional n) "Delete the N next (mail) articles. This command actually deletes articles. This is not a marking ! command. The article will disappear forever from your life, never to return. If N is negative, delete backwards. If N is nil and articles have been marked with the process mark, *************** *** 9936,9943 **** ;; Skip dummy header line. (save-excursion (gnus-summary-show-thread) - (if (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) (let ((buffer-read-only nil)) ;; Set score. (gnus-summary-update-mark --- 9983,9988 ---- *************** *** 10189,10196 **** (if (gnus-summary-goto-subject article) (progn (gnus-summary-show-thread) - (and (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) (gnus-summary-update-mark gnus-process-mark 'replied) t)))) --- 10234,10239 ---- *************** *** 10201,10208 **** (if (gnus-summary-goto-subject article) (progn (gnus-summary-show-thread) - (and (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) (gnus-summary-update-mark ? 'replied) (if (memq article gnus-newsgroup-replied) (gnus-summary-update-mark gnus-replied-mark 'replied)) --- 10244,10249 ---- *************** *** 10253,10260 **** (setq mark gnus-expirable-mark) (setq gnus-newsgroup-expirable (cons article gnus-newsgroup-expirable)))) - (while (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)) --- 10294,10299 ---- *************** *** 10285,10292 **** (= mark gnus-ticked-mark) (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) - (while (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)) --- 10324,10329 ---- *************** *** 10332,10339 **** (if (gnus-summary-goto-subject article) (let ((buffer-read-only nil)) (gnus-summary-show-thread) - (and (eq (gnus-summary-article-mark) gnus-dummy-mark) - (gnus-summary-find-next)) ;; Fix the mark. (gnus-summary-update-mark mark 'unread) t)))) --- 10369,10374 ---- *************** *** 11305,11310 **** --- 11340,11346 ---- (while pslist (gnus-summary-goto-subject (or (cdr (assq 'article (car pslist))) (gnus-summary-article-number))) + (beginning-of-line) (setq b (point)) (put-text-property (point) *************** *** 11620,11660 **** ;; We have found the header. header ;; We have to really fetch the header to this article. ! (if (setq where ! (if (gnus-check-backend-function 'request-head group) ! (gnus-request-head id group) ! (gnus-request-article id group))) ! (save-excursion ! (set-buffer nntp-server-buffer) ! (and (search-forward "\n\n" nil t) ! (delete-region (1- (point)) (point-max))) ! (goto-char (point-max)) ! (insert ".\n") ! (goto-char (point-min)) ! (insert "211 " ! (int-to-string ! (cond ! ((numberp id) ! id) ! ((cdr where) ! (cdr where)) ! (t ! gnus-reffed-article-number))) ! " Article retrieved.\n") ! (if (not (setq header (car (gnus-get-newsgroup-headers)))) ! () ; Malformed head. ! (if (and (stringp id) ! (not (string= (gnus-group-real-name group) ! (car where)))) ! ;; If we fetched by Message-ID and the article came ! ;; from a different group, we fudge some bogus article ! ;; numbers for this article. ! (mail-header-set-number header gnus-reffed-article-number)) ! (setq gnus-reffed-article-number (1- gnus-reffed-article-number)) ! (setq gnus-newsgroup-headers ! (cons header gnus-newsgroup-headers)) ! (setq gnus-current-headers header) ! header)))))) (defun gnus-article-prepare (article &optional all-headers header) "Prepare ARTICLE in article mode buffer. --- 11656,11696 ---- ;; We have found the header. header ;; We have to really fetch the header to this article. ! (when (setq where ! (if (gnus-check-backend-function 'request-head group) ! (gnus-request-head id group) ! (gnus-request-article id group))) ! (save-excursion ! (set-buffer nntp-server-buffer) ! (and (search-forward "\n\n" nil t) ! (delete-region (1- (point)) (point-max))) ! (goto-char (point-max)) ! (insert ".\n") ! (goto-char (point-min)) ! (insert "211 " ! (int-to-string ! (cond ! ((numberp id) ! id) ! ((cdr where) ! (cdr where)) ! (t ! gnus-reffed-article-number))) ! " Article retrieved.\n")) ! (if (not (setq header (car (gnus-get-newsgroup-headers)))) ! () ; Malformed head. ! (if (and (stringp id) ! (not (string= (gnus-group-real-name group) ! (car where)))) ! ;; If we fetched by Message-ID and the article came ! ;; from a different group, we fudge some bogus article ! ;; numbers for this article. ! (mail-header-set-number header gnus-reffed-article-number)) ! (decf gnus-reffed-article-number) ! (push header gnus-newsgroup-headers) ! (setq gnus-current-headers header) ! (push (mail-header-number header) gnus-newsgroup-limit) ! header))))) (defun gnus-article-prepare (article &optional all-headers header) "Prepare ARTICLE in article mode buffer. *** pub/sgnus/lisp/nnfolder.el Sat Oct 14 05:26:31 1995 --- sgnus/lisp/nnfolder.el Sat Oct 14 11:33:24 1995 *************** *** 426,443 **** t))) (defun nnfolder-request-delete-group (group &optional force server) ! (nnfolder-possibly-change-group group) ;; Delete all articles in GROUP. (if (not force) () ; Don't delete the articles. ! ;; Delete the file that holds the group and kill the buffer as ! ;; well. ! (save-excursion ! (and (set-buffer nnfolder-current-buffer) ! (progn ! (and (file-writable-p buffer-file-name) ! (delete-file buffer-file-name)) ! (kill-buffer (current-buffer)))))) ;; Remove the group from all structures. (setq nnfolder-group-alist (delq (assoc group nnfolder-group-alist) nnfolder-group-alist) --- 426,440 ---- t))) (defun nnfolder-request-delete-group (group &optional force server) ! (nnfolder-close-group group server t) ;; Delete all articles in GROUP. (if (not force) () ; Don't delete the articles. ! ;; Delete the file that holds the group. ! (condition-case nil ! (delete-file (concat (file-name-as-directory nnfolder-directory) ! group)) ! (error nil))) ;; Remove the group from all structures. (setq nnfolder-group-alist (delq (assoc group nnfolder-group-alist) nnfolder-group-alist) *** pub/sgnus/lisp/nnmh.el Sat Oct 14 05:26:31 1995 --- sgnus/lisp/nnmh.el Sun Oct 15 03:12:46 1995 *************** *** 227,234 **** (format "%s %d %d y\n" (progn ! (string-match (file-name-as-directory ! (expand-file-name nnmh-directory)) dir) (nnmail-replace-chars-in-string (substring dir (match-end 0)) ?/ ?.)) (apply (function max) files) --- 227,235 ---- (format "%s %d %d y\n" (progn ! (string-match ! (file-truename (file-name-as-directory ! (expand-file-name nnmh-directory))) dir) (nnmail-replace-chars-in-string (substring dir (match-end 0)) ?/ ?.)) (apply (function max) files) *** pub/sgnus/lisp/ChangeLog Sat Oct 14 05:26:37 1995 --- sgnus/lisp/ChangeLog Sun Oct 15 03:16:14 1995 *************** *** 1,4 **** --- 1,52 ---- + Sun Oct 15 03:16:03 1995 Lars Magne Ingebrigtsen + + * gnus.el (gnus-summary-limit-to-marks): Don't do any adaptive + thingies. + + Sun Oct 15 01:27:57 1995 Lars Magne Ingebrigtsen + + * gnus.el (gnus-summary-limit-to-marks): Doc fix. + (gnus-remove-articles-1): Updated positions incorrectly. + (gnus-parse-simple-format): User-defined specs bugged out. + + Sat Oct 14 10:04:27 1995 Lars Ingebrigtsen + + * gnus-msg.el (gnus-posting-styles): New variable. + (gnus-posting-style-alist): New variable. + (gnus-configure-posting-styles): New function. + (gnus-new-news): Use it. + (gnus-news-followup): Use it. + (gnus-mail-setup): Use it. + + * gnus-score.el (gnus-score-adaptive): Iterate over data, not the + buffer. + + * gnus.el (gnus-data-pseudo-p): New function. + + * gnus-score.el: Removed `gnus-score-remove-lines-adaptive'. + + * nnfolder.el (nnfolder-request-delete-group): Didn't totally + remove the group from all structures. + + * gnus.el (gnus-summary-move-article): Don't remove lines that + correspond to moved articles. + (gnus-summary-copy-article): Copy into the cache, possibly. + (gnus-summary-move-article): Ditto. + + * gnus-uu.el (gnus-uu-find-articles-matching): Iterate over the + data instead of the buffer. + + * gnus.el (gnus-rebuild-thread): Didn't work on untreaded displays + (or anywhere else). + (gnus-summary-insert-dummy-line): New implementation. + (gnus-summary-prepare-threads): Don't output dummy lines that + don't have children. + (gnus-summary-skip-intangible): New function. + (gnus-summary-article-intangible-p): New function. + Sat Oct 14 02:07:39 1995 Lars Magne Ingebrigtsen + + * gnus.el: 0.9 is released. * gnus.el (gnus-summary-refer-parent-article): Take a look at the actual References header. *** pub/sgnus/texi/gnus.texi Sat Oct 14 05:26:40 1995 --- sgnus/texi/gnus.texi Sun Oct 15 01:11:56 1995 *************** *** 370,378 **** @item Kevin Davidson came up with the name @dfn{ding}, so blame him. @item ! Stainless Steel Rat, Ulrik Dickow, Jack Vinson, Daniel Quinlan, Frank ! D. Cringle, Geoffrey T. Dairiki and Andrew Eskilsson have all ! contributed code and suggestions. @end itemize --- 370,378 ---- @item Kevin Davidson came up with the name @dfn{ding}, so blame him. @item ! Peter Arius, Stainless Steel Rat, Ulrik Dickow, Jack Vinson, Daniel ! Quinlan, Frank D. Cringle, Geoffrey T. Dairiki and Andrew Eskilsson have ! all contributed code and suggestions. @end itemize *************** *** 3628,3633 **** --- 3628,3634 ---- * Mail:: Mailing & replying. * Post:: Posting and following up. * Mail & Post:: Mailing and posting at the same time. + * Posting Styles:: An easier way to configure some key elements. * Drafts:: Postponing messages and rejected messages. * Rejected Articles:: What happens if the server doesn't like your article? @end menu *************** *** 4237,4242 **** --- 4238,4319 ---- @code{gnus-inews-insert-mime-headers} to @code{gnus-inews-article-hook}. + @node Posting Styles + @subsection 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 random amount of @dfn{attributes}. Each + attribute consists of a @var{(name . value)} pair. The attribute name + can be one of @code{signature}, @code{organization} or @code{from}. + 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 . "~/.signature") + (from . "user@@foo (user)") + ("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 . "~/.work-signature") + (from . "user@@bar.foo (user)") + (organization . "Important Work, Inc")) + ("^nn.+:" + (signature . "~/.mail-signature")))) + @end lisp + + + @node Drafts @subsection Drafts @cindex drafts *************** *** 7370,7375 **** --- 7447,7459 ---- articles that have that mark (i.e., are marked with @samp{D}) will have a score entry added to lower based on the @code{From} header by -4, and lowered by @code{Subject} by -1. Change this to fit your prejudices. + + The headers you can score on are @code{from}, @code{subject}, + @code{message-id}, @code{references}, @code{xref}, @code{lines}, + @code{chars} and @code{date}. In addition, you can score on + @code{followup}, which will create an adaptive score entry that matches + on the @code{References} header using the @code{Message-ID} of the + current article, thereby matching the following thread. If you use this scheme, you should set @code{mark-below} to something small---like -300, perhaps, to avoid having small random changes result *** pub/sgnus/texi/ChangeLog Sat Oct 14 05:26:38 1995 --- sgnus/texi/ChangeLog Sun Oct 15 00:15:09 1995 *************** *** 1,3 **** --- 1,7 ---- + Sat Oct 14 13:23:19 1995 Lars Ingebrigtsen + + * gnus.texi (Posting Styles): New. + Fri Oct 13 02:20:18 1995 Lars Ingebrigtsen * gnus.texi (Post): Fix.