+Fri Jul 19 00:31:22 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.el (gnus-subscribe-newsgroup): Add new groups to top-level
+ topic.
+ (gnus-group-make-archive-group): Add a to-address group param.
+
+ * gnus-topic.el (gnus-topic-hide-topic): Doc fix.
+ (gnus-topic-select-group): Doc fix.
+ (gnus-topic-rename): Keep point nearby.
+
+ * gnus.el (gnus-group-goto-group): More efficient (and more
+ correct) implementation.
+ (gnus-group-sort-function): Doc fix.
+ (gnus-group-edit-buffer): Changed to defvar.
+ (gnus-group-edit-group-done): Use new name.
+ (gnus-group-edit-group): Include name of group in grup buffer
+ name.
+
+ * nnfolder.el (nnfolder-save-mail): Handle babylish ">From"
+ lines.
+ * nnmbox.el (nnmbox-request-accept-article): Ditto.
+
+Thu Jul 18 23:50:31 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnmail.el (nnmail-move-inbox): Don't substitute in command
+ name.
+
+ * gnus-xmas.el (gnus-xmas-modeline-glyph): New variable.
+
+Thu Jul 18 16:35:22 1996 Lars Magne Ingebrigtsen <lars@eyesore.no>
+
+ * custom.el (custom-facep): Didn't work under non-X Emacs.
+
+Thu Jul 18 00:02:32 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
+
+ * nntp.el (nntp-open-telnet): Use more permissive regexps.
+
+ * gnus-uu.el (gnus-uu-uustrip-article): `cd' to make gnus-uu work
+ under NT.
+
+Mon Jul 15 18:11:13 1996 Jan Vroonhof <vroonhof@math.ethz.ch (Jan Vroonhof)>
+
+ * smiley.el (smiley-regexp-alist): Don't match important parts of URLs
+ (smiley-nosey-regexp-alist): New variable.
+
+Wed Jul 17 23:48:50 1996 Mark Borges <mdb@cdc.noaa.gov>
+
+ * messagexmas.el (nnheader): Required.
+
+Wed Jul 17 02:02:25 1996 Michael Cook <mcook@cognex.com>
+
+ * nnmail.el (nnmail-split-abbrev-alist): New default.
+
+Wed Jul 17 00:27:13 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
+
+ * message.el (message-mode-abbrev-table): New variable.
+ (message-mode): New variable.
+
+Wed Jul 17 00:05:00 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
+
+ * gnus.el: Gnus v5.2.36 is released.
+
Tue Jul 16 20:05:49 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
* message.el (message-send-mail): Bugged out under Emacs.
string))
;; XEmacs and Emacs 19.29 facep does different things.
-(if (fboundp 'find-face)
- (fset 'custom-facep 'find-face)
- (fset 'custom-facep 'facep))
+(defalias 'custom-facep
+ (cond ((fboundp 'find-face)
+ 'find-face)
+ ((fboundp 'facep)
+ 'facep)
+ (t
+ 'ignore)))
(if (custom-facep 'underline)
()
"Automatically expunge articles with score below SCORE."
(interactive
(list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg))
- (string-to-int (read-string "Expunge below: ")))))
+ (string-to-int (read-string "Set expunge below: ")))))
(setq score (or score gnus-summary-default-score 0))
(gnus-score-set 'expunge (list score))
(gnus-score-set 'touched '(t)))
"Select this newsgroup.
No article is selected automatically.
If ALL is non-nil, already read articles become readable.
-If ALL is a number, fetch this number of articles."
+If ALL is a number, fetch this number of articles.
+
+If performed over a topic line, toggle folding the topic."
(interactive "P")
(if (gnus-group-topic-p)
(let ((gnus-group-list-mode
readable. IF ALL is a number, fetch this number of articles. If the
optional argument NO-ARTICLE is non-nil, no article will be
auto-selected upon group entry. If GROUP is non-nil, fetch that
-group."
+group.
+
+If performed over a topic line, toggle folding the topic."
(interactive "P")
(if (gnus-group-topic-p)
(let ((gnus-group-list-mode
(gnus-topic-update-topic)))
(defun gnus-topic-hide-topic ()
- "Hide all subtopics under the current topic."
+ "Hide the current topic."
(interactive)
(when (gnus-group-parent-topic)
(gnus-topic-goto-topic (gnus-group-parent-topic))
(setcar (cadr top) new-name))
(when entry
(setcar entry new-name))
+ (forward-line -1)
(gnus-group-list-groups)))
(defun gnus-topic-indent (&optional unindent)
(gnus-uu-unmark-list-of-grabbed t))
;; Start a new uudecoding process.
- (setq gnus-uu-uudecode-process
- (start-process
- "*uudecode*"
- (get-buffer-create gnus-uu-output-buffer-name)
- shell-file-name shell-command-switch
- (format "cd %s ; uudecode" gnus-uu-work-dir)))
+ (let ((cdir default-directory))
+ (unwind-protect
+ (progn
+ (cd gnus-uu-work-dir)
+ (setq gnus-uu-uudecode-process
+ (start-process
+ "*uudecode*"
+ (get-buffer-create gnus-uu-output-buffer-name)
+ shell-file-name shell-command-switch
+ (format "cd %s %s uudecode" gnus-uu-work-dir
+ gnus-shell-command-separator))))
+ (cd cdir)))
(set-process-sentinel
gnus-uu-uudecode-process 'gnus-uu-uudecode-sentinel)
(setq state (list 'begin))
This function will be called with group info entries as the arguments
for the groups to be sorted. Pre-made functions include
`gnus-group-sort-by-alphabet', `gnus-group-sort-by-unread',
-`gnus-group-sort-by-level', `gnus-group-sort-by-score', and
-`gnus-group-sort-by-rank'.
+`gnus-group-sort-by-level', `gnus-group-sort-by-score',
+`gnus-group-sort-by-method', and `gnus-group-sort-by-rank'.
This variable can also be a list of sorting functions. In that case,
the most significant sort function should be the last function in the
(defvar gnus-not-empty-thread-mark ?=
"*There is a thread under the article.")
+(defvar gnus-shell-command-separator ";"
+ "String used to separate to shell commands.")
+
(defvar gnus-view-pseudo-asynchronously nil
"*If non-nil, Gnus will view pseudo-articles asynchronously.")
(defvar gnus-newsgroup-dependencies nil)
(defvar gnus-newsgroup-async nil)
-(defconst gnus-group-edit-buffer "*Gnus edit newsgroup*")
+(defvar gnus-group-edit-buffer nil)
(defvar gnus-newsgroup-adaptive nil)
"gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
"The mail address of the Gnus maintainers.")
-(defconst gnus-version-number "5.2.36"
+(defconst gnus-version-number "5.2.37"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Gnus v%s" gnus-version-number)
"Subscribe new NEWSGROUP.
If NEXT is non-nil, it is inserted before NEXT. Otherwise it is made
the first newsgroup."
- ;; We subscribe the group by changing its level to `subscribed'.
- (gnus-group-change-level
- newsgroup gnus-level-default-subscribed
- gnus-level-killed (gnus-gethash (or next "dummy.group") gnus-newsrc-hashtb))
- (gnus-message 5 "Subscribe newsgroup: %s" newsgroup))
+ (save-excursion
+ (goto-char (point-min))
+ ;; We subscribe the group by changing its level to `subscribed'.
+ (gnus-group-change-level
+ newsgroup gnus-level-default-subscribed
+ gnus-level-killed (gnus-gethash (or next "dummy.group")
+ gnus-newsrc-hashtb))
+ (gnus-message 5 "Subscribe newsgroup: %s" newsgroup)))
;; For directories
(defun gnus-group-goto-group (group)
"Goto to newsgroup GROUP."
(when group
- (let ((b (text-property-any (point-min) (point-max)
- 'gnus-group (gnus-intern-safe
- group gnus-active-hashtb))))
- (and b (goto-char b)))))
+ ;; It's quite likely that we are on the right line, so
+ ;; we check the current line first.
+ (beginning-of-line)
+ (if (eq (get-text-property (point) 'gnus-group)
+ (gnus-intern-safe group gnus-active-hashtb))
+ (point)
+ ;; Search through the entire buffer.
+ (let ((b (text-property-any
+ (point-min) (point-max)
+ 'gnus-group (gnus-intern-safe group gnus-active-hashtb))))
+ (when b
+ (goto-char b))))))
(defun gnus-group-next-group (n &optional silent)
"Go to next N'th newsgroup.
(or group (error "No group on current line"))
(or (setq info (gnus-get-info group))
(error "Killed group; can't be edited"))
- (set-buffer (get-buffer-create gnus-group-edit-buffer))
+ (set-buffer (setq gnus-group-edit-buffer
+ (get-buffer-create
+ (format "*Gnus edit %s*" group))))
(gnus-configure-windows 'edit-group)
(gnus-add-current-to-buffer-list)
(emacs-lisp-mode)
(defun gnus-group-edit-group-done (part group)
"Get info from buffer, update variables and jump to the group buffer."
- (set-buffer (get-buffer-create gnus-group-edit-buffer))
- (goto-char (point-min))
- (let* ((form (read (current-buffer)))
- (winconf gnus-prev-winconf)
- (method (cond ((eq part 'info) (nth 4 form))
- ((eq part 'method) form)
+ (when (and gnus-group-edit-buffer
+ (buffer-name gnus-group-edit-buffer))
+ (set-buffer gnus-group-edit-buffer)
+ (goto-char (point-min))
+ (let* ((form (read (current-buffer)))
+ (winconf gnus-prev-winconf)
+ (method (cond ((eq part 'info) (nth 4 form))
+ ((eq part 'method) form)
+ (t nil)))
+ (info (cond ((eq part 'info) form)
+ ((eq part 'method) (gnus-get-info group))
(t nil)))
- (info (cond ((eq part 'info) form)
- ((eq part 'method) (gnus-get-info group))
- (t nil)))
- (new-group (if info
- (if (or (not method)
- (gnus-server-equal
- gnus-select-method method))
- (gnus-group-real-name (car info))
- (gnus-group-prefixed-name
- (gnus-group-real-name (car info)) method))
- nil)))
- (when (and new-group
- (not (equal new-group group)))
- (when (gnus-group-goto-group group)
- (gnus-group-kill-group 1))
- (gnus-activate-group new-group))
- ;; Set the info.
- (if (and info new-group)
- (progn
- (setq info (gnus-copy-sequence info))
- (setcar info new-group)
- (unless (gnus-server-equal method "native")
- (unless (nthcdr 3 info)
- (nconc info (list nil nil)))
- (unless (nthcdr 4 info)
- (nconc info (list nil)))
- (gnus-info-set-method info method))
- (gnus-group-set-info info))
- (gnus-group-set-info form (or new-group group) part))
- (kill-buffer (current-buffer))
- (and winconf (set-window-configuration winconf))
- (set-buffer gnus-group-buffer)
- (gnus-group-update-group (or new-group group))
- (gnus-group-position-point)))
+ (new-group (if info
+ (if (or (not method)
+ (gnus-server-equal
+ gnus-select-method method))
+ (gnus-group-real-name (car info))
+ (gnus-group-prefixed-name
+ (gnus-group-real-name (car info)) method))
+ nil)))
+ (when (and new-group
+ (not (equal new-group group)))
+ (when (gnus-group-goto-group group)
+ (gnus-group-kill-group 1))
+ (gnus-activate-group new-group))
+ ;; Set the info.
+ (if (and info new-group)
+ (progn
+ (setq info (gnus-copy-sequence info))
+ (setcar info new-group)
+ (unless (gnus-server-equal method "native")
+ (unless (nthcdr 3 info)
+ (nconc info (list nil nil)))
+ (unless (nthcdr 4 info)
+ (nconc info (list nil)))
+ (gnus-info-set-method info method))
+ (gnus-group-set-info info))
+ (gnus-group-set-info form (or new-group group) part))
+ (kill-buffer (current-buffer))
+ (and winconf (set-window-configuration winconf))
+ (set-buffer gnus-group-buffer)
+ (gnus-group-update-group (or new-group group))
+ (gnus-group-position-point))))
(defun gnus-group-make-help-group ()
"Create the Gnus documentation group."
(interactive "P")
(let ((group (gnus-group-prefixed-name
(if all "ding.archives" "ding.recent") '(nndir ""))))
- (and (gnus-gethash group gnus-newsrc-hashtb)
- (error "Archive group already exists"))
+ (when (gnus-gethash group gnus-newsrc-hashtb)
+ (error "Archive group already exists"))
(gnus-group-make-group
(gnus-group-real-name group)
(list 'nndir (if all "hpc" "edu")
(list 'nndir-directory
(if all gnus-group-archive-directory
- gnus-group-recent-archive-directory))))))
+ gnus-group-recent-archive-directory))))
+ (gnus-group-add-parameter group (cons 'to-address "ding@ifi.uio.no"))))
(defun gnus-group-make-directory-group (dir)
"Create an nndir group.
table)
"Syntax table used while in Message mode.")
+(defvar message-mode-abbrev-table text-mode-abbrev-table
+ "Abbrev table used in Message mode buffers.
+Defaults to `text-mode-abbrev-table'.")
+
(defvar message-font-lock-keywords
(let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-")))
(list '("^To:" . font-lock-function-name-face)
(make-local-variable 'message-postpone-actions)
(set-syntax-table message-mode-syntax-table)
(use-local-map message-mode-map)
- (setq local-abbrev-table text-mode-abbrev-table)
+ (setq local-abbrev-table message-mode-abbrev-table)
(setq major-mode 'message-mode)
(setq mode-name "Message")
(setq buffer-offer-save t)
(setq message-sent-message-via nil)
(make-local-variable 'message-checksum)
(setq message-checksum nil)
- (when (fboundp 'mail-hist-define-keys)
- (mail-hist-define-keys))
+ ;;(when (fboundp 'mail-hist-define-keys)
+ ;; (mail-hist-define-keys))
(when (string-match "XEmacs\\|Lucid" emacs-version)
(message-setup-toolbar))
(easy-menu-add message-mode-menu message-mode-map)
"Already sent message via mail; resend? "))
(message-send-mail arg))))
(message-do-fcc)
- (when (fboundp 'mail-hist-put-headers-into-history)
- (mail-hist-put-headers-into-history))
+ ;;(when (fboundp 'mail-hist-put-headers-into-history)
+ ;; (mail-hist-put-headers-into-history))
(run-hooks 'message-sent-hook)
(message "Sending...done")
;; If buffer has no file, mark it as unmodified and delete autosave.
;;; Code:
+(require 'nnheader)
+
(defvar message-xmas-dont-activate-region nil
"If t, don't activate region after yanking.")
(delim (concat "^" message-unix-mail-delimiter))
save-list group-art)
(goto-char (point-min))
- ;; This might come from somewhere else.
+ ;; The From line may have been quoted by movemail.
+ (when (looking-at (concat ">" message-unix-mail-delimiter))
+ (delete-char 1))
+ ;; This might come from somewhere else.
(unless (looking-at delim)
(insert "From nobody " (current-time-string) "\n")
(goto-char (point-min)))
\"misc.misc\"))")
(defvar nnmail-split-abbrev-alist
- '((any . "from\\|to\\|cc\\|sender\\|apparently-to")
+ '((any . "from\\|to\\|cc\\|sender\\|apparently-to\\|resent-from\\|resent-to\\|resent-cc")
(mail . "mailer-daemon\\|postmaster"))
"*Alist of abbreviations allowed in `nnmail-split-fancy'.")
;; Function rewritten from rmail.el.
(defun nnmail-move-inbox (inbox)
"Move INBOX to `nnmail-crash-box'."
- (let ((inbox (file-truename
- (expand-file-name (substitute-in-file-name inbox))))
- (tofile (file-truename (expand-file-name
- (substitute-in-file-name nnmail-crash-box))))
+ (let ((inbox (file-truename (expand-file-name inbox)))
+ (tofile (file-truename (expand-file-name nnmail-crash-box)))
movemail popmail errors password)
;; If getting from mail spool directory,
;; use movemail to move rather than just renaming,
(let ((buf (current-buffer))
result)
(goto-char (point-min))
+ ;; The From line may have been quoted by movemail.
+ (when (looking-at (concat ">" message-unix-mail-delimiter))
+ (delete-char 1))
(if (looking-at "X-From-Line: ")
(replace-match "From ")
(insert "From nobody " (current-time-string) "\n"))
(when (memq (process-status proc) '(open run))
(process-send-string proc "set escape \^X\n")
(process-send-string proc (concat "open " server "\n"))
- (nntp-wait-for-string "^\r*login:")
+ (nntp-wait-for-string "^\r*.?login:")
(process-send-string
proc (concat
(or nntp-telnet-user-name
(setq nntp-telnet-user-name (read-string "login: ")))
"\n"))
- (nntp-wait-for-string "^\r*password:")
+ (nntp-wait-for-string "^\r*.?password:")
(process-send-string
proc (concat
(or nntp-telnet-passwd
(defvar smiley-data-directory (message-xmas-find-glyph-directory "smilies")
"Location of the smiley faces files.")
-(defvar smiley-regexp-alist
+;; Notice the subtle differences in the regular expessions in the two alists below
+
+(defvar smiley-deformed-regexp-alist
'(("\\(:-*[<«]+\\)\\W" 1 "FaceAngry.xpm")
("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm")
("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm")
("\\(:-*[)>}»]+\\)\\W" 1 "FaceHappy.xpm")
- ("\\(:-*[/\\\"]+\\)\\W" 1 "FaceIronic.xpm")
+ ("\\(:-*[/\\\"]\\)[^\\]" 1 "FaceIronic.xpm")
("\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm")
("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm")
("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm")
("\\(;-*[>)}»]+\\)\\W" 1 "FaceWinking.xpm")
("\\(:-*[Vvµ]\\)\\W" 1 "FaceWry.xpm")
("\\([:|]-*P\\)\\W" 1 "FaceYukky.xpm"))
- "A list of regexps to map smilies to real images.")
+ "Normal and deformed faces for smilies.")
+
+(defvar smiley-nosey-regexp-alist
+ '(("\\(:-+[<«]+\\)\\W" 1 "FaceAngry.xpm")
+ ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm")
+ ("\\(:-+D\\)\\W" 1 "FaceGrinning.xpm")
+ ("\\(:-+[}»]+\\)\\W" 1 "FaceHappy.xpm")
+ ("\\(:-*)+\\)\\W" 1 "FaceHappy.xpm") ;; The exception that confirms the rule
+ ("\\(:-+[/\\\"]+\\)\\W" 1 "FaceIronic.xpm")
+ ("\\([8|]-+[|Oo%]\\)\\W" 1 "FaceKOed.xpm")
+ ("\\([:|]-+#+\\)\\W" 1 "FaceNyah.xpm")
+ ("\\(:-+[({]+\\)\\W" 1 "FaceSad.xpm")
+ ("\\(:-+[Oo\*]\\)\\W" 1 "FaceStartled.xpm")
+ ("\\(:-+|\\)\\W" 1 "FaceStraight.xpm")
+ ("\\(:-+p\\)\\W" 1 "FaceTalking.xpm")
+ ("\\(:-+d\\)\\W" 1 "FaceTasty.xpm")
+ ("\\(;-+[>)}»]+\\)\\W" 1 "FaceWinking.xpm")
+ ("\\(:-+[Vvµ]\\)\\W" 1 "FaceWry.xpm")
+ ("\\([:|]-+P\\)\\W" 1 "FaceYukky.xpm"))
+ "Smileys with noses. These get less false matches.")
+
+(defvar smiley-regexp-alist smiley-deformed-regexp-alist
+ "A list of regexps to map smilies to real images.
+Defaults to the content of smiley-deformed-regexp-alist.
+An alternative smiley-nose-regexp-alist that
+matches less aggresively is available.")
(defvar smiley-flesh-color "yellow"
"Flesh color.")
+Fri Jul 19 00:41:11 1996 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Listing Groups): Fix.
+
+Thu Jul 18 00:05:03 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
+
+ * gnus.texi (Various Various): Addition.
+ (Startup Files): Addition.
+
+Wed Jul 17 02:03:39 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
+
+ * gnus.texi (Summary Score Commands): Fixed key def.
+ (Summary Score Commands): Fix.
+
Thu Jul 4 05:45:32 1996 Lars Magne Ingebrigtsen <larsi@aegir.ifi.uio.no>
* gnus.texi (Article Hiding): Addition.
control on or off. Version control is off by default when saving the
startup files.
+@vindex gnus-init-file
+When Gnus starts, it will read the @code{gnus-init-file} file, which is
+@file{~/.gnus.el} by default. This is a normal Emacs Lisp file and can
+be used to avoid cluttering your @file{.emacs} file with Gnus stuff.
+
@node Auto Save
@section Auto Save
@item A m
@kindex A m (Group)
@findex gnus-group-list-matching
-List all subscribed groups with unread articles that match a regexp
+List all unread, subscribed groups with names that match a regexp
(@code{gnus-group-list-matching}).
@item A M
Messages will be saved in all those groups.
@item an alist of regexps, functions and forms
When a key ``matches'', the result is used.
+@item @code{nil}
+No message archiving will take place. This is the default.
@end itemize
Let's illustrate:
"misc-mail")))
@end lisp
-This is the default.
-
How about storing all news messages in one file, but storing all mail
messages in one file per month:
Prompt for a score, and mark all articles with a score below this as
read (@code{gnus-score-set-mark-below}).
-@item V E
-@kindex V E (Summary)
+@item V x
+@kindex V x (Summary)
@findex gnus-score-set-expunge-below
-Expunge all articles with a score below the default score (or the
-numeric prefix) (@code{gnus-score-set-expunge-below}).
+Prompt for a score, and add a score rule to the current score file to
+expunge all articles below this score
+(@code{gnus-score-set-expunge-below}).
@end table
The keystrokes for actually making score entries follow a very regular
gather statistics on the headers fetched, or perhaps you'd like to prune
some headers. I don't see why you'd want that, though.
+@item gnus-shell-command-separator
+@vindex gnus-shell-command-separator
+String used to separate to shell commands. The default is @samp{;}.
+
+
@end table