+Thu Nov 14 12:25:23 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.el (gnus-article-display-hook): Add
+ `gnus-article-de-quoted-unreadable' to default value.
+
+ * gnus-art.el (gnus-summary-article-menu): Dummy define.
+
+ * article.el (custom): Require first.
+
+ * dgnushack.el (require): New implementation.
+
+ * article.el (gnus-emphasis-alist): Recognize emphasis inside
+ quotes.
+
+Thu Nov 14 10:20:44 1996 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * nnmail.el (nnmail-split-abbrev-alist): Added `uucp' to `mail'.
+
+Thu Nov 14 11:25:51 1996 Samuel Tardieu <sam@inf.enst.fr>
+
+ * nnmail.el (nnmail-search-unix-mail-delim): Skip past ">From "
+ after "From ".
+
+Thu Nov 14 10:08:27 1996 Raja R. Harinath <harinath@cs.umn.edu>
+
+ * gnus-gl.el (bbb-connect-to-bbbd): Only connect if we have the
+ token.
+
+Thu Nov 14 08:46:31 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * message.el (message-insert-to): Deny with "never"
+ courtesy-copies-to header.
+
+ * dgnushack.el (require): Try both the uncompiled and the compiled
+ versions.
+
+ * nntp.el (nntp-send-authinfo): Hide password.
+
+Wed Nov 13 12:00:43 1996 David Moore <dmoore@ucsd.edu>
+
+ * gnus-start.el (gnus-parse-active): Correct range parsing
+ restored.
+
+Tue Nov 12 14:09:15 1996 David Moore <dmoore@ucsd.edu>
+
+ * gnus-nocem.el (gnus-nocem-enter-article): Don't store the same
+ message id in the cache twice.
+ (gnus-nocem-liberal-fetch):
+
+ * gnus-nocem.el (gnus-nocem-liberal-fetch): New Variable.
+
+ * gnus-nocem.el (gnus-nocem-check-article,
+ gnus-nocem-scan-groups): Don't re-fetch a crossposted @@NCM
+ posting that we've alread verified and scanned.
+
+Wed Nov 13 23:38:00 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-start.el (gnus-parse-active): Gave wrong results.
+
+ * gnus-win.el (gnus-buffer-configuration): Doc fix.
+
+Wed Nov 13 13:52:20 1996 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus-topic.el: Added customize support.
+
+ * gnus-group.el (gnus-group-mode-hook): Added `gnus-topic-mode'
+ option.
+
+ * gnus-util.el (gnus-verbose): Made customizable.
+
+ * gnus.el (gnus-summary-line-format): Customize.
+
+ * gnus-sum.el (gnus-summary-respool-default-method): Customize.
+
+ * gnus.el (gnus-select-method-name): New widget.
+ (gnus-select-method): Use it.
+
+Wed Nov 13 14:19:48 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-group.el (gnus-info-clear-data): Quote lists.
+
+ * nntp.el (nntp-send-authinfo): Prompt right.
+
+Tue Nov 12 19:33:00 1996 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Red Gnus v0.61 is released.
+
Tue Nov 12 17:55:17 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnmail.el (nnmail-move-inbox): Delete empty crash box.
+
+ * gnus-art.el (gnus-article-make-menu-bar): Define summary article
+ map.
+
* gnus-group.el (gnus-group-set-timestamp): Removed reference to
free variable `group'.
;;; Code:
+(require 'custom)
(require 'nnheader)
(require 'gnus-util)
(require 'message)
-(require 'custom)
(defgroup article nil
"Article display."
(defcustom gnus-emphasis-alist
(let ((format
- "\\(\\s-\\|^\\)\\(%s\\(\\w+\\(\\s-+\\w+\\)*\\)%s\\)\\(\\s-\\|[?!.,;:\")]\\)")
+ "\\(\\s-\\|^\\|[\"\(]\\)\\(%s\\(\\w+\\(\\s-+\\w+\\)*\\)%s\\)\\(\\s-\\|[?!.,;:\"\)]\\)")
(types
'(("_" "_" underline)
("/" "/" italic)
(defalias 'efs-re-read-dir 'ignore)
(defalias 'ange-ftp-re-read-dir 'ignore)
-(defadvice require (before require-avoid-compiled activate)
- ;; (feature filename)
+(fset 'orig-require (symbol-function 'require))
+
+(defun require (package &optional file)
"Avoid loading .elc files."
- ;; Ensure a second argument to require is supplied that explicitly
- ;; specifies loading the .el version of the file.
- (let ((filename (ad-get-arg 1)))
- (or filename (setq filename (symbol-name (ad-get-arg 0))))
- (save-match-data
- (cond ((string-match "\\.el\\'" filename)
- nil)
- ((string-match "\\.elc\\'" filename)
- (setq filename (replace-match ".el" t t filename)))
- (t
- (setq filename (concat filename ".el")))))
- (ad-set-arg 1 filename)))
+ (let ((filename (concat (symbol-name package) ".el")))
+ (condition-case err
+ (orig-require package filename)
+ (error
+ (orig-require package)))))
(eval-and-compile
(unless (string-match "XEmacs" emacs-version)
(let ((files (directory-files "." nil ".el$"))
(xemacs (string-match "XEmacs" emacs-version))
;;(byte-compile-generate-call-tree t)
- byte-compile-warnings file)
+ byte-compile-warnings file elc)
(condition-case ()
(require 'w3-forms)
(error (setq files (delete "nnweb.el" files))))
"messagexmas.el" "nnheaderxm.el"
"smiley.el")))
xemacs)
- (when (or (not (file-exists-p (concat file "c")))
- (file-newer-than-file-p file (concat file "c")))
- (condition-case ()
- (byte-compile-file file)
- (error nil)))))))
+ (when (or (not (file-exists-p (setq elc (concat file "c"))))
+ (file-newer-than-file-p file elc))
+ (ignore-errors
+ (byte-compile-file file)))))))
(defun dgnushack-recompile ()
(require 'gnus)
(item :tag "skip" nil)
(face :value default)))))
+;;; Internal variables
+
(defvar gnus-article-mode-syntax-table
(let ((table (copy-syntax-table text-mode-syntax-table)))
;;(modify-syntax-entry ?_ "w" table)
"Syntax table used in article mode buffers.
Initialized from `text-mode-syntax-table.")
-;;; Internal variables
-
(defvar gnus-save-article-buffer nil)
(defvar gnus-article-mode-line-format-alist
(defalias 'gnus-decode-rfc1522 'article-decode-rfc1522)
+(defvar gnus-summary-article-menu)
+
;;; Saving functions.
(defun gnus-article-save (save-buffer file &optional num)
["Remove carriage return" gnus-article-remove-cr t]
["Remove quoted-unreadable" gnus-article-de-quoted-unreadable t]))
- (when nil
- (define-key gnus-article-mode-map
- (vector 'menu-bar (car gnus-summary-article-menu))
- gnus-summary-article-menu))
+ (define-key gnus-article-mode-map [Article] gnus-summary-article-menu)
(run-hooks 'gnus-article-menu-hook)))
;; if an old process is still running for some reason, kill it
(when grouplens-bbb-process
- (condition-case ()
- (when (eq 'open (process-status grouplens-bbb-process))
- (set-process-buffer grouplens-bbb-process nil)
- (delete-process grouplens-bbb-process))
- (error nil)))
+ (ignore-errors
+ (when (eq 'open (process-status grouplens-bbb-process))
+ (set-process-buffer grouplens-bbb-process nil)
+ (delete-process grouplens-bbb-process))))
;; clear the trace buffer of old output
(save-excursion
(defun bbb-logout ()
"logout of bbb session"
- (let ((bbb-process
- (bbb-connect-to-bbbd grouplens-bbb-host grouplens-bbb-port)))
- (if bbb-process
+ (when grouplens-bbb-token
+ (let ((bbb-process
+ (bbb-connect-to-bbbd grouplens-bbb-host grouplens-bbb-port)))
+ (when bbb-process
(save-excursion
(set-buffer (process-buffer bbb-process))
(bbb-send-command bbb-process (concat "logout " grouplens-bbb-token))
- (bbb-read-response bbb-process))
- nil)))
+ (bbb-read-response bbb-process))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Get Predictions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun bbb-put-ratings ()
- (if (and grouplens-rating-alist
+ (if (and grouplens-bbb-token
+ grouplens-rating-alist
(member gnus-newsgroup-name grouplens-newsgroups))
(let ((bbb-process (bbb-connect-to-bbbd grouplens-bbb-host
grouplens-bbb-port))
(defcustom gnus-group-mode-hook nil
"Hook for Gnus group mode."
:group 'gnus-group
+ :options '(gnus-topic-mode)
:type 'hook)
(defcustom gnus-group-menu-hook nil
(let ((group (gnus-info-group info)))
(gnus-undo-register
`(progn
- (gnus-info-set-marks ,info ,(gnus-info-marks info))
- (gnus-info-set-read ,info ,(gnus-info-read info))
+ (gnus-info-set-marks ',info ',(gnus-info-marks info))
+ (gnus-info-set-read ',info ',(gnus-info-read info))
(when (gnus-group-goto-group ,group)
(gnus-group-update-group-line))))
(gnus-info-set-read info nil)
:type '(radio (function-item mc-verify)
(function :tag "other")))
+(defcustom gnus-nocem-liberal-fetch nil
+ "*If t try to fetch all messages which have @@NCM in the subject.
+Otherwise don't fetch messages which have references or whose messsage-id
+matches an previously scanned and verified nocem message."
+ :group 'gnus-nocem
+ :type 'boolean)
+
;;; Internal variables
(defvar gnus-nocem-active nil)
(defvar gnus-nocem-alist nil)
(defvar gnus-nocem-touched-alist nil)
(defvar gnus-nocem-hashtb nil)
+(defvar gnus-nocem-seen-message-ids nil)
;;; Functions
;; headers.
(save-excursion
(let ((dependencies (make-vector 10 nil))
- headers)
+ headers header)
(nnheader-temp-write nil
(setq headers
(if (eq 'nov
(gnus-get-newsgroup-headers-xover
articles nil dependencies)
(gnus-get-newsgroup-headers dependencies)))
- (while headers
+ (while (setq header (pop headers))
;; We take a closer look on all articles that have
- ;; "@@NCM" in the subject.
- (when (string-match "@@NCM"
- (mail-header-subject (car headers)))
- (gnus-nocem-check-article group (car headers)))
- (setq headers (cdr headers)))))))
+ ;; "@@NCM" in the subject. Unless we already read
+ ;; this cross posted message. Nocem messages
+ ;; are not allowed to have references, so we can
+ ;; ignore scanning followups.
+ (and (string-match "@@NCM" (mail-header-subject header))
+ (or gnus-nocem-liberal-fetch
+ (and (string= "" (mail-header-references header))
+ (not (member (mail-header-message-id header)
+ gnus-nocem-seen-message-ids))))
+ (gnus-nocem-check-article group header)))))))
(setq gnus-nocem-active
(cons (list group gactive)
(delq (assoc group gnus-nocem-active)
(narrow-to-region b e)
(setq issuer (mail-fetch-field "issuer"))
(widen)
- (and (member issuer gnus-nocem-issuers) ; We like her...
- (gnus-nocem-verify-issuer issuer) ; She is who she says she is..
- (gnus-nocem-enter-article)))))) ; We gobble the message.
+ (and (member issuer gnus-nocem-issuers) ; We like her....
+ (gnus-nocem-verify-issuer issuer) ; She is who she says she is...
+ (gnus-nocem-enter-article) ; We gobble the message..
+ (push (mail-header-message-id header) ; But don't come back for
+ gnus-nocem-seen-message-ids)))))) ; second helpings.
+
(defun gnus-nocem-verify-issuer (person)
"Verify using PGP that the canceler is who she says she is."
(while (= (following-char) ?\t)
(forward-line -1))
(setq id (buffer-substring (point) (1- (search-forward "\t"))))
- (push id ncm)
- (gnus-sethash id t gnus-nocem-hashtb)
+ (unless (gnus-gethash id gnus-nocem-hashtb)
+ ;; only store if not already present
+ (gnus-sethash id t gnus-nocem-hashtb)
+ (push id ncm))
(forward-line 1)
(while (= (following-char) ?\t)
(forward-line 1))))))
(setq gnus-nocem-touched-alist t)
(push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
ncm)
- gnus-nocem-alist)))))
+ gnus-nocem-alist))
+ t)))
(defun gnus-nocem-load-cache ()
"Load the NoCeM cache."
(setq gnus-nocem-alist nil
gnus-nocem-hashtb nil
gnus-nocem-active nil
- gnus-nocem-touched-alist nil))
+ gnus-nocem-touched-alist nil
+ gnus-nocem-seen-message-ids nil))
(defun gnus-nocem-unwanted-article-p (id)
"Say whether article ID in the current group is wanted."
;; Parse the result we got from `gnus-request-group'.
(when (looking-at "[0-9]+ [0-9]+ \\([0-9]+\\) [0-9]+")
(goto-char (match-beginning 1))
- (cons (1+ (read (current-buffer)))
+ (cons (read (current-buffer))
(read (current-buffer))))))
(defun gnus-make-articles-unread (group articles)
(interactive "P")
(gnus-summary-move-article n nil nil 'crosspost))
-(defvar gnus-summary-respool-default-method nil
+(defcustom gnus-summary-respool-default-method nil
"Default method for respooling an article.
-If nil, use to the current newsgroup method.")
+If nil, use to the current newsgroup method."
+ :type 'gnus-select-method-name
+ :group 'gnus-summary)
(defun gnus-summary-respool-article (&optional n method)
"Respool the current article.
(require 'gnus-group)
(require 'gnus-start)
+(defgroup gnus-topic nil
+ "Group topics."
+ :group 'gnus-group)
+
(defvar gnus-topic-mode nil
"Minor mode for Gnus group buffers.")
-(defvar gnus-topic-mode-hook nil
- "Hook run in topic mode buffers.")
+(defcustom gnus-topic-mode-hook nil
+ "Hook run in topic mode buffers."
+ :type 'hook
+ :group 'gnus-topic)
(defvar gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n"
"Format of topic lines.
%A Number of unread articles in the groups in the topic and its subtopics.
")
-(defvar gnus-topic-indent-level 2
- "*How much each subtopic should be indented.")
+(defcustom gnus-topic-indent-level 2
+ "*How much each subtopic should be indented."
+ :type 'integer
+ :group 'gnus-topic)
-(defvar gnus-topic-display-empty-topics t
- "*If non-nil, display the topic lines even of topics that have no unread articles.")
+(defcustom gnus-topic-display-empty-topics t
+ "*If non-nil, display the topic lines even of topics that have no unread articles."
+ :type 'boolean
+ :group 'gnus-topic)
;; Internal variables.
;;; Code:
+(require 'custom)
(require 'cl)
(require 'nnheader)
(require 'timezone)
(setq i (* 2 i)))
(1- i)))
-(defvar gnus-verbose 7
+(defcustom gnus-verbose 7
"*Integer that says how verbose Gnus should be.
The higher the number, the more messages Gnus will flash to say what
it's doing. At zero, Gnus will be totally mute; at five, Gnus will
display most important messages; and at ten, Gnus will keep on
-jabbering all the time.")
+jabbering all the time."
+ :group 'gnus-start
+ :type 'integer)
;; Show message if message has a lower level than `gnus-verbose'.
;; Guideline for numbers:
(article 0.5)
(message 1.0 point))))
"Window configuration for all possible Gnus buffers.
-This variable is a list of lists. Each of these lists has a NAME and
-a RULE. The NAMEs are commonsense names like `group', which names a
-rule used when displaying the group buffer; `summary', which names a
-rule for what happens when you enter a group and do not display an
-article buffer; and so on. See the value of this variable for a
-complete list of NAMEs.
-
-Each RULE is a list of vectors. The first element in this vector is
-the name of the buffer to be displayed; the second element is the
-percentage of the screen this buffer is to occupy (a number in the
-0.0-0.99 range); the optional third element is `point', which should
-be present to denote which buffer point is to go to after making this
-buffer configuration.")
+See the Gnus manual for an explanation of the syntax used.")
(defvar gnus-window-to-buffer
'((group . gnus-group-buffer)
"Score and kill file handling."
:group 'gnus )
-(defconst gnus-version-number "0.61"
+(defconst gnus-version-number "0.62"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
(kill-buffer (current-buffer))))))))
(defcustom gnus-select-method
- (nconc
- (list 'nntp (or (ignore-errors
- (gnus-getenv-nntpserver))
- (when (and gnus-default-nntp-server
- (not (string= gnus-default-nntp-server "")))
- gnus-default-nntp-server)
- (system-name)))
- (if (or (null gnus-nntp-service)
- (equal gnus-nntp-service "nntp"))
- nil
- (list gnus-nntp-service)))
+ (ignore-errors
+ (nconc
+ (list 'nntp (or (ignore-errors
+ (gnus-getenv-nntpserver))
+ (when (and gnus-default-nntp-server
+ (not (string= gnus-default-nntp-server "")))
+ gnus-default-nntp-server)
+ (system-name)))
+ (if (or (null gnus-nntp-service)
+ (equal gnus-nntp-service "nntp"))
+ nil
+ (list gnus-nntp-service))))
"Default method for selecting a newsgroup.
This variable should be a list, where the first element is how the
news is to be fetched, the second is the address.
gnus-article-hide-boring-headers
gnus-article-treat-overstrike
gnus-article-maybe-highlight
+ gnus-article-de-quoted-unreadable
gnus-article-display-x-face)
'(gnus-article-hide-headers-if-wanted
gnus-article-hide-boring-headers
gnus-article-treat-overstrike
+ gnus-article-de-quoted-unreadable
gnus-article-maybe-highlight))
"Controls how the article buffer will look.
("rmailout" rmail-output)
("rmail" rmail-insert-rmail-file-header rmail-count-new-messages
rmail-show-message)
+ ("gnus-audio" :interactive t gnus-audio-play)
("gnus-xmas" gnus-xmas-splash)
("gnus-soup" :interactive t
gnus-group-brew-soup gnus-brew-soup gnus-soup-add-article
;;; gnus-sum.el thingies
-(defvar gnus-summary-line-format "%U\%R\%z\%I\%(%[%4L: %-20,20n%]%) %s\n"
+(defcustom gnus-summary-line-format "%U\%R\%z\%I\%(%[%4L: %-20,20n%]%) %s\n"
"*The format specification of the lines in the summary buffer.
It works along the same lines as a normal formatting string,
The smart choice is to have these specs as for to the left as
possible.
-This restriction may disappear in later versions of Gnus.")
+This restriction may disappear in later versions of Gnus."
+ :type 'string
+ :group 'gnus-summary)
;;;
;;; Skeleton keymaps
(defun message-insert-to ()
"Insert a To header that points to the author of the article being replied to."
(interactive)
+ (let ((co (message-fetch-field "courtesy-copies-to")))
+ (when (and co
+ (equal (downcase co) "never"))
+ (error "The user has requested not to have copies sent via mail")))
(when (and (message-position-on-field "To")
(mail-fetch-field "to")
(not (string-match "\\` *\\'" (mail-fetch-field "to"))))
(defvar nnmail-split-abbrev-alist
'((any . "from\\|to\\|cc\\|sender\\|apparently-to\\|resent-from\\|resent-to\\|resent-cc")
- (mail . "mailer-daemon\\|postmaster"))
+ (mail . "mailer-daemon\\|postmaster\\|uucp"))
"*Alist of abbreviations allowed in `nnmail-split-fancy'.")
(defvar nnmail-delete-incoming nil
(if (not (file-writable-p nnmail-crash-box))
(gnus-error 1 "Can't write to crash box %s. Not moving mail."
nnmail-crash-box)
+ ;; If the crash box exists and is empty, we delete it.
+ (when (and (file-exists-p nnmail-crash-box)
+ (zerop (nnheader-file-size (file-truename nnmail-crash-box))))
+ (delete-file nnmail-crash-box))
(let ((inbox (file-truename (expand-file-name inbox)))
(tofile (file-truename (expand-file-name nnmail-crash-box)))
movemail popmail errors)
(= (following-char) ?\n)))
(save-excursion
(forward-line 1)
+ (while (looking-at ">From ")
+ (forward-line 1))
(looking-at "[^ \t:]+[ \t]*:")))
(setq found 'yes)))))
(beginning-of-line)
It will prompt for a password."
(nntp-send-command
"^.*\r?\n" "AUTHINFO USER"
- (read-string "NNTP (%s) user name: " nntp-address))
+ (read-string (format "NNTP (%s) user name: " nntp-address)))
(nntp-send-command
"^.*\r?\n" "AUTHINFO PASS"
(nnmail-read-passwd "NNTP (%s) password: " nntp-address)))
(nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name))
(nntp-send-command
"^.*\r?\n" "AUTHINFO PASS"
- (read-string "NNTP (%s) password: " nntp-address)))
+ (nnmail-read-passwd (format "NNTP (%s) password: " nntp-address))))
(defun nntp-send-authinfo-from-file ()
"Send the AUTHINFO to the nntp server.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Red Gnus 0.61 Manual
+@settitle Red Gnus 0.62 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Red Gnus 0.61 Manual
+@title Red Gnus 0.62 Manual
@author by Lars Magne Ingebrigtsen
@page