*** pub/sgnus/lisp/gnus-cite.el Sun Dec 17 18:01:27 1995 --- sgnus/lisp/gnus-cite.el Tue Dec 19 00:24:01 1995 *************** *** 207,276 **** skip (gnus-cite-find-prefix number)) (gnus-cite-add-face number skip gnus-cite-attribution-face))))) ! (defun gnus-article-hide-citation (&optional force) "Hide all cited text except attribution lines. See the documentation for `gnus-article-highlight-citation'." ! (interactive (list 'force)) ! (save-excursion ! (set-buffer gnus-article-buffer) ! (gnus-cite-parse-maybe force) ! (let ((buffer-read-only nil) ! (alist gnus-cite-prefix-alist) ! (inhibit-point-motion-hooks t) ! numbers number) ! (while alist ! (setq numbers (cdr (car alist)) ! alist (cdr alist)) ! (while numbers ! (setq number (car numbers) ! numbers (cdr numbers)) ! (goto-line number) ! (or (assq number gnus-cite-attribution-alist) ! (add-text-properties (point) (progn (forward-line 1) (point)) ! gnus-hidden-properties))))))) ! (defun gnus-article-hide-citation-maybe (&optional force) "Hide cited text that has an attribution line. This will do nothing unless at least `gnus-cite-hide-percentage' percent and at least `gnus-cite-hide-absolute' lines of the body is cited text with attributions. When called interactively, these two variables are ignored. See also the documentation for `gnus-article-highlight-citation'." ! (interactive (list 'force)) (save-excursion (set-buffer gnus-article-buffer) ! (gnus-cite-parse-maybe force) ! (goto-char (point-min)) ! (search-forward "\n\n" nil t) ! (let ((start (point)) ! (atts gnus-cite-attribution-alist) ! (buffer-read-only nil) ! (inhibit-point-motion-hooks t) ! (hiden 0) ! total) ! (goto-char (point-max)) ! (re-search-backward gnus-signature-separator nil t) ! (setq total (count-lines start (point))) ! (while atts ! (setq hiden (+ hiden (length (cdr (assoc (cdr (car atts)) ! gnus-cite-prefix-alist)))) ! atts (cdr atts))) ! (if (or force ! (and (> (* 100 hiden) (* gnus-cite-hide-percentage total)) ! (> hiden gnus-cite-hide-absolute))) ! (progn ! (setq atts gnus-cite-attribution-alist) ! (while atts ! (setq total (cdr (assoc (cdr (car atts)) gnus-cite-prefix-alist)) ! atts (cdr atts)) ! (while total ! (setq hiden (car total) ! total (cdr total)) ! (goto-line hiden) ! (or (assq hiden gnus-cite-attribution-alist) ! (add-text-properties (point) ! (progn (forward-line 1) (point)) ! gnus-hidden-properties))))))))) ;;; Internal functions: --- 207,296 ---- skip (gnus-cite-find-prefix number)) (gnus-cite-add-face number skip gnus-cite-attribution-face))))) ! (defun gnus-article-hide-citation (&optional show force) "Hide all cited text except attribution lines. See the documentation for `gnus-article-highlight-citation'." ! (interactive (list current-prefix-arg 'force)) ! (if show ! (gnus-article-show-hidden-text 'cite) ! (save-excursion ! (set-buffer gnus-article-buffer) ! (gnus-cite-parse-maybe force) ! (let ((buffer-read-only nil) ! (alist gnus-cite-prefix-alist) ! (inhibit-point-motion-hooks t) ! numbers number) ! (while alist ! (setq numbers (cdr (car alist)) ! alist (cdr alist)) ! (while numbers ! (setq number (car numbers) ! numbers (cdr numbers)) ! (goto-line number) ! (or (assq number gnus-cite-attribution-alist) ! (add-text-properties ! (point) (progn (forward-line 1) (point)) ! (nconc (list 'gnus-type 'cite) ! gnus-hidden-properties))))))))) ! (defun gnus-article-hide-citation-maybe (&optional show force) "Hide cited text that has an attribution line. This will do nothing unless at least `gnus-cite-hide-percentage' percent and at least `gnus-cite-hide-absolute' lines of the body is cited text with attributions. When called interactively, these two variables are ignored. See also the documentation for `gnus-article-highlight-citation'." ! (interactive (list current-prefix-arg 'force)) ! (if show ! (gnus-article-show-hidden-text 'cite) ! (save-excursion ! (set-buffer gnus-article-buffer) ! (gnus-cite-parse-maybe force) ! (goto-char (point-min)) ! (search-forward "\n\n" nil t) ! (let ((start (point)) ! (atts gnus-cite-attribution-alist) ! (buffer-read-only nil) ! (inhibit-point-motion-hooks t) ! (hiden 0) ! total) ! (goto-char (point-max)) ! (re-search-backward gnus-signature-separator nil t) ! (setq total (count-lines start (point))) ! (while atts ! (setq hiden (+ hiden (length (cdr (assoc (cdr (car atts)) ! gnus-cite-prefix-alist)))) ! atts (cdr atts))) ! (if (or force ! (and (> (* 100 hiden) (* gnus-cite-hide-percentage total)) ! (> hiden gnus-cite-hide-absolute))) ! (progn ! (setq atts gnus-cite-attribution-alist) ! (while atts ! (setq total (cdr (assoc (cdr (car atts)) ! gnus-cite-prefix-alist)) ! atts (cdr atts)) ! (while total ! (setq hiden (car total) ! total (cdr total)) ! (goto-line hiden) ! (or (assq hiden gnus-cite-attribution-alist) ! (add-text-properties ! (point) (progn (forward-line 1) (point)) ! (nconc (list 'gnus-type 'cite) ! gnus-hidden-properties))))))))))) ! ! (defun gnus-article-hide-citation-in-followups () ! "Hide cited text in non-root articles." ! (interactive) (save-excursion (set-buffer gnus-article-buffer) ! (let ((article (cdr gnus-article-current))) ! (unless (save-excursion ! (set-buffer gnus-summary-buffer) ! (gnus-root-id (mail-header-id ! (gnus-summary-article-header article)))) ! (gnus-article-hide-citation))))) ;;; Internal functions: *************** *** 562,569 **** gnus-hidden-properties)) ((assq number gnus-cite-attribution-alist)) (t ! (add-text-properties (point) (progn (forward-line 1) (point)) ! gnus-hidden-properties))))))) (defun gnus-cite-find-prefix (line) ;; Return citation prefix for LINE. --- 582,591 ---- gnus-hidden-properties)) ((assq number gnus-cite-attribution-alist)) (t ! (add-text-properties ! (point) (progn (forward-line 1) (point)) ! (nconc (list 'gnus-type 'cite) ! gnus-hidden-properties)))))))) (defun gnus-cite-find-prefix (line) ;; Return citation prefix for LINE. *** pub/sgnus/lisp/gnus-msg.el Sun Dec 17 18:01:29 1995 --- sgnus/lisp/gnus-msg.el Tue Dec 19 20:10:21 1995 *************** *** 885,891 **** (buffer-disable-undo (current-buffer)) (erase-buffer) (insert "Newsgroups: " newsgroups "\n" ! "From: " (gnus-inews-real-user-address) "\n" "Subject: cancel " message-id "\n" "Control: cancel " message-id "\n" (if distribution --- 885,891 ---- (buffer-disable-undo (current-buffer)) (erase-buffer) (insert "Newsgroups: " newsgroups "\n" ! "From: " (gnus-inews-user-name) "\n" "Subject: cancel " message-id "\n" "Control: cancel " message-id "\n" (if distribution *************** *** 1803,1809 **** (goto-char last)) (forward-line 2) (gnus-configure-windows 'reply-yank 'force)) ! (run-hooks 'gnus-mail-hook))))) (defun gnus-new-news (&optional group inhibit-prompt) "Set up a *post-news* buffer that points to GROUP. --- 1803,1811 ---- (goto-char last)) (forward-line 2) (gnus-configure-windows 'reply-yank 'force)) ! (run-hooks 'gnus-mail-hook) ! ;; Mark this buffer as unchanged. ! (set-buffer-modified-p nil))))) (defun gnus-new-news (&optional group inhibit-prompt) "Set up a *post-news* buffer that points to GROUP. *************** *** 1820,1825 **** --- 1822,1829 ---- ;; Let posting styles be configured. (gnus-configure-posting-styles) (news-setup nil subject nil (and group (gnus-group-real-name group)) nil) + ;; Associate this buffer with the draft group. + (gnus-associate-buffer-with-draft) (goto-char (point-min)) (unless (re-search-forward *************** *** 1859,1864 **** --- 1863,1870 ---- followup-to distribution newsgroups) (set-buffer (get-buffer-create gnus-post-news-buffer)) (news-reply-mode) + ;; Associate this buffer with the draft group. + (gnus-associate-buffer-with-draft) (if (and (buffer-modified-p) (> (buffer-size) 0) (not (gnus-y-or-n-p *************** *** 2058,2064 **** (to-address (and address-group (mail-fetch-field "to")))) (setq gnus-add-to-address nil) ! (or dont-send (gnus-mail-send)) (bury-buffer) ;; This mail group doesn't have a `to-address', so we add one ;; here. Magic! --- 2064,2071 ---- (to-address (and address-group (mail-fetch-field "to")))) (setq gnus-add-to-address nil) ! (let ((buffer-file-name nil)) ! (or dont-send (gnus-mail-send))) (bury-buffer) ;; This mail group doesn't have a `to-address', so we add one ;; here. Magic! *************** *** 2381,2387 **** (use-local-map (copy-keymap (current-local-map))) (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) (local-set-key "\C-c\C-p" 'gnus-put-message) ! (local-set-key "\C-c\C-d" 'gnus-enter-into-draft-group)) (defun gnus-mail-setup (type &optional to subject in-reply-to cc replybuffer actions) --- 2388,2394 ---- (use-local-map (copy-keymap (current-local-map))) (local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit) (local-set-key "\C-c\C-p" 'gnus-put-message) ! (local-set-key "\C-c\C-d" 'gnus-put-draft-group)) (defun gnus-mail-setup (type &optional to subject in-reply-to cc replybuffer actions) *************** *** 2408,2414 **** 'gnus-mail-other-window-using-vm))) 'gnus-vm-mail-setup) (t 'gnus-sendmail-mail-setup)) ! to subject in-reply-to cc replybuffer actions)) (defun gnus-sendmail-mail-setup (to subject in-reply-to cc replybuffer actions) (mail-mode) --- 2415,2423 ---- 'gnus-mail-other-window-using-vm))) 'gnus-vm-mail-setup) (t 'gnus-sendmail-mail-setup)) ! to subject in-reply-to cc replybuffer actions) ! ;; Associate this mail buffer with the draft group. ! (gnus-associate-buffer-with-draft)) (defun gnus-sendmail-mail-setup (to subject in-reply-to cc replybuffer actions) (mail-mode) *************** *** 2479,2596 **** "Return the name of the draft group." (gnus-group-prefixed-name (file-name-nondirectory gnus-draft-group-directory) ! (list 'nndir gnus-draft-group-directory))) (defun gnus-make-draft-group () "Make the draft group or die trying." ! (let* ((method (` (nndir "private" ! (nndir-directory (, gnus-draft-group-directory))))) ! (group (gnus-group-prefixed-name ! (file-name-nondirectory gnus-draft-group-directory) ! method))) (or (gnus-gethash group gnus-newsrc-hashtb) (gnus-group-make-group (gnus-group-real-name group) method) (error "Can't create the draft group")) group)) ! (defun gnus-enter-into-draft-group () "Enter the current buffer into the draft group." (interactive) ! (gnus-put-in-draft-group t)) ! ! (defun gnus-put-in-draft-group (&optional generate silent) ! "Does the actual putting." ! (let ((group (gnus-make-draft-group)) ! (type (list major-mode (buffer-name) gnus-newsgroup-name ! (point))) ! (mode major-mode) ! (buf (current-buffer))) ! (widen) ! (save-excursion ! (nnheader-set-temp-buffer " *enter-draft*") ! (insert-buffer-substring buf) ! (save-restriction ! (widen) ! (gnus-inews-narrow-to-headers) ! (let (gnus-deletable-headers) ! (if (eq mode 'mail-mode) ! (gnus-inews-insert-headers gnus-required-mail-headers) ! (gnus-inews-insert-headers))) ! (widen)) ! ! (goto-char (point-min)) ! ;; We have to store whether we are in a mail group or news group. ! (insert (format "X-Gnus-Draft-Type: %S\n" type)) ! (and (re-search-forward ! (concat "^" (regexp-quote mail-header-separator) "$") nil t) ! (replace-match "" t t)) ! (if (prog1 ! (gnus-request-accept-article group t) ! (kill-buffer (current-buffer))) ! (or silent ! (gnus-mail-send-and-exit 'dont-send)))) (set-buffer-modified-p nil))) (defun gnus-summary-send-draft () "Enter a mail/post buffer to edit and send the draft." (interactive) (gnus-set-global-variables) ! (gnus-summary-select-article t) ! ;; First we find the draft type. ! (let (type) ! (save-excursion ! (set-buffer gnus-article-buffer) ! (widen) ! (gnus-narrow-to-headers) ! (setq type (condition-case () ! (read (mail-fetch-field "x-gnus-draft-type")) ! (error nil))) ! (widen)) ! (or type ! (error "Unknown draft type")) ! ;; Get to the proper buffer. ! (set-buffer (get-buffer-create (nth 1 type))) ! ;; It might be modified. ! (and (buffer-modified-p) ! (or (gnus-yes-or-no-p "Unsent message being composed; discard it? ") ! (error "Break"))) ! (setq buffer-read-only nil) ! (buffer-enable-undo (current-buffer)) ! (erase-buffer) ! ;; Set proper mode. ! (funcall (car type)) ! (gnus-inews-modify-mail-mode-map) ! (when (eq major-mode 'news-reply-mode) ! (local-set-key "\C-c\C-c" 'gnus-inews-news)) ! ;; Arrange for deletion of the draft after successful sending. ! (make-local-variable 'gnus-message-sent-hook) ! (setq gnus-message-sent-hook ! (list ! `(lambda () ! (gnus-request-expire-articles ! (quote ,(list (cdr gnus-article-current))) ! ,gnus-newsgroup-name t) ! (and (buffer-name ,gnus-summary-buffer) ! (save-excursion ! (set-buffer ,gnus-summary-buffer) ! (gnus-summary-mark-article ! ,(cdr gnus-article-current) gnus-canceled-mark)))))) ! ;; Insert the draft. ! (insert-buffer-substring gnus-article-buffer) ! ;; Insert the separator. ! (goto-char (point-min)) ! (search-forward "\n\n") ! (forward-char -1) ! (insert mail-header-separator) ! ;; Remove the draft header. ! (gnus-inews-narrow-to-headers) ! (nnheader-remove-header "x-gnus-draft-type") ! (widen) ! ;; Configure windows. ! (let ((gnus-draft-buffer (current-buffer))) ! (gnus-configure-windows 'draft)) ! ;; Put point where you left it. ! (goto-char (nth 3 type)))) (defun gnus-configure-posting-styles () "Configure posting styles according to `gnus-posting-styles'." --- 2488,2557 ---- "Return the name of the draft group." (gnus-group-prefixed-name (file-name-nondirectory gnus-draft-group-directory) ! (list 'nndraft gnus-draft-group-directory))) (defun gnus-make-draft-group () "Make the draft group or die trying." ! (let* ((method (` (nndraft "private" ! (nndraft-directory ! (, gnus-draft-group-directory))))) ! (group (gnus-draft-group))) (or (gnus-gethash group gnus-newsrc-hashtb) (gnus-group-make-group (gnus-group-real-name group) method) (error "Can't create the draft group")) + (gnus-check-server method) group)) ! (defun gnus-put-in-draft-group (&optional generate silent) "Enter the current buffer into the draft group." (interactive) ! (when (gnus-request-accept-article (gnus-make-draft-group) t) ! (unless silent ! ;; This function does the proper marking of articles. ! (gnus-mail-send-and-exit 'dont-send)) (set-buffer-modified-p nil))) + (defun gnus-associate-buffer-with-draft () + (save-excursion + ;; Make sure the draft group exists. + (gnus-make-draft-group) + ;; Associate the buffer with the draft group. + (let ((article (gnus-request-associate-buffer (gnus-draft-group)))) + ;; Arrange for deletion of the draft after successful sending. + (make-local-variable 'gnus-message-sent-hook) + (setq gnus-message-sent-hook + (list + `(lambda () + (let ((gnus-verbose-backends nil)) + (gnus-request-expire-articles + (quote ,(list article)) + ,(gnus-draft-group) t)))))))) + (defun gnus-summary-send-draft () "Enter a mail/post buffer to edit and send the draft." (interactive) (gnus-set-global-variables) ! (unless (equal gnus-newsgroup-name (gnus-draft-group)) ! (error "This function can only be used in the draft buffer")) ! (let (buf point) ! (if (not (setq buf (gnus-request-restore-buffer ! (gnus-summary-article-number) gnus-newsgroup-name))) ! (error "Couldn't restore the article") ! (setq point (point)) ! (switch-to-buffer buf) ! (gnus-inews-modify-mail-mode-map) ! (when (eq major-mode 'news-reply-mode) ! (local-set-key "\C-c\C-c" 'gnus-inews-news)) ! (gnus-associate-buffer-with-draft) ! ;; Insert the separator. ! (goto-char (point-min)) ! (search-forward "\n\n") ! (forward-char -1) ! (insert mail-header-separator) ! ;; Configure windows. ! (let ((gnus-draft-buffer (current-buffer))) ! (gnus-configure-windows 'draft) ! (goto-char (point)))))) (defun gnus-configure-posting-styles () "Configure posting styles according to `gnus-posting-styles'." *** pub/sgnus/lisp/gnus-score.el Sun Dec 17 18:01:30 1995 --- sgnus/lisp/gnus-score.el Sun Dec 17 23:55:53 1995 *************** *** 175,180 **** --- 175,181 ---- (define-key gnus-summary-score-map "c" 'gnus-score-change-score-file) (define-key gnus-summary-score-map "m" 'gnus-score-set-mark-below) (define-key gnus-summary-score-map "x" 'gnus-score-set-expunge-below) + (define-key gnus-summary-score-map "R" 'gnus-summary-rescore) (define-key gnus-summary-score-map "e" 'gnus-score-edit-alist) (define-key gnus-summary-score-map "f" 'gnus-score-edit-file) (define-key gnus-summary-score-map "t" 'gnus-score-find-trace) *************** *** 582,587 **** --- 583,589 ---- (gnus-score-update-lines)) (defun gnus-score-update-lines () + "Update all lines in the summary buffer." (save-excursion (goto-char (point-min)) (while (not (eobp)) *************** *** 1708,1714 **** (and winconf (set-window-configuration winconf)))) (defun gnus-score-find-trace () ! "Find all score rules applied to this article." (interactive) (let ((gnus-newsgroup-headers (list (gnus-summary-article-header))) --- 1710,1716 ---- (and winconf (set-window-configuration winconf)))) (defun gnus-score-find-trace () ! "Find all score rules that applies to the current article." (interactive) (let ((gnus-newsgroup-headers (list (gnus-summary-article-header))) *************** *** 1728,1733 **** --- 1730,1743 ---- (setq trace (cdr trace))) (goto-char (point-min)) (pop-to-buffer buf))) + + (defun gnus-summary-rescore () + "Redo the entire scoring process in the current summary." + (interactive) + (setq gnus-newsgroup-scored nil) + (gnus-score-flush-cache) + (gnus-possibly-score-headers) + (gnus-score-update-lines)) (defun gnus-score-flush-cache () "Flush the cache of score files." *************** *** 1813,1860 **** ;; If we can't read it, there are no score files. (if (not (file-exists-p (expand-file-name gnus-kill-files-directory))) (setq gnus-score-file-list nil) ! (if (gnus-use-long-file-name 'not-score) ! ;; We want long file names. ! (if (or (not gnus-score-file-list) (not (car gnus-score-file-list)) (gnus-file-newer-than gnus-kill-files-directory (car gnus-score-file-list))) - (setq gnus-score-file-list - (cons (nth 5 (file-attributes gnus-kill-files-directory)) - (nreverse - (directory-files - gnus-kill-files-directory t - (gnus-score-file-regexp)))))) - ;; We do not use long file names, so we have to do some - ;; directory traversing. - (let ((mdir (length (expand-file-name gnus-kill-files-directory))) - (suffixes (list gnus-score-file-suffix gnus-adaptive-file-suffix)) - dir files suffix) - (while suffixes - (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)) - (setq files (cons (concat dir "/" suffix) files))) - (while (>= (1+ (length dir)) mdir) - (and (file-exists-p (concat dir "/all/" suffix)) - (setq files (cons (concat dir "/all/" suffix) files))) - (string-match "/[^/]*$" dir) - (setq dir (substring dir 0 (match-beginning 0))))) (setq gnus-score-file-list ! (cons nil (nreverse files))))) (cdr gnus-score-file-list))) (defun gnus-score-file-regexp () (concat "\\(" gnus-score-file-suffix ! "\\|" gnus-adaptive-file-suffix "\\)$")) (defun gnus-score-find-bnews (group) "Return a list of score files for GROUP. ! The score files are those files in the ~/News directory which matches GROUP using BNews sys file syntax." (let* ((sfiles (append (gnus-score-score-files group) gnus-internal-global-score-files)) --- 1823,1870 ---- ;; If we can't read it, there are no score files. (if (not (file-exists-p (expand-file-name gnus-kill-files-directory))) (setq gnus-score-file-list nil) ! (if (not (gnus-use-long-file-name 'not-score)) ! ;; We do not use long file names, so we have to do some ! ;; directory traversing. ! (setq gnus-score-file-list ! (cons nil (gnus-score-score-files-1 gnus-kill-files-directory))) ! ;; We want long file names. ! (when (or (not gnus-score-file-list) (not (car gnus-score-file-list)) (gnus-file-newer-than gnus-kill-files-directory (car gnus-score-file-list))) (setq gnus-score-file-list ! (cons (nth 5 (file-attributes gnus-kill-files-directory)) ! (nreverse ! (directory-files ! gnus-kill-files-directory t ! (gnus-score-file-regexp))))))) (cdr gnus-score-file-list))) + (defun gnus-score-score-files-1 (dir) + "Return all possible score files under DIR." + (let ((files (directory-files (expand-file-name dir) t nil t)) + (regexp (gnus-score-file-regexp)) + out file) + (while files + (setq file (pop files)) + (cond + ((string-match "/\\.\\.?\\'" file) + nil) + ((file-directory-p file) + (setq out (nconc (gnus-score-score-files-1 file) out))) + ((string-match regexp file) + (push file out)))) + out)) + (defun gnus-score-file-regexp () + "Return a regexp that match all score files." (concat "\\(" gnus-score-file-suffix ! "\\|" gnus-adaptive-file-suffix "\\)\\'")) (defun gnus-score-find-bnews (group) "Return a list of score files for GROUP. ! The score files are those files in the ~/News/ directory which matches GROUP using BNews sys file syntax." (let* ((sfiles (append (gnus-score-score-files group) gnus-internal-global-score-files)) *** pub/sgnus/lisp/gnus-topic.el Sun Dec 17 18:01:31 1995 --- sgnus/lisp/gnus-topic.el Tue Dec 19 18:30:52 1995 *************** *** 179,185 **** (<= (setq clevel (gnus-info-level info)) level) (>= clevel lowest) ; Is inside the level we want. (or all ! (eq unread t) (> unread 0) (cdr (assq 'tick (gnus-info-marks info))) ; Has right readedness. ;; Check for permanent visibility. --- 179,186 ---- (<= (setq clevel (gnus-info-level info)) level) (>= clevel lowest) ; Is inside the level we want. (or all ! (and gnus-group-list-inactive-groups ! (eq unread t)) (> unread 0) (cdr (assq 'tick (gnus-info-marks info))) ; Has right readedness. ;; Check for permanent visibility. *** pub/sgnus/lisp/gnus-vis.el Sun Dec 17 18:01:32 1995 --- sgnus/lisp/gnus-vis.el Tue Dec 19 00:20:15 1995 *************** *** 1228,1243 **** (gnus-article-highlight-signature) (gnus-article-add-buttons)) - (defun gnus-article-hide (&optional force) - "Hide current article. - This function calls `gnus-article-hide-headers', - `gnus-article-hide-citation-maybe', and `gnus-article-hide-signature' - to do the hiding. See the documentation for those functions." - (interactive (list 'force)) - (gnus-article-hide-headers) - (gnus-article-hide-citation-maybe force) - (gnus-article-hide-signature)) - (defun gnus-article-highlight-headers () "Highlight article headers as specified by `gnus-header-face-alist'." (interactive) --- 1228,1233 ---- *************** *** 1299,1317 **** (gnus-article-add-button start end 'gnus-signature-toggle end) (gnus-overlay-put (gnus-make-overlay end (point-max)) 'face gnus-signature-face)))))) - - (defun gnus-article-hide-signature () - "Hide the signature in an article. - It does this by making everything after `gnus-signature-separator' invisible." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil)) - (goto-char (point-max)) - (and (re-search-backward gnus-signature-separator nil t) - gnus-signature-face - (add-text-properties (match-end 0) (point-max) - gnus-hidden-properties))))) (defun gnus-article-add-buttons (&optional force) "Find external references in the article and make buttons of them. --- 1289,1294 ---- *** pub/sgnus/lisp/gnus.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/gnus.el Tue Dec 19 19:51:40 1995 *************** *** 241,246 **** --- 241,250 ---- subscribed newsgroups. If neither t nor nil, mark as read in all newsgroups.") + (defvar gnus-single-article-buffer t + "*If non-nil, display all articles in the same buffer. + If nil, each group will get its own article buffer.") + (defvar gnus-use-dribble-file t "*Non-nil means that Gnus will use a dribble file to store user updates. If Emacs should crash without saving the .newsrc files, complete *************** *** 347,352 **** --- 351,360 ---- a possible file name; and if it returns a non-nil list, that list will be used as possible file names.") + (defvar gnus-move-split-methods nil + "*Variable used to suggest where articles are to be moved to. + It uses the same syntax as the `gnus-split-methods' variable.") + (defvar gnus-save-score nil "*If non-nil, save group scoring info.") *************** *** 620,625 **** --- 628,636 ---- (defvar gnus-group-use-permanent-levels nil "*If non-nil, once you set a level, Gnus will use this level.") + (defvar gnus-group-list-inactive-groups t + "*If non-nil, inactive groups will be listed.") + (defvar gnus-show-mime nil "*If non-nil, do mime processing of articles. The articles will simply be fed to the function given by *************** *** 1575,1581 **** "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.24" "Version number for this version of Gnus.") (defvar gnus-info-nodes --- 1586,1592 ---- "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.25" "Version number for this version of Gnus.") (defvar gnus-info-nodes *************** *** 1865,1871 **** ("gnus-vis" :interactive t gnus-article-push-button gnus-article-press-button gnus-article-highlight gnus-article-highlight-some - gnus-article-hide gnus-article-hide-signature gnus-article-highlight-headers gnus-article-highlight-signature gnus-article-add-buttons gnus-article-add-buttons-to-head gnus-article-next-button gnus-article-prev-button) --- 1876,1881 ---- *************** *** 4214,4220 **** (<= (setq clevel (gnus-info-level info)) level) (>= clevel lowest) (or all ; We list all groups? ! (eq unread t) ; We list unactivated groups (> unread 0) ; We list groups with unread articles (cdr (assq 'tick (gnus-info-marks info))) ; And groups with tickeds --- 4224,4231 ---- (<= (setq clevel (gnus-info-level info)) level) (>= clevel lowest) (or all ; We list all groups? ! (and gnus-group-list-inactive-groups ! (eq unread t)) ; We list unactivated groups (> unread 0) ; We list groups with unread articles (cdr (assq 'tick (gnus-info-marks info))) ; And groups with tickeds *************** *** 5553,5558 **** --- 5564,5570 ---- (setq group (pop groups)) (gnus-group-remove-mark group) (when (gnus-check-backend-function 'request-expire-articles group) + (gnus-message 6 "Expiring articles in %s..." group) (let* ((info (gnus-get-info group)) (expirable (if (gnus-group-total-expirable-p group) (cons nil (gnus-list-of-read-articles group)) *************** *** 5568,5574 **** (gnus-uncompress-sequence (cdr expirable)) group)) (gnus-request-expire-articles (gnus-uncompress-sequence (cdr expirable)) ! group)))))))))) (defun gnus-group-expire-all-groups () "Expire all expirable articles in all newsgroups." --- 5580,5589 ---- (gnus-uncompress-sequence (cdr expirable)) group)) (gnus-request-expire-articles (gnus-uncompress-sequence (cdr expirable)) ! group))))) ! (gnus-message 6 "Expiring articles in %s...done" group))) ! (gnus-group-position-point)))) ! (defun gnus-group-expire-all-groups () "Expire all expirable articles in all newsgroups." *************** *** 5927,5933 **** (or (gnus-get-new-news-in-group group) (progn (ding) ! (message "%s error: %s" group (gnus-status-message group)) (sit-for 2)))) (gnus-group-next-unread-group 1 t) (gnus-summary-position-point) --- 5942,5948 ---- (or (gnus-get-new-news-in-group group) (progn (ding) ! (gnus-message 3 "%s error: %s" group (gnus-status-message group)) (sit-for 2)))) (gnus-group-next-unread-group 1 t) (gnus-summary-position-point) *************** *** 5976,5982 **** gnus-description-hashtb)) (setq desc (gnus-group-get-description group)) (gnus-read-descriptions-file method)) ! (message (or desc (gnus-gethash group gnus-description-hashtb) "No description available"))))) --- 5991,5997 ---- gnus-description-hashtb)) (setq desc (gnus-group-get-description group)) (gnus-read-descriptions-file method)) ! (message (or desc (gnus-gethash group gnus-description-hashtb) "No description available"))))) *************** *** 7118,7124 **** (setq gnus-summary-buffer (set-buffer (get-buffer-create buffer))) (gnus-add-current-to-buffer-list) (gnus-summary-mode group) ! (and gnus-carpal (gnus-carpal-setup-buffer 'summary)) (setq gnus-newsgroup-name group) t))) --- 7133,7142 ---- (setq gnus-summary-buffer (set-buffer (get-buffer-create buffer))) (gnus-add-current-to-buffer-list) (gnus-summary-mode group) ! (when gnus-carpal ! (gnus-carpal-setup-buffer 'summary)) ! (unless gnus-single-article-buffer ! (make-local-variable 'gnus-article-buffer)) (setq gnus-newsgroup-name group) t))) *************** *** 7126,7148 **** ;; Set the global equivalents of the summary buffer-local variables ;; to the latest values they had. These reflect the summary buffer ;; that was in action when the last article was fetched. ! (if (eq major-mode 'gnus-summary-mode) ! (progn ! (setq gnus-summary-buffer (current-buffer)) ! (let ((name gnus-newsgroup-name) ! (marked gnus-newsgroup-marked) ! (unread gnus-newsgroup-unreads) ! (headers gnus-current-headers) ! (data gnus-newsgroup-data) ! (score-file gnus-current-score-file)) ! (save-excursion ! (set-buffer gnus-group-buffer) ! (setq gnus-newsgroup-name name) ! (setq gnus-newsgroup-marked marked) ! (setq gnus-newsgroup-unreads unread) ! (setq gnus-current-headers headers) ! (setq gnus-newsgroup-data data) ! (setq gnus-current-score-file score-file)))))) (defun gnus-summary-last-article-p (&optional article) "Return whether ARTICLE is the last article in the buffer." --- 7144,7167 ---- ;; Set the global equivalents of the summary buffer-local variables ;; to the latest values they had. These reflect the summary buffer ;; that was in action when the last article was fetched. ! (when (eq major-mode 'gnus-summary-mode) ! (setq gnus-summary-buffer (current-buffer)) ! (let ((name gnus-newsgroup-name) ! (marked gnus-newsgroup-marked) ! (unread gnus-newsgroup-unreads) ! (headers gnus-current-headers) ! (data gnus-newsgroup-data) ! (article-buffer gnus-article-buffer) ! (score-file gnus-current-score-file)) ! (save-excursion ! (set-buffer gnus-group-buffer) ! (setq gnus-newsgroup-name name) ! (setq gnus-newsgroup-marked marked) ! (setq gnus-newsgroup-unreads unread) ! (setq gnus-current-headers headers) ! (setq gnus-newsgroup-data data) ! (setq gnus-article-buffer article-buffer) ! (setq gnus-current-score-file score-file))))) (defun gnus-summary-last-article-p (&optional article) "Return whether ARTICLE is the last article in the buffer." *************** *** 7319,7325 **** (and (eq major-mode 'gnus-summary-mode) (gnus-set-global-variables)) (gnus-configure-windows (cdr quit-config))))) ! (message "Can't select group") nil) ;; The user did a `C-g' while prompting for number of articles, ;; so we exit this group. --- 7338,7344 ---- (and (eq major-mode 'gnus-summary-mode) (gnus-set-global-variables)) (gnus-configure-windows (cdr quit-config))))) ! (gnus-message 3 "Can't select group") nil) ;; The user did a `C-g' while prompting for number of articles, ;; so we exit this group. *************** *** 7771,7777 **** "Prepare summary buffer from THREADS and indentation LEVEL. THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])' or a straight list of headers." ! (message "Generating summary...") (setq gnus-newsgroup-threads threads) (beginning-of-line) --- 7790,7796 ---- "Prepare summary buffer from THREADS and indentation LEVEL. THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])' or a straight list of headers." ! (gnus-message 7 "Generating summary...") (setq gnus-newsgroup-threads threads) (beginning-of-line) *************** *** 8010,8016 **** (setq threads (if thread-end nil (cdr (car thread)))) (unless threads (setq gnus-tmp-level 0))))) ! (message "Generating summary...done")) (defun gnus-summary-prepare-unthreaded (headers) "Generate an unthreaded summary buffer based on HEADERS." --- 8029,8035 ---- (setq threads (if thread-end nil (cdr (car thread)))) (unless threads (setq gnus-tmp-level 0))))) ! (gnus-message 7 "Generating summary...done")) (defun gnus-summary-prepare-unthreaded (headers) "Generate an unthreaded summary buffer based on HEADERS." *************** *** 8754,8760 **** )) (error (progn (ding) ! (message "Strange nov line.") (setq header nil) (goto-char eol)))) --- 8773,8779 ---- )) (error (progn (ding) ! (gnus-message 4 "Strange nov line") (setq header nil) (goto-char eol)))) *************** *** 9199,9204 **** --- 9218,9226 ---- (gnus-group-next-unread-group 1))) (if temporary nil ;Nothing to do. + ;; If we have several article buffers, we kill them at exit. + (unless gnus-single-article-buffer + (gnus-kill-buffer gnus-article-buffer)) (if (not gnus-kill-summary-on-exit) (gnus-deaden-summary) ;; We set all buffer-local variables to nil. It is unclear why *************** *** 9241,9246 **** --- 9263,9271 ---- (when (or no-questions gnus-expert-user (gnus-y-or-n-p "Do you really wanna quit reading this group? ")) + ;; If we have several article buffers, we kill them at exit. + (unless gnus-single-article-buffer + (gnus-kill-buffer gnus-article-buffer)) (if (not gnus-kill-summary-on-exit) (gnus-deaden-summary) (gnus-close-group group) *************** *** 9496,9504 **** (gnus-summary-insert-subject article) (setq data (gnus-data-find article))) (goto-char b) ! (if (and (not silent) (not data)) (progn ! (message "Can't find article %d" article) nil) (goto-char (gnus-data-pos data)) article))) --- 9521,9530 ---- (gnus-summary-insert-subject article) (setq data (gnus-data-find article))) (goto-char b) ! (if (not data) (progn ! (unless silent ! (gnus-message 3 "Can't find article %d" article)) nil) (goto-char (gnus-data-pos data)) article))) *************** *** 9546,9564 **** (prog1 (save-excursion (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) ;; The requested article is different from the current article. ! (progn ! (gnus-summary-display-article article all-headers) (setq did article)) (if (or all-headers gnus-show-all-headers) (gnus-article-show-all-headers)) ! nil)) (if did (gnus-article-set-window-start (cdr (assq article gnus-newsgroup-bookmarks))))))) --- 9572,9594 ---- (prog1 (save-excursion (set-buffer gnus-summary-buffer) ! (if (or (and gnus-single-article-buffer ! (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)))) ! (and (not gnus-single-article-buffer) ! (null gnus-current-article)) force) ;; The requested article is different from the current article. ! (prog1 ! (gnus-summary-display-article article all-headers) (setq did article)) (if (or all-headers gnus-show-all-headers) (gnus-article-show-all-headers)) ! t)) (if did (gnus-article-set-window-start (cdr (assq article gnus-newsgroup-bookmarks))))))) *************** *** 9832,9838 **** (prog1 (if (gnus-summary-goto-subject article force) (gnus-summary-display-article article all-headers) ! (message "Couldn't go to article %s" article) nil) (gnus-summary-position-point))) (defun gnus-summary-goto-last-article () --- 9862,9868 ---- (prog1 (if (gnus-summary-goto-subject article force) (gnus-summary-display-article article all-headers) ! (gnus-message 4 "Couldn't go to article %s" article) nil) (gnus-summary-position-point))) (defun gnus-summary-goto-last-article () *************** *** 9864,9869 **** --- 9894,9900 ---- (gnus-set-global-variables) (prog1 (let ((articles (gnus-summary-work-articles n))) + (setq gnus-newsgroup-processable nil) (gnus-summary-limit articles)) (gnus-summary-position-point))) *************** *** 10007,10013 **** (if data ;; We try to find some article after the current one. (while data ! (and (gnus-summary-goto-subject (gnus-data-number (car data))) (setq data nil found t)) (setq data (cdr data)))) --- 10038,10045 ---- (if data ;; We try to find some article after the current one. (while data ! (and (gnus-summary-goto-subject ! (gnus-data-number (car data)) nil t) (setq data nil found t)) (setq data (cdr data)))) *************** *** 10511,10540 **** and `request-accept' functions. (Ie. mail newsgroups at present.)" (interactive "P") (gnus-set-global-variables) ! (or (gnus-check-backend-function 'request-move-article gnus-newsgroup-name) ! (error "The current newsgroup does not support article moving")) (let ((articles (gnus-summary-work-articles n)) (prefix (gnus-group-real-prefix gnus-newsgroup-name)) art-group to-method sel-met) ! (if (and (not to-newsgroup) (not select-method)) ! (setq to-newsgroup ! (completing-read ! (format "Where do you want to move %s? %s" ! (if (> (length articles) 1) ! (format "these %d articles" (length articles)) ! "this article") ! (if gnus-current-move-group ! (format "(default %s) " gnus-current-move-group) ! "")) ! gnus-active-hashtb nil nil prefix))) ! (if to-newsgroup ! (progn ! (if (or (string= to-newsgroup "") (string= to-newsgroup prefix)) ! (setq to-newsgroup (or gnus-current-move-group ""))) ! (or (gnus-active to-newsgroup) ! (gnus-activate-group to-newsgroup) ! (error "No such group: %s" to-newsgroup)) ! (setq gnus-current-move-group to-newsgroup))) (setq to-method (if select-method (list select-method "") (gnus-find-method-for-group to-newsgroup))) (or (gnus-check-backend-function 'request-accept-article (car to-method)) --- 10543,10560 ---- and `request-accept' functions. (Ie. mail newsgroups at present.)" (interactive "P") (gnus-set-global-variables) ! (unless (gnus-check-backend-function ! 'request-move-article gnus-newsgroup-name) ! (error "The current newsgroup does not support article moving")) (let ((articles (gnus-summary-work-articles n)) (prefix (gnus-group-real-prefix gnus-newsgroup-name)) art-group to-method sel-met) ! (when (and (not to-newsgroup) ! (not select-method)) ! (setq to-newsgroup ! (gnus-read-move-group-name ! "move" gnus-current-move-group articles prefix)) ! (setq gnus-current-move-group to-newsgroup)) (setq to-method (if select-method (list select-method "") (gnus-find-method-for-group to-newsgroup))) (or (gnus-check-backend-function 'request-accept-article (car to-method)) *************** *** 10661,10685 **** (prefix (gnus-group-real-prefix gnus-newsgroup-name)) art-group to-method) (buffer-disable-undo copy-buf) ! (if (and (not to-newsgroup) (not select-method)) ! (setq to-newsgroup ! (completing-read ! (format "Where do you want to copy %s? %s" ! (if (> (length articles) 1) ! (format "these %d articles" (length articles)) ! "this article") ! (if gnus-current-move-group ! (format "(default %s) " gnus-current-move-group) ! "")) ! gnus-active-hashtb nil nil prefix))) ! (if to-newsgroup ! (progn ! (if (or (string= to-newsgroup "") (string= to-newsgroup prefix)) ! (setq to-newsgroup (or gnus-current-move-group ""))) ! (or (gnus-active to-newsgroup) ! (gnus-activate-group to-newsgroup) ! (error "No such group: %s" to-newsgroup)) ! (setq gnus-current-move-group to-newsgroup))) (setq to-method (if select-method (list select-method "") (gnus-find-method-for-group to-newsgroup))) (or (gnus-check-backend-function 'request-accept-article (car to-method)) --- 10681,10692 ---- (prefix (gnus-group-real-prefix gnus-newsgroup-name)) art-group to-method) (buffer-disable-undo copy-buf) ! (when (and (not to-newsgroup) ! (not select-method)) ! (setq to-newsgroup ! (gnus-read-move-group-name ! "copy" gnus-current-move-group articles prefix)) ! (setq gnus-current-move-group to-newsgroup)) (setq to-method (if select-method (list select-method "") (gnus-find-method-for-group to-newsgroup))) (or (gnus-check-backend-function 'request-accept-article (car to-method)) *************** *** 10898,10904 **** (if (gnus-group-read-only-p) (progn (gnus-summary-edit-article-postpone) ! (message "The current newsgroup does not support article editing.") (ding)) (let ((buf (buffer-substring-no-properties (point-min) (point-max)))) (erase-buffer) --- 10905,10912 ---- (if (gnus-group-read-only-p) (progn (gnus-summary-edit-article-postpone) ! (gnus-message ! 1 "The current newsgroup does not support article editing.") (ding)) (let ((buf (buffer-substring-no-properties (point-min) (point-max)))) (erase-buffer) *************** *** 11607,11613 **** read." (interactive "P") (gnus-set-global-variables) ! (gnus-summary-catchup all) (gnus-summary-next-article t)) ;; Thread-based commands. --- 11615,11622 ---- read." (interactive "P") (gnus-set-global-variables) ! (save-excursion ! (gnus-summary-catchup all)) (gnus-summary-next-article t)) ;; Thread-based commands. *************** *** 11944,11950 **** ;; Remove headers accoring to `gnus-saved-headers'. (let ((gnus-visible-headers (or gnus-saved-headers gnus-visible-headers))) ! (gnus-article-hide-headers t))) ;; Remove any X-Gnus lines. (save-excursion (set-buffer gnus-article-buffer) --- 11953,11959 ---- ;; Remove headers accoring to `gnus-saved-headers'. (let ((gnus-visible-headers (or gnus-saved-headers gnus-visible-headers))) ! (gnus-article-hide-headers nil t))) ;; Remove any X-Gnus lines. (save-excursion (set-buffer gnus-article-buffer) *************** *** 12026,12036 **** (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file)) (gnus-summary-save-article arg))) ! (defun gnus-read-save-file-name (prompt default-name) ! (let ((methods gnus-split-methods) ! split-name method result match) ! ;; Let the split methods have their say. ! (when gnus-split-methods (save-excursion (set-buffer gnus-original-article-buffer) (save-restriction --- 12035,12044 ---- (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file)) (gnus-summary-save-article arg))) ! (defun gnus-get-split-value (methods) ! "Return a value based on the split METHODS." ! (let (split-name method result match) ! (when methods (save-excursion (set-buffer gnus-original-article-buffer) (save-restriction *************** *** 12058,12063 **** --- 12066,12110 ---- (push result split-name)) ((consp result) (setq split-name (append result split-name))))))))) + split-name)) + + (defun gnus-read-move-group-name (prompt default articles prefix) + "Read a group name." + (let* ((split-name (gnus-get-split-value gnus-move-split-methods)) + (prom + (format "Where do you want to %s %s? " + prompt + (if (> (length articles) 1) + (format "these %d articles" (length articles)) + "this article"))) + (to-newsgroup + (cond + ((null split-name) + (completing-read + (concat prom + (if default + (format "(default %s) " default) + "")) + gnus-active-hashtb nil nil prefix)) + ((= 1 (length split-name)) + (completing-read prom gnus-active-hashtb + nil nil (cons (car split-name) 0))) + (t + (completing-read + prom (mapcar (lambda (el) (list el)) (nreverse split-name))))))) + + (when to-newsgroup + (if (or (string= to-newsgroup "") + (string= to-newsgroup prefix)) + (setq to-newsgroup (or default ""))) + (or (gnus-active to-newsgroup) + (gnus-activate-group to-newsgroup) + (error "No such group: %s" to-newsgroup))) + to-newsgroup)) + + (defun gnus-read-save-file-name (prompt default-name) + (let ((split-name (gnus-get-split-value gnus-split-methods))) + ;; Let the split methods have their say. (cond ;; No split name was found. ((null split-name) *************** *** 12437,12458 **** (run-hooks 'gnus-article-mode-hook)) (defun gnus-article-setup-buffer () ! "Initialize article mode buffer." ;; Returns the article buffer. ! (if (get-buffer gnus-article-buffer) (save-excursion ! (set-buffer gnus-article-buffer) ! (buffer-disable-undo (current-buffer)) ! (setq buffer-read-only t) (gnus-add-current-to-buffer-list) ! (or (eq major-mode 'gnus-article-mode) ! (gnus-article-mode)) ! (current-buffer)) ! (save-excursion ! (set-buffer (get-buffer-create gnus-article-buffer)) ! (gnus-add-current-to-buffer-list) ! (gnus-article-mode) ! (current-buffer)))) ;; Set article window start at LINE, where LINE is the number of lines ;; from the head of the article. --- 12484,12514 ---- (run-hooks 'gnus-article-mode-hook)) (defun gnus-article-setup-buffer () ! "Initialize the article buffer." ;; Returns the article buffer. ! (let ((name (if gnus-single-article-buffer "*Article*" ! (concat "*Article " gnus-newsgroup-name "*")))) ! (setq gnus-article-buffer name) ! ;; This might be a variable local to the summary buffer. ! (unless gnus-single-article-buffer (save-excursion ! (set-buffer gnus-summary-buffer) ! (setq gnus-article-buffer name)) ! (make-local-variable 'gnus-summary-buffer)) ! (if (get-buffer name) ! (save-excursion ! (set-buffer name) ! (buffer-disable-undo (current-buffer)) ! (setq buffer-read-only t) ! (gnus-add-current-to-buffer-list) ! (or (eq major-mode 'gnus-article-mode) ! (gnus-article-mode)) ! (current-buffer)) ! (save-excursion ! (set-buffer (get-buffer-create name)) (gnus-add-current-to-buffer-list) ! (gnus-article-mode) ! (current-buffer))))) ;; Set article window start at LINE, where LINE is the number of lines ;; from the head of the article. *************** *** 12761,12833 **** gnus-inhibit-hiding (gnus-article-hide-headers))) ! (defun gnus-article-hide-headers (&optional delete) "Hide unwanted headers and possibly sort them as well." (interactive "P") ;; This function might be inhibited. ! (unless gnus-inhibit-hiding ! (save-excursion ! (set-buffer gnus-article-buffer) ! (save-restriction ! (let ((buffer-read-only nil) ! (ignored (when (not (stringp gnus-visible-headers)) ! (cond ((stringp gnus-ignored-headers) ! gnus-ignored-headers) ! ((listp gnus-ignored-headers) ! (mapconcat 'identity gnus-ignored-headers ! "\\|"))))) ! (visible (cond ((stringp gnus-visible-headers) ! gnus-visible-headers) ! ((listp gnus-visible-headers) ! (mapconcat 'identity gnus-visible-headers ! "\\|")))) ! want-list beg want-l) ! ;; First we narrow to just the headers. ! (widen) ! (goto-char (point-min)) ! ;; Hide any "From " lines at the beginning of (mail) articles. ! (while (looking-at "From ") ! (forward-line 1)) ! (unless (bobp) ! (add-text-properties (point-min) (point) gnus-hidden-properties)) ! ;; Then treat the rest of the header lines. ! (narrow-to-region ! (point) ! (progn (search-forward "\n\n" nil t) (forward-line -1) (point))) ! ;; Then we use the two regular expressions ! ;; `gnus-ignored-headers' and `gnus-visible-headers' to ! ;; select which header lines is to remain visible in the ! ;; article buffer. ! (goto-char (point-min)) ! (while (re-search-forward "^[^ \t]*:" nil t) ! (beginning-of-line) ! ;; We add the headers we want to keep to a list and delete ! ;; them from the buffer. ! (if (or (and visible (looking-at visible)) ! (and ignored (not (looking-at ignored)))) ! (progn ! (push (buffer-substring ! (setq beg (point)) ! (progn ! (forward-line 1) ! ;; Be sure to get multi-line headers... ! (re-search-forward "^[^ \t]*:" nil t) ! (beginning-of-line) ! (point))) ! want-list) ! (delete-region beg (point))) ! (forward-line 1))) ! ;; Sort the headers that we want to display. ! (setq want-list (sort want-list 'gnus-article-header-less)) ! (goto-char (point-min)) ! (while want-list ! (insert (pop want-list))) ! ;; We make the unwanted headers invisible. ! (if delete ! (delete-region (point-min) (point-max)) ! ;; Suggested by Sudish Joseph . ! (add-text-properties ! (point) (point-max) gnus-hidden-properties))))))) (defsubst gnus-article-header-rank (header) "Give the rank of the string HEADER as given by `gnus-sorted-header-list'." --- 12817,12895 ---- gnus-inhibit-hiding (gnus-article-hide-headers))) ! (defun gnus-article-hide-headers (&optional show delete) "Hide unwanted headers and possibly sort them as well." (interactive "P") ;; This function might be inhibited. ! (if show ! (gnus-article-show-hidden-text 'headers) ! (unless gnus-inhibit-hiding ! (save-excursion ! (set-buffer gnus-article-buffer) ! (save-restriction ! (let ((buffer-read-only nil) ! (ignored (when (not (stringp gnus-visible-headers)) ! (cond ((stringp gnus-ignored-headers) ! gnus-ignored-headers) ! ((listp gnus-ignored-headers) ! (mapconcat 'identity gnus-ignored-headers ! "\\|"))))) ! (visible (cond ((stringp gnus-visible-headers) ! gnus-visible-headers) ! ((listp gnus-visible-headers) ! (mapconcat 'identity gnus-visible-headers ! "\\|")))) ! want-list beg want-l) ! ;; First we narrow to just the headers. ! (widen) ! (goto-char (point-min)) ! ;; Hide any "From " lines at the beginning of (mail) articles. ! (while (looking-at "From ") ! (forward-line 1)) ! (unless (bobp) ! (add-text-properties ! (point-min) (point) ! (nconc (list 'gnus-type 'headers) gnus-hidden-properties))) ! ;; Then treat the rest of the header lines. ! (narrow-to-region ! (point) ! (progn (search-forward "\n\n" nil t) (forward-line -1) (point))) ! ;; Then we use the two regular expressions ! ;; `gnus-ignored-headers' and `gnus-visible-headers' to ! ;; select which header lines is to remain visible in the ! ;; article buffer. ! (goto-char (point-min)) ! (while (re-search-forward "^[^ \t]*:" nil t) ! (beginning-of-line) ! ;; We add the headers we want to keep to a list and delete ! ;; them from the buffer. ! (if (or (and visible (looking-at visible)) ! (and ignored (not (looking-at ignored)))) ! (progn ! (push (buffer-substring ! (setq beg (point)) ! (progn ! (forward-line 1) ! ;; Be sure to get multi-line headers... ! (re-search-forward "^[^ \t]*:" nil t) ! (beginning-of-line) ! (point))) ! want-list) ! (delete-region beg (point))) ! (forward-line 1))) ! ;; Sort the headers that we want to display. ! (setq want-list (sort want-list 'gnus-article-header-less)) ! (goto-char (point-min)) ! (while want-list ! (insert (pop want-list))) ! ;; We make the unwanted headers invisible. ! (if delete ! (delete-region (point-min) (point-max)) ! ;; Suggested by Sudish Joseph . ! (add-text-properties ! (point) (point-max) ! (nconc (list 'gnus-type 'headers) ! gnus-hidden-properties))))))))) (defsubst gnus-article-header-rank (header) "Give the rank of the string HEADER as given by `gnus-sorted-header-list'." *************** *** 12991,13028 **** (delete-char 1)) ((gnus-message 3 "Malformed MIME quoted-printable message"))))) ! (defun gnus-article-hide-pgp () ! "Hide any PGP headers and signatures in the current article." (interactive) (save-excursion (set-buffer gnus-article-buffer) ! (let (buffer-read-only beg end) ! (widen) ! (goto-char (point-min)) ! ;; Hide the "header". ! (and (search-forward "\n-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) ! (add-text-properties (match-beginning 0) (match-end 0) ! gnus-hidden-properties)) ! (setq beg (point)) ! ;; Hide the actual signature. ! (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) ! (setq end (match-beginning 0)) ! (add-text-properties ! (match-beginning 0) ! (if (search-forward "\n-----END PGP SIGNATURE-----\n" nil t) ! (match-end 0) ! ;; Perhaps we shouldn't hide to the end of the buffer ! ;; if there is no end to the signature? ! (point-max)) ! gnus-hidden-properties)) ! ;; Hide "- " PGP quotation markers. ! (when (and beg end) ! (narrow-to-region beg end) ! (goto-char (point-min)) ! (while (re-search-forward "^- " nil t) ! (add-text-properties (match-beginning 0) (match-end 0) ! gnus-hidden-properties)) ! (widen))))) (defvar gnus-article-time-units `((year . ,(* 365.25 24 60 60)) --- 13053,13130 ---- (delete-char 1)) ((gnus-message 3 "Malformed MIME quoted-printable message"))))) ! (defun gnus-article-hide-pgp (&optional show) ! "Hide any PGP headers and signatures in the current article. ! If given a prefix, show the hidden PGP gruft instead." (interactive) + (if show + (gnus-article-show-hidden-text 'pgp) + (save-excursion + (set-buffer gnus-article-buffer) + (let ((props (nconc (list 'gnus-type 'pgp) gnus-hidden-properties)) + buffer-read-only beg end) + (widen) + (goto-char (point-min)) + ;; Hide the "header". + (and (search-forward "\n-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) + (add-text-properties (match-beginning 0) (match-end 0) props)) + (setq beg (point)) + ;; Hide the actual signature. + (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) + (setq end (match-beginning 0)) + (add-text-properties + (match-beginning 0) + (if (search-forward "\n-----END PGP SIGNATURE-----\n" nil t) + (match-end 0) + ;; Perhaps we shouldn't hide to the end of the buffer + ;; if there is no end to the signature? + (point-max)) + props)) + ;; Hide "- " PGP quotation markers. + (when (and beg end) + (narrow-to-region beg end) + (goto-char (point-min)) + (while (re-search-forward "^- " nil t) + (add-text-properties (match-beginning 0) (match-end 0) props)) + (widen)))))) + + (defun gnus-article-hide-signature (&optional show) + "Hide the signature in the current article. + If given a prefix, show the signature instead." + (interactive "P") + (if show + (gnus-article-show-hidden-text 'signature) + (save-excursion + (set-buffer gnus-article-buffer) + (let ((buffer-read-only nil)) + (goto-char (point-max)) + (and (re-search-backward gnus-signature-separator nil t) + gnus-signature-face + (add-text-properties + (match-end 0) (point-max) + (nconc (list 'gnus-type 'signature) + gnus-hidden-properties))))))) + + (defun gnus-article-hide (&optional show force) + "Hide all the gruft in the current article. + This means that PGP stuff, signatures, cited text and (some) + headers will be hidden. + If given a prefix, show the hidden text instead." + (interactive (list current-prefix-arg 'force)) + (gnus-article-hide-headers show) + (gnus-article-hide-pgp show) + (gnus-article-hide-citation-maybe show force) + (gnus-article-hide-signature show)) + + (defun gnus-article-show-hidden-text (type) (save-excursion (set-buffer gnus-article-buffer) ! (let ((buffer-read-only nil) ! (beg (point))) ! (while (gnus-goto-char (text-property-any ! beg (point-max) 'gnus-type type)) ! (remove-text-properties (point) (setq beg (1+ (point))) ! gnus-hidden-properties))))) (defvar gnus-article-time-units `((year . ,(* 365.25 24 60 60)) *************** *** 13805,13810 **** --- 13907,13923 ---- (funcall (intern (format "%s-request-replace-article" func)) article (gnus-group-real-name group) buffer))) + (defun gnus-request-associate-buffer (group) + (let ((method (gnus-find-method-for-group group))) + (funcall (gnus-get-function method 'request-associate-buffer) + (gnus-group-real-name group)))) + + (defun gnus-request-restore-buffer (article group) + "Request a new buffer restored to the state of ARTICLE." + (let ((method (gnus-find-method-for-group group))) + (funcall (gnus-get-function method 'request-restore-buffer) + article (gnus-group-real-name group) (nth 1 method)))) + (defun gnus-request-create-group (group) (let ((method (gnus-find-method-for-group group))) (funcall (gnus-get-function method 'request-create-group) *************** *** 15392,15398 **** (eval-buffer (current-buffer)) t) (error ! (message "Possible error in %s" file) (ding) (sit-for 2) nil)) --- 15505,15511 ---- (eval-buffer (current-buffer)) t) (error ! (gnus-message 3 "Possible error in %s" file) (ding) (sit-for 2) nil)) *** pub/sgnus/lisp/nnbabyl.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnbabyl.el Mon Dec 18 15:46:05 1995 *************** *** 117,127 **** gnus-verbose-backends (message "nnbabyl: Receiving headers...done")) - ;; Fold continuation lines. (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) 'headers))) (defun nnbabyl-open-server (server &optional defs) --- 117,124 ---- gnus-verbose-backends (message "nnbabyl: Receiving headers...done")) (set-buffer nntp-server-buffer) ! (nnheader-fold-continuation-lines) 'headers))) (defun nnbabyl-open-server (server &optional defs) *** pub/sgnus/lisp/nndraft.el Tue Dec 19 20:16:30 1995 --- sgnus/lisp/nndraft.el Tue Dec 19 17:39:45 1995 *************** *** 0 **** --- 1,263 ---- + ;;; nndraft.el --- draft article access for Gnus + ;; Copyright (C) 1995 Free Software Foundation, Inc. + + ;; Author: Lars Magne Ingebrigtsen + ;; Keywords: news + + ;; This file is part of GNU Emacs. + + ;; GNU Emacs is free software; you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation; either version 2, or (at your option) + ;; any later version. + + ;; GNU Emacs is distributed in the hope that it will be useful, + ;; but WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ;; GNU General Public License for more details. + + ;; You should have received a copy of the GNU General Public License + ;; along with GNU Emacs; see the file COPYING. If not, write to + ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + ;;; Commentary: + + ;;; Code: + + (require 'nnheader) + (require 'nnmh) + (eval-and-compile (require 'cl)) + + (eval-and-compile + (autoload 'mail-send-and-exit "sendmail")) + + (defvar nndraft-directory nil) + + + + (defconst nndraft-version "nndraft 1.0") + (defvar nndraft-status-string "") + + + + (defvar nndraft-current-server nil) + (defvar nndraft-server-alist nil) + (defvar nndraft-server-variables + (list + '(nndraft-directory nil) + '(nndraft-status-string "") + '(nndraft-group-alist))) + + + + ;;; Interface functions. + + + (defun nndraft-retrieve-headers (articles &optional group server fetch-old) + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer) + (let* ((file nil) + (buf (get-buffer-create " *draft headers*")) + beg article) + (set-buffer buf) + (buffer-disable-undo (current-buffer)) + (erase-buffer) + ;; We don't support fetching by Message-ID. + (if (stringp (car articles)) + 'headers + (while articles + (set-buffer buf) + (when (nndraft-request-article + (setq article (pop articles)) group server (current-buffer)) + (goto-char (point-min)) + (if (search-forward "\n\n" nil t) + (forward-line -1) + (goto-char (point-max))) + (delete-region (point) (point-max)) + (set-buffer nntp-server-buffer) + (goto-char (point-max)) + (insert (format "221 %d Article retrieved.\n" article)) + (insert-buffer-substring buf) + (insert ".\n"))) + + (nnheader-fold-continuation-lines) + 'headers)))) + + (defun nndraft-open-server (server &optional defs) + (nnheader-init-server-buffer) + (if (equal server nndraft-current-server) + t + (if nndraft-current-server + (setq nndraft-server-alist + (cons (list nndraft-current-server + (nnheader-save-variables nndraft-server-variables)) + nndraft-server-alist))) + (let ((state (assoc server nndraft-server-alist))) + (if state + (progn + (nnheader-restore-variables (nth 1 state)) + (setq nndraft-server-alist (delq state nndraft-server-alist))) + (nnheader-set-init-variables nndraft-server-variables defs)) + (or (assq 'nndraft-directory defs) + (setq nndraft-directory server))) + (setq nndraft-current-server server))) + + (defun nndraft-close-server (&optional server) + t) + + (defun nndraft-server-opened (&optional server) + (and nntp-server-buffer + (get-buffer nntp-server-buffer) + nndraft-current-server + (equal nndraft-current-server server))) + + (defun nndraft-status-message (&optional server) + nndraft-status-string) + + (defun nndraft-request-article (id &optional group server buffer) + (when (numberp id) + ;; We get the newest file of the auto-saved file and the + ;; "real" file. + (let* ((file (nndraft-article-filename id)) + (auto (nndraft-auto-save-file-name file)) + (newest (if (file-newer-than-file-p file auto) file auto)) + (nntp-server-buffer (or buffer nntp-server-buffer))) + (when (and (file-exists-p newest) + (nnmail-find-file newest)) + (save-excursion + (set-buffer nntp-server-buffer) + (goto-char (point-min)) + ;; If there's a mail header separator in this file, + ;; we remove it. + (when (re-search-forward + (concat "^" mail-header-separator "$") nil t) + (replace-match "" t t))) + t)))) + + (defun nndraft-request-restore-buffer (article &optional group server) + "Request a new buffer that is restored to the state of ARTICLE." + (let ((file (nndraft-article-filename article ".state")) + nndraft-point nndraft-mode nndraft-buffer-name) + (when (file-exists-p file) + (load file t t t) + (when nndraft-buffer-name + (set-buffer (get-buffer-create + (generate-new-buffer-name nndraft-buffer-name))) + (nndraft-request-article article group server (current-buffer)) + (funcall nndraft-mode) + (let ((gnus-verbose-backends nil)) + (nndraft-request-expire-articles (list article) group server t)) + (goto-char nndraft-point)) + nndraft-buffer-name))) + + (defun nndraft-request-update-info (group info &optional server) + (setcar (cdr (cdr info)) nil) + (when (nth 3 info) + (setcar (nthcdr 3 info) nil))) + + (defun nndraft-request-associate-buffer (group) + "Associate the current buffer with some article in the draft group." + (let* ((gnus-verbose-backends nil) + (article (cdr (nndraft-request-accept-article group t 'noinsert))) + (file (nndraft-article-filename article))) + (setq buffer-file-name file) + (setq buffer-auto-save-file-name (make-auto-save-file-name)) + article)) + + (defun nndraft-request-group (group &optional server dont-check) + (nndraft-execute-nnmh-command + (` (nnmh-request-group group "" (, dont-check))))) + + (defun nndraft-request-list (&optional server dir) + (nndraft-execute-nnmh-command + (` (nnmh-request-list nil (, dir))))) + + (defun nndraft-request-newgroups (date &optional server) + (nndraft-execute-nnmh-command + (` (nnmh-request-newgroups (, date) (, server))))) + + (defun nndraft-request-post (&optional server) + (mail-send-and-exit nil)) + + (defun nndraft-request-expire-articles + (articles group &optional server force) + (let ((res (nndraft-execute-nnmh-command + (` (nnmh-request-expire-articles + (quote (, articles)) group (, server) (, force))))) + article) + ;; Delete all the "state" files of articles that have been expired. + (while articles + (unless (memq (setq article (pop articles)) res) + (let ((file (nndraft-article-filename article ".state")) + (auto (nndraft-auto-save-file-name + (nndraft-article-filename article)))) + (when (file-exists-p file) + (funcall nnmail-delete-file-function file)) + (when (file-exists-p auto) + (funcall nnmail-delete-file-function auto))))) + res)) + + (defun nndraft-request-accept-article (group &optional last noinsert) + (let* ((point (point)) + (mode major-mode) + (name (buffer-name)) + (gart (nndraft-execute-nnmh-command + (` (nnmh-request-accept-article group (, last) noinsert)))) + (state + (nndraft-article-filename (cdr gart) ".state"))) + ;; Write the "state" file. + (save-excursion + (nnheader-set-temp-buffer " *draft state*") + (insert (format "%S\n" `(setq nndraft-mode (quote ,mode) + nndraft-point ,point + nndraft-buffer-name ,name))) + (write-region (point-min) (point-max) state nil 'silent) + (kill-buffer (current-buffer))) + gart)) + + (defun nndraft-close-group (group &optional server) + t) + + (defun nndraft-request-create-group (group &optional server) + (if (file-exists-p nndraft-directory) + (if (file-directory-p nndraft-directory) + t + nil) + (condition-case () + (progn + (make-directory nndraft-directory t) + t) + (file-error nil)))) + + + ;;; Low-Level Interface + + (defun nndraft-execute-nnmh-command (command) + (let ((dir (expand-file-name nndraft-directory))) + (and (string-match "/$" dir) + (setq dir (substring dir 0 (match-beginning 0)))) + (string-match "/[^/]+$" dir) + (let ((group (substring dir (1+ (match-beginning 0)))) + (nnmh-directory (substring dir 0 (1+ (match-beginning 0)))) + (nnmh-get-new-mail nil)) + (eval command)))) + + (defun nndraft-article-filename (article &rest args) + (apply 'concat + (file-name-as-directory nndraft-directory) + (int-to-string article) + args)) + + (defun nndraft-auto-save-file-name (file) + (save-excursion + (prog1 + (progn + (set-buffer (get-buffer-create " *draft tmp*")) + (setq buffer-file-name file) + (make-auto-save-file-name)) + (kill-buffer (current-buffer))))) + + (provide 'nndraft) + + ;;; nndraft.el ends here *** pub/sgnus/lisp/nnfolder.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnfolder.el Mon Dec 18 15:46:07 1995 *************** *** 141,151 **** (insert ".\n"))) (setq sequence (cdr sequence))) - ;; Fold continuation lines. (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) 'headers)))) (defun nnfolder-open-server (server &optional defs) --- 141,148 ---- (insert ".\n"))) (setq sequence (cdr sequence))) (set-buffer nntp-server-buffer) ! (nnheader-fold-continuation-lines) 'headers)))) (defun nnfolder-open-server (server &optional defs) *** pub/sgnus/lisp/nnheader.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnheader.el Mon Dec 18 15:46:16 1995 *************** *** 420,425 **** --- 420,431 ---- (mapcar 'nnheader-file-to-number (directory-files dir nil nnheader-numerical-short-files t))) + (defun nnheader-fold-continuation-lines () + "Fold continuation lines in the current buffer." + (goto-char (point-min)) + (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) + (replace-match " " t t))) + (provide 'nnheader) ;;; nnheader.el ends here *** pub/sgnus/lisp/nnmbox.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnmbox.el Mon Dec 18 15:46:09 1995 *************** *** 118,128 **** gnus-verbose-backends (message "nnmbox: Receiving headers...done")) - ;; Fold continuation lines. (set-buffer nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) 'headers))) (defun nnmbox-open-server (server &optional defs) --- 118,125 ---- gnus-verbose-backends (message "nnmbox: Receiving headers...done")) (set-buffer nntp-server-buffer) ! (nnheader-fold-continuation-lines) 'headers))) (defun nnmbox-open-server (server &optional defs) *** pub/sgnus/lisp/nnmh.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnmh.el Mon Dec 18 18:11:21 1995 *************** *** 33,38 **** --- 33,39 ---- (require 'rmail) (require 'nnmail) (require 'gnus) + (eval-and-compile (require 'cl)) (defvar nnmh-directory "~/Mail/" "*Mail spool directory.") *************** *** 73,109 **** ;;; Interface functions. ! (defun nnmh-retrieve-headers (sequence &optional newsgroup server fetch-old) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) (let* ((file nil) ! (number (length sequence)) (large (and (numberp nnmail-large-newsgroup) (> number nnmail-large-newsgroup))) (count 0) beg article) (nnmh-possibly-change-directory newsgroup) ! (if (stringp (car sequence)) 'headers ! (while sequence ! (setq article (car sequence)) ! (setq file ! (concat nnmh-current-directory (int-to-string article))) ! (if (and (file-exists-p file) ! (not (file-directory-p file))) ! (progn ! (insert (format "221 %d Article retrieved.\n" article)) ! (setq beg (point)) ! (nnheader-insert-head file) ! (goto-char beg) ! (if (search-forward "\n\n" nil t) ! (forward-char -1) ! (goto-char (point-max)) ! (insert "\n\n")) ! (insert ".\n") ! (delete-region (point) (point-max)))) ! (setq sequence (cdr sequence)) (setq count (1+ count)) (and large --- 74,111 ---- ;;; Interface functions. ! (defun nnmh-retrieve-headers (articles &optional newsgroup server fetch-old) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) (let* ((file nil) ! (number (length articles)) (large (and (numberp nnmail-large-newsgroup) (> number nnmail-large-newsgroup))) (count 0) beg article) (nnmh-possibly-change-directory newsgroup) ! ;; We don't support fetching by Message-ID. ! (if (stringp (car articles)) 'headers ! (while articles ! (when (and (file-exists-p ! (setq file (concat (file-name-as-directory ! nnmh-current-directory) ! (int-to-string ! (setq article (pop articles)))))) ! ! (not (file-directory-p file))) ! (insert (format "221 %d Article retrieved.\n" article)) ! (setq beg (point)) ! (nnheader-insert-head file) ! (goto-char beg) ! (if (search-forward "\n\n" nil t) ! (forward-char -1) ! (goto-char (point-max)) ! (insert "\n\n")) ! (insert ".\n") ! (delete-region (point) (point-max))) (setq count (1+ count)) (and large *************** *** 113,122 **** (and large (message "nnmh: Receiving headers...done")) ! ;; Fold continuation lines. ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) 'headers)))) (defun nnmh-open-server (server &optional defs) --- 115,121 ---- (and large (message "nnmh: Receiving headers...done")) ! (nnheader-fold-continuation-lines) 'headers)))) (defun nnmh-open-server (server &optional defs) *************** *** 299,315 **** (file-error nil))) result)) ! (defun nnmh-request-accept-article (group &optional last) (if (stringp group) (and (nnmail-activate 'nnmh) ;; We trick the choosing function into believing that only one ;; group is availiable. (let ((nnmail-split-methods (list (list group "")))) ! (car (nnmh-save-mail)))) (and (nnmail-activate 'nnmh) ! (car (nnmh-save-mail))))) (defun nnmh-request-replace-article (article group buffer) (nnmh-possibly-change-directory group) --- 298,314 ---- (file-error nil))) result)) ! (defun nnmh-request-accept-article (group &optional last noinsert) (if (stringp group) (and (nnmail-activate 'nnmh) ;; We trick the choosing function into believing that only one ;; group is availiable. (let ((nnmail-split-methods (list (list group "")))) ! (car (nnmh-save-mail noinsert)))) (and (nnmail-activate 'nnmh) ! (car (nnmh-save-mail noinsert))))) (defun nnmh-request-replace-article (article group buffer) (nnmh-possibly-change-directory group) *************** *** 408,418 **** (message "Creating mail directory %s" (car dirs))) (setq dirs (cdr dirs))))) ! (defun nnmh-save-mail () "Called narrowed to an article." (let ((group-art (nreverse (nnmail-article-group 'nnmh-active-number)))) ! (nnmail-insert-lines) ! (nnmail-insert-xref group-art) (run-hooks 'nnmh-prepare-save-mail-hook) (goto-char (point-min)) (while (looking-at "From ") --- 407,418 ---- (message "Creating mail directory %s" (car dirs))) (setq dirs (cdr dirs))))) ! (defun nnmh-save-mail (&optional noinsert) "Called narrowed to an article." (let ((group-art (nreverse (nnmail-article-group 'nnmh-active-number)))) ! (unless noinsert ! (nnmail-insert-lines) ! (nnmail-insert-xref group-art)) (run-hooks 'nnmh-prepare-save-mail-hook) (goto-char (point-min)) (while (looking-at "From ") *** pub/sgnus/lisp/nnml.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnml.el Mon Dec 18 15:46:12 1995 *************** *** 142,151 **** gnus-verbose-backends (message "nnml: Receiving headers...done")) ! ;; Fold continuation lines. ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) 'headers))))) (defun nnml-open-server (server &optional defs) --- 142,148 ---- gnus-verbose-backends (message "nnml: Receiving headers...done")) ! (nnheader-fold-continuation-lines) 'headers))))) (defun nnml-open-server (server &optional defs) *** pub/sgnus/lisp/nnsoup.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnsoup.el Tue Dec 19 02:20:20 1995 *************** *** 320,338 **** range-list (gnus-uncompress-range (car info)) prefix (gnus-soup-area-prefix (nth 1 info))) (when ;; All the articles in this file are marked for expiry. ! (and (gnus-sublist-p articles range-list) ;; This file is old enough. - (setq mod-time (nth 5 (nnsoup-file prefix))) (nnmail-expired-article-p group mod-time force)) ;; Ok, we delete this file. (when (condition-case nil ! (and ! (delete-file (nnsoup-file prefix)) ! (delete-file (nnsoup-file prefix) t) ! t) (error nil)) ! (setcdr total-infolist (delq info total-infolist)) ! (setq articles (gnus-sorted-complement articles range-list))))) (nnsoup-write-active-file) ;; Return the articles that weren't expired. articles)) --- 320,348 ---- range-list (gnus-uncompress-range (car info)) prefix (gnus-soup-area-prefix (nth 1 info))) (when ;; All the articles in this file are marked for expiry. ! (and (or (setq mod-time (nth 5 (file-attributes ! (nnsoup-file prefix)))) ! (setq mod-time (nth 5 (file-attributes ! (nnsoup-file prefix t))))) ! (gnus-sublist-p articles range-list) ;; This file is old enough. (nnmail-expired-article-p group mod-time force)) ;; Ok, we delete this file. (when (condition-case nil ! (progn ! (when gnus-verbose-backends ! (message "Deleting %s..." (nnsoup-file prefix t))) ! (sit-for 1) ! (when (file-exists-p (nnsoup-file prefix)) ! (delete-file (nnsoup-file prefix))) ! (when (file-exists-p (nnsoup-file prefix t)) ! (delete-file (nnsoup-file prefix t))) ! t) (error nil)) ! (setcdr total-infolist (delq info (cdr total-infolist))) ! (setq articles (gnus-sorted-complement articles range-list)))) ! (when (not mod-time) ! (setcdr total-infolist (delq info (cdr total-infolist))))) (nnsoup-write-active-file) ;; Return the articles that weren't expired. articles)) *************** *** 425,431 **** (current-buffer))))) (defun nnsoup-file (prefix &optional message) ! (concat nnsoup-directory prefix (if message ".MSG" ".IDX"))) (defun nnsoup-message-buffer (prefix) (nnsoup-index-buffer prefix 'msg)) --- 435,442 ---- (current-buffer))))) (defun nnsoup-file (prefix &optional message) ! (expand-file-name ! (concat nnsoup-directory prefix (if message ".MSG" ".IDX")))) (defun nnsoup-message-buffer (prefix) (nnsoup-index-buffer prefix 'msg)) *** pub/sgnus/lisp/nnspool.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnspool.el Mon Dec 18 15:45:59 1995 *************** *** 162,170 **** (message "nnspool: Receiving headers...done")) ;; Fold continuation lines. ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) 'headers))))) (defun nnspool-open-server (server &optional defs) --- 162,168 ---- (message "nnspool: Receiving headers...done")) ;; Fold continuation lines. ! (nnheader-fold-continuation-lines) 'headers))))) (defun nnspool-open-server (server &optional defs) *** pub/sgnus/lisp/nntp.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nntp.el Mon Dec 18 15:46:02 1995 *************** *** 268,276 **** (message "NNTP: Receiving headers...done")) ;; Now all of replies are received. Fold continuation lines. ! (goto-char (point-min)) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ;; Remove all "\r"'s. (goto-char (point-min)) (while (search-forward "\r" nil t) --- 268,274 ---- (message "NNTP: Receiving headers...done")) ;; Now all of replies are received. Fold continuation lines. ! (nnheader-fold-continuation-lines) ;; Remove all "\r"'s. (goto-char (point-min)) (while (search-forward "\r" nil t) *** pub/sgnus/lisp/nnvirtual.el Sun Dec 17 18:01:34 1995 --- sgnus/lisp/nnvirtual.el Tue Dec 19 02:35:05 1995 *************** *** 334,342 **** () ;; And then we do the mapping for this component group. If ;; you feel tempted to cast your eyes to the soup below - ! ;; don't. It'll hurt your soul. Suffice to say that it ;; assigns ranges of nnvirtual article numbers to the ! ;; different component groups. To get the article number ;; from the nnvirtual number, one does something like ;; (+ (- number offset) (car active)), where `offset' is the ;; slice the mess below assigns, and active is the lowest --- 334,342 ---- () ;; And then we do the mapping for this component group. If ;; you feel tempted to cast your eyes to the soup below - ! ;; don't. It'll hurt your soul. Suffice to say that it ;; assigns ranges of nnvirtual article numbers to the ! ;; different component groups. To get the article number ;; from the nnvirtual number, one does something like ;; (+ (- number offset) (car active)), where `offset' is the ;; slice the mess below assigns, and active is the lowest *** pub/sgnus/lisp/ChangeLog Sun Dec 17 18:01:40 1995 --- sgnus/lisp/ChangeLog Tue Dec 19 18:30:52 1995 *************** *** 1,4 **** --- 1,68 ---- + Tue Dec 19 18:13:49 1995 Lars Magne Ingebrigtsen + + * gnus-msg.el (gnus-cancel-news): Insert the usual user name, not + the "real" one. + + * gnus.el (gnus-group-list-inactive-groups): New variable. + (gnus-group-prepare-flat): Use it. + (gnus-summary-select-article): Returned wrong value. + + * gnus-topic.el (gnus-topic-find-groups): Ditto. + + Tue Dec 19 00:26:26 1995 Lars Ingebrigtsen + + * gnus.el (gnus-summary-limit-to-articles): Reset the processed + articles. + (gnus-summary-goto-subject): Would bug out when used silently. + + * nnsoup.el (nnsoup-request-expire-articles): Didn't really work. + + * gnus-cite.el (gnus-article-hide-citation): Take a prefix to + "show". + + * gnus.el (gnus-article-hide-headers): Take a prefix to "show". + (gnus-article-hide-pgp): Ditto. + (gnus-article-hide-signature): Ditto. + (gnus-article-hide): Ditto. + (gnus-article-show-hidden-text): New function. + + Mon Dec 18 15:13:21 1995 Lars Ingebrigtsen + + * gnus.el (gnus-request-restore-buffer): New function. + + * gnus-msg.el (gnus-associate-buffer-with-draft): New function. + (gnus-enter-into-draft-group): Removed functio. + + * gnus.el (gnus-request-associate-buffer): New function. + + * nndraft.el: New file. + + Sun Dec 17 20:16:45 1995 Lars Ingebrigtsen + + * gnus-score.el (gnus-score-score-files-1): New function. + (gnus-score-score-files): Use it to be able to provide full bnews + file syntax matching when using short file names. + + * gnus-cite.el (gnus-article-hide-citation-in-followups): New + command and keystroke. + + * gnus-score.el (gnus-summary-rescore): New command and keystroke. + + * gnus.el (gnus-summary-catchup-and-goto-next-group): Didn't save + point. + (gnus-single-article-buffer): New variable. + (gnus-article-setup-buffer): Use it. + (gnus-summary-setup-buffer): Ditto. + (gnus-move-split-methods): New variable. + (gnus-get-split-value): New function. + (gnus-read-save-file-name): Use it. + (gnus-read-move-group-name): New function. + (gnus-summary-copy-article): Use them. + (gnus-summary-move-article): Ditto. + Sun Dec 17 16:06:11 1995 Lars Magne Ingebrigtsen + + * gnus.el: 0.24 is released. * nndoc.el (nndoc-guess-digest-type): Didn't grok MIME digests. *** pub/sgnus/texi/gnus.texi Sun Dec 17 18:01:42 1995 --- sgnus/texi/gnus.texi Tue Dec 19 18:30:45 1995 *************** *** 246,260 **** --- 246,263 ---- We do have some breaches to this one. @table @emph + @item MIME Gnus does no MIME handling, and this standard-to-be seems to think that MIME is the bees' knees, so we have major breakage here. + @item X-Newsreader This is considered to be a "vanity header", while I consider it to be consumer information. After seeing so many badly formatted articles coming from @code{tin} and @code{Netscape} I know not to use either of those for posting articles. I would not have known that if it wasn't for the @code{X-Newsreader} header. + @item References Gnus breaks lines if this header is long. I infer from RFC1036 that being conservative in what you output is not creating 5000-character *************** *** 462,468 **** @item You can still post uuencoded articles, which was a little-known feature ! of @sc{gnus} past (@pxref{Uuencoding & Posting}). @item Fetching parents (and other articles) now actually works without --- 465,471 ---- @item You can still post uuencoded articles, which was a little-known feature ! of @sc{gnus}' past (@pxref{Uuencoding & Posting}). @item Fetching parents (and other articles) now actually works without *************** *** 563,568 **** --- 566,572 ---- @cindex terminology @table @dfn + @item news @cindex news This is what you are supposed to use this thing for---reading news. *************** *** 570,617 **** --- 574,633 ---- generally publicly available to everybody. If you post news, the entire world is likely to read just what you have written, and they'll all snigger mischievously. Behind your back. + @item mail @cindex mail Everything that's delivered to you personally is mail. Some news/mail readers (like Gnus) blur the distinction between mail and news, but there is a difference. Mail is private. News is public. Mailing is not posting, and replying is not following up. + @item reply Send a mail to the person who has written what you are reading. + @item follow up Post an article to the current newsgroup responding to the article you are reading. + @item backend Gnus gets fed articles from a number of backends, both news and mail backends. Gnus does not handle the underlying media, so to speak---this is all done by the backends. + @item native Gnus will always use one method (and backend) as the @dfn{native}, or default, way of getting news. + @item foreign You can also have any number of foreign groups at the same time. These are groups that use different backends for getting news. + @item head @cindex head The top part of an article, where administration information (etc.) is put. + @item body @cindex body The rest of an article. Everything that is not in the head is in the body. + @item header @cindex header A line from the head of an article. + @item headers @cindex headers A collection of such lines, or a collection of heads. Or even a collection of @sc{nov} lines. + @item @sc{nov} @cindex nov When Gnus enters a group, it asks the backend for the headers for all the unread articles in the group. Most servers support the News OverView format, which is much smaller and much faster to read than the normal HEAD format. + @item level @cindex levels Each group is subscribed at some @dfn{level} or other (1-9). The ones *************** *** 620,637 **** --- 636,657 ---- @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9 are @dfn{killed}. Commands for listing groups and scanning for new articles will all use the numeric prefix as @dfn{working level}. + @item killed groups @cindex killed groups No information on killed groups is stored or updated, which makes killed groups much easier to handle than subscribed groups. + @item zombie groups @cindex zombie groups Just like killed groups, only slightly less dead. + @item active file @cindex active file The news server has to keep track of what articles it carries, and what groups exist. All this information in stored in the active file, which is rather large, as you might surmise. + @item bogus groups @cindex bogus groups A group that exists in the @file{.newsrc} file, but isn't known to the *************** *** 842,856 **** --- 862,880 ---- are: @table @code + @item gnus-subscribe-randomly @vindex gnus-subscribe-randomly Subscribe all new groups randomly. + @item gnus-subscribe-alphabetically @vindex gnus-subscribe-alphabetically Subscribe all new groups alphabetically. + @item gnus-subscribe-hierarchically @vindex gnus-subscribe-hierarchically Subscribe all new groups hierarchically. + @item gnus-subscribe-interactively @vindex gnus-subscribe-interactively Subscribe new groups interactively. This means that Gnus will ask *************** *** 1070,1075 **** --- 1094,1100 ---- @section Startup Variables @table @code + @item gnus-load-hook @vindex gnus-load-hook A hook that is run while Gnus is being loaded. Note that this hook will *************** *** 1171,1215 **** --- 1196,1260 ---- Here's a list of all available format characters: @table @samp + @item M Only marked articles. + @item S Whether the group is subscribed. + @item L Level of subscribedness. + @item N Number of unread articles. + @item I Number of dormant articles. + @item T Number of ticked articles. + @item R Number of read articles. + @item t Total number of articles. + @item y Number of unread, unticked, non-dormant articles. + @item i Number of ticked and dormant articles. + @item g Full group name. + @item G Group name. + @item D Newsgroup description. + @item o Moderated. + @item O Moderated. + @item s Select method. + @item n Select from where. + @item z A string that looks like @samp{<%s:%n>} if a foreign select method is used. + @item c Short (collapsed) group name. + @item u User defined specifier. The next character in the format string should be a letter. @sc{gnus} will call the function *************** *** 1244,1274 **** --- 1289,1326 ---- expected, hopefully. @table @kbd + @item n @kindex n (Group) @findex gnus-group-next-unread-group Go to the next group that has unread articles (@code{gnus-group-next-unread-group}). + @item p + @itemx DEL @kindex DEL (Group) @kindex p (Group) @findex gnus-group-prev-unread-group Go to the previous group group that has unread articles (@code{gnus-group-prev-unread-group}). + @item N @kindex N (Group) @findex gnus-group-next-group Go to the next group (@code{gnus-group-next-group}). + @item P @kindex P (Group) @findex gnus-group-prev-group Go to the previous group (@code{gnus-group-prev-group}). + @item M-p @kindex M-p (Group) @findex gnus-group-next-unread-group-same-level Go to the next unread group on the same level (or lower) (@code{gnus-group-next-unread-group-same-level}). + @item M-n @kindex M-n (Group) @findex gnus-group-prev-unread-group-same-level *************** *** 1279,1295 **** --- 1331,1350 ---- Three commands for jumping to groups: @table @kbd + @item j @kindex j (Group) @findex gnus-group-jump-to-group Jump to a group (and make it visible if it isn't already) (@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just like living groups. + @item , @kindex , (Group) @findex gnus-group-best-unread-group Jump to the unread group with the lowest level (@code{gnus-group-best-unread-group}). + @item . @kindex . (Group) @findex gnus-group-first-unread-group *************** *** 1374,1379 **** --- 1429,1435 ---- automatically when entering a group. @table @code + @item nil Don't select any articles when entering the group. Just display the full summary buffer. *************** *** 1446,1451 **** --- 1502,1508 ---- @cindex subscribing @table @kbd + @item S t @itemx u @kindex S t (Group) *************** *** 1453,1458 **** --- 1510,1516 ---- @findex gnus-group-unsubscribe-current-group Toggle subscription to the current group (@code{gnus-group-unsubscribe-current-group}). + @item S s @itemx U @kindex S s (Group) *************** *** 1461,1488 **** --- 1519,1551 ---- Prompt for a group to subscribe, and then subscribe it. If it was subscribed already, unsubscribe it instead (@code{gnus-group-unsubscribe-group}). + @item S k @itemx C-k @kindex S k (Group) @kindex C-k (Group) @findex gnus-group-kill-group Kill the current group (@code{gnus-group-kill-group}). + @item S y @itemx C-y @kindex S y (Group) @kindex C-y (Group) @findex gnus-group-yank-group Yank the last killed group (@code{gnus-group-yank-group}). + @item S w @itemx C-w @kindex S w (Group) @kindex C-w (Group) @findex gnus-group-kill-region Kill all groups in the region (@code{gnus-group-kill-region}). + @item S z @kindex S z (Group) @findex gnus-group-kill-all-zombies Kill all zombie groups (@code{gnus-group-kill-all-zombies}). + @item S C-k @kindex S C-k (Group) @findex gnus-group-kill-level *************** *** 1509,1514 **** --- 1572,1578 ---- a given level or lower (@pxref{Misc Group Stuff}). @table @kbd + @item S l @kindex S l (Group) @findex gnus-group-set-current-level *************** *** 1561,1566 **** --- 1625,1636 ---- @code{gnus-group-default-list-level} will be listed in the group buffer by default. + @vindex gnus-group-list-inactive-groups + If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active + groups will be listed along with the unread groups. This variable is + @code{t} by default. If it is @code{nil}, inactive groups won't be + listed. + @vindex gnus-group-use-permament-levels If @code{gnus-group-use-permament-levels} is non-@code{nil}, once you give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will *************** *** 1678,1683 **** --- 1748,1754 ---- and some commands to ease the creation of some special-purpose groups: @table @kbd + @item G m @kindex G m (Group) @findex gnus-group-make-group *************** *** 1818,1823 **** --- 1889,1895 ---- server: @table @code + @item nntp-server-opened-hook @vindex nntp-server-opened-hook @cindex @sc{mode reader} *************** *** 1954,1959 **** --- 2026,2032 ---- You just have to try to find out what's best at your site. @table @code + @item nnspool-inews-program @vindex nnspool-inews-program Program used to post an article. *************** *** 2197,2219 **** --- 2270,2299 ---- @table @code @cindex babyl @cindex rmail mbox + @item babyl The babyl (rmail) mail box. @cindex mbox @cindex Unix mbox + @item mbox The standard Unix mbox file. @cindex MMDF mail box + @item mmdf The MMDF mail box format. + @item news Several news articles appended into a file. + @item rnews @cindex rnews batch files The rnews batch transport format. @cindex forwarded messages + @item forward Forwarded articles. + @item mime-digest @cindex digest @cindex MIME digest *************** *** 2221,2228 **** --- 2301,2310 ---- @cindex RFC 1153 digest @cindex RFC 341 digest MIME (RFC 1341) digest format. + @item standard-digest The standard (RFC 1153) digest format. + @item slack-digest Non-standard digest format---matches most things, but does it badly. @end table *************** *** 2703,2719 **** --- 2785,2805 ---- the four possible split syntaxes: @table @dfn + @item GROUP If the split is a string, that will be taken as a group name. + @item (FIELD VALUE SPLIT) If the split is a list, and the first element is a string, then that means that if header FIELD (a regexp) contains VALUE (also a regexp), then store the message as specified by SPLIT. + @item (| SPLIT...) If the split is a list, and the first element is @code{|} (vertical bar), then process each SPLIT until one of them matches. A SPLIT is said to match if it will cause the mail message to be stored in one or more groups. + @item (& SPLIT...) If the split is a list, and the first element is @code{&}, then process all SPLITs in the list. *************** *** 3494,3503 **** --- 3580,3591 ---- Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus, but it kills all buffers except the Group buffer. I'm not sure why this is a gain, but then who am I to judge? + @item q @kindex q (Group) @findex gnus-group-exit Quit Gnus (@code{gnus-group-exit}). + @item Q @kindex Q (Group) @findex gnus-group-quit *************** *** 3767,3833 **** --- 3855,3935 ---- (@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from @code{gnus-group-faq-directory}, which is usually a directory on a remote machine. @code{ange-ftp} will be used for fetching the file. + @item R @kindex R (Group) @findex gnus-group-restart Restart Gnus (@code{gnus-group-restart}). + @item r @kindex r (Group) @findex gnus-group-read-init-file @vindex gnus-init-file Read the init file (@code{gnus-init-file}, which defaults to @file{~/.gnus}) (@code{gnus-group-read-init-file}). + @item s @kindex s (Group) @findex gnus-group-save-newsrc Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted) (@code{gnus-group-save-newsrc}). If given a prefix, force saving the file(s) whether Gnus thinks it is necessary or not. + @item Z @kindex Z (Group) @findex gnus-group-clear-dribble Clear the dribble buffer (@code{gnus-group-clear-dribble}). + @item D @kindex D (Group) @findex gnus-group-describe-group Describe the current group (@code{gnus-group-describe-group}). If given a prefix, force Gnus to re-read the description from the server. + @item G a @kindex G a (Group) @findex gnus-group-apropos List all groups that have names that match a regexp (@code{gnus-group-apropos}). + @item G d @kindex G d (Group) @findex gnus-group-description-apropos List all groups that have names or descriptions that match a regexp (@code{gnus-group-description-apropos}). + @item a @kindex a (Group) @findex gnus-group-post-news Post an article to a group (@code{gnus-group-post-news}). The current group name will be used as the default. + @item m @kindex m (Group) @findex gnus-group-mail Mail a message somewhere (@code{gnus-group-mail}). + @item C-x C-t @kindex C-x C-t (Group) @findex gnus-group-transpose-groups Transpose two groups (@code{gnus-group-transpose-groups}). + @item V @kindex V (Group) @findex gnus-version Display current Gnus version numbers (@code{gnus-version}). + @item M-d @kindex M-d (Group) @findex gnus-group-describe-all-groups Describe all groups (@code{gnus-group-describe-all-groups}). If given a prefix, force Gnus to re-read the description file from the server. + @item ? @kindex ? (Group) @findex gnus-group-describe-briefly Give a very short help message (@code{gnus-group-describe-briefly}). + @item C-c C-i @kindex C-c C-i (Group) @findex gnus-info-find-node *************** *** 4056,4061 **** --- 4158,4164 ---- @findex gnus-summary-next-unread-subject Go to the next summary line of an unread article (@code{gnus-summary-next-unread-subject}). + @item G M-p @itemx M-p @kindex M-p (Summary) *************** *** 4063,4068 **** --- 4166,4172 ---- @findex gnus-summary-prev-unread-subject Go to the previous summary line of an unread article (@code{gnus-summary-prev-unread-subject}). + @item G g @itemx j @kindex j (Summary) *************** *** 4121,4159 **** --- 4225,4270 ---- @findex gnus-summary-next-page Select the current article, or, if that one's read already, the next unread article (@code{gnus-summary-next-page}). + @item G n @itemx n @kindex n (Summary) @kindex G n (Summary) @findex gnus-summary-next-unread-article Go to next unread article (@code{gnus-summary-next-unread-article}). + @item G p @itemx p @kindex p (Summary) @findex gnus-summary-prev-unread-article Go to previous unread article (@code{gnus-summary-prev-unread-article}). + @item G N @itemx N @kindex N (Summary) @kindex G N (Summary) @findex gnus-summary-next-article Go to the next article (@code{gnus-summary-next-article}). + @item G P @itemx P @kindex P (Summary) @kindex G P (Summary) @findex gnus-summary-prev-article Go to the previous article (@code{gnus-summary-prev-article}). + @item G C-n @kindex G C-n (Summary) @findex gnus-summary-next-same-subject Go to the next article with the same subject (@code{gnus-summary-next-same-subject}). + @item G C-p @kindex G C-p (Summary) @findex gnus-summary-prev-same-subject Go to the previous article with the same subject (@code{gnus-summary-prev-same-subject}). + @item G f @itemx . @kindex G f (Summary) *************** *** 4161,4178 **** --- 4272,4292 ---- @findex gnus-summary-first-unread-article Go to the first unread article (@code{gnus-summary-first-unread-article}). + @item G b @itemx , @kindex G b (Summary) @kindex , (Summary) Go to the article with the highest score (@code{gnus-summary-best-unread-article}). + @item G l @itemx l @kindex l (Summary) @kindex G l (Summary) @findex gnus-summary-goto-last-article Go to the previous article read (@code{gnus-summary-goto-last-article}). + @item G p @kindex G p (Summary) @findex gnus-summary-pop-article *************** *** 4191,4217 **** --- 4305,4337 ---- article, even if that article isn't displayed in the Summary buffer if this variable is non-@code{nil}. Gnus will then fetch the article from the server and display it in the article buffer. + @item gnus-select-article-hook @vindex gnus-select-article-hook This hook is called whenever an article is selected. By default it exposes any threads hidden under the selected article. + @item gnus-mark-article-hook @vindex gnus-mark-article-hook This hook is called whenever an article is selected. It is intended to be used for marking articles as read. + @item gnus-visual-mark-article-hook @vindex gnus-visual-mark-article-hook This hook is run after selecting an article. It is meant to be used for highlighting the article in some way. It is not run if @code{gnus-visual} is @code{nil}. + @item gnus-summary-update-hook @vindex gnus-summary-update-hook This hook is called when a summary line is changed. It is not run if @code{gnus-visual} is @code{nil}. + @item gnus-summary-selected-face @vindex gnus-summary-selected-face This is the face (or @dfn{font} as some people call it) that is used to highlight the current article in the summary buffer. + @item gnus-summary-highlight @vindex gnus-summary-highlight Summary lines are highlighted according to this variable, which is a *************** *** 4243,4248 **** --- 4363,4369 ---- @kindex DEL (Summary) @findex gnus-summary-prev-page Scroll the current article back one page (@code{gnus-summary-prev-page}). + @item RET @kindex RET (Summary) @findex gnus-summary-scroll-up *************** *** 4549,4560 **** --- 4670,4683 ---- @findex gnus-summary-post-news Post an article to the current group (@code{gnus-summary-post-news}). + @item S f @itemx f @kindex f (Summary) @kindex S f (Summary) @findex gnus-summary-followup Post a followup to the current article (@code{gnus-summary-followup}). + @item S F @itemx F @kindex S F (Summary) *************** *** 4563,4568 **** --- 4686,4692 ---- Post a followup to the current article and include the original message (@code{gnus-summary-followup-with-original}). This command uses the process/prefix convention. + @item S u @kindex S u (Summary) @findex gnus-uu-post-news *************** *** 4577,4592 **** --- 4701,4720 ---- will be prompted for. The following symbols are legal: @table @code + @item From This required header will be filled out with the result of the @code{gnus-inews-user-name} function, which depends on the @code{gnus-user-from-line}, @code{gnus-user-login-name}, @code{gnus-local-domain} and @code{user-mail-address} variables. + @item Subject This required header will be prompted for if not present already. + @item Newsgroups This required header says which newsgroups the article is to be posted to. If it isn't present already, it will be prompted for. + @item Organization @cindex organization @vindex gnus-local-organization *************** *** 4594,4614 **** --- 4722,4747 ---- This optional header will be filled out depending on the @code{gnus-local-organization} variable. @code{gnus-organization-file} will be used if that variable is nil. + @item Lines This optional header will be computed by Gnus. + @item Message-ID @cindex Message-ID This required header will be generated by Gnus. A unique ID will be created based on date, time, user name and system name. + @item X-Newsreader @cindex X-Newsreader This optional header will be filled out with the Gnus version numbers. + @item Expires @vindex gnus-article-expires @cindex Expires This extremely optional header will be inserted according to the @code{gnus-article-expires} variable. It is highly deprecated and shouldn't be used unless you know what you're doing. + @item Distribution This optional header is filled out according to the @code{gnus-distribution-function} variable. It is a deprecated and much *************** *** 4833,4838 **** --- 4966,4972 ---- @findex gnus-summary-followup-and-reply Post a followup and send a reply to the current article (@code{gnus-summary-followup-and-reply}). + @item S B @kindex S B (Summary) @findex gnus-summary-followup-and-reply-with-original *************** *** 5071,5092 **** @cindex drafts If you are writing a message (mail or news) and suddenly remember that ! you have a steak in the oven (or pesto in the food processor, you craazy ! vegetarians), you'll probably wish there was a method to save the message you are writing so that you can continue editing it some other day, and send it when you feel its finished. ! @kindex C-c C-d (Mail) ! @kindex C-c C-d (Post) ! @findex gnus-enter-into-draft-group ! @vindex gnus-draft-group-directory ! What you then do is simply push @kbd{C-c C-d} ! (@code{gnus-enter-into-draft-group}). This will put the current ! (unfinished) message in a special draft group (which is implemented as ! an @code{nndir} group, if you absolutely have to know) called ! @samp{nndir:drafts}. The variable @code{gnus-draft-group-directory} controls both the name of the group and the location---the leaf element ! in the path will be used as the name of the group. If the group doesn't exist, it will be created and you'll be subscribed to it. --- 5205,5229 ---- @cindex drafts If you are writing a message (mail or news) and suddenly remember that ! you have a steak in the oven (or some pesto in the food processor, you ! craazy vegetarians), you'll probably wish there was a method to save the message you are writing so that you can continue editing it some other day, and send it when you feel its finished. ! Well, don't worry about it. Whenever you start composing a message of ! some sort using the Gnus mail and post commands, the buffer you get will ! automatically associate to an article in a special @dfn{draft} group. ! If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the ! article will be saved there. (Auto-save files also go to the draft ! group.) ! ! The draft group is a special draft group (which is implemented as an ! @code{nndraft} group, if you absolutely have to know) called ! @samp{nndraft:drafts}. The variable @code{gnus-draft-group-directory} controls both the name of the group and the location---the leaf element ! in the path will be used as the name of the group. What makes this ! group special is that you can't tick any articles in it or mark any ! articles as read---all articles in the group are permanently unread. If the group doesn't exist, it will be created and you'll be subscribed to it. *************** *** 5226,5235 **** --- 5363,5374 ---- tick it. However, articles can be expired, so if you want to keep an article forever, you'll have to save it. Ticked articles have a @samp{!} (@code{gnus-ticked-mark}) in the first column. + @item ? A @dfn{dormant} article is marked with a @samp{?} (@code{gnus-dormant-mark}), and will only appear in the summary buffer if there are followups to it. + @item SPC An @dfn{unread} article is marked with a @samp{SPC} (@code{gnus-unread-mark}). These are articles that haven't been read at *************** *** 5243,5266 **** --- 5382,5413 ---- All the following marks mark articles as read. @table @samp + @item r Articles that are marked as read. They have a @samp{r} (@code{gnus-del-mark}) in the first column. These are articles that the user has marked as read more or less manually. + @item R Articles that are actually read are marked with @samp{R} (@code{gnus-read-mark}). + @item O Articles that were marked as read in previous sessions are now @dfn{old} and marked with @samp{O} (@code{gnus-ancient-mark}). + @item K Marked as killed (@code{gnus-killed-mark}). + @item X Marked as killed by kill files (@code{gnus-kill-file-mark}). + @item Y Marked as read by having a too low score (@code{gnus-low-score-mark}). + @item C Marked as read by a catchup (@code{gnus-catchup-mark}). + @item G Canceled article (@code{gnus-cancelled-mark}) @end table *************** *** 5351,5356 **** --- 5498,5504 ---- @kindex M t (Summary) @findex gnus-summary-tick-article-forward Tick the current article (@code{gnus-summary-tick-article-forward}). + @item M ? @itemx ? @kindex ? (Summary) *************** *** 5358,5363 **** --- 5506,5512 ---- @findex gnus-summary-mark-as-dormant Mark the current article as dormant (@code{gnus-summary-mark-as-dormant}). + @item M d @itemx d @kindex M d (Summary) *************** *** 5365,5370 **** --- 5514,5520 ---- @findex gnus-summary-mark-as-read-forward Mark the current article as read (@code{gnus-summary-mark-as-read-forward}). + @item M k @itemx k @kindex k (Summary) *************** *** 5373,5378 **** --- 5523,5529 ---- Mark all articles that have the same subject as the current one as read, and then select the next unread article (@code{gnus-summary-kill-same-subject-and-select}). + @item M K @itemx C-k @kindex M K (Summary) *************** *** 5380,5410 **** --- 5531,5567 ---- @findex gnus-summary-kill-same-subject Mark all articles that have the same subject as the current one as read (@code{gnus-summary-kill-same-subject}). + @item M C @kindex M C (Summary) @findex gnus-summary-catchup Mark all unread articles in the group as read (@code{gnus-summary-catchup}). + @item M C-c @kindex M C-c (Summary) @findex gnus-summary-catchup-all Mark all articles in the group as read---even the ticked and dormant articles (@code{gnus-summary-catchup-all}). + @item M H @kindex M H (Summary) @findex gnus-summary-catchup-to-here Catchup the current group to point (@code{gnus-summary-catchup-to-here}). + @item C-w @kindex C-w (Summary) @findex gnus-summary-mark-region-as-read Mark all articles between point and mark as read (@code{gnus-summary-mark-region-as-read}). + @item M V k @kindex M V k (Summary) @findex gnus-summary-kill-below Kill all articles with scores below the default score (or below the numeric prefix) (@code{gnus-summary-kill-below}). + @item M c @itemx M-u @kindex M c (Summary) *************** *** 5412,5417 **** --- 5569,5575 ---- @findex gnus-summary-clear-mark-forward Clear all readedness-marks from the current article (@code{gnus-summary-clear-mark-forward}). + @item M e @itemx E @kindex M e (Summary) *************** *** 5419,5444 **** --- 5577,5607 ---- @findex gnus-summary-mark-as-expirable Mark the current article as expirable (@code{gnus-summary-mark-as-expirable}). + @item M b @kindex M b (Summary) @findex gnus-summary-set-bookmark Set a bookmark in the current article (@code{gnus-summary-set-bookmark}). + @item M B @kindex M B (Summary) @findex gnus-summary-remove-bookmark Remove the bookmark from the current article (@code{gnus-summary-remove-bookmark}). + @item M V c @kindex M V c (Summary) @findex gnus-summary-clear-above Clear all marks from articles with scores over the default score (or over the numeric prefix) (@code{gnus-summary-clear-above}). + @item M V u @kindex M V u (Summary) @findex gnus-summary-tick-above Tick all articles with scores over the default score (or over the numeric prefix) (@code{gnus-summary-tick-above}). + @item M V m @kindex M V m (Summary) @findex gnus-summary-mark-above *************** *** 5459,5464 **** --- 5622,5628 ---- @cindex setting process marks @table @kbd + @item M P p @itemx # @kindex # (Summary) *************** *** 5467,5514 **** --- 5631,5688 ---- Mark the current article with the process mark (@code{gnus-summary-mark-as-processable}). @findex gnus-summary-unmark-as-processable + @item M P u @itemx M-# @kindex M P u (Summary) @kindex M-# (Summary) Remove the process mark, if any, from the current article (@code{gnus-summary-unmark-as-processable}). + @item M P U @kindex M P U (Summary) @findex gnus-summary-unmark-all-processable Remove the process mark from all articles (@code{gnus-summary-unmark-all-processable}). + @item M P R @kindex M P R (Summary) @findex gnus-uu-mark-by-regexp Mark articles by a regular expression (@code{gnus-uu-mark-by-regexp}). + @item M P r @kindex M P r (Summary) @findex gnus-uu-mark-region Mark articles in region (@code{gnus-uu-mark-region}). + @item M P t @kindex M P t (Summary) @findex gnus-uu-mark-thread Mark all articles in the current (sub)thread (@code{gnus-uu-mark-thread}). + @item M P T @kindex M P T (Summary) @findex gnus-uu-unmark-thread Unmark all articles in the current (sub)thread (@code{gnus-uu-unmark-thread}). + @item M P s @kindex M P s (Summary) @findex gnus-uu-mark-series Mark all articles in the current series (@code{gnus-uu-mark-series}). + @item M P S @kindex M P S (Summary) @findex gnus-uu-mark-sparse Mark all series that have already had some articles marked (@code{gnus-uu-mark-sparse}). + @item M P a @kindex M P a (Summary) @findex gnus-uu-mark-all Mark all articles in series order (@code{gnus-uu-mark-series}). + @item M P b @kindex M P b (Summary) @findex gnus-uu-mark-buffer *************** *** 5626,5631 **** --- 5800,5806 ---- @cindex > @table @code + @item gnus-show-threads @vindex gnus-show-threads If this variable is @code{nil}, no threading will be done, and all of *************** *** 5683,5688 **** --- 5858,5864 ---- @cindex adopting articles @table @code + @item adopt Gnus will make the first of the orphaned articles the parent. This parent will adopt all the other articles. The adopted articles will be *************** *** 5813,5830 **** --- 5989,6010 ---- understand the numeric prefix. @table @kbd + @item T n @kindex T n (Summary) @findex gnus-summary-next-thread Go to the next thread (@code{gnus-summary-next-thread}). + @item T p @kindex T p (Summary) @findex gnus-summary-prev-thread Go to the previous thread (@code{gnus-summary-prev-thread}). + @item T d @kindex T d (Summary) @findex gnus-summary-down-thread Descend the thread (@code{gnus-summary-down-thread}). + @item T u @kindex T u (Summary) @findex gnus-summary-up-thread *************** *** 5988,5993 **** --- 6168,6174 ---- you use two explicit commands for managing persistent articles: @table @kbd + @item * @kindex * (Summary) @findex gnus-cache-enter-article *************** *** 6045,6050 **** --- 6226,6232 ---- group and return you to the group buffer. @table @kbd + @item Z Z @itemx q @kindex Z Z (Summary) *************** *** 6058,6063 **** --- 6240,6246 ---- @code{gnus-summary-expire-articles} by default. @code{gnus-summary-exit-hook} is called after finishing the exiting process. + @item Z E @itemx Q @kindex Z E (Summary) *************** *** 6065,6070 **** --- 6248,6254 ---- @findex gnus-summary-exit-no-update Exit the current group without updating any information on the group (@code{gnus-summary-exit-no-update}). + @item Z c @itemx c @kindex Z c (Summary) *************** *** 6072,6093 **** --- 6256,6281 ---- @findex gnus-summary-catchup-and-exit Mark all unticked articles in the group as read and then exit (@code{gnus-summary-catchup-and-exit}). + @item Z C @kindex Z C (Summary) @findex gnus-summary-catchup-all-and-exit Mark all articles, even the ticked ones, as read and then exit (@code{gnus-summary-catchup-all-and-exit}). + @item Z n @kindex Z n (Summary) @findex gnus-summary-catchup-and-goto-next-group Mark all articles as read and go to the next group (@code{gnus-summary-catchup-and-goto-next-group}). + @item Z R @kindex Z R (Summary) @findex gnus-summary-reselect-current-group Exit this group, and then enter it again (@code{gnus-summary-reselect-current-group}). If given a prefix, select all articles, both read and unread. + @item Z G @itemx M-g @kindex Z G (Summary) *************** *** 6096,6106 **** --- 6284,6296 ---- Exit the group, check for new articles in the group, and select the group (@code{gnus-summary-rescan-group}). If given a prefix, select all articles, both read and unread. + @item Z N @kindex Z N (Summary) @findex gnus-summary-next-group Exit the group and go to the next group (@code{gnus-summary-next-group}). + @item Z P @kindex Z P (Summary) @findex gnus-summary-prev-group *************** *** 6205,6210 **** --- 6395,6401 ---- summary buffer looks like. Set @code{gnus-summary-goto-unread} to @code{nil} for a more straightforward action. + @node Saving Articles @section Saving Articles @cindex saving articles *************** *** 6338,6352 **** --- 6529,6547 ---- available functions that generate names: @table @code + @item gnus-Numeric-save-name @findex gnus-Numeric-save-name Generates file names that look like @samp{~/News/Alt.andrea-dworkin/45}. + @item gnus-numeric-save-name @findex gnus-numeric-save-name Generates file names that look like @samp{~/News/alt.andrea-dworkin/45}. + @item gnus-Plain-save-name @findex gnus-Plain-save-name Generates file names that look like @samp{~/News/Alt.andrea-dworkin}. + @item gnus-plain-save-name @findex gnus-plain-save-name Generates file names that look like @samp{~/News/alt.andrea-dworkin}. *************** *** 6456,6474 **** --- 6651,6673 ---- @cindex uuencoded articles @table @kbd + @item X u @kindex X u (Summary) @findex gnus-uu-decode-uu Uudecodes the current series (@code{gnus-uu-decode-uu}). + @item X U @kindex X U (Summary) @findex gnus-uu-decode-uu-and-save Uudecodes and saves the current series (@code{gnus-uu-decode-uu-and-save}). + @item X v u @kindex X v u (Summary) @findex gnus-uu-decode-uu-view Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}). + @item X v U @kindex X v U (Summary) @findex gnus-uu-decode-uu-and-save-view *************** *** 6501,6518 **** --- 6700,6721 ---- @cindex shared articles @table @kbd + @item X s @kindex X s (Summary) @findex gnus-uu-decode-unshar Unshars the current series (@code{gnus-uu-decode-unshar}). + @item X S @kindex X S (Summary) @findex gnus-uu-decode-unshar-and-save Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}). + @item X v s @kindex X v s (Summary) @findex gnus-uu-decode-unshar-view Unshars and views the current series (@code{gnus-uu-decode-unshar-view}). + @item X v S @kindex X v S (Summary) @findex gnus-uu-decode-unshar-and-save-view *************** *** 6525,6544 **** --- 6728,6751 ---- @cindex PostScript @table @kbd + @item X p @kindex X p (Summary) @findex gnus-uu-decode-postscript Unpack the current PostScript series (@code{gnus-uu-decode-postscript}). + @item X P @kindex X P (Summary) @findex gnus-uu-decode-postscript-and-save Unpack and save the current PostScript series (@code{gnus-uu-decode-postscript-and-save}). + @item X v p @kindex X v p (Summary) @findex gnus-uu-decode-postscript-view View the current PostScript series (@code{gnus-uu-decode-postscript-view}). + @item X v P @kindex X v P (Summary) @findex gnus-uu-decode-postscript-and-save-view *************** *** 6571,6576 **** --- 6778,6784 ---- @end lisp @table @code + @item gnus-uu-user-view-rules @vindex gnus-uu-user-view-rules This variable is consulted first when viewing files. If you wish to use, *************** *** 6580,6589 **** --- 6788,6799 ---- (setq gnus-uu-user-view-rules (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\"))) @end lisp + @item gnus-uu-user-view-rules-end @vindex gnus-uu-user-view-rules-end This variable is consulted if Gnus couldn't make any matches from the user and default view rules. + @item gnus-uu-user-archive-rules @vindex gnus-uu-user-archive-rules This variable can be used to say what commands should be used to unpack *************** *** 6596,6601 **** --- 6806,6812 ---- @table @code @vindex gnus-uu-grabbed-file-functions + @item gnus-uu-grabbed-file-functions All functions in this list will be called right each file has been successfully decoded---so that you can move or view files right away, *************** *** 6603,6608 **** --- 6814,6820 ---- anything. Ready-made functions you can put in this list are: @table @code + @item gnus-uu-grab-view @findex gnus-uu-grab-view View the file. *************** *** 6810,6815 **** --- 7022,7028 ---- @table @code @vindex gnus-cite-parse-max-size + @item gnus-cite-parse-max-size If the article size if bigger than this variable (which is 25000 by default), no citation highlighting will be performed. *************** *** 6912,6922 **** @end table ! Also see @xref{Article Highlighting} for further variables for ! citation customization. @end table @node Article Washing @subsection Article Washing --- 7125,7146 ---- @end table ! @item W W C ! @kindex W W C (Summary) ! @findex gnus-article-hide-citation-in-followups ! Hide cited text in articles that aren't roots ! (@code{gnus-article-hide-citation-in-followups}). This isn't very ! useful as an interactive command, but might be a handy function to stick ! in @code{gnus-article-display-hook} (@pxref{Customizing Articles}). @end table + All these "hide" functions take a prefix to undo the hiding. @kbd{C-u W + W c} will show any hidden signatures, for instance. + + Also see @xref{Article Highlighting} for further variables for + citation customization. + @node Article Washing @subsection Article Washing *************** *** 7135,7156 **** --- 7359,7385 ---- can't really see why you'd want that. @table @kbd + @item C-c C-s C-n @kindex C-c C-s C-n (Summary) @findex gnus-summary-sort-by-number Sort by article number (@code{gnus-summary-sort-by-number}). + @item C-c C-s C-a @kindex C-c C-s C-a (Summary) @findex gnus-summary-sort-by-author Sort by author (@code{gnus-summary-sort-by-author}). + @item C-c C-s C-s @kindex C-c C-s C-s (Summary) @findex gnus-summary-sort-by-subject Sort by subject (@code{gnus-summary-sort-by-subject}). + @item C-c C-s C-d @kindex C-c C-s C-d (Summary) @findex gnus-summary-sort-by-date Sort by date (@code{gnus-summary-sort-by-date}). + @item C-c C-s C-i @kindex C-c C-s C-i (Summary) @findex gnus-summary-sort-by-score *************** *** 7223,7228 **** --- 7452,7458 ---- process/prefix convention (@pxref{Process/Prefix}). @table @kbd + @item B e @kindex B e (Summary) @findex gnus-summary-expire-articles *************** *** 7293,7298 **** --- 7523,7535 ---- will tell you (@code{gnus-summary-fancy-query}). @end table + If you move (or copy) articles regularly, you might wish to have Gnus + suggest where to put the articles. @code{gnus-move-split-methods} is a + variable that uses the same syntax as @code{gnus-split-methods} + (@pxref{Saving Articles}). You may customize that variable to create + suggestions you find reasonable. + + @node Various Summary Stuff @section Various Summary Stuff *************** *** 7319,7324 **** --- 7556,7562 ---- @subsection Group Information @table @kbd + @item H f @kindex H f (Summary) @findex gnus-summary-fetch-faq *************** *** 7330,7346 **** --- 7568,7587 ---- In that case, giving a prefix to this command will allow you to choose between the various sites. @code{ange-ftp} probably will be used for fetching the file. + @item H d @kindex H d (Summary) @findex gnus-summary-describe-group Give a brief description of the current group (@code{gnus-summary-describe-group}). If given a prefix, force rereading the description from the server. + @item H h @kindex H h (Summary) @findex gnus-summary-describe-briefly Give a very brief description of the most important summary keystrokes (@code{gnus-summary-describe-briefly}). + @item H i @kindex H i (Summary) @findex gnus-info-find-node *************** *** 7351,7372 **** --- 7592,7617 ---- @subsection Searching for Articles @table @kbd + @item M-s @kindex M-s (Summary) @findex gnus-summary-search-article-forward Search through all subsequent articles for a regexp (@code{gnus-summary-search-article-forward}). + @item M-r @kindex M-r (Summary) @findex gnus-summary-search-article-backward Search through all previous articles for a regexp (@code{gnus-summary-search-article-backward}). + @item & @kindex & (Summary) @findex gnus-summary-execute-command This command will prompt you for a header field, a regular expression to match on this field, and a command to be executed if the match is made (@code{gnus-summary-execute-command}). + @item M-& @kindex M-& (Summary) @findex gnus-summary-universal-argument *************** *** 7378,7383 **** --- 7623,7629 ---- @subsection Really Various Summary Commands @table @kbd + @item A D @kindex A D (Summary) @findex gnus-summary-enter-digest-group *************** *** 7418,7423 **** --- 7664,7670 ---- * Misc Article:: Other stuff. @end menu + @node Hiding Headers @section Hiding Headers @cindex hiding headers *************** *** 7439,7444 **** --- 7686,7692 ---- Gnus provides you with two variables for sifting headers: @table @code + @item gnus-visible-headers @vindex gnus-visible-headers If this variable is non-@code{nil}, it should be a regular expression *************** *** 7618,7645 **** --- 7866,7905 ---- @section Misc Article @table @code + + @item gnus-single-article-buffer + @vindex gnus-single-article-buffer + If non-@code{nil}, use the same article buffer for all the groups. + (This is the default.) If @code{nil}, each group will have its own + article buffer. + @vindex gnus-article-prepare-hook + @item gnus-article-prepare-hook This hook is called right after the article has been inserted into the article buffer. It is mainly intended for functions that do something depending on the contents; it should probably not be used for changing the contents of the article buffer. @vindex gnus-article-display-hook + @item gnus-article-display-hook This hook is called as the last thing when displaying an article, and is intended for modifying the contents of the buffer, doing highlights, hiding headers, and the like. @vindex gnus-article-mode-line-format + @item gnus-article-mode-line-format This variable is a format string along the same lines as @code{gnus-summary-mode-line-format}. It accepts exactly the same format specifications as that variable. @vindex gnus-break-pages + @item gnus-break-pages Controls whether @dfn{page breaking} is to take place. If this variable is non-@code{nil}, the articles will be divided into pages whenever a page delimiter appears in the article. If this variable is @code{nil}, paging will not be done. + @item gnus-page-delimiter @vindex gnus-page-delimiter This is the delimiter mentioned above. By default, it is @samp{^L} *************** *** 7690,7699 **** --- 7950,7962 ---- variable, with some simple extensions: @table @samp + @item h How the news is fetched---the backend name. + @item n The name of this server. + @item w Where the news is to be fetched from---the address. @end table *************** *** 7703,7722 **** --- 7966,7993 ---- @cindex server commands @table @kbd + @item SPC Browse the current server (@code{gnus-server-read-server}). + @item q Return to the group buffer (@code{gnus-server-exit}). + @item l List all servers (@code{gnus-server-list-servers}). + @item k Kill the current server (@code{gnus-server-kill-server}). + @item y Yank the previously killed server (@code{gnus-server-yank-server}). + @item c Copy the current server (@code{gnus-server-copy-server}). + @item a Add a new server (@code{gnus-server-add-server}). + @item e Edit a server (@code{gnus-server-edit-server}). @end table *************** *** 7896,7901 **** --- 8167,8173 ---- General score commands that don't actually change the score file: @table @kbd + @item V s @kindex V s (Summary) @findex gnus-summary-set-score *************** *** 7913,7918 **** --- 8185,8198 ---- Display all score rules that have been used on the current article (@code{gnus-score-find-trace}). + @item V R + @item V R (Summary) + @findex gnus-summary-rescore + Run the current summary through the scoring process + (@code{gnus-summary-rescore}). This might be useful if you're playing + around with your score files behind Gnus' back and want to see the + effect you're having. + @item V a @kindex V a (Summary) @findex gnus-summary-score-entry *************** *** 7960,7970 **** --- 8240,8252 ---- The rest of these commands modify the local score file. @table @kbd + @item V m @kindex V m (Summary) @findex gnus-score-set-mark-below 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) @findex gnus-score-set-expunge-below *************** *** 7984,8007 **** --- 8266,8299 ---- The second key says what header you want to score on. The following keys are available: @table @kbd + @item a Score on the author name. + @item s Score on the subject line. + @item x Score on the Xref line---i.e., the cross-posting line. + @item t Score on thread---the References line. + @item d Score on the date. + @item l Score on the number of lines. + @item i Score on the Message-ID. + @item f Score on followups. + @item b Score on the body. + @item h Score on the head. @end table *************** *** 8011,8045 **** --- 8303,8348 ---- what headers you are scoring on. @table @code + @item strings @table @kbd + @item e Exact matching. + @item s Substring matching. + @item f Fuzzy matching. + @item r Regexp matching @end table @item date @table @kbd + @item b Before date. + @item a At date. + @item n This date. @end table @item number @table @kbd + @item < Less than number. + @item = Equal to number. + @item > Greater than number. @end table *************** *** 8050,8059 **** --- 8353,8365 ---- score entry, or a permanent (i.e., non-expiring) score entry, or whether it is to be done immediately, without adding to the score file. @table @kbd + @item t Temporary score entry. + @item p Permanent score entry. + @item i Immediately scoring. @end table *************** *** 8099,8104 **** --- 8405,8411 ---- @cindex score variables @table @code + @item gnus-use-scoring @vindex gnus-use-scoring If @code{nil}, Gnus will not check for score files, and will not, in *************** *** 8213,8218 **** --- 8520,8526 ---- alists should probably be placed before the "real" score file functions, to ensure that the last score file returned is the local score file. Phu. + @item gnus-score-expiry-days @vindex gnus-score-expiry-days This variable says how many days should pass before an unused score file *************** *** 8262,8267 **** --- 8570,8576 ---- Six keys are supported by this alist: @table @code + @item STRING If the key is a string, it is the name of the header to perform the match on. Scoring can only be performed on these eight headers: *************** *** 8280,8289 **** --- 8589,8600 ---- Following this key is a random number of score entries, where each score entry has one to four elements. @enumerate + @item The first element is the @dfn{match element}. On most headers this will be a string, but on the Lines and Chars headers, this must be an integer. + @item If the second element is present, it should be a number---the @dfn{score element}. This number should be an integer in the neginf to posinf *************** *** 8291,8308 **** --- 8602,8622 ---- is successful. If this element is not present, the @code{gnus-score-interactive-default-score} number will be used instead. This is 1000 by default. + @item If the third element is present, it should be a number---the @dfn{date element}. This date says when the last time this score entry matched, which provides a mechanism for expiring the score entries. It this element is not present, the score entry is permanent. The date is represented by the number of days since December 31, 1 ce. + @item If the fourth element is present, it should be a symbol---the @dfn{type element}. This element specifies what function should be used to see whether this score entry matches the article. What match types that can be used depends on what header you wish to perform the match on. @table @dfn + @item From, Subject, References, Xref, Message-ID For most header types, there are the @code{r} and @code{R} (regexp) as well as @code{s} and @code{S} (substring) types and @code{e} and *************** *** 8312,8329 **** --- 8626,8647 ---- case-sensitive manner. All these one-letter types are really just abbreviations for the @code{regexp}, @code{string} and @code{exact} types, which you can use instead, if you feel like. + @item Lines, Chars These two headers use different match types: @code{<}, @code{>}, @code{=}, @code{>=} and @code{<=}. + @item Date For the Date header we have three match types: @code{before}, @code{at} and @code{after}. I can't really imagine this ever being useful, but, like, it would feel kinda silly not to provide this function. Just in case. You never know. Better safe than sorry. Once burnt, twice shy. Don't judge a book by its cover. Never not have sex on a first date. + @item Head, Body, All These three match keys use the same match types as the @code{From} (etc) header uses. + @item Followup This match key will add a score entry on all articles that followup to some author. Uses the same match types as the @code{From} header uses. *************** *** 8411,8421 **** --- 8729,8741 ---- additional commands: @table @kbd + @item C-c C-c @kindex C-c C-c (Score) @findex gnus-score-edit-done Save the changes you have made and return to the summary buffer (@code{gnus-score-edit-done}). + @item C-c C-d @kindex C-c C-d (Score) @findex gnus-score-edit-insert-date *************** *** 8511,8516 **** --- 8831,8837 ---- to easily note when people answer what you've said. @table @code + @item gnus-score-followup-article @findex gnus-score-followup-article This will add a score to articles that directly follow up your own *************** *** 8532,8549 **** --- 8853,8873 ---- @cindex scoring tips @table @dfn + @item Crossposts If you want to lower the score of crossposts, the line to match on is the @code{Xref} header. @lisp ("xref" (" talk.politics.misc:" -1000)) @end lisp + @item Multiple crossposts If you want to lower the score of articles that have been crossposted to more than, say, 3 groups: @lisp ("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r)) @end lisp + @item Matching on the body This is generally not a very good idea---it takes a very long time. Gnus actually has to fetch each individual article from the server. But *************** *** 8553,8558 **** --- 8877,8883 ---- will be fetched @emph{twice}. If you want to match a bit on the @code{Head} and a bit on the @code{Body}, just use @code{All} for all the matches. + @item Marking as read You will probably want to mark articles that has a score below a certain number as read. This is most easily achieved by putting the following *************** *** 8634,8639 **** --- 8959,8965 ---- head: @itemize @bullet + @item Articles that are heavily crossposted are probably junk. @item *************** *** 8646,8651 **** --- 8972,8978 ---- @item Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest articles completely. + @item Use expiring score entries to keep the size of the file down. You should probably have a long expiry period, though, as some sites keep *************** *** 8693,8698 **** --- 9020,9026 ---- Two functions for editing a GNUS kill file: @table @kbd + @item M-k @kindex M-k (Summary) @findex gnus-summary-edit-local-kill *************** *** 8738,8743 **** --- 9066,9072 ---- @cindex interaction @table @code + @item gnus-novice-user @vindex gnus-novice-user If this variable is non-@code{nil}, you are either a newcomer to the *************** *** 9044,9064 **** --- 9373,9399 ---- @table @code + @item gnus-carpal-mode-hook @vindex gnus-carpal-mode-hook Hook run in all carpal mode buffers. + @item gnus-carpal-button-face @vindex gnus-carpal-button-face Face used on buttons. + @item gnus-carpal-group-buffer-buttons @vindex gnus-carpal-group-buffer-buttons Buttons in the group buffer. + @item gnus-carpal-summary-buffer-buttons @vindex gnus-carpal-summary-buffer-buttons Buttons in the summary buffer. + @item gnus-carpal-server-buffer-buttons @vindex gnus-carpal-server-buffer-buttons Buttons in the server buffer. + @item gnus-carpal-browse-buffer-buttons @vindex gnus-carpal-browse-buffer-buttons Buttons in the browse buffer. *************** *** 9211,9216 **** --- 9546,9552 ---- @cindex highlights @table @code + @item gnus-verbose @vindex gnus-verbose This variable is an integer between zero and ten. The higher the value, *************** *** 9228,9233 **** --- 9564,9570 ---- variable is @code{nil}, screen refresh may be quicker. @cindex display-time + @item gnus-mode-non-string-length @vindex gnus-mode-non-string-length By default, Gnus displays information on the current article in the mode *************** *** 9364,9375 **** --- 9701,9714 ---- Gnus has to get from the @sc{nntp} server. @table @code + @item gnus-read-active-file Set this to @code{nil}, which will inhibit Gnus from requesting the entire active file from the server. This file is often v. large. You also have to set @code{gnus-check-new-news} and @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus doesn't suddenly decide to fetch the active file anyway. + @item gnus-nov-is-evil This one has to be @code{nil}. If not, grabbing article headers from the @sc{nntp} server will not be very fast. Not all @sc{nntp} servers *************** *** 9384,9397 **** --- 9723,9739 ---- amount of data that is sent over the wires as much as possible. @table @code + @item gnus-auto-center-summary Set this to @code{nil} to inhibit Gnus from recentering the summary buffer all the time. + @item gnus-visible-headers Cut down on the headers that are included in the articles to the minimum. You can, in fact, make do without them altogether---most of the useful data is in the summary buffer, anyway. Set this variable to @samp{"^NEVVVVER"} or @samp{"From:"}, or whatever you feel you need. + @item gnus-article-display-hook Set this hook to all the available hiding commands: @lisp *************** *** 9399,9412 **** --- 9741,9757 ---- '(gnus-article-hide-headers gnus-article-hide-signature gnus-article-hide-citation)) @end lisp + @item gnus-use-full-window By setting this to @code{nil}, you can make all the windows smaller. While this doesn't really cut down much generally, it means that you have to see smaller portions of articles before deciding that you didn't want to read them anyway. + @item gnus-thread-hide-subtree If this is non-@code{nil}, all threads in the summary buffer will be hidden initially. + @item gnus-updated-mode-lines If this is @code{nil}, Gnus will not put information in the buffer mode lines, which might save some time. *************** *** 9419,9424 **** --- 9764,9770 ---- sizes a bit if you are running out of space. @table @code + @item gnus-save-newsrc-file If this is @code{nil}, Gnus will never save @file{.newsrc}---it will only save @file{.newsrc.eld}. This means that you will not be able to *************** *** 9477,9483 **** flee}, you have some old @file{.el} files lying around. Delete these. @item ! Read the help group (@kbd{M h} in the group buffer) for a FAQ and a how-to. @end enumerate --- 9823,9829 ---- flee}, you have some old @file{.el} files lying around. Delete these. @item ! Read the help group (@kbd{G h} in the group buffer) for a FAQ and a how-to. @end enumerate *************** *** 10341,10346 **** --- 10687,10693 ---- @itemize @bullet @item Q: What is an experienced Emacs user? + @item A: A person who wishes that the terminal had pedals. @end itemize *** pub/sgnus/texi/ChangeLog Sun Dec 17 18:01:40 1995 --- sgnus/texi/ChangeLog Tue Dec 19 00:35:31 1995 *************** *** 1,3 **** --- 1,14 ---- + Tue Dec 19 00:26:02 1995 Lars Ingebrigtsen + + * gnus.texi (Article Hiding): Addition. + (Drafts): Change. + + Sun Dec 17 23:29:01 1995 Lars Ingebrigtsen + + * gnus.texi (Summary Score Commands): Addition. + (Mail Group Commands): Adiition. + (Article Hiding): Addition. + Sun Dec 17 17:38:20 1995 Lars Magne Ingebrigtsen * gnus.texi (Windows Configuration): Addition.