which included commits to RCS files with non-trunk default branches.
(defun gnus-update-group-mark-positions ()
(save-excursion
- (let ((gnus-process-mark 128)
+ (let ((gnus-process-mark ?\200)
(gnus-group-marked '("dummy.group"))
(gnus-active-hashtb (make-vector 10 0))
(topic ""))
(error "Attempted use of a nil select method"))
(when (stringp method)
(setq method (gnus-server-to-method method)))
- (let ((func (intern (format "%s-%s" (if gnus-agent
- (gnus-agent-get-function method)
- (car method))
- function))))
- ;; If the functions isn't bound, we require the backend in
- ;; question.
+ ;; Check cache of constructed names.
+ (let* ((method-sym (if gnus-agent
+ (gnus-agent-get-function method)
+ (car method)))
+ (method-fns (get method-sym 'gnus-method-functions))
+ (func (let ((method-fnlist-elt (assq function method-fns)))
+ (unless method-fnlist-elt
+ (setq method-fnlist-elt
+ (cons function
+ (intern (format "%s-%s" method-sym function))))
+ (put method-sym 'gnus-method-functions
+ (cons method-fnlist-elt method-fns)))
+ (cdr method-fnlist-elt))))
+ ;; Maybe complain if there is no function.
(unless (fboundp func)
(require (car method))
(when (and (not (fboundp func))
(not noerror))
- ;; This backend doesn't implement this function.
(error "No such function: %s" func)))
func))
(defun gnus-get-buffer-name (variable)
"Returns the buffer name associated with the contents of a variable."
- (cond ((symbolp variable) (let ((newvar (cdr (assq variable
- gnus-window-to-buffer))))
- (cond ((symbolp newvar)
- (symbol-value newvar))
- ((stringp newvar) newvar))))
- ((stringp variable) variable)))
+ (buffer-name (get-buffer (gnus-window-to-buffer-helper variable))))
+
+(defun gnus-picons-buffer-name ()
+ (cond ((or (stringp gnus-picons-display-where)
+ (bufferp gnus-picons-display-where))
+ gnus-picons-display-where)
+ ((eq gnus-picons-display-where 'picons)
+ (if gnus-single-article-buffer
+ "*Picons*"
+ (concat "*Picons " gnus-newsgroup-name "*")))
+ (t
+ (gnus-get-buffer-name gnus-picons-display-where))))
+
+(defun gnus-picons-kill-buffer ()
+ (let ((buf (get-buffer (gnus-picons-buffer-name))))
+ (if (buffer-live-p buf)
+ (kill-buffer buf))))
+
+(defun gnus-picons-setup-buffer ()
+ (let ((name (gnus-picons-buffer-name)))
+ (save-excursion
+ (if (get-buffer name)
+ (set-buffer name)
+ (set-buffer (get-buffer-create name))
+ (buffer-disable-undo)
+ (setq buffer-read-only t)
+ (gnus-add-current-to-buffer-list)
+ (add-hook 'gnus-summary-prepare-exit-hook 'gnus-picons-kill-buffer))
+ (current-buffer))))
(defun gnus-picons-set-buffer ()
- (set-buffer
- (get-buffer-create (gnus-get-buffer-name gnus-picons-display-where)))
- (gnus-add-current-to-buffer-list)
+ (set-buffer (gnus-picons-setup-buffer))
(goto-char (point-min))
(if (and (eq gnus-picons-display-where 'article)
gnus-picons-display-article-move-p)
(gnus-picons-set-buffer)
(gnus-picons-make-annotation (make-glyph gnus-picons-x-face-file-name)
nil 'text)
- (delete-file gnus-picons-x-face-file-name)))
+ (when (file-exists-p gnus-picons-x-face-file-name)
+ (delete-file gnus-picons-x-face-file-name))))
(defun gnus-picons-display-x-face (beg end)
"Function to display the x-face header in the picons window.
(if (featurep 'xface)
;; Use builtin support
(save-excursion
- (gnus-picons-set-buffer)
- (gnus-picons-make-annotation
- (vector 'xface
- :data (concat "X-Face: " (buffer-substring beg end)))
- nil 'text))
+ ;; Don't remove this binding, it is really needed: when
+ ;; `gnus-picons-set-buffer' changes buffer (like when it is
+ ;; set to display picons outside of the article buffer), BEG
+ ;; and END still refer the buffer current now !
+ (let ((buf (current-buffer)))
+ (gnus-picons-set-buffer)
+ (gnus-picons-make-annotation
+ (vector 'xface
+ :data (concat "X-Face: " (buffer-substring beg end buf)))
+ nil 'text nil nil nil t)))
;; convert the x-face header to a .xbm file
(let* ((process-connection-type nil)
(process (start-process-shell-command "gnus-x-face" nil
(mail . gnus-message-buffer)
(post-news . gnus-message-buffer)
(faq . gnus-faq-buffer)
- (picons . "*Picons*")
+ (picons . gnus-picons-buffer-name)
(tree . gnus-tree-buffer)
(score-trace . "*Score Trace*")
(info . gnus-info-buffer)
(defvar gnus-frame-list nil)
+(defun gnus-window-to-buffer-helper (obj)
+ (if (symbolp obj)
+ (if (boundp obj)
+ (symbol-value obj)
+ (funcall obj))
+ obj))
+
(defun gnus-configure-frame (split &optional window)
"Split WINDOW according to SPLIT."
(unless window
;; This is a buffer to be selected.
((not (memq type '(frame horizontal vertical)))
(let ((buffer (cond ((stringp type) type)
- (t (cdr (assq type gnus-window-to-buffer)))))
- buf)
+ (t (cdr (assq type gnus-window-to-buffer))))))
(unless buffer
(error "Illegal buffer type: %s" type))
- (unless (setq buf (get-buffer (if (symbolp buffer)
- (symbol-value buffer) buffer)))
- (setq buf (get-buffer-create (if (symbolp buffer)
- (symbol-value buffer) buffer))))
- (switch-to-buffer buf)
+ (switch-to-buffer (get-buffer-create
+ (gnus-window-to-buffer-helper buffer)))
;; We return the window if it has the `point' spec.
(and (memq 'point split) window)))
;; This is a frame split.
(let ((buffers
(mapcar
(lambda (elem)
- (if (symbolp (cdr elem))
- (when (and (boundp (cdr elem))
- (symbol-value (cdr elem)))
- (get-buffer (symbol-value (cdr elem))))
- (when (cdr elem)
- (get-buffer (cdr elem)))))
+ (get-buffer (gnus-window-to-buffer-helper (cdr elem))))
gnus-window-to-buffer)))
(mapcar
(lambda (frame)
(t (cdr (assq type gnus-window-to-buffer)))))
(unless buffer
(error "Illegal buffer type: %s" type))
- (when (setq buf (get-buffer (if (symbolp buffer)
- (symbol-value buffer)
- buffer)))
- (setq win (get-buffer-window buf t)))
- (if win
- (when (memq 'point split)
+ (if (and (setq buf (get-buffer (gnus-window-to-buffer-helper buffer)))
+ (setq win (get-buffer-window buf t)))
+ (if (memq 'point split)
(setq all-visible win))
(setq all-visible nil)))
(t
(save-excursion
;; Remove windows on all known Gnus buffers.
(while buffers
- (setq buf (cdar buffers))
- (when (symbolp buf)
- (setq buf (and (boundp buf) (symbol-value buf))))
- (and buf
+ (and (setq buf (gnus-window-to-buffer-helper (cdar buffers)))
(get-buffer-window buf)
(progn
(push buf bufs)
(file-end . "")
(subtype digest guess))
(standard-digest
- (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
- (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n\n+"))
+ (first-article . ,(concat "^" (make-string 70 ?-) "\n *\n+"))
+ (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n *\n+"))
(prepare-body-function . nndoc-unquote-dashes)
(body-end-function . nndoc-digest-body-end)
(head-end . "^ *$")
;; Just to make sure nothing went wrong when reading over NFS --
;; check once more.
(when (file-exists-p
- (setq file (concat nnml-current-directory "/"
- (number-to-string article))))
+ (setq file (expand-file-name (number-to-string article)
+ nnml-current-directory)))
(nnml-update-file-alist t)
file))))
(defvoo nntp-coding-system-for-write 'binary
"*Coding system to write to NNTP.")
-(defcustom nntp-authinforc-file "~/.authinforc"
+(defcustom nntp-authinfo-file "~/.authinfo"
"Docstring."
:type
'(choice file
;;; Internal variables.
+(defvar nntp-record-commands nil
+ "*If non-nil, nntp will record all commands in the \"*nntp-log*\" buffer.")
+
(defvar nntp-have-messaged nil)
(defvar nntp-process-wait-for nil)
(defsubst nntp-send-string (process string)
"Send STRING to PROCESS."
+ ;; We need to store the time to provide timeouts, and
+ ;; to store the command so the we can replay the command
+ ;; if the server gives us an AUTHINFO challenge.
(setq nntp-last-command-time (current-time)
nntp-last-command string)
+ (when nntp-record-commands
+ (nntp-record-command string))
(process-send-string process (concat string nntp-end-of-line)))
+(defun nntp-record-command (string)
+ "Record the command STRING."
+ (save-excursion
+ (set-buffer (get-buffer-create "*nntp-log*"))
+ (insert (format-time-string "%Y%m%dT%H%M%S" (current-time))
+ " " nntp-address " " string "\n")))
+
(defsubst nntp-wait-for (process wait-for buffer &optional decode discard)
"Wait for WAIT-FOR to arrive from PROCESS."
(save-excursion
(nntp-accept-process-output process)
(goto-char (point-min)))
(prog1
- (if (looking-at "[45]")
- (progn
- (nntp-snarf-error-message)
- nil)
+ (cond
+ ((looking-at "[45]")
+ (progn
+ (nntp-snarf-error-message)
+ nil))
+ ((memq (process-status process) '(open run))
+ (nnheader-report 'nntp "Server closed connection"))
+ (t
(goto-char (point-max))
(let ((limit (point-min)))
(while (not (re-search-backward wait-for limit t))
(when nntp-have-messaged
(setq nntp-have-messaged nil)
(message ""))
- t)))
+ t))))
(unless discard
(erase-buffer)))))
(let (process)
(while (setq process (car (pop nntp-connection-alist)))
(when (memq (process-status process) '(open run))
- (set-process-sentinel process nil)
(ignore-errors
(nntp-send-string process "QUIT")
(unless (eq nntp-open-connection-function 'nntp-open-network-stream)
(let (process)
(while (setq process (pop nntp-connection-list))
(when (memq (process-status process) '(open run))
- (set-process-sentinel process nil)
(ignore-errors
(nntp-send-string process "QUIT")
(unless (eq nntp-open-connection-function 'nntp-open-network-stream)
(defun nntp-send-authinfo ()
"Send the AUTHINFO to the nntp server.
This function is supposed to be called from `nntp-server-opened-hook'.
-It will look in the \"~/.authinforc\" file for matching entries. If
+It will look in the \"~/.authinfo\" file for matching entries. If
nothing suitable is found there, it will prompt for a user name
and a password."
- (let* ((list (gnus-parse-netrc nntp-authinforc-file))
+ (let* ((list (gnus-parse-netrc nntp-authinfo-file))
(alist (gnus-netrc-machine list nntp-address))
(user (gnus-netrc-get alist "login"))
(passwd (gnus-netrc-get alist "password")))
+Sat Mar 7 17:09:49 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi: Took direntries out again, since makeinfo doesn't
+ understand them.
+
+Sat Mar 7 16:14:10 1998 Dan Christensen <jdc@chow.mat.jhu.edu>
+
+ * gnus.texi (Group Parameters): Mention add-to-list.
+
+Sat Feb 28 14:21:12 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (NNTP): Addition.
+
+1998-03-01 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+
+ * gnus.texi (Easy Picons): Removed references to
+ `gnus-group-display-picons'.
+ (Hard Picons): Ditto.
+
+1998-03-01 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+
+ * gnus.texi (Easy Picons): Removed references to
+ `gnus-group-display-picons'.
+ (Hard Picons): Ditto.
+
Mon Feb 23 18:05:09 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi: Direntry not handled by Emacs 19.34.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Quassia Gnus 0.34 Manual
+@settitle Quassia Gnus 0.35 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Quassia Gnus 0.34 Manual
+@title Quassia Gnus 0.35 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Quassia Gnus 0.34.
+This manual corresponds to Quassia Gnus 0.35.
@end ifinfo
followup---except that if it is present in a news group, you'll get mail
group semantics when doing @kbd{f}.
+If you do an @kbd{a} command in a mail group and you have neither a
+@code{to-list} group parameter nor a @code{to-address} group paramater,
+then a @code{to-list} group parameter will be added automatically upon
+sending the message if @code{gnus-add-to-list} is set to @code{t}.
+@vindex gnus-add-to-list
+
If you do an @kbd{a} command in a mail group and you don't have a
@code{to-list} group parameter, one will be added automatically upon
sending the message.
@end table
-Use the @kbd{G p} command to edit group parameters of a group.
-
-@pxref{Topic Parameters}.
+Use the @kbd{G p} command to edit group parameters of a group. You
+might also be interested in reading about topic parameters (@pxref{Topic
+Parameters}).
Here's an example group parameter list:
@example
((to-address . "ding@@gnus.org")
- (auto-expiry . t))
+ (auto-expire . t))
@end example
@item nntp-authinfo-function
@vindex nntp-authinfo-function
@findex nntp-send-authinfo
-@vindex nntp-authinforc-file
+@vindex nntp-authinfo-file
This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
server. The default function is @code{nntp-send-authinfo}, which looks
-through your @file{~/.authinforc} (or whatever you've set the
-@code{nntp-authinforc-file} variable to) for applicable entries. If
+through your @file{~/.authinfo} (or whatever you've set the
+@code{nntp-authinfo-file} variable to) for applicable entries. If
none are found, it will prompt you for a login name and a password. The
-format of the @file{~/.authinforc} file is the same as the @code{ftp}
+format of the @file{~/.authinfo} file is the same as the @code{ftp}
@file{~/.netrc} file, which is defined in the @code{ftp} manual page,
but here are the salient facts:
former server, while the latter has only the login name listed, and the
user will be prompted for the password.
-Remember to not leave the @file{~/.authinforc} file world-readable.
+Remember to not leave the @file{~/.authinfo} file world-readable.
@item nntp-server-action-alist
@vindex nntp-server-action-alist
If this variable is non-@code{nil}, some noise will be made when a
server closes connection.
+@item nntp-record-commands
+@vindex nntp-record-commands
+If non-@code{nil}, @code{nntp} will log all commands it sends to the
+@sc{nntp} server (along with a timestep) in the @samp{*nntp-log*}
+buffer. This is useful if you are debugging a Gnus/@sc{nntp} connection
+that doesn't seem to work.
+
@end table
@lisp
(setq gnus-use-picons t)
(add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
-(add-hook 'gnus-summary-prepare-hook 'gnus-group-display-picons t)
(add-hook 'gnus-article-display-hook 'gnus-picons-article-display-x-face)
@end lisp
in the @code{gnus-picons-display-where} buffer. Should be added to the
@code{gnus-article-display-hook}.
-@item gnus-group-display-picons
-@findex gnus-article-display-picons
-Displays picons representing the current group. This function should
-be added to the @code{gnus-summary-prepare-hook} or to the
-@code{gnus-article-display-hook} if @code{gnus-picons-display-where}
-is set to @code{article}.
-
@item gnus-picons-article-display-x-face
@findex gnus-article-display-picons
Decodes and displays the X-Face header if present. This function
("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
((tick (15 . 19)) (replied 3 6 (19 . 3)))
(nnml "")
- (auto-expire (to-address "ding@@gnus.org")))
+ ((auto-expire . t) (to-address "ding@@gnus.org")))
@end example
The first element is the @dfn{group name}---as Gnus knows the group,
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 0.34 Manual
+@settitle Message 0.35 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Message 0.34 Manual
+@title Message 0.35 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message 0.34. Message is distributed with
+This manual corresponds to Message 0.35. Message is distributed with
the Gnus distribution bearing the same version number as this manual
has.