+Thu Nov 7 00:14:45 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-win.el (gnus-delete-windows-in-gnusey-frames): New function.
+ (gnus-configure-windows): Use it.
+
+ * nntp.el (nntp-possibly-change-group): Erased wrong buffer.
+
+ * gnus-score.el (gnus-score-find-bnews): Anchor mathces.
+
+ * gnus-group.el (gnus-group-insert-group-line): Would bug out on
+ on gnus-moderated-hashtb.
+
+Wed Nov 6 22:54:41 1996 Sudish Joseph <sudish@mindspring.com>
+
+ * gnus-nocem.el (gnus-sum): Required.
+
+Wed Nov 6 09:13:34 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnmail.el (nnmail-date-to-time): Trap errors.
+
+ * nntp.el (nntp-open-connection): Erase contents of the right
+ buffer.
+
+ * gnus-sum.el (gnus-summary-first-article-p): New function.
+
+ * gnus-topic.el (gnus-topic-remove-group): Didn't use
+ process/prefix.
+
+ * gnus-group.el (gnus-group-iterate): New macro.
+
+ * gnus-sum.el (gnus-summary-prev-unread-article): Respect
+ `gnus-summary-goto-unread' `never'.
+
+Wed Nov 6 06:55:03 1996 Hrvoje Niksic <hniksic@srce.hr>
+
+ * article.el (gnus-emphasis-alist): New version.
+
+Wed Nov 6 06:26:34 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-art.el (gnus-article-syntax-table): New variable.
+ (gnus-article-mode): Use it.
+
+ * article.el (article-strip-leading-blank-lines): Didn't do much.
+
+Wed Nov 6 05:51:56 1996 Kevin Buhr <buhr@stat.wisc.edu>
+
+ * gnus-sum.el (gnus-summary-respool-article): Get the right
+ servers.
+
+Wed Nov 6 04:00:48 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnheader.el (nnheader-header-value): Use old definition.
+
+ * message.el: Removed many autoloads.
+
+Wed Nov 6 03:44:44 1996 ISO-2022-JP <morioka@jaist.ac.jp>
+
+ * gnus-ems.el (gnus-ems-redefine): New Mule definition.
+
+Wed Nov 6 03:02:25 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-xmas.el (gnus-xmas-summary-recenter): Force redisplay.
+
+ * gnus.el (gnus-check-backend-function): Protect against errors.
+
+ * gnus-start.el (gnus-group-change-level): Enter info into dribble
+ file.
+
+Wed Nov 6 01:58:46 1996 Hrvoje Niksic <hniksic@srce.hr>
+
+ * article.el (gnus-emphasis-alist): New default.
+
+Wed Nov 6 01:47:17 1996 Joe Wells <jbw@cs.bu.edu>
+
+ * gnus-uu.el (gnus-uu-reginize-string): Buggy.
+ (gnus-uu-uustrip-article): Temp name mixup.
+
+Wed Nov 6 01:27:54 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-group.el (gnus-group-make-group): Use new function.
+
+ * gnus.el (gnus-read-group): New function.
+
+ * dgnushack.el: Less error messages under XEmacs.
+
+Tue Nov 5 23:59:40 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnmail.el (nnmail-search-unix-mail-delim): New implementation.
+
+Tue Nov 5 23:43:34 1996 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Red Gnus v0.54 is released.
+
Tue Nov 5 22:34:01 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* message.el (message-goto-signature): Place point better.
:group 'article)
(defcustom gnus-emphasis-alist
- '(("_\\(\\w+\\)_" 0 1 underline)
- ("\\W\\(/\\(\\w+\\)/\\)\\W" 1 2 italic)
- ("\\(_\\*\\|\\*_\\)\\(\\w+\\)\\(_\\*\\|\\*_\\)" 0 2 bold-underline)
- ("\\*\\(\\w+\\)\\*" 0 1 bold))
+ '(("\\(\\s-\\|^\\)\\(_\\(\\w+\\(\\s-+\\w+\\)*\\)_\\)\\(\\s-\\|[?!.,;]\\)" 2 3 underline)
+ ("\\(\\s-\\|^\\)\\(\\*\\(\\w+\\(\\s-+\\w+\\)*\\)\\*\\)\\(\\s-\\|[?!.,;]\\)" 2 3 bold)
+ ("\\(\\s-\\|^\\)\\(\\(\\*_\\|_\\*\\)\\(\\w+\\(\\s-+\\w+\\)*\\)\\(\\*_\\|_\\*\\)\\)\\(\\s-\\|[?!.,;]\\)" 2 4 bold-underline)
+ ("\\(\\s-\\|^\\)\\(/\\(\\w+\\)/\\)\\s-" 2 3 italic))
"Alist that says how to fontify certain phrases.
Each item looks like this:
(narrow-to-region (match-beginning 0) (match-end 0))
(delete-region (point-min) (point-max))
(insert string)
- (article-mime-decode-quoted-printable (goto-char (point-min))
- (point-max))
+ (article-mime-decode-quoted-printable
+ (goto-char (point-min)) (point-max))
(subst-char-in-region (point-min) (point-max) ?_ ? )
(goto-char (point-max)))
(when (looking-at "\\([ \t\n]+\\)=\\?")
(let (buffer-read-only)
(goto-char (point-min))
(when (search-forward "\n\n" nil t)
- (while (looking-at "[ \t]$")
+ (while (looking-at "[ \t]*$")
(gnus-delete-line))))))
(defun article-strip-multiple-blank-lines ()
(defalias 'efs-re-read-dir 'ignore)
(defalias 'ange-ftp-re-read-dir 'ignore)
+(eval-and-compile
+ (unless (string-match "XEmacs" emacs-version)
+ (fset 'get-popup-menu-response 'ignore)
+ (fset 'event-object 'ignore)
+ (fset 'x-defined-colors 'ignore)
+ (fset 'read-color 'ignore)))
+
(defun dgnushack-compile ()
;;(setq byte-compile-dynamic t)
(let ((files (directory-files "." nil ".el$"))
(item :tag "skip" nil)
(face :value default)))))
+(defvar gnus-article-mode-syntax-table
+ (copy-syntax-table text-mode-syntax-table)
+ "Syntax table used in article mode buffers.
+Initialized from `text-mode-syntax-table.")
+
;;; Internal variables
(defvar gnus-article-mode-line-format-alist
(gnus-set-default-directory)
(buffer-disable-undo (current-buffer))
(setq buffer-read-only t)
+ (set-syntax-table gnus-article-mode-syntax-table)
(run-hooks 'gnus-article-mode-hook))
(defun gnus-article-setup-buffer ()
(provide 'gnus-art)
+(run-hooks 'gnus-art-load-hook)
+
;;; gnus-art.el ends here
((string-match "XEmacs\\|Lucid" emacs-version)
(gnus-xmas-redefine))
- ((boundp 'MULE)
- ;; Mule definitions
+ ((featurep 'mule)
+ ;; Mule and new Emacs definitions
+
+ ;; [Note] Now there are three kinds of mule implementations,
+ ;; original MULE, XEmacs/mule and beta version of Emacs including
+ ;; some mule features. Unfortunately these API are different. In
+ ;; particular, Emacs (including original MULE) and XEmacs are
+ ;; quite different.
+ ;; Predicates to check are following:
+ ;; (boundp 'MULE) is t only if MULE (original; anything older than
+ ;; Mule 2.3) is running.
+ ;; (featurep 'mule) is t when every mule variants are running.
+
+ ;; These implementations may be able to share between original
+ ;; MULE and beta version of new Emacs. In addition, it is able to
+ ;; detect XEmacs/mule by (featurep 'mule) and to check variable
+ ;; `emacs-version'. In this case, implementation for XEmacs/mule
+ ;; may be able to share between XEmacs and XEmacs/mule.
+
(defalias 'gnus-truncate-string 'truncate-string)
(defvar gnus-summary-display-table nil
(or (gnus-gethash gnus-tmp-group gnus-description-hashtb) "")
""))
(gnus-tmp-moderated
- (if (gnus-gethash gnus-tmp-group gnus-moderated-hashtb) ?m ? ))
+ (if (and gnus-moderated-hashtb
+ (gnus-gethash gnus-tmp-group gnus-moderated-hashtb))
+ ?m ? ))
(gnus-tmp-moderated-string
(if (eq gnus-tmp-moderated ?m) "(m)" ""))
(gnus-tmp-method
(defun gnus-group-universal-argument (arg &optional groups func)
"Perform any command on all groups according to the process/prefix convention."
(interactive "P")
- (let ((groups (or groups (gnus-group-process-prefix arg))))
- (if (eq (setq func (or func
- (key-binding
- (read-key-sequence
- (substitute-command-keys
- "\\<gnus-group-mode-map>\\[gnus-group-universal-argument]")))))
- 'undefined)
- (gnus-error 1 "Undefined key")
- (while groups
- (gnus-group-remove-mark (pop groups))
+ (if (eq (setq func (or func
+ (key-binding
+ (read-key-sequence
+ (substitute-command-keys
+ "\\<gnus-group-mode-map>\\[gnus-group-universal-argument]")))))
+ 'undefined)
+ (gnus-error 1 "Undefined key")
+ (gnus-group-iterate arg
+ (lambda (group)
(command-execute func))))
(gnus-group-position-point))
(let ((group (gnus-group-group-name)))
(and group (list group))))))
+(defun gnus-group-iterate (arg function)
+ "Iterate FUNCTION over all process/prefixed groups.
+FUNCTION will be called with the group name as the paremeter
+and with point over the group in question."
+ (let ((groups (gnus-group-process-prefix arg))
+ group)
+ (while (setq group (pop groups))
+ (gnus-group-remove-mark group)
+ (funcall function group))))
+
+(put 'gnus-group-iterate 'lisp-indent-function 1)
+
;; Selecting groups.
(defun gnus-group-read-group (&optional all no-article group)
ADDRESS."
(interactive
(list
- (read-string "Group name: ")
+ (gnus-read-group "Group name: ")
(gnus-read-method "From method: ")))
(let* ((meth (when (and method
(interactive "P")
(require 'nnweb)
(let* ((group
- (if solid (read-string "Group name: ") (message-unique-id)))
+ (if solid (gnus-read-group "Group name: ")
+ (message-unique-id)))
(type
(completing-read
"Search engine type: "
;;; Clearing data
-(defun gnus-group-clear-data (n)
+(defun gnus-group-clear-data (&optional arg)
"Clear all marks and read ranges from the current group."
(interactive "P")
- (let ((groups (gnus-group-process-prefix n))
- group info)
- (while (setq group (pop groups))
- (gnus-info-clear-data (setq info (gnus-get-info group)))
- (gnus-get-unread-articles-in-group info (gnus-active group) t)
- (when (gnus-group-goto-group group)
- (gnus-group-remove-mark group)
- (gnus-group-update-group-line)))))
+ (gnus-group-iterate arg
+ (lambda (group)
+ (let (info)
+ (gnus-info-clear-data (setq info (gnus-get-info group)))
+ (gnus-get-unread-articles-in-group info (gnus-active group) t)
+ (when (gnus-group-goto-group group)
+ (gnus-group-update-group-line))))))
(defun gnus-group-clear-data-on-native-groups ()
"Clear all marks and read ranges from all native groups."
(require 'gnus)
(require 'nnmail)
(require 'gnus-art)
+(require 'gnus-sum)
(require 'gnus-range)
(defgroup gnus-nocem nil
* A function
The result of this function will be used as the home score file.
+ The function will be passed the name of the group as its
+ parameter.
* A list
The elements in this list can be:
* A function.
If the function returns non-nil, the result will be used
- as the home score file.
+ as the home score file. The function will be passed the
+ name of the group as its parameter.
- * A string.
- Use the string as the home score file.
+ * A string. Use the string as the home score file.
The list will be traversed from the beginning towards the end looking
for matches.")
(if (looking-at "not.")
(progn
(setq not-match t)
- (setq regexp (buffer-substring 5 (point-max))))
- (setq regexp (buffer-substring 1 (point-max)))
+ (setq regexp (concat "^" (buffer-substring 5 (point-max)))))
+ (setq regexp (concat "^" (buffer-substring 1 (point-max))))
(setq not-match nil))
;; Finally - if this resulting regexp matches the group name,
;; we add this score file to the list of score files
(gnus-sethash group (cons num previous)
gnus-newsrc-hashtb))
(when (cdr entry)
- (setcdr (gnus-gethash (caadr entry) gnus-newsrc-hashtb) entry)))))
+ (setcdr (gnus-gethash (caadr entry) gnus-newsrc-hashtb) entry))
+ (gnus-dribble-enter
+ (format
+ "(gnus-group-set-info '%s)" info)))))
(when gnus-group-change-level-function
(funcall gnus-group-change-level-function group level oldlevel)))))
(set-buffer gnus-article-buffer)
(setq gnus-summary-buffer summary))))))
+(defun gnus-summary-first-article-p (&optional article)
+ "Return whether ARTICLE is the first article in the buffer."
+ (if (not (setq article (or article (gnus-summary-article-number))))
+ nil
+ (eq article (caar gnus-newsgroup-data))))
+
(defun gnus-summary-last-article-p (&optional article)
"Return whether ARTICLE is the last article in the buffer."
(if (not (setq article (or article (gnus-summary-article-number))))
- t ; All non-existent numbers are the last article. :-)
+ t ; All non-existent numbers are the last article. :-)
(not (cdr (gnus-data-find-list article)))))
(defun gnus-make-thread-indent-array ()
(defun gnus-summary-next-unread-article ()
"Select unread article after current one."
(interactive)
- (gnus-summary-next-article t (and gnus-auto-select-same
- (gnus-summary-article-subject))))
+ (gnus-summary-next-article
+ (or (not (eq gnus-summary-goto-unread 'never))
+ (gnus-summary-last-article-p (gnus-summary-article-number)))
+ (and gnus-auto-select-same
+ (gnus-summary-article-subject))))
(defun gnus-summary-prev-article (&optional unread subject)
"Select the article after the current one.
(defun gnus-summary-prev-unread-article ()
"Select unread article before current one."
(interactive)
- (gnus-summary-prev-article t (and gnus-auto-select-same
- (gnus-summary-article-subject))))
+ (gnus-summary-prev-article
+ (or (not (eq gnus-summary-goto-unread 'never))
+ (gnus-summary-first-article-p (gnus-summary-article-number)))
+ (and gnus-auto-select-same
+ (gnus-summary-article-subject))))
(defun gnus-summary-next-page (&optional lines circular)
"Show next page of the selected article.
methods nil t nil 'gnus-mail-method-history))
ms)
(cond
- ((zerop (length (setq ms (gnus-servers-using-backend method))))
+ ((zerop (length (setq ms (gnus-servers-using-backend
+ (intern method)))))
(list (intern method) ""))
((= 1 (length ms))
(car ms))
(t
- (cdr (completing-read
- "Server name: "
- (mapcar (lambda (m) (cons (cadr m) m)) ms) nil t)))))))
+ (let ((ms-alist (mapcar (lambda (m) (cons (cadr m) m)) ms)))
+ (cdr (assoc (completing-read "Server name: " ms-alist nil t)
+ ms-alist))))))))
(gnus-set-global-variables)
(unless method
(error "No method given for respooling"))
(provide 'gnus-sum)
+(run-hooks 'gnus-sum-load-hook)
+
;;; gnus-sum.el ends here
(gnus-topic-goto-topic start-topic))
(gnus-group-list-groups)))
-(defun gnus-topic-remove-group ()
+(defun gnus-topic-remove-group (&optional arg)
"Remove the current group from the topic."
- (interactive)
- (let ((topicl (assoc (gnus-current-topic) gnus-topic-alist))
- (group (gnus-group-group-name))
- (buffer-read-only nil))
- (when (and topicl group)
- (gnus-delete-line)
- (gnus-delete-first group topicl))
- (gnus-topic-update-topic)
- (gnus-group-position-point)))
+ (interactive "P")
+ (gnus-group-iterate arg
+ (lambda (group)
+ (let ((topicl (assoc (gnus-current-topic) gnus-topic-alist))
+ (buffer-read-only nil))
+ (when (and topicl group)
+ (gnus-delete-line)
+ (gnus-delete-first group topicl))
+ (gnus-topic-update-topic)
+ (gnus-group-position-point)))))
(defun gnus-topic-copy-group (n topic)
"Copy the current group to a topic."
(replace-match "[0-9]+ of [0-9]+")
(end-of-line)
- (while (and (re-search-backward "[0-9]" nil t) (> count 0))
- (while (and
- (looking-at "[0-9]")
- (< 1 (goto-char (1- (point))))))
- (re-search-forward "[0-9]+" nil t)
- (replace-match "[0-9]+")
- (backward-char 5)
- (setq count (1- count)))))
-
+ (if (re-search-backward "\\([^0-9]\\)[0-9]+\\([^0-9]+\\)[0-9]+"
+ nil t)
+ (replace-match "\\1[0-9]+\\2[0-9]+" t nil nil nil))))
+
(goto-char beg)
(while (re-search-forward "[ \t]+" nil t)
(replace-match "[ \t]*" t t))
(let ((nnheader-file-name-translation-alist
'((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_))))
(nnheader-translate-file-chars (match-string 1))))
+ (replace-match (concat "begin 644 " gnus-uu-file-name) t t)
;; Remove any non gnus-uu-body-line right after start.
(forward-line 1)
(delete-other-windows)
;; This is a `frame' split, so we delete all windows
;; on all frames.
- (mapcar
- (lambda (frame)
- (unless (eq (cdr (assq 'minibuffer
- (frame-parameters frame)))
- 'only)
- (select-frame frame)
- (delete-other-windows)))
- (frame-list)))
+ (gnus-delete-windows-in-gnusey-frames))
;; Just remove some windows.
(gnus-remove-some-windows)
(switch-to-buffer nntp-server-buffer))
(switch-to-buffer nntp-server-buffer)
(gnus-configure-frame split (get-buffer-window (current-buffer))))))
+(defun gnus-delete-windows-in-gnusey-frames ()
+ "Do a `delete-other-windows' in all frames that have Gnus windows."
+ (let ((buffers
+ (mapcar
+ (lambda (elem)
+ (if (symbolp (cdr elem))
+ (get-buffer (symbol-value (cdr elem)))
+ (get-buffer (cdr elem))))
+ gnus-window-to-buffer)))
+ (mapcar
+ (lambda (frame)
+ (unless (eq (cdr (assq 'minibuffer
+ (frame-parameters frame)))
+ 'only)
+ (select-frame frame)
+ (let (do-delete)
+ (walk-windows
+ (lambda (window)
+ (when (memq (window-buffer window) buffers)
+ (setq do-delete t))))
+ (when do-delete
+ (delete-other-windows)))))
+ (frame-list))))
+
(defun gnus-all-windows-visible-p (split)
"Say whether all buffers in SPLIT are currently visible.
In particular, the value returned will be the window that
displayed, no centering will be performed."
;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle).
;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu.
+ ;; Force redisplay to get properly computed window height.
+ (sit-for 0)
(when gnus-auto-center-summary
(let* ((height (if (fboundp 'window-displayed-height)
(window-displayed-height)
"Score and kill file handling."
:group 'gnus )
-(defconst gnus-version-number "0.54"
+(defconst gnus-version-number "0.55"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
;; Variable holding the user answers to all method prompts.
(defvar gnus-method-history nil)
+(defvar gnus-group-history nil)
;; Variable holding the user answers to all mail method prompts.
(defvar gnus-mail-method-history nil)
(defun gnus-check-backend-function (func group)
"Check whether GROUP supports function FUNC."
- (let ((method (if (stringp group) (car (gnus-find-method-for-group group))
- group)))
- (unless (featurep method)
- (require method))
- (fboundp (intern (format "%s-%s" method func)))))
+ (condition-case ()
+ (let ((method (if (stringp group)
+ (car (gnus-find-method-for-group group))
+ group)))
+ (unless (featurep method)
+ (require method))
+ (fboundp (intern (format "%s-%s" method func))))
+ (error nil)))
(defun gnus-methods-using (feature)
"Find all methods that have FEATURE."
(setq valids (cdr valids)))
outs))
+(defun gnus-read-group (prompt)
+ "Prompt the user for a group name.
+Disallow illegal group names."
+ (let ((prefix "")
+ group)
+ (while (not group)
+ (when (string-match
+ "[ `'\"/]"
+ (setq group (read-string (concat prefix prompt)
+ "" 'gnus-group-history)))
+ (setq prefix (format "Illegal group name: \"%s\". " group)
+ group nil)))
+ group))
+
(defun gnus-read-method (prompt)
"Prompt the user for a method.
Allow completion over sensible values."
article in. The default function is `rmail-output' which saves in Unix
mailbox format.")
-;;;###autoload
(defvar message-courtesy-message
"The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n"
"*This is inserted at the start of a mailed copy of a posted message.
the article has been posted to will be inserted there.
If this variable is nil, no such courtesy message will be added.")
-;;;###autoload
(defvar message-ignored-bounced-headers "^\\(Received\\|Return-Path\\):"
"*Regexp that matches headers to be removed in resent bounced mail.")
Otherwise, most addresses look like `angles', but they look like
`parens' if `angles' would need quoting and `parens' would not.")
-;;;###autoload
(defvar message-syntax-checks nil
"Controls what syntax checks should not be performed on outgoing posts.
To disable checking of long signatures, for instance, add
approved sender empty empty-headers message-id from subject
shorten-followup-to existing-newsgroups.")
-;;;###autoload
(defvar message-required-news-headers
'(From Newsgroups Subject Date Message-ID
(optional . Organization) Lines
X-Newsreader are optional. If don't you want message to insert some
header, remove it from this list.")
-;;;###autoload
(defvar message-required-mail-headers
'(From Subject Date (optional . In-Reply-To) Message-ID Lines
(optional . X-Mailer))
RFC822 required that From, Date, To, Subject and Message-ID be
included. Organization, Lines and X-Mailer are optional.")
-;;;###autoload
(defvar message-deletable-headers '(Message-ID Date Lines)
"*Headers to be deleted if they already exist and were generated by message previously.")
-;;;###autoload
(defvar message-ignored-news-headers
"^NNTP-Posting-Host:\\|^Xref:\\|^Bcc:\\|^Gcc:\\|^Fcc:\\|^Resent-Fcc:"
"*Regexp of headers to be removed unconditionally before posting.")
-;;;###autoload
(defvar message-ignored-mail-headers "^Gcc:\\|^Fcc:\\|^Resent-Fcc:"
"*Regexp of headers to be removed unconditionally before mailing.")
-;;;###autoload
(defvar message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|Return-Path:\\|^Supersedes:"
"*Header lines matching this regexp will be deleted before posting.
It's best to delete old Path and Date headers before posting to avoid
(defvar message-signature-separator "^-- *$"
"Regexp matching the signature separator.")
-;;;###autoload
(defvar message-interactive nil
"Non-nil means when sending a message wait for and display errors.
nil means let mailer mail back a message to report errors.")
-;;;###autoload
(defvar message-generate-new-buffers t
"*Non-nil means that a new message buffer will be created whenever `mail-setup' is called.
If this is a function, call that function with three parameters: The type,
the to address and the group name. (Any of these may be nil.) The function
should return the new buffer name.")
-;;;###autoload
(defvar message-kill-buffer-on-exit nil
"*Non-nil means that the message buffer will be killed after sending a message.")
"------- End of forwarded message -------\n"
"*Delimiter inserted after forwarded messages.")
-;;;###autoload
(defvar message-signature-before-forwarded-message t
"*If non-nil, put the signature before any included forwarded message.")
-;;;###autoload
(defvar message-included-forward-headers
"^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:"
"*Regexp matching headers to be included in forwarded messages.")
-;;;###autoload
(defvar message-ignored-resent-headers "^Return-receipt"
"*All headers that match this regexp will be deleted when resending a message.")
-;;;###autoload
(defvar message-ignored-cited-headers "."
"*Delete these headers from the messages you yank.")
Legal values include `message-send-mail-with-sendmail' (the default),
`message-send-mail-with-mh' and `message-send-mail-with-qmail'.")
-;;;###autoload
(defvar message-send-news-function 'message-send-news
"Function to call to send the current buffer as news.
The headers should be delimited by a line whose contents match the
variable `mail-header-separator'.")
-;;;###autoload
(defvar message-reply-to-function nil
"Function that should return a list of headers.
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers.")
-;;;###autoload
(defvar message-wide-reply-to-function nil
"Function that should return a list of headers.
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers.")
-;;;###autoload
(defvar message-followup-to-function nil
"Function that should return a list of headers.
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers.")
-;;;###autoload
(defvar message-use-followup-to 'ask
"*Specifies what to do with Followup-To header.
If nil, ignore the header. If it is t, use its value, but query before
(defvar gnus-post-method)
(defvar gnus-select-method)
-;;;###autoload
(defvar message-post-method
(cond ((and (boundp 'gnus-post-method)
gnus-post-method)
(t '(nnspool "")))
"Method used to post news.")
-;;;###autoload
(defvar message-generate-headers-first nil
"*If non-nil, generate all possible headers before composing.")
(defvar message-postpone-actions nil
"A list of actions to be performed after postponing a message.")
-;;;###autoload
(defvar message-default-headers nil
"*A string containing header lines to be inserted in outgoing messages.
It is inserted before you edit the message, so you can edit or delete
these lines.")
-;;;###autoload
(defvar message-default-mail-headers nil
"*A string of header lines to be inserted in outgoing mails.")
-;;;###autoload
(defvar message-default-news-headers nil
"*A string of header lines to be inserted in outgoing news articles.")
;; Parsing headers and NOV lines.
(defsubst nnheader-header-value ()
- (buffer-substring
- (match-end 0)
- (if (re-search-forward "^[^ \t]" nil 'move)
- (- (point) 2)
- (1- (point)))))
+ (buffer-substring (match-end 0) (gnus-point-at-eol)))
(defvar nnheader-newsgroup-none-id 1)
(defun nnmail-date-to-time (date)
"Convert DATE into time."
- (let* ((d1 (timezone-parse-date date))
- (t1 (timezone-parse-time (aref d1 3))))
- (apply 'encode-time
- (mapcar (lambda (el)
- (and el (string-to-number el)))
- (list
- (aref t1 2) (aref t1 1) (aref t1 0)
- (aref d1 2) (aref d1 1) (aref d1 0)
- (aref d1 4))))))
+ (condition-case ()
+ (let* ((d1 (timezone-parse-date date))
+ (t1 (timezone-parse-time (aref d1 3))))
+ (apply 'encode-time
+ (mapcar (lambda (el)
+ (and el (string-to-number el)))
+ (list
+ (aref t1 2) (aref t1 1) (aref t1 0)
+ (aref d1 2) (aref d1 1) (aref d1 0)
+ (aref d1 4)))))
+ ;; If we get an error, then we just return a 0 time.
+ (error (list 0 0))))
(defun nnmail-time-less (t1 t2)
"Say whether time T1 is less than time T2."
(goto-char end))))
(defun nnmail-search-unix-mail-delim ()
- "Put point at the beginning of the next message."
- (let ((case-fold-search t)
- (delim (concat "^" message-unix-mail-delimiter))
- found search )
+ "Put point at the beginning of the next Unix mbox message."
+ ;; Algorithm used to find the the next article in the
+ ;; brain-dead Unix mbox format:
+ ;;
+ ;; 1) Search for "^From ".
+ ;; 2) If we find it, then see whether the previous
+ ;; line is blank and the next line looks like a header.
+ ;; Then it's possible that this is a mail delim, and we use it.
+ (let ((case-fold-search nil)
+ found)
(while (not found)
- (setq search (condition-case ()
- (re-search-forward delim nil t)
- (error 'error)))
- (cond
- ((eq search 'error)
- (setq found 'yes))
- (search
- (when (or (looking-at "[^\n :]+ *:")
- (looking-at delim)
- (looking-at (concat ">" message-unix-mail-delimiter)))
- (forward-line -1)
- (setq found 'yes)))
- (t
- (setq found 'no))))
+ (if (not (re-search-forward "^From " nil t))
+ (setq found 'no)
+ (beginning-of-line)
+ (when (and (or (bobp)
+ (save-excursion
+ (forward-line -1)
+ (= (following-char) ?\n)))
+ (save-excursion
+ (forward-line 1)
+ (looking-at "[^ \t:]+[ \t]*:")))
+ (setq found 'yes))))
(eq found 'yes)))
(defun nnmail-process-unix-mail-format (func artnum-func)
- (let ((case-fold-search t)
- (delim (concat "^" message-unix-mail-delimiter))
+ (let ((case-fold-search nil)
start message-id content-length end skip head-end)
(goto-char (point-min))
- (if (not (and (re-search-forward delim nil t)
+ (if (not (and (re-search-forward "^From " nil t)
(goto-char (match-beginning 0))))
;; Possibly wrong format?
(error "Error, unknown mail format! (Possibly corrupted.)")
(cond ((or (= skip (point-max))
(= (1+ skip) (point-max)))
(setq end (point-max)))
- ((looking-at delim)
+ ((looking-at "From ")
(setq end skip))
- ((looking-at
- (concat "[ \t]*\n\\(" delim "\\)"))
+ ((looking-at "[ \t]*\n\\(From \\)")
(setq end (match-beginning 1)))
(t (setq end nil))))
(if end
(set-buffer nntp-server-buffer)
(nntp-read-server-type)
(run-hooks 'nntp-server-opened-hook)
- (set-buffer pbuffer)
+ (set-buffer buffer)
(erase-buffer)))
(when (buffer-name (process-buffer process))
(kill-buffer (process-buffer process)))
(let ((entry (nntp-find-connection-entry nntp-server-buffer)))
(when (not (equal group (caddr entry)))
(nntp-request-group group)
- (erase-buffer)))))
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer))))))
(defun nntp-decode-text (&optional cr-only)
"Decode the text in the current buffer."
+Wed Nov 6 06:39:44 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Misc Article): Addition.
+ (Emacsen): Updated.
+
+Wed Nov 6 03:52:05 1996 C. R. Oldham <cro@nca.asu.edu>
+
+ * Makefile (.texi.dvi): Fix rule.
+
Tue Nov 5 10:45:39 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi (Other Decode Variables): Addition.
.texi.dvi :
$(PERL) -n -e 'print unless (/\@iflatex/ .. /\@end iflatex/)' $< > gnustmp.texi
$(TEXI2DVI) gnustmp.texi
+ cp gnustmp.dvi $*.dvi
+ rm gnustmp.*
refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex
$(LATEX) refcard.tex
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Red Gnus 0.54 Manual
+@settitle Red Gnus 0.55 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Red Gnus 0.54 Manual
+@title Red Gnus 0.55 Manual
@author by Lars Magne Ingebrigtsen
@page
@lisp
(setq gnus-group-highlight
- `(((> unread 200) .
- ,(custom-face-lookup "Red" nil nil t nil nil))
- ((and (< level 3) (zerop unread)) .
- ,(custom-face-lookup "SeaGreen" nil nil t nil nil))
- ((< level 3) .
- ,(custom-face-lookup "SpringGreen" nil nil t nil nil))
- ((zerop unread) .
- ,(custom-face-lookup "SteelBlue" nil nil t nil nil))
- (t .
- ,(custom-face-lookup "SkyBlue" nil nil t nil nil))
- ))
+ `(((> unread 200) .
+ ,(custom-face-lookup "Red" nil nil t nil nil))
+ ((and (< level 3) (zerop unread)) .
+ ,(custom-face-lookup "SeaGreen" nil nil t nil nil))
+ ((< level 3) .
+ ,(custom-face-lookup "SpringGreen" nil nil t nil nil))
+ ((zerop unread) .
+ ,(custom-face-lookup "SteelBlue" nil nil t nil nil))
+ (t .
+ ,(custom-face-lookup "SkyBlue" nil nil t nil nil))))
@end lisp
Variables that are dynamically bound when the forms are evaluated
@end table
@item comment
-This parameter allows you to enter an arbitrary comment on the group.
+Elements that look like @code{(comment . "This is a comment")}
+are arbitrary comments on the group. They are currently ignored by
+Gnus, but provide a place for you to store information on particular
+groups.
@item @var{(variable form)}
You can use the group parameters to set variables local to the group you
"Return non-nil for short, unread articles."
(and (gnus-data-unread-p data)
(< (mail-header-lines (gnus-data-header data))
- 100)))
+ 100)))
(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
@end lisp
@vindex gnus-article-mode-hook
Hook called in article mode buffers.
+@item gnus-article-mode-syntax-table
+@vindex gnus-article-mode-syntax-table
+Syntax table used in article buffers. It is initialized from
+@code{text-mode-syntax-table}.
+
@vindex gnus-article-mode-line-format
@item gnus-article-mode-line-format
This variable is a format string along the same lines as
@itemize @bullet
@item
-Emacs 19.30 and up.
+Emacs 19.32 and up.
@item
-XEmacs 19.13 and up.
+XEmacs 19.14 and up.
@item
-Mule versions based on Emacs 19.30 and up.
+Mule versions based on Emacs 19.32 and up.
@end itemize
Gnus will absolutely not work on any Emacsen older than that. Not
reliably, at least.
-There are some vague differences between Gnus on the various platforms:
-
-@itemize @bullet
-
-@item
-The mouse-face on Gnus lines under Emacs and Mule is delimited to
-certain parts of the lines while they cover the entire line under
-XEmacs.
-
-@item
-The same with current-article marking---XEmacs puts an underline under
-the entire summary line while Emacs and Mule are nicer and kinder.
-
-@item
-XEmacs features more graphics---a logo and a toolbar.
-
-@item
-Citation highlighting us better under Emacs and Mule than under XEmacs.
-
-@item
-Emacs 19.26-19.28 have tangible hidden headers, which can be a bit
-confusing.
-
-@end itemize
+There are some vague differences between Gnus on the various
+platforms---XEmacs features more graphics (a logo and a toolbar)---but
+other than that, things should look pretty much the same under all
+Emacsen.
@node Contributors
Morioka Tomohiko, @c Morioka
Hrvoje Niksic,
Andy Norman,
+C. R. Oldham,
Alexandre Oliva,
Ken Olstad,
Masaharu Onishi, @c Onishi
Colin Rafferty,
Bart Robinson,
Ralph Schleicher,
+Randal L. Schwartz,
Danny Siu,
Paul D. Smith,
Jeff Sparkes,
and
Katsumi Yamaoka. @c Yamaoka
+
Apologies to everybody that I've forgotten, of which there are many, I'm
sure.