From: yamaoka Date: Tue, 21 Aug 2001 03:44:40 +0000 (+0000) Subject: Synch with Oort Gnus (Translating gnus-ja.texi is incompleted). X-Git-Tag: semi-gnus~69 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=1a7b8c37b8aadeae04f57577c44f9be28f3e4398;p=elisp%2Fgnus.git- Synch with Oort Gnus (Translating gnus-ja.texi is incompleted). --- diff --git a/GNUS-NEWS b/GNUS-NEWS index f780719..898c768 100644 --- a/GNUS-NEWS +++ b/GNUS-NEWS @@ -8,7 +8,17 @@ For older news, see Gnus info node "New Features". * Changes in Oort Gnus -** Menu bar: "Misc" -> "Gnus". +** Nnml stores marks in the file ".marks" for each groups. + +This makes it possible to take backup of nnml servers independently of +.newsrc.eld. It also makes it possible to share articles and marks +between users (without sharing .newsrc.eld) within e.g. a department. + +** The menu bar (in Group and Summary buffer) named "Misc" has been + renamed to "Gnus". + +** The menu bar (in Message mode) named "MML" has been renamed to + "Attachment". ** gnus-group-charset-alist and gnus-group-ignored-charsets-alist diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f9eff16..955fd7f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,249 @@ +2001-08-20 16:00:00 ShengHuo ZHU + + * gnus-start.el (gnus-activate-group): If dont-check, don't update + active. + +2001-08-20 15:00:00 ShengHuo ZHU + + * nnslashdot.el (nnslashdot-retrieve-headers-1): Replace + nnslashdot-*-retrieve-headers. + (nnslashdot-request-article): Fix for slashcode 2.2. + (nnslashdot-make-tuple): New. + (nnslashdot-read-groups): Use it. + +2001-08-20 01:34:03 Lars Magne Ingebrigtsen + + * gnus.el (gnus-expand-group-parameters): Don't alter the variable + list. + + * gnus-sum.el (gnus-summary-move-article): Don't select article. + +2001-08-20 Simon Josefsson + + * gnus-msg.el (gnus-inews-do-gcc): If archive server can't be + opened, error instead of continuing (and exploding later). + +2001-08-20 01:34:03 Lars Magne Ingebrigtsen + + * gnus.el (gnus-expand-group-parameters): Return the parameter + list. + + * gnus-sum.el (gnus-summary-show-article): Doc fix. + (gnus-summary-show-article): Guess at charset if required. + + * gnus-spec.el (gnus-correct-substring): Stopped one character + before we wanted. + +2001-08-19 Pavel Jan,Bm(Bk + + * earcon.el (earcon-auto-play): Remove unused option. + +2001-08-19 16:14:41 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-score-headers): Move the "Scoring..." + message down in levels, since it happens very fast. + + * smiley-ems.el (smiley-update-cache): Respect the symbol version + of smiley-regexp-alist. + + * mm-view.el (mm-inline-text): Ignore vcard errors. + + * gnus-art.el (gnus-ignored-headers): Added more junk headers. + + * gnus-score.el (gnus-all-score-files): Use append instead of + nconc. + + * gnus.el (gnus-splash-face): Doc fix. + + * mm-decode.el (mm-mailcap-command): Use + mm-path-name-rewrite-functions. + (mm-path-name-rewrite-functions): New variable. + + * gnus-spec.el (gnus-parse-complex-format): React to ?=. + (gnus-complex-form-to-spec): Insert tab. + (gnus-spec-tab): New function. + + * gnus-sum.el (gnus-select-newsgroup): Set the marks before + entering the group. + + * gnus-spec.el (gnus-complex-form-to-spec): Insert Lisp to match + the positional spec. + (gnus-parse-complex-format): React to %C. + + * gnus-ems.el (gnus-char-width): Moved here. + + * gnus-sum.el (gnus-select-newsgroup): Set + gnus-newsgroup-articles. + (gnus-unseen-mark): New variable. + (gnus-newsgroup-unseen): Ditto. + (gnus-newsgroup-seen): Ditto. + (gnus-adjust-marked-articles): Use them. + (gnus-update-marks): Use them. + (gnus-summary-update-secondary-mark): Display. + (gnus-summary-prepare-threads): Display. + + * gnus-msg.el (gnus-inews-group-method): Use and return the + method, not the server. + +2001-08-19 Simon Josefsson + + * gnus-srvr.el (gnus-server-agent-face): New. + (gnus-server-agent-face): New. + (gnus-server-mode): Turn on font-lock-mode. + + * gnus.el (gnus-server-visual): Add defgroup. + +2001-08-19 Simon Josefsson + From Joe Casadonte + + * gnus-srvr.el (gnus-server-opened-face, gnus-server-closed-face, + gnus-server-denied-face): New. + (gnus-server-opened-face, gnus-server-closed-face, + gnus-server-denied-face): New. + (gnus-server-font-lock-keywords): Add. + +2001-08-19 Simon Josefsson + + * nnml.el (nnml-request-set-mark): Return nil. + (nnml-save-marks): Use nnml-possibly-create-directory. + (nnml-open-marks): Only work in temp buffer when inserting/reading + .marks file. + +2001-08-18 19:00:00 ShengHuo ZHU + + * gnus.el (gnus-expand-group-parameters): Fix. + + * gnus-spec.el (gnus-char-width): New. + (gnus-correct-substring, gnus-correct-length): Use it. + + * message.el (message-required-mail-headers): Fix doc. + +2001-08-18 18:00:00 ShengHuo ZHU + + * gnus-sum.el (gnus-group-make-articles-read): gnus-request-set-mark. + + * mm-decode.el (mm-save-part-to-file): Insert the handle. + +2001-08-18 13:00:00 ShengHuo ZHU + + * nnslashdot.el (nnslashdot-threaded-retrieve-headers): + slashdot 2.2 (not fully fixed yet). + (nnslashdot-request-article): Ditto. + +2001-08-18 Simon Josefsson + + * gnus-util.el (gnus-remassoc, gnus-update-alist-soft): Moved from + nnimap. + + * nnimap.el (nnimap-remassoc, nnimap-update-alist-soft): Moved to + gnus-util. + (nnimap-request-update-info-internal): Use new functions. + + * nnml.el (nnml-request-set-mark, nnml-request-update-info): Use + new functions. + +2001-08-18 Simon Josefsson + + Make nnml groups self-contained as far as marks are concerned. + + * nnml.el (nnml-request-delete-group): Delete marks file. + (nnml-request-rename-group): Move marks file. + (nnml-marks-file-name, nnml-marks-is-evil, nnml-marks): New server + variables. + (nnml-request-set-mark, nnml-request-update-info): New server + functions. + (nnml-save-marks, nnml-open-marks): New functions. + +2001-08-18 Simon Josefsson + + * gnus-sum.el (gnus-summary-move-article): Use `add' instead of + `set' when setting marks. + +2001-08-17 22:00:00 ShengHuo ZHU + + * gnus.el (gnus-info-find-node): Take an argument. + + * gnus-art.el (gnus-button-handle-info): New. + (gnus-url-unhex-string): Replace "+" with " ". + +2001-08-17 21:00:00 ShengHuo ZHU + + * message.el (message-check-news-header-syntax): Check bad From. + +2001-08-18 00:14:45 Lars Magne Ingebrigtsen + + * gnus-spec.el (gnus-correct-length): New function. + (gnus-correct-substring): New function. + (gnus-tilde-max-form): Use it. + +2001-08-17 Nevin Kapur + + * nnmh.el: Docstring changes as below. + + * nnml.el: Docstring changes as below. + + * nnbabyl.el: Docstring changes as below. + + * nnmbox.el: Docstring changes as below. + + * nnfolder.el: Added docstrings identifying each virtual server + parameter. + +2001-08-18 Simon Josefsson + + * mml.el (mml-menu): Collapse Attach, Insert and Security submenu. + +2001-08-17 Bj,Av(Brn Torkelsson + + * message.el: rename "Abort Message" to "Postpone Message". + Remove "Attach file as MIME" from Message menu, it's already in + the MIME menu. + +2001-08-17 14:00:00 ShengHuo ZHU + + * smime.el (smime-point-at-eol): eval-and-compile. + (smime-make-temp-file): New. + (smime-sign-region, smime-encrypt-region, smime-decrypt-region): + Use it. + +2001-08-17 10:41:14 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-fetch-group): Go online if offline. + (gnus-agent-summary-fetch-group): New command and keystroke. + + * gnus-art.el (gnus-insert-mime-button): Tiny clean-up. + (gnus-mime-display-security): Make it respect + gnus-unbuttonized-mime-type-p. + + * gnus-sum.el (gnus-articles-to-read): Comments. + (gnus-article-marked-p): New function. + (gnus-summary-display-make-predicate): New function. + (gnus-select-newsgroup): Use them. + + * mm-decode.el (mm-save-part-to-file): Made it not error. + +2001-08-17 Simon Josefsson + + * imap.el (imap-wait-for-tag): If process-status isn't open or + run, return nil instead of sit-for looping. + +2001-08-17 10:41:14 Lars Magne Ingebrigtsen + + * lpath.el (featurep): fbind xml-parse-region. + + * gnus.el (gnus-message-archive-method): Default to "archive". + (gnus-message-archive-method): Doc fix. + (gnus-parameters-get-parameter): Cleaned up. + (gnus-expand-group-parameter): New function. + + * gnus-start.el (gnus-setup-news): Push the archive server only + the server list. + + * mml.el (mml-menu): Changed name to "Attachments". + + * mm-decode.el (mm-destroy-postponed-undisplay-list): Only message + when there is something to detroy. + 2001-05-21 17:11:46 Lars Magne Ingebrigtsen * gnus-srvr.el (gnus-server-browse-in-group-buffer): Default to diff --git a/lisp/earcon.el b/lisp/earcon.el index 19d3fa5..ecd118f 100644 --- a/lisp/earcon.el +++ b/lisp/earcon.el @@ -35,11 +35,6 @@ "Turn ** sounds ** into noise." :group 'gnus-visual) -(defcustom earcon-auto-play nil - "*When True, automatically play sounds as well as buttonize them." - :type 'boolean - :group 'earcon) - (defcustom earcon-prefix "**" "*String denoting the start of an earcon." :type 'string diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 623c136..1e6340a 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -291,6 +291,7 @@ If this is `ask' the hook will query the user." (defvar gnus-agent-summary-mode-map (make-sparse-keymap)) (gnus-define-keys gnus-agent-summary-mode-map "Jj" gnus-agent-toggle-plugged + "Ju" gnus-agent-summary-fetch-group "J#" gnus-agent-mark-article "J\M-#" gnus-agent-unmark-article "@" gnus-agent-toggle-mark @@ -305,6 +306,7 @@ If this is `ask' the hook will query the user." ["Mark as downloadable" gnus-agent-mark-article t] ["Unmark as downloadable" gnus-agent-unmark-article t] ["Toggle mark" gnus-agent-toggle-mark t] + ["Fetch downloadable" gnus-agent-summary-fetch-group t] ["Catchup undownloaded" gnus-agent-catchup t])))) (defvar gnus-agent-server-mode-map (make-sparse-keymap)) @@ -476,14 +478,20 @@ be a select method." (defun gnus-agent-fetch-group (group) "Put all new articles in GROUP into the Agent." (interactive (list (gnus-group-group-name))) - (unless gnus-plugged - (error "Groups can't be fetched when Gnus is unplugged")) - (unless group - (error "No group on the current line")) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (gnus-agent-with-fetch - (gnus-agent-fetch-group-1 group gnus-command-method) - (gnus-message 5 "Fetching %s...done" group)))) + (let ((state gnus-plugged)) + (unwind-protect + (progn + (unless state + (gnus-agent-toggle-plugged gnus-plugged) + (unless group + (error "No group on the current line")) + (let ((gnus-command-method (gnus-find-method-for-group group))) + (gnus-agent-with-fetch + (gnus-agent-fetch-group-1 group gnus-command-method) + (gnus-message 5 "Fetching %s...done" group))))) + (when (and (not state) + gnus-plugged) + (gnus-agent-toggle-plugged gnus-plugged))))) (defun gnus-agent-add-group (category arg) "Add the current group to an agent category." @@ -692,6 +700,29 @@ the actual number of articles toggled is returned." (pop gnus-newsgroup-undownloaded) gnus-catchup-mark))) (gnus-summary-position-point)) +(defun gnus-agent-summary-fetch-group () + "Fetch the downloadable articles in the group." + (interactive) + (let ((articles gnus-newsgroup-downloadable) + (gnus-command-method (gnus-find-method-for-group gnus-newsgroup-name)) + (state gnus-plugged)) + (unwind-protect + (progn + (unless state + (gnus-agent-toggle-plugged t)) + (unless articles + (error "No articles to download")) + (gnus-agent-with-fetch + (gnus-agent-fetch-articles gnus-newsgroup-name articles)) + (save-excursion + (dolist (article articles) + (setq gnus-newsgroup-downloadable + (delq article gnus-newsgroup-downloadable)) + (gnus-summary-mark-article article gnus-unread-mark)))) + (when (and (not state) + gnus-plugged) + (gnus-agent-toggle-plugged nil))))) + ;;; ;;; Internal functions ;;; @@ -1157,7 +1188,8 @@ the actual number of articles toggled is returned." (unless (gnus-check-group group) (error "Can't open server for %s" group)) ;; Fetch headers. - (when (and (or (gnus-active group) (gnus-activate-group group)) + (when (and (or (gnus-active group) + (gnus-activate-group group)) (setq articles (gnus-agent-fetch-headers group)) (let ((nntp-server-buffer gnus-agent-overview-buffer)) ;; Parse them and see which articles we want to fetch. @@ -1176,8 +1208,7 @@ the actual number of articles toggled is returned." (cadr category)))) (if (memq predicate '(gnus-agent-true gnus-agent-false)) ;; Simple implementation - (setq arts - (and (eq predicate 'gnus-agent-true) articles)) + (setq arts (and (eq predicate 'gnus-agent-true) articles)) (setq arts nil) (setq score-param (or (gnus-group-get-parameter group 'agent-score t) diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index 7a37910..79aaaae 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -144,7 +144,10 @@ "^X-Received:" "^Content-length:" "X-precedence:" "^X-Authenticated-User:" "^X-Comment" "^X-Report:" "^X-Abuse-Info:" "^X-HTTP-Proxy:" "^X-Mydeja-Info:" "^X-Copyright" "^X-No-Markup:" - "^X-Abuse-Info:") + "^X-Abuse-Info:" "^X-From_:" "^X-Accept-Language:" "^Errors-To:" + "^X-BeenThere:" "^X-Mailman-Version:" "^List-Help:" "^List-Post:" + "^List-Subscribe:" "^List-Id:" "^List-Unsubscribe:" "^List-Archive:" + "^X-Content-length:" "^X-Posting-Agent:" "^Original-Received:") "*All headers that start with this regexp will be hidden. This variable can also be a list of regexps of headers to be ignored. If `gnus-visible-headers' is non-nil, this variable will be ignored." @@ -4073,12 +4076,9 @@ If no internal viewer is available, use an external viewer." (defun gnus-insert-mime-button (handle gnus-tmp-id &optional displayed) (let ((gnus-tmp-name - (or (mail-content-type-get (mm-handle-type handle) - 'name) - (mail-content-type-get (mm-handle-disposition handle) - 'filename) - (mail-content-type-get (mm-handle-type handle) - 'url) + (or (mail-content-type-get (mm-handle-type handle) 'name) + (mail-content-type-get (mm-handle-disposition handle) 'filename) + (mail-content-type-get (mm-handle-type handle) 'url) "")) (gnus-tmp-type (mm-handle-media-type handle)) (gnus-tmp-description @@ -4096,8 +4096,8 @@ If no internal viewer is available, use an external viewer." (setq gnus-tmp-type-long (concat gnus-tmp-type (and (not (equal gnus-tmp-name "")) (concat "; " gnus-tmp-name)))) - (or (equal gnus-tmp-description "") - (setq gnus-tmp-type-long (concat " --- " gnus-tmp-type-long))) + (unless (equal gnus-tmp-description "") + (setq gnus-tmp-type-long (concat " --- " gnus-tmp-type-long))) (unless (bolp) (insert "\n")) (setq b (point)) @@ -5185,7 +5185,7 @@ after replacing with the original article." ;;; Internal Variables: -(defcustom gnus-button-url-regexp "\\b\\(\\(www\\.\\|\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\):\\)\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?\\([-a-zA-Z0-9_=!?#$@~`%&*+|\\/:;.,]\\|\\w\\)+\\([-a-zA-Z0-9_=#$@~`%&*+|\\/]\\|\\w\\)\\)" +(defcustom gnus-button-url-regexp "\\b\\(\\(www\\.\\|\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\|info\\):\\)\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?\\([-a-zA-Z0-9_=!?#$@~`%&*+|\\/:;.,]\\|\\w\\)+\\([-a-zA-Z0-9_=#$@~`%&*+|\\/]\\|\\w\\)\\)" "Regular expression that matches URLs." :group 'gnus-article-buttons :type 'regexp) @@ -5204,6 +5204,9 @@ after replacing with the original article." ("\\( \n\t]+\\)>" 0 t gnus-url-mailto 2) ("mailto:\\([-a-zA-Z.@_+0-9%=?]+\\)" 0 t gnus-url-mailto 1) ("\\bmailto:\\([^ \n\t]+\\)" 0 t gnus-url-mailto 1) + ;; This is info + ("\\binfo:\\(//\\)?\\([^'\">\n\t ]+\\)" 0 t + gnus-button-handle-info 2) ;; This is how URLs _should_ be embedded in text... ("]*\\)>" 0 t gnus-button-embedded-url 1) ;; Raw URLs. @@ -5619,6 +5622,18 @@ specified by `gnus-button-alist'." (group (gnus-button-fetch-group url))))) +(defun gnus-button-handle-info (url) + "Fetch an info URL." + (if (string-match + "^\\([^:/]+\\)?/\\(.*\\)" + url) + (gnus-info-find-node + (concat "(" (or (gnus-url-unhex-string (match-string 1 url)) + "Gnus") + ")" + (gnus-url-unhex-string (match-string 2 url)))) + (error "Can't parse %s" url))) + (defun gnus-button-message-id (message-id) "Fetch MESSAGE-ID." (save-excursion @@ -5675,7 +5690,7 @@ specified by `gnus-button-alist'." If optional second argument ALLOW-NEWLINES is non-nil, then allow the decoding of carriage returns and line feeds in the string, which is normally forbidden in URL encoding." - (setq str (or str "")) + (setq str (or (nnheader-replace-chars-in-string str ?+ ? ) "")) (let ((tmp "") (case-fold-search t)) (while (string-match "%[0-9a-f][0-9a-f]" str) @@ -6175,13 +6190,15 @@ For example: (defun gnus-mime-display-security (handle) (save-restriction (narrow-to-region (point) (point)) - (gnus-insert-mime-security-button handle) + (unless (gnus-unbuttonized-mime-type-p (car handle)) + (gnus-insert-mime-security-button handle)) (gnus-mime-display-mixed (cdr handle)) (unless (bolp) (insert "\n")) - (let ((gnus-mime-security-button-line-format - gnus-mime-security-button-end-line-format)) - (gnus-insert-mime-security-button handle)) + (unless (gnus-unbuttonized-mime-type-p (car handle)) + (let ((gnus-mime-security-button-line-format + gnus-mime-security-button-end-line-format)) + (gnus-insert-mime-security-button handle))) (mm-set-handle-multipart-parameter handle 'gnus-region (cons (set-marker (make-marker) (point-min)) diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el index 69b6d48..1682e0f 100644 --- a/lisp/gnus-ems.el +++ b/lisp/gnus-ems.el @@ -63,6 +63,12 @@ ;;; Mule functions. (eval-and-compile + (defalias 'gnus-char-width + (if (fboundp 'char-width) + 'char-width + (lambda (ch) 1)))) ;; A simple hack. + +(eval-and-compile (if (featurep 'xemacs) (gnus-xmas-define) (defvar gnus-mouse-face-prop 'mouse-face diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index fe44147..ad0fef6 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -1363,19 +1363,18 @@ this is a reply." ;;; Gcc handling. (defun gnus-inews-group-method (group) - (cond ((and (null (gnus-get-info group)) - (eq (car gnus-message-archive-method) - (car - (gnus-server-to-method - (gnus-group-method group))))) - ;; If the group doesn't exist, we assume - ;; it's an archive group... - gnus-message-archive-method) - ;; Use the method. - ((gnus-info-method (gnus-get-info group)) - (gnus-info-method (gnus-get-info group))) - ;; Find the method. - (t (gnus-group-method group)))) + (cond + ;; If the group doesn't exist, we assume + ;; it's an archive group... + ((and (null (gnus-get-info group)) + (eq (car (gnus-server-to-method gnus-message-archive-method)) + (car (gnus-server-to-method (gnus-group-method group))))) + gnus-message-archive-method) + ;; Use the method. + ((gnus-info-method (gnus-get-info group)) + (gnus-info-method (gnus-get-info group))) + ;; Find the method. + (t (gnus-server-to-method (gnus-group-method group))))) ;; Do Gcc handling, which copied the message over to some group. (defun gnus-inews-do-gcc (&optional gcc) @@ -1394,8 +1393,10 @@ this is a reply." (message-tokenize-header gcc " ,"))) ;; Copy the article over to some group(s). (while (setq group (pop groups)) - (gnus-check-server - (setq method (gnus-inews-group-method group))) + (unless (gnus-check-server + (setq method (gnus-inews-group-method group))) + (error "Can't open server %s" (if (stringp method) method + (car method)))) (unless (gnus-request-group group nil method) (gnus-request-create-group group method)) (save-excursion diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index e76760a..497d93b 100644 --- a/lisp/gnus-score.el +++ b/lisp/gnus-score.el @@ -1468,7 +1468,7 @@ EXTRA is the possible non-standard header." (headers gnus-newsgroup-headers) (current-score-file gnus-current-score-file) entry header new) - (gnus-message 5 "Scoring...") + (gnus-message 7 "Scoring...") ;; Create articles, an alist of the form `(HEADER . SCORE)'. (while (setq header (pop headers)) ;; WARNING: The assq makes the function O(N*S) while it could @@ -1529,7 +1529,7 @@ EXTRA is the possible non-standard header." (gnus-score-advanced (car score) trace)) (pop score)))) - (gnus-message 5 "Scoring...done")))))) + (gnus-message 7 "Scoring...done")))))) (defun gnus-score-lower-thread (thread score-adjust) "Lower the score on THREAD with SCORE-ADJUST. @@ -2779,8 +2779,8 @@ The list is determined from the variable gnus-score-file-alist." (while funcs (when (gnus-functionp (car funcs)) (setq score-files - (nconc score-files - (nreverse (funcall (car funcs) group))))) + (append score-files + (nreverse (funcall (car funcs) group))))) (setq funcs (cdr funcs))) (when gnus-score-use-all-scores ;; Add any home score files. diff --git a/lisp/gnus-spec.el b/lisp/gnus-spec.el index 0eb668a..1c87a0a 100644 --- a/lisp/gnus-spec.el +++ b/lisp/gnus-spec.el @@ -32,6 +32,11 @@ (require 'alist) (require 'gnus) +(defcustom gnus-use-correct-string-widths t + "*If non-nil, use correct functions for dealing with wide characters." + :group 'gnus-format + :type 'boolean) + ;;; Internal variables. (defvar gnus-summary-mark-positions nil) @@ -138,7 +143,7 @@ (defvar gnus-summary-mode-line-format-spec nil) (defvar gnus-group-mode-line-format-spec nil) -;;; Phew. All that gruft is over, fortunately. +;;; Phew. All that gruft is over with, fortunately. ;;;###autoload (defun gnus-update-format (var) @@ -288,36 +293,112 @@ by `gnus-xmas-redefine'." 'balloon-help ,(intern (format "gnus-balloon-face-%d" type)))) +(defun gnus-spec-tab (column) + (if (> column 0) + `(insert (make-string (max (- ,column (current-column)) 0) ? )) + `(progn + (if (> (current-column) ,(abs column)) + (delete-region (point) + (- (point) (- (current-column) ,(abs column)))) + (insert (make-string (max (- ,(abs column) (current-column)) 0) + ? )))))) + +(defun gnus-correct-length (string) + "Return the correct width of STRING." + (let ((length 0)) + (mapcar (lambda (char) (incf length (gnus-char-width char))) string) + length)) + +(defun gnus-correct-substring (string start end) + (let ((wstart 0) + (wend 0) + (seek 0) + (length (length string))) + ;; Find the start position. + (while (and (< seek length) + (< wstart start)) + (incf wstart (gnus-char-width (aref string seek))) + (incf seek)) + (setq wend wstart + wstart seek) + ;; Find the end position. + (while (and (< seek length) + (<= wend end)) + (incf wend (gnus-char-width (aref string seek))) + (incf seek)) + (setq wend seek) + (substring string wstart (1- wend)))) + (defun gnus-tilde-max-form (el max-width) "Return a form that limits EL to MAX-WIDTH." (let ((max (abs max-width))) (if (symbolp el) - `(if (> (length ,el) ,max) + `(if (> (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) ,el) + ,max) ,(if (< max-width 0) - `(substring ,el (- (length el) ,max)) - `(substring ,el 0 ,max)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) + ,el (- (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) + el) ,max)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) + ,el 0 ,max)) ,el) `(let ((val (eval ,el))) - (if (> (length val) ,max) + (if (> (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) val) ,max) ,(if (< max-width 0) - `(substring val (- (length val) ,max)) - `(substring val 0 ,max)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) + val (- (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) val) ,max)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) + val 0 ,max)) val))))) (defun gnus-tilde-cut-form (el cut-width) "Return a form that cuts CUT-WIDTH off of EL." (let ((cut (abs cut-width))) (if (symbolp el) - `(if (> (length ,el) ,cut) + `(if (> (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) ,el) ,cut) ,(if (< cut-width 0) - `(substring ,el 0 (- (length el) ,cut)) - `(substring ,el ,cut)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) ,el 0 + (- (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) el) ,cut)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) ,el ,cut)) ,el) `(let ((val (eval ,el))) - (if (> (length val) ,cut) + (if (> (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) val) ,cut) ,(if (< cut-width 0) - `(substring val 0 (- (length val) ,cut)) - `(substring val ,cut)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) val 0 + (- (,(if gnus-use-correct-string-widths + 'gnus-correct-length + 'length) val) ,cut)) + `(,(if gnus-use-correct-string-widths + 'gnus-correct-substring + 'substring) val ,cut)) val))))) (defun gnus-tilde-ignore-form (el ignore-value) @@ -352,6 +433,7 @@ by `gnus-xmas-redefine'." (replace-match "\\\"" nil t)) (goto-char (point-min)) (insert "(\"") + ;; Convert all font specs into font spec lists. (while (re-search-forward "%\\([0-9]+\\)?\\([«»{}()]\\)" nil t) (let ((number (if (match-beginning 1) (match-string 1) "0")) @@ -363,10 +445,20 @@ by `gnus-xmas-redefine'." (cond ((= delim ?\() "mouse") ((= delim ?\{) "face") (t "balloon")) - " " number " \"")) + " " number " \"") + t t) (replace-match "\")\"")))) (goto-char (point-max)) (insert "\")") + ;; Convert point position commands. + (goto-char (point-min)) + (while (re-search-forward "%\\([-0-9]+\\)?C" nil t) + (replace-match "\"(point)\"" t t)) + ;; Convert TAB commands. + (goto-char (point-min)) + (while (re-search-forward "%\\([-0-9]+\\)=" nil t) + (replace-match (format "\"(tab %s)\"" (match-string 1)) t t)) + ;; Convert the buffer into the spec. (goto-char (point-min)) (let ((form (read (current-buffer)))) (cons 'progn (gnus-complex-form-to-spec form spec-alist))))) @@ -375,11 +467,17 @@ by `gnus-xmas-redefine'." (delq nil (mapcar (lambda (sform) - (if (stringp sform) - (gnus-parse-simple-format sform spec-alist t) + (cond + ((stringp sform) + (gnus-parse-simple-format sform spec-alist t)) + ((eq (car sform) 'point) + `(gnus-put-text-property (1- (point)) (point) 'gnus-position t)) + ((eq (car sform) 'tab) + (gnus-spec-tab (cadr sform))) + (t (funcall (intern (format "gnus-%s-face-function" (car sform))) (gnus-complex-form-to-spec (cddr sform) spec-alist) - (nth 1 sform)))) + (nth 1 sform))))) form))) (defun gnus-parse-simple-format (format spec-alist &optional insert) diff --git a/lisp/gnus-srvr.el b/lisp/gnus-srvr.el index ba93d8c..bc9df3d 100644 --- a/lisp/gnus-srvr.el +++ b/lisp/gnus-srvr.el @@ -149,6 +149,62 @@ The following specs are understood: "\C-c\C-i" gnus-info-find-node "\C-c\C-b" gnus-bug)) +(defface gnus-server-agent-face + '((((class color) (background light)) (:foreground "PaleTurquoise" :bold t)) + (((class color) (background dark)) (:foreground "PaleTurquoise" :bold t)) + (t (:bold t))) + "Face used for displaying AGENTIZED servers" + :group 'gnus-server-visual) + +(defface gnus-server-opened-face + '((((class color) (background light)) (:foreground "Green3" :bold t)) + (((class color) (background dark)) (:foreground "Green1" :bold t)) + (t (:bold t))) + "Face used for displaying OPENED servers" + :group 'gnus-server-visual) + +(defface gnus-server-closed-face + '((((class color) (background light)) (:foreground "Steel Blue" :italic t)) + (((class color) (background dark)) + (:foreground "Light Steel Blue" :italic t)) + (t (:italic t))) + "Face used for displaying CLOSED servers" + :group 'gnus-server-visual) + +(defface gnus-server-denied-face + '((((class color) (background light)) (:foreground "Red" :bold t)) + (((class color) (background dark)) (:foreground "Pink" :bold t)) + (t (:inverse-video t :bold t))) + "Face used for displaying DENIED servers" + :group 'gnus-server-visual) + +(defcustom gnus-server-agent-face 'gnus-server-agent-face + "Face name to use on AGENTIZED servers." + :group 'gnus-server-visual + :type 'face) + +(defcustom gnus-server-opened-face 'gnus-server-opened-face + "Face name to use on OPENED servers." + :group 'gnus-server-visual + :type 'face) + +(defcustom gnus-server-closed-face 'gnus-server-closed-face + "Face name to use on CLOSED servers." + :group 'gnus-server-visual + :type 'face) + +(defcustom gnus-server-denied-face 'gnus-server-denied-face + "Face name to use on DENIED servers." + :group 'gnus-server-visual + :type 'face) + +(defvar gnus-server-font-lock-keywords + (list + '("(\\(agent\\))" 1 gnus-server-agent-face) + '("(\\(opened\\))" 1 gnus-server-opened-face) + '("(\\(closed\\))" 1 gnus-server-closed-face) + '("(\\(denied\\))" 1 gnus-server-denied-face))) + (defun gnus-server-mode () "Major mode for listing and editing servers. @@ -173,6 +229,10 @@ The following commands are available: (buffer-disable-undo) (setq truncate-lines t) (setq buffer-read-only t) + (if (featurep 'xemacs) + (put 'gnus-server-mode 'font-lock-defaults '(gnus-server-font-lock-keywords t)) + (set (make-local-variable 'font-lock-defaults) + '(gnus-server-font-lock-keywords t))) (gnus-run-hooks 'gnus-server-mode-hook)) (defun gnus-server-insert-server-line (gnus-tmp-name method) diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index b1bad26..85762a9 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -923,10 +923,17 @@ If LEVEL is non-nil, the news will be set up at level LEVEL." ;; Make sure the archive server is available to all and sundry. (when gnus-message-archive-method - (setq gnus-server-alist (delq (assoc "archive" gnus-server-alist) - gnus-server-alist)) - (push (cons "archive" gnus-message-archive-method) - gnus-server-alist)) + (unless (assoc "archive" gnus-server-alist) + (push `("archive" + (nnfolder + "archive" + (nnfolder-directory + ,(nnheader-concat message-directory "archive")) + (nnfolder-active-file + ,(nnheader-concat message-directory "archive/active")) + (nnfolder-get-new-mail nil) + (nnfolder-inhibit-expiry t))) + gnus-server-alist))) ;; If we don't read the complete active file, we fill in the ;; hashtb here. @@ -1465,18 +1472,19 @@ newsgroup." (quit (message "Quit activating %s" group) nil)) - (setq active (gnus-parse-active)) - ;; If there are no articles in the group, the GROUP - ;; command may have responded with the `(0 . 0)'. We - ;; ignore this if we already have an active entry - ;; for the group. - (if (and (zerop (car active)) - (zerop (cdr active)) - (gnus-active group)) - (gnus-active group) - (gnus-set-active group active) - ;; Return the new active info. - active)))) + (unless dont-check + (setq active (gnus-parse-active)) + ;; If there are no articles in the group, the GROUP + ;; command may have responded with the `(0 . 0)'. We + ;; ignore this if we already have an active entry + ;; for the group. + (if (and (zerop (car active)) + (zerop (cdr active)) + (gnus-active group)) + (gnus-active group) + (gnus-set-active group active) + ;; Return the new active info. + active))))) (defun gnus-get-unread-articles-in-group (info active &optional update) (when active diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index c21cb43..d531110 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -462,7 +462,7 @@ this variable specifies group names." :group 'gnus-summary-marks :type 'character) -(defcustom gnus-forwarded-mark ?O +(defcustom gnus-forwarded-mark ?F "*Mark used for articles that have been forwarded." :group 'gnus-summary-marks :type 'character) @@ -478,7 +478,12 @@ this variable specifies group names." :type 'character) (defcustom gnus-saved-mark ?S - "*Mark used for articles that have been saved to." + "*Mark used for articles that have been saved." + :group 'gnus-summary-marks + :type 'character) + +(defcustom gnus-unseen-mark ?. + "*Mark used for articles that haven't been seen." :group 'gnus-summary-marks :type 'character) @@ -1043,6 +1048,7 @@ that were fetched. Say, for nnultimate groups." ;;; Internal variables +(defvar gnus-summary-display-cache nil) (defvar gnus-article-mime-handles nil) (defvar gnus-article-decoded-p nil) (defvar gnus-article-charset nil) @@ -1075,6 +1081,7 @@ that were fetched. Say, for nnultimate groups." (defvar gnus-current-move-group nil) (defvar gnus-current-copy-group nil) (defvar gnus-current-crosspost-group nil) +(defvar gnus-newsgroup-display nil) (defvar gnus-newsgroup-dependencies nil) (defvar gnus-newsgroup-adaptive nil) @@ -1230,6 +1237,15 @@ end position and text.") (defvar gnus-newsgroup-dormant nil "List of dormant articles in the current newsgroup.") +(defvar gnus-newsgroup-unseen nil + "List of unseen articles in the current newsgroup.") + +(defvar gnus-newsgroup-seen nil + "Range of seen articles in the current newsgroup.") + +(defvar gnus-newsgroup-articles nil + "List of articles in the current newsgroup.") + (defvar gnus-newsgroup-scored nil "List of scored articles in the current newsgroup.") @@ -1274,7 +1290,8 @@ end position and text.") gnus-newsgroup-expirable gnus-newsgroup-processable gnus-newsgroup-killed gnus-newsgroup-downloadable gnus-newsgroup-undownloaded - gnus-newsgroup-unsendable + gnus-newsgroup-unsendable gnus-newsgroup-unseen + gnus-newsgroup-seen gnus-newsgroup-articles gnus-newsgroup-bookmarks gnus-newsgroup-dormant gnus-newsgroup-headers gnus-newsgroup-threads gnus-newsgroup-prepared gnus-summary-highlight-line-function @@ -1296,7 +1313,7 @@ end position and text.") gnus-cache-removable-articles gnus-newsgroup-cached gnus-newsgroup-data gnus-newsgroup-data-reverse gnus-newsgroup-limit gnus-newsgroup-limits - gnus-newsgroup-charset + gnus-newsgroup-charset gnus-newsgroup-display gnus-newsgroup-incorporated) "Variables that are buffer-local to the summary buffers.") @@ -4356,6 +4373,8 @@ or a straight list of headers." gnus-saved-mark) ((memq number gnus-newsgroup-recent) gnus-recent-mark) + ((memq number gnus-newsgroup-unseen) + gnus-unseen-mark) (t gnus-no-mark)) gnus-tmp-from (mail-header-from gnus-tmp-header) gnus-tmp-name @@ -4529,14 +4548,22 @@ If SELECT-ARTICLES, only select those articles from GROUP." (error "Couldn't request group %s: %s" group (gnus-status-message group))) - (setq gnus-newsgroup-name group) - (setq gnus-newsgroup-unselected nil) - (setq gnus-newsgroup-unreads (gnus-list-of-unread-articles group)) - (gnus-summary-setup-default-charset) + (setq gnus-newsgroup-name group + gnus-newsgroup-unselected nil + gnus-newsgroup-unreads (gnus-list-of-unread-articles group)) - ;; Adjust and set lists of article marks. - (when info - (gnus-adjust-marked-articles info)) + (setq gnus-newsgroup-display (gnus-group-find-parameter group 'display)) + (setq gnus-newsgroup-display + (cond + ((eq gnus-newsgroup-display 'all) + (setq gnus-newsgroup-display 'identity)) + ((arrayp gnus-newsgroup-display) + (gnus-summary-display-make-predicate + (mapcar 'identity gnus-newsgroup-display))) + (t + nil))) + + (gnus-summary-setup-default-charset) ;; Kludge to avoid having cached articles nixed out in virtual groups. (when (gnus-virtual-group-p group) @@ -4551,6 +4578,10 @@ If SELECT-ARTICLES, only select those articles from GROUP." (gnus-update-read-articles group gnus-newsgroup-unreads) + ;; Adjust and set lists of article marks. + (when info + (gnus-adjust-marked-articles info)) + (if (setq articles select-articles) (setq gnus-newsgroup-unselected (gnus-sorted-intersection @@ -4582,12 +4613,22 @@ If SELECT-ARTICLES, only select those articles from GROUP." ;; Set the initial limit. (setq gnus-newsgroup-limit (copy-sequence articles)) ;; Remove canceled articles from the list of unread articles. + (setq fetched-articles + (mapcar (lambda (headers) (mail-header-number headers)) + gnus-newsgroup-headers)) + (setq gnus-newsgroup-articles fetched-articles) (setq gnus-newsgroup-unreads (gnus-set-sorted-intersection - gnus-newsgroup-unreads - (setq fetched-articles - (mapcar (lambda (headers) (mail-header-number headers)) - gnus-newsgroup-headers)))) + gnus-newsgroup-unreads fetched-articles)) + + (let ((marks (assq 'seen (gnus-info-marks info)))) + ;; The `seen' marks are treated specially. + (when (setq gnus-newsgroup-seen (cdr marks)) + (dolist (article gnus-newsgroup-articles) + (unless (gnus-member-of-range + article gnus-newsgroup-seen) + (push article gnus-newsgroup-unseen))))) + ;; Removed marked articles that do not exist. (gnus-update-missing-marks (gnus-sorted-complement fetched-articles articles)) @@ -4619,6 +4660,58 @@ If SELECT-ARTICLES, only select those articles from GROUP." ;; GROUP is successfully selected. (or gnus-newsgroup-headers t))))) +(defun gnus-summary-display-make-predicate (display) + (require 'gnus-agent) + (when (= (length display) 1) + (setq display (car display))) + (unless gnus-summary-display-cache + (dolist (elem gnus-article-mark-lists) + (push (cons (cdr elem) + (gnus-byte-compile + `(lambda () (gnus-article-marked-p ',(cdr elem))))) + gnus-summary-display-cache))) + (let ((gnus-category-predicate-alist gnus-summary-display-cache)) + (gnus-get-predicate display))) + +;; Uses the dynamically bound `number' variable. +(defvar number) +(defun gnus-article-marked-p (type &optional article) + (let ((article (or article number))) + (cond + ((eq type 'tick) + (memq article gnus-newsgroup-marked)) + ((eq type 'unsend) + (memq article gnus-newsgroup-unsendable)) + ((eq type 'undownload) + (memq article gnus-newsgroup-undownloaded)) + ((eq type 'download) + (memq article gnus-newsgroup-downloadable)) + ((eq type 'unread) + (memq article gnus-newsgroup-unreads)) + ((eq type 'read) + (memq article gnus-newsgroup-reads)) + ((eq type 'dormant) + (memq article gnus-newsgroup-dormant) ) + ((eq type 'expire) + (memq article gnus-newsgroup-expirable)) + ((eq type 'reply) + (memq article gnus-newsgroup-replied)) + ((eq type 'killed) + (memq article gnus-newsgroup-killed)) + ((eq type 'bookmark) + (assq article gnus-newsgroup-bookmarks)) + ((eq type 'score) + (assq article gnus-newsgroup-scored)) + ((eq type 'save) + (memq article gnus-newsgroup-saved)) + ((eq type 'cache) + (memq article gnus-newsgroup-cached)) + ((eq type 'forward) + (memq article gnus-newsgroup-forwarded)) + ((eq type 'recent) + (memq article gnus-newsgroup-recent)) + (t t)))) + (defun gnus-articles-to-read (group &optional read-all) "Find out what articles the user wants to read." (let* ((articles @@ -4627,11 +4720,15 @@ If SELECT-ARTICLES, only select those articles from GROUP." (if (or read-all (and (zerop (length gnus-newsgroup-marked)) (zerop (length gnus-newsgroup-unreads))) - (eq (gnus-group-find-parameter group 'display) - 'all)) + gnus-newsgroup-display) + ;; We want to select the headers for all the articles in + ;; the group, so we select either all the active + ;; articles in the group, or (if that's nil), the + ;; articles in the cache. (or (gnus-uncompress-range (gnus-active group)) (gnus-cache-articles-in-group group)) + ;; Select only the "normal" subset of articles. (sort (append gnus-newsgroup-dormant gnus-newsgroup-marked (copy-sequence gnus-newsgroup-unreads)) '<))) @@ -4734,34 +4831,38 @@ If SELECT-ARTICLES, only select those articles from GROUP." (uncompressed '(score bookmark killed)) marks var articles article mark) - (while marked-lists - (setq marks (pop marked-lists)) - (set (setq var (intern (format "gnus-newsgroup-%s" - (car (rassq (setq mark (car marks)) - types))))) - (if (memq (car marks) uncompressed) (cdr marks) - (gnus-uncompress-range (cdr marks)))) + (dolist (marks marked-lists) + (setq mark (car marks)) + (unless (eq mark 'seen) + ;; Do the rest of the marks. + (set (setq var (intern (format "gnus-newsgroup-%s" + (car (rassq mark types))))) + (cond + ((memq mark uncompressed) + (cdr marks)) + (t + (gnus-uncompress-range (cdr marks))))) - (setq articles (symbol-value var)) + (setq articles (symbol-value var)) - ;; All articles have to be subsets of the active articles. - (cond - ;; Adjust "simple" lists. - ((memq mark '(tick dormant expire reply save)) - (while articles - (when (or (< (setq article (pop articles)) min) (> article max)) - (set var (delq article (symbol-value var)))))) - ;; Adjust assocs. - ((memq mark uncompressed) - (when (not (listp (cdr (symbol-value var)))) - (set var (list (symbol-value var)))) - (when (not (listp (cdr articles))) - (setq articles (list articles))) - (while articles - (when (or (not (consp (setq article (pop articles)))) - (< (car article) min) - (> (car article) max)) - (set var (delq article (symbol-value var)))))))))) + ;; All articles have to be subsets of the active articles. + (cond + ;; Adjust "simple" lists. + ((memq mark '(tick dormant expire reply save)) + (while articles + (when (or (< (setq article (pop articles)) min) (> article max)) + (set var (delq article (symbol-value var)))))) + ;; Adjust assocs. + ((memq mark uncompressed) + (when (not (listp (cdr (symbol-value var)))) + (set var (list (symbol-value var)))) + (when (not (listp (cdr articles))) + (setq articles (list articles))) + (while articles + (when (or (not (consp (setq article (pop articles)))) + (< (car article) min) + (> (car article) max)) + (set var (delq article (symbol-value var))))))))))) (defun gnus-update-missing-marks (missing) "Go through the list of MISSING articles and remove them from the mark lists." @@ -4782,15 +4883,14 @@ If SELECT-ARTICLES, only select those articles from GROUP." "Enter the various lists of marked articles into the newsgroup info list." (let ((types gnus-article-mark-lists) (info (gnus-get-info gnus-newsgroup-name)) - (uncompressed '(score bookmark killed)) + (uncompressed '(score bookmark killed seen)) type list newmarked symbol delta-marks) (when info ;; Add all marks lists to the list of marks lists. (while (setq type (pop types)) (setq list (symbol-value (setq symbol - (intern (format "gnus-newsgroup-%s" - (car type)))))) + (intern (format "gnus-newsgroup-%s" (car type)))))) (when list ;; Get rid of the entries of the articles that have the @@ -4809,6 +4909,12 @@ If SELECT-ARTICLES, only select those articles from GROUP." (setq arts (cdr arts))) (setq list (cdr all))))) + (when (eq (cdr type) 'seen) + (setq list + (if list + (gnus-add-to-range list gnus-newsgroup-unseen) + (gnus-compress-sequence gnus-newsgroup-articles)))) + (unless (memq (cdr type) uncompressed) (setq list (gnus-compress-sequence (set symbol (sort list '<)) t))) @@ -5036,6 +5142,7 @@ The resulting hash table is returned, or nil if no Xrefs were found." (gnus-group-update-group ,group t)))) ;; Add the read articles to the range. (gnus-info-set-read info range) + (gnus-request-set-mark group (list (list range 'add '(read)))) ;; Then we have to re-compute how many unread ;; articles there are in this group. (when active @@ -7057,6 +7164,7 @@ fetch-old-headers verbiage, and so on." ;; Most groups have nothing to remove. (if (or gnus-inhibit-limiting (and (null gnus-newsgroup-dormant) + (eq gnus-newsgroup-display 'identity) (not (eq gnus-fetch-old-headers 'some)) (not (numberp gnus-fetch-old-headers)) (not (eq gnus-fetch-old-headers 'invisible)) @@ -7145,6 +7253,9 @@ fetch-old-headers verbiage, and so on." (push (cons number gnus-low-score-mark) gnus-newsgroup-reads))) t) + ;; Do the `display' group parameter. + (and gnus-newsgroup-display + (not (funcall gnus-newsgroup-display))) ;; Check NoCeM things. (if (and gnus-use-nocem (gnus-nocem-unwanted-article-p @@ -7814,15 +7925,20 @@ to save in." "Force re-fetching of the current article. If ARG (the prefix) is a number, show the article with the charset defined in `gnus-summary-show-article-charset-alist', or the charset -inputed. +input. If ARG (the prefix) is non-nil and not a number, show the raw article without any article massaging functions being run." (interactive "P") (cond ((numberp arg) + (gnus-summary-show-article t) (let ((gnus-newsgroup-charset (or (cdr (assq arg gnus-summary-show-article-charset-alist)) - (mm-read-coding-system "Charset: "))) + (mm-read-coding-system + "View as charset: " + (save-excursion + (set-buffer gnus-article-buffer) + (detect-coding-region (point) (point-max) t))))) (gnus-newsgroup-ignored-charsets 'gnus-all)) (gnus-summary-select-article nil 'force) (let ((deps gnus-newsgroup-dependencies) @@ -7844,9 +7960,8 @@ without any article massaging functions being run." header) (gnus-summary-update-article-line (cdr gnus-article-current) header) - (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark - (cdr gnus-article-current)))))) + (when (gnus-summary-goto-subject (cdr gnus-article-current) nil t) + (gnus-summary-update-secondary-mark (cdr gnus-article-current)))))) ((not arg) ;; Select the article the normal way. (gnus-summary-select-article nil 'force)) @@ -7983,10 +8098,6 @@ ACTION can be either `move' (the default), `crosspost' or `copy'." (interactive "P") (unless action (setq action 'move)) - ;; Disable marking as read. - (let (gnus-mark-article-hook) - (save-window-excursion - (gnus-summary-select-article))) ;; Check whether the source group supports the required functions. (cond ((and (eq action 'move) (not (gnus-check-backend-function @@ -8164,7 +8275,7 @@ ACTION can be either `move' (the default), `crosspost' or `copy'." (setq marks (cdr marks))) (gnus-request-set-mark to-group (list (list (list to-article) - 'set + 'add to-marks)))) (gnus-dribble-enter @@ -8983,6 +9094,8 @@ Iff NO-EXPIRE, auto-expiry will be inhibited." gnus-saved-mark) ((memq article gnus-newsgroup-recent) gnus-recent-mark) + ((memq article gnus-newsgroup-unseen) + gnus-unseen-mark) (t gnus-no-mark)) 'replied) (when (gnus-visual-p 'summary-highlight 'highlight) diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index 51d4242..3be8990 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -214,7 +214,10 @@ (defun gnus-goto-colon () (beginning-of-line) - (search-forward ":" (gnus-point-at-eol) t)) + (let ((eol (gnus-point-at-eol))) + (goto-char (or (text-property-any (point) eol 'gnus-position t) + (search-forward ":" eol t) + (point))))) (defun gnus-remove-text-with-property (prop) "Delete all text in the current buffer with text property PROP." @@ -1094,6 +1097,23 @@ Return the modified alist." (byte-compile form)) form)) +(defun gnus-remassoc (key alist) + "Delete by side effect any elements of LIST whose car is `equal' to KEY. +The modified LIST is returned. If the first member +of LIST has a car that is `equal' to KEY, there is no way to remove it +by side effect; therefore, write `(setq foo (remassoc key foo))' to be +sure of changing the value of `foo'." + (when alist + (if (equal key (caar alist)) + (cdr alist) + (setcdr alist (gnus-remassoc key (cdr alist))) + alist))) + +(defun gnus-update-alist-soft (key value alist) + (if value + (cons (cons key value) (gnus-remassoc key alist)) + (gnus-remassoc key alist))) + (provide 'gnus-util) ;;; gnus-util.el ends here diff --git a/lisp/gnus.el b/lisp/gnus.el index 48f0707..896860e 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -43,6 +43,11 @@ :group 'news :group 'mail) +(defgroup gnus-format nil + "Dealing with formatting issues." + :group 'news + :group 'mail) + (defgroup gnus-charset nil "Group character set issues." :link '(custom-manual "(gnus)Charsets") @@ -238,6 +243,11 @@ "Options related to newsservers and other servers used by Gnus." :group 'gnus) +(defgroup gnus-server-visual nil + "Highlighting and menus in the server buffer." + :group 'gnus-visual + :group 'gnus-server) + (defgroup gnus-message '((message custom-group)) "Composing replies and followups in Gnus." :group 'gnus) @@ -747,7 +757,7 @@ be set in `.emacs' instead." (:foreground "Brown")) (t ())) - "Face of the splash screen.") + "Face for the splash screen.") (defun gnus-splash () (save-excursion @@ -1085,23 +1095,9 @@ see the manual for details." :group 'gnus-server :type 'gnus-select-method) -(defcustom gnus-message-archive-method - (progn - ;; Don't require it at top level to avoid circularity. - (require 'message) - `(nnfolder - "archive" - (nnfolder-directory ,(nnheader-concat message-directory "archive")) - (nnfolder-active-file - ,(nnheader-concat message-directory "archive/active")) - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t))) +(defcustom gnus-message-archive-method "archive" "*Method used for archiving messages you've sent. -This should be a mail method. - -It's probably not very effective to change this variable once you've -run Gnus once. After doing that, you must edit this server from the -server buffer." +This should be a mail method." :group 'gnus-server :group 'gnus-message :type 'gnus-select-method) @@ -1829,7 +1825,7 @@ covered by that variable." (scored . score) (saved . save) (cached . cache) (downloadable . download) (unsendable . unsend) (forwarded . forward) - (recent . recent))) + (recent . recent) (seen . seen))) (defvar gnus-headers-retrieved-by nil) (defvar gnus-article-reply nil) @@ -2412,7 +2408,7 @@ STRINGS will be evaluated in normal `or' order." (setq strings nil))) string)) -(defun gnus-info-find-node () +(defun gnus-info-find-node (&optional nodename) "Find Info documentation of Gnus." (interactive) ;; Enlarge info window if needed. @@ -2422,7 +2418,8 @@ STRINGS will be evaluated in normal `or' order." (or gnus-info-filename (get-language-info current-language-environment 'gnus-info) "gnus") - (or (cadr (assq major-mode gnus-info-nodes)) + (or nodename + (cadr (assq major-mode gnus-info-nodes)) (and (eq (current-buffer) (get-buffer gnus-article-buffer)) (cadr (assq 'gnus-article-mode gnus-info-nodes)))))) (setq gnus-info-buffer (current-buffer)) @@ -2842,16 +2839,32 @@ You should probably use `gnus-find-method-for-group' instead." (defun gnus-parameters-get-parameter (group) "Return the group parameters for GROUP from `gnus-parameters'." - (let ((alist gnus-parameters) - params-list) - (while alist - (when (string-match (caar alist) group) + (let (params-list) + (dolist (elem gnus-parameters) + (when (string-match (car elem) group) (setq params-list - (nconc (copy-sequence (cdar alist)) - params-list))) - (pop alist)) + (nconc (gnus-expand-group-parameters + (car elem) (cdr elem) group) + params-list)))) params-list)) +(defun gnus-expand-group-parameters (match parameters group) + "Go through PARAMETERS and expand them according to the match data." + (let (new) + (dolist (elem parameters) + (if (and (stringp (cdr elem)) + (string-match "\\\\" (cdr elem))) + (push (cons (car elem) + (with-temp-buffer + (insert group) + (goto-char (point-min)) + (while (re-search-forward match nil t) + (replace-match (cdr elem))) + (buffer-string))) + new) + (push elem new))) + new)) + (defun gnus-group-find-parameter (group &optional symbol allow-list) "Return the group parameters for GROUP. If SYMBOL, return the value of that symbol in the group parameters." diff --git a/lisp/imap.el b/lisp/imap.el index 61306f1..d84aab6 100644 --- a/lisp/imap.el +++ b/lisp/imap.el @@ -1620,19 +1620,19 @@ on failure." (defun imap-wait-for-tag (tag &optional buffer) (with-current-buffer (or buffer (current-buffer)) (while (and (null imap-continuation) + (memq (process-status imap-process) '(open run)) (< imap-reached-tag tag)) - (or (and (not (memq (process-status imap-process) '(open run))) - (sit-for 1)) - (let ((len (/ (point-max) 1024)) - message-log-max) - (unless (< len 10) - (message "imap read: %dk" len)) - (accept-process-output imap-process 1)))) + (let ((len (/ (point-max) 1024)) + message-log-max) + (unless (< len 10) + (message "imap read: %dk" len)) + (accept-process-output imap-process 1))) (message "") - (or (assq tag imap-failed-tags) - (if imap-continuation - 'INCOMPLETE - 'OK)))) + (and (memq (process-status imap-process) '(open run)) + (or (assq tag imap-failed-tags) + (if imap-continuation + 'INCOMPLETE + 'OK))))) (defun imap-sentinel (process string) (delete-process process)) diff --git a/lisp/lpath.el b/lisp/lpath.el index eba2a3b..bf39359 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -73,7 +73,8 @@ set-face-stipple set-frame-face-alist track-mouse url-retrieve w3-form-encode-xwfu window-at window-edges x-color-values x-popup-menu browse-url - frame-char-height frame-char-width)) + frame-char-height frame-char-width + xml-parse-region)) (maybe-bind '(buffer-display-table buffer-file-coding-system font-lock-defaults global-face-data gnus-article-x-face-too-ugly @@ -103,22 +104,23 @@ set-face-doc-string set-glyph-image set-glyph-property specifier-instance url-generic-parse-url valid-image-instantiator-format-p w3-do-setup - window-pixel-height window-pixel-width))) + window-pixel-height window-pixel-width + xml-parse-region))) ;; T-gnus. (let ((functions-variables (cond ((featurep 'xemacs) - '((xml-parse-region))) + nil) ((>= emacs-major-version 21) '((function-max-args smiley-encode-buffer))) ((boundp 'MULE) '((coding-system-get compose-mail file-name-extension find-coding-systems-region function-max-args get-charset-property shell-command-to-string - smiley-encode-buffer xml-parse-region))) + smiley-encode-buffer))) (t - '((function-max-args smiley-encode-buffer xml-parse-region)))))) + '((function-max-args smiley-encode-buffer)))))) (maybe-fbind (car functions-variables)) (maybe-bind (car (cdr functions-variables)))) diff --git a/lisp/message.el b/lisp/message.el index c2780bc..a710df2 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -53,6 +53,8 @@ (require 'mail-parse) (require 'mml)) +(require 'rfc822) + (defgroup message '((user-mail-address custom-variable) (user-full-name custom-variable)) "Mail and news message composing." @@ -221,7 +223,7 @@ header, remove it from this list." '(From Subject Date (optional . In-Reply-To) Message-ID Lines (optional . User-Agent)) "*Headers to be generated or prompted for when mailing a message. -RFC822 required that From, Date, To, Subject and Message-ID be +It is recommended that From, Date, To, Subject and Message-ID be included. Organization, Lines and User-Agent are optional." :group 'message-mail :group 'message-headers @@ -1754,7 +1756,7 @@ Point is left at the beginning of the narrowed-to region." ["Send Message" message-send-and-exit ,@(if (featurep 'xemacs) '(t) '(:help "Send this message"))] - ["Abort Message" message-dont-send + ["Postpone Message" message-dont-send ,@(if (featurep 'xemacs) '(t) '(:help "File this draft message and exit"))] ["Kill Message" message-kill-buffer @@ -3584,6 +3586,14 @@ This sub function is for exclusive use of `message-send-news'." (message "Denied posting -- the From looks strange: \"%s\"." from) nil) + ((let ((addresses (rfc822-addresses from))) + (while (and addresses + (not (eq (string-to-char (car addresses)) ?\())) + (setq addresses (cdr addresses))) + addresses) + (message + "Denied posting -- bad From address: \"%s\"." from) + nil) (t t)))) ;; Check the Reply-To header. (message-check 'reply-to diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 6774bdf..7975fae 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -279,6 +279,14 @@ Ready-made functions include `capitalize', `downcase', `upcase', and `upcase-initials'.") +(defvar mm-path-name-rewrite-functions nil + "*List of functions used for rewriting path names of MIME parts. +This is used when viewing parts externally , and is meant for +transforming the path name so that non-compliant programs can +find the file where it's saved. + +Each function takes a file name as input and returns a file name.") + (defvar mm-file-name-replace-whitespace nil "String used for replacing whitespace characters; default is `\"_\"'.") @@ -406,8 +414,9 @@ for types in mm-keep-viewer-alive-types." (mm-handle-set-undisplayer handle function))) (defun mm-destroy-postponed-undisplay-list () - (message "Destroying external MIME viewers") - (mm-destroy-parts mm-postponed-undisplay-list)) + (when mm-postponed-undisplay-list + (message "Destroying external MIME viewers") + (mm-destroy-parts mm-postponed-undisplay-list))) (defun mm-dissect-buffer (&optional no-strict-mime) "Dissect the current buffer and return a list of MIME handles." @@ -614,7 +623,8 @@ external if displayed external." (mm-handle-set-undisplayer handle mm))))) ;; The function is a string to be executed. (mm-insert-part handle) - (let* ((dir (make-temp-name (expand-file-name "emm." mm-tmp-directory))) + (let* ((dir (make-temp-name + (expand-file-name "emm." mm-tmp-directory))) (filename (mail-content-type-get (mm-handle-disposition handle) 'filename)) (mime-info (mailcap-mime-info @@ -633,74 +643,76 @@ external if displayed external." (let ((coding-system-for-write mm-binary-coding-system)) (write-region (point-min) (point-max) file nil 'nomesg)) (message "Viewing with %s" method) - (cond (needsterm - (unwind-protect - (if window-system - (start-process "*display*" nil - mm-external-terminal-program - "-e" shell-file-name - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (require 'term) - (require 'gnus-win) - (set-buffer - (setq buffer - (make-term "display" - shell-file-name - nil - shell-command-switch - (mm-mailcap-command - method file - (mm-handle-type handle))))) - (term-mode) - (term-char-mode) - (set-process-sentinel - (get-buffer-process buffer) - `(lambda (process state) - (if (eq 'exit (process-status process)) - (gnus-configure-windows - ',gnus-current-window-configuration)))) - (gnus-configure-windows 'display-term)) - (mm-handle-set-external-undisplayer handle (cons file buffer))) - (message "Displaying %s..." (format method file)) - 'external) - (copiousoutput - (with-current-buffer outbuf - (forward-line 1) - (mm-insert-inline - handle - (unwind-protect - (progn - (call-process shell-file-name nil - (setq buffer - (generate-new-buffer " *mm*")) - nil - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (if (buffer-live-p buffer) - (save-excursion - (set-buffer buffer) - (buffer-string)))) - (progn - (ignore-errors (delete-file file)) - (ignore-errors (delete-directory - (file-name-directory file))) - (ignore-errors (kill-buffer buffer)))))) - 'inline) - (t - (unwind-protect - (start-process "*display*" - (setq buffer - (generate-new-buffer " *mm*")) + (cond + (needsterm + (unwind-protect + (if window-system + (start-process "*display*" nil + mm-external-terminal-program + "-e" shell-file-name + shell-command-switch + (mm-mailcap-command + method file (mm-handle-type handle))) + (require 'term) + (require 'gnus-win) + (set-buffer + (setq buffer + (make-term "display" shell-file-name + nil shell-command-switch (mm-mailcap-command - method file (mm-handle-type handle))) - (mm-handle-set-external-undisplayer handle (cons file buffer))) - (message "Displaying %s..." (format method file)) - 'external))))))) + method file + (mm-handle-type handle))))) + (term-mode) + (term-char-mode) + (set-process-sentinel + (get-buffer-process buffer) + `(lambda (process state) + (if (eq 'exit (process-status process)) + (gnus-configure-windows + ',gnus-current-window-configuration)))) + (gnus-configure-windows 'display-term)) + (mm-handle-set-external-undisplayer handle (cons file buffer))) + (message "Displaying %s..." (format method file)) + 'external) + (copiousoutput + (with-current-buffer outbuf + (forward-line 1) + (mm-insert-inline + handle + (unwind-protect + (progn + (call-process shell-file-name nil + (setq buffer + (generate-new-buffer " *mm*")) + nil + shell-command-switch + (mm-mailcap-command + method file (mm-handle-type handle))) + (if (buffer-live-p buffer) + (save-excursion + (set-buffer buffer) + (buffer-string)))) + (progn + (ignore-errors (delete-file file)) + (ignore-errors (delete-directory + (file-name-directory file))) + (ignore-errors (kill-buffer buffer)))))) + 'inline) + (t + (unwind-protect + (start-process "*display*" + (setq buffer + (generate-new-buffer " *mm*")) + shell-file-name + shell-command-switch + (mm-mailcap-command + method file (mm-handle-type handle))) + (mm-handle-set-external-undisplayer + handle (cons file buffer))) + (message "Displaying %s..." (format method file)) + 'external))))))) (defun mm-mailcap-command (method file type-list) (let ((ctl (cdr type-list)) @@ -717,16 +729,18 @@ external if displayed external." (push "%" out)) ((string= total "%s") (setq uses-stdin nil) - (push (mm-quote-arg file) out)) + (push (mm-quote-arg + (gnus-map-function mm-path-name-rewrite-functions file)) out)) ((string= total "%t") (push (mm-quote-arg (car type-list)) out)) (t (push (mm-quote-arg (or (cdr (assq (intern sub) ctl)) "")) out)))) (push (substring method beg (length method)) out) - (if uses-stdin - (progn - (push "<" out) - (push (mm-quote-arg file) out))) + (when uses-stdin + (push "<" out) + (push (mm-quote-arg + (gnus-map-function mm-path-name-rewrite-functions file)) + out)) (mapconcat 'identity (nreverse out) ""))) (defun mm-remove-parts (handles) @@ -968,8 +982,7 @@ like underscores." (defun mm-save-part-to-file (handle file) (mm-with-unibyte-buffer - (or (mm-insert-part handle) - (error "Error with message")) + (mm-insert-part handle) (let ((coding-system-for-write 'binary) ;; Don't re-compress .gz & al. Arguably we should make ;; `file-name-handler-alist' nil, but that would chop diff --git a/lisp/mm-view.el b/lisp/mm-view.el index edd824b..82f116c 100644 --- a/lisp/mm-view.el +++ b/lisp/mm-view.el @@ -164,11 +164,12 @@ (mm-insert-inline handle (concat "\n-- \n" - (if (fboundp 'vcard-pretty-print) - (vcard-pretty-print (mm-get-part handle)) - (vcard-format-string - (vcard-parse-string (mm-get-part handle) - 'vcard-standard-filter)))))) + (ignore-errors + (if (fboundp 'vcard-pretty-print) + (vcard-pretty-print (mm-get-part handle)) + (vcard-format-string + (vcard-parse-string (mm-get-part handle) + 'vcard-standard-filter))))))) (t (let ((b (point)) (charset (mail-content-type-get diff --git a/lisp/mml.el b/lisp/mml.el index 2757551..84693d8 100644 --- a/lisp/mml.el +++ b/lisp/mml.el @@ -720,22 +720,19 @@ If HANDLES is non-nil, use it instead reparsing the buffer." (easy-menu-define mml-menu mml-mode-map "" - '("Mime" - ("Attach" - ["File" mml-attach-file t] - ["Buffer" mml-attach-buffer t] - ["External" mml-attach-external t]) - ("Insert" - ["Multipart" mml-insert-multipart t] - ["Part" mml-insert-part t]) - ("Security" - ["Sign PGP/MIME" mml-secure-sign-pgpmime t] - ["Sign S/MIME" mml-secure-sign-smime t] - ["Encrypt PGP/MIME" mml-secure-encrypt-pgpmime t] - ["Encrypt S/MIME" mml-secure-encrypt-smime t]) + '("Attachments" + ["Attach File" mml-attach-file t] + ["Attach Buffer" mml-attach-buffer t] + ["Attach External" mml-attach-external t] + ["Insert Part" mml-insert-part t] + ["Insert Multipart" mml-insert-multipart t] + ["PGP/MIME Sign" mml-secure-sign-pgpmime t] + ["PGP/MIME Encrypt" mml-secure-encrypt-pgpmime t] + ["S/MIME Sign" mml-secure-sign-smime t] + ["S/MIME Encrypt" mml-secure-encrypt-smime t] ;;["Narrow" mml-narrow-to-part t] - ["Quote" mml-quote-region t] - ["Validate" mml-validate t] + ["Quote MML" mml-quote-region t] + ["Validate MML" mml-validate t] ["Preview" mml-preview t])) (defvar mml-mode nil diff --git a/lisp/nnbabyl.el b/lisp/nnbabyl.el index 622f0e4..6e4f883 100644 --- a/lisp/nnbabyl.el +++ b/lisp/nnbabyl.el @@ -44,16 +44,25 @@ (nnoo-declare nnbabyl) (defvoo nnbabyl-mbox-file (expand-file-name "~/RMAIL") - "The name of the rmail box file in the users home directory.") + "The name of the rmail box file in the users home directory. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnbabyl-active-file (expand-file-name "~/.rmail-active") - "The name of the active file for the rmail box.") + "The name of the active file for the rmail box. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnbabyl-get-new-mail t - "If non-nil, nnbabyl will check the incoming mail file and split the mail.") + "If non-nil, nnbabyl will check the incoming mail file and split the mail. + +This variable is a virtual server slot. See the Gnus manual for details.") + (defvoo nnbabyl-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving.") + "Hook run narrowed to an article before saving. + +This variable is a virtual server slot. See the Gnus manual for details.") diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index d55b37b..f234b8d 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -45,7 +45,9 @@ (nnoo-declare nnfolder) (defvoo nnfolder-directory (expand-file-name message-directory) - "The name of the nnfolder directory.") + "The name of the nnfolder directory. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnfolder-nov-directory nil "The name of the nnfolder NOV directory. @@ -53,7 +55,9 @@ If nil, `nnfolder-directory' is used.") (defvoo nnfolder-active-file (nnheader-concat nnfolder-directory "active") - "The name of the active file.") + "The name of the active file. + +This variable is a virtual server slot. See the Gnus manual for details.") ;; I renamed this variable to something more in keeping with the general GNU ;; style. -SLB @@ -75,19 +79,28 @@ message, a huge time saver for large mailboxes.") (defvoo nnfolder-newsgroups-file (concat (file-name-as-directory nnfolder-directory) "newsgroups") - "Mail newsgroups description file.") + "Mail newsgroups description file. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnfolder-get-new-mail t - "If non-nil, nnfolder will check the incoming mail file and split the mail.") + "If non-nil, nnfolder will check the incoming mail file and split the mail. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnfolder-prepare-save-mail-hook nil "Hook run narrowed to an article before saving.") (defvoo nnfolder-save-buffer-hook nil - "Hook run before saving the nnfolder mbox buffer.") + "Hook run before saving the nnfolder mbox buffer. + +This variable is a virtual server slot. See the Gnus manual for details.") + (defvoo nnfolder-inhibit-expiry nil - "If non-nil, inhibit expiry.") + "If non-nil, inhibit expiry. + +This variable is a virtual server slot. See the Gnus manual for details.") @@ -119,7 +132,9 @@ This variable shouldn't be flipped much. If you have, for some reason, set this to t, and want to set it to nil again, you should always run the `nnfolder-generate-active-file' command. The function will go through all nnfolder directories and generate nov databases for them -all. This may very well take some time.") +all. This may very well take some time. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnfolder-nov-file-suffix ".nov") diff --git a/lisp/nnimap.el b/lisp/nnimap.el index a715e4a..9895171 100644 --- a/lisp/nnimap.el +++ b/lisp/nnimap.el @@ -912,7 +912,7 @@ function is generally only called when Gnus is shutting down." (imap-mailbox-get 'flags)))) (gnus-info-set-marks info - (nnimap-update-alist-soft + (gnus-update-alist-soft (cdr pred) (gnus-compress-sequence (imap-search (nnimap-mark-to-predicate (cdr pred)))) @@ -925,7 +925,7 @@ function is generally only called when Gnus is shutting down." ;; so we remove that mark for gnus since we support dormant (gnus-info-set-marks info - (nnimap-update-alist-soft + (gnus-update-alist-soft 'tick (gnus-remove-from-range (cdr-safe (assoc 'tick (gnus-info-marks info))) @@ -1352,23 +1352,6 @@ be used in a STORE FLAGS command." "Return t iff MARK can be permanently (between IMAP sessions) saved on articles, in GROUP." (imap-message-flag-permanent-p (nnimap-mark-to-flag mark))) -(defun nnimap-remassoc (key alist) - "Delete by side effect any elements of LIST whose car is `equal' to KEY. -The modified LIST is returned. If the first member -of LIST has a car that is `equal' to KEY, there is no way to remove it -by side effect; therefore, write `(setq foo (remassoc key foo))' to be -sure of changing the value of `foo'." - (when alist - (if (equal key (caar alist)) - (cdr alist) - (setcdr alist (nnimap-remassoc key (cdr alist))) - alist))) - -(defun nnimap-update-alist-soft (key value alist) - (if value - (cons (cons key value) (nnimap-remassoc key alist)) - (nnimap-remassoc key alist))) - (when nnimap-debug (require 'trace) (buffer-disable-undo (get-buffer-create nnimap-debug)) @@ -1429,8 +1412,6 @@ sure of changing the value of `foo'." nnimap-mark-to-flag-1 nnimap-mark-to-flag nnimap-mark-permanent-p - nnimap-remassoc - nnimap-update-alist-soft ))) (provide 'nnimap) diff --git a/lisp/nnmbox.el b/lisp/nnmbox.el index 2c29861..f45b7f2 100644 --- a/lisp/nnmbox.el +++ b/lisp/nnmbox.el @@ -38,16 +38,24 @@ (nnoo-declare nnmbox) (defvoo nnmbox-mbox-file (expand-file-name "~/mbox") - "The name of the mail box file in the user's home directory.") + "The name of the mail box file in the user's home directory. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnmbox-active-file (expand-file-name "~/.mbox-active") - "The name of the active file for the mail box.") + "The name of the active file for the mail box. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnmbox-get-new-mail t - "If non-nil, nnmbox will check the incoming mail file and split the mail.") + "If non-nil, nnmbox will check the incoming mail file and split the mail. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnmbox-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving.") + "Hook run narrowed to an article before saving. + +This variable is a virtual server slot. See the Gnus manual for details.") diff --git a/lisp/nnmh.el b/lisp/nnmh.el index e086f4d..ef374ec 100644 --- a/lisp/nnmh.el +++ b/lisp/nnmh.el @@ -44,19 +44,27 @@ (nnoo-declare nnmh) (defvoo nnmh-directory message-directory - "*Mail spool directory.") + "*Mail spool directory. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnmh-get-new-mail t - "*If non-nil, nnmh will check the incoming mail file and split the mail.") + "*If non-nil, nnmh will check the incoming mail file and split the mail. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnmh-prepare-save-mail-hook nil - "*Hook run narrowed to an article before saving.") + "*Hook run narrowed to an article before saving. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnmh-be-safe nil "*If non-nil, nnmh will check all articles to make sure whether they are new or not. Go through the .nnmh-articles file and compare with the actual articles in this folder. The articles that are \"new\" will be marked -as unread by Gnus.") +as unread by Gnus. + +This variable is a virtual server slot. See the Gnus manual for details.") diff --git a/lisp/nnml.el b/lisp/nnml.el index b5e8be2..18b651d 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -41,18 +41,26 @@ (nnoo-declare nnml) (defvoo nnml-directory message-directory - "Spool directory for the nnml mail backend.") + "Spool directory for the nnml mail backend. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnml-active-file (expand-file-name "active" nnml-directory) - "Mail active file.") + "Mail active file. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnml-newsgroups-file (expand-file-name "newsgroups" nnml-directory) - "Mail newsgroups description file.") + "Mail newsgroups description file. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnml-get-new-mail t - "If non-nil, nnml will check the incoming mail file and split the mail.") + "If non-nil, nnml will check the incoming mail file and split the mail. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnml-nov-is-evil nil "If non-nil, Gnus will never generate and use nov databases for mail groups. @@ -61,13 +69,19 @@ This variable shouldn't be flipped much. If you have, for some reason, set this to t, and want to set it to nil again, you should always run the `nnml-generate-nov-databases' command. The function will go through all nnml directories and generate nov databases for them -all. This may very well take some time.") +all. This may very well take some time. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnml-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving.") + "Hook run narrowed to an article before saving. + +This variable is a virtual server slot. See the Gnus manual for details.") (defvoo nnml-inhibit-expiry nil - "If non-nil, inhibit expiry.") + "If non-nil, inhibit expiry. + +This variable is a virtual server slot. See the Gnus manual for details.") @@ -434,7 +448,8 @@ check twice.") (directory-files nnml-current-directory t (concat nnheader-numerical-short-files - "\\|" (regexp-quote nnml-nov-file-name) "$"))) + "\\|" (regexp-quote nnml-nov-file-name) "$" + "\\|" (regexp-quote nnml-marks-file-name) "$"))) article) (while articles (setq article (pop articles)) @@ -472,6 +487,10 @@ check twice.") (let ((overview (concat old-dir nnml-nov-file-name))) (when (file-exists-p overview) (rename-file overview (concat new-dir nnml-nov-file-name)))) + ;; Move .marks file. + (let ((marks (concat old-dir nnml-marks-file-name))) + (when (file-exists-p marks) + (rename-file marks (concat new-dir nnml-marks-file-name)))) (when (<= (length (directory-files old-dir)) 2) (ignore-errors (delete-directory old-dir))) ;; That went ok, so we change the internal structures. @@ -846,6 +865,85 @@ check twice.") (setq nnml-article-file-alist (nnheader-article-to-file-alist nnml-current-directory)))) +(defvoo nnml-marks-file-name ".marks") +(defvoo nnml-marks-is-evil nil) +(defvoo nnml-marks nil) + +(deffoo nnml-request-set-mark (group actions &optional server) + (nnml-possibly-change-directory group server) + (unless nnml-marks-is-evil + (nnml-open-marks group server) + (dolist (action actions) + (let ((range (nth 0 action)) + (what (nth 1 action)) + (marks (nth 2 action))) + (assert (or (eq what 'add) (eq what 'del)) t + "Unknown request-set-mark action: %s" what) + (dolist (mark marks) + (setq nnml-marks (gnus-update-alist-soft + mark + (funcall (if (eq what 'add) 'gnus-range-add + 'gnus-remove-from-range) + (cdr (assoc mark nnml-marks)) range) + nnml-marks))))) + (nnml-save-marks group server)) + nil) + +(deffoo nnml-request-update-info (group info &optional server) + (nnml-possibly-change-directory group server) + (unless nnml-marks-is-evil + (nnml-open-marks group server) + ;; Update info using `nnml-marks'. + (mapcar (lambda (pred) + (gnus-info-set-marks + info + (gnus-update-alist-soft + (cdr pred) + (cdr (assq (cdr pred) nnml-marks)) + (gnus-info-marks info)) + t)) + gnus-article-mark-lists) + (let ((seen (cdr (assq 'read nnml-marks)))) + (gnus-info-set-read info + (if (and (integerp (car seen)) + (null (cdr seen))) + (list (cons (car seen) (car seen))) + seen)))) + info) + +(defun nnml-save-marks (group server) + (let ((file-name-coding-system nnmail-pathname-coding-system) + (file (expand-file-name nnml-marks-file-name + (nnmail-group-pathname group nnml-directory)))) + (nnml-possibly-create-directory group) + (with-temp-file file + (erase-buffer) + (princ nnml-marks (current-buffer)) + (insert "\n")))) + +(defun nnml-open-marks (group server) + (let ((file (expand-file-name + nnml-marks-file-name + (nnmail-group-pathname group nnml-directory)))) + (if (file-exists-p file) + (setq nnml-marks (condition-case err + (with-temp-buffer + (nnheader-insert-file-contents file) + (read (current-buffer))) + (error (or (gnus-yes-or-no-p + (format "Error reading nnml marks file %s (%s). Continuing will use marks from .newsrc.eld. Continue? " file err)) + (error "Cannot read nnml marks file %s (%s)" file err))))) + ;; User didn't have a .marks file. Probably first time + ;; user of the .marks stuff. Bootstrap it from .newsrc.eld. + (let ((info (gnus-get-info + (gnus-group-prefixed-name + group + (gnus-server-to-method (format "nnml:%s" server)))))) + (nnheader-message 6 "Boostrapping nnml marks...") + (setq nnml-marks (gnus-info-marks info)) + (push (cons 'read (gnus-info-read info)) nnml-marks) + (nnml-save-marks group server))))) + (provide 'nnml) ;;; nnml.el ends here diff --git a/lisp/nnslashdot.el b/lisp/nnslashdot.el index 4c2f1d2..d8f926a 100644 --- a/lisp/nnslashdot.el +++ b/lisp/nnslashdot.el @@ -90,19 +90,17 @@ (nnslashdot-possibly-change-server group server) (condition-case why (unless gnus-nov-is-evil - (if nnslashdot-threaded - (nnslashdot-threaded-retrieve-headers articles group) - (nnslashdot-sane-retrieve-headers articles group))) + (nnslashdot-retrieve-headers-1 articles group)) (search-failed (nnslashdot-lose why)))) -(deffoo nnslashdot-threaded-retrieve-headers (articles group) - (let ((last (car (last articles))) - (did nil) - (start 1) - (sid (caddr (assoc group nnslashdot-groups))) - (first-comments t) - (startats '(1)) - headers article subject score from date lines parent point s) +(deffoo nnslashdot-retrieve-headers-1 (articles group) + (let* ((last (car (last articles))) + (start (if nnslashdot-threaded 1 (pop articles))) + (entry (assoc group nnslashdot-groups)) + (sid (nth 2 entry)) + (first-comments t) + headers article subject score from date lines parent point cid + s startats changed) (save-excursion (set-buffer nnslashdot-buffer) (let ((case-fold-search t)) @@ -111,10 +109,10 @@ (nnweb-insert (format nnslashdot-article-url (nnslashdot-sid-strip sid)) t) (goto-char (point-min)) - (search-forward "Posted by ") - (when (looking-at "]+>\\([^<]+\\)") - (setq from (nnweb-decode-entities-string (match-string 1)))) - (search-forward " on ") + (re-search-forward "Posted by[ \t\r\n]+") + (when (looking-at "\\(]+>\\)?[ \t\r\n]*\\([^<\r\n]+\\)") + (setq from (nnweb-decode-entities-string (match-string 2)))) + (search-forward "on ") (setq date (nnslashdot-date-to-date (buffer-substring (point) (1- (search-forward "<"))))) (setq lines (/ (- (point) @@ -127,16 +125,16 @@ 1 group from date (concat "<" (nnslashdot-sid-strip sid) "%1@slashdot>") "" 0 lines nil nil)) - headers)) - (while (and (setq start (pop startats)) - (< start last)) + headers) + (setq start (if nnslashdot-threaded 2 (pop articles)))) + (while (and start (<= start last)) (setq point (goto-char (point-max))) (nnweb-insert (format nnslashdot-comments-url (nnslashdot-sid-strip sid) - nnslashdot-threshold 0 start) + nnslashdot-threshold 0 (- start 2)) t) - (when first-comments + (when (and nnslashdot-threaded first-comments) (setq first-comments nil) (goto-char (point-max)) (while (re-search-backward "startat=\\([0-9]+\\)" nil t) @@ -144,32 +142,36 @@ (unless (memq s startats) (push s startats))) (setq startats (sort startats '<))) + (setq article (if (and article (< start article)) article start)) (goto-char point) (while (re-search-forward "<\\(b\\|H4\\)>\\([^<]+\\).*score:\\([^)]+\\))" nil t) - (setq article (string-to-number (match-string 1)) + (setq cid (match-string 1) subject (match-string 3) score (match-string 5)) + (unless (assq article (nth 4 entry)) + (setcar (nthcdr 4 entry) (cons (cons article cid) (nth 4 entry))) + (setq changed t)) (when (string-match "^Re: *" subject) (setq subject (concat "Re: " (substring subject (match-end 0))))) (setq subject (nnweb-decode-entities-string subject)) - (forward-line 1) + (search-forward "
") (if (looking-at - "by ]+>\\([^<]+\\)
[ \t\n]*.*(\\([^)]+\\))") + "by[ \t\n]+]+>\\([^<]+\\)[ \t\n]*(\\(<[^>]+>\\)*\\([^<>)]+\\))") (progn (goto-char (- (match-end 0) 5)) (setq from (concat (nnweb-decode-entities-string (match-string 1)) - " <" (match-string 2) ">"))) + " <" (match-string 3) ">"))) (setq from "") - (when (looking-at "by \\(.+\\) on ") + (when (looking-at "by \\([^<>]*\\) on ") (goto-char (- (match-end 0) 5)) (setq from (nnweb-decode-entities-string (match-string 1))))) (search-forward " on ") (setq date (nnslashdot-date-to-date - (buffer-substring (point) (progn (end-of-line) (point))))) + (buffer-substring (point) (progn (skip-chars-forward "^()<>\n\r") (point))))) (setq lines (/ (abs (- (search-forward ""))) 70)) @@ -178,127 +180,30 @@ (if (looking-at ".*cid=\\([0-9]+\\)") (match-string 1) nil)) - (setq did t) (push (cons - (1+ article) + article (make-full-mail-header - (1+ article) + article (concat subject " (" score ")") from date - (concat "<" (nnslashdot-sid-strip sid) "%" - (number-to-string (1+ article)) - "@slashdot>") + (concat "<" (nnslashdot-sid-strip sid) "%" cid "@slashdot>") (if parent - (concat "<" (nnslashdot-sid-strip sid) "%" - (number-to-string (1+ (string-to-number parent))) - "@slashdot>") + (concat "<" (nnslashdot-sid-strip sid) "%" + parent "@slashdot>") "") 0 lines nil nil)) - headers))))) - (setq nnslashdot-headers (sort headers 'car-less-than-car)) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (mm-with-unibyte-current-buffer - (dolist (header nnslashdot-headers) - (nnheader-insert-nov (cdr header))))) - 'nov)) - -(deffoo nnslashdot-sane-retrieve-headers (articles group) - (let ((last (car (last articles))) - (did nil) - (start (max (1- (car articles)) 1)) - (sid (caddr (assoc group nnslashdot-groups))) - headers article subject score from date lines parent point) - (save-excursion - (set-buffer nnslashdot-buffer) - (erase-buffer) - (when (= start 1) - (nnweb-insert (format nnslashdot-article-url - (nnslashdot-sid-strip sid)) t) - (goto-char (point-min)) - (search-forward "Posted by ") - (when (looking-at "]+>\\([^<]+\\)") - (setq from (nnweb-decode-entities-string (match-string 1)))) - (search-forward " on ") - (setq date (nnslashdot-date-to-date - (buffer-substring (point) (1- (search-forward "<"))))) - (forward-line 2) - (setq lines (count-lines (point) - (re-search-forward - "A href=\"\\(http://slashdot.org\\)?/article"))) - (push - (cons - 1 - (make-full-mail-header - 1 group from date (concat "<" (nnslashdot-sid-strip sid) - "%1@slashdot>") - "" 0 lines nil nil)) - headers)) - (while (or (not article) - (and did - (< article last))) - (when article - (setq start (1+ article))) - (setq point (goto-char (point-max))) - (nnweb-insert - (format nnslashdot-comments-url (nnslashdot-sid-strip sid) - nnslashdot-threshold 4 start) - t) - (goto-char point) - (while (re-search-forward - "<\\(b\\|H4\\)>\\([^<]+\\).*score:\\([^)]+\\))" - nil t) - (setq article (string-to-number (match-string 1)) - subject (match-string 3) - score (match-string 5)) - (when (string-match "^Re: *" subject) - (setq subject (concat "Re: " (substring subject (match-end 0))))) - (setq subject (nnweb-decode-entities-string subject)) - (forward-line 1) - (if (looking-at - "by ]+>\\([^<]+\\)[ \t\n]*.*(\\([^)]+\\))") + headers) + (while (and articles (<= (car articles) article)) + (pop articles)) + (setq article (1+ article))) + (if nnslashdot-threaded (progn - (goto-char (- (match-end 0) 5)) - (setq from (concat - (nnweb-decode-entities-string (match-string 1)) - " <" (match-string 2) ">"))) - (setq from "") - (when (looking-at "by \\(.+\\) on ") - (goto-char (- (match-end 0) 5)) - (setq from (nnweb-decode-entities-string (match-string 1))))) - (search-forward " on ") - (setq date - (nnslashdot-date-to-date - (buffer-substring (point) (progn (end-of-line) (point))))) - (setq lines (/ (abs (- (search-forward ""))) - 70)) - (forward-line 2) - (setq parent - (if (looking-at ".*cid=\\([0-9]+\\)") - (match-string 1) - nil)) - (setq did t) - (push - (cons - (1+ article) - (make-full-mail-header - (1+ article) (concat subject " (" score ")") - from date - (concat "<" (nnslashdot-sid-strip sid) "%" - (number-to-string (1+ article)) - "@slashdot>") - (if parent - (concat "<" (nnslashdot-sid-strip sid) "%" - (number-to-string (1+ (string-to-number parent))) - "@slashdot>") - "") - 0 lines nil nil)) - headers)))) - (setq nnslashdot-headers - (sort headers (lambda (s1 s2) (< (car s1) (car s2))))) + (setq start (pop startats)) + (if start (setq start (+ start 2)))) + (setq start (pop articles)))))) + (if changed (nnslashdot-write-groups)) + (setq nnslashdot-headers (sort headers 'car-less-than-car)) (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) @@ -329,7 +234,7 @@ (deffoo nnslashdot-request-article (article &optional group server buffer) (nnslashdot-possibly-change-server group server) - (let (contents) + (let (contents cid) (condition-case why (save-excursion (set-buffer nnslashdot-buffer) @@ -337,23 +242,32 @@ (goto-char (point-min)) (when (and (stringp article) (string-match "%\\([0-9]+\\)@" article)) - (setq article (string-to-number (match-string 1 article)))) + (setq cid (match-string 1 article)) + (let ((map (nth 4 (assoc group nnslashdot-groups)))) + (while map + (if (equal (cdar map) cid) + (setq article (caar map) + map nil) + (setq map (cdr map)))))) (when (numberp article) (if (= article 1) (progn - (re-search-forward "Posted by *<[^>]+>[^>]*<[^>]+> *on ") + (re-search-forward + "Posted by") (search-forward "
") (setq contents (buffer-substring (point) (progn (re-search-forward - "

.*A href=\"\\(http://slashdot.org\\)?/article") + "< [ \t\r\n]*" (1- article))) + (setq cid (cdr (assq article + (nth 4 (assoc group nnslashdot-groups))))) + (search-forward (format "" cid)) (setq contents (buffer-substring - (re-search-forward "]+>") + (re-search-forward "]*>") (search-forward ""))))))) (search-failed (nnslashdot-lose why))) @@ -408,7 +322,7 @@ (setq gname (concat description " (" sid ")")) (if (setq elem (assoc gname nnslashdot-groups)) (setcar (cdr elem) articles) - (push (list gname articles sid (current-time)) + (push (list gname articles sid (current-time) nil) nnslashdot-groups)) (goto-char (point-max)) (widen))) @@ -430,7 +344,7 @@ (setq gname (concat description " (" sid ")")) (if (setq elem (assoc gname nnslashdot-groups)) (setcar (cdr elem) articles) - (push (list gname articles sid (current-time)) + (push (list gname articles sid (current-time) nil) nnslashdot-groups))))) (incf number 30))) (search-failed (nnslashdot-lose why))) @@ -532,13 +446,27 @@ (unless nnslashdot-groups (nnslashdot-read-groups))) +(defun nnslashdot-make-tuple (tuple n) + (prog1 + tuple + (while (> n 1) + (unless (cdr tuple) + (setcdr tuple (list nil))) + (setq tuple (cdr tuple) + n (1- n))))) + (defun nnslashdot-read-groups () (let ((file (expand-file-name "groups" nnslashdot-directory))) (when (file-exists-p file) (mm-with-unibyte-buffer (insert-file-contents file) (goto-char (point-min)) - (setq nnslashdot-groups (read (current-buffer))))))) + (setq nnslashdot-groups (read (current-buffer)))) + (if (and nnslashdot-groups (< (length (car nnslashdot-groups)) 5)) + (let ((groups nnslashdot-groups)) + (while groups + (nnslashdot-make-tuple (car groups) 5) + (setq groups (cdr groups)))))))) (defun nnslashdot-write-groups () (with-temp-file (expand-file-name "groups" nnslashdot-directory) diff --git a/lisp/smiley-ems.el b/lisp/smiley-ems.el index 7ebd1ab..f2c28f0 100644 --- a/lisp/smiley-ems.el +++ b/lisp/smiley-ems.el @@ -70,7 +70,9 @@ rgexp to replace with IMAGE. IMAGE is the name of a PBM file in (defvar smiley-cached-regexp-alist nil) (defun smiley-update-cache () - (dolist (elt smiley-regexp-alist) + (dolist (elt (if (symbolp smiley-regexp-alist) + (symbol-value smiley-regexp-alist) + smiley-regexp-alist)) (let* ((data-directory smiley-data-directory) (image (find-image (list (list :type 'pbm :file (nth 2 elt) diff --git a/lisp/smime.el b/lisp/smime.el index 678042a..9146963 100644 --- a/lisp/smime.el +++ b/lisp/smime.el @@ -189,6 +189,15 @@ If nil, use system defaults." (defvar smime-details-buffer "*OpenSSL output*") +(eval-and-compile + (defalias 'smime-make-temp-file + (if (fboundp 'make-temp-file) + 'make-temp-file + (lambda (prefix &optional dir-flag) ;; Simple implementation + (expand-file-name + (make-temp-name prefix) + temporary-file-directory))))) + ;; Password dialog function (defun smime-ask-passphrase () @@ -229,7 +238,7 @@ to include in its caar." (certfiles (and (cdr keyfiles) (cadr keyfiles))) (buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) (passphrase (smime-ask-passphrase)) - (tmpfile (make-temp-file "smime"))) + (tmpfile (smime-make-temp-file "smime"))) (if passphrase (setenv "GNUS_SMIME_PASSPHRASE" passphrase)) (prog1 @@ -263,7 +272,7 @@ have proper MIME tags. CERTFILES is a list of filenames, each file is expected to contain of a PEM encoded certificate." (smime-new-details-buffer) (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - (tmpfile (make-temp-file "smime"))) + (tmpfile (smime-make-temp-file "smime"))) (prog1 (when (prog1 (apply 'smime-call-openssl-region b e (list buffer tmpfile) @@ -354,7 +363,7 @@ in the buffer specified by `smime-details-buffer'." (smime-new-details-buffer) (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) CAs (passphrase (smime-ask-passphrase)) - (tmpfile (make-temp-file "smime"))) + (tmpfile (smime-make-temp-file "smime"))) (if passphrase (setenv "GNUS_SMIME_PASSPHRASE" passphrase)) (if (prog1 @@ -461,10 +470,11 @@ A string or a list of strings is returned." (caddr curkey) (smime-get-certfiles keyfile otherkeys))))) -(defalias 'smime-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position)) +(eval-and-compile + (defalias 'smime-point-at-eol + (if (fboundp 'point-at-eol) + 'point-at-eol + 'line-end-position))) (defun smime-buffer-as-string-region (b e) "Return each line in region between B and E as a list of strings." diff --git a/texi/ChangeLog b/texi/ChangeLog index 7ab6263..331b802 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,43 @@ +2001-08-20 Kai Gro,A_(Bjohann + + * gnus.texi (Delayed Articles): New section. Documents + gnus-delay.el. + (Fancy Mail Splitting): Say that nnmail-cache-accepted-message-ids + must be non-nil for splitting with parents to work. + +2001-08-19 17:31:15 Lars Magne Ingebrigtsen + + * gnus.texi (Other Marks): Addition. + (Positioning Point): New. + (Tabulation): New. + +2001-08-19 Kai Gro,A_(Bjohann + + * gnus.texi (Getting Started Reading Mail): Use (nnml "") rather + than (nnml "private") as the example server specification. This + way, the example group names a few paragraphs further down are + correct, and I expect that most people are going to use the empty + string as name, anyway. Please holler if that is wrong. + +2001-08-18 Simon Josefsson + + * gnus.texi (Optional Backend Functions): Remove `set' + request-set-mark action. + +2001-08-18 00:40:10 Lars Magne Ingebrigtsen + + * gnus.texi (Wide Characters): New section. + +2001-08-17 Simon Josefsson + + * gnus.texi: Replace 20,20 with 23,23 for + gnus-summary-line-format. + +2001-08-17 14:24:14 Lars Magne Ingebrigtsen + + * gnus.texi (Group Parameters): Document regexp substitution. + (Group Parameters): Addition. + 2001-08-11 23:00:00 ShengHuo ZHU From Nevin Kapur diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index 5787ab7..700db8c 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -459,497 +459,573 @@ Emacs $B$,J8>O$rJT=8$9$k?M$KNO$rM?$($k$h$&$K!"(Bgnus $B$O%K%e!<%9$rFI$`?M$KNO @end iftex @menu -* Starting Up:: $B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN$l$J$$(B -* Group Buffer:: $B%0%k!<%W$rA*Br$7!"9XFI$7!":o=|$9$k(B -* Summary Buffer:: $B5-;v$rFI$_!"J]B8$7!"Ej9F$9$k(B -* Article Buffer:: $B5-;v$rI=<($7!"07$&(B -* Composing Messages:: $B%a!<%k$H%K%e!<%9$rAw$k$?$a$N>pJs(B -* Select Methods:: Gnus $B$OA4$F$N%a%C%;!<%8$r$$$m$$$m$JA*BrJ}K!$GFI$`(B -* Scoring:: $B5-;v$KCM$r$D$1$k(B -* Various:: $B0lHLE*$J@_Dj(B -* The End:: $B$5$i$P!"$=$7$F$5$h$&$J$i(B -* Appendices:: $BMQ8l!"(BEmacs $BF~Lg!"(BFAQ$B!"Nr;K!"FbIt9=B$(B -* Index:: $BJQ?t!"4X?t!"35G0$N:w0z(B -* Key Index:: $B%-!<:w0z(B +* Starting Up:: $B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN(B + $B$l$J$$(B +* Group Buffer:: $B%0%k!<%W$rA*Br$7!"9XFI$7!":o=|$9$k(B +* Summary Buffer:: $B5-;v$rFI$_!"J]B8$7!"Ej9F$9$k(B +* Article Buffer:: $B5-;v$rI=<($7!"07$&(B +* Composing Messages:: $B%a!<%k$H%K%e!<%9$rAw$k$?$a$N>pJs(B +* Select Methods:: Gnus $B$OA4$F$N%a%C%;!<%8$r$$$m$$$m$JA*Br(B + $BJ}K!$GFI$`(B +* Scoring:: $B5-;v$KCM$r$D$1$k(B +* Various:: $B0lHLE*$J@_Dj(B +* The End:: $B$5$i$P!"$=$7$F$5$h$&$J$i(B +* Appendices:: $BMQ8l!"(BEmacs $BF~Lg!"(BFAQ$B!"Nr;K!"FbIt9=B$(B +* Index:: $BJQ?t!"4X?t!"35G0$N:w0z(B +* Key Index:: $B%-!<:w0z(B @detailmenu --- The Detailed Node Listing --- Starting Gnus -* Finding the News:: $B%K%e!<%9$re$N(B gnus $B$r:nF0$5$;$k$3$H$,$G$-$k(B -* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B -* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B -* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B--@file{.newsrc} -* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B -* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$Ne$N(B gnus $B$r:nF0$5$;$k$3$H$,(B + $B$G$-$k(B +* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B +* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B +* Changing Servers:: $B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7(B + $B$l$J$$(B +* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B -- + @file{.newsrc} +* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B +* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$NpJs$HJQ99$NJ}K!(B -* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B -* Selecting a Group:: $BpJs$rJQ99$9$k(B -* Subscription Commands:: $B9XFI!"9XFICf;_!">C5n(B -* Group Levels:: $B%l%Y%k(B? $B$=$l$C$F2?(B? -* Group Score:: $B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!(B -* Marking Groups:: $B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-$^$9(B -* Foreign Groups:: $B%0%k!<%W$N:n@.$H=$@5(B -* Group Parameters:: $B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l$^$9(B -* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<($G$-$^$9(B -* Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$((B -* Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}(B -* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_$h$&(B -* Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&(B -* Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d$9$k(B -* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B +* Group Buffer Format:: $BI=<($5$l$F$$$k>pJs$HJQ99$NJ}K!(B +* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B +* Selecting a Group:: $BC5n(B +* Group Data:: $B%0%k!<%W$N>pJs$rJQ99$9$k(B +* Group Levels:: $B%l%Y%k(B? $B$=$l$C$F2?(B? +* Group Score:: $B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!(B +* Marking Groups:: $B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-(B + $B$^$9(B +* Foreign Groups:: $B%0%k!<%W$N:n@.$H=$@5(B +* Group Parameters:: $B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l(B + $B$^$9(B +* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<((B + $B$G$-$^$9(B +* Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$((B +* Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}(B +* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_(B + $B$h$&(B +* Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&(B +* Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d(B + $B$9$k(B +* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B Group Buffer Format -* Group Line Specification:: $B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k(B -* Group Modeline Specification:: $B%0%k!<%W%P%C%U%!$N%b!<%I9T(B -* Group Highlighting:: $B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k(B +* Group Line Specification:: $B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k(B +* Group Modeline Specification:: $B%0%k!<%W%P%C%U%!$N%b!<%I9T(B +* Group Highlighting:: $B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k(B Group Topics -* Topic Variables:: Lisp $B$G%H%T%C%/$r%+%9%?%^%$%:$9$kJ}K!(B -* Topic Commands:: $BD64JC1BPOC7?L?Na(B -* Topic Sorting:: $B%H%T%C%/KhJL!9$KJB$YBX$($k(B -* Topic Topology:: $BA4@$3&$NCO?^(B -* Topic Parameters:: $B$"$k%H%T%C%/$NA4$F$N%0%k!<%W$KE,MQ$5$l$k%Q%i%a!<%?(B +* Topic Variables:: Lisp $B$G%H%T%C%/$r%+%9%?%^%$%:$9$kJ}K!(B +* Topic Commands:: $BD64JC1BPOC7?L?Na(B +* Topic Sorting:: $B%H%T%C%/KhJL!9$KJB$YBX$($k(B +* Topic Topology:: $BA4@$3&$NCO?^(B +* Topic Parameters:: $B$"$k%H%T%C%/$NA4$F$N%0%k!<%W$KE,MQ$5$l$k(B + $B%Q%i%a!<%?(B Misc Group Stuff -* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&$+$rJ9$/(B -* Group Information:: $B%0%k!<%W$H(B gnus $B$K4X$9$k>pJs$H%X%k%W(B -* Group Timestamp:: Gnus $B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k(B -* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B +* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&(B + $B$+$rJ9$/(B +* Group Information:: $B%0%k!<%W$H(B gnus $B$K4X$9$k>pJs$H%X%k%W(B +* Group Timestamp:: Gnus $B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-(B + $BO?$5$;$k(B +* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B Summary Buffer -* Summary Buffer Format:: $B35N,%P%C%U%!$N304Q$r7hDj$9$k(B -* Summary Maneuvering:: $B35N,%P%C%U%!$rF0$-2s$k(B -* Choosing Articles:: $B5-;v$rFI$`(B -* Paging the Article:: $BFI$s$G$$$k5-;v$r%9%/%m!<%k$9$k(B -* Reply Followup and Post:: $B5-;v$rEj9F$9$k(B -* Marking Articles:: $B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1$k(B -* Limiting:: $B35N,%P%C%U%!$K@)8B$r2C$($k$3$H$,$G$-$k(B -* Threading:: $B%9%l%C%I$,$I$N$h$&$K:n$i$l$k$+(B -* Sorting the Summary Buffer:: $B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k$+(B -* Asynchronous Fetching:: Gnus $B$O5-;v$r@h$KC5n$7$J$/$5$;$k(B -* Article Backlog:: $B4{$KFI$s$@5-;v$r;D$7$F$*$/(B -* Saving Articles:: $B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!(B -* Decoding Articles:: Gnus $B$O0lO"$N(B (uu)encode $B$5$l$?5-;v$r07$($k(B -* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G$-$k(B -@c * MIME Commands:: Doing MIMEy things with the articles. -@c * Charsets:: Character set issues. -* Article Commands:: $B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k(B -* Summary Sorting:: $B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k(B -* Finding the Parent:: $B;R5-;v$K1g=u$,L5$$$C$F(B? $B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N(B -* Exiting the Summary Buffer:: $B%0%k!<%W%P%C%U%!$KLa$k!"(B - $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B -* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l$k$+(B -* Duplicate Suppression:: $B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXC5n$7$J$/$5$;$k(B +* Article Backlog:: $B4{$KFI$s$@5-;v$r;D$7$F$*$/(B +* Saving Articles:: $B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!(B +* Decoding Articles:: Gnus $B$O0lO"$N(B (uu)encode $B$5$l$?5-;v$r07(B + $B$($k(B +* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G(B + $B$-$k(B +@c * MIME Commands:: Doing MIMEy things with the articles. +@c * Charsets:: Character set issues. +* Article Commands:: $B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k(B +* Summary Sorting:: $B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k(B +* Finding the Parent:: $B;R5-;v$K1g=u$,L5$$$C$F(B? $B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N(B +* Exiting the Summary Buffer:: $B%0%k!<%W%P%C%U%!$KLa$k!"(B + $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B +* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l(B + $B$k$+(B +* Duplicate Suppression:: $B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXA0$rI=<($7$J$$J}K!(B -* Summary Buffer Mode Line:: $B%b!<%I9T$N8+$(J}$r7h$a$i$l$k(B -* Summary Highlighting:: $B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k(B +* Summary Buffer Lines:: $B35N,%P%C%U%!$,$I$N$h$&$K8+$($k$Y$-$+$r;X(B + $BDj$G$-$k(B +* To From Newsgroups:: $B<+J,<+?H$NL>A0$rI=<($7$J$$J}K!(B +* Summary Buffer Mode Line:: $B%b!<%I9T$N8+$(J}$r7h$a$i$l$k(B +* Summary Highlighting:: $B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k(B Choosing Articles -* Choosing Commands:: $B5-;v$rA*Br$9$k$?$a$NL?Na(B -* Choosing Variables:: $B$3$l$i$NL?Na$K1F6A$r5Z$\$9JQ?t(B +* Choosing Commands:: $B5-;v$rA*Br$9$k$?$a$NL?Na(B +* Choosing Variables:: $B$3$l$i$NL?Na$K1F6A$r5Z$\$9JQ?t(B Reply, Followup and Post -* Summary Mail Commands:: $B%a!<%k$rAw$k(B -* Summary Post Commands:: $B%K%e!<%9$rAw$k(B -* Summary Message Commands:: $BB>$N%a%C%;!<%84XO"$NL?Na(B -* Canceling and Superseding:: $B!X$"$!!"$"$s$J$U$&$K8@$&$s$8$c$J$+$C$?!Y(B +* Summary Mail Commands:: $B%a!<%k$rAw$k(B +* Summary Post Commands:: $B%K%e!<%9$rAw$k(B +* Summary Message Commands:: $BB>$N%a%C%;!<%84XO"$NL?Na(B +* Canceling and Superseding:: Marking Articles -* Unread Articles:: $BL$FI5-;v$X$N0u(B -* Read Articles:: $B4{FI5-;v$X$N0u(B -* Other Marks:: $B9XFIEY$K1F6A$7$J$$0u(B -* Setting Marks:: $B0u$NIU$1J}$H>C$7J}(B -* Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B -* Setting Process Marks:: $B8e$NC$7J}(B +* Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B +* Setting Process Marks:: $B8e$N$NI|9f2=$NJQ?t(B -* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B +* Rule Variables:: $B%U%!%$%k$,$I$N$h$&$KI=<($5$l$k$+$r7h$a$k(B + $BJQ?t(B +* Other Decode Variables:: $BB>$NI|9f2=$NJQ?t(B +* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B Article Treatment -* Article Highlighting:: $B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?$$(B -* Article Fontisizing:: $B6/D4$5$l$?J8$rAGE($K$9$k(B -* Article Hiding:: $BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&(B -* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?4X?t(B -* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C%/$9$k(B -* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! -* Article Signature:: $B=pL>$C$F2?(B? -* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B +* Article Highlighting:: $B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?(B + $B$$(B +* Article Fontisizing:: $B6/D4$5$l$?J8$rAGE($K$9$k(B +* Article Hiding:: $BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&(B +* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?(B + $B4X?t(B +* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C(B + $B%/$9$k(B +* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! +* Article Signature:: $B=pL>$C$F2?(B? +* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B Alternative Approaches -* Pick and Read:: $B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B -* Binary Groups:: $B$9$Y$F$N5-;v$r<+F0(B-$BI|9f2=$9$k(B +* Pick and Read:: $B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B +* Binary Groups:: $B$9$Y$F$N5-;v$r<+F0(B-$BI|9f2=$9$k(B Various Summary Stuff -* Summary Group Information:: $B>pJs;X8~$NL?Na(B -* Searching for Articles:: $BJ#?t5-;vL?Na(B -* Summary Generation Commands:: $B35N,%P%C%U%!$N(B ($B:F(B) $B:n@.(B -* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B +* Summary Group Information:: $B>pJs;X8~$NL?Na(B +* Searching for Articles:: $BJ#?t5-;vL?Na(B +* Summary Generation Commands:: +* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B Article Buffer -* Hiding Headers:: $B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k(B -* Using MIME:: @sc{mime} $B5-;v$H$7$F8+$;$k(B -* Customizing Articles:: $B5-;v$N8+1I$($r;EN)$F$k(B -* Article Keymap:: $B5-;v%P%C%U%!$G;H$($k%-!(B +* Hiding Headers:: $B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k(B +* Using MIME:: @sc{mime} $B5-;v$H$7$F8+$;$k(B +* Customizing Articles:: $B5-;v$N8+1I$($r;EN)$F$k(B +* Article Keymap:: $B5-;v%P%C%U%!$G;H$($k%-!(B Composing Messages -* Mail:: $B%a!<%k$HJVEz(B -* Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+(B? -* Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k(B -* Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3$m(B -* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}K!(B -* Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8(B -* Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K2?$,5/$3$k(B? -@c * Using GPG:: How to use GPG and MML to sign and encrypt messages +* Mail:: $B%a!<%k$HJVEz(B +* Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+(B? +* Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k(B +* Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3(B + $B$m(B +* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}(B + $BK!(B +* Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8(B +* Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K(B + $B2?$,5/$3$k(B? +@c * Using GPG:: How to use GPG and MML to sign and encrypt messages Select Methods -* Server Buffer:: $B;ve$N%5!<%P!<$r:n$C$FJT=8$9$k(B -* Getting News:: USENET $B%K%e!<%9$r(B gnus $B$GFI$`(B -* Getting Mail:: $B8D?ME*$J%a!<%k$r(B gnus $B$GFI$`(B -* Browsing the Web:: $B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$re$N%5!<%P!<$r:n$C$FJT=8$9$k(B +* Getting News:: USENET $B%K%e!<%9$r(B gnus $B$GFI$`(B +* Getting Mail:: $B8D?ME*$J%a!<%k$r(B gnus $B$GFI$`(B +* Browsing the Web:: $B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B -* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn$A(B - $B$F$$$k$+$b$7$l$J$$(B +* Server Buffer Format:: $B$3$N%P%C%U%!$N308+$r%+%9%?%^%$%:$G$-$k(B +* Server Commands:: $B%5!<%P!<$rA`$kL?Na(B +* Example Methods:: $B%5!<%P!<;XDj$NNc(B +* Creating a Virtual Server:: $B%;%C%7%g%s$NNc(B +* Server Variables:: $B$I$NJQ?t$r@_Dj$9$k$+(B +* Servers and Methods:: $B%5!<%P!$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B +* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn(B + $B$A$F$$$k$+$b$7$l$J$$(B Getting News -* NNTP:: @sc{nntp} $B%5!<%P!<$+$i%K%e!<%9$rFI$`(B -* News Spool:: $B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`(B +* NNTP:: @sc{nntp} $B%5!<%P!<$+$i%K%e!<%9$rFI$`(B +* News Spool:: $B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`(B + +@sc{nntp} + +* Direct Functions:: $B%5!<%P!<$KD>@\@\B3$9$k(B +* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B +* Common Variables:: $B$$$/$D$+$N@\B3MQ$N4X?t$,;2>H$9$kJQ?t(B Getting Mail -* Mail in a Newsreader:: $B%K%e!<%9%j!<%@$G%a!<%k(B ($BBg;v$JA0CV$-(B) -* Getting Started Reading Mail:: $B4JC1$JNAM}K\$N$h$&$JNc(B -* Splitting Mail:: $B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+(B -* Mail Sources:: Gnus $B$K$I$3$+$i%a!<%k$r$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B - $B%s%I$r;H$&(B -* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B +* Mail in a Newsreader:: $B%K%e!<%9%j!<%@$G%a!<%k(B ($BBg;v$JA0CV$-(B) +* Getting Started Reading Mail:: $B4JC1$JNAM}K\$N$h$&$JNc(B +* Splitting Mail:: $B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+(B +* Mail Sources:: Gnus $B$K$I$3$+$i%a!<%k$r$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B + $B%s%I$r;H$&(B +* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B Mail Sources -* Mail Source Specifiers:: $B%a!<%k$N85$,$I$3$+$r;XDj$9$k(B -* Mail Source Customization:: $B@$$NCf$K1F6A$9$k$$$/$D$+$NJQ?t(B -* Fetching Mail:: $B%a!<%k%=!<%9;X<(;R$r;HMQ$9$k(B +* Mail Source Specifiers:: $B%a!<%k$N85$,$I$3$+$r;XDj$9$k(B +* Mail Source Customization:: $B@$$NCf$K1F6A$9$k$$$/$D$+$NJQ?t(B +* Fetching Mail:: $B%a!<%k%=!<%9;X<(;R$r;HMQ$9$k(B Choosing a Mail Backend -* Unix Mail Box:: ($B$H$F$b(B) $BI8=`E*$J(B Un*x mbox $B$r;H$&(B -* Rmail Babyl:: Emacs $B$N%W%m%0%i%`$O(B rmail $B$N(B babyl format $B$r;H$&(B -* Mail Spool:: $B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k(B? -* MH Spool:: mhspool $B$N$h$&$J%P%C%/%(%s%I(B -* Mail Folders:: $B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k$r;}$D(B -* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B +* Unix Mail Box:: ($B$H$F$b(B) $BI8=`E*$J(B Un*x mbox $B$r;H$&(B +* Rmail Babyl:: Emacs $B$N%W%m%0%i%`$O(B rmail $B$N(B babyl $B%U%)!<(B + $B%^%C%H$r;H$&(B +* Mail Spool:: $B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k(B? +* MH Spool:: mhspool $B$N$h$&$J%P%C%/%(%s%I(B +* Mail Folders:: $B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k(B + $B$r;}$D(B +* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B Browsing the Web -* Web Searches:: $BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k(B -* Slashdot:: Slashdot $B$N%3%a%s%H$rFI$`(B -* Ultimate:: Ultimate Bulletin Board $B%7%9%F%`(B -* Web Archive:: $B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`(B -* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B -* RSS:: RDF Site Summary $B$rFI$`(B -* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B +* Web Searches:: $BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k(B +* Slashdot:: Slashdot $B$N%3%a%s%H$rFI$`(B +* Ultimate:: Ultimate Bulletin Board $B%7%9%F%`(B +* Web Archive:: $B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`(B +* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B +* RSS:: RDF Site Summary $B$rFI$`(B +* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B Other Sources -* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$KFI$`(B -* Anything Groups:: Dired? $BC/$,(B dired $B$J$s$F;H$&$N(B? -* Document Groups:: $B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG(B -* SOUP:: @sc{soup} $B%Q%1%C%H$r(B ``$B%*%U%i%$%s(B''$B$GFI$`(B -* Mail-To-News Gateways:: $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7$F5-;v(B - $B$rEj9F$9$k(B -* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B +* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$K(B + $BFI$`(B +* Anything Groups:: Dired? $BC/$,(B dired $B$J$s$F;H$&$N(B? +* Document Groups:: $B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG(B +* SOUP:: @sc{soup} $B%Q%1%C%H$r(B ``$B%*%U%i%$%s(B'' $B$GFI$`(B +* Mail-To-News Gateways:: $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7(B + $B$F5-;v$rEj9F$9$k(B +* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B Document Groups -* Document Server Internals:: $B$"$J$?FH<+$NJ8=q$NMxMQ$NMxMQC$9J}K!(B -* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B -* Outgoing Messages:: $BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? -* Agent Variables:: $B%+%9%?%^%$%:$O3Z$7(B -* Example Setup:: $B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $B$NNc(B -* Batching Agents:: @code{cron} $B%8%g%V$K$h$k%K%e!<%9C$9J}K!(B +* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B +* Outgoing Messages:: $BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? +* Agent Variables:: $B%+%9%?%^%$%:$O3Z$7(B +* Example Setup:: $B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $B$NNc(B +* Batching Agents:: @code{cron} $B%8%g%V$K$h$k%K%e!<%9C5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B -* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B -* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B -* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"$k(B +* Summary Score Commands:: $B8=:_$N%0%k!<%W$N$?$a$N%9%3%"EPO?$rDI2C$9(B + $B$k(B +* Group Score Commands:: $B0lHLE*$J%9%3%"L?Na(B +* Score Variables:: $B$"$J$?$N%9%3%"$r%+%9%?%^%$%:$9$k(B + ($B$^$!!"$J$s$FMQ8l$G$7$g$&(B) +* Score File Format:: $B%9%3%"%U%!%$%k$K2?$rF~$l$k$+(B +* Score File Editing:: $BC5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B +* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B +* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B +* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"(B + $B$k(B GroupLens -* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k$h$&$K(B - $B$9$k$+(B -* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k$+$rCN(B - $B$i$;$k(B -* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9$k(B -* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B +* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k(B + $B$h$&$K$9$k$+(B +* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k(B + $B$+$rCN$i$;$k(B +* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9(B + $B$k(B +* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B Advanced Scoring -* Advanced Scoring Syntax:: $BDj5A(B -* Advanced Scoring Examples:: $B$I$N$h$&$K8+$($k$+(B -* Advanced Scoring Tips:: $B$=$l$r:GBg8BMxMQ$9$k(B +* Advanced Scoring Syntax:: $BDj5A(B +* Advanced Scoring Examples:: $B$I$N$h$&$K8+$($k$+(B +* Advanced Scoring Tips:: $B$=$l$r:GBg8BMxMQ$9$k(B Various -* Process/Prefix:: $BB?$/$N07$$L?Na$G;H$o$l$k=,47(B -* Interactive:: Gnus $B$KB?$/$Ne$2$k$+(B -* Mode Lines:: $B%b!<%I9T$K>pJs$rI=<($9$k(B -* Highlighting and Menus:: $B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k(B -* Buttons:: $B4JC1$J==Jb$G%"%-%l%9g'$rF@$k(B -* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!(B -* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k(B -* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+(B -* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_$9$k(B -* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?(B? -* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!(B -* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N(B +* Process/Prefix:: $BB?$/$N07$$L?Na$G;H$o$l$k=,47(B +* Interactive:: Gnus $B$KB?$/$Ne$2$k$+(B +* Mode Lines:: $B%b!<%I9T$K>pJs$rI=<($9$k(B +* Highlighting and Menus:: $B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k(B +* Buttons:: $B4JC1$J==Jb$G%"%-%l%9g'$rF@$k(B +* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!(B +* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k(B +* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+(B +* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_(B + $B$9$k(B +* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?(B? +* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!(B +* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N(B Formatting Variables -* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"$k(B -* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N5,B'(B -* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k(B -* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k(B -* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k(B +* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"(B + $B$k(B +* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N(B + $B5,B'(B +* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k(B +* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k(B +* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k(B +* Positioning Point:: $BA`:n$N8e$G%]%$%s%H$r0\F0$9$k(B +* Tabulation:: $BI=$r:n$k(B +* Wide Characters:: $BI}$,9-$$J8;z$r07$&(B XEmacs Enhancements -* Picons:: $B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!(B -* Smileys:: $BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<($9$kJ}K!(B -* Toolbar:: $B%/%j%C%/1n(B -* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B +* Picons:: $B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!(B +* Smileys:: $BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<((B + $B$9$kJ}K!(B +* Toolbar:: $B%/%j%C%/1n(B +* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B Picons * Picon Basics:: picon $B$H$O2?$G!"$I$&$d$C$F$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?$j(B - $BM7$s$@$j$9$kJQ?t(B +* Hard Picons:: $BK\Mh$9$Y$-$3$H!#2?$+$r3X$V$3$H$,$G$-$k$@(B + $B$m$&(B +* Picon Useless Configuration:: $B$=$NB>$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?(B + $B$jM7$s$@$j$9$kJQ?t(B Appendices -* History:: $B$I$&$d$C$F(B gnus $B$,:#F|$N$h$&$K$J$C$?$+(B -* On Writing Manuals:: $B$J$<$3$l$,=i?4ee$N%P!<%8%g%s$N(B Gnus +* Why?:: Gnus $B$NL\E*$O2?(B? +* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k(B + $B$N(B? +* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k(B +* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$Ge$N$b$N(B---Gnus 5.4/5.5 -* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 -* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8/5.9 $B$H$7$F(B - $BCN$i$l$F$$$k$b$N(B +* ding Gnus:: $B:G=i$N?7$7$$(B Gnus $B$G$"$k(B Gnus 5.0/5.1 $B$N(B + $B?7$7$$;v(B +* September Gnus:: $B8x<0$K(B Gnus 5.2/5.3 $B$H$7$FCN$i$l$F$$$k$b(B + $B$N(B +* Red Gnus:: $B;0HVL\$N:G>e$N$b$N(B---Gnus 5.4/5.5 +* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 +* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8 + /5.9 $B$H$7$FCN$i$l$F$$$k$b$N(B Customization -* Slow/Expensive Connection:: $B%m!<%+%k$N(B Emacs $B$rN)$A>e$2$F!"(B - $BB>$N$H$3$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#(B -* Slow Terminal Connection:: $B1s3V(B Emacs $B$re$2$F!"B>$N$H$3(B + $B$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k(B +* Slow Terminal Connection:: $B1s3V(B Emacs $B$rpJs7A<0(B -* Extended Interactive:: $B5-9f@\F,<-$J$I(B -* Emacs/XEmacs Code:: Gnus $B$OA4$F$N6aBe(B Emacsen $B$GF0:n$9$k(B -* Various File Formats:: Gnus $B$N;HMQ$9$k%U%!%$%k$N7A<0(B +* Gnus Utility Functions:: $B;HMQ$G$-$k6&DL$N4X?t$HJQ?t(B +* Backend Interface:: Gnus $B$O$I$&$d$C$F%5!<%P!<$HDL?.$9$k$N$+(B +* Score File Syntax:: $B%9%3%"%U%!%$%k5,3J$N(B BNF $BDj5A(B +* Headers:: Gnus $B$O%X%C%@!<$rFbItE*$K$I$N$h$&$K3JG<(B + $B$9$k$+(B +* Ranges:: $B$?$/$5$s$N?t$r3JG<$9$kJXMx$J7A<0(B +* Group Info:: $B%0%k!<%W>pJs7A<0(B +* Extended Interactive:: $B5-9f@\F,<-$J$I(B +* Emacs/XEmacs Code:: Gnus $B$OA4$F$N6aBe(B Emacsen $B$GF0:n$9$k(B +* Various File Formats:: Gnus $B$N;HMQ$9$k%U%!%$%k$N7A<0(B Backend Interface -* Required Backend Functions:: $BpJs(B -* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B +* Active File Format:: $B;HMQ2DG=$J5-;v%0%k!<%W$N>pJs(B +* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B Emacs for Heathens -* Keystrokes:: $BJ8>O$rF~NO$7$FL?Na$rO$rF~NO$7$FL?Na$rH$7$F$/$@$5$$!#(B @menu -* Finding the News:: $B%K%e!<%9$re$N(B gnus $B$r:nF0$5$;$k$3$H$,$G$-$k(B -* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B -* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B -* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B--@file{.newsrc} -* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B -* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$Ne$N(B gnus $B$r:nF0$5$;$k$3$H$,(B + $B$G$-$k(B +* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B +* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B +* Changing Servers:: $B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7(B + $B$l$J$$(B +* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B -- + @file{.newsrc} +* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B +* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$NpJs$HJQ99$NJ}K!(B -* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B -* Selecting a Group:: $BpJs$rJQ99$9$k(B -* Subscription Commands:: $B9XFI!"9XFICf;_!">C5n(B -* Group Levels:: $B%l%Y%k(B? $B$=$l$C$F2?(B? -* Group Score:: $B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!(B -* Marking Groups:: $B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-$^$9(B -* Foreign Groups:: $B%0%k!<%W$N:n@.$H=$@5(B -* Group Parameters:: $B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l$^$9(B -* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<($G$-$^$9(B -* Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$((B -* Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}(B -* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_$h$&(B -* Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&(B -* Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d$9$k(B -* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B +* Group Buffer Format:: $BI=<($5$l$F$$$k>pJs$HJQ99$NJ}K!(B +* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B +* Selecting a Group:: $BC5n(B +* Group Data:: $B%0%k!<%W$N>pJs$rJQ99$9$k(B +* Group Levels:: $B%l%Y%k(B? $B$=$l$C$F2?(B? +* Group Score:: $B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!(B +* Marking Groups:: $B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-(B + $B$^$9(B +* Foreign Groups:: $B%0%k!<%W$N:n@.$H=$@5(B +* Group Parameters:: $B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l(B + $B$^$9(B +* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<((B + $B$G$-$^$9(B +* Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$((B +* Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}(B +* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_(B + $B$h$&(B +* Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&(B +* Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d(B + $B$9$k(B +* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B @end menu @node Group Buffer Format @section $B%0%k!<%W%P%C%U%!$N7A<0(B @menu -* Group Line Specification:: $B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k(B -* Group Modeline Specification:: $B%0%k!<%W%P%C%U%!$N%b!<%I9T(B -* Group Highlighting:: $B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k(B +* Group Line Specification:: $B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k(B +* Group Modeline Specification:: $B%0%k!<%W%P%C%U%!$N%b!<%I9T(B +* Group Highlighting:: $B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k(B @end menu @node Group Line Specification @@ -2631,6 +2717,8 @@ kiboze $B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"(Bkiboze $B%0%k!<%W$K!V4^$ $B$b$7(B @kbd{a} $B%3%^%s%I$r%a!<%k%0%k!<%W$GA0$H!"(Bkiboze $B%0%k!<%W$K!V4^$ @item default $B=i4|@_Dj$G$NI=<(5-;v$rI=<($7$^$9!#$3$l$ODL>o$OL$FI5-;v$H0uIU$-5-;v$G$9!#(B + +@item $BG[Ns(B +$B=R8l$rK~B-$9$k$h$&$K5-;v$rI=<($7$^$9!#(B + +$B$$$/$D$+Nc$r5s$2$^$9(B: + +@table @code +@item [unread] +$BL$FI$N5-;v$@$1$rI=<($7$^$9!#(B + +@item [not expire] +$B4|8B@Z$l>C5n2DG=$J5-;v0J30$N$9$Y$F$rI=<($7$^$9!#(B + +@item [and (not reply) (not expirable)] +$B4|8B@Z$l>C5n2DG=$H$9$G$KJV?.$7$?5-;v0J30$N$9$Y$F$rI=<($7$^$9!#(B +@end table + +$BMxMQ$G$-$k1i;;;R$O(B @code{not}$B!"(B@code{and} $B$*$h$S(B @code{or} $B$G$9!#=R8l(B +$B$O(B @code{tick}$B!"(B@code{unsend}$B!"(B@code{undownload}$B!"(B@code{unread}$B!"(B +@code{read}$B!"(B@code{dormant}$B!"(B@code{}$B!"(B@code{}$B!"(B@code{}$B!"(B@code{expire}$B!"(B +@code{reply}$B!"(B@code{killed}$B!"(B@code{bookmark}$B!"(B@code{score}$B!"(B@code{save}$B!"(B +@code{cache}$B!"(B@code{forward} $B$*$h$S(B @code{recent} $B$r4^$_$^$9!#(B @end table @item comment @@ -2794,23 +2904,34 @@ form $B$N(B @code{nil} $B$O$=$3$GI>2A$5$l$^$9!#(B $B%9$rDs6!$7$^$9(B)$B!#%H%T%C%/%Q%i%a!<%?$K$D$$$FFI$s$G$_$k$3$H$bLLGr$$$G$7$g(B $B$&(B (@pxref{Topic Parameters})$B!#(B -$B%0%k!<%W%Q%i%a!<%?$O(B @code{gnus-parameters} $B$K@_Dj$9$k$3$H$b$G$-$^$9!#$G(B -$B$b$$$/$D$+$N%Q%i%a!<%?!"Nc$($P(B @code{visible} $B$O8zNO$rH/4x$7$^$;$s!#Nc$G(B -$B$9!#(B +$B%0%k!<%W%Q%i%a!<%?$O(B @code{gnus-parameters} $BJQ?t$r2p:_$7$F@_Dj$9$k$3$H$b(B +$B$G$-$^$9!#$G$b$$$/$D$+$N%Q%i%a!<%?!"Nc$($P(B @code{visible} $B$O8zNO$rH/4x$7(B +$B$^$;$s!#Nc$G$9!#(B @example (setq gnus-parameters - '(("mail\\..*" (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - "%U%R%z%I%(%[%d:%ub%-20,20f%]%) %s\n") - (gcc-self . t) - (display . all)) - ("mail\\.me" (gnus-use-scoring t)) - ("list\\..*" (total-expire . t) - (broken-reply-to . t))) + '(("mail\\..*" + (gnus-show-threads nil) + (gnus-use-scoring nil) + (gnus-summary-line-format + "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n") + (gcc-self . t) + (display . all)) + + ("^nnimap:\\(foo.bar\\)$" + (to-group . "\\1")) + + ("mail\\.me" + (gnus-use-scoring t)) + + ("list\\..*" + (total-expire . t) + (broken-reply-to . t)))) @end example +$BJ8;zNs$NCM$O!"(B@code{to-group} $B$NNc$,<($9$h$&$K!"@55,I=8=$K$h$kCV$-49$($r(B +$B$N%0%k!<%W4XO"(B @menu -* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&$+$rJ9$/(B -* Group Information:: $B%0%k!<%W$H(B gnus $B$K4X$9$k>pJs$H%X%k%W(B -* Group Timestamp:: Gnus $B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k(B -* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B +* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&(B + $B$+$rJ9$/(B +* Group Information:: $B%0%k!<%W$H(B gnus $B$K4X$9$k>pJs$H%X%k%W(B +* Group Timestamp:: Gnus $B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-(B + $BO?$5$;$k(B +* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B @end menu @table @kbd @@ -3909,37 +4033,46 @@ Gnus $B$K!"$"$J$?$,:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k$HJXMx$+$b$7$l(B $B35N,%P%C%U%!$OK>$`$@$1$?$/$5$s3+$$$?>uBV$K$7$F$*$/$3$H$,$G$-$^$9!#(B @menu -* Summary Buffer Format:: $B35N,%P%C%U%!$N304Q$r7hDj$9$k(B -* Summary Maneuvering:: $B35N,%P%C%U%!$rF0$-2s$k(B -* Choosing Articles:: $B5-;v$rFI$`(B -* Paging the Article:: $BFI$s$G$$$k5-;v$r%9%/%m!<%k$9$k(B -* Reply Followup and Post:: $B5-;v$rEj9F$9$k(B -* Marking Articles:: $B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1$k(B -* Limiting:: $B35N,%P%C%U%!$K@)8B$r2C$($k$3$H$,$G$-$k(B -* Threading:: $B%9%l%C%I$,$I$N$h$&$K:n$i$l$k$+(B -* Sorting the Summary Buffer:: $B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k$+(B -* Asynchronous Fetching:: Gnus $B$O5-;v$r@h$KC5n$7$J$/$5$;$k(B -* Article Backlog:: $B4{$KFI$s$@5-;v$r;D$7$F$*$/(B -* Saving Articles:: $B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!(B -* Decoding Articles:: Gnus $B$O0lO"$N(B (uu)encode $B$5$l$?5-;v$r07$($k(B -* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G$-$k(B -@c * MIME Commands:: Doing MIMEy things with the articles. -@c * Charsets:: Character set issues. -* Article Commands:: $B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k(B -* Summary Sorting:: $B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k(B -* Finding the Parent:: $B;R5-;v$K1g=u$,L5$$$C$F(B? $B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N(B -* Exiting the Summary Buffer:: $B%0%k!<%W%P%C%U%!$KLa$k(B -* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l$k$+(B -* Duplicate Suppression:: $B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXC5n$7$J$/$5$;$k(B +* Article Backlog:: $B4{$KFI$s$@5-;v$r;D$7$F$*$/(B +* Saving Articles:: $B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!(B +* Decoding Articles:: Gnus $B$O0lO"$N(B (uu)encode $B$5$l$?5-;v$r07(B + $B$($k(B +* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G(B + $B$-$k(B +@c * MIME Commands:: Doing MIMEy things with the articles. +@c * Charsets:: Character set issues. +* Article Commands:: $B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k(B +* Summary Sorting:: $B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k(B +* Finding the Parent:: $B;R5-;v$K1g=u$,L5$$$C$F(B? $B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N(B +* Exiting the Summary Buffer:: $B%0%k!<%W%P%C%U%!$KLa$k!"(B + $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B +* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l(B + $B$k$+(B +* Duplicate Suppression:: $B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXA0$rI=<($7$J$$J}K!(B -* Summary Buffer Mode Line:: $B%b!<%I9T$N8+$(J}$r7h$a$i$l$k(B -* Summary Highlighting:: $B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k(B +* Summary Buffer Lines:: $B35N,%P%C%U%!$,$I$N$h$&$K8+$($k$Y$-$+$r;X(B + $BDj$G$-$k(B +* To From Newsgroups:: $B<+J,<+?H$NL>A0$rI=<($7$J$$J}K!(B +* Summary Buffer Mode Line:: $B%b!<%I9T$N8+$(J}$r7h$a$i$l$k(B +* Summary Highlighting:: $B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k(B @end menu @findex std11-extract-address-components @@ -3995,12 +4129,13 @@ Gnus $B$OJQ?t(B @code{gnus-extract-address-components} $B$NCM$r(B @code{From $BD%(B (@pxref{Formatting Variables}) $B$r=|$$$F!"IaDL$N(B @code{format} $BJ8;zNs(B $B$HF1$8$h$&$KF0:n$7$^$9!#(B -$B9T$K$O>o$K%3%m%s$,B8:_$7$F$$$J$1$l$P$J$j$^$;$s!#A`:n$7$?8e$K!"%+!<%=%k$O(B -$B$$$D$b%3%m%s$N>l=j$K0\F0$7$^$9!#(B($B$b$A$m$s!"$3$NF0:n$rJQ$($k$3$H$,$G$-$J(B -$B$$$H$7$?$i(B Gnus $B$K$O$"$k$^$8$-$3$H$G$9!#4X?t(B @code{gnus-goto-colon} $B$r!"(B -$B$"$J$?$,9%$-$J%+!<%=%k$NF0$-$K$J$k$h$&$K!"?7$?$K=q$1$PNI$$$N$G$9!#(B) +$B9T$K$O>o$K%3%m%s$+%]%$%s%H0LCV$N%^!<%+!<$,B8:_$7$F$$$J$1$l$P$J$j$^$;$s!#(B +$BA`:n$7$?8e$K!"%+!<%=%k$O$$$D$b%3%m%s$+%]%$%s%H0LCV$N%^!<%+!<$N>l=j$K0\F0(B +$B$7$^$9!#(B($B$b$A$m$s!"$3$NF0:n$rJQ$($k$3$H$,$G$-$J$$$H$7$?$i(B Gnus $B$K$O$"$k(B +$B$^$8$-$3$H$G$9!#4X?t(B @code{gnus-goto-colon} $B$r!"$"$J$?$,9%$-$J%+!<%=%k$N(B +$BF0$-$K$J$k$h$&$K!"?7$?$K=q$1$PNI$$$N$G$9!#(B) -$B=i4|CM$NJ8;zNs$O(B @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n} $B$G$9!#(B +$B=i4|CM$NJ8;zNs$O(B @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n} $B$G$9!#(B $B0J2<$NMM<0;X<(J8;z$r;H$&$3$H$,$G$-$^$9(B: @@ -4171,7 +4306,7 @@ gnus $B$K!"(B@code{gnus-summary-line-format} $BJQ?t$N(B @code{%n} $B;EMM(B '(To Newsgroups)) (setq nnmail-extra-headers gnus-extra-headers) (setq gnus-summary-line-format - "%U%R%z%I%(%[%4L: %-20,20f%]%) %s\n") + "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n") (setq gnus-ignored-from-addresses "Your Name Here") @end lisp @@ -4352,8 +4487,8 @@ Gnus $B$,H$7$F2<$5$$!#(B @section $BJVEz!"%U%)%m!<%"%C%W!"Ej9F(B @menu -* Summary Mail Commands:: $B%a!<%k$rAw$k(B -* Summary Post Commands:: $B%K%e!<%9$rAw$k(B -* Summary Message Commands:: $BB>$N%a%C%;!<%84XO"$NL?Na(B -* Canceling and Superseding:: $B!X$"$!!"$"$s$J$U$&$K8@$&$s$8$c$J$+$C$?!Y(B +* Summary Mail Commands:: $B%a!<%k$rAw$k(B +* Summary Post Commands:: $B%K%e!<%9$rAw$k(B +* Summary Message Commands:: $BB>$N%a%C%;!<%84XO"$NL?Na(B +* Canceling and Superseding:: @end menu @node Summary Mail Commands @@ -4847,6 +4982,104 @@ Gnus $B$O!"C$9$H$-$K!X8=:_!Y$NA*BrJ}K!$r;H$$$^$9!#I8=`$NEj9FJ}K!$r;H(B $B$A$g$C$H3P$($F$*$$$F$/$@$5$$(B: 'supersede' ($BBeBX(B) $B$H$$$&8l$NCf$K(B 'c' $B$OL5(B $B$$$H$$$&$3$H$r!#(B +@c TRANSLATEME +@node Delayed Articles +@section Delayed Articles +@cindex delayed sending +@cindex send delayed + +Sometimes, you might wish to delay the sending of a message. For +example, you might wish to arrange for a message to turn up just in time +to remind your about the birthday of your Significant Other. For this, +there is the @code{gnus-delay} package. Setup is simple: + +@lisp +(gnus-delay-initialize) +@end lisp + +@findex gnus-delay-article +Normally, to send a message you use the @kbd{C-c C-c} command from +Message mode. To delay a message, use @kbd{C-c C-j} +(@code{gnus-delay-article}) instead. This will ask you for how long the +message should be delayed. Possible answers are: + +@itemize +@item +A time span. Consists of an integer and a letter. For example, +@code{42d} means to delay for 42 days. Available letters are @code{m} +(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M} +(months) and @code{Y} (years). + +@item +A specific date. Looks like @code{YYYYY-MM-DD}. The message will be +delayed until that day, at a specific time (eight o'clock by default). +See also @code{gnus-delay-default-hour}. + +@item +A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm +stuff. The deadline will be at that time today, except if that time has +already passed, then it's at the given time tomorrow. So if it's ten +o'clock in the morning and you specify @code{11:15}, then the deadline +is one hour and fifteen minutes hence. But if you specify @code{9:20}, +that means a time tomorrow. +@end itemize + +The action of the @code{gnus-delay-article} command is influenced by a +couple of variables: + +@table @code +@item gnus-delay-default-hour +@vindex gnus-delay-default-hour +When you specify a specific date, the message will be due on that hour +on the given date. Possible values are integers 0 through 23. + +@item gnus-delay-default-delay +@vindex gnus-delay-default-delay +This is a string and gives the default delay. It can be of any of the +formats described above. + +@item gnus-delay-group +@vindex gnus-delay-group +Delayed articles will be kept in this group on the drafts server until +they are due. You probably don't need to change this. The default +value is @code{"delayed"}. + +@item gnus-delay-header +@vindex gnus-delay-header +The deadline for each article will be stored in a header. This variable +is a string and gives the header name. You probably don't need to +change this. The default value is @code{"X-Gnus-Delayed"}. +@end table + +The way delaying works is like this: when you use the +@code{gnus-delay-article} command, you give a certain delay. Gnus +calculates the deadline of the message and stores it in the +@code{X-Gnus-Delayed} header and puts the message in the +@code{nndraft:delayed} group. + +And whenever you get new news, Gnus looks through the group for articles +which are due and sends them. It uses the @code{gnus-delay-send-drafts} +function for this. By default, this function is added to the hook +@code{gnus-get-new-news-hook}. But of course, you can change this. +Maybe you want to use the demon to send drafts? Just tell the demon to +execute the @code{gnus-delay-send-drafts} function. + +@table @code +@item gnus-delay-initialize +@findex gnus-delay-initialize +By default, this function installs the @kbd{C-c C-j} key binding in +Message mode and @code{gnus-delay-send-drafts} in +@code{gnus-get-new-news-hook}. But it accepts two optional arguments, +@code{no-keymap} and @code{no-check}. If @code{no-keymap} is non-nil, +the @kbd{C-c C-j} binding is not intalled. If @code{no-check} is +non-nil, @code{gnus-get-new-news-hook} is not changed. + +For example, @code{(gnus-delay-initialize nil t)} means to change the +keymap but not to change @code{gnus-get-new-news-hook}. Presumably, you +want to use the demon for sending due delayed articles. Just don't +forget to set that up :-) +@end table + @node Marking Articles @section $B5-;v$K0u$rIU$1$k(B @cindex article marking @@ -4862,9 +5095,9 @@ Gnus $B$O!"C$9$H$-$K!X8=:_!Y$NA*BrJ}K!$r;H$$$^$9!#I8=`$NEj9FJ}K!$r;H(B $B2C$($F!"9XFIEY$K1F6A$7$J$$0u$b$"$j$^$9!#(B @menu -* Unread Articles:: $BL$FI5-;v$X$N0u(B -* Read Articles:: $B4{FI5-;v$X$N0u(B -* Other Marks:: $B9XFIEY$K1F6A$7$J$$0u(B +* Unread Articles:: $BL$FI5-;v$X$N0u(B +* Read Articles:: $B4{FI5-;v$X$N0u(B +* Other Marks:: $B9XFIEY$K1F6A$7$J$$0u(B @end menu @ifinfo @@ -4872,9 +5105,9 @@ Gnus $B$O!"C$9$H$-$K!X8=:_!Y$NA*BrJ}K!$r;H$$$^$9!#I8=`$NEj9FJ}K!$r;H(B @end ifinfo @menu -* Setting Marks:: $B0u$NIU$1J}$H>C$7J}(B -* Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B -* Setting Process Marks:: $B8e$NC$7J}(B +* Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B +* Setting Process Marks:: $B8e$NC5n$7$^$;$s(B) $B$N$G!"1J1s$K5-;v$rJ]B8$7$F$* $B$K(B @samp{A} $B$N0u$,$D$-$^$9(B (@code{gnus-replied-mark})$B!#(B @vindex gnus-forwarded-mark -$BE>Aw$7$?5-;v$O$9$Y$FFs7eL\$K(B @samp{O} $B$N0u$,$D$-$^(B +$BE>Aw$7$?5-;v$O$9$Y$FFs7eL\$K(B @samp{F} $B$N0u$,$D$-$^(B $B$9(B (@code{gnus-forwarded-mark})$B!#(B @vindex gnus-recent-mark @@ -5028,6 +5261,11 @@ gnus $B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s(B) $B$N$G!"1J1s$K5-;v$rJ]B8$7$F$* $B5-;v$OFs7eL\$K(B @samp{S} $B$N0u$,$D$-$^$9(B (@code{gnus-saved-mark})$B!#(B @item +@vindex gnus-unseen-mark +$B$^$@FI$^$l$?$3$H$,$J$$5-;v$OFs7eL\$K(B @samp{.} $B$N0u$,$D$-$^(B +$B$9(B (@code{gnus-unseen-mark})$B!#(B + +@item @vindex gnus-not-empty-thread-mark @vindex gnus-empty-thread-mark $B$b$7(B @samp{%e} $B$N;EMM$,;H$o$l$k$H!"%9%l%C%I$,$"$k$+$I$&$+$O!";07eL\(B @@ -5504,8 +5742,8 @@ Gnus $B$O=i4|@_Dj$G5-;v$r%9%l%C%I$K$7$^$9!#(B@dfn{$B%9%l%C%I$K$9$k(B} $B$H$ @end table @menu -* Customizing Threading:: $BJQ992DG=$J%9%l%C%I$K1F6A$9$kJQ?t(B -* Thread Commands:: $B35N,%P%C%U%!$G$N%9%l%C%I$K4p$E$$$?L?Na(B +* Customizing Threading:: $BJQ992DG=$J%9%l%C%I$K1F6A$9$kJQ?t(B +* Thread Commands:: $B35N,%P%C%U%!$G$N%9%l%C%I$K4p$E$$$?L?Na(B @end menu @node Customizing Threading @@ -5513,11 +5751,12 @@ Gnus $B$O=i4|@_Dj$G5-;v$r%9%l%C%I$K$7$^$9!#(B@dfn{$B%9%l%C%I$K$9$k(B} $B$H$ @cindex customizing threading @menu -* Loose Threads:: Gnus $B$,L5B+G{%9%l%C%I$r=8$a$FBg$-$J%9%l%C%I$K$9$kJ}K!(B -* Filling In Threads:: $B%9%l%C%I$rKd$a$k(B -* More Threading:: $B%9%l%C%I$r$$$8$/$k$5$i$KB?$/$NJQ?t(B -* Low-Level Threading:: $B$3$l$G=*$o$C$?$H;W$C$?$G$7$g$&(B... $B$G$b$"$J$?$O4V(B - $B0c$C$F$$$?(B! +* Loose Threads:: Gnus $B$,L5B+G{%9%l%C%I$r=8$a$FBg$-$J%9%l%C(B + $B%I$K$9$kJ}K!(B +* Filling In Threads:: $B%9%l%C%I$rKd$a$k(B +* More Threading:: $B%9%l%C%I$r$$$8$/$k$5$i$KB?$/$NJQ?t(B +* Low-Level Threading:: $B$3$l$G=*$o$C$?$H;W$C$?$G$7$g$&(B... $B$G$b$"(B + $B$J$?$O4V0c$C$F$$$?(B! @end menu @node Loose Threads @@ -6524,12 +6763,12 @@ gnus $B$,J]B8$9$k5-;v$N(B @code{Archive-name} $B9T$rD4$Y$F!"$=$l$r%U%!%$%kL>$ $B$^$9!#(BGnus $B$O$"$J$?$N$?$a$K$=$l$i$rI|9f2=$9$k;v$,$G$-$^$9!#(B @menu -* Uuencoded Articles:: $B5-;v$r(B uuencode $B$9$k(B -* Shell Archives:: shar $B5-;v$r2rE`$9$k(B -* PostScript Files:: $B%]%9%H%9%/%j%W%H$rJ,3d$9$k(B -* Other Files:: $BIaDL$NJ]B8$H(B binhex. -* Decoding Variables:: $B9,$;$JI|9f2=$N$?$a$NJQ?t(B -* Viewing Files:: $BI|9f2=$N7k2L$r8+$?$$(B? +* Uuencoded Articles:: $B5-;v$r(B uuencode $B$9$k(B +* Shell Archives:: shar $B5-;v$r2rE`$9$k(B +* PostScript Files:: $B%]%9%H%9%/%j%W%H$rJ,3d$9$k(B +* Other Files:: $BIaDL$NJ]B8$H(B binhex. +* Decoding Variables:: $B9,$;$JI|9f2=$N$?$a$NJQ?t(B +* Viewing Files:: $BI|9f2=$N7k2L$r8+$?$$(B? @end menu @cindex series @@ -6683,9 +6922,10 @@ Gnus $B$O0J2<$N4JC1$J5,B'$KB'$C$F$I$N5-;v$,72$KB0$9$k$N$+$r?dB,$7$^$9(B: $BI= $B7AMF;l$G$9!#F0;l$G$O$"$j$^$;$s!#(B @menu -* Rule Variables:: $B%U%!%$%k$,$I$N$h$&$KI=<($5$l$k$+$r7h$a$kJQ?t(B -* Other Decode Variables:: $BB>$NI|9f2=$NJQ?t(B -* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B +* Rule Variables:: $B%U%!%$%k$,$I$N$h$&$KI=<($5$l$k$+$r7h$a$k(B + $BJQ?t(B +* Other Decode Variables:: $BB>$NI|9f2=$NJQ?t(B +* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B @end menu @node Rule Variables @@ -6910,14 +7150,17 @@ Gnus $B$O%U%!%$%k$r1\Mw$9$k$N$r7hDj$9$k$N$K(B@dfn{$B5,B'JQ?t(B}$B$rMQ$$$^$9 $B$9$/$9$k$?$a$N4X?t$HJQ?t$,;3$N$h$&$K$"$j$^$9!#(B @menu -* Article Highlighting:: $B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?$$(B -* Article Fontisizing:: $B6/D4$5$l$?J8$rAGE($K$9$k(B -* Article Hiding:: $BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&(B -* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?4X?t(B -* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C%/$9$k(B -* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! -* Article Signature:: $B=pL>$C$F2?(B? -* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B +* Article Highlighting:: $B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?(B + $B$$(B +* Article Fontisizing:: $B6/D4$5$l$?J8$rAGE($K$9$k(B +* Article Hiding:: $BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&(B +* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?(B + $B4X?t(B +* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C(B + $B%/$9$k(B +* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! +* Article Signature:: $B=pL>$C$F2?(B? +* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B @end menu @node Article Highlighting @@ -7899,8 +8142,8 @@ gnus $B$G%a!<%k$rFI$`$3$H$NM-Mx$JE@$O!"C1=c$J%P%0$rAG@2$i$7$$IT>rM}$KCV$-(B $B>/$7$NA*Br;h$rM?$($F$"$j$^$9!#(B @menu -* Pick and Read:: $B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B -* Binary Groups:: $B$9$Y$F$N5-;v$r<+F0(B-$BI|9f2=$9$k(B +* Pick and Read:: $B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B +* Binary Groups:: $B$9$Y$F$N5-;v$r<+F0(B-$BI|9f2=$9$k(B @end menu @node Pick and Read @@ -8278,10 +8521,10 @@ Line Formatting})$B!#%G%#%U%)%k%H$O(B @samp{Gnus: %%b %S %Z} $B$G$9!#;HMQ2DG= @section $B$$$m$$$m$J35N,$NJ*7o(B @menu -* Summary Group Information:: $B>pJs;X8~$NL?Na(B -* Searching for Articles:: $BJ#?t5-;vL?Na(B -* Summary Generation Commands:: $B35N,%P%C%U%!$N(B ($B:F(B) $B:n@.(B -* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B +* Summary Group Information:: $B>pJs;X8~$NL?Na(B +* Searching for Articles:: $BJ#?t5-;vL?Na(B +* Summary Generation Commands:: +* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B @end menu @table @code @@ -8800,11 +9043,11 @@ List-Archive $B%U%#!<%k%I$,$"$C$?$i!"%a!<%j%s%0%j%9%H$N%"!<%+%$%V$r1\Mw$7(B $B$O(B (gnus $B$K6&M-$7$J$$$h$&$K;X<($7$J$$8B$j(B) $BF1$85-;v%P%C%U%!$r6&M-$7$^$9!#(B @menu -* Hiding Headers:: $B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k(B -* Using MIME:: @sc{mime} $B5-;v$H$7$F8+$;$k(B -* Customizing Articles:: $B5-;v$N8+1I$($r;EN)$F$k(B -* Article Keymap:: $B5-;v%P%C%U%!$G;H$($k%-!(B +* Hiding Headers:: $B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k(B +* Using MIME:: @sc{mime} $B5-;v$H$7$F8+$;$k(B +* Customizing Articles:: $B5-;v$N8+1I$($r;EN)$F$k(B +* Article Keymap:: $B5-;v%P%C%U%!$G;H$($k%-!(B @end menu @node Hiding Headers @@ -9229,14 +9472,17 @@ GNUS $B$d(B Gnus $B$G$O!"$3$N$?$A$N0-$$LdBj$G6C$+$5$l$J$$$h$&$K$9$k$K$O!"35N, $B4p$E$$$FAw?.$5$l$^$9(B (@pxref{Posting Server})$B!#(B @menu -* Mail:: $B%a!<%k$HJVEz(B -* Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+(B? -* Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k(B -* Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3$m(B -* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}K!(B -* Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8(B -* Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K2?$,5/$3$k(B? -@c * Using GPG:: How to use GPG and MML to sign and encrypt messages +* Mail:: $B%a!<%k$HJVEz(B +* Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+(B? +* Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k(B +* Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3(B + $B$m(B +* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}(B + $BK!(B +* Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8(B +* Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K(B + $B2?$,5/$3$k(B? +@c * Using GPG:: How to use GPG and MML to sign and encrypt messages @end menu $BEj9F$9$k$Y$-$G$J$+$C$?5-;v$r:o=|$9$k$?$a$N>pJs$O(B @pxref{Canceling and @@ -9756,13 +10002,15 @@ you've typed it correctly. $B$b$A$m$s!"0c$C$?J}K!$OA4$F$=$lFCM-$N$b$N$,$"$j$^$9!#(B @menu -* Server Buffer:: $B;ve$N%5!<%P!<$r:n$C$FJT=8$9$k(B -* Getting News:: USENET $B%K%e!<%9$r(B gnus $B$GFI$`(B -* Getting Mail:: $B8D?ME*$J%a!<%k$r(B gnus $B$GFI$`(B -* Browsing the Web:: $B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$re$N%5!<%P!<$r:n$C$FJT=8$9$k(B +* Getting News:: USENET $B%K%e!<%9$r(B gnus $B$GFI$`(B +* Getting Mail:: $B8D?ME*$J%a!<%k$r(B gnus $B$GFI$`(B +* Browsing the Web:: $B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B -* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn$A(B - $B$F$$$k$+$b$7$l$J$$(B +* Server Buffer Format:: $B$3$N%P%C%U%!$N308+$r%+%9%?%^%$%:$G$-$k(B +* Server Commands:: $B%5!<%P!<$rA`$kL?Na(B +* Example Methods:: $B%5!<%P!<;XDj$NNc(B +* Creating a Virtual Server:: $B%;%C%7%g%s$NNc(B +* Server Variables:: $B$I$NJQ?t$r@_Dj$9$k$+(B +* Servers and Methods:: $B%5!<%P!$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B +* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn(B + $B$A$F$$$k$+$b$7$l$J$$(B @end menu @vindex gnus-server-mode-hook @@ -10132,8 +10380,8 @@ Gnus $B$,$I$l$+$N%5!<%P!<$+$i@\B35qH]$rC5n$7$^(B $B%m!<%+%k%9%W!<%k$+$iFI$`;v$,$G$-$^$9!#(B @menu -* NNTP:: @sc{nntp} $B%5!<%P!<$+$i%K%e!<%9$rFI$`(B -* News Spool:: $B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`(B +* NNTP:: @sc{nntp} $B%5!<%P!<$+$i%K%e!<%9$rFI$`(B +* News Spool:: $B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`(B @end menu @node NNTP @@ -10397,9 +10645,9 @@ LIST $B%3%^%s%I$N%*%W%7%g%s$K;H$C$F!"(B($B%5!<%P!<$N(B) $B%j%9%H=PNO$r@_Dj$ @end table @menu -* Direct Functions:: $B%5!<%P!<$KD>@\@\B3$9$k(B -* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B -* Common Variables:: $B@\B3$N$?$a$N4X?t$,;2>H$9$kJQ?t(B +* Direct Functions:: $B%5!<%P!<$KD>@\@\B3$9$k(B +* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B +* Common Variables:: $B$$$/$D$+$N@\B3MQ$N4X?t$,;2>H$9$kJQ?t(B @end menu @node Direct Functions @@ -10648,23 +10896,23 @@ Emacs $B$N%;%C%7%g%sA4BN$r%i%C%W$7$F!"%G%#%U%)%k%H$N%a%=%C%I$r;H$&$H$$$&$N(B $B$+(B? $B$$$d!"$b$A$m$s$G$-$^$9!#(B @menu -* Mail in a Newsreader:: $B%K%e!<%9%j!<%@$G%a!<%k(B ($BBg;v$JA0CV$-(B) -* Getting Started Reading Mail:: $B4JC1$JNAM}K\$N$h$&$JNc(B -* Splitting Mail:: $B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+(B -* Mail Sources:: Gnus $B$K$I$3$+$i%a!<%k$r$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B - $B%s%I$r;H$&(B -* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B +* Mail in a Newsreader:: $B%K%e!<%9%j!<%@$G%a!<%k(B ($BBg;v$JA0CV$-(B) +* Getting Started Reading Mail:: $B4JC1$JNAM}K\$N$h$&$JNc(B +* Splitting Mail:: $B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+(B +* Mail Sources:: Gnus $B$K$I$3$+$i%a!<%k$r$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B + $B%s%I$r;H$&(B +* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B @end menu @node Mail in a Newsreader @@ -10738,8 +10986,7 @@ Gnus $B$r;H$C$F?7$7$$%a!<%k$rFI$`;v$OHs>o$K4JC1$G$9!#$"$J$?$N%a!<%k%P%C%/(B $B$$$?$$$J$i!"$C$F40A4$K9gCW$7$J$1$l$P$J$j$^$;$s!#@55,I=8=$G%U%#!<%k%IL>$+(B $B$H$-$K$3$N4X?t$r;H$&$H!"$3$NLLE]$J:n6H$r(B 1 $B%9%l%C%I$K$D$-(B 1 $B2s$-$j$G:Q$^(B $B$9$3$H$,$G$-$^$9!#(B -$B$3$N5!G=$rMxMQ$9$k$?$a$K$O!"$^$:JQ?t(B @code{nnmail-treat-duplicates} $B$NCM(B +$B$3$N5!G=$rMxMQ$9$k$?$a$K$O!"$^$:JQ(B +$B?t(B @code{nnmail-treat-duplicates} $B$H(B @code{nnmail-cache-accepted-message-ids} $B$NCM(B $B$rHs(B nil $B$K@_Dj$9$kI,MW$,$"$j$^$9(B ($B4{DjCM$N$^$^$J$iLdBj$"$j$^$;$s(B)$B!#$=$l(B $B$,$G$-$?$i(B @code{nnmail-split-fancy-with-parent} $B$r;H$C$F$_$F$/$@$5$$!#(B $B%3%m%s$r;H$C$F$3$s$JIw$K=q$-$^$9(B: @@ -12095,12 +12343,14 @@ Gnus $B$O%a!<%k%0%k!<%W$rF0:n$9$k$h$&$K$9$k$H%a!<%k%9%W!<%k$rFI$_9~$_$^$9!#(B $B$O:GB.$G=@Fp$@$+$i(B) @code{nnml} $B$G$9(B (@pxref{Mail Spool})$B!#(B @menu -* Unix Mail Box:: ($B$H$F$b(B) $BI8=`E*$J(B Un*x mbox $B$r;H$&(B -* Rmail Babyl:: Emacs $B$N%W%m%0%i%`$O(B rmail $B$N(B babyl format $B$r;H$&(B -* Mail Spool:: $B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k(B? -* MH Spool:: mhspool $B$N$h$&$J%P%C%/%(%s%I(B -* Mail Folders:: $B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k$r;}$D(B -* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B +* Unix Mail Box:: ($B$H$F$b(B) $BI8=`E*$J(B Un*x mbox $B$r;H$&(B +* Rmail Babyl:: Emacs $B$N%W%m%0%i%`$O(B rmail $B$N(B babyl $B%U%)!<(B + $B%^%C%H$r;H$&(B +* Mail Spool:: $B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k(B? +* MH Spool:: mhspool $B$N$h$&$J%P%C%/%(%s%I(B +* Mail Folders:: $B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k(B + $B$r;}$D(B +* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B @end menu @node Unix Mail Box @@ -12477,13 +12727,13 @@ Gnus $B$O$3$l$i$N%=!<%9$X$N3&LL$rDs6!$9$k%P%C%/%(%s%I72$r>/$7Hw$($D$D$"$j(B $B$^$9!#(B @menu -* Web Searches:: $BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k(B -* Slashdot:: Slashdot $B$N%3%a%s%H$rFI$`(B -* Ultimate:: Ultimate Bulletin Board $B%7%9%F%`(B -* Web Archive:: $B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`(B -* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B -* RSS:: RDF Site Summary $B$rFI$`(B -* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B +* Web Searches:: $BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k(B +* Slashdot:: Slashdot $B$N%3%a%s%H$rFI$`(B +* Ultimate:: Ultimate Bulletin Board $B%7%9%F%`(B +* Web Archive:: $B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`(B +* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B +* RSS:: RDF Site Summary $B$rFI$`(B +* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B @end menu @samp{Web Newspaper} $B$r=|$/$9$Y$F$N%&%'%V%=!<%9$O!"F0:n$5$;$k$?$a(B @@ -13075,13 +13325,14 @@ Gnus $B$O$?$@C1$K%K%e!<%9$d%a!<%k$rFI$`0J>e$N$3$H$,$G$-$^$9!#0J2<(B $B$9!#(B @menu -* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$KFI$`(B -* Anything Groups:: Dired? $BC/$,(B dired $B$J$s$F;H$&$N(B? -* Document Groups:: $B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG(B -* SOUP:: @sc{soup} $B%Q%1%C%H$r(B ``$B%*%U%i%$%s(B''$B$GFI$`(B -* Mail-To-News Gateways:: $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7$F5-;v(B - $B$rEj9F$9$k(B -* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B +* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$K(B + $BFI$`(B +* Anything Groups:: Dired? $BC/$,(B dired $B$J$s$F;H$&$N(B? +* Document Groups:: $B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG(B +* SOUP:: @sc{soup} $B%Q%1%C%H$r(B ``$B%*%U%i%$%s(B'' $B$GFI$`(B +* Mail-To-News Gateways:: $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7(B + $B$F5-;v$rEj9F$9$k(B +* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B @end menu @node Directory Groups @@ -13265,7 +13516,7 @@ MIME $BB>ItJ,%a%C%;!<%8(B (multipart) $B$G$9!#(B @end table @menu -* Document Server Internals:: $B$"$J$?FH<+$NJ8=q$NMxMQ$NMxMQC$9J}K!(B -* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B -* Outgoing Messages:: $BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? -* Agent Variables:: $B%+%9%?%^%$%:$O3Z$7(B -* Example Setup:: $B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $B$NNc(B -* Batching Agents:: @code{cron} $B%8%g%V$K$h$k%K%e!<%9C$9J}K!(B +* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B +* Outgoing Messages:: $BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? +* Agent Variables:: $B%+%9%?%^%$%:$O3Z$7(B +* Example Setup:: $B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $B$NNc(B +* Batching Agents:: @code{cron} $B%8%g%V$K$h$k%K%e!<%9uBV$r@Z$jBX$($^$9!#(B @menu -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: +* Group Agent Commands:: +* Summary Agent Commands:: +* Server Agent Commands:: @end menu $B40A4$J0l3g.$5$/$9$k$?$a$K!"@E$+$K:o=|$5$l$^$9!#(B @menu -* Summary Score Commands:: $B8=:_$N%0%k!<%W$N$?$a$N%9%3%"EPO?$rDI2C$9$k(B -* Group Score Commands:: $B0lHLE*$J%9%3%"L?Na(B -* Score Variables:: $B$"$J$?$N%9%3%"$r%+%9%?%^%$%:$9$k(B - ($B$^$!!"$J$s$FMQ8l$G$7$g$&(B)$B!#(B -* Score File Format:: $B%9%3%"%U%!%$%k$K2?$rF~$l$k$+(B -* Score File Editing:: $BC5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B -* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B -* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B -* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"$k(B +* Summary Score Commands:: $B8=:_$N%0%k!<%W$N$?$a$N%9%3%"EPO?$rDI2C$9(B + $B$k(B +* Group Score Commands:: $B0lHLE*$J%9%3%"L?Na(B +* Score Variables:: $B$"$J$?$N%9%3%"$r%+%9%?%^%$%:$9$k(B + ($B$^$!!"$J$s$FMQ8l$G$7$g$&(B) +* Score File Format:: $B%9%3%"%U%!%$%k$K2?$rF~$l$k$+(B +* Score File Editing:: $BC5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B +* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B +* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B +* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"(B + $B$k(B @end menu @node Summary Score Commands @@ -16303,6 +16571,39 @@ Gnus $B$O8=:_$N%P%C%U%!!<$+$i(B @code{Message-ID} $B%X%C%@!<$r8+$D$1=P$9$?$a$ ``$B$"$J$?$N(B'' $B$,:G=i$NFsJ8;z$K$J$k$+:G=i$N;0J8;z$K$J$k$+$O%7%9%F%`$K0MB8(B $B$7$^$9!#(B +@c TRANSLATEME +@node Scoring On Other Headers +@section Scoring On Other Headers +@cindex scoring on other headers + +Gnus is quite fast when scoring the ``traditional'' +headers---@samp{From}, @samp{Subject} and so on. However, scoring +other headers requires writing a @code{head} scoring rule, which means +that Gnus has to request every single article from the backend to find +matches. This takes a long time in big groups. + +Now, there's not much you can do about this for news groups, but for +mail groups, you have greater control. In the @pxref{To From +Newsgroups} section of the manual, it's explained in greater detail what +this mechanism does, but here's a cookbook example for @code{nnml} on +how to allow scoring on the @samp{To} and @samp{Cc} headers. + +Put the following in your @file{.gnus.el} file. + +@lisp +(setq gnus-extra-headers '(To Cc Newsgroups Keywords) + nnmail-extra-headers gnus-extra-headers) +@end lisp + +Restart Gnus and rebuild your @code{nnml} overview files with the +@kbd{M-x nnml-generate-nov-databases} command. This will take a long +time if you have much mail. + +Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like +so: @kbd{I e s p To RET RET}. + +See? Simple. + @node Scoring Tips @section $B%9%3%"IU$1$N1|5A(B @cindex scoring tips @@ -16579,12 +16880,13 @@ GoupLens $B$O!"KhF|:n@.$5$l$kB?$/$NNL$N%K%e!<%95-;v$+$i$N(B $B$O$3$NM=8@$r5-;v$rFI$_$?$$$+$I$&$+$r7hDj$9$k$N$KLrN)$F$k;v$,$G$-$^$9!#(B @menu -* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k$h$&$K(B - $B$9$k$+!#(B -* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k$+$rCN(B - $B$i$;$k!#(B -* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9$k(B -* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B +* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k(B + $B$h$&$K$9$k$+(B +* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k(B + $B$+$rCN$i$;$k(B +* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9(B + $B$k(B +* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B @end menu @node Using GroupLens @@ -16721,7 +17023,7 @@ grouplens $B$GM=8@$rI=<($9$k$?$a$K;0$D$NJ}K!$,$"$j$^$9!#(BGroupLens $B$N%9%3% @item gnus-summary-grouplens-line-format GropuLens $B3HD%$N35N,%P%C%U%!$G;H$o$l$k35N,9TMM<0$G$9!#IaDL$N35N,9TMM<0$,(B $Be$2$k$+(B -* Mode Lines:: $B%b!<%I9T$K>pJs$rI=<($9$k(B -* Highlighting and Menus:: $B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k(B -* Buttons:: $B4JC1$J==Jb$G%"%-%l%9g'$rF@$k(B -* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!(B -* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k(B -* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+(B -* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_$9$k(B -* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?(B? -* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!(B -* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N(B +* Process/Prefix:: $BB?$/$N07$$L?Na$G;H$o$l$k=,47(B +* Interactive:: Gnus $B$KB?$/$Ne$2$k$+(B +* Mode Lines:: $B%b!<%I9T$K>pJs$rI=<($9$k(B +* Highlighting and Menus:: $B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k(B +* Buttons:: $B4JC1$J==Jb$G%"%-%l%9g'$rF@$k(B +* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!(B +* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k(B +* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+(B +* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_(B + $B$9$k(B +* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?(B? +* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!(B +* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N(B @end menu @node Process/Prefix @@ -17102,11 +17407,16 @@ Gnus $B$r=*N;$9$kA0$K3NG'$rMW5a$7$^$9!#$3$NJQ?t$O=i4|@_Dj$G(B @code{t} $B$G$9 $B9f$,$I$3$K$G$b$"$j$^$9!#(B @menu -* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"$k(B -* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N5,B'(B -* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k(B -* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k(B -* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k(B +* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"(B + $B$k(B +* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N(B + $B5,B'(B +* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k(B +* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k(B +* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k(B +* Positioning Point:: $BA`:n$N8e$G%]%$%s%H$r0\F0$9$k(B +* Tabulation:: $BI=$r:n$k(B +* Wide Characters:: $BI}$,9-$$J8;z$r07$&(B @end menu $B8=:_$N$H$3$m!"(Bgnus $B$O0J2<$N=qK!;EMMJQ?t$r;H$$$^$9(B: @@ -17289,6 +17599,60 @@ Emacs $B$,(B @samp{%b} $B$r$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"(Bgnus $B$O$3$l$rMxMQ$ $B$k$3$H$K$7$^$9!#(B @menu -* Picons:: $B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!(B -* Smileys:: $BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<($9$kJ}K!(B -* Toolbar:: $B%/%j%C%/1n(B -* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B +* Picons:: $B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!(B +* Smileys:: $BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<((B + $B$9$kJ}K!(B +* Toolbar:: $B%/%j%C%/1n(B +* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B @end menu @node Picons @@ -18108,11 +18473,13 @@ XEmacs $B$O3($d$=$NB>$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"(Bgnus $B$O$3$l$rMxMQ$ @menu * Picon Basics:: picon $B$H$O2?$G!"$I$&$d$C$F$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?$j(B - $BM7$s$@$j$9$kJQ?t(B +* Hard Picons:: $BK\Mh$9$Y$-$3$H!#2?$+$r3X$V$3$H$,$G$-$k$@(B + $B$m$&(B +* Picon Useless Configuration:: $B$=$NB>$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?(B + $B$jM7$s$@$j$9$kJQ?t(B @end menu @node Picon Basics @@ -18753,14 +19120,15 @@ but at the common table.@* @chapter $BIUO?(B @menu -* History:: $B$I$&$d$C$F(B gnus $B$,:#F|$N$h$&$K$J$C$?$+(B -* On Writing Manuals:: $B$J$<$3$l$,=i?4ee$N%P!<%8%g%s$N(B Gnus +* Why?:: Gnus $B$NL\E*$O2?(B? +* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k(B + $B$N(B? +* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k(B +* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$Ge$N$b$N(B---Gnus 5.4/5.5 -* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 -* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8/5.9 $B$H$7$F(B - $BCN$i$l$F$$$k$b$N(B +* ding Gnus:: $B:G=i$N?7$7$$(B Gnus $B$G$"$k(B Gnus 5.0/5.1 $B$N(B + $B?7$7$$;v(B +* September Gnus:: $B8x<0$K(B Gnus 5.2/5.3 $B$H$7$FCN$i$l$F$$$k$b(B + $B$N(B +* Red Gnus:: $B;0HVL\$N:G>e$N$b$N(B---Gnus 5.4/5.5 +* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 +* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8 + /5.9 $B$H$7$FCN$i$l$F$$$k$b$N(B @end menu $B$3$N%j%9%H$O!"$b$A$m$s!"(B@emph{$B$?$$$F$$$N(B} $B=EMW$J?7$7$$5!G=$K4X$9(B @@ -20093,7 +20466,7 @@ nnweb $B$O:F$S2~:n$5$l!">o$KJQ2=$9$k9=@.$rB3$1$^$9!#(B @iftex @page -@node The Manual +@node History @section $B%^%K%e%"%k(B @cindex colophon @cindex manual @@ -20359,11 +20732,11 @@ Gnus $B$,%0%k!<%W$KF~$k$H!"%0%k!<%W$NA4$F$NL$FI5-;v$N%X%C%@!<$r%P%C%/%(%s(B $BAm9gE,;X<(@h$rM?$($k$?$a$K9M0F$5$l$F$$$^$9!#(B @menu -* Slow/Expensive Connection:: $B%m!<%+%k$N(B Emacs $B$rN)$A>e$2$F!"(B - $BB>$N$H$3$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#(B -* Slow Terminal Connection:: $B1s3V(B Emacs $B$re$2$F!"B>$N$H$3(B + $B$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#(B +* Slow Terminal Connection:: $B1s3V(B Emacs $B$rpJs7A<0(B -* Extended Interactive:: $B5-9f@\F,<-$J$I(B -* Emacs/XEmacs Code:: Gnus $B$OA4$F$N6aBe(B Emacsen $B$GF0:n$9$k(B -* Various File Formats:: Gnus $B$N;HMQ$9$k%U%!%$%k$N7A<0(B +* Gnus Utility Functions:: $B;HMQ$G$-$k6&DL$N4X?t$HJQ?t(B +* Backend Interface:: Gnus $B$O$I$&$d$C$F%5!<%P!<$HDL?.$9$k$N$+(B +* Score File Syntax:: $B%9%3%"%U%!%$%k5,3J$N(B BNF $BDj5A(B +* Headers:: Gnus $B$O%X%C%@!<$rFbItE*$K$I$N$h$&$K3JG<(B + $B$9$k$+(B +* Ranges:: $B$?$/$5$s$N?t$r3JG<$9$kJXMx$J7A<0(B +* Group Info:: $B%0%k!<%W>pJs7A<0(B +* Extended Interactive:: $B5-9f@\F,<-$J$I(B +* Emacs/XEmacs Code:: Gnus $B$OA4$F$N6aBe(B Emacsen $B$GF0:n$9$k(B +* Various File Formats:: Gnus $B$N;HMQ$9$k%U%!%$%k$N7A<0(B @end menu @node Gnus Utility Functions @@ -20773,12 +21147,12 @@ Gnus $B$O%0%k!<%WL>$H5-;vHV9f$K$h$C$F$=$l$>$l$N%a%C%;!<%8$rFCDj$7$^$9!#$=(B @cindex @code{nnchoke} @menu -* Required Backend Functions:: $B$lA4$F$N(B -$BB8:_$9$k0u$r>C5n$7$F!";XDj$5$l$?$h$&$K@_Dj!"0u$NDI2C(B ($B8@5Z$5$l$F$$$J$$0u(B -$B$OJ]B8$7$^$9(B)$B!"0u$N>C5n(B ($B8@5Z$5$l$F$$$J$$0u$OJ]B8$7$^$9(B) $B$G$9!#(BMARK $B$O0u(B +RANGE $B$O0u$rIU$1$?$$5-;v$NHO0O$G$9!#(BACTION $B$O(B @code{add} $B$^$?(B +$B$O(B @code{del} $B$G!"0u$rDI2C$7$?$j>C$7$^$9(B ($B8@5Z$5$l$F$$$J$$$9$Y$F$N0u$OJ](B +$BB8$7$^$9(B)$B!"0u$N>C5n(B ($B8@5Z$5$l$F$$$J$$0u$OJ]B8$7$^$9(B) $B$G$9!#(BMARK $B$O0u(B $B$N%j%9%H$G$9!#$=$l$>$l$N0u$O%7%s%\%k$G$9!#8=:_;H$o$l$F$$$k0u(B $B$O(B @code{read}, @code{tick}, @code{reply}, @code{expire}, @code{killed}, @code{dormant}, @code{save}, @code{download}, @code{unsend}, @@ -21867,8 +22240,8 @@ XEmacs $B$G(B gnus $B$r/$7$G @subsection $B$$$m$$$m$J%U%!%$%kMM<0(B @menu -* Active File Format:: $B;HMQ2DG=$J5-;v%0%k!<%W$N>pJs(B -* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B +* Active File Format:: $B;HMQ2DG=$J5-;v%0%k!<%W$N>pJs(B +* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B @end menu @node Active File Format @@ -21934,8 +22307,8 @@ description = $B$,$j$K9T$C$F2<$5$$!#(B @menu -* Keystrokes:: $BJ8>O$rF~NO$7$FL?Na$rO$rF~NO$7$FL?Na$r RET}. + +See? Simple. + + @node Scoring Tips @section Scoring Tips @cindex scoring tips @@ -17069,10 +17271,10 @@ prediction to help you decide whether or not you want to read the article. @menu -* Using GroupLens:: How to make Gnus use GroupLens. -* Rating Articles:: Letting GroupLens know how you rate articles. -* Displaying Predictions:: Displaying predictions given by GroupLens. -* GroupLens Variables:: Customizing GroupLens. +* Using GroupLens:: How to make Gnus use GroupLens. +* Rating Articles:: Letting GroupLens know how you rate articles. +* Displaying Predictions:: Displaying predictions given by GroupLens. +* GroupLens Variables:: Customizing GroupLens. @end menu @@ -17224,7 +17426,7 @@ Prediction +/- confidence. @item gnus-summary-grouplens-line-format The summary line format used in GroupLens-enhanced summary buffers. It accepts the same specs as the normal summary line format (@pxref{Summary -Buffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%) +Buffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-23,23n%]%) %s\n}. @item grouplens-bbb-host @@ -17476,24 +17678,24 @@ four days, Gnus will decay the scores four times, for instance. @chapter Various @menu -* Process/Prefix:: A convention used by many treatment commands. -* Interactive:: Making Gnus ask you many questions. -* Symbolic Prefixes:: How to supply some Gnus functions with options. -* Formatting Variables:: You can specify what buffers should look like. -* Window Layout:: Configuring the Gnus buffer windows. -* Faces and Fonts:: How to change how faces look. -* Compilation:: How to speed Gnus up. -* Mode Lines:: Displaying information in the mode lines. -* Highlighting and Menus:: Making buffers look all nice and cozy. -* Buttons:: Get tendinitis in ten easy steps! -* Daemons:: Gnus can do things behind your back. -* NoCeM:: How to avoid spam and other fatty foods. -* Undo:: Some actions can be undone. -* Moderation:: What to do if you're a moderator. -* XEmacs Enhancements:: There are more pictures and stuff under XEmacs. -* Fuzzy Matching:: What's the big fuzz? -* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email. -* Various Various:: Things that are really various. +* Process/Prefix:: A convention used by many treatment commands. +* Interactive:: Making Gnus ask you many questions. +* Symbolic Prefixes:: How to supply some Gnus functions with options. +* Formatting Variables:: You can specify what buffers should look like. +* Window Layout:: Configuring the Gnus buffer windows. +* Faces and Fonts:: How to change how faces look. +* Compilation:: How to speed Gnus up. +* Mode Lines:: Displaying information in the mode lines. +* Highlighting and Menus:: Making buffers look all nice and cozy. +* Buttons:: Get tendinitis in ten easy steps! +* Daemons:: Gnus can do things behind your back. +* NoCeM:: How to avoid spam and other fatty foods. +* Undo:: Some actions can be undone. +* Moderation:: What to do if you're a moderator. +* XEmacs Enhancements:: There are more pictures and stuff under XEmacs. +* Fuzzy Matching:: What's the big fuzz? +* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email. +* Various Various:: Things that are really various. @end menu @@ -17632,11 +17834,14 @@ Here's an example format spec (from the group buffer): @samp{%M%S%5y: lots of percentages everywhere. @menu -* Formatting Basics:: A formatting variable is basically a format string. -* Mode Line Formatting:: Some rules about mode line formatting variables. -* Advanced Formatting:: Modifying output in various ways. -* User-Defined Specs:: Having Gnus call your own functions. -* Formatting Fonts:: Making the formatting look colorful and nice. +* Formatting Basics:: A formatting variable is basically a format string. +* Mode Line Formatting:: Some rules about mode line formatting variables. +* Advanced Formatting:: Modifying output in various ways. +* User-Defined Specs:: Having Gnus call your own functions. +* Formatting Fonts:: Making the formatting look colorful and nice. +* Positioning Point:: Moving point to a position after an operation. +* Tabulation:: Tabulating your output. +* Wide Characters:: Dealing with wide characters. @end menu Currently Gnus uses the following formatting variables: @@ -17839,6 +18044,62 @@ and extremely vulgar displays. Have fun! Note that the @samp{%(} specs (and friends) do not make any sense on the mode-line variables. +@node Positioning Point +@subsection Positioning Point + +Gnus usually moves point to a pre-defined place on each line in most +buffers. By default, point move to the first colon character on the +line. You can customize this behaviour in three different ways. + +You can move the colon character to somewhere else on the line. + +@findex gnus-goto-colon +You can redefine the function that moves the point to the colon. The +function is called @code{gnus-goto-colon}. + +But perhaps the most convenient way to deal with this, if you don't want +to have a colon in your line, is to use the @samp{%C} specifier. If you +put a @samp{%C} somewhere in your format line definition, Gnus will +place point there. + + +@node Tabulation +@subsection Tabulation + +You can usually line up your displays by padding and cutting your +strings. However, when combining various strings of different size, it +can often be more convenient to just output the strings, and then worry +about lining up the following text afterwards. + +To do that, Gnus supplies tabulator specs--@samp{%=}. There are two +different types---@dfn{hard tabulators} and @dfn{soft tabulators}. + +@samp{%50=} will insert space characters to pad the line up to column +50. If the text is already past column 50, nothing will be inserted. +This is the soft tabulator. + +@samp{%-50=} will insert space characters to pad the line up to column +50. If the text is already past column 50, the excess text past column +50 will be removed. This is the hard tabulator. + + +@node Wide Characters +@subsection Wide Characters + +Proportional fonts in most countries have characters of the same width. +Some countries, however, use Latin characters mixed with wider +characters---most notable East Asian countries. + +The problem is that when formatting, Gnus assumes that if a string is 10 +characters wide, it'll be 10 Latin characters wide on the screen. In +these coutries, that's not true. + +@vindex gnus-use-correct-string-widths +To help fix this, you can set @code{gnus-use-correct-string-widths} to +@code{t}. This makes buffer generation slower, but the results will be +prettieer. The default value is @code{nil}. + + @node Window Layout @section Window Layout @@ -18668,10 +18929,10 @@ XEmacs is able to display pictures and stuff, so Gnus has taken advantage of that. @menu -* Picons:: How to display pictures of what your reading. -* Smileys:: Show all those happy faces the way they were meant to be shown. -* Toolbar:: Click'n'drool. -* XVarious:: Other XEmacsy Gnusey variables. +* Picons:: How to display pictures of what your reading. +* Smileys:: Show all those happy faces the way they were meant to be shown. +* Toolbar:: Click'n'drool. +* XVarious:: Other XEmacsy Gnusey variables. @end menu @@ -18689,11 +18950,11 @@ good way to do so. Its also a great way to impress people staring over your shoulder as you read news. @menu -* Picon Basics:: What are picons and How do I get them. -* Picon Requirements:: Don't go further if you aren't using XEmacs. -* Easy Picons:: Displaying Picons---the easy way. -* Hard Picons:: The way you should do it. You'll learn something. -* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with. +* Picon Basics:: What are picons and How do I get them. +* Picon Requirements:: Don't go further if you aren't using XEmacs. +* Easy Picons:: Displaying Picons---the easy way. +* Hard Picons:: The way you should do it. You'll learn something. +* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with. @end menu @@ -19334,14 +19595,14 @@ but at the common table.@* @chapter Appendices @menu -* History:: How Gnus got where it is today. -* On Writing Manuals:: Why this is not a beginner's guide. -* Terminology:: We use really difficult, like, words here. -* Customization:: Tailoring Gnus to your needs. -* Troubleshooting:: What you might try if things do not work. -* Gnus Reference Guide:: Rilly, rilly technical stuff. -* Emacs for Heathens:: A short introduction to Emacsian terms. -* Frequently Asked Questions:: A question-and-answer session. +* History:: How Gnus got where it is today. +* On Writing Manuals:: Why this is not a beginner's guide. +* Terminology:: We use really difficult, like, words here. +* Customization:: Tailoring Gnus to your needs. +* Troubleshooting:: What you might try if things do not work. +* Gnus Reference Guide:: Rilly, rilly technical stuff. +* Emacs for Heathens:: A short introduction to Emacsian terms. +* Frequently Asked Questions:: @end menu @@ -19371,15 +19632,15 @@ renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs. ``@sc{gnus}''. New vs. old. @menu -* Gnus Versions:: What Gnus versions have been released. -* Other Gnus Versions:: Other Gnus versions that also have been released. -* Why?:: What's the point of Gnus? -* Compatibility:: Just how compatible is Gnus with @sc{gnus}? -* Conformity:: Gnus tries to conform to all standards. -* Emacsen:: Gnus can be run on a few modern Emacsen. -* Gnus Development:: How Gnus is developed. -* Contributors:: Oodles of people. -* New Features:: Pointers to some of the new stuff in Gnus. +* Gnus Versions:: What Gnus versions have been released. +* Other Gnus Versions:: Other Gnus versions that also have been released. +* Why?:: What's the point of Gnus? +* Compatibility:: Just how compatible is Gnus with @sc{gnus}? +* Conformity:: Gnus tries to conform to all standards. +* Emacsen:: Gnus can be run on a few modern Emacsen. +* Gnus Development:: How Gnus is developed. +* Contributors:: Oodles of people. +* New Features:: Pointers to some of the new stuff in Gnus. @end menu @@ -19975,11 +20236,11 @@ actually are people who are using Gnus. Who'd'a thunk it! @cindex new features @menu -* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. -* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3. -* Red Gnus:: Third time best---Gnus 5.4/5.5. -* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7. -* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9. +* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. +* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3. +* Red Gnus:: Third time best---Gnus 5.4/5.5. +* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7. +* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9. @end menu These lists are, of course, just @emph{short} overviews of the @@ -20684,7 +20945,7 @@ again, to keep up with ever-changing layouts. @iftex @page -@node The Manual +@node History @section The Manual @cindex colophon @cindex manual @@ -20966,10 +21227,10 @@ section is designed to give general pointers on how to customize Gnus for some quite common situations. @menu -* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere. -* Slow Terminal Connection:: You run a remote Emacs. -* Little Disk Space:: You feel that having large setup files is icky. -* Slow Machine:: You feel like buying a faster machine. +* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere. +* Slow Terminal Connection:: You run a remote Emacs. +* Little Disk Space:: You feel that having large setup files is icky. +* Slow Machine:: You feel like buying a faster machine. @end menu @@ -21184,15 +21445,15 @@ backends (this is written in stone), the format of the score files and general methods of operation. @menu -* Gnus Utility Functions:: Common functions and variable to use. -* Backend Interface:: How Gnus communicates with the servers. -* Score File Syntax:: A BNF definition of the score file standard. -* Headers:: How Gnus stores headers internally. -* Ranges:: A handy format for storing mucho numbers. -* Group Info:: The group info format. -* Extended Interactive:: Symbolic prefixes and stuff. -* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen. -* Various File Formats:: Formats of files that Gnus use. +* Gnus Utility Functions:: Common functions and variable to use. +* Backend Interface:: How Gnus communicates with the servers. +* Score File Syntax:: A BNF definition of the score file standard. +* Headers:: How Gnus stores headers internally. +* Ranges:: A handy format for storing mucho numbers. +* Group Info:: The group info format. +* Extended Interactive:: Symbolic prefixes and stuff. +* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen. +* Various File Formats:: Formats of files that Gnus use. @end menu @@ -21393,12 +21654,12 @@ In the examples and definitions I will refer to the imaginary backend @cindex @code{nnchoke} @menu -* Required Backend Functions:: Functions that must be implemented. -* Optional Backend Functions:: Functions that need not be implemented. -* Error Messaging:: How to get messages and report errors. -* Writing New Backends:: Extending old backends. -* Hooking New Backends Into Gnus:: What has to be done on the Gnus end. -* Mail-like Backends:: Some tips on mail backends. +* Required Backend Functions:: Functions that must be implemented. +* Optional Backend Functions:: Functions that need not be implemented. +* Error Messaging:: How to get messages and report errors. +* Writing New Backends:: Extending old backends. +* Hooking New Backends Into Gnus:: What has to be done on the Gnus end. +* Mail-like Backends:: Some tips on mail backends. @end menu @@ -21683,14 +21944,13 @@ ACTION is a list of mark setting requests, having this format: @end example RANGE is a range of articles you wish to update marks on. ACTION is -@code{set}, @code{add} or @code{del}, respectively used for removing all -existing marks and setting them as specified, adding (preserving the -marks not mentioned) mark and removing (preserving the marks not -mentioned) marks. MARK is a list of marks; where each mark is a symbol. -Currently used marks are @code{read}, @code{tick}, @code{reply}, -@code{expire}, @code{killed}, @code{dormant}, @code{save}, -@code{download}, @code{unsend}, @code{forward} and @code{recent}, -but your backend should, if possible, not limit itself to these. +@code{add} or @code{del}, used to add marks or remove marks +(preserving all marks not mentioned). MARK is a list of marks; where +each mark is a symbol. Currently used marks are @code{read}, +@code{tick}, @code{reply}, @code{expire}, @code{killed}, +@code{dormant}, @code{save}, @code{download}, @code{unsend}, +@code{forward} and @code{recent}, but your backend should, if +possible, not limit itself to these. Given contradictory actions, the last action in the list should be the effective one. That is, if your action contains a request to add the @@ -22547,8 +22807,8 @@ hit these indirections impose on Gnus under XEmacs should be slight. @subsection Various File Formats @menu -* Active File Format:: Information on articles and groups available. -* Newsgroups File Format:: Group descriptions. +* Active File Format:: Information on articles and groups available. +* Newsgroups File Format:: Group descriptions. @end menu @@ -22619,8 +22879,8 @@ you are already familiar with Emacs, just ignore this and go fondle your cat instead. @menu -* Keystrokes:: Entering text and executing commands. -* Emacs Lisp:: The built-in Emacs programming language. +* Keystrokes:: Entering text and executing commands. +* Emacs Lisp:: The built-in Emacs programming language. @end menu