From: Lars Magne Ingebrigtsen Date: Tue, 4 Mar 1997 02:43:45 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: https://cgit.sxemacs.org/?a=commitdiff_plain;h=1afd16525852e491851611bb1dfe6bebfebd679f;p=gnus *** empty log message *** --- diff --git a/Makefile b/Makefile index eb674c8a4..6ae5d1ce3 100644 --- a/Makefile +++ b/Makefile @@ -9,4 +9,4 @@ some: cd lisp; $(MAKE) EMACS=$(EMACS) some info: - cd texi; $(MAKE) all + cd texi; $(MAKE) EMACS=$(EMACS) all diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 91f9dd56c..d647f879e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,68 @@ +Mon Jul 10 10:44:46 1995 Lars Magne Ingebrigtsen + + * gnus-ems.el (gnus-ems-redefine): Redefine for XEmacs. + + * gnus.el (gnus-summary-expire-articles-now): New function and + keystrokem by popular demand. + (gnus-summary-exit-hook): New variable. + + * gnus-vis.el (gnus-visual-turn-off-edit-menus): New function. + + * nnml.el (nnml-request-expire-articles): When you have found one + new article, the rest are probably also new, so stop checking, + already. + * nnbabyl.el (nnbabyl-request-expire-articles): Ditto. + * nnfolder.el (nnfolder-request-expire-articles): Ditto. + * nnmh.el (nnmh-request-expire-articles): Ditto. + * nnmbox.el (nnmbox-request-expire-articles): Ditto. + + * gnus-ems.el: Setq gnus-display-type and gnus-background-mode for + XEmacs. + + * gnus-vis.el (gnus-summary-highlight): Defvarred twice. + + * gnus-uu.el (gnus-uu-uustrip-article): Remove any non-body line + after the begin line. + +Sun Jul 9 15:01:58 1995 Lars Magne Ingebrigtsen + + * gnus-uu.el (gnus-uu-get-actions): Substitute "file" for + "gnus-uu-archive". + + * gnus-vis.el (gnus-group-make-menu-bar): Disable the Edit menu in + all Gnus modes. + + * gnus-msg.el (gnus-insert-mime-headers): New function. + (gnus-inews-insert-headers): Make deletable headers italic. + (gnus-inews-check-post): Stricter From header checks. + + * gnus.el (gnus-subject-equal): Would bug out on numerical + gather-limits. + (gnus-limit-string): New function. + (gnus-score-score-files): Translate the ":" to "/". + (gnus-score-find-bnews): Ditto. + ('gnus-startup-hook): Remove all hilit hooks by default. + + * gnus-score.el (gnus-default-adaptive-score-alist): Don't let + ticks affect adaptive score. + + * gnus-msg.el ('rmail): Require rmail. + + * gnus-mh.el (gnus-mail-reply-using-mhe): Make sure the To isn't + empty. + + * gnus-msg.el (gnus-inews-news): Don't restore window config if + article is rejected. + + * gnus.el (gnus-summary-show-article): Now takes a prefix. + (gnus-browse-exit): List all groups on exit. + (gnus-summary-edit-article): Make sure the article buffer is the + selected window before editing. + Sat Jul 8 16:57:03 1995 Lars Magne Ingebrigtsen + * gnus.el: 0.92 is released. + * gnus.el (gnus-summary-fetch-faq): Get the real name. (gnus-summary-fetch-faq): Don't do the config thing unless the fetch is successful. diff --git a/lisp/gnus-cite.el b/lisp/gnus-cite.el index 9aaf5dcac..bbe1492df 100644 --- a/lisp/gnus-cite.el +++ b/lisp/gnus-cite.el @@ -92,8 +92,7 @@ It is merged with the face for the cited text belonging to the attribution.") "Names of light colors.") (defvar gnus-face-dark-name-list - '("violetred3" "violetred2" "violetred1" "violetred3" "deepskyblue3" "deepskyblue2" "deepskyblue1" "deepskyblue" - "dark salmon" "firebrick" + '("dark salmon" "firebrick" "dark green" "dark orange" "dark khaki" "dark violet" "dark turquoise") "Names of dark colors.") diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el index b87091c26..43cd565ce 100644 --- a/lisp/gnus-ems.el +++ b/lisp/gnus-ems.el @@ -38,6 +38,25 @@ ((string-match "XEmacs\\|Lucid" emacs-version) ;; XEmacs definitions. + (defvar gnus-summary-highlight + '(((> score default) . bold) + ((< score default) . italic)) + "*Alist of `(FORM . FACE)'. +Summary lines are highlighted with the FACE for the first FORM which +evaluate to a non-nil value. + +Point will be at the beginning of the line when FORM is evaluated. +The following can be used for convenience: + +score: (gnus-summary-article-score) +default: gnus-summary-default-score +below: gnus-summary-mark-below + +To check for marks, e.g. to underline replied articles, use +`gnus-summary-article-mark': + + ((= (gnus-summary-article-mark) gnus-replied-mark) . underline)") + (setq gnus-mouse-2 [button2]) (setq gnus-easymenu 'auc-menu) @@ -54,6 +73,9 @@ (if props (put-text-property start end (car props) (cdr props) buffer) (remove-text-properties start end ()))))) + + (defvar gnus-header-face-alist + '(("" bold italic))) (or (fboundp 'make-overlay) (fset 'make-overlay 'make-extent)) (or (fboundp 'overlay-put) (fset 'overlay-put 'set-extent-property)) @@ -63,6 +85,25 @@ (or (boundp 'standard-display-table) (setq standard-display-table nil)) (or (boundp 'read-event) (fset 'read-event 'next-command-event)) + (setq gnus-display-type + (let ((display-resource + (x-get-resource ".displayType" "DisplayType" 'string))) + (cond (display-resource (intern (downcase display-resource))) + ((x-display-color-p) 'color) + ((x-display-grayscale-p) 'grayscale) + (t 'mono)))) + + (setq gnus-background-mode + (let ((bg-resource + (x-get-resource ".backgroundMode" "BackgroundMode" 'string)) + (params (frame-parameters))) + (cond (bg-resource (intern (downcase bg-resource))) +; ((< (apply '+ (x-color-values +; (cdr (assq 'background-color params)))) +; (/ (apply '+ (x-color-values "white")) 3)) +; 'dark) + (t 'light)))) + (if (not gnus-visual) () (setq gnus-group-mode-hook @@ -132,9 +173,9 @@ (cond ((string-match "XEmacs\\|Lucid" emacs-version) ;; XEmacs definitions. - (fset 'gnus-set-mouse-face (lambda (string) string)) - + (fset 'gnus-set-mouse-face 'identity) (fset 'gnus-summary-make-display-table (lambda () nil)) + (fset 'gnus-visual-turn-off-edit-menu 'identity) (defun gnus-highlight-selected-summary () ;; Added by Per Abrahamsen . @@ -284,6 +325,69 @@ NOTE: This command only works with newsgroups that use real or simulated NNTP." nil) (kill-buffer tmp-buf))))))) + (defun gnus-summary-insert-pseudos (pslist &optional not-view) + (let ((buffer-read-only nil) + (article (gnus-summary-article-number)) + b) + (or (gnus-summary-goto-subject article) + (error (format "No such article: %d" article))) + (or gnus-newsgroup-headers-hashtb-by-number + (gnus-make-headers-hashtable-by-number)) + (gnus-summary-position-cursor) + ;; If all commands are to be bunched up on one line, we collect + ;; them here. + (if gnus-view-pseudos-separately + () + (let ((ps (setq pslist (sort pslist 'gnus-pseudos<))) + files action) + (while ps + (setq action (cdr (assq 'action (car ps)))) + (setq files (list (cdr (assq 'name (car ps))))) + (while (and ps (cdr ps) + (string= (or action "1") + (or (cdr (assq 'action (car (cdr ps)))) "2"))) + (setq files (cons (cdr (assq 'name (car (cdr ps)))) files)) + (setcdr ps (cdr (cdr ps)))) + (if (not files) + () + (if (not (string-match "%s" action)) + (setq files (cons " " files))) + (setq files (cons " " files)) + (and (assq 'execute (car ps)) + (setcdr (assq 'execute (car ps)) + (funcall (if (string-match "%s" action) + 'format 'concat) + action + (mapconcat (lambda (f) f) files " "))))) + (setq ps (cdr ps))))) + (if (and gnus-view-pseudos (not not-view)) + (while pslist + (and (assq 'execute (car pslist)) + (gnus-execute-command (cdr (assq 'execute (car pslist))) + (eq gnus-view-pseudos 'not-confirm))) + (setq pslist (cdr pslist))) + (save-excursion + (while pslist + (gnus-summary-goto-subject (or (cdr (assq 'article (car pslist))) + (gnus-summary-article-number))) + (forward-line 1) + (setq b (point)) + (insert " " (file-name-nondirectory + (cdr (assq 'name (car pslist)))) + ": " (or (cdr (assq 'execute (car pslist))) "") "\n") + (add-text-properties + b (1+ b) (list 'gnus-number gnus-reffed-article-number + 'gnus-mark gnus-unread-mark + 'gnus-level 0 + 'gnus-pseudo (car pslist))) + (remove-text-properties (b) (gnus-point-at-eol) + '(gnus-number nil gnus-mark nil gnus-level nil)) + (forward-line -1) + (gnus-sethash (int-to-string gnus-reffed-article-number) + (car pslist) gnus-newsgroup-headers-hashtb-by-number) + (setq gnus-reffed-article-number (1- gnus-reffed-article-number)) + (setq pslist (cdr pslist))))))) + ) diff --git a/lisp/gnus-mh.el b/lisp/gnus-mh.el index 89ebb43db..73f95f0d3 100644 --- a/lisp/gnus-mh.el +++ b/lisp/gnus-mh.el @@ -86,11 +86,11 @@ The command \\[mh-yank-cur-msg] yank the original message into current buffer." (setq buffer (current-buffer)) (save-excursion (save-restriction - (or gnus-user-login-name ; we need this + (or gnus-user-login-name ; we need this (setq gnus-user-login-name (or (getenv "USER") (getenv "LOGNAME")))) - (gnus-article-show-all-headers) ;; so colors are happy + (gnus-article-show-all-headers);; so colors are happy ;; lots of junk to avoid mh-send deleting other windows (setq from (gnus-fetch-field "from") subject (let ((subject (or (gnus-fetch-field "subject") @@ -114,8 +114,8 @@ The command \\[mh-yank-cur-msg] yank the original message into current buffer." (setq mh-show-buffer buffer))) (mh-find-path) - (mh-send-sub to (or cc "") - (or subject "(None)") config) ;; Erik Selberg 1/23/94 + (mh-send-sub (or to "") (or cc "") + (or subject "(None)") config);; Erik Selberg 1/23/94 (let ((draft (current-buffer)) (gnus-mail-buffer (current-buffer)) @@ -124,9 +124,9 @@ The command \\[mh-yank-cur-msg] yank the original message into current buffer." (gnus-configure-windows 'reply) (gnus-configure-windows 'reply-yank)) (setq mail-buf gnus-mail-buffer) - (pop-to-buffer mail-buf) ;; always in the display, so won't have window probs + (pop-to-buffer mail-buf);; always in the display, so won't have window probs (switch-to-buffer draft) - (kill-buffer mail-buf) ;; mh-e don't use it! + (kill-buffer mail-buf);; mh-e don't use it! ) ;; (mh-send to (or cc "") subject);; shouldn't use according to mhe @@ -146,7 +146,7 @@ The command \\[mh-yank-cur-msg] yank the original message into current buffer." (setq mh-previous-window-config config) ) - ;; Then, yank original article if requested. + ;; Then, yank original article if requested. (if yank (let ((last (point))) (mh-yank-cur-msg) @@ -161,17 +161,17 @@ The command \\[mh-yank-cur-msg] yank the original message into current buffer." (let* ((to (read-string "To: ")) (cc (read-string "Cc: ")) (buffer (or buffer gnus-article-buffer)) - (config (current-window-configuration)) ;; need to add this - erik + (config (current-window-configuration));; need to add this - erik (subject (gnus-forward-make-subject buffer))) (setq mh-show-buffer buffer) (mh-find-path) - (mh-send-sub to (or cc "") (or subject "(None)") config) ;; Erik Selberg 1/23/94 + (mh-send-sub to (or cc "") (or subject "(None)") config);; Erik Selberg 1/23/94 (let ((draft (current-buffer)) (gnus-mail-buffer (current-buffer)) mail-buf) (gnus-configure-windows 'reply-yank) (setq mail-buf (eval (cdr (assq 'mail gnus-window-to-buffer)))) - (pop-to-buffer mail-buf) ;; always in the display, so won't have window probs + (pop-to-buffer mail-buf);; always in the display, so won't have window probs (switch-to-buffer draft) ) (save-excursion diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 92ea703de..7e9465f94 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -28,6 +28,7 @@ (require 'gnus) (require 'sendmail) (require 'gnus-ems) +(require 'rmail) (defvar gnus-organization-file "/usr/lib/news/organization" "*Local news organization file.") @@ -701,9 +702,11 @@ will attempt to use the foreign server to post the article." (or server-running (gnus-close-server (gnus-find-method-for-group gnus-newsgroup-name))) (let ((conf gnus-prev-winconf)) - (bury-buffer) - ;; Restore last window configuration. - (and conf (not error) (set-window-configuration conf))))) + (if (not error) + (progn + (bury-buffer) + ;; Restore last window configuration. + (and conf (set-window-configuration conf))))))) (defun gnus-inews-check-post () "Check whether the post looks ok." @@ -770,12 +773,19 @@ will attempt to use the foreign server to post the article." (save-excursion (let* ((case-fold-search t) (from (mail-fetch-field "from"))) - (or (not from) - (and (string-match "@" from) - (string-match "@[^\\.]*\\." from)) - (gnus-yes-or-no-p - (format "The From looks strange: \"%s\". Really post? " - from))))))))) + (cond + ((not from) + (gnus-yes-or-no-p "There is no From line. Really post? ")) + ((not (string-match "@[^\\.]*\\." from)) + (gnus-yes-or-no-p + (format + "The address looks strange: \"%s\". Really post? " from))) + ((string-match "(.*).*(.*)") + (gnus-yes-or-no-p + (format + "The From header looks strange: \"%s\". Really post? " + from))))))) + ))) ;; Check for long lines. (or (gnus-check-before-posting 'long-lines) (save-excursion @@ -991,7 +1001,7 @@ Headers in `gnus-required-headers' will be generated." (goto-char (point-min)) (and (re-search-forward (concat "^" (symbol-name (car headers)) ": *") nil t) - (get-text-property (1+ (match-end 0)) 'gnus-deletable) + (get-text-property (1+ (match-beginning 0)) 'gnus-deletable) (gnus-delete-line)) (setq headers (cdr headers)))) ;; Insert new Sender if the From is strange. @@ -1050,18 +1060,19 @@ Headers in `gnus-required-headers' will be generated." (read-from-minibuffer (format "Empty header for %s; enter value: " header)))) ;; Finally insert the header. - (if (bolp) - (save-excursion - (goto-char (point-max)) - (insert (symbol-name header) ": ") - ;; Add the deletable property to the headers that require it. - (if (memq header gnus-deletable-headers) - (add-text-properties - (point) (progn (insert value) (point)) - '(gnus-deletable t) (current-buffer)) - (insert value)) - (insert "\n")) - (replace-match value t t)))) + (save-excursion + (if (bolp) + (progn + (goto-char (point-max)) + (insert (symbol-name header) ": " value "\n") + (forward-line -1)) + (replace-match value t t)) + ;; Add the deletable property to the headers that require it. + (and (memq header gnus-deletable-headers) + (progn (beginning-of-line) (looking-at "[^:]+: ")) + (add-text-properties + (point) (match-end 0) + '(gnus-deletable t face italic) (current-buffer)))))) (setq headers (cdr headers))))) (defun gnus-inews-insert-signature () @@ -1097,6 +1108,22 @@ nil." (goto-char (point-max)) (or (bolp) (insert "\n")))))))) +;; Written by "Mr. Per Persson" . +(defun gnus-inews-insert-mime-headers () + (or (mail-position-on-field "Mime-Version") + (insert "1.0") + (cond ((save-excursion + (beginning-of-buffer) + (re-search-forward "[\200-\377]" nil t)) + (or (mail-position-on-field "Content-Type") + (insert "text/plain; charset=ISO-8859-1")) + (or (mail-position-on-field "Content-Transfer-Encoding") + (insert "8bit"))) + (t (or (mail-position-on-field "Content-Type") + (insert "text/plain; charset=US-ASCII")) + (or (mail-position-on-field "Content-Transfer-Encoding") + (insert "7bit")))))) + (defun gnus-inews-do-fcc () "Process FCC: fields in current article buffer. Unless the first character of the field is `|', the article is saved diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index 755a459f4..d64fbe15f 100644 --- a/lisp/gnus-score.el +++ b/lisp/gnus-score.el @@ -35,7 +35,7 @@ (defvar gnus-default-adaptive-score-alist '((gnus-unread-mark) - (gnus-ticked-mark (from 4)) + (gnus-ticked-mark) (gnus-dormant-mark (from 5)) (gnus-del-mark (from -4) (subject -1)) (gnus-read-mark (from 4) (subject 2)) @@ -282,10 +282,10 @@ of the last successful match.") (defun gnus-summary-header (header) ;; Return HEADER for current articles, or error. (let ((article (gnus-summary-article-number)) - header) + headers) (if article - (if (setq header (gnus-get-header-by-number article)) - (aref header (nth 1 (assoc header gnus-header-index))) + (if (setq headers (gnus-get-header-by-number article)) + (aref headers (nth 1 (assoc header gnus-header-index))) (error "Pseudo-articles can't be scored")) (error "No article on current line")))) diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el index d3e8dc4db..78a20c4b1 100644 --- a/lisp/gnus-uu.el +++ b/lisp/gnus-uu.el @@ -802,7 +802,9 @@ The headers will be included in the sequence they are matched.") (setq name (cdr (assq 'name (car files)))) (and (setq action (gnus-uu-get-action name)) - (setcar files (nconc (list (cons 'action action) + (setcar files (nconc (list (if (string= action "gnus-uu-archive") + (cons 'action "file") + (cons 'action action)) (cons 'execute (if (string-match "%" action) (format action name) (concat action " " name)))) @@ -1184,10 +1186,15 @@ The headers will be included in the sequence they are matched.") (if (looking-at gnus-uu-begin-string) (progn - (setq name-end (match-end 1)) - + (setq name-end (match-end 1) + name-beg (match-beginning 1)) + ;; Remove any non gnus-uu-body-line right after start. + (forward-line 1) + (or (looking-at gnus-uu-body-line) + (gnus-delete-line)) + ; Replace any slashes and spaces in file names before decoding - (goto-char (setq name-beg (match-beginning 1))) + (goto-char name-beg) (while (re-search-forward "/" name-end t) (replace-match ",")) (goto-char name-beg) @@ -1369,10 +1376,10 @@ The headers will be included in the sequence they are matched.") ;; Go through FILES and look for files to unpack. (let* ((totfiles (gnus-uu-ls-r gnus-uu-work-dir)) (ofiles files) - file did-unpack) - (gnus-uu-add-file totfiles) + file did-unpack file-entry) + (gnus-uu-add-file totfiles) (while files - (setq file (cdr (assq 'name (car files)))) + (setq file (cdr (setq file-entry (assq 'name (car files))))) (if (and (not (member file ignore)) (equal (gnus-uu-get-action (file-name-nondirectory file)) "gnus-uu-archive")) diff --git a/lisp/gnus-vis.el b/lisp/gnus-vis.el index 26f8dbf35..89c468f5f 100644 --- a/lisp/gnus-vis.el +++ b/lisp/gnus-vis.el @@ -127,17 +127,19 @@ The latter can be used like this: (list "Subject" nil (custom-face-lookup "red" nil nil t t nil)) (list "Newsgroups:.*," nil - (custom-face-lookup "firebrick" nil nil t t nil)) - (list "" 'bold + (custom-face-lookup "yellow" nil nil t t nil)) + (list "" + (custom-face-lookup "cyan" nil nil t nil nil) (custom-face-lookup "green" nil nil nil t nil)))) (t (list (list "From" nil - (custom-face-lookup "red" nil nil t t nil)) + (custom-face-lookup "RoyalBlue" nil nil t t nil)) (list "Subject" nil (custom-face-lookup "firebrick" nil nil t t nil)) (list "Newsgroups:.*," nil - (custom-face-lookup "firebrick" nil nil t t nil)) - (list "" 'bold + (custom-face-lookup "dark orange" nil nil t t nil)) + (list "" + (custom-face-lookup "purple" nil nil t nil nil) (custom-face-lookup "DarkGreen" nil nil nil t nil))))) "Alist of headers and faces used for highlighting them. The entries in the list has the form `(REGEXP NAME CONTENT)', where @@ -160,25 +162,6 @@ will be used.") 'highlight) "Face used when the mouse is over the button.") -(defvar gnus-summary-highlight - '(((> score default) . bold) - ((< score default) . italic)) - "*Alist of `(FORM . FACE)'. -Summary lines are highlighted with the FACE for the first FORM which -evaluate to a non-nil value. - -Point will be at the beginning of the line when FORM is evaluated. -The following can be used for convenience: - -score: (gnus-summary-article-score) -default: gnus-summary-default-score -below: gnus-summary-mark-below - -To check for marks, e.g. to underline replied articles, use -`gnus-summary-article-mark': - - ((= (gnus-summary-article-mark) gnus-replied-mark) . underline)") - (defvar gnus-signature-face 'italic "Face used for signature.") @@ -229,9 +212,15 @@ highlight-headers-follow-url-netscape: ;;; gnus-menu ;;; +(defun gnus-visual-turn-off-edit-menu (type) + (define-key (symbol-value (intern (format "gnus-%s-mode-map" type))) + [menu-bar edit] 'undefined)) + ;; Newsgroup buffer (defun gnus-group-make-menu-bar () + (gnus-visual-turn-off-edit-menu 'group) + (easy-menu-define gnus-group-reading-menu gnus-group-mode-map @@ -328,6 +317,8 @@ highlight-headers-follow-url-netscape: ;; Server mode (defun gnus-server-make-menu-bar () + (gnus-visual-turn-off-edit-menu 'server) + (easy-menu-define gnus-server-menu gnus-server-mode-map @@ -345,6 +336,8 @@ highlight-headers-follow-url-netscape: ;; Browse mode (defun gnus-browse-make-menu-bar () + (gnus-visual-turn-off-edit-menu 'browse) + (easy-menu-define gnus-browse-menu gnus-browse-mode-map @@ -357,6 +350,7 @@ highlight-headers-follow-url-netscape: ;; Summary buffer (defun gnus-summary-make-menu-bar () + (gnus-visual-turn-off-edit-menu 'summary) (easy-menu-define gnus-summary-mark-menu @@ -628,6 +622,7 @@ highlight-headers-follow-url-netscape: ;; Article buffer (defun gnus-article-make-menu-bar () + (gnus-visual-turn-off-edit-menu 'summary) (easy-menu-define gnus-article-article-menu diff --git a/lisp/gnus.el b/lisp/gnus.el index a4f6100b8..c10c8ae95 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -1075,6 +1075,11 @@ This hook is run before any variables are set in the summary buffer.") (defvar gnus-article-mode-hook nil "*A hook for Gnus article mode.") +(defun gnus-summary-exit-hook nil + "*A hook called on exit from the summary buffer. +It calls `gnus-summary-expire-articles' by default.") +(add-hook 'gnus-summary-exit-hook 'gnus-summary-expire-articles) + (defvar gnus-open-server-hook nil "*A hook called just before opening connection to the news server.") @@ -1205,6 +1210,17 @@ variable.") The hook is intended to mark an article as read (or unread) automatically when it is selected.") +;; Remove any hilit infestation. +(add-hook 'gnus-startup-hook + (lambda () + (remove-hook 'gnus-summary-prepare-hook + 'hilit-rehighlight-buffer-quietly) + (remove-hook 'gnus-summary-prepare-hook 'hilit-install-line-hooks) + (setq gnus-mark-article-hook '(gnus-summary-mark-unread-as-read)) + (remove-hook 'gnus-article-prepare-hook + 'hilit-rehighlight-buffer-quietly))) + + ;; Internal variables @@ -1322,10 +1338,10 @@ variable (string, integer, character, etc).") (defvar gnus-have-read-active-file nil) -(defconst gnus-maintainer "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls & Boys)" +(defconst gnus-maintainer "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") -(defconst gnus-version "(ding) Gnus v0.92" +(defconst gnus-version "(ding) Gnus v0.93" "Version number for this version of Gnus.") (defvar gnus-info-nodes @@ -1748,6 +1764,14 @@ Thank you for your help in stamping out bugs. (defun gnus-truncate-string (str width) (substring str 0 width)) +;; Added by Geoffrey T. Dairiki . A safe way +;; to limit the length of a string. This function is necessary since +;; `(substr "abc" 0 30)' pukes with "Args out of range". +(defsubst gnus-limit-string (str width) + (if (> (length str) width) + (substring str 0 width) + str)) + (defsubst gnus-simplify-subject-re (subject) "Remove \"Re:\" from subject lines." (let ((case-fold-search t)) @@ -1898,9 +1922,7 @@ Thank you for your help in stamping out bugs. (defun gnus-format-max-width (form length) (let* ((val (eval form)) (valstr (if (numberp val) (int-to-string val) val))) - (if (> (length valstr) length) - (substring valstr 0 length) - valstr))) + (gnus-limit-string valstr length))) (defun gnus-set-mouse-face (string) ;; Set mouse face property on STRING. @@ -3164,7 +3186,7 @@ prompt the user for the name of an NNTP server to use." written by Masanobu UMEDA - A Praxis Release + A Praxis Release larsi@ifi.uio.no " gnus-version)) @@ -4997,7 +5019,8 @@ buffer. (kill-buffer (current-buffer))) (if gnus-browse-return-buffer (gnus-configure-windows 'server) - (gnus-configure-windows 'group))) + (gnus-configure-windows 'group) + (gnus-group-list-groups nil))) (defun gnus-browse-describe-briefly () "Give a one line description of the group mode commands." @@ -5266,6 +5289,8 @@ buffer. (define-prefix-command 'gnus-summary-backend-map) (define-key gnus-summary-mode-map "B" 'gnus-summary-backend-map) (define-key gnus-summary-backend-map "e" 'gnus-summary-expire-articles) + (define-key gnus-summary-backend-map "\M-\C-e" + 'gnus-summary-expire-articles-now) (define-key gnus-summary-backend-map "\177" 'gnus-summary-delete-article) (define-key gnus-summary-backend-map "m" 'gnus-summary-move-article) (define-key gnus-summary-backend-map "r" 'gnus-summary-respool-article) @@ -5692,21 +5717,6 @@ If NO-ARTICLE is non-nil, no article is selected initially." (goto-char (point-min)) (run-hooks 'gnus-summary-prepare-hook))) -(defun gnus-subject-equal (s1 s2) - (cond - ((numberp gnus-summary-gather-subject-limit) - (string= (if (> (length s1) gnus-summary-gather-subject-limit) - (substring s1 0 gnus-summary-gather-subject-limit) - s1) - (if (> (length s2) gnus-summary-gather-subject-limit) - (substring s2 0 gnus-summary-gather-subject-limit) - s2))) - ((eq 'fuzzy gnus-summary-gather-subject-limit) - (string= (gnus-simplify-subject-fuzzy s1) - (gnus-simplify-subject-fuzzy s2))) - (t - (string= s1 s2)))) - (defun gnus-gather-threads (threads) "Gather threads that have lost their roots." (if (not gnus-summary-make-false-root) @@ -7032,7 +7042,7 @@ searched for." gnus-unread-mark)) (or (not subject) (and (setq psubject (gnus-summary-subject-string)) - (gnus-subject-eq subject psubject)))))) + (gnus-subject-equal subject psubject)))))) (if backward (if (bobp) nil (forward-char -1) t) (if (eobp) nil (forward-char 1) t))))) (if did @@ -7041,7 +7051,7 @@ searched for." (get-text-property (point) 'gnus-number) (gnus-summary-position-cursor))))) -(defun gnus-subject-eq (s1 s2) +(defun gnus-subject-equal (s1 s2) (cond ((null gnus-summary-gather-subject-limit) (equal (gnus-simplify-subject-re s1) @@ -7050,8 +7060,8 @@ searched for." (equal (gnus-simplify-subject-fuzzy s1) (gnus-simplify-subject-fuzzy s2))) ((numberp gnus-summary-gather-subject-limit) - (equal (substring s1 gnus-summary-gather-subject-limit) - (substring s2 gnus-summary-gather-subject-limit))) + (equal (gnus-limit-string s1 gnus-summary-gather-subject-limit) + (gnus-limit-string s2 gnus-summary-gather-subject-limit))) (t (equal s1 s2)))) @@ -7321,12 +7331,15 @@ gnus-exit-group-hook is called with no arguments if that value is non-nil." (mode major-mode) (buf (current-buffer))) (gnus-summary-update-info) ; Make all changes in this group permanent. + (set-buffer buf) + (run-hooks 'gnus-summary-exit-hook) + (and gnus-use-cache (gnus-cache-possibly-remove-articles)) ;; Make sure where I was, and go to next newsgroup. + (set-buffer gnus-group-buffer) (or quit-config (progn (gnus-group-jump-to-group group) (gnus-group-next-unread-group 1))) - (and gnus-use-cache (gnus-cache-possibly-remove-articles)) (if temporary nil ;Nothing to do. ;; We set all buffer-local variables to nil. It is unclear why @@ -7651,6 +7664,7 @@ be displayed." (set-buffer gnus-summary-buffer) (if (or (null gnus-current-article) (null gnus-article-current) + (null (get-buffer gnus-article-buffer)) (not (eq article (cdr gnus-article-current))) (not (equal (car gnus-article-current) gnus-newsgroup-name)) force) @@ -8176,11 +8190,19 @@ article. If BACKWARD (the prefix) is non-nil, search backward instead." (goto-char (point-max)) (and gnus-break-pages (gnus-narrow-to-page)))) -(defun gnus-summary-show-article () - "Force re-fetching of the current article." - (interactive) +(defun gnus-summary-show-article (no-refetch) + "Force re-fetching of the current article. +If the prefix argument NO-REFETCH is non-nil, no actual refetch will +be performed. The current article will simply be redisplayed." + (interactive "P") (gnus-set-global-variables) - (gnus-summary-select-article gnus-have-all-headers t)) + (if (not no-refetch) + (gnus-summary-select-article gnus-have-all-headers t) + (or gnus-current-article + (error "There is no current article")) + (gnus-summary-goto-subject gnus-current-article) + (gnus-configure-windows 'article) + (gnus-summary-position-cursor))) (defun gnus-summary-verbose-headers (arg) "Toggle permanent full header display. @@ -8528,6 +8550,19 @@ functions. (Ie. mail newsgroups at present.)" (gnus-summary-mark-as-read (car expirable) gnus-canceled-mark)) (setq expirable (cdr expirable)))))) +(defun gnus-summary-expire-articles-now () + "Expunge all expirable articles in the current group. +This means that *all* articles that are marked as expirable will be +deleted forever, right now." + (interactive) + (or gnus-expert-user + (gnus-y-or-n-p + "Are you really, really, really sure you want to expunge? ") + (error "Phew!")) + (let ((nnmail-expiry-wait 0) + (nnmail-expiry-wait-function nil)) + (gnus-summary-expire-articles))) + ;; Suggested by Jack Vinson . (defun gnus-summary-delete-article (n) "Delete the N next (mail) articles. @@ -8571,7 +8606,8 @@ This will have permanent effect only in mail groups." 'request-replace-article gnus-newsgroup-name) (error "The current newsgroup does not support article editing.")) (gnus-summary-select-article t) - (other-window 1) + (gnus-configure-windows 'article) + (select-window (get-buffer-window gnus-article-buffer)) (gnus-message 6 "C-c C-c to end edits") (setq buffer-read-only nil) (text-mode) @@ -9251,7 +9287,6 @@ even ticked and dormant ones." "Display all the hidden articles that are marked as dormant." (interactive) (let ((buffer-read-only nil)) - (goto-char (point-min)) (let ((dormant gnus-newsgroup-dormant) headers h) (while dormant @@ -9260,6 +9295,7 @@ even ticked and dormant ones." (setq headers (cons h headers)))) (setq dormant (cdr dormant))) (or headers (error "No dormant articles hidden.")) + (goto-char (point-min)) (save-excursion (gnus-summary-update-lines (point) @@ -13254,6 +13290,7 @@ score files in the \"/ftp.some-where:/pub/score\" directory. (setq dir (expand-file-name (concat gnus-kill-files-directory (gnus-replace-chars-in-string group ?. ?/)))) + (setq dir (gnus-replace-chars-in-string dir ?: ?/)) (setq suffix (car suffixes) suffixes (cdr suffixes)) (if (file-exists-p (concat dir "/" suffix)) @@ -13303,7 +13340,7 @@ GROUP using BNews sys file syntax." (delete-region (1+ (point)) (point-min))) ;; If short file names were used, we have to translate slashes. (goto-char (point-min)) - (while (search-forward "/" nil t) + (while (re-search-forward "[/:]" nil t) (replace-match "." t t)) ;; Translate "all" to ".*". (while (search-forward "all" nil t) diff --git a/lisp/nnbabyl.el b/lisp/nnbabyl.el index 0f7bdd6d7..7f0aa88ed 100644 --- a/lisp/nnbabyl.el +++ b/lisp/nnbabyl.el @@ -234,11 +234,13 @@ (defalias 'nnbabyl-request-post-buffer 'nnmail-request-post-buffer) -(defun nnbabyl-request-expire-articles (articles newsgroup &optional server force) +(defun nnbabyl-request-expire-articles + (articles newsgroup &optional server force) (nnbabyl-possibly-change-newsgroup newsgroup) (let* ((days (or (and nnmail-expiry-wait-function (funcall nnmail-expiry-wait-function newsgroup)) nnmail-expiry-wait)) + (is-old t) rest) (save-excursion (set-buffer nnbabyl-mbox-buffer) @@ -246,11 +248,12 @@ (goto-char (point-min)) (if (search-forward (nnbabyl-article-string (car articles)) nil t) (if (or force - (> (nnmail-days-between - (current-time-string) - (buffer-substring - (point) (progn (end-of-line) (point)))) - days)) + (setq is-old + (> (nnmail-days-between + (current-time-string) + (buffer-substring + (point) (progn (end-of-line) (point)))) + days))) (progn (and gnus-verbose-backends (message "Deleting: %s" (car articles))) @@ -267,7 +270,7 @@ (setcar active (1+ (car active))) (goto-char (point-min)))) (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - rest))) + (nconc rest articles)))) (defun nnbabyl-request-move-article (article group server accept-form &optional last) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 323567237..337c139e2 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -295,11 +295,13 @@ such things as moving mail. All buffers always get killed upon server close.") (defalias 'nnfolder-request-post-buffer 'nnmail-request-post-buffer) -(defun nnfolder-request-expire-articles (articles newsgroup &optional server force) +(defun nnfolder-request-expire-articles + (articles newsgroup &optional server force) (nnfolder-possibly-change-group newsgroup) (let* ((days (or (and nnmail-expiry-wait-function (funcall nnmail-expiry-wait-function newsgroup)) nnmail-expiry-wait)) + (is-old t) rest) (save-excursion (set-buffer nnfolder-current-buffer) @@ -307,11 +309,12 @@ such things as moving mail. All buffers always get killed upon server close.") (goto-char (point-min)) (if (search-forward (nnfolder-article-string (car articles)) nil t) (if (or force - (> (nnmail-days-between - (current-time-string) - (buffer-substring - (point) (progn (end-of-line) (point)))) - days)) + (setq is-old + (> (nnmail-days-between + (current-time-string) + (buffer-substring + (point) (progn (end-of-line) (point)))) + days))) (progn (and gnus-verbose-backends (message "Deleting: %s" (car articles))) @@ -333,7 +336,7 @@ such things as moving mail. All buffers always get killed upon server close.") (match-end 0)))))) (setcar active activemin)) (nnmail-save-active nnfolder-group-alist nnfolder-active-file) - rest))) + (nconc rest articles)))) (defun nnfolder-request-move-article (article group server accept-form &optional last) diff --git a/lisp/nnmbox.el b/lisp/nnmbox.el index 0d3a97706..cbbbe4e2d 100644 --- a/lisp/nnmbox.el +++ b/lisp/nnmbox.el @@ -232,6 +232,7 @@ (let* ((days (or (and nnmail-expiry-wait-function (funcall nnmail-expiry-wait-function newsgroup)) nnmail-expiry-wait)) + (is-old t) rest) (save-excursion (set-buffer nnmbox-mbox-buffer) @@ -239,11 +240,12 @@ (goto-char (point-min)) (if (search-forward (nnmbox-article-string (car articles)) nil t) (if (or force - (> (nnmail-days-between - (current-time-string) - (buffer-substring - (point) (progn (end-of-line) (point)))) - days)) + (setq is-old + (> (nnmail-days-between + (current-time-string) + (buffer-substring + (point) (progn (end-of-line) (point)))) + days))) (progn (and gnus-verbose-backends (message "Deleting: %s" (car articles))) @@ -260,7 +262,7 @@ (setcar active (1+ (car active))) (goto-char (point-min)))) (nnmail-save-active nnmbox-group-alist nnmbox-active-file) - rest))) + (nconc rest articles)))) (defun nnmbox-request-move-article (article group server accept-form &optional last) diff --git a/lisp/nnmh.el b/lisp/nnmh.el index 046486d72..488d6c89a 100644 --- a/lisp/nnmh.el +++ b/lisp/nnmh.el @@ -252,8 +252,9 @@ (string-to-int name))) (directory-files nnmh-current-directory nil "^[0-9]+$" t))) (max-article (and active-articles (apply 'max active-articles))) + (is-old t) article rest mod-time) - (while articles + (while (and articles is-old) (setq article (concat nnmh-current-directory (int-to-string (car articles)))) (if (setq mod-time (nth 5 (file-attributes article))) @@ -262,10 +263,11 @@ (not (= (car articles) max-article))) (not (equal mod-time '(0 0))) (or force - (> (nnmail-days-between - (current-time-string) - (current-time-string mod-time)) - days))) + (setq is-old + (> (nnmail-days-between + (current-time-string) + (current-time-string mod-time)) + days)))) (progn (and gnus-verbose-backends (message "Deleting %s..." article)) (condition-case () @@ -275,7 +277,7 @@ (setq rest (cons (car articles) rest)))) (setq articles (cdr articles))) (message "") - rest)) + (nconc rest articles))) (defun nnmh-close-group (group &optional server) t) @@ -413,7 +415,8 @@ (message "nnmh: Reading incoming mail...")) (setq incoming (nnmail-move-inbox - (car spools) (concat nnmh-directory "Incoming"))) + (car spools) (concat (file-name-as-directory nnmh-directory) + "Incoming"))) (setq incomings (cons incoming incomings)) (setq group (nnmail-get-split-group (car spools) group-in)) (nnmail-split-incoming incoming 'nnmh-save-mail nil group))) diff --git a/lisp/nnml.el b/lisp/nnml.el index 71cf7df75..c58cb8d30 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -269,8 +269,9 @@ all. This may very well take some time.") (string-to-int name))) (directory-files nnml-current-directory nil "^[0-9]+$" t))) (max-article (and active-articles (apply 'max active-articles))) + (is-old t) article rest mod-time) - (while articles + (while (and articles is-old) (setq article (concat nnml-current-directory (int-to-string (car articles)))) (if (setq mod-time (nth 5 (file-attributes article))) @@ -279,10 +280,11 @@ all. This may very well take some time.") (not (= (car articles) max-article))) (not (equal mod-time '(0 0))) (or force - (> (nnmail-days-between - (current-time-string) - (current-time-string mod-time)) - days))) + (setq is-old + (> (nnmail-days-between + (current-time-string) + (current-time-string mod-time)) + days)))) (progn (and gnus-verbose-backends (message "Deleting %s..." article)) (condition-case () @@ -301,7 +303,7 @@ all. This may very well take some time.") (nnmail-save-active nnml-group-alist nnml-active-file)) (nnml-save-nov) (message "") - rest)) + (nconc rest articles))) (defun nnml-request-move-article (article group server accept-form &optional last) diff --git a/lisp/nntp.el b/lisp/nntp.el index 2b0a05ed1..ec1ff4248 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -493,7 +493,6 @@ instead call function `nntp-status-message' to get status message.") (defun nntp-request-group (group &optional server dont-check) "Select GROUP." - (and nntp-async-articles (nntp-async-request-group group)) (nntp-send-command "^.*\r?\n" "GROUP" group) (save-excursion (set-buffer nntp-server-buffer) @@ -501,6 +500,7 @@ instead call function `nntp-status-message' to get status message.") (looking-at "[23]"))) (defun nntp-request-asynchronous (group &optional server articles) + (and nntp-async-articles (nntp-async-request-group group)) (and nntp-async-number (if (not (or (nntp-async-server-opened) diff --git a/texi/Makefile b/texi/Makefile index cac71d273..8500862a2 100644 --- a/texi/Makefile +++ b/texi/Makefile @@ -1,5 +1,6 @@ TEXI2DVI=texi2dvi -MAKEINFO=emacs -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer +EMACS=emacs +MAKEINFO=$(EMACS) -batch -q -no-site-file gnus.texi -l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer # MAKEINFO=makeinfo -o gnus gnus.texi all: gnus diff --git a/texi/gnus.texi b/texi/gnus.texi index e41c0a66a..3c863c94c 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -263,8 +263,9 @@ Ricardo Nassif did the proof-reading. @item Kevin Davidson came up with the name @dfn{ding}, so blame him. @item -Stainless Steel Rat, Jack Vinson, Daniel Quinlan, Ilja Weis, Frank D. Cringle - and Andrew Eskilsson have all contributed code and suggestions. +Stainless Steel Rat, Jack Vinson, Daniel Quinlan, Ilja Weis, Frank D. +Cringle, Geoffrey T. Dairiki and Andrew Eskilsson have all contributed +code and suggestions. @end itemize @@ -274,7 +275,7 @@ Stainless Steel Rat, Jack Vinson, Daniel Quinlan, Ilja Weis, Frank D. Cringle @c Written by Sudish Joseph -@code{gnus-visual} can be used to highlight the summary buffer. It +@code{gnus-vis} can be used to highlight the summary buffer. It offers far more flexibility than hilit (since it has access to more data; eg. the article score) in deciding how to highlight a given article. Also, hilit gets confused by the way Gnus manipulates the @@ -282,7 +283,7 @@ summary buffer, leading to errors. Such errors may be detected by looking for any hilit-specific functions in the @code{*Backtrace*} buffer. If such a reference exists, you should be using the code below. -You can also get @code{gnus-visual} to highlight the article buffer, so +You can also get @code{gnus-vis} to highlight the article buffer, so you should get rid of all hilit-specific Gnus calls. Add the code below to your @file{.gnus} file to remove all the hilit @@ -291,7 +292,7 @@ crud: @lisp (add-hook 'gnus-startup-hook '(lambda () - ;; gnus-visual is far better for summary highlighting + ;; gnus-vis is far better for summary highlighting ;; also, hilit cannot handle a (ding) summary and will ;; crash on you (remove-hook 'gnus-summary-prepare-hook @@ -1987,11 +1988,18 @@ in @code{nnmail-procmail-directory}. To arrive at the file name to put the incoming mail in, append @code{nnmail-procmail-suffix} to the group name. The mail backends will read the mail from these files. -@vindex nnail-resplit-incoming +@vindex nnmail-resplit-incoming When Gnus reads a file called @file{mail.misc.spool}, this mail will be put in the @code{mail.misc}, as one would expect. However, if you want Gnus to split the mail the normal way, you could set -@code{nnail-resplit-incoming} to @code{t}. +@code{nnmail-resplit-incoming} to @code{t}. + +@vindex nnmail-keep-last-article +If you use @code{procmail}, you should set +@code{nnmail-keep-last-article} to non-@code{nil}, to prevent Gnus from +ever expiring the final article in a mail newsgroup. This is quite, +quite important. + @node Expiring Old Mail Articles @subsubsection Expiring Old Mail Articles @@ -2654,7 +2662,7 @@ move around, read articles, post articles and reply to articles. * Paging the Article:: Scrolling the current article. * Reply Followup and Post:: Posting articles. * Canceling and Superseding:: "Whoops, I shouldn't have called him that." -* Ticking and Marking:: Marking articles as read, expirable, etc. +* Marking Articles:: Marking articles as read, expirable, etc. * Threading:: How threads are made. * Asynchronous Fetching:: Gnus might be able to pre-fetch articles. * Article Caching:: You may store articles in a cache. @@ -3574,11 +3582,18 @@ You may want to do spell-checking on messages that you send out. Or, if you don't want to spell-check by hand, you could add automatic spell-checking via the @code{ispell} package: +@vindex news-inews-hook @lisp (add-hook 'news-inews-hook 'ispell-message) ;For news posts (add-hook 'mail-send-hook 'ispell-message) ;for mail posts via sendmail @end lisp +@findex gnus-inews-insert-mime-headers +If you want to insert some @sc{mime} headers into the articles you post, +without doing any actual encoding, you could add +@code{gnus-inews-insert-mime-headers} to @code{gnus-inews-article-hook}. + + @node Canceling and Superseding @section Canceling Articles @cindex canceling articles @@ -3634,8 +3649,8 @@ The previous article will be canceled/superseded. Just remember, kids: There is no 'c' in 'supersede'. -@node Ticking and Marking -@section Ticking and Marking +@node Marking Articles +@section Marking Articles @cindex article marking @cindex article ticking @cindex marks @@ -4256,7 +4271,9 @@ group and return you to the group buffer. @kindex q (Summary) @findex gnus-summary-exit Exit the current group and update all information on the group -(@code{gnus-summary-exit}). +(@code{gnus-summary-exit}). @code{gnus-summary-exit-hook} is called +before doing much of the exiting, and calls +@code{gnus-summary-expire-articles} by default. @item Z E @itemx Q @kindex Z E (Summary) @@ -4855,7 +4872,10 @@ Do a Caesar rotate (rot13) on the article buffer @item A g @kindex A g (Summary) @findex gnus-summary-show-article -Select the current article (@code{gnus-summary-show-article}). +(Re)fetch the current article (@code{gnus-summary-show-article}). If +given a prefix, don't actually refetch any articles, just jump to the +current article and configure the windows to display the current +article. @item A t @kindex A t (Summary) @findex gnus-summary-toggle-header @@ -5694,6 +5714,14 @@ process/prefix convention (@pxref{Process/Prefix}). Expire all expirable articles in the group (@code{gnus-summary-expire-articles}). +@item B M-C-e +@kindex B M-C-e (Summary) +@findex gnus-summary-expire-articles-now +Expunge all the expirable articles in the group +(@code{gnus-summary-expire-articles-now}). This means that @strong{all} +articles that are eligeble for expiry in the current group will +disappear forever into that big @file{/dev/null} in the sky. + @item B DEL @kindex B DEL (Summary) @findex gnus-summary-delete-articles